FreeCalypso > hg > gsm-net-reveng
changeset 74:e78c6b1ecb91
trau-decode: refactor trau-hr-dump
The desire is to create a companion program that will read hex lines
representing TRAU-8k frames and then decode those frames in exactly
the same way how we currently decode frames read from binary capture
files. Hence the decoder portion of trau-hr-dump needs to be
factored out.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 08 Feb 2025 03:00:31 +0000 |
parents | 06f241846c67 |
children | b518ab15b518 |
files | trau-decode/Makefile trau-decode/hr-guts.c trau-decode/trau-hr-dump.c |
diffstat | 3 files changed, 114 insertions(+), 95 deletions(-) [+] |
line wrap: on
line diff
--- a/trau-decode/Makefile Sat Feb 08 01:13:54 2025 +0000 +++ b/trau-decode/Makefile Sat Feb 08 03:00:31 2025 +0000 @@ -13,7 +13,7 @@ trau-extr: extr-fr.o extr-efr.o extr-main.o ${CC} ${CFLAGS} -o $@ $^ -lgsmfr2 -trau-hr-dump: crc8gen.o gsmhr_unpack.o trau-hr-dump.o +trau-hr-dump: crc8gen.o gsmhr_unpack.o hr-guts.o trau-hr-dump.o ${CC} ${CFLAGS} -o $@ $^ trau-parse: crc8gen.o parse-fr.o parse-efr.o parse-main.o
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trau-decode/hr-guts.c Sat Feb 08 03:00:31 2025 +0000 @@ -0,0 +1,110 @@ +/* + * This module contains the guts of trau-hr-dump program in terms of + * HRv1 frame decoding. It has been factored out to facilitate creation + * of trau-hr-dump-hex version. + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "gsmhr_unpack.h" +#include "osmo_bits.h" + +/* + * EFR TRAU parity (also used for HR) + * + * g(x) = x^3 + x^1 + 1 + */ +static const struct osmo_crc8gen_code gsm0860_efr_crc3 = { + .bits = 3, + .poly = 0x3, + .init = 0x0, + .remainder = 0x7, +}; + +static int +bit_parity(bits, nbits) + ubit_t *bits; + unsigned nbits; +{ + unsigned n, sum; + + sum = 0; + for (n = 0; n < nbits; n++) + sum += bits[n]; + return sum & 1; +} + +static void +bits2bytes(bits, bytes, nbytes) + ubit_t *bits; + uint8_t *bytes; + unsigned nbytes; +{ + unsigned n, m, acc; + + for (n = 0; n < nbytes; n++) { + acc = 0; + for (m = 0; m < 8; m++) { + acc <<= 1; + acc |= *bits++; + } + *bytes++ = acc; + } +} + +void +print_gsmhr_frame(frame) + ubit_t *frame; +{ + ubit_t xc_bits[6], dbits[112]; + uint8_t hr_bytes[14]; + int16_t params[18]; + int crc_stat; + + printf(" C1-C4: %u%u%u%u OP %s\n", frame[9], frame[10], frame[11], + frame[12], bit_parity(frame + 9, 5) ? "good" : "bad"); + bcopy(frame + 14, xc_bits, 2); + bcopy(frame + 18, xc_bits + 2, 4); + printf(" XC1-XC5: %u%u%u%u%u OP %s\n", xc_bits[0], xc_bits[1], + xc_bits[2], xc_bits[3], xc_bits[4], + bit_parity(xc_bits, 6) ? "good" : "bad"); + bcopy(frame + 22, dbits, 2); + bcopy(frame + 25, dbits + 2, 7); + bcopy(frame + 33, dbits + 9, 7); + bcopy(frame + 41, dbits + 16, 7); + bcopy(frame + 49, dbits + 23, 7); + bcopy(frame + 57, dbits + 30, 7); + bcopy(frame + 65, dbits + 37, 7); + bcopy(frame + 76, dbits + 44, 4); + bcopy(frame + 81, dbits + 48, 7); + bcopy(frame + 89, dbits + 55, 7); + bcopy(frame + 97, dbits + 62, 7); + bcopy(frame + 105, dbits + 69, 7); + bcopy(frame + 113, dbits + 76, 7); + bcopy(frame + 121, dbits + 83, 7); + bcopy(frame + 129, dbits + 90, 7); + bcopy(frame + 137, dbits + 97, 7); + bcopy(frame + 145, dbits + 104, 7); + dbits[111] = frame[153]; + crc_stat = osmo_crc8gen_check_bits(&gsm0860_efr_crc3, dbits, 44, + frame + 73); + printf(" CRC %s\n", crc_stat ? "bad" : "good"); + bits2bytes(dbits, hr_bytes, 14); + gsmhr_unpack_ts101318(hr_bytes, params); + printf(" R0=%02x LPC=%03x,%03x,%02x Int=%x Mode=%x\n", params[0], + params[1], params[2], params[3], params[4], params[5]); + printf(params[5] ? " s1=%02x,%03x,%02x" : " s1=%02x,%02x,%02x", + params[6], params[7], params[8]); + printf(params[5] ? " s2=%x,%03x,%02x" : " s2=%02x,%02x,%02x", + params[9], params[10], params[11]); + printf(params[5] ? " s3=%x,%03x,%02x" : " s3=%02x,%02x,%02x", + params[12], params[13], params[14]); + printf(params[5] ? " s4=%x,%03x,%02x\n" : " s4=%02x,%02x,%02x\n", + params[15], params[16], params[17]); + printf(" C6-C9: %u%u%u%u\n", frame[154], frame[155], frame[156], + frame[157]); + printf(" T1=%u T2=%u\n", frame[158], frame[159]); +}
--- a/trau-decode/trau-hr-dump.c Sat Feb 08 01:13:54 2025 +0000 +++ b/trau-decode/trau-hr-dump.c Sat Feb 08 03:00:31 2025 +0000 @@ -14,20 +14,6 @@ #include <string.h> #include <strings.h> #include <unistd.h> -#include "gsmhr_unpack.h" -#include "osmo_bits.h" - -/* - * EFR TRAU parity (also used for HR) - * - * g(x) = x^3 + x^1 + 1 - */ -static const struct osmo_crc8gen_code gsm0860_efr_crc3 = { - .bits = 3, - .poly = 0x3, - .init = 0x0, - .remainder = 0x7, -}; static uint8_t *filebuf; static unsigned total_size; @@ -107,40 +93,9 @@ return 1; } -static int -bit_parity(bits, nbits) - ubit_t *bits; - unsigned nbits; -{ - unsigned n, sum; - - sum = 0; - for (n = 0; n < nbits; n++) - sum += bits[n]; - return sum & 1; -} - -static void -bits2bytes(bits, bytes, nbytes) - ubit_t *bits; - uint8_t *bytes; - unsigned nbytes; -{ - unsigned n, m, acc; - - for (n = 0; n < nbytes; n++) { - acc = 0; - for (m = 0; m < 8; m++) { - acc <<= 1; - acc |= *bits++; - } - *bytes++ = acc; - } -} - static void dump_raw_frame(frame_bits) - ubit_t *frame_bits; + uint8_t *frame_bits; { uint8_t *sp = frame_bits; unsigned n, m, d; @@ -160,58 +115,12 @@ process_frame(pos) unsigned pos; { - ubit_t *frame = filebuf + pos; - ubit_t xc_bits[6], dbits[112]; - uint8_t hr_bytes[14]; - int16_t params[18]; - int crc_stat; + uint8_t *frame = filebuf + pos; printf("Frame at 0x%x:\n", pos); if (include_raw) dump_raw_frame(frame); - printf(" C1-C4: %u%u%u%u OP %s\n", frame[9], frame[10], frame[11], - frame[12], bit_parity(frame + 9, 5) ? "good" : "bad"); - bcopy(frame + 14, xc_bits, 2); - bcopy(frame + 18, xc_bits + 2, 4); - printf(" XC1-XC5: %u%u%u%u%u OP %s\n", xc_bits[0], xc_bits[1], - xc_bits[2], xc_bits[3], xc_bits[4], - bit_parity(xc_bits, 6) ? "good" : "bad"); - bcopy(frame + 22, dbits, 2); - bcopy(frame + 25, dbits + 2, 7); - bcopy(frame + 33, dbits + 9, 7); - bcopy(frame + 41, dbits + 16, 7); - bcopy(frame + 49, dbits + 23, 7); - bcopy(frame + 57, dbits + 30, 7); - bcopy(frame + 65, dbits + 37, 7); - bcopy(frame + 76, dbits + 44, 4); - bcopy(frame + 81, dbits + 48, 7); - bcopy(frame + 89, dbits + 55, 7); - bcopy(frame + 97, dbits + 62, 7); - bcopy(frame + 105, dbits + 69, 7); - bcopy(frame + 113, dbits + 76, 7); - bcopy(frame + 121, dbits + 83, 7); - bcopy(frame + 129, dbits + 90, 7); - bcopy(frame + 137, dbits + 97, 7); - bcopy(frame + 145, dbits + 104, 7); - dbits[111] = frame[153]; - crc_stat = osmo_crc8gen_check_bits(&gsm0860_efr_crc3, dbits, 44, - frame + 73); - printf(" CRC %s\n", crc_stat ? "bad" : "good"); - bits2bytes(dbits, hr_bytes, 14); - gsmhr_unpack_ts101318(hr_bytes, params); - printf(" R0=%02x LPC=%03x,%03x,%02x Int=%x Mode=%x\n", params[0], - params[1], params[2], params[3], params[4], params[5]); - printf(params[5] ? " s1=%02x,%03x,%02x" : " s1=%02x,%02x,%02x", - params[6], params[7], params[8]); - printf(params[5] ? " s2=%x,%03x,%02x" : " s2=%02x,%02x,%02x", - params[9], params[10], params[11]); - printf(params[5] ? " s3=%x,%03x,%02x" : " s3=%02x,%02x,%02x", - params[12], params[13], params[14]); - printf(params[5] ? " s4=%x,%03x,%02x\n" : " s4=%02x,%02x,%02x\n", - params[15], params[16], params[17]); - printf(" C6-C9: %u%u%u%u\n", frame[154], frame[155], frame[156], - frame[157]); - printf(" T1=%u T2=%u\n", frame[158], frame[159]); + print_gsmhr_frame(frame); } static void