<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/7700">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: implement TCAP-like session management<br><br>Unlike TCAP/MAP, GSUP is just a transport layer without the<br>dialogue/context. This prevents us from having session based<br>communication, required e.g. for USSD. But we can emulate<br>TCAP dialogue by adding additional IEs, which would allow<br>to relate each message to a particular session.<br><br>This change introduces the following IEs:<br><br>  - OSMO_GSUP_SESSION_ID_IE,<br>  - OSMO_GSUP_SESSION_STATE_IE,<br><br>which optionally can be used to indicate that the message is<br>related to a session with given ID, and to manage session<br>state, i.e. initiate, continue, and finish.<br><br>Change-Id: I1cee271fed0284a134ffed103c0d4bebbcfde2a8<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, 58 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 8ccfa49..d984813 100644</span><br><span>--- a/TODO-RELEASE</span><br><span>+++ b/TODO-RELEASE</span><br><span>@@ -7,3 +7,5 @@</span><br><span> # If any interfaces have been added since the last public release: c:r:a + 1.</span><br><span> # If any interfaces have been removed or changed since the last public release: c:r:0.</span><br><span> #library what                    description / commit summary line</span><br><span style="color: hsl(120, 100%, 40%);">+gsup         gsup.h                          the 'osmo_gsup_message' struct extended with</span><br><span style="color: hsl(120, 100%, 40%);">+                                          session information => ABI changed</span><br><span>diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h</span><br><span>index a7fa820..5f45699 100644</span><br><span>--- a/include/osmocom/gsm/gsup.h</span><br><span>+++ b/include/osmocom/gsm/gsup.h</span><br><span>@@ -82,6 +82,9 @@</span><br><span>       OSMO_GSUP_AUTS_IE                       = 0x26,</span><br><span>      OSMO_GSUP_RES_IE                        = 0x27,</span><br><span>      OSMO_GSUP_CN_DOMAIN_IE                  = 0x28,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_GSUP_SESSION_ID_IE                 = 0x30,</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_GSUP_SESSION_STATE_IE              = 0x31,</span><br><span> };</span><br><span> </span><br><span> /*! GSUP message type */</span><br><span>@@ -132,6 +135,18 @@</span><br><span>         OSMO_GSUP_CN_DOMAIN_CS                  = 2,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! TCAP-like session state */</span><br><span style="color: hsl(120, 100%, 40%);">+enum osmo_gsup_session_state {</span><br><span style="color: hsl(120, 100%, 40%);">+        /*! Undefined session state */</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_GSUP_SESSION_STATE_NONE            = 0x00,</span><br><span style="color: hsl(120, 100%, 40%);">+       /*! Initiation of a new session */</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_GSUP_SESSION_STATE_BEGIN           = 0x01,</span><br><span style="color: hsl(120, 100%, 40%);">+       /*! Communication of an existing session */</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_GSUP_SESSION_STATE_CONTINUE        = 0x02,</span><br><span style="color: hsl(120, 100%, 40%);">+       /*! Indication of the session end */</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_GSUP_SESSION_STATE_END             = 0x03,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! parsed/decoded PDP context information */</span><br><span> struct osmo_gsup_pdp_info {</span><br><span>        unsigned int                    context_id;</span><br><span>@@ -176,6 +191,12 @@</span><br><span>   enum osmo_gsup_cn_domain        cn_domain;</span><br><span>   const uint8_t                   *pdp_charg_enc;</span><br><span>      size_t                          pdp_charg_enc_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /*! Session state \ref osmo_gsup_session_state */</span><br><span style="color: hsl(120, 100%, 40%);">+     enum osmo_gsup_session_state    session_state;</span><br><span style="color: hsl(120, 100%, 40%);">+        /*! Unique session identifier and origination flag.</span><br><span style="color: hsl(120, 100%, 40%);">+         * Encoded only when \ref session_state != 0x00 */</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t                        session_id;</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 b6ac56d..8663f44 100644</span><br><span>--- a/src/gsm/gsup.c</span><br><span>+++ b/src/gsm/gsup.c</span><br><span>@@ -385,6 +385,14 @@</span><br><span>                      gsup_msg->pdp_charg_enc_len = value_len;</span><br><span>                  break;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            case OSMO_GSUP_SESSION_ID_IE:</span><br><span style="color: hsl(120, 100%, 40%);">+                 gsup_msg->session_id = osmo_decode_big_endian(value, value_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              case OSMO_GSUP_SESSION_STATE_IE:</span><br><span style="color: hsl(120, 100%, 40%);">+                      gsup_msg->session_state = *value;</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>@@ -564,6 +572,14 @@</span><br><span>                             gsup_msg->pdp_charg_enc_len, gsup_msg->pdp_charg_enc);</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if ((u8 = gsup_msg->session_state)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              size_t len = sizeof(gsup_msg->session_id);</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t *sid = osmo_encode_big_endian(gsup_msg->session_id, len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                msgb_tlv_put(msg, OSMO_GSUP_SESSION_ID_IE, len, sid);</span><br><span style="color: hsl(120, 100%, 40%);">+         msgb_tlv_put(msg, OSMO_GSUP_SESSION_STATE_IE, sizeof(u8), &u8);</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 acc7274..6ead7d2 100644</span><br><span>--- a/tests/gsup/gsup_test.c</span><br><span>+++ b/tests/gsup/gsup_test.c</span><br><span>@@ -171,6 +171,15 @@</span><br><span>                       0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,</span><br><span>      };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        static const uint8_t dummy_session_ies[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+          0x2b, /* Dummy value, we only interested in IE coding */</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%);">+</span><br><span>         static const struct test {</span><br><span>           char *name;</span><br><span>          const uint8_t *data;</span><br><span>@@ -204,6 +213,8 @@</span><br><span>                   send_auth_info_res_umts, sizeof(send_auth_info_res_umts)},</span><br><span>           {"Send Authentication Info Request with AUTS and RAND (UMTS)",</span><br><span>                     send_auth_info_req_auts, sizeof(send_auth_info_req_auts)},</span><br><span style="color: hsl(120, 100%, 40%);">+            {"Dummy message with session IEs",</span><br><span style="color: hsl(120, 100%, 40%);">+                  dummy_session_ies, sizeof(dummy_session_ies)},</span><br><span>       };</span><br><span> </span><br><span>       printf("Test GSUP message decoding/encoding\n");</span><br><span>@@ -267,7 +278,7 @@</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_CN_DOMAIN_IE);</span><br><span style="color: hsl(120, 100%, 40%);">+                            OSMO_ASSERT(t->data[j+0] <= OSMO_GSUP_SESSION_STATE_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 05c64fe..5c010e6 100644</span><br><span>--- a/tests/gsup/gsup_test.err</span><br><span>+++ b/tests/gsup/gsup_test.err</span><br><span>@@ -40,6 +40,9 @@</span><br><span>   generated message: 08 01 08 21 43 65 87 09 21 43 f5 26 0e 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 20 10 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 </span><br><span>   original message:  08 01 08 21 43 65 87 09 21 43 f5 26 0e 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 20 10 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 </span><br><span>   IMSI:              123456789012345</span><br><span style="color: hsl(120, 100%, 40%);">+  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 style="color: hsl(120, 100%, 40%);">+  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 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>@@ -54,6 +57,7 @@</span><br><span>   message 11: tested 13 truncations, 12 parse failures</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 style="color: hsl(120, 100%, 40%);">+  message 14: tested 20 truncations, 18 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>@@ -69,3 +73,4 @@</span><br><span>   message 11: tested 3328 modifications, 767 parse failures</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 style="color: hsl(120, 100%, 40%);">+  message 14: tested 5120 modifications, 1026 parse failures</span><br><span>diff --git a/tests/gsup/gsup_test.ok b/tests/gsup/gsup_test.ok</span><br><span>index 49a85ba..1f59902 100644</span><br><span>--- a/tests/gsup/gsup_test.ok</span><br><span>+++ b/tests/gsup/gsup_test.ok</span><br><span>@@ -27,4 +27,6 @@</span><br><span>           Send Authentication Info Result with IK, CK, AUTN and RES (UMTS) OK</span><br><span>   Testing Send Authentication Info Request with AUTS and RAND (UMTS)</span><br><span>           Send Authentication Info Request with AUTS and RAND (UMTS) OK</span><br><span style="color: hsl(120, 100%, 40%);">+  Testing Dummy message with session IEs</span><br><span style="color: hsl(120, 100%, 40%);">+          Dummy message with session IEs OK</span><br><span> Done.</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/7700">change 7700</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/7700"/><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: I1cee271fed0284a134ffed103c0d4bebbcfde2a8 </div>
<div style="display:none"> Gerrit-Change-Number: 7700 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@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>