예제 #1
0
    def parse_diag_ext_msg(self, pkt, radio_id):
        # 79 | 00 | 00 | 00 | 00 00 1c fc 0f 16 e4 00 | e6 04 | 94 13 | 02 00 00 00
        # cmd_code, ts_type, num_args, drop_cnt, TS, Line number, Message subsystem ID, ?
        # Message: two null-terminated strings, one for log and another for filename
        xdm_hdr = pkt[0:20]
        xdm_hdr = struct.unpack('<BBBBQHHL', xdm_hdr)
        pkt_ts = util.parse_qxdm_ts(xdm_hdr[4])
        pkt_body = pkt[20 + 4 * xdm_hdr[2]:]
        pkt_body = pkt_body.rstrip(b'\0').rsplit(b'\0', maxsplit=1)

        if len(pkt_body) == 2:
            src_fname = pkt_body[1]
            log_content = pkt_body[0]
        else:
            src_fname = b''
            log_content = pkt_body[0]

        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp=pkt_ts,
            subsys_name=str(xdm_hdr[6]).encode('utf-8'),
            filename=src_fname,
            line_number=xdm_hdr[5])

        gsmtap_hdr = util.create_gsmtap_header(
            version=2, payload_type=util.gsmtap_type.OSMOCORE_LOG)

        self.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content,
                             radio_id, pkt_ts)
예제 #2
0
    def parse_event_lte_rrc_ul_msg(self, radio_id, ts, arg1, arg2):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp=ts,
            process_name=b'Event',
            pid=1610,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version=2, payload_type=util.gsmtap_type.OSMOCORE_LOG)

        channel_ul_map = {5: "CCCH", 6: "DCCH"}

        message_type_map = {
            0x01: "RRCConnectionRequest",
            0x84: "RRCConnectionSetupComplete",
            0x89: "ULInformationTransfer",
        }

        if arg1 in channel_ul_map.keys():
            channel = channel_ul_map[arg1]
        else:
            channel = "Unknown"

        if arg2 in message_type_map.keys():
            message_type = message_type_map[arg2]
        else:
            message_type = "Unknown ({:2x})".format(arg2)

        log_content = "LTE_RRC_UL_MSG: channel={}, message_type={}".format(
            channel, message_type).encode('utf-8')

        self.parent.writer.write_cp(
            gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #3
0
    def parse_gprs_mac(self, pkt_ts, pkt, radio_id):
        self.parent.logger.log(logging.WARNING,
                               "Unhandled XDM Header 0x5226: GPRS MAC Packet")

        chan_type_dir = pkt[0]
        msg_type = pkt[1]
        msg_len = pkt[2]
        l3_message = pkt[3:]

        payload_type = util.gsmtap_type.UM

        if len(l3_message) > msg_len:
            l3_message = l3_message[0:msg_len]

        arfcn = self.parent.gsm_last_arfcn[self.parent.sanitize_radio_id(
            radio_id)]
        # 0x80: downlink
        if (chan_type_dir & 0x80) == 0x00:
            arfcn = arfcn | (1 << 14)
        chan = chan_type_dir & 0x7F

        # 3: PACCH, 4: Unknown
        channel_type = chan

        ts_sec = calendar.timegm(pkt_ts.timetuple())
        ts_usec = pkt_ts.microsecond

        gsmtap_hdr = util.create_gsmtap_header(version=3,
                                               payload_type=payload_type,
                                               arfcn=arfcn,
                                               sub_type=channel_type,
                                               device_sec=ts_sec,
                                               device_usec=ts_usec)
예제 #4
0
    def parse_event_lte_rrc_state_change(self, radio_id, ts, arg1):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp=ts,
            process_name=b'Event',
            pid=1606,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version=2, payload_type=util.gsmtap_type.OSMOCORE_LOG)

        rrc_state_map = {
            1: "RRC_IDLE_NOT_CAMPED",
            2: "RRC_IDLE_CAMPED",
            3: "RRC_CONNECTING",
            4: "RRC_CONNECTED",
            7: "RRC_CLOSING",
        }
        if arg1 in rrc_state_map.keys():
            rrc_state = rrc_state_map[arg1]
        else:
            rrc_state = "{:02x}".format(arg1)

        log_content = "LTE_RRC_STATE_CHANGE: rrc_state={}".format(
            rrc_state).encode('utf-8')

        self.parent.writer.write_cp(
            gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #5
0
    def parse_sim(self, pkt_ts, pkt, radio_id, sim_id):
        ts_sec = calendar.timegm(pkt_ts.timetuple())
        ts_usec = pkt_ts.microsecond

        msg_content = pkt
        # msg[0]: length
        pos = 1
        rx_buf = b''
        tx_buf = b''

        while pos < len(msg_content):
            if msg_content[pos] == 0x10:
                # 0x10: TX (to SIM)
                tx_buf += bytes([msg_content[pos + 1]])
                pos += 2
            elif msg_content[pos] == 0x80:
                # 0x80: RX (from SIM)
                rx_buf += bytes([msg_content[pos + 1]])
                pos += 2
            elif msg_content[pos] == 0x01:
                # 0x01: Timestamp
                pos += 9
            else:
                self.parent.logger.log(
                    logging.WARNING,
                    'Not handling unknown type 0x%02x' % msg_content[pos])
                break

        gsmtap_hdr = util.create_gsmtap_header(
            version=2, payload_type=util.gsmtap_type.SIM)

        if len(self.last_tx[sim_id]) == 0:
            if len(tx_buf) > 0:
                self.last_tx[sim_id] = tx_buf
                return
            else:
                self.parent.writer.write_cp(gsmtap_hdr + rx_buf, radio_id,
                                            pkt_ts)
        elif len(self.last_tx[sim_id]) > 0:
            if len(rx_buf) > 0:
                self.parent.writer.write_cp(
                    gsmtap_hdr + self.last_tx[sim_id] + rx_buf, radio_id,
                    pkt_ts)
                self.last_tx[sim_id] = b''
                return
            else:
                self.parent.writer.write_cp(gsmtap_hdr + self.last_tx[sim_id],
                                            radio_id, pkt_ts)
                self.last_tx[sim_id] = b''
                self.parent.writer.write_cp(gsmtap_hdr + tx_buf, radio_id,
                                            pkt_ts)
예제 #6
0
    def parse_event_lte_rrc_state_change_trigger(self, radio_id, ts, arg1):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp = ts,
            process_name = b'Event',
            pid = 1994,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version = 2,
            payload_type = util.gsmtap_type.OSMOCORE_LOG)

        log_content = "LTE_RRC_STATE_CHANGE_TRIGGER: {:02x}".format(arg1).encode('utf-8')

        self.parent.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #7
