<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/7600">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">GSUP: introduce new messages for SS/USSD payloads<br><br>In order to be able to transfer SS/USSD messages via GSUP,<br>this change introduces the following new message types:<br><br>  - OSMO_GSUP_MSGT_PROC_SS_*,<br><br>and the following new IE:<br><br>  - OSMO_GSUP_SS_INFO_IE<br><br>which represents an ASN.1 encoded MAP payload coming to/from<br>the mobile station 'as is', without any transcoding.<br><br>Change-Id: Ie17a78043a35fffbdd59e80fd2b2da39cce5e532<br>Related: OS#1597<br>---<br>M TODO-RELEASE<br>M include/osmocom/gsm/gsup.h<br>M src/gsm/gsup.c<br>M tests/gsup/gsup_test.c<br>M tests/gsup/gsup_test.err<br>M tests/gsup/gsup_test.ok<br>6 files changed, 87 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/TODO-RELEASE b/TODO-RELEASE</span><br><span>index d984813..7b225cc 100644</span><br><span>--- a/TODO-RELEASE</span><br><span>+++ b/TODO-RELEASE</span><br><span>@@ -9,3 +9,4 @@</span><br><span> #library  what                    description / commit summary line</span><br><span> gsup               gsup.h                          the 'osmo_gsup_message' struct extended with</span><br><span>                                                 session information => ABI changed</span><br><span style="color: hsl(120, 100%, 40%);">+                                         SS/USSD information => ABI changed</span><br><span>diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h</span><br><span>index 5f45699..dd27493 100644</span><br><span>--- a/include/osmocom/gsm/gsup.h</span><br><span>+++ b/include/osmocom/gsm/gsup.h</span><br><span>@@ -85,6 +85,9 @@</span><br><span> </span><br><span>   OSMO_GSUP_SESSION_ID_IE                 = 0x30,</span><br><span>      OSMO_GSUP_SESSION_STATE_IE              = 0x31,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /*! Supplementary Services payload */</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_SS_INFO_IE                    = 0x35,</span><br><span> };</span><br><span> </span><br><span> /*! GSUP message type */</span><br><span>@@ -114,6 +117,10 @@</span><br><span>         OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST  = 0b00011100,</span><br><span>        OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR    = 0b00011101,</span><br><span>        OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT   = 0b00011110,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_GSUP_MSGT_PROC_SS_REQUEST          = 0b00100000,</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_PROC_SS_ERROR            = 0b00100001,</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_PROC_SS_RESULT           = 0b00100010,</span><br><span> };</span><br><span> </span><br><span> #define OSMO_GSUP_IS_MSGT_REQUEST(msgt) (((msgt) & 0b00000011) == 0b00)</span><br><span>@@ -197,6 +204,10 @@</span><br><span>        /*! Unique session identifier and origination flag.</span><br><span>          * Encoded only when \ref session_state != 0x00 */</span><br><span>    uint32_t                        session_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! ASN.1 encoded MAP payload for Supplementary Services */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t                         *ss_info;</span><br><span style="color: hsl(120, 100%, 40%);">+     size_t                          ss_info_len;</span><br><span> };</span><br><span> </span><br><span> int osmo_gsup_decode(const uint8_t *data, size_t data_len,</span><br><span>diff --git a/src/gsm/gsup.c b/src/gsm/gsup.c</span><br><span>index 8663f44..b4b60b2 100644</span><br><span>--- a/src/gsm/gsup.c</span><br><span>+++ b/src/gsm/gsup.c</span><br><span>@@ -62,6 +62,11 @@</span><br><span>       OSMO_VALUE_STRING(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST),</span><br><span>   OSMO_VALUE_STRING(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR),</span><br><span>     OSMO_VALUE_STRING(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_VALUE_STRING(OSMO_GSUP_MSGT_PROC_SS_REQUEST),</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_VALUE_STRING(OSMO_GSUP_MSGT_PROC_SS_ERROR),</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_VALUE_STRING(OSMO_GSUP_MSGT_PROC_SS_RESULT),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>@@ -393,6 +398,11 @@</span><br><span>                         gsup_msg->session_state = *value;</span><br><span>                         break;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            case OSMO_GSUP_SS_INFO_IE:</span><br><span style="color: hsl(120, 100%, 40%);">+                    gsup_msg->ss_info = value;</span><br><span style="color: hsl(120, 100%, 40%);">+                 gsup_msg->ss_info_len = value_len;</span><br><span style="color: hsl(120, 100%, 40%);">+                 break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>             default:</span><br><span>                     LOGP(DLGSUP, LOGL_NOTICE,</span><br><span>                         "GSUP IE type %d unknown\n", iei);</span><br><span>@@ -580,6 +590,11 @@</span><br><span>             msgb_tlv_put(msg, OSMO_GSUP_SESSION_STATE_IE, sizeof(u8), &u8);</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (gsup_msg->ss_info) {</span><br><span style="color: hsl(120, 100%, 40%);">+           msgb_tlv_put(msg, OSMO_GSUP_SS_INFO_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+                               gsup_msg->ss_info_len, gsup_msg->ss_info);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/gsup/gsup_test.c b/tests/gsup/gsup_test.c</span><br><span>index 6ead7d2..9712d77 100644</span><br><span>--- a/tests/gsup/gsup_test.c</span><br><span>+++ b/tests/gsup/gsup_test.c</span><br><span>@@ -180,6 +180,43 @@</span><br><span>               0x31, 0x01, 0x01,</span><br><span>    };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        static const uint8_t send_ussd_req[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+              0x20, /* OSMO_GSUP_MSGT_PROC_SS_REQUEST */</span><br><span style="color: hsl(120, 100%, 40%);">+            TEST_IMSI_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Session ID and state */</span><br><span style="color: hsl(120, 100%, 40%);">+            0x30, 0x04, 0xde, 0xad, 0xbe, 0xef,</span><br><span style="color: hsl(120, 100%, 40%);">+           0x31, 0x01, 0x01,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* SS/USSD information IE */</span><br><span style="color: hsl(120, 100%, 40%);">+          0x35, 0x14,</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* ASN.1 encoded MAP payload */</span><br><span style="color: hsl(120, 100%, 40%);">+                       0xa1, 0x12,</span><br><span style="color: hsl(120, 100%, 40%);">+                           0x02, 0x01, /* Component: invoke */</span><br><span style="color: hsl(120, 100%, 40%);">+                           0x01, /* invokeID = 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+                              /* opCode: processUnstructuredSS-Request */</span><br><span style="color: hsl(120, 100%, 40%);">+                           0x02, 0x01, 0x3b, 0x30, 0x0a, 0x04, 0x01, 0x0f,</span><br><span style="color: hsl(120, 100%, 40%);">+                               0x04, 0x05, 0xaa, 0x18, 0x0c, 0x36, 0x02,</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  static const uint8_t send_ussd_res[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+              0x22, /* OSMO_GSUP_MSGT_PROC_SS_RESULT */</span><br><span style="color: hsl(120, 100%, 40%);">+             TEST_IMSI_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Session ID and state */</span><br><span style="color: hsl(120, 100%, 40%);">+            0x30, 0x04, 0xde, 0xad, 0xbe, 0xef,</span><br><span style="color: hsl(120, 100%, 40%);">+           0x31, 0x01, 0x03,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* SS/USSD information IE */</span><br><span style="color: hsl(120, 100%, 40%);">+          0x35, 0x08,</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* ASN.1 encoded MAP payload */</span><br><span style="color: hsl(120, 100%, 40%);">+                       0xa3, 0x06,</span><br><span style="color: hsl(120, 100%, 40%);">+                           0x02, 0x01, /* Component: returnError */</span><br><span style="color: hsl(120, 100%, 40%);">+                              0x01, /* invokeID = 1 */</span><br><span style="color: hsl(120, 100%, 40%);">+                              /* localValue: unknownAlphabet */</span><br><span style="color: hsl(120, 100%, 40%);">+                             0x02, 0x01, 0x47,</span><br><span style="color: hsl(120, 100%, 40%);">+     };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         static const struct test {</span><br><span>           char *name;</span><br><span>          const uint8_t *data;</span><br><span>@@ -215,6 +252,10 @@</span><br><span>                  send_auth_info_req_auts, sizeof(send_auth_info_req_auts)},</span><br><span>           {"Dummy message with session IEs",</span><br><span>                         dummy_session_ies, sizeof(dummy_session_ies)},</span><br><span style="color: hsl(120, 100%, 40%);">+                {"SS/USSD processUnstructuredSS-Request / Invoke",</span><br><span style="color: hsl(120, 100%, 40%);">+                  send_ussd_req, sizeof(send_ussd_req)},</span><br><span style="color: hsl(120, 100%, 40%);">+                {"SS/USSD processUnstructuredSS-Request / ReturnResult",</span><br><span style="color: hsl(120, 100%, 40%);">+                    send_ussd_res, sizeof(send_ussd_res)},</span><br><span>       };</span><br><span> </span><br><span>       printf("Test GSUP message decoding/encoding\n");</span><br><span>@@ -278,7 +319,11 @@</span><br><span>                                    osmo_hexdump(t->data + j, ie_end - j));</span><br><span> </span><br><span>                               OSMO_ASSERT(j <= ie_end - 2);</span><br><span style="color: hsl(0, 100%, 40%);">-                                OSMO_ASSERT(t->data[j+0] <= OSMO_GSUP_SESSION_STATE_IE);</span><br><span style="color: hsl(120, 100%, 40%);">+                                /**</span><br><span style="color: hsl(120, 100%, 40%);">+                            * FIXME: share the maximal IE value somehow</span><br><span style="color: hsl(120, 100%, 40%);">+                           * in order to avoid manual updating of this</span><br><span style="color: hsl(120, 100%, 40%);">+                           */</span><br><span style="color: hsl(120, 100%, 40%);">+                           OSMO_ASSERT(t->data[j+0] <= OSMO_GSUP_SS_INFO_IE);</span><br><span>                             OSMO_ASSERT(t->data[j+1] <= ie_end - j - 2);</span><br><span> </span><br><span>                               ie_end = j;</span><br><span>diff --git a/tests/gsup/gsup_test.err b/tests/gsup/gsup_test.err</span><br><span>index 5c010e6..ac71ac2 100644</span><br><span>--- a/tests/gsup/gsup_test.err</span><br><span>+++ b/tests/gsup/gsup_test.err</span><br><span>@@ -43,6 +43,12 @@</span><br><span>   generated message: 2b 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 01 </span><br><span>   original message:  2b 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 01 </span><br><span>   IMSI:              123456789012345</span><br><span style="color: hsl(120, 100%, 40%);">+  generated message: 20 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 01 35 14 a1 12 02 01 01 02 01 3b 30 0a 04 01 0f 04 05 aa 18 0c 36 02 </span><br><span style="color: hsl(120, 100%, 40%);">+  original message:  20 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 01 35 14 a1 12 02 01 01 02 01 3b 30 0a 04 01 0f 04 05 aa 18 0c 36 02 </span><br><span style="color: hsl(120, 100%, 40%);">+  IMSI:              123456789012345</span><br><span style="color: hsl(120, 100%, 40%);">+  generated message: 22 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 03 35 08 a3 06 02 01 01 02 01 47 </span><br><span style="color: hsl(120, 100%, 40%);">+  original message:  22 01 08 21 43 65 87 09 21 43 f5 30 04 de ad be ef 31 01 03 35 08 a3 06 02 01 01 02 01 47 </span><br><span style="color: hsl(120, 100%, 40%);">+  IMSI:              123456789012345</span><br><span>   message 0: tested 11 truncations, 11 parse failures</span><br><span>   message 1: tested 14 truncations, 13 parse failures</span><br><span>   message 2: tested 83 truncations, 81 parse failures</span><br><span>@@ -58,6 +64,8 @@</span><br><span>   message 12: tested 211 truncations, 209 parse failures</span><br><span>   message 13: tested 45 truncations, 43 parse failures</span><br><span>   message 14: tested 20 truncations, 18 parse failures</span><br><span style="color: hsl(120, 100%, 40%);">+  message 15: tested 42 truncations, 39 parse failures</span><br><span style="color: hsl(120, 100%, 40%);">+  message 16: tested 30 truncations, 27 parse failures</span><br><span> DLGSUP Stopping DLGSUP logging</span><br><span>   message 0: tested 2816 modifications, 510 parse failures</span><br><span>   message 1: tested 3584 modifications, 768 parse failures</span><br><span>@@ -74,3 +82,5 @@</span><br><span>   message 12: tested 54016 modifications, 4622 parse failures</span><br><span>   message 13: tested 11520 modifications, 1026 parse failures</span><br><span>   message 14: tested 5120 modifications, 1026 parse failures</span><br><span style="color: hsl(120, 100%, 40%);">+  message 15: tested 10752 modifications, 1256 parse failures</span><br><span style="color: hsl(120, 100%, 40%);">+  message 16: tested 7680 modifications, 1265 parse failures</span><br><span>diff --git a/tests/gsup/gsup_test.ok b/tests/gsup/gsup_test.ok</span><br><span>index 1f59902..d63dd2d 100644</span><br><span>--- a/tests/gsup/gsup_test.ok</span><br><span>+++ b/tests/gsup/gsup_test.ok</span><br><span>@@ -29,4 +29,8 @@</span><br><span>           Send Authentication Info Request with AUTS and RAND (UMTS) OK</span><br><span>   Testing Dummy message with session IEs</span><br><span>           Dummy message with session IEs OK</span><br><span style="color: hsl(120, 100%, 40%);">+  Testing SS/USSD processUnstructuredSS-Request / Invoke</span><br><span style="color: hsl(120, 100%, 40%);">+          SS/USSD processUnstructuredSS-Request / Invoke OK</span><br><span style="color: hsl(120, 100%, 40%);">+  Testing SS/USSD processUnstructuredSS-Request / ReturnResult</span><br><span style="color: hsl(120, 100%, 40%);">+          SS/USSD processUnstructuredSS-Request / ReturnResult OK</span><br><span> Done.</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/7600">change 7600</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/7600"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ie17a78043a35fffbdd59e80fd2b2da39cce5e532 </div>
<div style="display:none"> Gerrit-Change-Number: 7600 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Alexander Chemeris <Alexander.Chemeris@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>