summaryrefslogtreecommitdiffstats
path: root/etisnoop.cpp
diff options
context:
space:
mode:
authorData Path <data2path@gmail.com>2015-08-03 19:24:28 +0200
committerData Path <data2path@gmail.com>2015-08-03 19:24:28 +0200
commit658f99e5ef7f1d30b3a92b9c44da9e18e58fff82 (patch)
treee3252a24a48c8bcd6fc62c2d8845a21094bd21bb /etisnoop.cpp
parent7040531ab5484be1041e3b143398b2bd168a7086 (diff)
downloadetisnoop-658f99e5ef7f1d30b3a92b9c44da9e18e58fff82.tar.gz
etisnoop-658f99e5ef7f1d30b3a92b9c44da9e18e58fff82.tar.bz2
etisnoop-658f99e5ef7f1d30b3a92b9c44da9e18e58fff82.zip
Add FIG 0/31 decoding
Diffstat (limited to 'etisnoop.cpp')
-rw-r--r--etisnoop.cpp75
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;