0
    def parse_event_lte_rrc_timer_status(self, radio_id, ts, arg_bin):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp = ts,
            process_name = b'Event',
            pid = 1605,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version = 2,
            payload_type = util.gsmtap_type.OSMOCORE_LOG)

        log_content = "LTE_RRC_TIMER_STATUS: {}".format(' '.join('{:02x}'.format(x) for x in arg_bin)).encode('utf-8')

        self.parent.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #8
0
    def parse_event_lte_ml1_phr_report(self, radio_id, ts, arg1, arg2):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp = ts,
            process_name = b'Event',
            pid = 1938,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version = 2,
            payload_type = util.gsmtap_type.OSMOCORE_LOG)

        log_content = "LTE_ML1_PHR_REPORT: {:02x} {:02x}".format(arg1, arg2).encode('utf-8')

        self.parent.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #9
0
    def parse_event_lte_emm_timer_expiry(self, radio_id, ts, arg1):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp = ts,
            process_name = b'Event',
            pid = 1632,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version = 2,
            payload_type = util.gsmtap_type.OSMOCORE_LOG)

        log_content = "LTE_RRC_EMM_TIMER_EXPIRY: {:02x}".format(arg1).encode('utf-8')

        self.parent.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #10
0
    def parse_event_lte_emm_outgoing_msg(self, radio_id, ts, arg1):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp = ts,
            process_name = b'Event',
            pid = 1630,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version = 2,
            payload_type = util.gsmtap_type.OSMOCORE_LOG)

        log_content = "LTE_RRC_EMM_OUTGOING_MSG: {}".format(arg1).encode('utf-8')

        self.parent.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #11
0
    def parse_event_lte_rrc_paging_drx_cycle(self, radio_id, ts, arg1, arg2):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp = ts,
            process_name = b'Event',
            pid = 1614,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version = 2,
            payload_type = util.gsmtap_type.OSMOCORE_LOG)

        log_content = "LTE_RRC_PAGING_DRX_CYCLE: {:02x} {:02x}".format(arg1, arg2).encode('utf-8')

        self.parent.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #12
0
    def parse_event_diag_process_name_id(self, radio_id, ts, arg_bin):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp = ts,
            process_name = b'Event',
            pid = 2866,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version = 2,
            payload_type = util.gsmtap_type.OSMOCORE_LOG)

        diag_id = arg_bin[0]
        diag_process_name = arg_bin[1:].decode('utf-8')

        log_content = "DIAG_PROCESS_NAME: diag_id={}, diag_process_name={}".format(diag_id, diag_process_name).encode('utf-8')

        self.parent.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #13
