mirror of https://gerrit.osmocom.org/libosmocore
rest_octets: Implement actual SI6 rest octets encoding
There's very little sense behind introducing a function into libosmogsm which doesn't implement 90% of the spec. Let's allow the caller to provide the various optional bits of information to the encoder, rather than generating mostly static SI6 rest octets. Change-Id: Id75005a0c4a02ce7f809692d58b3bd226bc582b2
This commit is contained in:
parent
f85b33f68f
commit
86156de20e
|
@ -20,7 +20,44 @@ int osmo_gsm48_rest_octets_si2quater_encode(uint8_t *data, uint8_t si2q_index, u
|
||||||
size_t *e_offset);
|
size_t *e_offset);
|
||||||
int osmo_gsm48_rest_octets_si2ter_encode(uint8_t *data);
|
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_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 {
|
struct osmo_gsm48_si_selection_params {
|
||||||
uint16_t penalty_time:5,
|
uint16_t penalty_time:5,
|
||||||
|
|
|
@ -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) > }
|
{ L | H < GPRS_MS_TXPWR_MAX_CCH : bit (5) > }
|
||||||
<implicit spare >;
|
<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;
|
struct bitvec bv;
|
||||||
|
|
||||||
|
@ -695,18 +695,42 @@ int osmo_gsm48_rest_octets_si6_encode(uint8_t *data, bool is1800_net)
|
||||||
bv.data = data;
|
bv.data = data;
|
||||||
bv.data_len = 1;
|
bv.data_len = 1;
|
||||||
|
|
||||||
/* no PCH/NCH info */
|
if (in->pch_nch_info.present) {
|
||||||
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);
|
bitvec_set_bit(&bv, H);
|
||||||
/* no GPRS_MS_TXPWR_MAX_CCH */
|
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);
|
||||||
|
bitvec_set_uint(&bv, in->gprs_ms_txpwr_max_ccch.max_txpwr, 5);
|
||||||
|
} else
|
||||||
bitvec_set_bit(&bv, L);
|
bitvec_set_bit(&bv, L);
|
||||||
|
|
||||||
bitvec_spare_padding(&bv, (bv.data_len * 8) - 1);
|
bitvec_spare_padding(&bv, (bv.data_len * 8) - 1);
|
||||||
|
|
Loading…
Reference in New Issue