jolly has uploaded this change for review.
Omit all-zero octets in MS Classmark 3
TS 24.008 Clause 10.5.7.1 allows us to omit all-zero octets at the end
of the information element. The decoder will add them if needed.
Older specs tell us to include the supported bands, a5 bits and radio
capability. Therefore we don't omit them, even if their encoded octets
are all-zero.
Change-Id: I3f05893e60f37f349b77fbd15a20b7708c4c3481
---
M src/host/layer23/src/mobile/gsm48_rr.c
1 file changed, 13 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/57/41357/1
diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c
index 1750c57..c04193c 100644
--- a/src/host/layer23/src/mobile/gsm48_rr.c
+++ b/src/host/layer23/src/mobile/gsm48_rr.c
@@ -1270,6 +1270,7 @@
struct gsm_support *sup = &ms->support;
struct gsm_settings *set = &ms->settings;
struct bitvec bv;
+ int minimum_len;
memset(&bv, 0, sizeof(bv));
bv.data = buf;
@@ -1328,6 +1329,8 @@
bitvec_set_uint(&bv, 0, 4);
bitvec_set_uint(&bv, set->class_900, 4);
}
+ /* These octets above shall be included according to GSM 04.08 Version 5.3.0. */
+ minimum_len = (bv.cur_bit + 7) >> 3;
/* r support */
if (set->r_gsm) {
bitvec_set_bit(&bv, ONE);
@@ -1442,6 +1445,16 @@
*len = (bv.cur_bit + 7) >> 3;
bitvec_fill(&bv, (*len*8) - bv.cur_bit, ZERO);
+ /* Remove all all-zero octets at the end. See the rule in Clause 10.5.7.1:
+ "Typically, the number of spare bits at the end is the minimum to reach an octet boundary.
+ The receiver may add any number of bits set to "0" at the end of the received string
+ if needed for correct decoding."
+ GSM 04.08 Version 5.3.0 states that spare octets after "octet 3" and "octet 3bis" may be omitted.
+ Note that "octet 3" refers to the first value (buf[0]) in this TLV information element.
+ */
+ while (*len > minimum_len && buf[*len - 1] == 0x00)
+ (*len)--;
+
return 0;
}
To view, visit change 41357. To unsubscribe, or for help writing mail filters, visit settings.