0
    def parse_event_lte_emm_incoming_msg(self, radio_id, ts, arg1):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp = ts,
            process_name = b'Event',
            pid = 1629,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version = 2,
            payload_type = util.gsmtap_type.OSMOCORE_LOG)

        if type(arg1) == bytes:
            log_content = "LTE_RRC_EMM_INCOMING_MSG: {}".format(binascii.hexlify(arg1)).encode('utf-8')
        else:
            log_content = "LTE_RRC_EMM_INCOMING_MSG: {:02x}".format(arg1).encode('utf-8')

        self.parent.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #14
0
    def parse_event_lte_rrc_dl_msg(self, radio_id, ts, arg1, arg2):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp = ts,
            process_name = b'Event',
            pid = 1609,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version = 2,
            payload_type = util.gsmtap_type.OSMOCORE_LOG)

        channel_dl_map = {
            1: "BCCH",
            2: "PCCH",
            3: "CCCH",
            4: "DCCH"
        }

        message_type_map = {
            0x00: "MasterInformationBlock",
            0x01: "SystemInformationBlockType1",
            0x02: "SystemInformationBlockType2",
            0x03: "SystemInformationBlockType3",
            0x04: "SystemInformationBlockType4",
            0x05: "SystemInformationBlockType5",
            0x06: "SystemInformationBlockType6",
            0x07: "SystemInformationBlockType7",
            0x40: "Paging",
            0x4b: "RRCConnectionSetup",
            0x81: "DLInformationTransfer",
            0x85: "RRCConnectionRelease",
        }

        if arg1 in channel_dl_map.keys():
            channel = channel_dl_map[arg1]
        else:
            channel = "Unknown"

        if arg2 in message_type_map.keys():
            message_type = message_type_map[arg2]
        else:
            message_type = "Unknown ({:2x})".format(arg2)

        log_content = "LTE_RRC_DL_MSG: channel={}, message_type={}".format(channel, message_type).encode('utf-8')

        self.parent.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #15
0
    def parse_event_diag_qshrink_id(self, radio_id, ts, arg_bin):
        osmocore_log_hdr = util.create_osmocore_logging_header(
            timestamp = ts,
            process_name = b'Event',
            pid = 2865,
        )

        gsmtap_hdr = util.create_gsmtap_header(
            version = 2,
            payload_type = util.gsmtap_type.OSMOCORE_LOG)

        diag_id = arg_bin[0]
        diag_uuid = arg_bin[1:]
        diag_uuid_real = uuid.UUID(bytes_le=b'\x00'*16)

        if len(diag_uuid) == 16:
            diag_uuid_real = uuid.UUID(bytes_le=diag_uuid)

        log_content = "DIAG_QSHRINK_ID: diag_id={}, diag_uuid={}".format(diag_id, diag_uuid_real).encode('utf-8')

        self.parent.writer.write_cp(gsmtap_hdr + osmocore_log_hdr + log_content, radio_id, ts)
예제 #16
0
    def parse_umts_ue_ota(self, pkt_ts, pkt, radio_id):
        msg_hdr = pkt[0:5]
        msg_content = pkt[5:]

        msg_hdr = struct.unpack('<BL', msg_hdr) # 1b direction, 4b length
        arfcn = self.parent.umts_last_uarfcn_dl[self.parent.sanitize_radio_id(radio_id)]
        if msg_hdr[0] == 1:
            # Uplink
            arfcn = self.parent.umts_last_uarfcn_ul[self.parent.sanitize_radio_id(radio_id)]

        ts_sec = calendar.timegm(pkt_ts.timetuple())
        ts_usec = pkt_ts.microsecond

        # msg_hdr[1] == L3 message length
        # Rest of content: L3 message
        gsmtap_hdr = util.create_gsmtap_header(
            version = 3,
            payload_type = util.gsmtap_type.ABIS,
            arfcn = arfcn,
            device_sec = ts_sec,
            device_usec = ts_usec)

        self.parent.writer.write_cp(gsmtap_hdr + msg_content, radio_id, pkt_ts)
예제 #17
0
    def parse_gprs_ota(self, pkt_ts, pkt, radio_id):
        msg_dir = pkt[0]
        msg_type = pkt[1]
        msg_len = (pkt[3] << 8) | pkt[2]
        l3_message = pkt[4:]

        arfcn = self.parent.gsm_last_arfcn[self.parent.sanitize_radio_id(
            radio_id)]
        # 0: uplink, 1: downlink
        if (msg_dir) == 0x00:
            arfcn = arfcn | (1 << 14)

        ts_sec = calendar.timegm(pkt_ts.timetuple())
        ts_usec = pkt_ts.microsecond

        gsmtap_hdr = util.create_gsmtap_header(
            version=3,
            payload_type=util.gsmtap_type.ABIS,
            arfcn=arfcn,
            device_sec=ts_sec,
            device_usec=ts_usec)

        self.parent.writer.write_cp(gsmtap_hdr + l3_message, radio_id, pkt_ts)
