aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--etisnoop.cpp80
1 files changed, 72 insertions, 8 deletions
diff --git a/etisnoop.cpp b/etisnoop.cpp
index 87d3655..66f248c 100644
--- a/etisnoop.cpp
+++ b/etisnoop.cpp
@@ -1806,11 +1806,13 @@ void decodeFIG(FIGalyser &figs,
if (k < Length_SubId_list) {
sprintf(desc, "%d SubId missing, fig length too short !", (Length_SubId_list - k));
printbuf(desc, indent+3, NULL, 0);
+ fprintf(stderr, "WARNING: FIG %d/%d length %d too short !\n", figtype, ext, figlen);
}
}
if (j < Length_TII_list) {
sprintf(desc, "%d Transmitter group missing, fig length too short !", (Length_TII_list - j));
printbuf(desc, indent+2, NULL, 0);
+ fprintf(stderr, "WARNING: FIG %d/%d length %d too short !\n", figtype, ext, figlen);
}
}
}
@@ -1837,6 +1839,7 @@ void decodeFIG(FIGalyser &figs,
else {
sprintf(tmpbuf, ", Coordinates missing, fig length too short !");
strcat(desc, tmpbuf);
+ fprintf(stderr, "WARNING: FIG %d/%d length %d too short !\n", figtype, ext, figlen);
}
printbuf(desc, indent+1, NULL, 0);
i += 7;
@@ -2102,6 +2105,7 @@ void decodeFIG(FIGalyser &figs,
if (j < Number_clusters) {
sprintf(desc, "missing Cluster Id, fig length too short !");
printbuf(desc, indent+1, NULL, 0);
+ fprintf(stderr, "WARNING: FIG %d/%d length %d too short !\n", figtype, ext, figlen);
}
// decode announcement support types
@@ -2132,16 +2136,23 @@ void decodeFIG(FIGalyser &figs,
SubChId = (f[i+3] & 0x3F);
sprintf(desc, "Cluster Id=0x%02x, Asw flags=0x%04x, New flag=%d %s, Region flag=%d last byte %s, SubChId=%d",
Cluster_Id, Asw_flags, New_flag, (New_flag)?"new":"repeat", Region_flag, (Region_flag)?"present":"absent", SubChId);
- if ((Region_flag) && (i < (figlen - 4))) {
- // read region lower part
- Rfa = (f[i+4] >> 6);
- RegionId_LP = (f[i+4] & 0x3F);
- if (Rfa != 0) {
- sprintf(tmpbuf, ", Rfa=%d invalid value", Rfa);
+ if (Region_flag) {
+ if (i < (figlen - 4)) {
+ // read region lower part
+ Rfa = (f[i+4] >> 6);
+ RegionId_LP = (f[i+4] & 0x3F);
+ if (Rfa != 0) {
+ sprintf(tmpbuf, ", Rfa=%d invalid value", Rfa);
+ strcat(desc, tmpbuf);
+ }
+ sprintf(tmpbuf, ", Region Lower Part=0x%02x", RegionId_LP);
strcat(desc, tmpbuf);
}
- sprintf(tmpbuf, ", Region Lower Part=0x%02x", RegionId_LP);
- strcat(desc, tmpbuf);
+ else {
+ sprintf(tmpbuf, "missing Region Lower Part, fig length too short !");
+ strcat(desc, tmpbuf);
+ fprintf(stderr, "WARNING: FIG %d/%d length %d too short !\n", figtype, ext, figlen);
+ }
}
printbuf(desc, indent+1, NULL, 0);
// decode announcement switching types
@@ -2634,6 +2645,7 @@ void decodeFIG(FIGalyser &figs,
if (j < Number_EIds) {
sprintf(desc, "missing EId, fig length too short !");
printbuf(desc, indent+1, NULL, 0);
+ fprintf(stderr, "WARNING: FIG %d/%d length %d too short !\n", figtype, ext, figlen);
}
// decode OE announcement support types
@@ -2646,6 +2658,58 @@ void decodeFIG(FIGalyser &figs,
}
}
break;
+ case 26: // FIG 0/26 OE Announcement switching
+ { // ETSI EN 300 401 8.1.10.5.2
+ unsigned short Asw_flags, EId_Other_Ensemble;
+ unsigned char i = 1, j, Rfa, Cluster_Id_Current_Ensemble, Region_Id_Current_Ensemble;
+ unsigned char Cluster_Id_Other_Ensemble, Region_Id_Other_Ensemble;
+ bool New_flag, Region_flag;
+ char tmpbuf[256];
+
+ while (i < (figlen - 6)) {
+ // iterate over other ensembles announcement switching
+ Cluster_Id_Current_Ensemble = f[i];
+ Asw_flags = ((unsigned short)f[i+1] << 8) | (unsigned short)f[i+2];
+ New_flag = f[i+3] >> 7;
+ Region_flag = (f[i+3] >> 6) & 0x01;
+ Region_Id_Current_Ensemble = f[i+3] & 0x3F;
+ EId_Other_Ensemble = ((unsigned short)f[i+4] << 8) | (unsigned short)f[i+5];
+ Cluster_Id_Other_Ensemble = f[i+6];
+ sprintf(desc, "Cluster Id Current Ensemble=0x%X, Asw flags=0x%X, New flag=%d %s announcement, Region flag=%d last byte %s, Region Id Current Ensemble=0x%X, EId Other Ensemble=0x%X, Cluster Id Other Ensemble=0x%X",
+ Cluster_Id_Current_Ensemble, Asw_flags, New_flag, New_flag?"newly introduced":"repeated",
+ Region_flag, Region_flag?"present":"absent. The announcement concerns the whole service area",
+ Region_Id_Current_Ensemble, EId_Other_Ensemble, Cluster_Id_Other_Ensemble);
+ i += 7;
+ if (Region_flag != 0) {
+ if (i < figlen) {
+ // get Region Id Other Ensemble
+ Rfa = (f[i] >> 6);
+ Region_Id_Other_Ensemble = f[i] & 0x3F;
+ if (Rfa != 0) {
+ sprintf(tmpbuf, ", Rfa=%d invalid value", Rfa);
+ strcat(desc, tmpbuf);
+ }
+ sprintf(tmpbuf, ", Region Id Other Ensemble=0x%X", Region_Id_Other_Ensemble);
+ strcat(desc, tmpbuf);
+ }
+ else {
+ sprintf(tmpbuf, "missing Region Id Other Ensemble, fig length too short !");
+ strcat(desc, tmpbuf);
+ fprintf(stderr, "WARNING: FIG %d/%d length %d too short !\n", figtype, ext, figlen);
+ }
+ i++;
+ }
+ printbuf(desc, indent+1, NULL, 0);
+ // decode announcement switching types
+ for(j = 0; j < 16; j++) {
+ if (Asw_flags & (1 << j)) {
+ sprintf(desc, "Announcement switching=%s", announcement_types_str[j]);
+ printbuf(desc, indent+2, NULL, 0);
+ }
+ }
+ }
+ }
+ break;
}
}
break;