示例#1
0
    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
示例#2
0
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
示例#3
0
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
示例#4
0
 def decode_supl_response(self, session_ctx, pdu):
     session_ctx.slp_session_id = get_val_at(
         pdu, ["sessionID", "slpSessionID", "sessionID"])
     return True