예제 #18
0
    def process_lte_data(self, pkt):
        # 0x00: LTE PHY Status
        # 0x01: LTE PHY Cell Search Measurement
        # 0x04: LTE PHY System Info
        # 0x05: LTE PHY Channel Quality Info
        # 0x06: LTE PHY Parameter
        # 0x07: LTE PHY PHICH Info

        # 0x10: LTE L1 RF
        # 0x11: LTE L1 Sync
        # 0x12: LTE L1 Downlink
        # 0x13: LTE L1 Uplink
        # 0x18: LTE L1 Measurement Config

        # 0x30: LTE L2 UL Specific Param
        # 0x31: LTE L2 DL-SCH Config
        # 0x32: LTE L2 UL-SCH Config
        # 0x33: LTE L2 Time Alignment Timer (N_TA uint16 / FFFF == invalid?)
        # 0x34: LTE L2 PHR Config (periodicPHR-Timer uint16, prohibitPHR-Timer uint16, dl-PathlossChange uint16) RRCConnectionSetup
        # 0x35: LTE L2 Preamble Info (numberOfRA-Preambles uint16, sizeofRA-PreamblesGroupA uint16) SIB2
        # 0x36: LTE L2 Power Ramping Step (powerRampingStep uint8, preambleInitialRXTargetPower int8) SIB2
        # 0x37: LTE L2 RA Supervision Info (preambleTransMax uint8, ra-ResponseWindowSize uint8, mac-ContentionResolutionTimer uint8) SIB2
        # 0x38: LTE L2 Max HARQ Msg 3 Tx (maxHARQ-Msg3Tx uint8) SIB2
        # 0x39: LTE L2 RACH Info
        # 0x3A: LTE L2 RNTI Info
        # 0x3C: LTE L2 UL Sync Stat Info
        # 0x40: LTE L2 RB Info
        # 0x41: LTE L2 RLS Status Info
        # 0x42: LTE L2 PDCP UL Info
        # 0x43: LTE L2 PDCP DL Info

        # 0x50: LTE RRC Serving Cell
        # 0x51: LTE RRC Status Variable (00 - IDLE, 01 - CONNECTING, 02 - CONNECTED)
        # 0x52: LTE RRC OTA Packet
        # 0x53: LTE RRC Timer
        # 0x54: LTE RRC ASN Version
        # 0x58: LTE NAS SIM Data
        # 0x59: LTE NAS Status Variable
        # 0x5A: LTE NAS EMM Message
        # 0x5B: LTE NAS PLMN Selection
        # 0x5C: LTE NAS Security
        # 0x5D: LTE NAS PDP
        # 0x5E: LTE NAS IP
        # 0x5F: LTE NAS ESM Message

        # 0x60: LTE Data Throughput Info
        # 0x61: LTE Data Timing Info
        pkt = pkt[10:-1]
        arfcn = 0

        if pkt[0] == 0x52:
            # 0x52: LTE RRC OTA Packet

            # pkt[1] - pkt[4]: TS
            channel = pkt[5]
            direction = pkt[6]  # 0: DL, 1: UL
            rrc_len = pkt[7] | (pkt[8] << 8)
            rrc_msg = pkt[9:]

            rrc_subtype_dl = {
                0: util.gsmtap_lte_rrc_types.DL_CCCH,
                1: util.gsmtap_lte_rrc_types.PCCH,
                2: util.gsmtap_lte_rrc_types.BCCH_BCH,
                3: util.gsmtap_lte_rrc_types.BCCH_DL_SCH,
                4: util.gsmtap_lte_rrc_types.DL_DCCH
            }
            rrc_subtype_ul = {
                0: util.gsmtap_lte_rrc_types.UL_CCCH,
                4: util.gsmtap_lte_rrc_types.UL_DCCH
            }

            subtype = 0
            try:
                if direction == 0:
                    subtype = rrc_subtype_dl[channel]
                else:
                    subtype = rrc_subtype_ul[channel]
            except KeyError:
                print("Unknown LTE RRC channel type %d" % channel)
                util.xxd(pkt)

            if direction == 0:
                arfcn = self.lte_last_earfcn_dl
            else:
                arfcn = self.lte_last_earfcn_ul

            gsmtap_hdr = util.create_gsmtap_header(
                version=2,
                payload_type=util.gsmtap_type.LTE_RRC,
                arfcn=arfcn,
                sub_type=subtype)

            return gsmtap_hdr + rrc_msg
        elif pkt[0] == 0x55:
            # TODO: RACH Preamble/Response
            # pkt[1] - pkt[4]: TS
            direction = pkt[5]  # 0 - UL, 1 - DL
            rach_vals = struct.unpack('<HIIH', pkt[6:18])

            if direction == 0:
                # UL: RACH cause, Preamble ID, ?, ?
                pass
            elif direction == 1:
                # DL: ?, Preamble ID, TA, T-C-RNTI
                # MAC-LTE: RAR Header, TA, UL Grant, T-C-RNTI
                pass
            else:
                assert False, "Invalid RACH direction"

            return b''
        elif pkt[0] == 0x5a or pkt[0] == 0x5f:
            # 0x5A: LTE NAS EMM Message
            # 0x5F: LTE NAS ESM Message

            # pkt[1] - pkt[4]: TS?
            direction = pkt[5]  # 0 - DL, 1 - UL
            nas_len = pkt[6] | (pkt[7] << 8)
            # pkt[8] - duplicate?
            nas_msg = pkt[9:]

            if direction == 0:
                arfcn = self.lte_last_earfcn_dl
            else:
                arfcn = self.lte_last_earfcn_ul

            gsmtap_hdr = util.create_gsmtap_header(
                version=2, payload_type=util.gsmtap_type.LTE_NAS, arfcn=arfcn)

            return gsmtap_hdr + nas_msg
        else:
            #if len(pkt) < 0x60:
            #    util.xxd(pkt)
            return b''
