laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-msc/+/33932 )
Change subject: csd_bs_list_to_bearer_cap(): properly initialize bcap fields ......................................................................
csd_bs_list_to_bearer_cap(): properly initialize bcap fields
Currently this function fails to initialize all bcap fields properly, so the resulting CC Setup message generated by osmo-msc has some fields set to reserved/invalid values.
With these changes I am able to establish a data call on TCH/F9.6:
* cap->{mode,coding}: assign default values explicitly; * cap->radio: value 0 is reserved, set GSM48_BCAP_RRQ_FR_ONLY; * cap->data.sig_access: value 0 is reserved, set GSM48_BCAP_SA_I440_I450; * cap->data.transp: this is not a bool, set GSM48_BCAP_TR_{TRANSP,RLP}; * cap->data.{nr_{data,stop}_bits,parity}: set 8N1 by default; * cap->data.modem_type: explicitly assign default value; * cap->data.interm_rate: value 0 is reserved, set GSM48_BCAP_IR_{8k,16k}.
The related libosmocore.git patch additionally fixes encoding of the "Connection element (octet 6c)", so that bcap->data.transp is used.
Change-Id: If49c89e4f867bac92ad062c062b9f36bab2b4531 Related: libosmocore.git I7339908864e8a2aef6f2b48a108650167e413c7f Related: OS#6110, OS#4394 --- M src/libmsc/csd_bs.c 1 file changed, 47 insertions(+), 1 deletion(-)
Approvals: Jenkins Builder: Verified osmith: Looks good to me, but someone else must approve pespin: Looks good to me, approved laforge: Looks good to me, approved
diff --git a/src/libmsc/csd_bs.c b/src/libmsc/csd_bs.c index 1c40ef5..dcc6124 100644 --- a/src/libmsc/csd_bs.c +++ b/src/libmsc/csd_bs.c @@ -422,6 +422,9 @@ { *cap = (struct gsm_mncc_bearer_cap){ .transfer = GSM_MNCC_BCAP_UNR_DIG, + .mode = GSM48_BCAP_TMOD_CIRCUIT, + .coding = GSM48_BCAP_CODING_GSM_STD, + .radio = GSM48_BCAP_RRQ_FR_ONLY, }; enum csd_bs bs; int i; @@ -430,24 +433,39 @@ bs = list->bs[i];
cap->data.rate_adaption = GSM48_BCAP_RA_V110_X30; + cap->data.sig_access = GSM48_BCAP_SA_I440_I450; cap->data.async = bs_map[bs].async; - cap->data.transp = bs_map[bs].transp; + if (bs_map[bs].transp) + cap->data.transp = GSM48_BCAP_TR_TRANSP; + else + cap->data.transp = GSM48_BCAP_TR_RLP; + + /* FIXME: proper values for sync/async (current: 8N1) */ + cap->data.nr_data_bits = 8; + cap->data.parity = GSM48_BCAP_PAR_NONE; + cap->data.nr_stop_bits = 1; + cap->data.modem_type = GSM48_BCAP_MT_NONE;
switch (bs_map[bs].rate) { case 300: cap->data.user_rate = GSM48_BCAP_UR_300; + cap->data.interm_rate = GSM48_BCAP_IR_8k; break; case 1200: cap->data.user_rate = GSM48_BCAP_UR_1200; + cap->data.interm_rate = GSM48_BCAP_IR_8k; break; case 2400: cap->data.user_rate = GSM48_BCAP_UR_2400; + cap->data.interm_rate = GSM48_BCAP_IR_8k; break; case 4800: cap->data.user_rate = GSM48_BCAP_UR_4800; + cap->data.interm_rate = GSM48_BCAP_IR_8k; break; case 9600: cap->data.user_rate = GSM48_BCAP_UR_9600; + cap->data.interm_rate = GSM48_BCAP_IR_16k; break; }