def setContextData(requestType, diameterMsg): global S6ACTXDATA global IMSI session_id = get(diameterMsg,"diameter","session-id") hbh = get(diameterMsg,"diameter","hop-by-hop-identifier") ete = get(diameterMsg,"diameter","end-to-end-identifier") user_name = get(diameterMsg,"diameter","user-name") if user_name != None: IMSI=user_name if S6ACTXDATA.get(IMSI,None)==None: S6ACTXDATA[user_name]={} if requestType == mt.authentication_info_response.name: autn,autn_present = icu.getKeyValueFromDict(diameterMsg,"autn") rand,rand_present = icu.getKeyValueFromDict(diameterMsg,"rand") S6ACTXDATA[IMSI][requestType]={"autn":int(autn,16),"rand":int(rand,16)} elif requestType == mt.update_location_response.name: msisdn,msisdn_present = icu.getKeyValueFromDict(diameterMsg,"msisdn") S6ACTXDATA[IMSI][requestType]={"msisdn":msisdn} elif requestType == mt.cancel_location_request.name: destination_host,destination_host_present = icu.getKeyValueFromDict(diameterMsg,"destination-host") destination_realm,destination_realm_present = icu.getKeyValueFromDict(diameterMsg,"destination-realm") S6ACTXDATA[IMSI][requestType]={"destination_host":destination_host,"destination_realm":destination_realm,"session_id":session_id} else: S6ACTXDATA[IMSI][requestType]={"user_name":user_name,"session_id":session_id,"hop_by_hop_identifier":hbh,"end_to_end_identifier":ete}
def setContextData(requestType, gtpMsg): global IMSI if requestType == mt.create_session_response.name: teid_gre_key, teid_gre_key_present = icu.getKeyValueFromDict( gtpMsg, "teid_gre_key") ipv4_address, ipv4_address_present = icu.getKeyValueFromDict( gtpMsg, "ipv4address") eps_bearer_id, eps_bearer_id_present = icu.getKeyValueFromDict( gtpMsg, "eps_bearer_id") S11CTXDATA[IMSI][requestType] = { "teid_gre_key": icu.formatHex(teid_gre_key), "ipv4_address": ipv4_address, "eps_bearer_id": eps_bearer_id } else: seq_number, seq_number_present = icu.getKeyValueFromDict( gtpMsg, "sequence_number") mme_teid, mme_teid_present = icu.getKeyValueFromDict( gtpMsg, "teid_gre_key") if requestType == mt.create_session_request.name: if S11CTXDATA.get(IMSI, None) == None: S11CTXDATA[IMSI] = {} if mme_teid_present == 'true': S11CTXDATA[IMSI][requestType] = { "sequence_number": seq_number, "teid_key": mme_teid } else: S11CTXDATA[IMSI][requestType] = {"sequence_number": seq_number} igniteLogger.logger.info(f"GTP context data : {S11CTXDATA}")
def receiveS1ap(ResponseWaitTime=10): global SERFLAG global TIMEOUTFLAG service="_service" time_out="_time_out" received_msg={} received_response =requests.get(url=url["receive_url"],timeout=ResponseWaitTime) igniteLogger.logger.info(f"URL response for receive s1ap data : {str(received_response)}") igniteLogger.logger.info(f"S1AP Data Received : {received_response.json()}") received_msg=received_response.json() procedure_code=s1apMessageDict[icu.getKeyValueFromDict(received_msg,'procedureCode')[0]] if procedure_code == mt.downlink_nas_transport.name: mobility_mgmt_message_type,mobility_mgmt_message_type_present=icu.getKeyValueFromDict(received_msg, "mobility_mgmt_message_type") if mobility_mgmt_message_type_present=='true': if mobility_mgmt_message_type in s1ApCreateContextMessagesList: setContextData(received_msg,mobility_mgmt_message_type) if SERFLAG: mobility_mgmt_message_type+=service validateS1apIE(mobility_mgmt_message_type,received_msg) else: if procedure_code == mt.initial_context_setup_request.name: if icu.getKeyValueFromDict(received_msg, "mobility_mgmt_message_type")[0]==mt.attach_accept.name: setContextData(received_msg,mt.attach_accept.name) elif procedure_code == mt.ue_context_release_command.name: setContextData(received_msg,procedure_code) if TIMEOUTFLAG: procedure_code+=time_out if SERFLAG: procedure_code+=service validateS1apIE(procedure_code,received_msg) return received_msg
def validateS1apIE(requestType,s1apMsg): global SERFLAG global IMSI procedure_code=s1apMessageDict[icu.getKeyValueFromDict(s1apMsg,'procedureCode')[0]] if procedure_code == mt.downlink_nas_transport.name: validation_dict=nas_validation_file.get(requestType,None) else: validation_dict=s1ap_validation_file.get(requestType,None) if validation_dict !=None: response = requests.get(url["diameter_ctx_data_url"]) if response.json() !={} and response.json().get(str(IMSI),None)!=None: diameter_data = response.json()[str(IMSI)] response = requests.get(url["gtp_ctx_data_url"]) if response.json() !={} and response.json().get(str(IMSI),None)!=None: gtp_data = response.json()[str(IMSI)] for num in range(len(validation_dict["dataToBeVerified"])): val_flag=False ie_to_validate=validation_dict["dataToBeVerified"][num] data_to_compare_path=validation_dict["fromContextData"][num].split(':') ie_to_validate_value,ie_to_validate_value_present=icu.getKeyValueFromDict(s1apMsg,ie_to_validate) if data_to_compare_path[0] == "s1apContextData": if requestType == mt.identity_request.name: data_to_compare=S1APCTXDATA[icu.getKeyValueFromDict(s1apMsg,"ENB-UE-S1AP-ID")[0]] else: data_to_compare=S1APCTXDATA[IMSI] elif data_to_compare_path[0] == "diameterContextData": data_to_compare = diameter_data elif data_to_compare_path[0] == "gtpContextData": data_to_compare = gtp_data data_to_compare_value,data_to_compare_value_present=icu.getKeyValueFromDict(data_to_compare[data_to_compare_path[1]],data_to_compare_path[2]) if ie_to_validate == "transportLayerAddress": data_to_compare_value=convertIpaddressToHex(data_to_compare_value) elif ie_to_validate == "m-TMSI": data_to_compare_value=icu.formatHex(data_to_compare_value) if ie_to_validate_value == data_to_compare_value: val_flag = True elif type(ie_to_validate_value)==str and data_to_compare_value in ie_to_validate_value: val_flag = True if val_flag: igniteLogger.logger.info(f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}") else: igniteLogger.logger.error(f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}") raise icu.ValidationException(f"***** ***** *****\nERROR :: Validation fail \nrequest/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}***** ***** *****")
def setContextData(s1apMsg,requestType): global IMSI enb_ue_s1ap_id, enb_ue_s1ap_id_present = icu.getKeyValueFromDict(s1apMsg, "ENB-UE-S1AP-ID") if requestType==mt.attach_request.name or requestType==mt.attach_request_guti.name: if S1APCTXDATA.get(enb_ue_s1ap_id,None)==None: key = IMSI else: key = enb_ue_s1ap_id plmn_identity, plmn_identity_present = icu.getKeyValueFromDict(s1apMsg, "pLMNidentity") if S1APCTXDATA[key].get(mt.attach_request.name,None)==None: S1APCTXDATA[key][mt.attach_request.name]={"enb_ue_s1ap_id":enb_ue_s1ap_id} else: S1APCTXDATA[key][mt.attach_request.name]["enb_ue_s1ap_id"]=enb_ue_s1ap_id S1APCTXDATA[key][mt.attach_request.name]["plmn_identity"] = plmn_identity elif requestType==mt.authentication_request.name: mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict(s1apMsg, "MME-UE-S1AP-ID") S1APCTXDATA[IMSI][requestType]={"mme_ue_s1ap_id":mme_ue_s1ap_id} elif requestType==mt.identity_request.name: mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict(s1apMsg, "MME-UE-S1AP-ID") S1APCTXDATA[enb_ue_s1ap_id][requestType]={"mme_ue_s1ap_id":mme_ue_s1ap_id} elif requestType==mt.attach_accept.name: guti_list=nu.getGuti(s1apMsg) m_tmsi, m_tmsi_present = icu.getKeyValueFromDict(s1apMsg, "m_tmsi") mme_code, mme_code_present = icu.getKeyValueFromDict(s1apMsg, "mme_code") S1APCTXDATA[IMSI][requestType]={"guti_list":guti_list,"m_tmsi":m_tmsi,"mme_code":mme_code} elif requestType == mt.initial_context_setup_response.name: transport_layer_address,transport_layer_address_present = icu.getKeyValueFromDict(s1apMsg,"transportLayerAddress") gtp_teid,gtp_teid_present = icu.getKeyValueFromDict(s1apMsg,"gTP-TEID") S1APCTXDATA[IMSI][requestType]={"transport_layer_address":transport_layer_address,"gtp_teid":int(gtp_teid,16)} elif requestType==mt.service_request.name: S1APCTXDATA[IMSI][requestType]={"enb_ue_s1ap_id":enb_ue_s1ap_id} elif requestType == mt.ue_context_release_command.name: mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict(s1apMsg, "mME-UE-S1AP-ID") if IMSI == None: S1APCTXDATA[enb_ue_s1ap_id][requestType]={"mme_ue_s1ap_id":mme_ue_s1ap_id} else: S1APCTXDATA[IMSI][requestType]={"mme_ue_s1ap_id":mme_ue_s1ap_id} elif requestType == mt.esm_information_response.name: apn , apn_present = icu.getKeyValueFromDict(s1apMsg, "apn_esm") S1APCTXDATA[IMSI][requestType]={"apn":apn} igniteLogger.logger.info(f"s1ap context data : {S1APCTXDATA}")
def receiveGtp(ResponseWaitTime=10): global IMSI received_msg = {} receive_response = requests.get(url=url["receive_url"], timeout=ResponseWaitTime) igniteLogger.logger.info( f"URL response for receive gtp data : {str(receive_response)}") igniteLogger.logger.info(f"Gtp data received : {receive_response.json()}") received_msg = receive_response.json() message_type, message_type_present = icu.getKeyValueFromDict( received_msg, "message_type") if gtpMessageDict[message_type] == mt.create_session_request.name: IMSI = icu.getKeyValueFromDict(received_msg, "imsi")[0] validateGtpIE(gtpMessageDict[message_type], received_msg) setContextData(gtpMessageDict[message_type], received_msg) return received_msg
def validateDiameterAvp(requestType,diameterMsg): global IMSI validation_dict=validation_file.get(requestType,None) response = requests.get(url["s1ap_ctx_data_url"]) if response.json()!={} and response.json().get(IMSI,None)!=None: s1ap_data = response.json()[IMSI] response = requests.get(url["gtp_ctx_data_url"]) if response.json() !={} and response.json().get(IMSI,None)!=None: gtp_data = response.json()[IMSI] if validation_dict !=None: for num in range(len(validation_dict["dataToBeVerified"])): val_flag=False ie_to_validate=validation_dict["dataToBeVerified"][num] data_to_compare_path=validation_dict["fromContextData"][num].split(":") #collecting the path of expected data for AVP ie_to_validate_value,ie_to_validate_value_present=icu.getKeyValueFromDict(diameterMsg,ie_to_validate) if ie_to_validate == "rat-type": if ie_to_validate_value == rat_type_diameter_map["EUTRAN"]: val_flag = True else: if data_to_compare_path[0] == "diameterContextData": data_to_compare=S6ACTXDATA[IMSI] elif data_to_compare_path[0] == "s1apContextData": data_to_compare = s1ap_data elif data_to_compare_path[0] == "gtpContextData": data_to_compare = gtp_data data_to_compare_value,data_to_compare_value_present=icu.getKeyValueFromDict(data_to_compare[data_to_compare_path[1]],data_to_compare_path[2]) if data_to_compare_value_present == "false": if ie_to_validate =="user-name": data_to_compare_value,data_to_compare_value_present=icu.getKeyValueFromDict(data_to_compare[mt.identity_response.name],data_to_compare_path[2]) if ie_to_validate_value == data_to_compare_value: val_flag=True if val_flag == True: igniteLogger.logger.info(f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}") else: igniteLogger.logger.error(f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}") raise icu.ValidationException(f"***** ***** *****\nERROR :: Validation fail \nrequest/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}***** ***** *****")
def setGuti(guti_digits_list, nasMsg): epsGuti=None epsMobileIdentityGuti, epsMobileIdentityGutiDetachPresent = icu.getKeyValueFromDict(nasMsg, "eps_mobile_identity_guti_detach_request") if epsMobileIdentityGutiDetachPresent == 'true': epsGuti=epsMobileIdentityGuti epsMobileIdentityGuti, epsMobileIdentityGutiAttachPresent = icu.getKeyValueFromDict(nasMsg, "eps_mobile_identity_guti_attach_request") if epsMobileIdentityGutiAttachPresent == 'true': epsGuti=epsMobileIdentityGuti if epsMobileIdentityGutiDetachPresent == 'true' or epsMobileIdentityGutiAttachPresent == 'true': epsGuti["mcc_digit_1"] = guti_digits_list[0] epsGuti["mcc_digit_2"] = guti_digits_list[1] epsGuti["mcc_digit_3"] = guti_digits_list[2] epsGuti["mnc_digit_1"] = guti_digits_list[3] epsGuti["mnc_digit_2"] = guti_digits_list[4] epsGuti["mnc_digit_3"] = guti_digits_list[5] epsGuti["mme_group_id"] = guti_digits_list[6] epsGuti["mme_code"] = guti_digits_list[7] epsGuti["m_tmsi"] = guti_digits_list[8]
def setTai(mcc,mnc,tac, nasMsg): tai_identity, taiPresent = icu.getKeyValueFromDict(nasMsg, "tracking_area_identity") if taipresent == "true": tai_identity["mcc_digit_1"] = mcc[0] tai_identity["mcc_digit_2"] = mcc[1] tai_identity["mcc_digit_3"] = mcc[2] tai_identity["mnc_digit_1"] = mnc[0] tai_identity["mnc_digit_2"] = mnc[1] tai_identity["mnc_digit_3"] = mnc[2] tai_identity["tac"] = tac
def updateMessageFromSecurityContext(s1apMsg, requestType): global IMSI nasMsgKeys = s1apMsg['NAS-MESSAGE'].keys() procedure_code, matched = icu.getKeyValueFromDict(s1apMsg, 'procedureCode') if matched and procedure_code == 13: # uplink nas if s1apMsg.get('NAS-MESSAGE', None) != None: if 'message_authentication_code' in nasMsgKeys: s1apMsg['NAS-MESSAGE']['message_authentication_code'] = 0 if 'sequence_number' in nasMsgKeys: s1apMsg['NAS-MESSAGE']['sequence_number'] = S1APCTXDATA[IMSI][ 'SEC_CXT']['UPLINK_COUNT'] if 'nas_key_set_identifier_detach_request' in nasMsgKeys: if 'nas_key_set_identifier_detach_request_value' in s1apMsg[ 'NAS-MESSAGE'][ 'nas_key_set_identifier_detach_request'].keys(): s1apMsg['NAS-MESSAGE'][ 'nas_key_set_identifier_detach_request'][ 'nas_key_set_identifier_detach_request_value'] = S1APCTXDATA[ IMSI]['SEC_CXT']['KSI'] elif matched and procedure_code == 12: #Init ue - detach and service req if s1apMsg.get('NAS-MESSAGE', None) != None: if 'message_authentication_code' in nasMsgKeys: s1apMsg['NAS-MESSAGE']['message_authentication_code'] = 0 elif 'message_authentication_code_short' in nasMsgKeys: s1apMsg['NAS-MESSAGE']['message_authentication_code_short'] = 0 if 'sequence_number' in nasMsgKeys: s1apMsg['NAS-MESSAGE']['sequence_number'] = S1APCTXDATA[IMSI][ 'SEC_CXT']['UPLINK_COUNT'] elif 'ksi_sequence_number' in nasMsgKeys: if 'nas_key_set_identifier_service_req' in s1apMsg[ 'NAS-MESSAGE']['ksi_sequence_number'].keys(): s1apMsg['NAS-MESSAGE']['ksi_sequence_number'][ 'nas_key_set_identifier_service_req'] = S1APCTXDATA[ IMSI]['SEC_CXT']['KSI'] if 'sequence_number_service_req' in s1apMsg['NAS-MESSAGE'][ 'ksi_sequence_number'].keys(): s1apMsg['NAS-MESSAGE']['ksi_sequence_number'][ 'sequence_number_service_req'] = S1APCTXDATA[IMSI][ 'SEC_CXT']['UPLINK_COUNT'] if 'nas_key_set_identifier_detach_request' in nasMsgKeys: if 'nas_key_set_identifier_detach_request_value' in s1apMsg[ 'NAS-MESSAGE'][ 'nas_key_set_identifier_detach_request'].keys(): s1apMsg['NAS-MESSAGE'][ 'nas_key_set_identifier_detach_request'][ 'nas_key_set_identifier_detach_request_value'] = S1APCTXDATA[ IMSI]['SEC_CXT']['KSI'] if requestType == mt.tau_request.name: icu.updateKeyValueInDict( s1apMsg, "nas_key_set_identifier", S1APCTXDATA[IMSI][ mt.attach_request.name]['nas_key_set_identifier'])
def updateMessageFromContextData(requestType,diameterMsg): global S6ACTXDATA global IMSI if icu.getKeyValueFromDict(diameterMsg,"origin-host")[1]=="true": replace(diameterMsg,"diameter","origin-host",config_file["diameter"]["ignite_host"]) if icu.getKeyValueFromDict(diameterMsg,"origin-realm")[1]=="true": replace(diameterMsg,"diameter","origin-realm",config_file["diameter"]["ignite_realm"]) if icu.getKeyValueFromDict(diameterMsg,"destination-host")[1]=="true": replace(diameterMsg,"diameter","destination-host",config_file["diameter"]["mme_host"]) if icu.getKeyValueFromDict(diameterMsg,"destination-realm")[1]=="true": replace(diameterMsg,"diameter","destination-realm",config_file["diameter"]["mme_realm"]) if requestType == mt.cancel_location_request.name: diameterMsg = replace(diameterMsg,"diameter","user-name",S6ACTXDATA[IMSI][diameterRespReqDict[mt.update_location_response.name]]["user_name"]) else: diameterMsg = replace(diameterMsg,"diameter","session-id",S6ACTXDATA[IMSI][diameterRespReqDict[requestType]]["session_id"]) diameterMsg = replace(diameterMsg,"diameter","hop-by-hop-identifier",S6ACTXDATA[IMSI][diameterRespReqDict[requestType]]["hop_by_hop_identifier"]) diameterMsg = replace(diameterMsg,"diameter","end-to-end-identifier",S6ACTXDATA[IMSI][diameterRespReqDict[requestType]]["end_to_end_identifier"])
def totalUplinkDownlink(nasMsg): total_ambr_uplink =0 total_ambr_downlink =0 apn_ambr,apn_ambr_present = icu.getKeyValueFromDict(nasMsg, "apn_aggregate_maximum_bit_rate") if apn_ambr_present == "true": total_ambr_uplink+=apn_ambr["apn_ambr_for_uplink"]+apn_ambr["apn_ambr_for_uplink_extended"]+apn_ambr["apn_ambr_for_uplink_extended-2"] total_ambr_downlink+=apn_ambr["apn_ambr_for_downlink"]+apn_ambr["apn_ambr_for_downlink_extended"]+apn_ambr["apn_ambr_for_downlink_extended-2"] print("TotalUplink :" + total_ambr_uplink +" and TotalDownlink : "+total_ambr_uplink,total_ambr_downlink)
def getGuti(nasMsg): epsMobileIdentityGuti, epsMobileIdentityGutiPresent = icu.getKeyValueFromDict(nasMsg, "eps_mobile_identity_guti") if epsMobileIdentityGutiPresent: guti_digits_list = [] guti_digits_list.append(epsMobileIdentityGuti["mcc_digit_1"]) guti_digits_list.append(epsMobileIdentityGuti["mcc_digit_2"]) guti_digits_list.append(epsMobileIdentityGuti["mcc_digit_3"]) guti_digits_list.append(epsMobileIdentityGuti["mnc_digit_1"]) guti_digits_list.append(epsMobileIdentityGuti["mnc_digit_2"]) guti_digits_list.append(epsMobileIdentityGuti["mnc_digit_3"]) guti_digits_list.append(epsMobileIdentityGuti["mme_group_id"]) guti_digits_list.append(epsMobileIdentityGuti["mme_code"]) guti_digits_list.append(epsMobileIdentityGuti["m_tmsi"]) return guti_digits_list
def updateMessageFromContextData(requestType, gtpMsg): global IMSI seq_count = 0 message_type, message_type_present = icu.getKeyValueFromDict( gtpMsg, "message_type") if gtpMessageDict[message_type] in gtpInitialMessagesList: seq_count += 1 icu.updateKeyValueInDict(gtpMsg, "sequence_number", seq_count) else: message_type = gtpRespReqDict[requestType] icu.updateKeyValueInDict( gtpMsg, "sequence_number", S11CTXDATA[IMSI][message_type]["sequence_number"]) icu.updateKeyValueInDict( gtpMsg, "teid", S11CTXDATA[IMSI][mt.create_session_request.name]["teid_key"])
def setImsi(imsi, nasMsg): epsmobile_identity, epsmobile_identity_present = icu.getKeyValueFromDict(nasMsg, "eps_mobile_identity") if epsmobile_identity_present == "true": imsi_digits_list = [int(x) for x in str(imsi)] epsmobile_identity["mcc_digit_1_eps"] = imsi_digits_list[0] epsmobile_identity["mcc_digit_2_eps"] = imsi_digits_list[1] epsmobile_identity["mcc_digit_3_eps"] = imsi_digits_list[2] epsmobile_identity["mnc_digit_1_eps"] = imsi_digits_list[3] epsmobile_identity["mnc_digit_2_eps"] = imsi_digits_list[4] epsmobile_identity["mnc_digit_3_eps"] = imsi_digits_list[5] epsmobile_identity["msin_1"] = imsi_digits_list[6] epsmobile_identity["msin_2"] = imsi_digits_list[7] epsmobile_identity["msin_3"] = imsi_digits_list[8] epsmobile_identity["msin_4"] = imsi_digits_list[9] epsmobile_identity["msin_5"] = imsi_digits_list[10] epsmobile_identity["msin_6"] = imsi_digits_list[11] epsmobile_identity["msin_7"] = imsi_digits_list[12] epsmobile_identity["msin_8"] = imsi_digits_list[13] epsmobile_identity["msin_9"] = imsi_digits_list[14]
def validateGtpIE(requestType, gtpMsg): global SEQNUM global IMSI response = requests.get(url["s1ap_ctx_data_url"]) s1ap_data = response.json() if response.json() != {} and response.json().get(IMSI, None) != None: s1ap_data = s1ap_data[IMSI] response = requests.get(url["diameter_ctx_data_url"]) if response.json() != {} and response.json().get(IMSI, None) != None: diameter_data = response.json()[IMSI] validation_dict = validation_file.get(requestType, None) if validation_dict != None: for num in range(len(validation_dict["dataToBeVerified"])): val_flag = False ie_to_validate = validation_dict["dataToBeVerified"][num] data_to_compare_path = validation_dict["fromContextData"][ num].split(':') if ie_to_validate == "tai" or ie_to_validate == "ecgi": ie_to_validate_value = taiEcgiTohex( icu.getKeyValueFromDict(gtpMsg, ie_to_validate)[0]) elif ie_to_validate == "ipv4address": ie_to_validate_value = ipadressToHex( icu.getKeyValueFromDict(gtpMsg, ie_to_validate)[0]) else: ie_to_validate_value, ie_to_validate_value_present = icu.getKeyValueFromDict( gtpMsg, ie_to_validate) if ie_to_validate == "rat_type": val_flag, data_to_compare_value = validateRatType( ie_to_validate_value) elif ie_to_validate == "interface_type": val_flag, data_to_compare_value = validateInterfaceType( ie_to_validate_value) else: if data_to_compare_path[0] == "gtpContextData": data_to_compare = S11CTXDATA[IMSI] elif data_to_compare_path[0] == "s1apContextData": data_to_compare = s1ap_data elif data_to_compare_path[0] == "diameterContextData": data_to_compare = diameter_data data_to_compare_value, data_to_compare_value_present = icu.getKeyValueFromDict( data_to_compare[data_to_compare_path[1]], data_to_compare_path[2]) if data_to_compare_value_present == "false": if ie_to_validate == "imsi": data_to_compare_value, data_to_compare_value_present = icu.getKeyValueFromDict( data_to_compare[mt.identity_response.name], data_to_compare_path[2]) if ie_to_validate_value == data_to_compare_value: val_flag = True if val_flag: igniteLogger.logger.info( f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}" ) else: igniteLogger.logger.error( f"request/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}" ) raise icu.ValidationException( f"***** ***** *****\nERROR :: Validation fail \nrequest/response name:{requestType} ,IEname:{ie_to_validate} ,expected value:{data_to_compare_value} ,received value:{ie_to_validate_value}***** ***** *****" )
igniteLogger.logger.info("\n---------------------------------------\nSecurity Mode Command received from MME\n---------------------------------------") s1.receiveS1ap() igniteLogger.logger.info("\n---------------------------------------\nSend Security Mode Complete to MME\n---------------------------------------") s1.sendS1ap('securitymode_complete', uplinknastransport_securitymode_complete, enbues1ap_id, nas_securitymode_complete) igniteLogger.logger.info("\n---------------------------------------\nESM Information Request from MME\n---------------------------------------") s1.receiveS1ap() igniteLogger.logger.info("\n---------------------------------------\nESM Information Response to MME\n---------------------------------------") s1.sendS1ap('esm_information_response', uplinknastransport_esm_information_response, enbues1ap_id, nas_esm_information_response) igniteLogger.logger.info("\n---------------------------------------\nHSS receives ULR from MME\n---------------------------------------") ulr=ds.receiveS6aMsg() hop_to_hop_identifier=icu.getKeyValueFromDict(ulr,"hop-by-hop-identifier")[0] igniteLogger.logger.info("\n---------------------------------------\nHSS sends ULA to MME\n---------------------------------------") icu.updateKeyValueInDict(msg_data_ula,"hop-by-hop-identifier",hop_to_hop_identifier) ds.sendS6aMsg('update_location_response', msg_data_ula, imsi) clr_flag=True igniteLogger.logger.info("\n---------------------------------------\nCreate Session Request received from MME\n---------------------------------------") cs_req=gs.receiveGtp() icu.validateProtocolIE(cs_req,'apn','apn1') icu.validateProtocolIE(cs_req,'pdn_type',1) igniteLogger.logger.info("\n---------------------------------------\nSend Create Session Response to MME\n---------------------------------------") gs.sendGtp('create_session_response', create_session_response, msg_hierarchy)
) ds.sendS6aMsg('authentication_info_response', msg_data_aia, imsi) igniteLogger.logger.info( "\n---------------------------------------\nAuth Request received from MME\n---------------------------------------" ) auth_req = s1.receiveS1ap() icu.validateProtocolIE(auth_req, 'mobility_mgmt_message_type', 'authentication_request') igniteLogger.logger.info( "\n---------------------------------------\nSend Auth Failure to MME\n---------------------------------------" ) s1.sendS1ap('authentication_failure', uplinknastransport_auth_failure, enbues1ap_id, nas_authentication_failure) auts_value = icu.getKeyValueFromDict(nas_authentication_failure, "auts")[0] igniteLogger.logger.info( "\n---------------------------------------\nHSS receives AIR from MME\n---------------------------------------" ) air = ds.receiveS6aMsg() icu.validateProtocolIE(air, 'visited-plmn-id', '02f829') icu.validateProtocolIE(air, 're-synchronization-info', hex(auts_value)[2:]) igniteLogger.logger.info( "\n---------------------------------------\nHSS sends AIA to MME\n---------------------------------------" ) ds.sendS6aMsg('authentication_info_response', msg_data_aia, imsi) igniteLogger.logger.info( "\n---------------------------------------\nAuth Request received from MME\n---------------------------------------"
"\n---------------------------------------\nESM Information Request from MME\n---------------------------------------" ) s1.receiveS1ap() igniteLogger.logger.info( "\n---------------------------------------\nESM Information Response to MME\n---------------------------------------" ) s1.sendS1ap('esm_information_response', uplinknastransport_esm_information_response, enbues1ap_id, nas_esm_information_response) igniteLogger.logger.info( "\n---------------------------------------\nHSS receives ULR from MME\n---------------------------------------" ) ulr = ds.receiveS6aMsg() hop_to_hop_identifier = icu.getKeyValueFromDict(ulr, "hop-by-hop-identifier")[0] igniteLogger.logger.info( "\n---------------------------------------\nHSS sends ULA to MME\n---------------------------------------" ) icu.updateKeyValueInDict(msg_data_ula, "hop-by-hop-identifier", hop_to_hop_identifier) ds.sendS6aMsg('update_location_response', msg_data_ula, imsi) served_party_ip_address = icu.getKeyValueFromDict( msg_data_ula, "served-party-ip-address")[0] clr_flag = True igniteLogger.logger.info( "\n---------------------------------------\nCreate Session Request received from MME\n---------------------------------------" )
"\n---------------------------------------\nSend Modify Bearer Response to MME\n---------------------------------------" ) gs.sendGtp('modify_bearer_response', modify_bearer_response, msg_hierarchy) igniteLogger.logger.info( "\n---------------------------------------\nEMM Information received from MME\n---------------------------------------" ) s1.receiveS1ap() igniteLogger.logger.info( "\n---------------------------------------\nUE is Attached\n---------------------------------------" ) time.sleep(2) mme_ue_S1AP_id, mme_ue_S1AP_id_present = icu.getKeyValueFromDict( init_ctxt_setup_req, "MME-UE-S1AP-ID") mob_ctxt_command = "export LD_LIBRARY_PATH=" + mme_lib_path + " && " + mme_grpc_client_path + "/mme-grpc-client mme-app show mobile-context " + str( mme_ue_S1AP_id) mob_ctxt_af_attach = su.executeCommand(mob_ctxt_command, ssh_client) icu.mobileContextValidation(str(imsi), mob_ctxt_af_attach) proc_stat_af_attach = su.executeCommand(command, ssh_client) ue_count_after_attach = int( do.splitProcStats(proc_stat_af_attach, stats_type["subs_attached"])) icu.grpcValidation(ue_count_before_attach + 1, ue_count_after_attach, "Number of Subs Attached") num_of_processed_aia_afattach = int( do.splitProcStats(proc_stat_af_attach, stats_type["processed_aia"])) icu.grpcValidation(num_of_processed_aia + 1, num_of_processed_aia_afattach,
def setNetCap(capbl, nasMsg): ue_ntcap, ue_ntcap_present = icu.getKeyValueFromDict(nasMsg, "ue_network_capability") if ue_ntcap_present == "true": ue_ntcap[capbl]="supported"
"\n---------------------------------------\nESM Information Request from MME\n---------------------------------------" ) s1.receiveS1ap() igniteLogger.logger.info( "\n---------------------------------------\nESM Information Response to MME\n---------------------------------------" ) s1.sendS1ap('esm_information_response', uplinknastransport_esm_information_response, enbues1ap_id, nas_esm_information_response) igniteLogger.logger.info( "\n---------------------------------------\nHSS receives ULR from MME\n---------------------------------------" ) ulr = ds.receiveS6aMsg() hop_to_hop_identifier = icu.getKeyValueFromDict(ulr, "hop-by-hop-identifier")[0] igniteLogger.logger.info( "\n---------------------------------------\nHSS sends ULA to MME\n---------------------------------------" ) icu.updateKeyValueInDict(msg_data_ula, "hop-by-hop-identifier", hop_to_hop_identifier) ds.sendS6aMsg('update_location_response', msg_data_ula, imsi) clr_flag = True igniteLogger.logger.info( "\n---------------------------------------\nCreate Session Request received from MME\n---------------------------------------" ) cs_req = gs.receiveGtp() icu.validateProtocolIE(cs_req, 'apn', 'apn1')
def setContextData(s1apMsg, requestType): global IMSI enb_ue_s1ap_id, enb_ue_s1ap_id_present = icu.getKeyValueFromDict( s1apMsg, "ENB-UE-S1AP-ID") if requestType == mt.attach_request.name or requestType == mt.attach_request_guti.name: if S1APCTXDATA.get(enb_ue_s1ap_id, None) == None: key = IMSI else: key = enb_ue_s1ap_id plmn_identity, plmn_identity_present = icu.getKeyValueFromDict( s1apMsg, "pLMNidentity") nas_ksi_attach, nas_ksi_attach_present = icu.getKeyValueFromDict( s1apMsg, "nas_key_set_identifier") if S1APCTXDATA[key].get(mt.attach_request.name, None) == None: S1APCTXDATA[key][mt.attach_request.name] = { "enb_ue_s1ap_id": enb_ue_s1ap_id } else: S1APCTXDATA[key][ mt.attach_request.name]["enb_ue_s1ap_id"] = enb_ue_s1ap_id S1APCTXDATA[key][ mt.attach_request.name]["plmn_identity"] = plmn_identity S1APCTXDATA[key][ mt.attach_request.name]["nas_key_set_identifier"] = nas_ksi_attach elif requestType == mt.authentication_request.name: mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict( s1apMsg, "MME-UE-S1AP-ID") S1APCTXDATA[IMSI][requestType] = {"mme_ue_s1ap_id": mme_ue_s1ap_id} nas_ksi, nas_ksi_present = icu.getKeyValueFromDict( s1apMsg, "nas_key_set_identifier_auth_req") response = requests.get(url["diameter_ctx_data_url"]) imsiKey = str(IMSI) if response.json() != {} and response.json().get(imsiKey, None) != None: S1APCTXDATA[IMSI]['SEC_CXT'] = {} S1APCTXDATA[IMSI]['SEC_CXT']['KSI'] = nas_ksi #TODO: Fetch KASME based on KSI S1APCTXDATA[IMSI]['SEC_CXT']['KASME'] = response.json( )[imsiKey]["authentication_info_response"]["kasme"] S1APCTXDATA[IMSI]['SEC_CXT']['UPLINK_COUNT'] = 0 #TODO: Support DL NAS Count && MAC validation elif requestType == mt.security_mode_command.name: # MME is trying to establish/re-establish # integrity protection. Reset counts to 0 S1APCTXDATA[IMSI]['SEC_CXT']['UPLINK_COUNT'] = 0 elif requestType == mt.identity_request.name: mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict( s1apMsg, "MME-UE-S1AP-ID") S1APCTXDATA[enb_ue_s1ap_id][requestType] = { "mme_ue_s1ap_id": mme_ue_s1ap_id } elif requestType == mt.attach_accept.name: guti_list = nu.getGuti(s1apMsg) m_tmsi, m_tmsi_present = icu.getKeyValueFromDict(s1apMsg, "m_tmsi") mme_code, mme_code_present = icu.getKeyValueFromDict( s1apMsg, "mme_code") tai_list, tai_list_present = icu.getKeyValueFromDict( s1apMsg, "tracking_area_identity_list") selected_tai = taiEcgiTohex(tai_list) S1APCTXDATA[IMSI][requestType] = { "guti_list": guti_list, "m_tmsi": m_tmsi, "mme_code": mme_code, "tai_dict": selected_tai } elif requestType == mt.initial_context_setup_response.name: transport_layer_address, transport_layer_address_present = icu.getKeyValueFromDict( s1apMsg, "transportLayerAddress") gtp_teid, gtp_teid_present = icu.getKeyValueFromDict( s1apMsg, "gTP-TEID") S1APCTXDATA[IMSI][requestType] = { "transport_layer_address": transport_layer_address, "gtp_teid": int(gtp_teid, 16) } elif requestType == mt.handover_request_acknowledge.name: transport_layer_address, transport_layer_address_present = icu.getKeyValueFromDict( s1apMsg, "transportLayerAddress") gtp_teid, gtp_teid_present = icu.getKeyValueFromDict( s1apMsg, "gTP-TEID") S1APCTXDATA[IMSI][mt.initial_context_setup_response.name] = { "transport_layer_address": transport_layer_address, "gtp_teid": int(gtp_teid, 16) } elif requestType == mt.erab_modification_indication.name: transport_layer_address, transport_layer_address_present = icu.getKeyValueFromDict( s1apMsg, "transportLayerAddress") gtp_teid, gtp_teid_present = icu.getKeyValueFromDict( s1apMsg, "dL-GTP-TEID") S1APCTXDATA[IMSI][mt.initial_context_setup_response.name] = { "transport_layer_address": transport_layer_address, "gtp_teid": int(gtp_teid, 16) } elif requestType == mt.service_request.name: S1APCTXDATA[IMSI][requestType] = {"enb_ue_s1ap_id": enb_ue_s1ap_id} elif requestType == mt.ue_context_release_command.name: mme_ue_s1ap_id, mme_ue_s1ap_id_present = icu.getKeyValueFromDict( s1apMsg, "mME-UE-S1AP-ID") if IMSI == None: S1APCTXDATA[enb_ue_s1ap_id][requestType] = { "mme_ue_s1ap_id": mme_ue_s1ap_id } else: S1APCTXDATA[IMSI][requestType] = {"mme_ue_s1ap_id": mme_ue_s1ap_id} elif requestType == mt.esm_information_response.name: apn, apn_present = icu.getKeyValueFromDict(s1apMsg, "apn_esm") S1APCTXDATA[IMSI][requestType] = {"apn": apn} elif requestType == mt.securitymode_complete.name: S1APCTXDATA[IMSI]['SEC_CXT']['INTEGRITY_KEY'] = su.createIntegrityKey( 2, str(S1APCTXDATA[IMSI]["SEC_CXT"]["KASME"])) procedure_code, matched = icu.getKeyValueFromDict(s1apMsg, 'procedureCode') if matched and procedure_code == 13: #uplink nas if s1apMsg.get( 'NAS-MESSAGE', None ) != None and 'sequence_number' in s1apMsg['NAS-MESSAGE'].keys(): S1APCTXDATA[IMSI]['SEC_CXT']['UPLINK_COUNT'] += 1 elif matched and procedure_code == 12: #Init ue - detach and service request if s1apMsg.get('NAS-MESSAGE', None) != None: if 'ksi_sequence_number' in s1apMsg['NAS-MESSAGE'].keys(): S1APCTXDATA[IMSI]['SEC_CXT']['UPLINK_COUNT'] += 1 elif 'sequence_number' in s1apMsg['NAS-MESSAGE'].keys(): S1APCTXDATA[IMSI]['SEC_CXT']['UPLINK_COUNT'] += 1 igniteLogger.logger.info(f"s1ap context data : {S1APCTXDATA}")