예제 #19
0
    def parse_gsm_rr(self, pkt_ts, pkt, radio_id):
        chan_type_dir = pkt[0]
        msg_type = pkt[1]
        msg_len = pkt[2]
        l3_message = pkt[3:]

        if len(l3_message) > msg_len:
            l3_message = l3_message[0:msg_len]

        arfcn = self.parent.gsm_last_arfcn[self.parent.sanitize_radio_id(
            radio_id)]
        # 0x80: downlink
        if (chan_type_dir & 0x80) == 0x00:
            arfcn = arfcn | (1 << 14)
        chan = chan_type_dir & 0x7F

        # 0: DCCH, 1: BCCH, 3: CCCH, 4: SACCH
        # DCCH, SACCH requires pseudo length
        rr_channel_map = [
            8, util.gsmtap_channel.BCCH, 0, util.gsmtap_channel.CCCH, 0x88
        ]
        channel_type = rr_channel_map[chan]

        ts_sec = calendar.timegm(pkt_ts.timetuple())
        ts_usec = pkt_ts.microsecond

        # Attach L2 pseudo length
        #if chan == 0 or chan == 4:
        #    l3_message = bytes([(msg_len << 2) | 0x01]) +  l3_message

        if chan == 0:
            # SDCCH/8 expects LAPDm header
            # Address field
            lapdm_address = b'\x01'
            # Control field
            lapdm_control = b'\x03'
            # length field
            if msg_len > 63:
                self.parent.logger.log(
                    logging.WARNING,
                    'message length longer than 63 ({})'.format(msg_len))
                return
            lapdm_len = bytes([(msg_len << 2) | 0x01])

            l3_message = lapdm_address + lapdm_control + lapdm_len + l3_message
        elif chan == 4:
            # SACCH/8 expects SACCH L1/LAPDm header
            # SACCH L1 header
            sacch_l1 = b'\x00\x00'
            # Address field
            lapdm_address = b'\x01'
            # Control field
            lapdm_control = b'\x03'
            # length field
            if msg_len > 63:
                self.parent.logger.log(
                    logging.WARNING,
                    'message length longer than 63 ({})'.format(msg_len))
                return
            lapdm_len = bytes([(msg_len << 2) | 0x01])

            l3_message = sacch_l1 + lapdm_address + lapdm_control + lapdm_len + l3_message

        # SACCH DL/Measurement Information: Short PD format

        gsmtap_hdr = util.create_gsmtap_header(
            version=3,
            payload_type=util.gsmtap_type.UM,
            arfcn=arfcn,
            sub_type=channel_type,
            device_sec=ts_sec,
            device_usec=ts_usec)

        self.parent.writer.write_cp(gsmtap_hdr + l3_message, radio_id, pkt_ts)
