From 658f99e5ef7f1d30b3a92b9c44da9e18e58fff82 Mon Sep 17 00:00:00 2001 From: Data Path Date: Mon, 3 Aug 2015 19:24:28 +0200 Subject: Add FIG 0/31 decoding --- etisnoop.cpp | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) (limited to 'etisnoop.cpp') diff --git a/etisnoop.cpp b/etisnoop.cpp index 841b69a..8e4fe85 100644 --- a/etisnoop.cpp +++ b/etisnoop.cpp @@ -2792,6 +2792,81 @@ void decodeFIG(FIGalyser &figs, } } break; + case 31: // FIG 0/31 FIC re-direction + { // ETSI EN 300 401 8.1.12 + unsigned int FIG_type0_flag_field = 0, flag_field; + unsigned char i = 1, j, FIG_type1_flag_field = 0, FIG_type2_flag_field = 0; + + if (i < (figlen - 5)) { + // Read FIC re-direction + FIG_type0_flag_field = ((unsigned int)f[i] << 24) | ((unsigned int)f[i+1] << 16) | + ((unsigned int)f[i+2] << 8) | (unsigned int)f[i+3]; + FIG_type1_flag_field = f[i+4]; + FIG_type2_flag_field = f[i+5]; + + sprintf(desc, "FIG type 0 flag field=0x%X, FIG type 1 flag field=0x%X, FIG type 2 flag field=0x%X", + FIG_type0_flag_field, FIG_type1_flag_field, FIG_type2_flag_field); + printbuf(desc, indent+1, NULL, 0); + + for(j = 0; j < 32; j++) { + // iterate over FIG type 0 re-direction + flag_field = FIG_type0_flag_field & ((unsigned int)1 << j); + if ((flag_field != 0) && (((j >= 0) && (j <= 5)) || (j == 8) || + (j == 10) || (j == 13) || (j == 14) || + (j == 19) || (j == 26) || (j == 28))) { + sprintf(desc, "oe=%d FIG 0/%d carried in AIC, invalid configuration, shall always be carried entirely in the FIC", + oe, j); + printbuf(desc, indent+2, NULL, 0); + fprintf(stderr, "WARNING: FIG %d/%d FIG re-direction of oe=%d FIG0/%d not allowed\n", figtype, ext, oe, j); + } + else if ((flag_field != 0) && ((j == 21) || (j == 24))) { + sprintf(desc, "oe=%d FIG 0/%d carried in AIC, same shall be carried in FIC", oe, j); + printbuf(desc, indent+2, NULL, 0); + } + else if (flag_field != 0) { + if (oe == 0) { + sprintf(desc, "oe=%d FIG 0/%d carried in AIC, same shall be carried in FIC", oe, j); + } + else { // oe == 1 + sprintf(desc, "oe=%d FIG 0/%d carried in AIC, may be carried entirely in AIC", oe, j); + } + printbuf(desc, indent+2, NULL, 0); + } + } + + for(j = 0; j < 8; j++) { + // iterate over FIG type 1 re-direction + flag_field = FIG_type1_flag_field & ((unsigned int)1 << j); + if (flag_field != 0) { + if (oe == 0) { + sprintf(desc, "oe=%d FIG 1/%d carried in AIC, same shall be carried in FIC", oe, j); + } + else { // oe == 1 + sprintf(desc, "oe=%d FIG 1/%d carried in AIC, may be carried entirely in AIC", oe, j); + } + printbuf(desc, indent+2, NULL, 0); + } + } + + for(j = 0; j < 8; j++) { + // iterate over FIG type 2 re-direction + flag_field = FIG_type2_flag_field & ((unsigned int)1 << j); + if (flag_field != 0) { + if (oe == 0) { + sprintf(desc, "oe=%d FIG 2/%d carried in AIC, same shall be carried in FIC", oe, j); + } + else { // oe == 1 + sprintf(desc, "oe=%d FIG 2/%d carried in AIC, may be carried entirely in AIC", oe, j); + } + printbuf(desc, indent+2, NULL, 0); + } + } + } + if (figlen != 7) { + fprintf(stderr, "WARNING: FIG %d/%d invalid length %d, expecting 7\n", figtype, ext, figlen); + } + } + break; } } break; -- cgit v1.2.3