diff options
| -rw-r--r-- | include/osmocom/gsm/gsm48_rest_octets.h | 39 | ||||
| -rw-r--r-- | src/gsm/gsm48_rest_octets.c | 46 | 
2 files changed, 73 insertions, 12 deletions
| diff --git a/include/osmocom/gsm/gsm48_rest_octets.h b/include/osmocom/gsm/gsm48_rest_octets.h index bc5023a6..7163672c 100644 --- a/include/osmocom/gsm/gsm48_rest_octets.h +++ b/include/osmocom/gsm/gsm48_rest_octets.h @@ -20,7 +20,44 @@ int osmo_gsm48_rest_octets_si2quater_encode(uint8_t *data, uint8_t si2q_index, u  					    size_t *e_offset);  int osmo_gsm48_rest_octets_si2ter_encode(uint8_t *data);  int osmo_gsm48_rest_octets_si2bis_encode(uint8_t *data); -int osmo_gsm48_rest_octets_si6_encode(uint8_t *data, bool is1800_net); + +struct osmo_gsm48_si_pch_nch_info { +	bool present; +	bool paging_channel_restructuring; +	uint8_t nln_sacch; +	bool call_priority_present; +	uint8_t call_priority; +	bool nln_status_sacch; +}; + +struct osmo_gsm48_si_vbs_vgcs_options { +	bool present; +	bool inband_notifications; +	bool inband_pagings; +}; + +struct osmo_gsm48_si_dtm_support { +	bool present; +	uint8_t rac; +	uint8_t max_lapdm; +}; + +struct osmo_gsm48_si_gprs_ms_txpwr_max_ccch { +	bool present; +	uint8_t max_txpwr; +}; + +struct osmo_gsm48_si6_ro_info { +	struct osmo_gsm48_si_pch_nch_info pch_nch_info; +	struct osmo_gsm48_si_vbs_vgcs_options vbs_vgcs_options; +	struct osmo_gsm48_si_dtm_support dtm_support; +	bool band_indicator_1900; +	struct osmo_gsm48_si_gprs_ms_txpwr_max_ccch gprs_ms_txpwr_max_ccch; +	/* MBMS: not supported in Osmocom */ +	/* AMR config (group channel): not supported in Osmocom */ +}; + +int osmo_gsm48_rest_octets_si6_encode(uint8_t *data, const struct osmo_gsm48_si6_ro_info *in);  struct osmo_gsm48_si_selection_params {  	uint16_t penalty_time:5, diff --git a/src/gsm/gsm48_rest_octets.c b/src/gsm/gsm48_rest_octets.c index d5c93fe8..c1e4b308 100644 --- a/src/gsm/gsm48_rest_octets.c +++ b/src/gsm/gsm48_rest_octets.c @@ -687,7 +687,7 @@ int osmo_gsm48_rest_octets_si4_encode(uint8_t *data, const struct osmo_gsm48_si_  { L | H < GPRS_MS_TXPWR_MAX_CCH : bit (5) > }  <implicit spare >;  */ -int osmo_gsm48_rest_octets_si6_encode(uint8_t *data, bool is1800_net) +int osmo_gsm48_rest_octets_si6_encode(uint8_t *data, const struct osmo_gsm48_si6_ro_info *in)  {  	struct bitvec bv; @@ -695,19 +695,43 @@ int osmo_gsm48_rest_octets_si6_encode(uint8_t *data, bool is1800_net)  	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) +	if (in->pch_nch_info.present) { +		bitvec_set_bit(&bv, H); +		bitvec_set_bit(&bv, !!in->pch_nch_info.paging_channel_restructuring); +		bitvec_set_uint(&bv, in->pch_nch_info.nln_sacch, 2); +		if (in->pch_nch_info.call_priority_present) { +			bitvec_set_bit(&bv, 1); +			bitvec_set_uint(&bv, in->pch_nch_info.call_priority, 3); +		} else +			bitvec_set_bit(&bv, 0); +		bitvec_set_bit(&bv, !!in->pch_nch_info.nln_status_sacch); +	} else +		bitvec_set_bit(&bv, L); + +	if (in->vbs_vgcs_options.present) { +		bitvec_set_bit(&bv, H); +		bitvec_set_bit(&bv, !!in->vbs_vgcs_options.inband_notifications); +		bitvec_set_bit(&bv, !!in->vbs_vgcs_options.inband_pagings); +	} else +		bitvec_set_bit(&bv, L); + +	if (in->dtm_support.present) { +		bitvec_set_bit(&bv, H); +		bitvec_set_uint(&bv, in->dtm_support.rac, 8); +		bitvec_set_uint(&bv, in->dtm_support.max_lapdm, 3); +	} else  		bitvec_set_bit(&bv, L); + +	if (in->band_indicator_1900) +		bitvec_set_bit(&bv, H);  	else +		bitvec_set_bit(&bv, L); + +	if (in->gprs_ms_txpwr_max_ccch.present) {  		bitvec_set_bit(&bv, H); -	/* no GPRS_MS_TXPWR_MAX_CCH */ -	bitvec_set_bit(&bv, L); +		bitvec_set_uint(&bv, in->gprs_ms_txpwr_max_ccch.max_txpwr, 5); +	} else +		bitvec_set_bit(&bv, L);  	bitvec_spare_padding(&bv, (bv.data_len * 8) - 1);  	return bv.data_len; | 