예제 #20
0
    def process_common_data(self, pkt):
        pkt = pkt[10:-1]
        arfcn = 0

        if pkt[0] == 0x03:  # Common Signalling Info
            #util.xxd(pkt)
            # pkt[1] - pkt[4] == ts
            chan_type = pkt[5]
            chan_subtype = pkt[6]
            direction = pkt[7]  # 2 - DL, 1 - UL
            msg_len = pkt[8] | (pkt[9] << 8)
            msg_content = pkt[10:]

            if chan_type == 0x30:  # UMTS RRC
                chan_map_ul = {
                    0x30: util.gsmtap_umts_rrc_types.UL_CCCH,
                    0x31: util.gsmtap_umts_rrc_types.UL_DCCH
                }
                chan_map_dl = {
                    0x30: util.gsmtap_umts_rrc_types.DL_CCCH,
                    0x31: util.gsmtap_umts_rrc_types.DL_DCCH,
                    0x32: util.gsmtap_umts_rrc_types.BCCH_BCH,
                    0x34: util.gsmtap_umts_rrc_types.PCCH
                }

                subtype = 0
                if direction == 2:
                    subtype = chan_map_dl[chan_subtype]
                    arfcn = self.umts_last_uarfcn_dl
                elif direction == 1:
                    subtype = chan_map_ul[chan_subtype]
                    arfcn = self.umts_last_uarfcn_ul
                else:
                    print('Unknown direction %02x' % direction)
                    return b''

                gsmtap_hdr = util.create_gsmtap_header(
                    version=2,
                    payload_type=util.gsmtap_type.UMTS_RRC,
                    arfcn=arfcn,
                    sub_type=subtype)
                return gsmtap_hdr + msg_content
            elif chan_type == 0x01:  # UMTS NAS
                if direction == 2:
                    arfcn = self.umts_last_uarfcn_dl
                elif direction == 1:
                    arfcn = self.umts_last_uarfcn_ul

                gsmtap_hdr = util.create_gsmtap_header(
                    version=2, payload_type=util.gsmtap_type.ABIS, arfcn=arfcn)
                return gsmtap_hdr + msg_content
            elif chan_type == 0x20:  # GSM RR
                # TODO: CCCH and SACCH are not distinguished by headers!
                # Some values are RR message, some are RR_short_PD
                if direction == 2:  # RR DL w/ pseudo length
                    lapdm_address = b'\x01'
                    # Control field
                    lapdm_control = b'\x03'
                    # length field
                    if msg_len > 63:
                        util.warning('message length longer than 63 (%s)' %
                                     msg_len)
                        return b''
                    lapdm_len = bytes([(msg_len << 2) | 0x01])

                    #msg_content = lapdm_address + lapdm_control + lapdm_len + msg_content

                    gsmtap_hdr = util.create_gsmtap_header(
                        version=2,
                        payload_type=util.gsmtap_type.UM,
                        sub_type=util.gsmtap_channel.CCCH
                    )  # Subtype (XXX: All CCCH)
                    return gsmtap_hdr + msg_content
                elif direction == 1:  # Only RR
                    gsmtap_hdr = util.create_gsmtap_header(
                        version=2, payload_type=util.gsmtap_type.ABIS)
                    return gsmtap_hdr + msg_content
            elif chan_type == 0x21:  # GSM RLC/MAC
                arfcn = 1
                if direction == 1:
                    arfcn = arfcn | (1 << 14)
                gsmtap_hdr = util.create_gsmtap_header(
                    version=2,
                    payload_type=util.gsmtap_type.UM,
                    arfcn=arfcn,
                    sub_type=util.gsmtap_channel.PACCH
                )  # Subtype (PACCH dissects as MAC)
                #return gsmtap_hdr + msg_content
                return b''
            else:
                print('Unknown channel type %02x for subcommand 0x03' %
                      chan_type)
                return b''
        else:
            print('Unknown subcommand %02x for command 0x21' % pkt[0])
            #util.xxd(pkt)
            return b''

        return b''
