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

Reply via email to