aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Wild <ewild@sysmocom.de>2020-05-04 16:27:00 +0200
committerEric Wild <ewild@sysmocom.de>2020-05-11 19:15:00 +0200
commita8ea2dc983e9b3c3cf6d956bf6dc330c0a46f046 (patch)
tree74eeee749b47166a5096e8b64e0d75fc0253ff45
parentcb5d8473d73ae42168f39383acd62c7ca42de04a (diff)
v#1
-rw-r--r--src/Makefile2
-rw-r--r--src/diag_cmd.c5
-rw-r--r--src/diag_dpl.c4
-rw-r--r--src/diag_event.c3
-rw-r--r--src/diag_io.c45
-rw-r--r--src/diag_io.h6
-rw-r--r--src/diag_log.c135
-rw-r--r--src/diag_log.h9
-rw-r--r--src/diag_log_gprs.c130
-rw-r--r--src/diag_log_gsm.c72
-rw-r--r--src/diag_log_lte.c250
-rw-r--r--src/diag_log_qmi.c8
-rw-r--r--src/diag_log_simcard.c7
-rw-r--r--src/diag_log_umts.c18
-rw-r--r--src/diag_log_wcdma.c60
-rw-r--r--src/diag_msg.c48
-rw-r--r--src/diag_msg.h2
-rw-r--r--src/osmo-qcdiag-log.c239
-rw-r--r--src/protocol/diag_log_gprs_mac.h8
-rw-r--r--src/protocol/diag_log_gsm.h2
-rw-r--r--src/protocol/diag_log_lte.h71
-rw-r--r--src/protocol/diag_log_wcdma.h2
22 files changed, 985 insertions, 141 deletions
diff --git a/src/Makefile b/src/Makefile
index 3591ece..1a70f0a 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2,7 +2,7 @@ CPPFLAGS ?= -g -O0 -Wall `pkg-config --cflags libosmocore` `pkg-config --cflags
LIBS ?= `pkg-config --libs libosmocore` `pkg-config --libs qmi-glib`
all: osmo-qcdiag-log
-MODS_LOG = gprs_l1.c gprs_rlc.o gprs_mac.o diag_gsm.o diag_log.o diag_log_gsm.o diag_log_gprs.o diag_log_wcdma.o diag_log_umts.o diag_log_qmi.o diag_dpl.o diag_log_simcard.o diag_event.o
+MODS_LOG = gprs_l1.c gprs_rlc.o gprs_mac.o diag_gsm.o diag_log.o diag_log_gsm.o diag_log_gprs.o diag_log_wcdma.o diag_log_umts.o diag_log_lte.o diag_log_qmi.o diag_dpl.o diag_log_simcard.o diag_event.o
osmo-qcdiag-log: diagchar_hdlc.o diag_io.o osmo-qcdiag-log.o diag_msg.o protocol.o diag_cmd.o $(MODS_LOG)
$(CC) $(CPPFLAGS) -o $@ $^ $(LIBS)
diff --git a/src/diag_cmd.c b/src/diag_cmd.c
index 39f819a..22361d5 100644
--- a/src/diag_cmd.c
+++ b/src/diag_cmd.c
@@ -51,8 +51,7 @@ int diag_process_msg(struct diag_instance *di, struct msgb *msg)
uint8_t cmd = msg->l2h[0];
if (di->gsmtap) {
- gsmtap_send_ex(di->gsmtap, GSMTAP_TYPE_QC_DIAG, 0, 0, 0,
- 0, 0, 0, 0, msgb_l2(msg), msgb_l2len(msg));
+// process(di, msgb_l2(msg), msgb_l2len(msg));
}
switch (cmd) {
@@ -75,6 +74,8 @@ int diag_process_msg(struct diag_instance *di, struct msgb *msg)
msgb_free(msg);
return 1;
} else {
+ /* swallow config messages */
+ if(msg->l2h[0] != DIAG_LOG_CONFIG_F && msg->l2h[0] != DIAG_EXT_MSG_CONFIG_F)
printf("Got %d bytes data of unknown payload type 0x%02x: %s\n",
msgb_length(msg), msg->l2h[0],
osmo_hexdump(msgb_data(msg), msgb_length(msg)));
diff --git a/src/diag_dpl.c b/src/diag_dpl.c
index b5a1bb0..4489d9f 100644
--- a/src/diag_dpl.c
+++ b/src/diag_dpl.c
@@ -120,7 +120,7 @@ int diag_dpl_set_if_log(struct diag_instance *di, uint8_t iface_id,
/* LOG_DATA_PROTOCOL_LOGGING_C must be enabled */
/* dpli_log_full_packet() used to log packet; maximum of 256 bytes per
* diag message; DPLI_BUILD_LOG_PACKET */
-static void handle_pcap_msg(struct log_hdr *lh, struct msgb *msg)
+static void handle_pcap_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct dpl_hdr *dh = (struct dpl_hdr *) msgb_data(msg);
printf("PCAP(fl=0x%02x, ifn=0x%02x, prot=0x%02x, inst=%u, seq=%u, seg=%u): %s\n",
@@ -133,7 +133,9 @@ static const struct diag_log_dispatch_tbl log_tbl[] = {
{ L1X(LOG_DATA_PROTOCOL_LOGGING_C), handle_pcap_msg },
};
+#if 0
static __attribute__((constructor)) void on_dso_load_gsm(void)
{
diag_log_reg_dispatch(log_tbl, ARRAY_SIZE(log_tbl));
}
+#endif
diff --git a/src/diag_event.c b/src/diag_event.c
index 7acbe8d..cd7c654 100644
--- a/src/diag_event.c
+++ b/src/diag_event.c
@@ -152,8 +152,9 @@ static void diag_rx_event_report_f(struct diag_instance *di, struct msgb *msg)
static const struct diag_cmd_dispatch_tbl cmd_tbl[] = {
{ DIAG_EVENT_REPORT_F, diag_rx_event_report_f },
};
-
+#if 0
static __attribute__((constructor)) void on_dso_load_event(void)
{
diag_cmd_reg_dispatch(cmd_tbl, ARRAY_SIZE(cmd_tbl));
}
+#endif
diff --git a/src/diag_io.c b/src/diag_io.c
index d9b019e..962790e 100644
--- a/src/diag_io.c
+++ b/src/diag_io.c
@@ -94,18 +94,29 @@ int diag_transmit_buf(struct diag_instance *di, const uint8_t *data, size_t data
struct msgb *diag_read_msg(struct diag_instance *di)
{
- uint8_t buf[DIAG_MAX_HDLC_BUF_SIZE];
+ static uint8_t buf[DIAG_MAX_HDLC_BUF_SIZE];
struct diag_hdlc_decode_type hdlc_decode;
struct msgb *msg;
- int rc;
+ int rc = 0;
+ static int buf_items_left = 0;
+// printf("--\nRx dump pre: %s\n", osmo_hexdump(buf, buf_items_left));
/* read raw data into buffer */
- rc = read(di->fd, buf, sizeof(buf));
- if (rc <= 0) {
- fprintf(stderr, "Short read!\n");
- exit(1);
+
+ if(!buf_items_left) {
+ rc = read(di->fd, buf+buf_items_left, sizeof(buf)-buf_items_left);
+ if (rc <= 0) {
+ fprintf(stderr, "Short read! %d -> exiting...\n", rc);
+ exit(1);
+ }
}
+ unsigned int read_total = rc + buf_items_left;
+ unsigned int read_current = rc;
+
+// printf("1 Rx dump total: %s\n", osmo_hexdump(buf, read_total));
+ fflush(stdout);
+
if (!di->rx.msg) {
di->rx.msg = msgb_alloc(DIAG_MAX_REQ_SIZE, "DIAG Rx");
di->rx.msg->l2h = di->rx.msg->tail;
@@ -116,12 +127,27 @@ struct msgb *diag_read_msg(struct diag_instance *di)
hdlc_decode.dest_ptr = msg->tail;
hdlc_decode.dest_size = msgb_tailroom(msg);
hdlc_decode.src_ptr = buf;
- hdlc_decode.src_size = rc;
+ hdlc_decode.src_size = read_total;
hdlc_decode.src_idx = 0;
hdlc_decode.dest_idx = 0;
+
rc = diag_hdlc_decode(&hdlc_decode);
+
+ int consumed = hdlc_decode.dest_idx;
+ int current_remaining_in_buf = read_total-consumed;
+// printf("rx %d->%d, rem %d %u \n", read_total, consumed, current_remaining_in_buf, hdlc_decode.src_idx-hdlc_decode.dest_idx);
+
+ if(hdlc_decode.dest_idx < read_total) {
+ memmove(buf, buf+consumed, current_remaining_in_buf);
+ buf_items_left = current_remaining_in_buf;
+ } else
+ buf_items_left = 0;
+
+// printf("2 Rx dump total: %s\n", osmo_hexdump(buf, buf_items_left));
+
+
if (msgb_length(msg) + hdlc_decode.dest_idx > DIAG_MAX_REQ_SIZE) {
fprintf(stderr, "Dropping packet. pkt_size: %d, max: %d\n",
msgb_length(msg) + hdlc_decode.dest_idx,
@@ -142,8 +168,9 @@ struct msgb *diag_read_msg(struct diag_instance *di)
rc = crc_check(msgb_data(msg), msgb_length(msg));
if (rc) {
fprintf(stderr, "Bad CRC, dropping packet\n");
- //msgb_free(msg);
- //return NULL;
+ printf("Rx broken crc: %s\n", msgb_hexdump(msg));
+ msgb_free(msg);
+ return NULL;
}
msgb_get(msg, HDLC_FOOTER_LEN);
diff --git a/src/diag_io.h b/src/diag_io.h
index 6e3cd1e..027b6c5 100644
--- a/src/diag_io.h
+++ b/src/diag_io.h
@@ -6,6 +6,7 @@
#define DIAG_INST_F_HEXDUMP 0x00000001
#define DIAG_INST_F_GSMTAP_DIAG 0x00000002
+#define DIAG_INST_F_GSMTAP_DECODED 0x00000004
struct diag_instance {
int fd;
@@ -16,6 +17,11 @@ struct diag_instance {
} tx;
struct gsmtap_inst *gsmtap;
uint32_t flags;
+ uint32_t gsm_arfcn;
+ uint32_t umts_arfcn_ul;
+ uint32_t umts_arfcn_dl;
+ uint32_t lte_arfcn_ul;
+ uint32_t lte_arfcn_dl;
};
struct msgb *msgb_alloc_diag(void);
diff --git a/src/diag_log.c b/src/diag_log.c
index 5a9a580..5ed8e86 100644
--- a/src/diag_log.c
+++ b/src/diag_log.c
@@ -43,6 +43,12 @@ struct diag_log_config_req_hdr {
uint32_t operation;
} __attribute((packed));
+struct diag_log_config_get_ranges_rsp {
+ struct diag_log_config_req_hdr hdr;
+ uint32_t status;
+ uint32_t last_valid_num[16];
+} __attribute((packed));
+
struct diag_log_config_set_mask {
struct diag_log_config_req_hdr hdr;
uint32_t equip_id;
@@ -50,6 +56,8 @@ struct diag_log_config_set_mask {
uint8_t data[0];
} __attribute((packed));
+static struct diag_log_config_get_ranges_rsp msg_ranges;
+
struct msgb *gen_log_config_set_mask(uint32_t equip_id, uint32_t last_item)
{
struct msgb *msg = msgb_alloc(DIAG_MAX_REQ_SIZE, "Diag Tx");
@@ -66,7 +74,20 @@ struct msgb *gen_log_config_set_mask(uint32_t equip_id, uint32_t last_item)
return msg;
}
-int log_config_set_mask_bit(struct msgb *msg, uint32_t bit_in)
+struct msgb *gen_log_config_get_ranges()
+{
+ struct msgb *msg = msgb_alloc(DIAG_MAX_REQ_SIZE, "Diag Tx");
+ struct diag_log_config_req_hdr *dlcsm;
+
+ msg->l2h = msgb_put(msg, sizeof(*dlcsm));
+ dlcsm = (struct diag_log_config_req_hdr *) msg->l2h;
+ dlcsm->msg_type = DIAG_LOG_CONFIG_F;
+ dlcsm->operation = LOG_CONFIG_RETRIEVE_ID_RANGES_OP;
+
+ return msg;
+}
+
+int log_config_set_mask_bit(struct msgb *msg, uint32_t bit_in, uint8_t value)
{
struct diag_log_config_set_mask *dlcsm;
dlcsm = (struct diag_log_config_set_mask *) msg->l2h;
@@ -79,7 +100,7 @@ int log_config_set_mask_bit(struct msgb *msg, uint32_t bit_in)
return -1;
}
- mask[byte] |= (1 << bit);
+ mask[byte] |= value ? (1 << bit) : 0;
return 0;
}
@@ -102,40 +123,48 @@ void diag_log_reg_dispatch(const struct diag_log_dispatch_tbl *tbl, unsigned int
}
}
-void diag_log_enable_all_supported_family(struct diag_instance *di, uint8_t family)
+void diag_log_set_all_supported_family(struct diag_instance *di, uint8_t family, uint8_t bitvalue)
{
struct msgb *msg, *rx;
unsigned int i, size;
unsigned int family_base = (family & 0xf) << 12;
- unsigned int max = 0;
+// unsigned int max = 0;
+ family = family & 0xF;
- for (i = family_base; i < family_base + 0x1000; i++) {
- if (log_handlers[i]) {
- if (max < i)
- max = i;
- }
- }
+// for (i = family_base; i < family_base + 0x1000; i++) {
+// if (log_handlers[i]) {
+// if (max < i)
+// max = i;
+// }
+// }
+
+// if (family == 1)
+// max = 0x1586;
+
+// if (!max)
+// return;
- if (family == 1)
- max = 0x1586;
+// size = max - family_base;
- if (!max)
+ size = msg_ranges.last_valid_num[family];
+ if(!size) {
+ printf("family %u: size 0, skipping...\n", family);
return;
+ }
- size = max - family_base;
printf("family %u: allocating log mask of size %u\n", family, size);
msg = gen_log_config_set_mask(family, size);
for (i = family_base; i < family_base + 0x1000; i++) {
if (log_handlers[i])
- log_config_set_mask_bit(msg, i-family_base);
+ log_config_set_mask_bit(msg, i-family_base, bitvalue);
}
- if (family == 1) {
- for (i = 0x572; i < 0x585; i++) {
- printf("Setting log 0x%04x\n", i);
- log_config_set_mask_bit(msg, i);
- }
- }
+// if (family == 1) {
+// for (i = 0x572; i < 0x585; i++) {
+// printf("Setting log 0x%04x\n", i);
+// log_config_set_mask_bit(msg, i);
+// }
+// }
rx = diag_transceive_msg(di, msg);
if (rx->l2h[0] != DIAG_LOG_CONFIG_F)
@@ -147,9 +176,33 @@ void diag_log_enable_all_supported_family(struct diag_instance *di, uint8_t fami
void diag_log_enable_all_supported(struct diag_instance *di)
{
unsigned int i;
+ struct msgb *msg, *rx;
+ struct diag_log_config_get_ranges_rsp *res;
+
+ /* max bit num not yet received */
+ if(msg_ranges.hdr.msg_type != DIAG_LOG_CONFIG_F) {
+ msg = gen_log_config_get_ranges();
+ rx = diag_transceive_msg(di, msg);
+ res = (struct diag_log_config_get_ranges_rsp *) (msgb_data(rx));
+ if(sizeof(struct diag_log_config_get_ranges_rsp) == msgb_length(rx))
+ msg_ranges = *res;
+ }
+ for (i = 0; i < 0xF; i++) {
+ printf("max size for family %x: %u\n", i, res->last_valid_num[i]);
+ }
+
+ for (i = 0; i < 0xF; i++) {
+ diag_log_set_all_supported_family(di, i, 1);
+ }
+}
+
+
+void diag_log_disable_all_supported(struct diag_instance *di)
+{
+ unsigned int i;
for (i = 0; i < 0xF; i++) {
- diag_log_enable_all_supported_family(di, i);
+ diag_log_set_all_supported_family(di, i, 0);
}
}
@@ -159,23 +212,43 @@ void diag_log_handle(struct diag_instance *di, struct msgb *msg)
struct log_hdr *lh;
dlh = (struct diag_log_hdr *) msg->data;
- /* FIXME: verify length */
- msg->l3h = msgb_pull(msg, sizeof(*dlh));
- lh = (struct log_hdr *) msg->l3h;
- /* FIXME: verify length */
- msgb_pull(msg, sizeof(*lh));
+ if (sizeof(struct diag_log_hdr) < msgb_length(msg))
+ msg->l3h = msgb_pull(msg, sizeof(*dlh));
+ else {
+ printf("size mismatch! %d\n", __LINE__);
+ return;
+ }
+
+ if (dlh->len != msgb_length(msg)) {
+ printf("size mismatch! %d\n", __LINE__);
+ return;
+ }
+
+ lh = (struct log_hdr *)msg->l3h;
+
+ if (sizeof(struct log_hdr) < msgb_length(msg))
+ msgb_pull(msg, sizeof(*lh));
+ else {
+ printf("size mismatch! %d\n", __LINE__);
+ return;
+ }
+
+ if (lh->len != (msgb_length(msg) + sizeof(struct log_hdr))) {
+ printf("size mismatch! %d %d:%d\n", __LINE__, lh->len, msgb_length(msg));
+ return;
+ }
- printf("LOG(0x%04x|%u|%u): ", lh->code,
- diag_ts_to_epoch(lh->ts), diag_ts_to_fn(lh->ts));
+// printf("LOG(0x%04x|%u|%u): ", lh->code,
+// diag_ts_to_epoch(lh->ts), diag_ts_to_fn(lh->ts));
if (log_handlers[lh->code])
- log_handlers[lh->code](lh, msg);
+ log_handlers[lh->code](di, lh, msg);
else
printf("%s\n", osmo_hexdump(lh->data, lh->len));
}
-void diag_log_hdl_default(struct log_hdr *lh, struct msgb *msg)
+void diag_log_hdl_default(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
printf("%s\n", osmo_hexdump(lh->data, lh->len));
}
diff --git a/src/diag_log.h b/src/diag_log.h
index 0c2cf3e..e41f757 100644
--- a/src/diag_log.h
+++ b/src/diag_log.h
@@ -3,7 +3,7 @@
#include "diag_io.h"
#include "protocol/protocol.h"
-typedef void diag_log_handler(struct log_hdr *lh, struct msgb *msg);
+typedef void diag_log_handler(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg);
struct diag_log_dispatch_tbl {
uint16_t code;
@@ -16,11 +16,12 @@ void diag_log_handle(struct diag_instance *di, struct msgb *msg);
/* called by individual modules to register their own decoders */
void diag_log_reg_dispatch(const struct diag_log_dispatch_tbl *tbl, unsigned int size);
-void diag_log_enable_all_supported_family(struct diag_instance *di, uint8_t family);
+void diag_log_set_all_supported_family(struct diag_instance *di, uint8_t family, uint8_t bitvalue);
void diag_log_enable_all_supported(struct diag_instance *di);
+void diag_log_disable_all_supported(struct diag_instance *di);
/* functions for log configuration */
struct msgb *gen_log_config_set_mask(uint32_t equip_id, uint32_t last_item);
-int log_config_set_mask_bit(struct msgb *msg, uint32_t bit_in);
+int log_config_set_mask_bit(struct msgb *msg, uint32_t bit_in, uint8_t enabled);
-void diag_log_hdl_default(struct log_hdr *lh, struct msgb *msg);
+void diag_log_hdl_default(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg);
diff --git a/src/diag_log_gprs.c b/src/diag_log_gprs.c
index 89e5e18..11cc86d 100644
--- a/src/diag_log_gprs.c
+++ b/src/diag_log_gprs.c
@@ -18,6 +18,10 @@
#include <stdio.h>
+#include <osmocom/core/gsmtap.h>
+#include <osmocom/core/gsmtap_util.h>
+#include <osmocom/core/utils.h>
+
#include "diag_log.h"
#include "protocol/diag_log_gsm.h"
#include "protocol/diag_log_gprs_rlc.h"
@@ -25,7 +29,7 @@
#include "protocol/diag_log_gprs_l1.h"
-static void handle_grr_state_msg(struct log_hdr *lh, struct msgb *msg)
+static void handle_grr_state_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct diag_gprs_grr_state *rrs = (struct diag_gprs_grr_state *) msgb_data(msg);
@@ -33,7 +37,7 @@ static void handle_grr_state_msg(struct log_hdr *lh, struct msgb *msg)
get_value_string(diag_gprs_grr_st_vals, rrs->grr_state));
}
-static void handle_rlc_ul_abnrml_rls(struct log_hdr *lh, struct msgb *msg)
+static void handle_rlc_ul_abnrml_rls(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_rlc_ul_abnrml_rls_counts *arc;
arc = (struct gprs_rlc_ul_abnrml_rls_counts *) msgb_data(msg);
@@ -42,17 +46,56 @@ static void handle_rlc_ul_abnrml_rls(struct log_hdr *lh, struct msgb *msg)
arc->access_reject_cnt, arc->arc_retry_cnt, arc->arc_wo_retry_cnt, arc->arc_sys_info_cnt);
}
-static void handle_mac_sign_msg(struct log_hdr *lh, struct msgb *msg)
+static void handle_mac_sign_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
+ uint32_t ctype = 0;
+ uint16_t arfcn = di->gsm_arfcn;
+ uint8_t *data;
+ unsigned int len;
struct gprs_mac_signalling_msg *msm;
msm = (struct gprs_mac_signalling_msg *) msgb_data(msg);
- printf("MAC-SIGN-MSG { chan_type=%s, msg_type=%s, msg=%s }\n",
- get_value_string(gprs_mac_chan_type_vals, msm->chan_type),
- get_value_string(gprs_mac_msg_type_vals, msm->msg_type),
- osmo_hexdump(msm->msg, msm->msg_len));
+// printf("MAC-SIGN-MSG { chan_type=%s, msg_type=%s, msg=%s }\n",
+// get_value_string(gprs_mac_chan_type_vals, msm->chan_type),
+// get_value_string(gprs_mac_msg_type_vals, msm->msg_type),
+// osmo_hexdump(msm->msg, msm->msg_len));
+
+ if(msm->msg_type == PACKET_CHANNEL_REQUEST)
+ return;
+ if(msm->chan_type == 255)
+ return;
+
+ switch(msm->chan_type & 0x7f){
+ case PACCH_RRBP_CHANNEL:
+ case UL_PACCH_CHANNEL:
+ case DL_PACCH_CHANNEL:
+ ctype = GSMTAP_CHANNEL_PACCH;
+ break;
+ default:
+ printf("Unhandled MAC-SIGN-MSG: %s %u: %s\n",
+ get_value_string(gprs_mac_chan_type_vals, msm->chan_type & 0x7f),
+ msm->msg_len,
+ osmo_hexdump(msgb_data(msg), msm->msg_len));
+ return;
+ }
+
+ arfcn = msm->chan_type & 0x80 ? arfcn: arfcn | GSMTAP_ARFCN_F_UPLINK;
+
+ data = msm->msg;
+ len = msm->msg_len;
+
+ /* prepend flag */
+ data--;
+ *data = 1 << 6; /* PAYLOAD_TYPE_CTRL_NO_OPT_OCTET */
+ len++;
+
+
+ /* abis due to no lapdm header */
+ if (di->gsmtap && di->flags & DIAG_INST_F_GSMTAP_DECODED) {
+ gsmtap_send_ex(di->gsmtap, GSMTAP_TYPE_UM, arfcn, 0, ctype, 0, 0, 0, 0, data, len);
+ }
}
-static void handle_llc_me_info(struct log_hdr *lh, struct msgb *msg)
+static void handle_llc_me_info(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct diag_gprs_llme_info *gli;
gli = (struct diag_gprs_llme_info *) msgb_data(msg);
@@ -62,7 +105,7 @@ static void handle_llc_me_info(struct log_hdr *lh, struct msgb *msg)
osmo_hexdump_nospc(gli->enc_key, sizeof(gli->enc_key)));
}
-static void handle_llc_xid_info(struct log_hdr *lh, struct msgb *msg)
+static void handle_llc_xid_info(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct diag_gprs_llc_xid_info *glxi;
@@ -82,7 +125,7 @@ static void handle_llc_xid_info(struct log_hdr *lh, struct msgb *msg)
}
-static void handle_llc_pdu_stats(struct log_hdr *lh, struct msgb *msg)
+static void handle_llc_pdu_stats(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct diag_gprs_llc_stats *gls;
gls = (struct diag_gprs_llc_stats *) msgb_data(msg);
@@ -94,7 +137,7 @@ static void handle_llc_pdu_stats(struct log_hdr *lh, struct msgb *msg)
gls->llpdu_tx, gls->llpdu_rx, gls->llpdu_fcs_err, gls->llpdu_frm_rej, gls->llpdu_tlli_err, gls->llpdu_addr_err, gls->llpdu_short_err);
}
-static void handle_mac_state(struct log_hdr *lh, struct msgb *msg)
+static void handle_mac_state(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_mac_state_change *msc;
msc = (struct gprs_mac_state_change *) msgb_data(msg);
@@ -116,7 +159,7 @@ static void handle_mac_state(struct log_hdr *lh, struct msgb *msg)
get_value_string(gprs_mac_mode_vals, msc->mac_mode), name);
}
-static void handle_mac_dl_tbf_est(struct log_hdr *lh, struct msgb *msg)
+static void handle_mac_dl_tbf_est(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_mac_dl_tbf_est *dte;
dte = (struct gprs_mac_dl_tbf_est *) msgb_data(msg);
@@ -125,7 +168,7 @@ static void handle_mac_dl_tbf_est(struct log_hdr *lh, struct msgb *msg)
dte->dl_tfi, dte->rlc_mode, dte->dl_ts_bmap, dte->is_egprs_tbf, dte->egprs_win_size, dte->egprs_link_qual_mode, dte->bep_period2);
}
-static void handle_mac_ul_tbf_est(struct log_hdr *lh, struct msgb *msg)
+static void handle_mac_ul_tbf_est(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_mac_ul_tbf_est *ute;
ute = (struct gprs_mac_ul_tbf_est *) msgb_data(msg);
@@ -134,7 +177,7 @@ static void handle_mac_ul_tbf_est(struct log_hdr *lh, struct msgb *msg)
ute->tbf_req_cause, ute->acc_granted, ute->radio_prio, ute->peak_tput, ute->ul_tfi, ute->rlc_mode, ute->ul_ts_bmap, ute->is_egprs_tbf, ute->egprs_win_size, ute->resegment, ute->bep_period2);
}
-static void handle_mac_dl_tbf_rel(struct log_hdr *lh, struct msgb *msg)
+static void handle_mac_dl_tbf_rel(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_mac_tbf_release *tr;
tr = (struct gprs_mac_tbf_release *) msgb_data(msg);
@@ -142,7 +185,7 @@ static void handle_mac_dl_tbf_rel(struct log_hdr *lh, struct msgb *msg)
printf("MAC-DL-TBF-REL { tfi=%u, fail_cause=%u }\n", tr->tfi, tr->fail_cause);
}
-static void handle_mac_ul_tbf_rel(struct log_hdr *lh, struct msgb *msg)
+static void handle_mac_ul_tbf_rel(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_mac_tbf_release *tr;
tr = (struct gprs_mac_tbf_release *) msgb_data(msg);
@@ -150,7 +193,7 @@ static void handle_mac_ul_tbf_rel(struct log_hdr *lh, struct msgb *msg)
printf("MAC-DL-TBF-REL { tfi=%u, fail_cause=%u }\n", tr->tfi, tr->fail_cause);
}
-static void handle_mac_dl_acknack(struct log_hdr *lh, struct msgb *msg)
+static void handle_mac_dl_acknack(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_mac_dl_acknack *da;
da = (struct gprs_mac_dl_acknack *) msgb_data(msg);
@@ -159,7 +202,7 @@ static void handle_mac_dl_acknack(struct log_hdr *lh, struct msgb *msg)
osmo_hexdump(msgb_data(msg)+1, msgb_length(msg)-1));
}
-static void handle_mac_ul_acknack(struct log_hdr *lh, struct msgb *msg)
+static void handle_mac_ul_acknack(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
//struct gprs_mac_ul_acknack *ua;
//ua = (struct gprs_mac_ul_acknack *) msgb_data(msg);
@@ -168,7 +211,7 @@ static void handle_mac_ul_acknack(struct log_hdr *lh, struct msgb *msg)
osmo_hexdump(msgb_data(msg), msgb_length(msg)));
}
-static void handle_rlc_ul_evt_cnt(struct log_hdr *lh, struct msgb *msg)
+static void handle_rlc_ul_evt_cnt(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_rlc_ul_event_counts *uec;
uec = (struct gprs_rlc_ul_event_counts *) msgb_data(msg);
@@ -177,7 +220,7 @@ static void handle_rlc_ul_evt_cnt(struct log_hdr *lh, struct msgb *msg)
uec->llc_event_cnt, uec->mac_event_cnt, uec->pl1_event_cnt, uec->tmr_event_cnt);
}
-static void handle_rlc_ul_stats(struct log_hdr *lh, struct msgb *msg)
+static void handle_rlc_ul_stats(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_rlc_ul_stats *uls;
uls = (struct gprs_rlc_ul_stats *) msgb_data(msg);
@@ -187,7 +230,7 @@ static void handle_rlc_ul_stats(struct log_hdr *lh, struct msgb *msg)
get_value_string(gprs_rlc_ul_substate_vals, uls->rlc_ul_substate));
}
-static void handle_rlc_dl_stats(struct log_hdr *lh, struct msgb *msg)
+static void handle_rlc_dl_stats(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_rlc_dl_stats *dls;
dls = (struct gprs_rlc_dl_stats *) msgb_data(msg);
@@ -196,7 +239,7 @@ static void handle_rlc_dl_stats(struct log_hdr *lh, struct msgb *msg)
get_value_string(gprs_rlc_dl_state_vals, dls->rlc_dl_state));
}
-static void handle_rlc_ul_header(struct log_hdr *lh, struct msgb *msg)
+static void handle_rlc_ul_header(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_rlc_ul_header *ulh;
ulh = (struct gprs_rlc_ul_header *) msgb_data(msg);
@@ -206,7 +249,7 @@ static void handle_rlc_ul_header(struct log_hdr *lh, struct msgb *msg)
osmo_hexdump(ulh->ul_hdr, sizeof(ulh->ul_hdr)));
}
-static void handle_rlc_rel(struct log_hdr *lh, struct msgb *msg)
+static void handle_rlc_rel(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_rlc_release_ind *rli;
rli = (struct gprs_rlc_release_ind *) msgb_data(msg);
@@ -218,12 +261,25 @@ static void handle_rlc_rel(struct log_hdr *lh, struct msgb *msg)
printf("RLC-%cL-RELEASE { tfi=%u, cause=%u }\n", ud, rli->tfi, rli->cause);
}
-static void handle_gmm_ota_msg(struct log_hdr *lh, struct msgb *msg)
-{
- printf("GMM-OTA-MESSAGE { FIXME }\n");
+static void handle_gmm_ota_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
+{ uint32_t ctype = 0;
+ uint16_t arfcn = di->gsm_arfcn;
+ uint8_t *data;
+ unsigned int len;
+ struct gprs_sm_gmm_ota_msg *msm;
+ msm = (struct gprs_sm_gmm_ota_msg *) msgb_data(msg);
+
+ arfcn = msm->chan_type ? arfcn: arfcn | GSMTAP_ARFCN_F_UPLINK;
+
+ data = msm->msg;
+ len = msm->msg_len;
+
+ if (di->gsmtap && di->flags & DIAG_INST_F_GSMTAP_DECODED) {
+ gsmtap_send_ex(di->gsmtap, GSMTAP_TYPE_ABIS, arfcn, 0, ctype, 0, 0, 0, 0, data, len);
+ }
}
-static void handle_ul_acknack_v2(struct log_hdr *lh, struct msgb *msg)
+static void handle_ul_acknack_v2(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_rlc_ul_acknack_params_v2 *ula;
ula = (struct gprs_rlc_ul_acknack_params_v2 *) msgb_data(msg);
@@ -233,7 +289,7 @@ static void handle_ul_acknack_v2(struct log_hdr *lh, struct msgb *msg)
ula->countdown_val, ula->va, ula->vs, ula->stall_ind, ula->rrb_high32, ula->rrb_low32);
}
-static void handle_dl_acknack_v2(struct log_hdr *lh, struct msgb *msg)
+static void handle_dl_acknack_v2(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_rlc_dl_acknack_params_v2 *dla;
dla = (struct gprs_rlc_dl_acknack_params_v2 *) msgb_data(msg);
@@ -243,7 +299,7 @@ static void handle_dl_acknack_v2(struct log_hdr *lh, struct msgb *msg)
get_value_string(gprs_coding_schemes, dla->coding_scheme), dla->rrb_high32, dla->rrb_low32);
}
-static void handle_tx_sched_res(struct log_hdr *lh, struct msgb *msg)
+static void handle_tx_sched_res(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_tx_sched_res *tsr;
tsr = (struct gprs_tx_sched_res *) msgb_data(msg);
@@ -264,7 +320,7 @@ static void handle_tx_sched_res(struct log_hdr *lh, struct msgb *msg)
printf(" ] }\n");
}
-static void handle_gprs_power_control(struct log_hdr *lh, struct msgb *msg)
+static void handle_gprs_power_control(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_power_control *gpc;
gpc = (struct gprs_power_control *) msgb_data(msg);
@@ -275,7 +331,7 @@ static void handle_gprs_power_control(struct log_hdr *lh, struct msgb *msg)
gpc->alpha, gpc->derived_c, gpc->pmax);
}
-static void handle_gprs_xfer_sum(struct log_hdr *lh, struct msgb *msg)
+static void handle_gprs_xfer_sum(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_xfer_sum *gxs;
gxs = (struct gprs_xfer_sum *) msgb_data(msg);
@@ -285,7 +341,7 @@ static void handle_gprs_xfer_sum(struct log_hdr *lh, struct msgb *msg)
gxs->dl_ptcch_ts, gxs->ta, gxs->usf_granularity, gxs->ul_bitmap_tn, gxs->dl_bitmap_tn);
}
-static void handle_gprs_aif_sum(struct log_hdr *lh, struct msgb *msg)
+static void handle_gprs_aif_sum(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_air_if_summary *gaifs;
gaifs = (struct gprs_air_if_summary *) msgb_data(msg);
@@ -294,7 +350,7 @@ static void handle_gprs_aif_sum(struct log_hdr *lh, struct msgb *msg)
gaifs->fn, gaifs->band_ind, gaifs->dl_ts, gaifs->ul_ts, gaifs->rx_power);
}
-static void handle_gprs_rx_msg_metrics_a_v2(struct log_hdr *lh, struct msgb *msg)
+static void handle_gprs_rx_msg_metrics_a_v2(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct gprs_rx_msg_metr_a_v2 *metr;
metr = (struct gprs_rx_msg_metr_a_v2 *) msgb_data(msg);
@@ -315,7 +371,7 @@ static inline uint32_t round_next_octet(uint32_t num_bits)
return num_bytes;
}
-static void handle_egprs_rlc_epdan(struct log_hdr *lh, struct msgb *msg)
+static void handle_egprs_rlc_epdan(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct diag_egprs_rlc_epdan *epd = (struct diag_egprs_rlc_epdan *) msgb_data(msg);
@@ -331,6 +387,7 @@ static void handle_egprs_rlc_epdan(struct log_hdr *lh, struct msgb *msg)
}
static const struct diag_log_dispatch_tbl log_tbl[] = {
+#if 0
/* LLC */
{ GSM(LOG_GPRS_LLC_ME_INFO_C), handle_llc_me_info }, /* requested? */
{ GSM(LOG_GPRS_LLC_PDU_STATS_C), handle_llc_pdu_stats }, /* requested? */
@@ -351,15 +408,17 @@ static const struct diag_log_dispatch_tbl log_tbl[] = {
{ 0x5206, diag_log_hdl_default },
/* MAC */
{ GSM(LOG_GPRS_MAC_STATE_C), handle_mac_state },
+ #endif
{ GSM(LOG_GPRS_MAC_SIGNALLING_MESSAGE_C), handle_mac_sign_msg },
+ { GSM(LOG_GPRS_SM_GMM_OTA_MESSAGE_C), handle_gmm_ota_msg },
+ #if 0
{ GSM(LOG_GPRS_MAC_DL_TBF_ESTABLISH_C), handle_mac_dl_tbf_est },
{ GSM(LOG_GPRS_MAC_UL_TBF_ESTABLISH_C), handle_mac_ul_tbf_est },
{ GSM(LOG_EGPRS_MAC_DL_ACKNACK_C), handle_mac_dl_acknack },
{ GSM(LOG_EGPRS_MAC_UL_ACKNACK_C), handle_mac_ul_acknack },
{ GSM(LOG_GPRS_MAC_DL_TBF_RELEASE_C), handle_mac_dl_tbf_rel },
{ GSM(LOG_GPRS_MAC_UL_TBF_RELEASE_C), handle_mac_ul_tbf_rel },
- /* SM/GMM */
- { GSM(LOG_GPRS_SM_GMM_OTA_MESSAGE_C), handle_gmm_ota_msg },
+
/* Layer 1 */
{ 0x5230, diag_log_hdl_default },
@@ -383,6 +442,7 @@ static const struct diag_log_dispatch_tbl log_tbl[] = {
{ 0x508f, diag_log_hdl_default },
{ 0x5209, diag_log_hdl_default },
+ #endif
};
static __attribute__((constructor)) void on_dso_load_gprs(void)
diff --git a/src/diag_log_gsm.c b/src/diag_log_gsm.c
index fff1a5c..d5e5350 100644
--- a/src/diag_log_gsm.c
+++ b/src/diag_log_gsm.c
@@ -18,20 +18,65 @@
#include <stdio.h>
+#include <osmocom/core/gsmtap.h>
+#include <osmocom/core/gsmtap_util.h>
+#include <osmocom/core/utils.h>
+
#include "diag_log.h"
#include "protocol/diag_log_gsm.h"
+struct dirty_fcch {
+ uint16_t arfcn_band;
+ /* don't care about anyhting else */
+};
-static void handle_rr_sig_msg(struct log_hdr *lh, struct msgb *msg)
+static void handle_rr_sig_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
+ uint32_t ctype = 0;
+ uint16_t arfcn = di->gsm_arfcn;
+ uint8_t *data;
+ unsigned int len;
struct diag_gsm_rr_msg *rm = (struct diag_gsm_rr_msg *) msgb_data(msg);
- printf("RR: %s %02x %u: %s\n",
- get_value_string(diag_gsm_l2_chantype_vals, rm->chan_type & 0x7f),
- rm->msg_type, rm->length, osmo_hexdump(msgb_data(msg), rm->length));
+// printf("RR: %s %02x %u: %s\n",
+// get_value_string(diag_gsm_l2_chantype_vals, rm->chan_type & 0x7f),
+// rm->msg_type, rm->length, osmo_hexdump(msgb_data(msg), rm->length));
+
+ switch(rm->chan_type & 0x7f){
+ case DIAG_GSM_L2_CHAN_TYPE_DCCH: ctype =GSMTAP_CHANNEL_SDCCH; break;
+ case DIAG_GSM_L2_CHAN_TYPE_BCCH: ctype =GSMTAP_CHANNEL_BCCH; break;
+ case DIAG_GSM_L2_CHAN_TYPE_RACH: ctype =GSMTAP_CHANNEL_RACH; break;
+ case DIAG_GSM_L2_CHAN_TYPE_CCCH: ctype =GSMTAP_CHANNEL_CCCH; break;
+ case DIAG_GSM_L2_CHAN_TYPE_SACCH: ctype =GSMTAP_CHANNEL_SDCCH | GSMTAP_CHANNEL_ACCH; break;
+ case DIAG_GSM_L2_CHAN_TYPE_SDCCH: ctype =GSMTAP_CHANNEL_SDCCH; break;
+ case DIAG_GSM_L2_CHAN_TYPE_FACCH_F: ctype =GSMTAP_CHANNEL_TCH_F | GSMTAP_CHANNEL_ACCH; break;
+ case DIAG_GSM_L2_CHAN_TYPE_FACCH_H: ctype =GSMTAP_CHANNEL_TCH_H | GSMTAP_CHANNEL_ACCH; break;
+ default:
+ printf("Unhandled RR: %s %u: %s\n",
+ get_value_string(diag_gsm_l2_chantype_vals, rm->chan_type & 0x7f),
+ rm->length,
+ osmo_hexdump(msgb_data(msg), rm->length));
+ return;
+ }
+
+ arfcn = rm->chan_type & 0x80 ? arfcn : arfcn | GSMTAP_ARFCN_F_UPLINK;
+
+ data = rm->data;
+ len = rm->length;
+
+ /* skip l2 pseudo len */
+ if (ctype == GSMTAP_CHANNEL_BCCH || ctype == GSMTAP_CHANNEL_CCCH){
+ data++;
+ len--;
+ }
+
+ /* abis due to no lapdm header */
+ if (di->gsmtap && di->flags & DIAG_INST_F_GSMTAP_DECODED) {
+ gsmtap_send_ex(di->gsmtap, GSMTAP_TYPE_ABIS, arfcn, 0, ctype, 0, 0, 0, 0, data, len);
+ }
}
-static void handle_rr_state_msg(struct log_hdr *lh, struct msgb *msg)
+static void handle_rr_state_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct diag_gsm_rr_state *rrs = (struct diag_gsm_rr_state *) msgb_data(msg);
printf("RR-STATE { state=%s, substate=%u, status=%u, mode=%u }\n",
@@ -40,7 +85,7 @@ static void handle_rr_state_msg(struct log_hdr *lh, struct msgb *msg)
}
-static void handle_mdsp_cmd(struct log_hdr *lh, struct msgb *msg)
+static void handle_mdsp_cmd(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct diag_mdsp_log_cmds *dmlcs = (struct diag_mdsp_log_cmds *) msgb_data(msg);
int i;
@@ -60,7 +105,7 @@ static void handle_mdsp_cmd(struct log_hdr *lh, struct msgb *msg)
printf(" ] }\n");
}
-static void handle_l2_state(struct log_hdr *lh, struct msgb *msg)
+static void handle_l2_state(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct diag_gsm_l2_state *l2s = (struct diag_gsm_l2_state *) msgb_data(msg);
@@ -81,7 +126,7 @@ static void handle_l2_state(struct log_hdr *lh, struct msgb *msg)
get_value_string(diag_gsm_l2_event_vals, l2s->l2_event));
}
-static void handle_l2_transm_status(struct log_hdr *lh, struct msgb *msg)
+static void handle_l2_transm_status(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct diag_gsm_l2_transm_status *lts = (struct diag_gsm_l2_transm_status *) msgb_data(msg);
@@ -92,12 +137,23 @@ static void handle_l2_transm_status(struct log_hdr *lh, struct msgb *msg)
lts->seq_err, lts->frame_type, lts->msg_entries, lts->seg_entries);
}
+static void handle_arfcn(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
+{
+ struct dirty_fcch *rm = (struct dirty_fcch *) msgb_data(msg);
+ di->gsm_arfcn = rm->arfcn_band & 0x0FFF;
+}
+
static const struct diag_log_dispatch_tbl log_tbl[] = {
{ GSM(LOG_GSM_RR_SIGNALING_MESSAGE_C), handle_rr_sig_msg },
+ { GSM(LOG_GSM_RR_CELL_INFO_C), handle_arfcn },
+ { GSM(LOG_GSM_FCCH_DECODE_C), handle_arfcn },
+ { GSM(LOG_GSM_SCH_DECODE_C), handle_arfcn },
+#if 0
{ GSM(LOG_GSM_RR_STATE_C), handle_rr_state_msg },
{ GSM(LOG_GSM_MDSP_CMD_C), handle_mdsp_cmd },
{ GSM(LOG_GSM_L2_STATE_C), handle_l2_state },
{ GSM(LOG_GSM_L2_TRANSMISSION_STATUS_C), handle_l2_transm_status},
+#endif
};
static __attribute__((constructor)) void on_dso_load_gsm(void)
diff --git a/src/diag_log_lte.c b/src/diag_log_lte.c
new file mode 100644
index 0000000..17a6559
--- /dev/null
+++ b/src/diag_log_lte.c
@@ -0,0 +1,250 @@
+#include <stdio.h>
+
+#include <osmocom/core/gsmtap.h>
+#include <osmocom/core/gsmtap_util.h>
+#include <osmocom/core/utils.h>
+
+#include "diag_log.h"
+#include "protocol/diag_log_lte.h"
+
+struct sub_chan_map {
+ uint8_t is_ul;
+ uint8_t qc_id;
+ uint8_t gsmtap_lte_rrc_msg;
+};
+
+
+static struct sub_chan_map rrc_subtype_map_lt9_13_22[] = {
+ {0, 1, GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message },
+ {0, 2, GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message},
+ {0, 3, GSMTAP_LTE_RRC_SUB_MCCH_Message },
+ {0, 4, GSMTAP_LTE_RRC_SUB_PCCH_Message },
+ {0, 5, GSMTAP_LTE_RRC_SUB_DL_CCCH_Message },
+ {0, 6, GSMTAP_LTE_RRC_SUB_DL_DCCH_Message },
+ {1, 7, GSMTAP_LTE_RRC_SUB_UL_CCCH_Message },
+ {1, 8, GSMTAP_LTE_RRC_SUB_UL_DCCH_Message },
+};
+
+
+
+static struct sub_chan_map rrc_subtype_map_9to12[] = {
+ {0,8, GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message },
+ {0,9, GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message },
+ {0,10, GSMTAP_LTE_RRC_SUB_MCCH_Message },
+ {0,11, GSMTAP_LTE_RRC_SUB_PCCH_Message },
+ {0,12, GSMTAP_LTE_RRC_SUB_DL_CCCH_Message },
+ {0,13, GSMTAP_LTE_RRC_SUB_DL_DCCH_Message },
+ {1,14, GSMTAP_LTE_RRC_SUB_UL_CCCH_Message },
+ {1,15, GSMTAP_LTE_RRC_SUB_UL_DCCH_Message },
+ };
+
+static struct sub_chan_map rrc_subtype_map_14_15_16[] = {
+ {0,1, GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message },
+ {0,2, GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message },
+ {0,4, GSMTAP_LTE_RRC_SUB_MCCH_Message },
+ {0,5, GSMTAP_LTE_RRC_SUB_PCCH_Message },
+ {0,6, GSMTAP_LTE_RRC_SUB_DL_CCCH_Message },
+ {0,7, GSMTAP_LTE_RRC_SUB_DL_DCCH_Message },
+ {1,8, GSMTAP_LTE_RRC_SUB_UL_CCCH_Message },
+ {1,9, GSMTAP_LTE_RRC_SUB_UL_DCCH_Message },
+ };
+
+
+static struct sub_chan_map rrc_subtype_map_19_26[] = {
+ {0,1, GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message },
+ {0,3, GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message },
+ {0,6, GSMTAP_LTE_RRC_SUB_MCCH_Message },
+ {0,7, GSMTAP_LTE_RRC_SUB_PCCH_Message },
+ {0,8, GSMTAP_LTE_RRC_SUB_DL_CCCH_Message },
+ {0,9, GSMTAP_LTE_RRC_SUB_DL_DCCH_Message },
+ {1,10,GSMTAP_LTE_RRC_SUB_UL_CCCH_Message },
+ {1,11,GSMTAP_LTE_RRC_SUB_UL_DCCH_Message },
+ {0,45, GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_NB },
+ {0,46, GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_NB },
+ {0,47, GSMTAP_LTE_RRC_SUB_PCCH_Message_NB },
+ {0,48, GSMTAP_LTE_RRC_SUB_DL_CCCH_Message_NB },
+ {0,49, GSMTAP_LTE_RRC_SUB_DL_DCCH_Message_NB },
+ {1,50, GSMTAP_LTE_RRC_SUB_UL_CCCH_Message_NB },
+ {1,52, GSMTAP_LTE_RRC_SUB_UL_DCCH_Message_NB },
+ };
+
+static struct sub_chan_map rrc_subtype_map_20[] = {
+ {0,1, GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message , },
+ {0,2, GSMTAP_LTE_RRC_SUB_BCCH_DL_SCH_Message, },
+ {0,4, GSMTAP_LTE_RRC_SUB_MCCH_Message, },
+ {0,5, GSMTAP_LTE_RRC_SUB_PCCH_Message, },
+ {0,6, GSMTAP_LTE_RRC_SUB_DL_CCCH_Message, },
+ {0,7, GSMTAP_LTE_RRC_SUB_DL_DCCH_Message, },
+ {1,8, GSMTAP_LTE_RRC_SUB_UL_CCCH_Message, },
+ {1,9, GSMTAP_LTE_RRC_SUB_UL_DCCH_Message },
+ {0,54, GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_NB, },
+ {0,55, GSMTAP_LTE_RRC_SUB_BCCH_BCH_Message_NB, },
+ {0,56, GSMTAP_LTE_RRC_SUB_PCCH_Message_NB, },
+ {0,57, GSMTAP_LTE_RRC_SUB_DL_CCCH_Message_NB, },
+ {0,58, GSMTAP_LTE_RRC_SUB_DL_DCCH_Message_NB, },
+ {1,59, GSMTAP_LTE_RRC_SUB_UL_CCCH_Message_NB, },
+ {1,61, GSMTAP_LTE_RRC_SUB_UL_DCCH_Message_NB },
+ };
+
+struct chan_map_result {
+ uint8_t is_ul;
+ uint8_t chan;
+};
+
+struct lte_cell_info_dirty_012 {
+ uint16_t band;
+ uint16_t dl_arfcn;
+ uint16_t ul_arfcn;
+ /* don't care about anything else */
+};
+
+struct lte_cell_info_dirty_2plus {
+ uint16_t band;
+ uint32_t dl_arfcn;
+ uint32_t ul_arfcn;
+ /* don't care about anything else */
+};
+
+#define MAPC(xx) \
+for(i=0; i < ARRAY_SIZE(xx); i++) {\
+if(inout->chan == xx[i].qc_id){ \
+ inout->chan = xx[i].gsmtap_lte_rrc_msg; \
+ inout->is_ul = xx[i].is_ul; \
+ return 0; \
+ } \
+ }
+
+
+static int find_map_in_ver(int version, struct chan_map_result* inout) {
+ unsigned int i = 0;
+ if(version < 9 || version == 13 || version == 22)
+ MAPC(rrc_subtype_map_lt9_13_22)
+ else if(version >= 9 && version <= 12)
+ MAPC(rrc_subtype_map_9to12)
+ else if(version >= 14 && version <= 16)
+ MAPC(rrc_subtype_map_14_15_16)
+ else if(version == 19 || version == 26)
+ MAPC(rrc_subtype_map_19_26)
+ else if(version == 20)
+ MAPC(rrc_subtype_map_20)
+ else
+ return -1;
+
+ return 0;
+
+}
+
+static void handle_lte_rrc_ota_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
+{
+ uint16_t arfcn = 0;
+ uint8_t* data;
+ struct chan_map_result mc;
+ struct diag_lte_rrc_ota_base_8plus_msg *r8p;
+ struct diag_lte_rrc_ota_base_msg *rrm = (struct diag_lte_rrc_ota_base_msg *) msgb_data(msg);
+
+ if (rrm->ext_ver < 8 || rrm->ext_ver > 24) {
+ printf("Unhandled LTE OTA rel: %u\n", rrm->ext_ver);
+ return;
+ }
+ r8p = (struct diag_lte_rrc_ota_base_8plus_msg *)msgb_data(msg);
+ data = msgb_data(msg) + sizeof(struct diag_lte_rrc_ota_base_8plus_msg);
+
+ if (msgb_length(msg) - sizeof(struct diag_lte_rrc_ota_base_8plus_msg) != r8p->len) {
+ printf("Unhandled LTE OTA rel len: %u %u\n", rrm->ext_ver, r8p->len);
+ return;
+ }
+
+ switch (r8p->channel_type) {
+ case 254:
+ case 255:
+ return;
+ }
+
+ mc.chan = r8p->channel_type;
+ if (find_map_in_ver(r8p->hdr.ext_ver, &mc) < 0)
+ printf("Unhandled LTE OTA rel len: %u %u\n", rrm->ext_ver, r8p->len);
+
+ arfcn = mc.is_ul ? di->lte_arfcn_ul : di->lte_arfcn_dl;
+ arfcn = mc.is_ul ? arfcn | GSMTAP_ARFCN_F_UPLINK: arfcn;
+
+// printf("lte m: %s\n", osmo_hexdump(data, 1));
+
+
+ if (di->gsmtap && di->flags & DIAG_INST_F_GSMTAP_DECODED) {
+ gsmtap_send_ex(di->gsmtap, GSMTAP_TYPE_LTE_RRC, arfcn, 0, mc.chan, 0, 0, 0, 0, data ,r8p->len);
+ }
+}
+
+static void handle_lte_rrc_cell_info(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
+{
+
+ uint8_t* data;
+
+ struct diag_lte_rrc_ota_base_8plus_msg *r8p;
+ struct diag_lte_rrc_ota_base_msg *rrm = (struct diag_lte_rrc_ota_base_msg *) msgb_data(msg);
+
+ uint8_t ver = *(uint8_t *) msgb_data(msg);
+ if(ver < 3) {
+ struct lte_cell_info_dirty_012* i = (struct lte_cell_info_dirty_012 *) msgb_data(msg);
+ di->lte_arfcn_dl = i->dl_arfcn;
+ di->lte_arfcn_ul = i->ul_arfcn;
+ } else {
+ struct lte_cell_info_dirty_2plus* i = (struct lte_cell_info_dirty_2plus *) msgb_data(msg);
+ di->lte_arfcn_dl = i->dl_arfcn;
+ di->lte_arfcn_ul = i->ul_arfcn;
+ }
+
+}
+
+static void handle_lte_nas_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
+{
+ uint16_t arfcn = 0;
+ uint8_t* data;
+ uint32_t len;
+ bool sec_hdr = false;
+ bool is_ul = false;
+
+ data = msgb_data(msg) + sizeof(struct diag_lte_rrc_nas_msg);
+ len = msgb_length(msg) - sizeof(struct diag_lte_rrc_nas_msg);
+
+ switch(lh->code) {
+ case LTE(LOG_LTE_NAS_ESM_OTA_IN_SEC_MSG_LOG_C):
+ case LTE(LOG_LTE_NAS_ESM_OTA_OUT_SEC_MSG_LOG_C):
+ case LTE(LOG_LTE_NAS_EMM_OTA_IN_SEC_MSG_LOG_C):
+ case LTE(LOG_LTE_NAS_EMM_OTA_OUT_SEC_MSG_LOG_C):
+ sec_hdr = true;
+ break;
+ }
+
+ switch(lh->code) {
+ case LTE(LOG_LTE_NAS_ESM_OTA_IN_MSG_LOG_C):
+ case LTE(LOG_LTE_NAS_EMM_OTA_IN_MSG_LOG_C):
+ case LTE(LOG_LTE_NAS_ESM_OTA_IN_SEC_MSG_LOG_C):
+ case LTE(LOG_LTE_NAS_EMM_OTA_IN_SEC_MSG_LOG_C):
+ is_ul = true;
+ break;
+ }
+
+ arfcn = is_ul ? di->lte_arfcn_ul : di->lte_arfcn_dl;
+ if (di->gsmtap && di->flags & DIAG_INST_F_GSMTAP_DECODED) {
+ gsmtap_send_ex(di->gsmtap, GSMTAP_TYPE_LTE_NAS, is_ul ? arfcn | GSMTAP_ARFCN_F_UPLINK : arfcn, 0, sec_hdr ? GSMTAP_LTE_NAS_SEC_HEADER : GSMTAP_LTE_NAS_PLAIN, 0, 0, 0, 0, data , len);
+ }
+}
+
+static const struct diag_log_dispatch_tbl log_tbl[] = {
+ { LTE(LOG_LTE_RRC_OTA_MSG_LOG_C), handle_lte_rrc_ota_msg },
+ { LTE(LOG_LTE_NAS_ESM_OTA_IN_MSG_LOG_C), handle_lte_nas_msg },
+ { LTE(LOG_LTE_NAS_ESM_OTA_OUT_MSG_LOG_C), handle_lte_nas_msg },
+ { LTE(LOG_LTE_NAS_EMM_OTA_IN_MSG_LOG_C), handle_lte_nas_msg },
+ { LTE(LOG_LTE_NAS_EMM_OTA_OUT_MSG_LOG_C), handle_lte_nas_msg },
+// { LTE(LOG_LTE_NAS_ESM_OTA_IN_SEC_MSG_LOG_C), handle_lte_nas_msg },
+// { LTE(LOG_LTE_NAS_ESM_OTA_OUT_SEC_MSG_LOG_C), handle_lte_nas_msg },
+// { LTE(LOG_LTE_NAS_EMM_OTA_IN_SEC_MSG_LOG_C), handle_lte_nas_msg },
+// { LTE(LOG_LTE_NAS_EMM_OTA_OUT_SEC_MSG_LOG_C), handle_lte_nas_msg },
+ { LTE(LOG_LTE_RRC_SERV_CELL_INFO_LOG_C), handle_lte_rrc_cell_info },
+};
+
+static __attribute__((constructor)) void on_dso_load_lte(void)
+{
+ diag_log_reg_dispatch(log_tbl, ARRAY_SIZE(log_tbl));
+}
diff --git a/src/diag_log_qmi.c b/src/diag_log_qmi.c
index bad63df..35047e1 100644
--- a/src/diag_log_qmi.c
+++ b/src/diag_log_qmi.c
@@ -26,7 +26,7 @@
/* A small wrapper around libqmi-glib to give us a human-readable string
* representation of QMI messages that we receive from DIAG */
-static int dump_qmi_msg(const uint8_t *data, unsigned int len)
+static int dump_qmi_msg(struct diag_instance *di, const uint8_t *data, unsigned int len)
{
GByteArray *buffer;
GError *error = NULL;
@@ -49,9 +49,9 @@ static int dump_qmi_msg(const uint8_t *data, unsigned int len)
return 0;
}
-static void handle_qmi_msg(struct log_hdr *lh, struct msgb *msg)
+static void handle_qmi_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
- dump_qmi_msg(lh->data, lh->len);
+ dump_qmi_msg(di, lh->data, lh->len);
}
#define CORE(x) (0x1000 + x)
@@ -97,7 +97,9 @@ static const struct diag_log_dispatch_tbl log_tbl[] = {
{ LOG_QMI_PORT_TX(15), handle_qmi_msg },
};
+#if 0
static __attribute__((constructor)) void on_dso_load_qmi(void)
{
diag_log_reg_dispatch(log_tbl, ARRAY_SIZE(log_tbl));
}
+#endif
diff --git a/src/diag_log_simcard.c b/src/diag_log_simcard.c
index 1365df1..7e16d13 100644
--- a/src/diag_log_simcard.c
+++ b/src/diag_log_simcard.c
@@ -27,13 +27,13 @@
#include "protocol/diagcmd.h"
#include "protocol/diag_log_1x.h"
-static void handle_uim_data(struct log_hdr *lh, struct msgb *msg)
+static void handle_uim_data(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
struct diag_log_uim_msg *uim = (struct diag_log_uim_msg *) msgb_data(msg);
printf("UIM_DATA { %s }\n", msgb_hexdump(msg));
}
-static void handle_uim_ds_data(struct log_hdr *lh, struct msgb *msg)
+static void handle_uim_ds_data(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
printf("UIM_DS_DATA {}\n");
}
@@ -43,8 +43,9 @@ static const struct diag_log_dispatch_tbl log_tbl[] = {
{ L1X(LOG_UIM_DATA_C), handle_uim_data },
{ L1X(LOG_UIM_DS_DATA_C), handle_uim_ds_data },
};
-
+#if 0
static __attribute__((constructor)) void on_dso_load_gsm(void)
{
diag_log_reg_dispatch(log_tbl, ARRAY_SIZE(log_tbl));
}
+#endif
diff --git a/src/diag_log_umts.c b/src/diag_log_umts.c
index 4826548..b07d1d6 100644
--- a/src/diag_log_umts.c
+++ b/src/diag_log_umts.c
@@ -1,14 +1,26 @@
#include <stdio.h>
+#include <osmocom/core/gsmtap.h>
+#include <osmocom/core/gsmtap_util.h>
+#include <osmocom/core/utils.h>
+
#include "diag_log.h"
#include "protocol/diag_log_umts.h"
-static void handle_nas_msg(struct log_hdr *lh, struct msgb *msg)
+static void handle_nas_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
+ uint16_t arfcn = 0;
struct diag_umts_nas_ota_msg *nas = (struct diag_umts_nas_ota_msg *) msgb_data(msg);
- printf("NAS: %cL %u: %s\n", nas->direction ? 'U':'D', nas->msg_length,
- osmo_hexdump(msgb_data(msg), nas->msg_length));
+// printf("NAS: %cL %u: %s\n", nas->direction ? 'U':'D', nas->msg_length,
+// osmo_hexdump(msgb_data(msg), nas->msg_length));
+
+ arfcn = nas->direction ? di->umts_arfcn_ul : di->umts_arfcn_dl;
+ arfcn = nas->direction ? arfcn | GSMTAP_ARFCN_F_UPLINK: arfcn;
+
+ if (di->gsmtap && di->flags & DIAG_INST_F_GSMTAP_DECODED) {
+ gsmtap_send_ex(di->gsmtap, GSMTAP_TYPE_ABIS, arfcn, 0, 0, 0, 0, 0, 0, nas->data, nas->msg_length);
+ }
}
static const struct diag_log_dispatch_tbl log_tbl[] = {
diff --git a/src/diag_log_wcdma.c b/src/diag_log_wcdma.c
index a1e330a..ff87c17 100644
--- a/src/diag_log_wcdma.c
+++ b/src/diag_log_wcdma.c
@@ -1,5 +1,7 @@
#include <stdio.h>
+#include <osmocom/core/gsmtap.h>
+#include <osmocom/core/gsmtap_util.h>
#include <osmocom/core/utils.h>
#include "diag_log.h"
@@ -81,21 +83,69 @@ const struct value_string rrc_chan_types[] = {
{ DIAG_UMTS_RRC_CHT_DL_BCCH_BCH,"BCCH/BCH" },
{ DIAG_UMTS_RRC_CHT_DL_BCCH_FACH, "BCCH/FACH" },
{ DIAG_UMTS_RRC_CHT_DL_PCCH, "PCCH" },
+ { DIAG_UMTS_RRC_CHT_EXTENSION_SIB, "unknown" },
+ { DIAG_UMTS_RRC_CHT_SIB_CONTAINER, "unknown" },
{ 0, NULL }
};
-static void handle_rrc_sig_msg(struct log_hdr *lh, struct msgb *msg)
+
+struct wcdma_cell_id {
+ uint32_t ul_arfcn;
+ uint32_t dl_arfcn;
+ uint32_t cell_id;
+};
+
+static void handle_rrc_sig_msg(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
{
+ uint32_t ctype = 0;
+ uint16_t arfcn = 0;
struct diag_umts_rrc_msg *rrm = (struct diag_umts_rrc_msg *) msgb_data(msg);
- printf("RRC: %s %u %u: %s\n",
- get_value_string(rrc_chan_types, rrm->chan_type),
- rrm->rb_id, rrm->length,
- osmo_hexdump(msgb_data(msg), rrm->length));
+// printf("RRC: %s %u %u: %s\n",
+// get_value_string(rrc_chan_types, rrm->chan_type),
+// rrm->rb_id, rrm->length,
+// osmo_hexdump(msgb_data(msg), rrm->length));
+
+ switch(rrm->chan_type){
+ case 254:
+ case 255:
+ case DIAG_UMTS_RRC_CHT_EXTENSION_SIB:
+ case DIAG_UMTS_RRC_CHT_SIB_CONTAINER:
+ return;
+ case DIAG_UMTS_RRC_CHT_UL_CCCH: ctype =GSMTAP_RRC_SUB_UL_CCCH_Message; break;
+ case DIAG_UMTS_RRC_CHT_UL_DCCH: ctype =GSMTAP_RRC_SUB_UL_DCCH_Message; break;
+ case DIAG_UMTS_RRC_CHT_DL_CCCH: ctype =GSMTAP_RRC_SUB_DL_CCCH_Message; break;
+ case DIAG_UMTS_RRC_CHT_DL_DCCH: ctype =GSMTAP_RRC_SUB_DL_DCCH_Message; break;
+ case DIAG_UMTS_RRC_CHT_DL_BCCH_BCH: ctype =GSMTAP_RRC_SUB_BCCH_BCH_Message; break;
+ case DIAG_UMTS_RRC_CHT_DL_BCCH_FACH: ctype =GSMTAP_RRC_SUB_BCCH_FACH_Message; break;
+ case DIAG_UMTS_RRC_CHT_DL_PCCH: ctype =GSMTAP_RRC_SUB_PCCH_Message; break;
+ default:
+ printf("Unhandled RRC: %s %u %u: %s\n",
+ get_value_string(rrc_chan_types, rrm->chan_type),
+ rrm->rb_id, rrm->length,
+ osmo_hexdump(msgb_data(msg), rrm->length));
+ return;
+ }
+
+ arfcn = rrm->chan_type < DIAG_UMTS_RRC_CHT_DL_CCCH ? di->umts_arfcn_ul | GSMTAP_ARFCN_F_UPLINK: di->umts_arfcn_dl;
+
+ if (di->gsmtap && di->flags & DIAG_INST_F_GSMTAP_DECODED) {
+ gsmtap_send_ex(di->gsmtap, GSMTAP_TYPE_UMTS_RRC, arfcn, 0, ctype, 0, 0, 0, 0, rrm->msg,rrm->length);
+ }
}
+static void handle_cell_id(struct diag_instance *di, struct log_hdr *lh, struct msgb *msg)
+{
+ struct wcdma_cell_id *rrm = (struct wcdma_cell_id *) msgb_data(msg);
+
+ di->umts_arfcn_dl =rrm->dl_arfcn;
+ di->umts_arfcn_ul =rrm->ul_arfcn;
+}
+
+
static const struct diag_log_dispatch_tbl log_tbl[] = {
{ WCDMA(LOG_WCDMA_SIGNALING_MSG_C), handle_rrc_sig_msg },
+ { WCDMA(LOG_WCDMA_CELL_ID_C), handle_cell_id },
};
static __attribute__((constructor)) void on_dso_load_umts(void)
diff --git a/src/diag_msg.c b/src/diag_msg.c
index 1067b03..afc4da2 100644
--- a/src/diag_msg.c
+++ b/src/diag_msg.c
@@ -38,7 +38,15 @@ struct diag_set_rt_mask_req {
uint32_t runtime_mask[1];
};
+struct diag_set_all_rt_mask_req {
+ uint8_t cmd_code;
+ uint8_t sub_cmd;
+ uint16_t _pad;
+ uint32_t runtime_mask;
+};
+
#define MSG_EXT_SUBCMD_SET_RT_MASK 4
+#define MSG_EXT_SUBCMD_SET_ALL_RT_MASK 5
struct msgb *gen_msg_config_set_rt_mask(uint16_t ssid, uint32_t runtime_mask)
{
@@ -56,6 +64,40 @@ struct msgb *gen_msg_config_set_rt_mask(uint16_t ssid, uint32_t runtime_mask)
return msg;
}
+struct msgb *gen_msg_config_set_all_rt_mask(uint32_t runtime_mask)
+{
+ struct msgb *msg = msgb_alloc(DIAG_MAX_REQ_SIZE, "Diag Msg Config");
+ struct diag_set_all_rt_mask_req *dsrmr;
+
+ msg->l2h = msgb_put(msg, sizeof(*dsrmr));
+ dsrmr = (struct diag_set_all_rt_mask_req *) msgb_l2(msg);
+ dsrmr->cmd_code = DIAG_EXT_MSG_CONFIG_F;
+ dsrmr->sub_cmd = MSG_EXT_SUBCMD_SET_ALL_RT_MASK;
+ osmo_store32le(runtime_mask, &dsrmr->runtime_mask);
+
+ return msg;
+}
+
+int diag_msg_config_set_all_rt_mask(struct diag_instance *di, uint32_t runtime_mask)
+{
+ struct msgb *msg = gen_msg_config_set_all_rt_mask(runtime_mask);
+ struct msgb *rx;
+ struct diag_set_all_rt_mask_req *res;
+ int rc = 0;
+
+ rx = diag_transceive_msg(di, msg);
+ res = (struct diag_set_all_rt_mask_req *) (msgb_l2(rx));
+ if ((rx->l2h[0] != DIAG_EXT_MSG_CONFIG_F) || res->cmd_code != DIAG_EXT_MSG_CONFIG_F ||
+ res->sub_cmd != MSG_EXT_SUBCMD_SET_ALL_RT_MASK ||
+ osmo_load32le(&res->runtime_mask) != runtime_mask) {
+ fprintf(stderr, "Error setting all RT mask\n");
+ rc = -1;
+ }
+ msgb_free(rx);
+
+ return rc;
+}
+
int diag_msg_config_set_rt_mask(struct diag_instance *di, uint16_t ssid, uint32_t runtime_mask)
{
struct msgb *msg = gen_msg_config_set_rt_mask(ssid, runtime_mask);
@@ -64,8 +106,8 @@ int diag_msg_config_set_rt_mask(struct diag_instance *di, uint16_t ssid, uint32_
int rc = 0;
rx = diag_transceive_msg(di, msg);
- res = (struct diag_set_rt_mask_req *) (msgb_l2(msg)+1);
- if ((rx->l2h[0] != DIAG_EXT_MSG_CONFIG_F) || res->cmd_code != MSG_EXT_SUBCMD_SET_RT_MASK ||
+ res = (struct diag_set_rt_mask_req *) (msgb_l2(rx));
+ if ((rx->l2h[0] != DIAG_EXT_MSG_CONFIG_F) || res->cmd_code != DIAG_EXT_MSG_CONFIG_F ||
res->sub_cmd != MSG_EXT_SUBCMD_SET_RT_MASK ||
osmo_load16le(&res->ssid_start) != ssid ||
osmo_load16le(&res->ssid_end) != ssid ||
@@ -183,7 +225,9 @@ static const struct diag_cmd_dispatch_tbl cmd_tbl[] = {
{ DIAG_QSR_EXT_MSG_TERSE_F, diag_rx_ext_msg_terse_f },
};
+#if 0
static __attribute__((constructor)) void on_dso_load_msg(void)
{
diag_cmd_reg_dispatch(cmd_tbl, ARRAY_SIZE(cmd_tbl));
}
+#endif
diff --git a/src/diag_msg.h b/src/diag_msg.h
index 88a505d..ed8aeec 100644
--- a/src/diag_msg.h
+++ b/src/diag_msg.h
@@ -6,3 +6,5 @@
struct msgb *gen_msg_config_set_rt_mask(uint16_t ssid, uint32_t runtime_mask);
int diag_msg_config_set_rt_mask(struct diag_instance *di, uint16_t ssid, uint32_t runtime_mask);
+int diag_msg_config_set_all_rt_mask(struct diag_instance *di, uint32_t runtime_mask);
+
diff --git a/src/osmo-qcdiag-log.c b/src/osmo-qcdiag-log.c
index 0f9e0a4..407845b 100644
--- a/src/osmo-qcdiag-log.c
+++ b/src/osmo-qcdiag-log.c
@@ -31,6 +31,8 @@
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+#include <signal.h>
+#include <getopt.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/serial.h>
@@ -46,6 +48,10 @@
#include "protocol/diagcmd.h"
#include "protocol/diag_log_gsm.h"
+struct diag_instance di;
+static char *serial_path = 0;
+static uint32_t cfg_flags = 0;
+
static void do_configure(struct diag_instance *di)
{
static uint8_t timestamp[] = { DIAG_TS_F };
@@ -55,33 +61,48 @@ static void do_configure(struct diag_instance *di)
static const uint8_t disable_evt_report[] = {
DIAG_EVENT_REPORT_F, 0x00
};
+ static const uint8_t disable_log[] = {
+ DIAG_LOG_CONFIG_F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ };
- diag_transceive_buf_ign(di, timestamp, sizeof(timestamp));
+// diag_transceive_buf_ign(di, timestamp, sizeof(timestamp));
/* response: 3d 67 a8 81 d4 46 6d d9 00 */
/* enable|disable the event report */
-#if 1
+#if 0
diag_transceive_buf_ign(di, enable_evt_report, sizeof(enable_evt_report));
#else
- diag_transceive_buf_ign(di, disable_evt_report, sizeof(disable_evt_report));
+ diag_transceive_buf_ign(di, disable_log, sizeof(disable_log));
+ diag_msg_config_set_all_rt_mask(di, 0);
+// diag_transceive_buf_ign(di, disable_evt_report, sizeof(disable_evt_report));
/* response: 40 00 00 */
#endif
- diag_msg_config_set_rt_mask(di, MSG_SSID_LINUX_DATA, 0xffffffff);
- /* response: 5d 5d 04 41 00 41 00 01 00 ff ff ff ff */
- diag_msg_config_set_rt_mask(di, MSG_SSID_DS_ATCOP, 0xffffffff);
- /* response: 5d 5d 04 94 13 94 13 01 00 ff ff ff ff */
- diag_msg_config_set_rt_mask(di, MSG_SSID_DS, 0xffffffff);
- /* response: 5d 5d 04 88 13 88 13 01 00 ff ff ff ff */
- //diag_msg_config_set_rt_mask(di, MSG_SSID_DS_IPA, 0xffffffff);
- /* response: 5d 5d 04 a6 13 a6 13 01 00 ff ff ff ff */
- diag_msg_config_set_rt_mask(di, MSG_SSID_DS_GPRS, 0xffffffff);
- /* response: 5d 5d 04 91 13 91 13 01 00 ff ff ff ff */
- diag_msg_config_set_rt_mask(di, MSG_SSID_DS_GSM, 0xffffffff);
- diag_msg_config_set_rt_mask(di, MSG_SSID_DS_UMTS, 0xffffffff);
- diag_msg_config_set_rt_mask(di, MSG_SSID_DS_SOCKETS, 0xffffffff);
- diag_msg_config_set_rt_mask(di, MSG_SSID_DS_SIO, 0xffffffff);
- diag_msg_config_set_rt_mask(di, MSG_SSID_DS_APPS, 0xffffffff);
- diag_msg_config_set_rt_mask(di, MSG_SSID_DIAG, 0xffffffff);
+
+// uint32_t en[] = {
+// 0x5226, 0x512f, 0x412f, 0xb0c0, 0x713a, 0xb0e2, 0xb0e3, 0xb0ec, 0xb0ed, 0x11eb,
+// };
+
+// for (unsigned int k = 0; k < ARRAY_SIZE(en); k++) {
+// fprintf(stderr, "enabling %.8x\n", en[k]);
+// diag_msg_config_set_rt_mask(di, en[k], 0xffffffff);
+// }
+
+// diag_msg_config_set_rt_mask(di, MSG_SSID_LINUX_DATA, 0xffffffff);
+// /* response: 5d 5d 04 41 00 41 00 01 00 ff ff ff ff */
+// diag_msg_config_set_rt_mask(di, MSG_SSID_DS_ATCOP, 0xffffffff);
+// /* response: 5d 5d 04 94 13 94 13 01 00 ff ff ff ff */
+// diag_msg_config_set_rt_mask(di, MSG_SSID_DS, 0xffffffff);
+// /* response: 5d 5d 04 88 13 88 13 01 00 ff ff ff ff */
+// //diag_msg_config_set_rt_mask(di, MSG_SSID_DS_IPA, 0xffffffff);
+// /* response: 5d 5d 04 a6 13 a6 13 01 00 ff ff ff ff */
+// diag_msg_config_set_rt_mask(di, MSG_SSID_DS_GPRS, 0xffffffff);
+// /* response: 5d 5d 04 91 13 91 13 01 00 ff ff ff ff */
+// diag_msg_config_set_rt_mask(di, MSG_SSID_DS_GSM, 0xffffffff);
+// diag_msg_config_set_rt_mask(di, MSG_SSID_DS_UMTS, 0xffffffff);
+// diag_msg_config_set_rt_mask(di, MSG_SSID_DS_SOCKETS, 0xffffffff);
+// diag_msg_config_set_rt_mask(di, MSG_SSID_DS_SIO, 0xffffffff);
+// diag_msg_config_set_rt_mask(di, MSG_SSID_DS_APPS, 0xffffffff);
+// diag_msg_config_set_rt_mask(di, MSG_SSID_DIAG, 0xffffffff);
#if 0
printf("GSM\n");
@@ -123,6 +144,55 @@ static void do_configure(struct diag_instance *di)
diag_tranceive_msgb(di, msg);
#else
+
+#if 0
+
+ uint8_t aa[] = { 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t aaa[] = { 0x7d, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t aaaa[] = { 0x73, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
+
+
+
+ uint8_t a[] = { 0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x86, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
+ uint8_t b[] = { 0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x2f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
+ uint8_t c[] = { 0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x26, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
+ uint8_t d[] = { 0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
+ uint8_t e[] = { 0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x8a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
+ uint8_t f[] = { 0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x10, };
+ uint8_t g[] = { 0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };
+#else
+ uint8_t disable[] = {0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t setallrtmask[] = {0x7d, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t idranges[] = {0x73, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00};
+ uint8_t a[] = {0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xde, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t b[] = {0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t c[] = {0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t d[] = {0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t e[] = {0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x8a, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t f[] = {0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ uint8_t g[] = {0x73, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+#endif
+#define SMK(x) { \
+ struct msgb *msg = msgb_alloc(DIAG_MAX_REQ_SIZE, "Diag Tx"); \
+ msg->l2h = msgb_put(msg, ARRAY_SIZE(x)); \
+ memcpy(msgb_data(msg), x, ARRAY_SIZE(x)); \
+ struct msgb *msg2 = diag_transceive_msg(di, msg); \
+ msgb_free(msg2); } \
+
+// SMK(disable)
+// SMK(setallrtmask)
+// SMK(idranges)
+
+// SMK(a)
+// SMK(b)
+// SMK(c)
+// SMK(d)
+// SMK(e)
+// SMK(f)
+// SMK(g)
+
+
diag_log_enable_all_supported(di);
#endif
}
@@ -141,35 +211,138 @@ static void enable_pcap(struct diag_instance *di, uint8_t if_num)
#endif
}
+
+static void signal_handler(int s)
+{
+ struct termios tio;
+ switch (s) {
+ case SIGINT:
+ case SIGTERM:
+ diag_log_disable_all_supported(&di);
+ /* graceful exit by immediate read timeout */
+ tcgetattr(di.fd, &tio);
+ tio.c_cflag &= CRTSCTS;
+ tio.c_cc[VMIN] = 0;
+ tio.c_cc[VTIME] = 1;
+ tcsetattr(di.fd, TCSANOW, &tio);
+// exit(0);
+ break;
+ default:
+ break;
+ }
+}
+
+static void print_help()
+{
+ printf( " Some useful help...\n"
+ " -h --help This help text\n"
+ " -s --serial-path path to modem serial port, i.e /dev/ttyUSB0\n"
+ " Any combination of the following output flags:\n"
+ " -G --gsmtap GSMTAP messages sent to localhost\n"
+ " -Q --qcomdbg plain QC DIAG GSMTAP messages\n"
+ " -H --hexdump console output of rx/tx messages\n"
+ );
+}
+
+static void handle_options(int argc, char **argv)
+{
+ while (1) {
+ int option_index = 0, c;
+ static struct option long_options[] = {
+ { "help", 0, 0, 'h' },
+ { "gsmtap", 0, 0, 'G' },
+ { "qcomdbg", 0, 0, 'Q' },
+ { "hexdump", 0, 0, 'H' },
+ { "serial-path", 1, 0, 's' },
+ { 0, 0, 0, 0 }
+ };
+
+ c = getopt_long(argc, argv, "hGQHs:", long_options, &option_index);
+ if (c == -1)
+ break;
+
+ switch (c) {
+ case 'h':
+ print_help();
+ exit(0);
+ case 'G':
+ cfg_flags |= DIAG_INST_F_GSMTAP_DECODED;
+ break;
+ case 'Q':
+ cfg_flags |= DIAG_INST_F_GSMTAP_DIAG;
+ break;
+ case 'H':
+ cfg_flags |= DIAG_INST_F_HEXDUMP;
+ break;
+ case 's':
+ serial_path = optarg;
+ break;
+ }
+ }
+}
+
+
int main(int argc, char **argv)
{
- struct diag_instance di;
+ struct termios tio;
int i;
+ int rc;
+
+ handle_options(argc, argv);
- if (argc < 2) {
- printf("Invoke with %s PATH_TO_SERIAL\n",
- argv[0]);
+ if (!serial_path) {
+ printf("Invoke with %s -s PATH_TO_SERIAL\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+ if (!cfg_flags) {
+ printf("no output options (-G/-Q/-H) specified?! exiting...\n");
return EXIT_FAILURE;
}
memset(&di, 0, sizeof(di));
- di.fd = osmo_serial_init(argv[1], 921600);
- //di.flags = 1;
- if (di.fd < 0)
+ di.fd = osmo_serial_init(serial_path, 921600);
+ if (di.fd < 0) {
+ printf("can't open serial port: errno %d\n", di.fd);
return EXIT_FAILURE;
+ }
+
+ /* blocking reads */
+ rc = tcgetattr(di.fd, &tio);
+ tio.c_cflag &= CRTSCTS;
+ tio.c_cc[VMIN] = 1;
+ tio.c_cc[VTIME] = 0;
+ rc = tcsetattr(di.fd, TCSANOW, &tio);
+
di.gsmtap = gsmtap_source_init("localhost", GSMTAP_UDP_PORT, 0);
- di.flags = DIAG_INST_F_GSMTAP_DIAG;
- gsmtap_source_add_sink(di.gsmtap);
+ if (di.gsmtap == 0) {
+ printf("error initializing gsmtap source!\n");
+ return EXIT_FAILURE;
+ }
+
+ di.flags = cfg_flags;
+ rc = gsmtap_source_add_sink(di.gsmtap);
+ if (rc < 0) {
+ printf("error initializing gsmtap sink!\n");
+ return EXIT_FAILURE;
+ }
printf("\n===> CONFIGURING\n");
do_configure(&di);
- diag_dpl_get_sup_if(&di);
- for (i = 1; i < 0x56; i++) {
- diag_dpl_get_if_desc(&di, i);
- enable_pcap(&di, i);
- }
+// diag_dpl_get_sup_if(&di);
+// for (i = 1; i < 0x56; i++) {
+// diag_dpl_get_if_desc(&di, i);
+// enable_pcap(&di, i);
+// }
+
+ /* Handle keyboard interrupts */
+ signal(SIGINT, &signal_handler);
+ signal(SIGTERM, &signal_handler);
+ signal(SIGABRT, &signal_handler);
+ signal(SIGUSR1, &signal_handler);
+ signal(SIGUSR2, &signal_handler);
+
printf("\n===> ENTERING MAIN\n");
diff --git a/src/protocol/diag_log_gprs_mac.h b/src/protocol/diag_log_gprs_mac.h
index 536128d..943cf33 100644
--- a/src/protocol/diag_log_gprs_mac.h
+++ b/src/protocol/diag_log_gprs_mac.h
@@ -70,6 +70,14 @@ struct gprs_mac_signalling_msg {
uint8_t msg[0];
} __attribute__((packed));
+/* LOG_GPRS_SM_GMM_OTA_MESSAGE_C */
+struct gprs_sm_gmm_ota_msg {
+ uint8_t chan_type;
+ uint8_t msg_type;
+ uint16_t msg_len;
+ uint8_t msg[0];
+} __attribute__((packed));
+
/* LOG_GPRS_MAC_DL_TBF_ESTABLISH_C */
struct gprs_mac_dl_tbf_est {
uint8_t dl_tfi;
diff --git a/src/protocol/diag_log_gsm.h b/src/protocol/diag_log_gsm.h
index 378472f..737ec03 100644
--- a/src/protocol/diag_log_gsm.h
+++ b/src/protocol/diag_log_gsm.h
@@ -7,6 +7,7 @@
enum diag_log_code_gsm {
LOG_GSM_POWER_SCAN_C = 0x64,
LOG_GSM_FCCH_DECODE_C = 0x65,
+ LOG_GSM_SCH_DECODE_C = 0x66,
LOG_GSM_NCELL_ACQ_C = 0x75,
LOG_GSM_AFC_ADJUST_C = 0x7c,
LOG_GSM_MON_BURST_C = 0x82,
@@ -24,6 +25,7 @@ enum diag_log_code_gsm {
LOG_GSM_RR_STATE_C = 300,
//= 303,
LOG_GSM_RR_CONTROL_CHANNEL_PARAMS_C = 306,
+ LOG_GSM_RR_CELL_INFO_C = 308,
LOG_GPRS_INDICATORS_C = 500,
LOG_GPRS_GENERAL_PARAMS_C = 501,
diff --git a/src/protocol/diag_log_lte.h b/src/protocol/diag_log_lte.h
new file mode 100644
index 0000000..899dc2a
--- /dev/null
+++ b/src/protocol/diag_log_lte.h
@@ -0,0 +1,71 @@
+#pragma once
+
+#include <stdint.h>
+
+#define LTE(x) (0xb000 + x)
+
+enum diag_log_code_lte {
+ LOG_LTE_RRC_OTA_MSG_LOG_C = 0xc0,
+ LOG_LTE_RRC_SERV_CELL_INFO_LOG_C = 0xc2,
+
+ LOG_LTE_NAS_ESM_OTA_IN_SEC_MSG_LOG_C = 0xE0,
+ LOG_LTE_NAS_ESM_OTA_OUT_SEC_MSG_LOG_C = 0xE1,
+
+ LOG_LTE_NAS_ESM_OTA_IN_MSG_LOG_C = 0xe2,
+ LOG_LTE_NAS_ESM_OTA_OUT_MSG_LOG_C = 0xe3,
+
+ LOG_LTE_NAS_EMM_OTA_IN_SEC_MSG_LOG_C = 0xEA,
+ LOG_LTE_NAS_EMM_OTA_OUT_SEC_MSG_LOG_C = 0xEB,
+
+ LOG_LTE_NAS_EMM_OTA_IN_MSG_LOG_C = 0xec,
+ LOG_LTE_NAS_EMM_OTA_OUT_MSG_LOG_C = 0xed,
+
+};
+
+enum diag_lte_rrc_chtype {
+ DIAG_UMTS_RRC_CHT_UL_CCCH = 0,
+ DIAG_UMTS_RRC_CHT_UL_DCCH = 1,
+ DIAG_UMTS_RRC_CHT_DL_CCCH = 2,
+ DIAG_UMTS_RRC_CHT_DL_DCCH = 3,
+ DIAG_UMTS_RRC_CHT_DL_BCCH_BCH = 4,
+ DIAG_UMTS_RRC_CHT_DL_BCCH_FACH = 5,
+ DIAG_UMTS_RRC_CHT_DL_PCCH = 6,
+ DIAG_UMTS_RRC_CHT_EXTENSION_SIB = 9,
+ DIAG_UMTS_RRC_CHT_SIB_CONTAINER = 10,
+};
+
+struct diag_lte_rrc_ota_base_msg {
+ uint8_t ext_ver;
+ uint8_t rrc_release;
+ uint8_t rrc_version;
+ uint8_t bearer;
+ uint16_t cellid;
+} __attribute__((packed));
+
+struct diag_lte_rrc_ota_base_pre8_msg {
+ struct diag_lte_rrc_ota_base_msg hdr;
+ uint16_t freq;
+ uint16_t sfn;
+ uint8_t channel_type;
+ uint16_t len;
+
+} __attribute__((packed));
+
+struct diag_lte_rrc_ota_base_8plus_msg {
+ struct diag_lte_rrc_ota_base_msg hdr;
+ uint32_t freq;
+ uint16_t sfn;
+ uint8_t channel_type;
+ uint8_t sib_mask_pad[4];
+ uint16_t len;
+} __attribute__((packed));
+
+
+struct diag_lte_rrc_nas_msg {
+ uint8_t ext_ver;
+ uint8_t rrc_release;
+ uint8_t rrc_version_minor;
+ uint8_t rrc_version_major;
+} __attribute__((packed));
+
+
diff --git a/src/protocol/diag_log_wcdma.h b/src/protocol/diag_log_wcdma.h
index f728f64..8e14a2d 100644
--- a/src/protocol/diag_log_wcdma.h
+++ b/src/protocol/diag_log_wcdma.h
@@ -23,6 +23,8 @@ enum diag_umts_rrc_chtype {
DIAG_UMTS_RRC_CHT_DL_BCCH_BCH = 4,
DIAG_UMTS_RRC_CHT_DL_BCCH_FACH = 5,
DIAG_UMTS_RRC_CHT_DL_PCCH = 6,
+ DIAG_UMTS_RRC_CHT_EXTENSION_SIB = 9,
+ DIAG_UMTS_RRC_CHT_SIB_CONTAINER = 10,
};
enum diag_umts_rrc_state {