예제 #21
0
    def parse_wcdma_rrc(self, pkt_ts, pkt, radio_id):
        channel_type, rbid, msg_len = struct.unpack('<BBH', pkt[0:4])
        sib_class = -1
        arfcn = 0
        msg_content = b''

        channel_type_map = {
            0: util.gsmtap_umts_rrc_types.UL_CCCH,
            1: util.gsmtap_umts_rrc_types.UL_DCCH,
            2: util.gsmtap_umts_rrc_types.DL_CCCH,
            3: util.gsmtap_umts_rrc_types.DL_DCCH,
            4: util.gsmtap_umts_rrc_types.BCCH_BCH,  # Encoded
            5: util.gsmtap_umts_rrc_types.BCCH_FACH,  # Encoded
            6: util.gsmtap_umts_rrc_types.PCCH,
            7: util.gsmtap_umts_rrc_types.MCCH,
            8: util.gsmtap_umts_rrc_types.MSCH,
            10: util.gsmtap_umts_rrc_types.System_Information_Container,
        }

        channel_type_map_extended_type = {
            9: util.gsmtap_umts_rrc_types.BCCH_BCH,  # Extension SIBs
            0xFE: util.gsmtap_umts_rrc_types.BCCH_BCH,  # Decoded
            0xFF: util.gsmtap_umts_rrc_types.BCCH_FACH  # Decoded
        }

        sib_type_map = {
            0: util.gsmtap_umts_rrc_types.MasterInformationBlock,
            1: util.gsmtap_umts_rrc_types.SysInfoType1,
            2: util.gsmtap_umts_rrc_types.SysInfoType2,
            3: util.gsmtap_umts_rrc_types.SysInfoType3,
            4: util.gsmtap_umts_rrc_types.SysInfoType4,
            5: util.gsmtap_umts_rrc_types.SysInfoType5,
            6: util.gsmtap_umts_rrc_types.SysInfoType6,
            7: util.gsmtap_umts_rrc_types.SysInfoType7,
            8: util.gsmtap_umts_rrc_types.SysInfoType8,
            9: util.gsmtap_umts_rrc_types.SysInfoType9,
            10: util.gsmtap_umts_rrc_types.SysInfoType10,
            11: util.gsmtap_umts_rrc_types.SysInfoType11,
            12: util.gsmtap_umts_rrc_types.SysInfoType12,
            13: util.gsmtap_umts_rrc_types.SysInfoType13,
            14: util.gsmtap_umts_rrc_types.SysInfoType13_1,
            15: util.gsmtap_umts_rrc_types.SysInfoType13_2,
            16: util.gsmtap_umts_rrc_types.SysInfoType13_3,
            17: util.gsmtap_umts_rrc_types.SysInfoType13_4,
            18: util.gsmtap_umts_rrc_types.SysInfoType14,
            19: util.gsmtap_umts_rrc_types.SysInfoType15,
            20: util.gsmtap_umts_rrc_types.SysInfoType15_1,
            21: util.gsmtap_umts_rrc_types.SysInfoType15_2,
            22: util.gsmtap_umts_rrc_types.SysInfoType15_3,
            23: util.gsmtap_umts_rrc_types.SysInfoType16,
            24: util.gsmtap_umts_rrc_types.SysInfoType17,
            25: util.gsmtap_umts_rrc_types.SysInfoType15_4,
            26: util.gsmtap_umts_rrc_types.SysInfoType18,
            27: util.gsmtap_umts_rrc_types.SysInfoTypeSB1,
            28: util.gsmtap_umts_rrc_types.SysInfoTypeSB2,
            29: util.gsmtap_umts_rrc_types.SysInfoType15_5,
            30: util.gsmtap_umts_rrc_types.SysInfoType5bis,
            31: util.gsmtap_umts_rrc_types.SysInfoType11bis,
            # Extension SIB
            66: util.gsmtap_umts_rrc_types.SysInfoType11bis,
            67: util.gsmtap_umts_rrc_types.SysInfoType19
        }

        channel_type_map_new = {
            0x80: util.gsmtap_umts_rrc_types.UL_CCCH,
            0x81: util.gsmtap_umts_rrc_types.UL_DCCH,
            0x82: util.gsmtap_umts_rrc_types.DL_CCCH,
            0x83: util.gsmtap_umts_rrc_types.DL_DCCH,
            0x84: util.gsmtap_umts_rrc_types.BCCH_BCH,  # Encoded
            0x85: util.gsmtap_umts_rrc_types.BCCH_FACH,  # Encoded
            0x86: util.gsmtap_umts_rrc_types.PCCH,
            0x87: util.gsmtap_umts_rrc_types.MCCH,
            0x88: util.gsmtap_umts_rrc_types.MSCH,
        }
        channel_type_map_new_extended_type = {
            0x89: util.gsmtap_umts_rrc_types.BCCH_BCH,  # Extension SIBs
            0xF0: util.gsmtap_umts_rrc_types.BCCH_BCH,  # Decoded
        }
        sib_type_map_new = {
            0: util.gsmtap_umts_rrc_types.MasterInformationBlock,
            1: util.gsmtap_umts_rrc_types.SysInfoType1,
            2: util.gsmtap_umts_rrc_types.SysInfoType2,
            3: util.gsmtap_umts_rrc_types.SysInfoType3,
            4: util.gsmtap_umts_rrc_types.SysInfoType4,
            5: util.gsmtap_umts_rrc_types.SysInfoType5,
            6: util.gsmtap_umts_rrc_types.SysInfoType6,
            7: util.gsmtap_umts_rrc_types.SysInfoType7,
            8: util.gsmtap_umts_rrc_types.SysInfoType8,
            9: util.gsmtap_umts_rrc_types.SysInfoType9,
            10: util.gsmtap_umts_rrc_types.SysInfoType10,
            11: util.gsmtap_umts_rrc_types.SysInfoType11,
            12: util.gsmtap_umts_rrc_types.SysInfoType12,
            13: util.gsmtap_umts_rrc_types.SysInfoType13,
            14: util.gsmtap_umts_rrc_types.SysInfoType13_1,
            15: util.gsmtap_umts_rrc_types.SysInfoType13_2,
            16: util.gsmtap_umts_rrc_types.SysInfoType13_3,
            17: util.gsmtap_umts_rrc_types.SysInfoType13_4,
            18: util.gsmtap_umts_rrc_types.SysInfoType14,
            19: util.gsmtap_umts_rrc_types.SysInfoType15,
            20: util.gsmtap_umts_rrc_types.SysInfoType15_1,
            21: util.gsmtap_umts_rrc_types.SysInfoType15_2,
            22: util.gsmtap_umts_rrc_types.SysInfoType15_3,
            23: util.gsmtap_umts_rrc_types.SysInfoType16,
            24: util.gsmtap_umts_rrc_types.SysInfoType17,
            25: util.gsmtap_umts_rrc_types.SysInfoType15_4,
            26: util.gsmtap_umts_rrc_types.SysInfoType18,
            27: util.gsmtap_umts_rrc_types.SysInfoTypeSB1,
            28: util.gsmtap_umts_rrc_types.SysInfoTypeSB2,
            29: util.gsmtap_umts_rrc_types.SysInfoType15_5,
            30: util.gsmtap_umts_rrc_types.SysInfoType5bis,
            31: util.gsmtap_umts_rrc_types.SysInfoType19,
            # Extension SIB
            66: util.gsmtap_umts_rrc_types.SysInfoType11bis,
            67: util.gsmtap_umts_rrc_types.SysInfoType19
        }

        if channel_type in channel_type_map.keys():
            arfcn = self.parent.umts_last_uarfcn_dl[
                self.parent.sanitize_radio_id(radio_id)]
            if channel_type == 0 or channel_type == 1:
                arfcn = self.parent.umts_last_uarfcn_ul[
                    self.parent.sanitize_radio_id(radio_id)]

            subtype = channel_type_map[channel_type]
            msg_content = pkt[4:]
        elif channel_type in channel_type_map_extended_type.keys():
            arfcn = self.parent.umts_last_uarfcn_dl[
                self.parent.sanitize_radio_id(radio_id)]

            # uint8 subtype, uint8 msg[]
            if pkt[4] in sib_type_map.keys():
                subtype = sib_type_map[pkt[4]]
                msg_content = pkt[5:]
            else:
                self.parent.logger.log(
                    logging.WARNING,
                    "Unknown WCDMA SIB Class {}".format(pkt[4]))
                return
        elif channel_type in channel_type_map_new.keys():
            # uint16 uarfcn, uint16 psc, uint8 msg[]
            arfcn, psc = struct.unpack('<HH', pkt[4:8])

            subtype = channel_type_map_new[channel_type]
            msg_content = pkt[8:]
        elif channel_type in channel_type_map_new_extended_type.keys():
            # uint16 uarfcn, uint16 psc, uint8 subtype, uint8 msg[]
            arfcn, psc = struct.unpack('<HH', pkt[4:8])

            if pkt[8] in sib_type_map_new.keys():
                subtype = sib_type_map_new[pkt[8]]
                msg_content = pkt[9:]
            else:
                self.parent.logger.log(
                    logging.WARNING,
                    "Unknown WCDMA new SIB Class {}".format(pkt[8]))
                return
        else:
            self.parent.logger.log(
                logging.WARNING,
                "Unknown WCDMA RRC channel type {}".format(pkt[0]))
            self.parent.logger.log(logging.DEBUG, util.xxd(pkt))
            return

        ts_sec = calendar.timegm(pkt_ts.timetuple())
        ts_usec = pkt_ts.microsecond

        gsmtap_hdr = util.create_gsmtap_header(
            version=3,
            payload_type=util.gsmtap_type.UMTS_RRC,
            arfcn=arfcn,
            sub_type=subtype,
            device_sec=ts_sec,
            device_usec=ts_usec)

        self.parent.writer.write_cp(gsmtap_hdr + msg_content, radio_id, pkt_ts)