diff options
author | Eric Wild <ewild@sysmocom.de> | 2020-05-04 16:27:00 +0200 |
---|---|---|
committer | Eric Wild <ewild@sysmocom.de> | 2020-05-11 19:15:00 +0200 |
commit | a8ea2dc983e9b3c3cf6d956bf6dc330c0a46f046 (patch) | |
tree | 74eeee749b47166a5096e8b64e0d75fc0253ff45 | |
parent | cb5d8473d73ae42168f39383acd62c7ca42de04a (diff) |
v#1
-rw-r--r-- | src/Makefile | 2 | ||||
-rw-r--r-- | src/diag_cmd.c | 5 | ||||
-rw-r--r-- | src/diag_dpl.c | 4 | ||||
-rw-r--r-- | src/diag_event.c | 3 | ||||
-rw-r--r-- | src/diag_io.c | 45 | ||||
-rw-r--r-- | src/diag_io.h | 6 | ||||
-rw-r--r-- | src/diag_log.c | 135 | ||||
-rw-r--r-- | src/diag_log.h | 9 | ||||
-rw-r--r-- | src/diag_log_gprs.c | 130 | ||||
-rw-r--r-- | src/diag_log_gsm.c | 72 | ||||
-rw-r--r-- | src/diag_log_lte.c | 250 | ||||
-rw-r--r-- | src/diag_log_qmi.c | 8 | ||||
-rw-r--r-- | src/diag_log_simcard.c | 7 | ||||
-rw-r--r-- | src/diag_log_umts.c | 18 | ||||
-rw-r--r-- | src/diag_log_wcdma.c | 60 | ||||
-rw-r--r-- | src/diag_msg.c | 48 | ||||
-rw-r--r-- | src/diag_msg.h | 2 | ||||
-rw-r--r-- | src/osmo-qcdiag-log.c | 239 | ||||
-rw-r--r-- | src/protocol/diag_log_gprs_mac.h | 8 | ||||
-rw-r--r-- | src/protocol/diag_log_gsm.h | 2 | ||||
-rw-r--r-- | src/protocol/diag_log_lte.h | 71 | ||||
-rw-r--r-- | src/protocol/diag_log_wcdma.h | 2 |
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 { |