bsc: Create minimal SI6 rest octets

In GSM R99 SI6 has mandatory SI6 rest octets and so far we did
not include them. Add minimal support to generate the right band
indicator.

Target a slightly older version of the SI6 rest octets as we neither
support MBMS nor Random bit stream but should include the band
indicator.

Change-Id: I417a40eb91f42a3416b4e07bb9fb4d7a01aaa36b
Fixes: OS#1698
Related: OS#1725
Reviewed-on: https://gerrit.osmocom.org/71
Tested-by: Jenkins Builder
Reviewed-by: Max <msuraev@sysmocom.de>
Reviewed-by: Holger Freyther <holger@freyther.de>
changes/88/3188/1
Holger Hans Peter Freyther 7 years ago committed by Holger Freyther
parent 307e40648e
commit 82dd983dd8
  1. 1
      openbsc/include/openbsc/rest_octets.h
  2. 39
      openbsc/src/libbsc/rest_octets.c
  3. 4
      openbsc/src/libbsc/system_information.c

@ -12,6 +12,7 @@
int rest_octets_si1(uint8_t *data, uint8_t *nch_pos, int is1800_net);
int rest_octets_si2quater(uint8_t *data, const struct osmo_earfcn_si2q *e,
const uint16_t *u, const uint16_t *sc, size_t u_len);
int rest_octets_si6(uint8_t *data, bool is1800_net);
struct gsm48_si_selection_params {
uint16_t penalty_time:5,

@ -450,6 +450,45 @@ int rest_octets_si4(uint8_t *data, const struct gsm48_si_ro_info *si4, int len)
return bv.data_len;
}
/* GSM 04.18 ETSI TS 101 503 V8.27.0 (2006-05)
<SI6 rest octets> ::=
{L | H <PCH and NCH info>}
{L | H <VBS/VGCS options : bit(2)>}
{ < DTM_support : bit == L > I < DTM_support : bit == H >
< RAC : bit (8) >
< MAX_LAPDm : bit (3) > }
< Band indicator >
{ L | H < GPRS_MS_TXPWR_MAX_CCH : bit (5) > }
<implicit spare >;
*/
int rest_octets_si6(uint8_t *data, bool is1800_net)
{
struct bitvec bv;
memset(&bv, 0, sizeof(bv));
bv.data = data;
bv.data_len = 1;
/* no PCH/NCH info */
bitvec_set_bit(&bv, L);
/* no VBS/VGCS options */
bitvec_set_bit(&bv, L);
/* no DTM_support */
bitvec_set_bit(&bv, L);
/* band indicator */
if (is1800_net)
bitvec_set_bit(&bv, L);
else
bitvec_set_bit(&bv, H);
/* no GPRS_MS_TXPWR_MAX_CCH */
bitvec_set_bit(&bv, L);
bitvec_spare_padding(&bv, (bv.data_len * 8) - 1);
return bv.data_len;
}
/* GPRS Mobile Allocation as per TS 04.60 Chapter 12.10a:
< GPRS Mobile Allocation IE > ::=
< HSN : bit (6) >

@ -905,6 +905,7 @@ static int generate_si6(uint8_t *output, struct gsm_bts *bts)
{
struct gsm48_system_information_type_6 *si6;
int l2_plen = 11;
int rc;
memset(output, GSM_MACBLOCK_PADDING, GSM_MACBLOCK_LEN);
@ -935,8 +936,9 @@ static int generate_si6(uint8_t *output, struct gsm_bts *bts)
gsm48_set_dtx(&si6->cell_options, bts->dtxu, bts->dtxu, false);
/* SI6 Rest Octets: 10.5.2.35a: PCH / NCH info, VBS/VGCS options */
rc = rest_octets_si6(si6->rest_octets, is_dcs_net(bts));
return l2_plen;
return l2_plen + rc;
}
static struct gsm48_si13_info si13_default = {

Loading…
Cancel
Save