fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/35681?usp=email )
Change subject: [WIP] gsm: gsm48_{en,de}code_bearer_cap: support octet 6d fields ...................................................................... [WIP] gsm: gsm48_{en,de}code_bearer_cap: support octet 6d fields Unfortunately, adding new fields to struct gsm_mncc_bearer_cap is not an option. This struct is part of the MNCC PDU, and doing so would result in breaking backwards compatibility :( Change-Id: I53ef5aee38e3a2f34d22f2745fdffdaf334ce0b6 Related: OS#4396 --- M include/osmocom/gsm/mncc.h M src/gsm/gsm48_ie.c M tests/gsm0408/gsm0408_test.c M tests/gsm0408/gsm0408_test.err M tests/gsm0408/gsm0408_test.ok 5 files changed, 64 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/81/35681/1 diff --git a/include/osmocom/gsm/mncc.h b/include/osmocom/gsm/mncc.h index db70235..4d96ee6 100644 --- a/include/osmocom/gsm/mncc.h +++ b/include/osmocom/gsm/mncc.h @@ -27,6 +27,8 @@ enum gsm48_bcap_interm_rate interm_rate; enum gsm48_bcap_transp transp; enum gsm48_bcap_modem_type modem_type; + enum gsm48_bcap_other_modem_type other_modem_type; + enum gsm48_bcap_fixed_net_user_rate fixed_net_user_rate; } data; }; diff --git a/src/gsm/gsm48_ie.c b/src/gsm/gsm48_ie.c index b95609f..2ab2452 100644 --- a/src/gsm/gsm48_ie.c +++ b/src/gsm/gsm48_ie.c @@ -289,6 +289,15 @@ return 0; bcap->data.transp = (lv[i] >> 5) & 3; bcap->data.modem_type = lv[i] & 0x1F; + + /* octet 6d */ + if (!(lv[i] & 0x80)) { + i++; + if (in_len < i) + return 0; + bcap->data.other_modem_type = (lv[i] >> 5) & 0x03; + bcap->data.fixed_net_user_rate = lv[i] & 0x1f; + } } } @@ -357,6 +366,14 @@ lv[i] = 0x80 | ((bcap->data.transp & 3) << 5) | (bcap->data.modem_type & 0x1f); + /* octet 6d */ + if (bcap->data.other_modem_type != GSM48_BCAP_OTHER_MT_NONE || + bcap->data.fixed_net_user_rate != GSM48_BCAP_FNUR_NONE) { + lv[i++] &= ~0x80; /* octet 6c becomes extended */ + lv[i] = 0x80 /* octet 6d is not extended */ + | (bcap->data.other_modem_type & 0x03) << 5 + | (bcap->data.fixed_net_user_rate & 0x1f); + } break; default: return -EINVAL; diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c index 8a89357..2124227 100644 --- a/tests/gsm0408/gsm0408_test.c +++ b/tests/gsm0408/gsm0408_test.c @@ -75,6 +75,30 @@ }, }; +static const uint8_t csd_9600_v34_lv[] = { 0x08, 0xa2, 0xb8, 0x81, 0x21, 0x15, 0x63, 0x06, 0xc0 }; + +static const struct gsm_mncc_bearer_cap bcap_csd_9600_v34 = { + .transfer = GSM48_BCAP_ITCAP_3k1_AUDIO, + .mode = GSM48_BCAP_TMOD_CIRCUIT, + .coding = GSM48_BCAP_CODING_GSM_STD, + .radio = GSM48_BCAP_RRQ_FR_ONLY, + .speech_ver[0] = -1, + .data = { + .rate_adaption = GSM48_BCAP_RA_NONE, + .sig_access = GSM48_BCAP_SA_I440_I450, + .async = 1, + .nr_stop_bits = 1, + .nr_data_bits = 8, + .user_rate = GSM48_BCAP_UR_9600, + .parity = GSM48_BCAP_PAR_NONE, + .interm_rate = GSM48_BCAP_IR_16k, + .transp = GSM48_BCAP_TR_TRANSP, + .modem_type = GSM48_BCAP_MT_V32, + .other_modem_type = GSM48_BCAP_OTHER_MT_V34, + .fixed_net_user_rate = GSM48_BCAP_FNUR_NONE, + }, +}; + static const uint8_t csd_2400_v22bis_lv[] = { 0x07, 0xa2, 0xb8, 0x81, 0x21, 0x13, 0x43, 0x83 }; static const struct gsm_mncc_bearer_cap bcap_csd_2400_v22bis = { @@ -133,6 +157,9 @@ { csd_4800_rlp_lv, &bcap_csd_4800_rlp, "CSD 4800/RLP/non-transparent" }, { /* XXX: this testcase is expected to fail because octet 4 is not represented in * 'struct gsm_mncc_bearer_cap' and the encoder unconditionally hard-codes it to 0x88. */ + csd_9600_v34_lv, &bcap_csd_9600_v34, "CSD 9600/V.34/transparent" }, + { /* XXX: this testcase is expected to fail because octet 4 is not represented in + * 'struct gsm_mncc_bearer_cap' and the encoder unconditionally hard-codes it to 0x88. */ csd_2400_v22bis_lv, &bcap_csd_2400_v22bis, "CSD 2400/V.22bis/transparent" }, { speech_all_lv, &bcap_speech_all, "Speech, all codecs" }, { speech_no3a_lv, &bcap_speech_no3a, "Speech, without octet 3a" }, diff --git a/tests/gsm0408/gsm0408_test.err b/tests/gsm0408/gsm0408_test.err index 0102de0..bcf1294 100644 --- a/tests/gsm0408/gsm0408_test.err +++ b/tests/gsm0408/gsm0408_test.err @@ -1,3 +1,6 @@ +Incorrect encoded result of CSD 9600/V.34/transparent: + should: 08 a2 b8 81 21 15 63 06 c0 + is: 08 a2 88 81 21 15 63 06 c0 Incorrect encoded result of CSD 2400/V.22bis/transparent: should: 07 a2 b8 81 21 13 43 83 is: 07 a2 88 81 21 13 43 83 diff --git a/tests/gsm0408/gsm0408_test.ok b/tests/gsm0408/gsm0408_test.ok index 721e2c5..3002cc6 100644 --- a/tests/gsm0408/gsm0408_test.ok +++ b/tests/gsm0408/gsm0408_test.ok @@ -1,5 +1,6 @@ Test `CSD 9600/V.110/transparent' passed Test `CSD 4800/RLP/non-transparent' passed +Test `CSD 9600/V.34/transparent' failed Test `CSD 2400/V.22bis/transparent' failed Test `Speech, all codecs' passed Test `Speech, without octet 3a' failed -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/35681?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: I53ef5aee38e3a2f34d22f2745fdffdaf334ce0b6 Gerrit-Change-Number: 35681 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanits...@sysmocom.de> Gerrit-MessageType: newchange