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 sendS6aMsg(requestType,msgData,userName,ieUpdateValDict=None): global IMSI igniteLogger.logger.info(f"Diameter message Type : {requestType}") if requestType == mt.update_location_response.name: response = requests.get(url["s1ap_ctx_data_url"]) if response.json()!={} and response.json().get(IMSI,None)!=None: s1ap_data = response.json()[IMSI] icu.updateKeyValueInDict(msgData,"service-selection",s1ap_data[mt.esm_information_response.name]["apn"]) updateMessageFromContextData(requestType,msgData) if ieUpdateValDict != None: icu.setValueFromTC(msgData,ieUpdateValDict) setContextData(requestType,msgData) igniteLogger.logger.info(f"Data to be sent : {msgData}") send_response = requests.post(url=url["send_url"], json=[msgData,S6ACTXDATA,"diameter"]) igniteLogger.logger.info(f"URL response for send diameter data: {str(send_response)}")
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"])
) 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,
def updateMessageFromContextData(s1apMsg,requestType): global IMSI if requestType==mt.detach_request.name: nu.setGuti(S1APCTXDATA[IMSI][mt.attach_accept.name]["guti_list"],s1apMsg) if S1APCTXDATA[IMSI].get(mt.service_request.name,None)!=None: icu.updateKeyValueInDict(s1apMsg, "ENB-UE-S1AP-ID", S1APCTXDATA[IMSI][mt.service_request.name]["enb_ue_s1ap_id"]) else: icu.updateKeyValueInDict(s1apMsg, "ENB-UE-S1AP-ID", S1APCTXDATA[IMSI][mt.attach_request.name]["enb_ue_s1ap_id"]) if S1APCTXDATA[IMSI].get(mt.initial_context_setup_request.name,None)!=None: icu.updateKeyValueInDict(s1apMsg, "MME-UE-S1AP-ID", S1APCTXDATA[IMSI][mt.initial_context_setup_request.name]["mme_ue_s1ap_id"]) elif S1APCTXDATA[IMSI].get(mt.identity_request.name,None)!=None: icu.updateKeyValueInDict(s1apMsg, "MME-UE-S1AP-ID", S1APCTXDATA[IMSI][mt.identity_request.name]["mme_ue_s1ap_id"]) elif S1APCTXDATA[IMSI].get(mt.authentication_request.name,None)!=None: icu.updateKeyValueInDict(s1apMsg, "MME-UE-S1AP-ID", S1APCTXDATA[IMSI][mt.authentication_request.name]["mme_ue_s1ap_id"]) elif S1APCTXDATA[IMSI].get(mt.ue_context_release_command.name,None)!=None: icu.updateKeyValueInDict(s1apMsg, "MME-UE-S1AP-ID", S1APCTXDATA[IMSI][mt.ue_context_release_command.name]["mme_ue_s1ap_id"])
def sendS1ap(requestType,s1apData,enbUeS1apId,nasData={},imsi=None,ieUpdateValDict=None): global SERFLAG global TIMEOUTFLAG global IMSI igniteLogger.logger.info(f"s1ap message type : {requestType}") s1apData["NAS-MESSAGE"] = nasData count=0 if enbUeS1apId !=None: if requestType == mt.attach_request.name: icu.updateKeyValueInDict(s1apData, "ENB-UE-S1AP-ID", enbUeS1apId) nu.setImsi(imsi,nasData) if imsi ==None: S1APCTXDATA[enbUeS1apId]={} else: if S1APCTXDATA.get(IMSI,None)==None: IMSI=imsi S1APCTXDATA[IMSI]={} S1APCTXDATA[IMSI][requestType]={'imsi':str(imsi)} elif requestType == mt.identity_response.name: IMSI=imsi nu.setImsi(imsi,nasData) if S1APCTXDATA.get(enbUeS1apId,None)!=None: S1APCTXDATA[IMSI]=S1APCTXDATA[enbUeS1apId].copy() del S1APCTXDATA[enbUeS1apId] S1APCTXDATA[IMSI][requestType]={'imsi':str(imsi)} updateMessageFromContextData(s1apData,requestType) elif requestType == mt.attach_request_guti.name: icu.updateKeyValueInDict(s1apData, "ENB-UE-S1AP-ID", enbUeS1apId) S1APCTXDATA[enbUeS1apId]={} if imsi!=None: nu.setGuti(imsi,s1apData) else: nu.setGuti(S1APCTXDATA[IMSI][mt.attach_accept.name]["guti_list"],s1apData) elif requestType==mt.service_request.name: SERFLAG=True icu.updateKeyValueInDict(s1apData, "ENB-UE-S1AP-ID", enbUeS1apId) icu.updateKeyValueInDict(s1apData,"m-TMSI", icu.formatHex(S1APCTXDATA[IMSI][mt.attach_accept.name]["m_tmsi"])) icu.updateKeyValueInDict(s1apData,"mMEC", '0'+str(S1APCTXDATA[IMSI][mt.attach_accept.name]["mme_code"])) else: if requestType == mt.initial_context_setup_response.name: if count == 0: gtp_teid=icu.generateUniqueId('gTP-TEID') S1APCTXDATA[IMSI]["gTP_TEID"]=gtp_teid icu.updateKeyValueInDict(s1apData, "gTP-TEID", gtp_teid) count+=1 else: gtp_teid=S1APCTXDATA[IMSI]["gTP_TEID"] gtp_teid=icu.icrementGtpTeid(gtp_teid) S1APCTXDATA[IMSI]["gTP_TEID"]=gtp_teid icu.updateKeyValueInDict(s1apData, "gTP-TEID", gtp_teid) count+=1 icu.updateKeyValueInDict(s1apData, "transportLayerAddress",transportLayerAddressUpdate()) elif requestType==mt.authentication_response.name: TIMEOUTFLAG=False elif requestType==mt.ue_context_release_complete.name: SERFLAG=False updateMessageFromContextData(s1apData,requestType) if ieUpdateValDict != None: icu.setValueFromTC(s1apData,ieUpdateValDict) setContextData(s1apData,requestType) igniteLogger.logger.info(f"s1ap data send : {s1apData}") send_response = requests.post(url["send_url"], json=[s1apData,S1APCTXDATA,"s1ap"]) igniteLogger.logger.info(f"URL response for send s1ap data : {str(send_response)}")
) 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---------------------------------------" ) cs_req = gs.receiveGtp() icu.validateProtocolIE(cs_req, 'apn', 'apn1') icu.validateProtocolIE(cs_req, 'pdn_type', 1) icu.validateProtocolIE(cs_req, 'prefix_and_ipv4address', served_party_ip_address)
def sendS1ap(requestType,s1apData,enbUeS1apId,nasData={},imsi=None,ieUpdateValDict=None): global SERFLAG global TIMEOUTFLAG global IMSI igniteLogger.logger.info(f"s1ap message type : {requestType}") s1apData["NAS-MESSAGE"] = nasData count=0 if enbUeS1apId !=None: if requestType == mt.attach_request.name: icu.updateKeyValueInDict(s1apData, "ENB-UE-S1AP-ID", enbUeS1apId) nu.setImsi(imsi,nasData) if imsi ==None: S1APCTXDATA[enbUeS1apId]={} else: if S1APCTXDATA.get(IMSI,None)==None: IMSI=imsi S1APCTXDATA[IMSI]={} S1APCTXDATA[IMSI][requestType]={'imsi':str(imsi)} elif requestType == mt.identity_response.name: IMSI=imsi nu.setImsi(imsi,nasData) if S1APCTXDATA.get(enbUeS1apId,None)!=None: S1APCTXDATA[IMSI]=S1APCTXDATA[enbUeS1apId].copy() del S1APCTXDATA[enbUeS1apId] S1APCTXDATA[IMSI][requestType]={'imsi':str(imsi)} updateMessageFromContextData(s1apData,requestType) elif requestType == mt.attach_request_guti.name: icu.updateKeyValueInDict(s1apData, "ENB-UE-S1AP-ID", enbUeS1apId) S1APCTXDATA[enbUeS1apId]={} if imsi!=None: nu.setGuti(imsi,s1apData) else: nu.setGuti(S1APCTXDATA[IMSI][mt.attach_accept.name]["guti_list"],s1apData) elif requestType==mt.service_request.name: SERFLAG=True icu.updateKeyValueInDict(s1apData, "ENB-UE-S1AP-ID", enbUeS1apId) icu.updateKeyValueInDict(s1apData,"m-TMSI", icu.formatHex(S1APCTXDATA[IMSI][mt.attach_accept.name]["m_tmsi"])) icu.updateKeyValueInDict(s1apData,"mMEC", '0'+str(S1APCTXDATA[IMSI][mt.attach_accept.name]["mme_code"])) else: if requestType == mt.initial_context_setup_response.name: if count == 0: gtp_teid=icu.generateUniqueId('gTP-TEID') S1APCTXDATA[IMSI]["gTP_TEID"]=gtp_teid icu.updateKeyValueInDict(s1apData, "gTP-TEID", gtp_teid) count+=1 else: gtp_teid=S1APCTXDATA[IMSI]["gTP_TEID"] gtp_teid=icu.icrementGtpTeid(gtp_teid) S1APCTXDATA[IMSI]["gTP_TEID"]=gtp_teid icu.updateKeyValueInDict(s1apData, "gTP-TEID", gtp_teid) count+=1 icu.updateKeyValueInDict(s1apData, "transportLayerAddress",transportLayerAddressUpdate()) elif requestType == mt.handover_request_acknowledge.name: gtp_teid=icu.generateUniqueId('gTP-TEID') gtp_teid_1=icu.generateUniqueId('gTP-TEID') S1APCTXDATA[IMSI]["gTP_TEID_2"]=gtp_teid icu.updateKeyValueInDict(s1apData, "gTP-TEID", gtp_teid) icu.updateKeyValueInDict(s1apData, "transportLayerAddress",transportLayerAddressUpdate()) icu.updateKeyValueInDict(s1apData, "dL-transportLayerAddress",transportLayerAddressUpdate()) icu.updateKeyValueInDict(s1apData, "gTP-TEID", gtp_teid_1) elif requestType == mt.erab_modification_indication.name: tl_address=transportLayerAddressUpdate() generateIeValueForErabModInd(s1apData,tl_address,GTP_TEID_LIST) S1APCTXDATA[IMSI]["gTP_TEID"]=GTP_TEID_LIST elif requestType==mt.authentication_response.name: TIMEOUTFLAG=False elif requestType==mt.ue_context_release_complete.name: SERFLAG=False updateMessageFromContextData(s1apData,requestType) if ieUpdateValDict != None: icu.setValueFromTC(s1apData,ieUpdateValDict) setContextData(s1apData,requestType) igniteLogger.logger.info(f"s1ap data send : {s1apData}") if requestType in [mt.s1_setup_request_target.name,mt.handover_request_acknowledge.name,mt.handover_notify.name]: send_url = "http://"+str(config_file["s1ap_target"]["ignite_ip"])+":"+str(config_file["s1ap_target"]["tc_port"])+"/sendMessagesToProxy" send_response = requests.post(url["send_url"], json=[None,S1APCTXDATA,"s1ap"]) else: send_url = url["send_url"] send_response = requests.post(send_url, json=[s1apData,S1APCTXDATA,"s1ap"]) igniteLogger.logger.info(f"URL response for send s1ap data : {str(send_response)}")