aboutsummaryrefslogtreecommitdiffstats
path: root/src/libbsc/system_information.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2018-03-12 00:24:22 +0100
committerHarald Welte <laforge@gnumonks.org>2018-03-12 00:28:58 +0100
commitd6012ffc196d880bf9b5fb128b6ae005012ef7f1 (patch)
tree722a4fe5f7794a70025440069038cf49821e32e8 /src/libbsc/system_information.c
parent4ac7763bc7c861e7f28e8eead6f2327387f6e2a9 (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 L@ 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. Change-Id: Ie8c907b1317566670aeb68f933ceefd552c17565 Closes: #3059 Related: #2963
Diffstat (limited to 'src/libbsc/system_information.c')
-rw-r--r--src/libbsc/system_information.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/libbsc/system_information.c b/src/libbsc/system_information.c
index c7c85b043..d99153f24 100644
--- a/src/libbsc/system_information.c
+++ b/src/libbsc/system_information.c
@@ -959,7 +959,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;
@@ -995,7 +995,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;
@@ -1009,7 +1009,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
@@ -1039,7 +1039,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;
@@ -1077,7 +1077,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;