FreeCalypso > hg > gsm-net-reveng
diff tfo/tfo-trace-msg.c @ 30:19039ffbe605
tfo-trace-msg: higher level of decoding for TFO_REQ
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 28 Aug 2024 03:03:46 +0000 |
parents | fec87477e60b |
children | f6bb790e186a |
line wrap: on
line diff
--- a/tfo/tfo-trace-msg.c Wed Aug 28 02:28:37 2024 +0000 +++ b/tfo/tfo-trace-msg.c Wed Aug 28 03:03:46 2024 +0000 @@ -10,13 +10,16 @@ #include <string.h> #include <strings.h> +#define MAX_EXT_WORDS 5 + static uint8_t is_hunt_buf[320]; static int is_state; static unsigned is_hunt_fill; static unsigned is_offset; static unsigned is_file_offset; static unsigned is_bit_count; -static unsigned is_rx_word; +static uint32_t is_rx_word, is_cmd, is_ext_words[MAX_EXT_WORDS]; +static unsigned is_ext_count; static const u_char hdr_pattern[20] = {0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1}; @@ -50,7 +53,8 @@ int cont; printf("0x%x: ", is_file_offset); - switch (is_rx_word) { + is_cmd = is_rx_word; + switch (is_cmd) { case 0x05D: printf("IS_REQ\n"); cont = 1; @@ -76,30 +80,60 @@ cont = 0; break; default: - printf("unknown IS_Command 0x%03X\n", is_rx_word); + printf("unknown IS_Command 0x%03X\n", (unsigned) is_cmd); cont = 0; } if (cont) { is_state = 2; is_bit_count = 0; is_rx_word = 0; + is_ext_count = 0; } else is_state = 0; } static void +process_tfo_req_ack(reqack) + char *reqack; +{ + if (is_ext_count != 2) + return; + if (is_ext_words[0] != 0x5394B) /* GSM System ID */ + return; + printf(" TFO_%s: List_Ind=%u Sig=0x%02X CoID=0x%X CRC=%u\n", reqack, + (is_ext_words[1] >> 18) & 1, (is_ext_words[1] >> 10) & 0xFF, + (is_ext_words[1] >> 5) & 0xF, (is_ext_words[1] >> 2) & 7); +} + +static void +is_process_high_level() +{ + switch (is_cmd) { + case 0x05D: + process_tfo_req_ack("REQ"); + break; + case 0x0BA: + process_tfo_req_ack("ACK"); + break; + } +} + +static void is_process_ext() { - printf(" IS_Extension: 0x%05X", is_rx_word); + printf(" IS_Extension: 0x%05X", (unsigned) is_rx_word); if (is_rx_word & 0x80200) { printf(" (bad sync)\n"); is_state = 0; return; } + if (is_ext_count < MAX_EXT_WORDS) + is_ext_words[is_ext_count++] = is_rx_word; switch (is_rx_word & 3) { case 0: printf(" (final)\n"); is_state = 0; + is_process_high_level(); return; case 3: printf(" (continue)\n");