<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11069">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">GSUP/SM: (WIP) introduce MO/MT FORWARD_SM messages<br><br>According to 3GPP TS 29.002, sections 12.2 and 12.9 the FORWARD_SM<br>messages (a.k.a MAP-*-FORWARD-SHORT-MESSAGE) are used to forward<br>MO/MT SMS messages.<br><br>Please note that only the 'must-have' fields of of both message<br>types are introduced by this change, in particular:<br><br>  - OSMO_GSUP_MSGT_{MO|MT}_FORWARD_SM_REQUEST (MAP Request)<br>    - OSMO_GSUP_SM_RP_DA_IE<br>    - OSMO_GSUP_SM_RP_OA_IE<br>    - OSMO_GSUP_SM_RP_UI_IE<br><br>  - OSMO_GSUP_MSGT_{MO|MT}_FORWARD_SM_RESULT (MAP ACK)<br>    - OSMO_GSUP_SM_RP_UI_IE<br><br>  - OSMO_GSUP_MSGT_{MO|MT}_FORWARD_SM_ERROR (MAP Response)<br>    - GSUP_CAUSE_IE (MAP User Error, see 7.6.1)<br><br>Since there is no TCAP layer in GSUP, the context is emulated<br>using the session management IEs (see GSUP_SESSION_*_IE).<br><br>Change-Id: Ibe325c64ae2d6c626b232533bb4cbc65fc2b5d71<br>---<br>M include/osmocom/gsm/gsup.h<br>M src/gsm/gsup.c<br>M tests/gsup/gsup_test.err<br>3 files changed, 96 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/69/11069/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h</span><br><span>index bed61ae..3f9a3f9 100644</span><br><span>--- a/include/osmocom/gsm/gsup.h</span><br><span>+++ b/include/osmocom/gsm/gsup.h</span><br><span>@@ -93,6 +93,9 @@</span><br><span>        OSMO_GSUP_SMSC_ADDR_IE                  = 0x40,</span><br><span>      OSMO_GSUP_NODE_ADDR_IE                  = 0x41,</span><br><span>      OSMO_GSUP_SM_RP_RPI_IE                  = 0x42,</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_GSUP_SM_RP_DA_IE                   = 0x43,</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_GSUP_SM_RP_OA_IE                   = 0x44,</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_GSUP_SM_RP_UI_IE                   = 0x45,</span><br><span> };</span><br><span> </span><br><span> /*! GSUP message type */</span><br><span>@@ -131,6 +134,14 @@</span><br><span>         OSMO_GSUP_MSGT_SRI_FOR_SM_REQUEST       = 0b00100100,</span><br><span>        OSMO_GSUP_MSGT_SRI_FOR_SM_ERROR         = 0b00100101,</span><br><span>        OSMO_GSUP_MSGT_SRI_FOR_SM_RESULT        = 0b00100110,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST    = 0b00101000,</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR      = 0b00101001,</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT     = 0b00101010,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST    = 0b00110000,</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR      = 0b00110001,</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT     = 0b00110010,</span><br><span> };</span><br><span> </span><br><span> #define OSMO_GSUP_IS_MSGT_REQUEST(msgt) (((msgt) & 0b00000011) == 0b00)</span><br><span>@@ -231,6 +242,25 @@</span><br><span>        size_t                          node_addr_len;</span><br><span>       /*! HACK: SM-RP-RPI is (<0 / 0 / >0) => (false / omited / true) */</span><br><span>  int                             sm_rp_rpi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /*! SM Destination Address, see 7.6.8.1. It can be of the following:</span><br><span style="color: hsl(120, 100%, 40%);">+   ** IMSI, LMSI, MSISDN, roaming number, or service centre address.</span><br><span style="color: hsl(120, 100%, 40%);">+     ** The values from 'osmo_gsup_iei' enum are used for 'sm_rp_da_type'.</span><br><span style="color: hsl(120, 100%, 40%);">+         ** NOTE: LMSI, roaming number are not implemented */</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t                   *sm_rp_da;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t                         sm_rp_da_type;</span><br><span style="color: hsl(120, 100%, 40%);">+        size_t                          sm_rp_da_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /*! SM Originating Address, see 7.6.8.2. It can be of the following:</span><br><span style="color: hsl(120, 100%, 40%);">+   ** MSISDN or service centre address. ** The values from 'osmo_gsup_iei'</span><br><span style="color: hsl(120, 100%, 40%);">+       ** enum are used for 'sm_rp_da_type'. */</span><br><span style="color: hsl(120, 100%, 40%);">+     const uint8_t                   *sm_rp_oa;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t                         sm_rp_oa_type;</span><br><span style="color: hsl(120, 100%, 40%);">+        size_t                          sm_rp_oa_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /*! SM TPDU (Transport Protocol Data Unit), see 7.6.8.4 */</span><br><span style="color: hsl(120, 100%, 40%);">+    const uint8_t                   *sm_rp_ui;</span><br><span style="color: hsl(120, 100%, 40%);">+    size_t                          sm_rp_ui_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 22e26f1..752cfca 100644</span><br><span>--- a/src/gsm/gsup.c</span><br><span>+++ b/src/gsm/gsup.c</span><br><span>@@ -71,6 +71,14 @@</span><br><span>      OSMO_VALUE_STRING(OSMO_GSUP_MSGT_SRI_FOR_SM_ERROR),</span><br><span>  OSMO_VALUE_STRING(OSMO_GSUP_MSGT_SRI_FOR_SM_RESULT),</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST),</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR),</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MO_FORWARD_SM_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_MT_FORWARD_SM_REQUEST),</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR),</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_VALUE_STRING(OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    { 0, NULL }</span><br><span> };</span><br><span> </span><br><span>@@ -452,6 +460,37 @@</span><br><span>                         gsup_msg->sm_rp_rpi = (*value) ? 1 : -1;</span><br><span>                  break;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+            case OSMO_GSUP_SM_RP_DA_IE:</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* First octet contains type of address */</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (value_len < 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               LOGP(DLGSUP, LOGL_ERROR, "Short read of "</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "SM_RP_DA_IE (missing address type)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                            return -GMM_CAUSE_COND_IE_ERR;</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%);">+                   gsup_msg->sm_rp_da = value + 1; /* Skip address type */</span><br><span style="color: hsl(120, 100%, 40%);">+                    gsup_msg->sm_rp_da_len = value_len - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    gsup_msg->sm_rp_da_type = value[0];</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_SM_RP_OA_IE:</span><br><span style="color: hsl(120, 100%, 40%);">+                   /* First octet contains type of address */</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (value_len < 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               LOGP(DLGSUP, LOGL_ERROR, "Short read of "</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "SM_RP_OA_IE (missing address type)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                            return -GMM_CAUSE_COND_IE_ERR;</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%);">+                   gsup_msg->sm_rp_oa = value + 1; /* Skip address type */</span><br><span style="color: hsl(120, 100%, 40%);">+                    gsup_msg->sm_rp_oa_len = value_len - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    gsup_msg->sm_rp_oa_type = value[0];</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_SM_RP_UI_IE:</span><br><span style="color: hsl(120, 100%, 40%);">+                   gsup_msg->sm_rp_ui = value;</span><br><span style="color: hsl(120, 100%, 40%);">+                        gsup_msg->sm_rp_ui_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>@@ -659,6 +698,31 @@</span><br><span>             msgb_tlv_put(msg, OSMO_GSUP_SM_RP_RPI_IE, sizeof(u8), &u8);</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (gsup_msg->sm_rp_da) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Compose TLTV manually */</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t *buf = msgb_put(msg, TLV_GROSS_LEN(gsup_msg->sm_rp_da_len + 1));</span><br><span style="color: hsl(120, 100%, 40%);">+           *buf++ = OSMO_GSUP_SM_RP_DA_IE;</span><br><span style="color: hsl(120, 100%, 40%);">+               *buf++ = gsup_msg->sm_rp_da_len + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               *buf++ = gsup_msg->sm_rp_da_type;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (gsup_msg->sm_rp_da_len)</span><br><span style="color: hsl(120, 100%, 40%);">+                        memcpy(buf, gsup_msg->sm_rp_da, gsup_msg->sm_rp_da_len);</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%);">+   if (gsup_msg->sm_rp_oa) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Compose TLTV manually */</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t *buf = msgb_put(msg, TLV_GROSS_LEN(gsup_msg->sm_rp_oa_len + 1));</span><br><span style="color: hsl(120, 100%, 40%);">+           *buf++ = OSMO_GSUP_SM_RP_OA_IE;</span><br><span style="color: hsl(120, 100%, 40%);">+               *buf++ = gsup_msg->sm_rp_oa_len + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+               *buf++ = gsup_msg->sm_rp_oa_type;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (gsup_msg->sm_rp_oa_len)</span><br><span style="color: hsl(120, 100%, 40%);">+                        memcpy(buf, gsup_msg->sm_rp_oa, gsup_msg->sm_rp_oa_len);</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%);">+   if (gsup_msg->sm_rp_ui) {</span><br><span style="color: hsl(120, 100%, 40%);">+          msgb_tlv_put(msg, OSMO_GSUP_SM_RP_UI_IE,</span><br><span style="color: hsl(120, 100%, 40%);">+                              gsup_msg->sm_rp_ui_len, gsup_msg->sm_rp_ui);</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.err b/tests/gsup/gsup_test.err</span><br><span>index ac71ac2..389a721 100644</span><br><span>--- a/tests/gsup/gsup_test.err</span><br><span>+++ b/tests/gsup/gsup_test.err</span><br><span>@@ -72,13 +72,13 @@</span><br><span>   message 2: tested 21248 modifications, 2571 parse failures</span><br><span>   message 3: tested 2816 modifications, 510 parse failures</span><br><span>   message 4: tested 3584 modifications, 768 parse failures</span><br><span style="color: hsl(0, 100%, 40%);">-  message 5: tested 20736 modifications, 4010 parse failures</span><br><span style="color: hsl(120, 100%, 40%);">+  message 5: tested 20736 modifications, 4012 parse failures</span><br><span>   message 6: tested 3584 modifications, 769 parse failures</span><br><span>   message 7: tested 3584 modifications, 768 parse failures</span><br><span>   message 8: tested 2816 modifications, 510 parse failures</span><br><span>   message 9: tested 2816 modifications, 510 parse failures</span><br><span>   message 10: tested 3584 modifications, 768 parse failures</span><br><span style="color: hsl(0, 100%, 40%);">-  message 11: tested 3328 modifications, 767 parse failures</span><br><span style="color: hsl(120, 100%, 40%);">+  message 11: tested 3328 modifications, 769 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>   message 14: tested 5120 modifications, 1026 parse failures</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11069">change 11069</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/11069"/><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: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ibe325c64ae2d6c626b232533bb4cbc65fc2b5d71 </div>
<div style="display:none"> Gerrit-Change-Number: 11069 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>