<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>