diff options
author | Harald Welte <laforge@gnumonks.org> | 2018-03-12 00:24:22 +0100 |
---|---|---|
committer | Vadim Yanitskiy <axilirator@gmail.com> | 2018-03-12 10:52:35 +0000 |
commit | 55d172617c2b6df3abdd430bf5751ddbd4420551 (patch) | |
tree | 5db6635c6f70bfe1aee30575e3c37e7e21c67007 /openbsc/src | |
parent | 14cd21417f8774a92900cb707064d650ea769615 (diff) |
sysinfo: Fix regression causing missing L2 Pseudo-Length in SI5/SI6
Fixes a regression in the code generating SI5* and SI6 on SACCH,
where the L2 pseudo-length is not part of the 'struct' definition
we have in gsm_04_08.h and hence has to be encoded manually into
the first byte of the SI buffer.
We were doing this correctly until April 2017, when the following
patch was merged:
> commit 6f0e50c8337355eb59033903ede9ab6528890835
> Author: Max <msuraev@sysmocom.de>
> Date: Wed Apr 12 15:30:54 2017 +0200
>
> Prepare for extended SI2quater support
This patch cacidentially overwrote the l2_plen that was just enoded,
as the 'struct' was no longer pointing to 'output' (si_buf+1), but
now directly to the start of the si_buf.
NOTE: The Wireshark RSL dissector (and more recently also LAPDm)
contain a similar bug, so the SACCH will not be decoded correctly
after applying this patch. Nevertheless, it's correct.
back-port of OsmoBSC Change-Id: Ie8c907b1317566670aeb68f933ceefd552c17565
Closes: #3059
Related: #2963
Change-Id: Iaf5feefc1bb3194dd491955fee418795c61787f7
Diffstat (limited to 'openbsc/src')
-rw-r--r-- | openbsc/src/libbsc/system_information.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/openbsc/src/libbsc/system_information.c b/openbsc/src/libbsc/system_information.c index a878b52ef..9d40a2454 100644 --- a/openbsc/src/libbsc/system_information.c +++ b/openbsc/src/libbsc/system_information.c @@ -933,7 +933,7 @@ static int generate_si5(enum osmo_sysinfo_type t, struct gsm_bts *bts) break; } - si5 = (struct gsm48_system_information_type_5 *) GSM_BTS_SI(bts, t); + si5 = (struct gsm48_system_information_type_5 *) output; /* l2 pseudo length, not part of msg: 18 */ si5->rr_protocol_discriminator = GSM48_PDISC_RR; @@ -969,7 +969,7 @@ static int generate_si5bis(enum osmo_sysinfo_type t, struct gsm_bts *bts) break; } - si5b = (struct gsm48_system_information_type_5bis *) GSM_BTS_SI(bts, t); + si5b = (struct gsm48_system_information_type_5bis *) output; /* l2 pseudo length, not part of msg: 18 */ si5b->rr_protocol_discriminator = GSM48_PDISC_RR; @@ -983,7 +983,7 @@ static int generate_si5bis(enum osmo_sysinfo_type t, struct gsm_bts *bts) if (n) { /* indicate in SI5 and SI5bis: there is an extension */ struct gsm48_system_information_type_5 *si5 = - (struct gsm48_system_information_type_5 *) GSM_BTS_SI(bts, SYSINFO_TYPE_5); + (struct gsm48_system_information_type_5 *) GSM_BTS_SI(bts, SYSINFO_TYPE_5)+1; si5->bcch_frequency_list[0] |= 0x20; si5b->bcch_frequency_list[0] |= 0x20; } else @@ -1013,7 +1013,7 @@ static int generate_si5ter(enum osmo_sysinfo_type t, struct gsm_bts *bts) break; } - si5t = (struct gsm48_system_information_type_5ter *) GSM_BTS_SI(bts, t); + si5t = (struct gsm48_system_information_type_5ter *) output; /* l2 pseudo length, not part of msg: 18 */ si5t->rr_protocol_discriminator = GSM48_PDISC_RR; @@ -1051,7 +1051,7 @@ static int generate_si6(enum osmo_sysinfo_type t, struct gsm_bts *bts) break; } - si6 = (struct gsm48_system_information_type_6 *) GSM_BTS_SI(bts, t); + si6 = (struct gsm48_system_information_type_6 *) output; /* l2 pseudo length, not part of msg: 11 */ si6->rr_protocol_discriminator = GSM48_PDISC_RR; |