blob: b7211adf955af4f717441981eb53a04c6feabba5 [file] [log] [blame]
Alexander Couzens9b207412019-05-27 03:44:39 +02001#!/usr/bin/env python
2# License: MIT
3# Copyright 2019 by Sysmocom s.f.m.c. GmbH
4# Author: Alexander Couzens <lynxis@fe80.eu>
5
6import struct
7
8GSMTAP_VERSION = 0x02
9
10GSMTAP_TYPE_OSMOCORE_LOG = 0x10
11
12class TooSmall(RuntimeError):
13 pass
14
15# struct gsmtap_hdr {
16# uint8_t version; /*!< version, set to 0x01 currently */
17# uint8_t hdr_len; /*!< length in number of 32bit words */
18# uint8_t type; /*!< see GSMTAP_TYPE_* */
19# uint8_t timeslot; /*!< timeslot (0..7 on Um) */
20#
21# uint16_t arfcn; /*!< ARFCN (frequency) */
22# int8_t signal_dbm; /*!< signal level in dBm */
23# int8_t snr_db; /*!< signal/noise ratio in dB */
24#
25# uint32_t frame_number; /*!< GSM Frame Number (FN) */
26#
27# uint8_t sub_type; /*!< Type of burst/channel, see above */
28# uint8_t antenna_nr; /*!< Antenna Number */
29# uint8_t sub_slot; /*!< sub-slot within timeslot */
30# uint8_t res; /*!< reserved for future use (RFU) */
31#
32# }
33
34class gsmtap_hdr():
35 def __init__(self, data):
36 if len(data) < 2:
37 raise TooSmall()
38 self.version, self.hdr_len = struct.unpack('!BB', data[0:2])
39 self.hdr_len *= 4
40
41 if self.hdr_len >= 3:
42 self.type = struct.unpack('!B', data[2:3])[0]
43
44# /*! Structure of the GSMTAP libosmocore logging header */
45# struct gsmtap_osmocore_log_hdr {
46# struct {
47# uint32_t sec;
48# uint32_t usec;
49# } ts;
50# char proc_name[16]; /*!< name of process */
51# uint32_t pid; /*!< process ID */
52# uint8_t level; /*!< logging level */
53# uint8_t _pad[3];
54# /* TODO: color */
55# char subsys[16]; /*!< logging sub-system */
56# struct {
57# char name[32]; /*!< source file name */
58# uint32_t line_nr;/*!< line number */
59# } src_file;
60# } __attribute__((packed));
61
62class gsmtap_log():
63 def __init__(self, data):
64 packformat = '!II16sIBxxx16s32sI'
65 packlen = struct.calcsize(packformat)
66 if len(data) < packlen:
67 raise TooSmall()
68 self.sec, self.usec, \
69 self.proc_name, self.pid, \
70 self.level, self.subsys, \
71 self.filename, self.fileline_nr = struct.unpack(packformat, data[:packlen])
72
73 message_len = len(data) - packlen
74 if message_len > 0:
75 self.message = data[packlen:].decode('utf-8')