diff options
author | Data Path <data2path@gmail.com> | 2015-08-03 19:24:28 +0200 |
---|---|---|
committer | Data Path <data2path@gmail.com> | 2015-08-03 19:24:28 +0200 |
commit | 658f99e5ef7f1d30b3a92b9c44da9e18e58fff82 (patch) | |
tree | e3252a24a48c8bcd6fc62c2d8845a21094bd21bb /etisnoop.cpp | |
parent | 7040531ab5484be1041e3b143398b2bd168a7086 (diff) | |
download | etisnoop-658f99e5ef7f1d30b3a92b9c44da9e18e58fff82.tar.gz etisnoop-658f99e5ef7f1d30b3a92b9c44da9e18e58fff82.tar.bz2 etisnoop-658f99e5ef7f1d30b3a92b9c44da9e18e58fff82.zip |
Add FIG 0/31 decoding
Diffstat (limited to 'etisnoop.cpp')
-rw-r--r-- | etisnoop.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
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; |