def decode_asn1(self, session_ctx, rx_data): if 0 == len(rx_data): print("Error, received 0 bytes!") return pdu = ULP.ULP.ULP_PDU pdu.from_uper(rx_data) print(pdu.to_asn1()) # print payload (msgtype, message) = get_val_at(pdu, ["message"]) if message.__contains__("posPayLoad"): (payload_type, payload) = message["posPayLoad"] if payload_type == "rrlpPayload": self.rrlp_codec.decode_asn1(payload) (msgtype, message) = get_val_at(pdu, ["message"]) if msgtype == "msSUPLRESPONSE": return self.decode_supl_response(session_ctx, pdu) elif msgtype == "msSUPLPOS": # TBD return True print("Error, unexpected message type: %s" % msgtype) return False
def decode_ue_rad_cap(buf): UERadCap = RRCLTE.EUTRA_InterNodeDefinitions.UERadioAccessCapabilityInformation try: UERadCap.from_uper(buf) except: return None uecapinfo = {} try: # ue-RadioAccessCapabilityInfo (OCTET STRING) contains UECapabilityInformation (SEQUENCE) radcapinfo = get_val_at( UERadCap, ('criticalExtensions', 'c1', 'ueRadioAccessCapabilityInformation-r8', 'ue-RadioAccessCapabilityInfo', 'UECapabilityInformation', 'criticalExtensions', 'c1', 'ueCapabilityInformation-r8')) except: UERadCap._val, uecapinfo # decode each ueCapabilityRAT-Container for caprat in radcapinfo['ue-CapabilityRAT-ContainerList']: rattype = caprat[ 'rat-Type'] # eutra, utra, geran-cs, geran-ps, cdma2000-1XRTT if rattype == 'eutra': UEEUTRACap = RRCLTE.EUTRA_RRC_Definitions.UE_EUTRA_Capability try: UEEUTRACap.from_uper(caprat['ueCapabilityRAT-Container']) except: uecapinfo[rattype] = caprat['ueCapabilityRAT-Container'] else: uecapinfo[rattype] = UEEUTRACap._val elif rattype == 'utra': UEUTRACap = RRC3G.PDU_definitions.InterRATHandoverInfo try: UEUTRACap.from_uper(caprat['ueCapabilityRAT-Container']) except: uecapinfo[rattype] = caprat['ueCapabilityRAT-Container'] else: uecapinfo[rattype] = UEUTRACap._val elif rattype == 'geran-cs': m2, m3 = NAS.MSCm2(), NAS.Classmark_3_Value_part.clone() # MSCm2 || MSCm3 try: m2.from_bytes(caprat['ueCapabilityRAT-Container']) m3.from_bytes( caprat['ueCapabilityRAT-Container'][m2.get_len():]) except: uecapinfo[rattype] = caprat['ueCapabilityRAT-Container'] else: uecapinfo[rattype] = (m2, m3) elif rattype == 'geran-ps': mrc = NAS.MS_RA_capability_value_part.clone() try: mrc.from_bytes(caprat['ueCapabilityRAT-Container']) except: uecapinfo[rattype] = caprat['ueCapabilityRAT-Container'] else: uecapinfo[rattype] = mrc else: uecapinfo[rattype] = caprat['ueCapabilityRAT-Container'] return UERadCap._val, uecapinfo
def decode_ue_rad_cap(buf): UERadCap = RRCLTE.EUTRA_InterNodeDefinitions.UERadioAccessCapabilityInformation try: UERadCap.from_uper(buf) except Exception: return None uecapinfo = {} try: # ue-RadioAccessCapabilityInfo (OCTET STRING) contains UECapabilityInformation (SEQUENCE) radcapinfo = get_val_at( UERadCap, ('criticalExtensions', 'c1', 'ueRadioAccessCapabilityInformation-r8', 'ue-RadioAccessCapabilityInfo', 'UECapabilityInformation', 'criticalExtensions', 'c1', 'ueCapabilityInformation-r8')) except Exception: return UERadCap._val, uecapinfo # decode each ueCapabilityRAT-Container for caprat in radcapinfo['ue-CapabilityRAT-ContainerList']: rattype = caprat[ 'rat-Type'] # eutra, utra, geran-cs, geran-ps, cdma2000-1XRTT if rattype == 'eutra': UEEUTRACap = RRCLTE.EUTRA_RRC_Definitions.UE_EUTRA_Capability try: UEEUTRACap.from_uper(caprat['ueCapabilityRAT-Container']) except Exception: uecapinfo[rattype] = caprat['ueCapabilityRAT-Container'] else: uecapinfo[rattype] = UEEUTRACap._val elif rattype == 'utra': UEUTRACap = RRC3G.PDU_definitions.InterRATHandoverInfo try: UEUTRACap.from_uper(caprat['ueCapabilityRAT-Container']) except Exception: uecapinfo[rattype] = caprat['ueCapabilityRAT-Container'] else: uecapinfo[rattype] = UEUTRACap._val elif rattype == 'geran-cs': m2, m3 = NAS.MSCm2(), NAS.classmark_3_value_part.clone() # MSCm2 || MSCm3 buf = caprat['ueCapabilityRAT-Container'] if buf[0:1] != b'\x33': uecapinfo[rattype] = buf else: m2_len = ord(buf[1:2]) buf_m2 = buf[2:2 + m2_len] buf_m3 = buf[2 + m2_len:] try: m2.from_bytes(buf_m2) m3.from_bytes(buf_m3) except Exception: uecapinfo[rattype] = caprat['ueCapabilityRAT-Container'] else: uecapinfo[rattype] = (m2, m3) elif rattype == 'geran-ps': mrc = NAS.ms_ra_capability_value_part.clone() try: mrc.from_bytes(caprat['ueCapabilityRAT-Container']) except Exception: uecapinfo[rattype] = caprat['ueCapabilityRAT-Container'] else: uecapinfo[rattype] = mrc else: # TODO: could be cdma2000_1XRTT uecapinfo[rattype] = caprat['ueCapabilityRAT-Container'] return UERadCap._val, uecapinfo
def decode_supl_response(self, session_ctx, pdu): session_ctx.slp_session_id = get_val_at( pdu, ["sessionID", "slpSessionID", "sessionID"]) return True