jolly has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmocom-bb/+/41357?usp=email )
Change subject: Omit all-zero octets in MS Classmark 3 ......................................................................
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; }