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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">libmsc/gsm_04_11.c: properly handle MMTS indication<br><br>According to 3GPP TS 29.002, section 7.6.8.7, MMS (More Messages to Send)<br>is an optional IE of MT-ForwardSM-Req message which is used by SMSC to<br>indicate that there are more (multi-part) MT SMS messages to be sent.<br><br>The MSC needs to use this indication in order to decide whether to<br>keep the RAN connection with a given subscriber open.<br><br>Related Change-Id: (TTCN) I6308586a70c4fb3254c519330a61a9667372149f<br>Change-Id: Ic46b04913b2e8cc5d11a39426dcc1bfe11f1d31e<br>Related: OS#3587<br>---<br>M include/osmocom/msc/gsm_04_11.h<br>M include/osmocom/msc/msc_a.h<br>M include/osmocom/msc/transaction.h<br>M src/libmsc/gsm_04_11.c<br>M src/libmsc/gsm_04_11_gsup.c<br>5 files changed, 47 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/gsm_04_11.h b/include/osmocom/msc/gsm_04_11.h</span><br><span>index be8bff3..c504c7f 100644</span><br><span>--- a/include/osmocom/msc/gsm_04_11.h</span><br><span>+++ b/include/osmocom/msc/gsm_04_11.h</span><br><span>@@ -45,7 +45,8 @@</span><br><span>                struct gsm_sms *sms);</span><br><span> int gsm411_send_rp_data(struct gsm_network *net, struct vlr_subscr *vsub,</span><br><span>                       size_t sm_rp_oa_len, const uint8_t *sm_rp_oa,</span><br><span style="color: hsl(0, 100%, 40%);">-                   size_t sm_rp_ud_len, const uint8_t *sm_rp_ud);</span><br><span style="color: hsl(120, 100%, 40%);">+                        size_t sm_rp_ud_len, const uint8_t *sm_rp_ud,</span><br><span style="color: hsl(120, 100%, 40%);">+                 bool sm_rp_mmts_ind);</span><br><span> </span><br><span> void gsm411_sapi_n_reject(struct msc_a *msc_a);</span><br><span> </span><br><span>diff --git a/include/osmocom/msc/msc_a.h b/include/osmocom/msc/msc_a.h</span><br><span>index c732695..a4d3226 100644</span><br><span>--- a/include/osmocom/msc/msc_a.h</span><br><span>+++ b/include/osmocom/msc/msc_a.h</span><br><span>@@ -45,6 +45,7 @@</span><br><span> #define MSC_A_USE_PAGING_RESPONSE      "paging-response"</span><br><span> #define MSC_A_USE_CC             "cc"</span><br><span> #define MSC_A_USE_SMS         "sms"</span><br><span style="color: hsl(120, 100%, 40%);">+#define MSC_A_USE_SMS_MMTS     "sms_mmts"</span><br><span> #define MSC_A_USE_NC_SS         "nc_ss"</span><br><span> #define MSC_A_USE_SILENT_CALL      "silent_call"</span><br><span> </span><br><span>diff --git a/include/osmocom/msc/transaction.h b/include/osmocom/msc/transaction.h</span><br><span>index 9278b64..ba609ea 100644</span><br><span>--- a/include/osmocom/msc/transaction.h</span><br><span>+++ b/include/osmocom/msc/transaction.h</span><br><span>@@ -110,6 +110,8 @@</span><br><span> </span><br><span>                       /* SM-RP-MR, Message Reference (see GSM TS 04.11, section 8.2.3) */</span><br><span>                  uint8_t sm_rp_mr;</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* More Messages to Send (see 3GPP TS 29.002, section 7.6.8.7) */</span><br><span style="color: hsl(120, 100%, 40%);">+                     bool sm_rp_mmts_ind;</span><br><span> </span><br><span>                     struct gsm_sms *sms;</span><br><span>                 } sms;</span><br><span>diff --git a/src/libmsc/gsm_04_11.c b/src/libmsc/gsm_04_11.c</span><br><span>index a3b3830..3a3ec8c 100644</span><br><span>--- a/src/libmsc/gsm_04_11.c</span><br><span>+++ b/src/libmsc/gsm_04_11.c</span><br><span>@@ -129,6 +129,28 @@</span><br><span>   return msc_a_tx_dtap_to_i(trans->msc_a, msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Handle MMTS (More Messages to Send) indication */</span><br><span style="color: hsl(120, 100%, 40%);">+static void gsm411_handle_mmts_ind(const struct gsm_trans *trans)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int32_t use_count;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(trans);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(trans->msc_a);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       use_count = osmo_use_count_by(&trans->msc_a->use_count, MSC_A_USE_SMS_MMTS);</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(use_count >= 0); /* Shall not be negative */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trans->sms.sm_rp_mmts_ind && use_count == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOG_TRANS(trans, LOGL_INFO, "Multi-part SMS delivery is initiated\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              msc_a_get(trans->msc_a, MSC_A_USE_SMS_MMTS);</span><br><span style="color: hsl(120, 100%, 40%);">+       } else if (trans->sms.sm_rp_mmts_ind && use_count > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOG_TRANS(trans, LOGL_INFO, "Continuing multi-part SMS delivery\n");</span><br><span style="color: hsl(120, 100%, 40%);">+        } else if (!trans->sms.sm_rp_mmts_ind && use_count > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+               LOG_TRANS(trans, LOGL_INFO, "Multi-part SMS delivery has been completed\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                msc_a_put(trans->msc_a, MSC_A_USE_SMS_MMTS);</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%);">+</span><br><span> /* Paging callback for MT SMS (Paging is triggered by SMC) */</span><br><span> static void mmsms_paging_cb(struct msc_a *msc_a, struct gsm_trans *trans)</span><br><span> {</span><br><span>@@ -141,6 +163,10 @@</span><br><span>             /* Associate transaction with established connection */</span><br><span>              msc_a_get(msc_a, MSC_A_USE_SMS);</span><br><span>             trans->msc_a = msc_a;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Multi-part SMS: handle MMTS (More Messages to Send) indication */</span><br><span style="color: hsl(120, 100%, 40%);">+          gsm411_handle_mmts_ind(trans);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>             /* Confirm successful connection establishment */</span><br><span>            gsm411_smc_recv(&trans->sms.smc_inst, GSM411_MMSMS_EST_CNF, NULL, 0);</span><br><span>         } else {</span><br><span>@@ -1180,7 +1206,8 @@</span><br><span> /* Low-level function to send raw RP-DATA to a given subscriber */</span><br><span> int gsm411_send_rp_data(struct gsm_network *net, struct vlr_subscr *vsub,</span><br><span>                  size_t sm_rp_oa_len, const uint8_t *sm_rp_oa,</span><br><span style="color: hsl(0, 100%, 40%);">-                   size_t sm_rp_ud_len, const uint8_t *sm_rp_ud)</span><br><span style="color: hsl(120, 100%, 40%);">+                 size_t sm_rp_ud_len, const uint8_t *sm_rp_ud,</span><br><span style="color: hsl(120, 100%, 40%);">+                 bool sm_rp_mmts_ind)</span><br><span> {</span><br><span>    struct gsm_trans *trans;</span><br><span>     struct msgb *msg;</span><br><span>@@ -1190,6 +1217,11 @@</span><br><span>   if (!trans)</span><br><span>          return -ENOMEM;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* Multi-part SMS: handle MMTS (More Messages to Send) indication */</span><br><span style="color: hsl(120, 100%, 40%);">+  trans->sms.sm_rp_mmts_ind = sm_rp_mmts_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (trans->msc_a != NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+          gsm411_handle_mmts_ind(trans);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     /* Allocate a message buffer for to be encoded SMS */</span><br><span>        msg = gsm411_msgb_alloc();</span><br><span>   if (!msg) {</span><br><span>diff --git a/src/libmsc/gsm_04_11_gsup.c b/src/libmsc/gsm_04_11_gsup.c</span><br><span>index 9f5175b..a1ec634 100644</span><br><span>--- a/src/libmsc/gsm_04_11_gsup.c</span><br><span>+++ b/src/libmsc/gsm_04_11_gsup.c</span><br><span>@@ -234,6 +234,7 @@</span><br><span>   const struct osmo_gsup_message *gsup_msg)</span><br><span> {</span><br><span>       struct gsm_network *net;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool sm_rp_mmts_ind;</span><br><span>         int rc;</span><br><span> </span><br><span>  /* Obtain required pointers */</span><br><span>@@ -267,10 +268,17 @@</span><br><span>       if (gsup_msg->sm_rp_oa_type != OSMO_GSUP_SMS_SM_RP_ODA_SMSC_ADDR)</span><br><span>                 goto msg_error;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* MMS (More Messages to Send) IE is optional */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (gsup_msg->sm_rp_mms)</span><br><span style="color: hsl(120, 100%, 40%);">+           sm_rp_mmts_ind = *gsup_msg->sm_rp_mms > 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          sm_rp_mmts_ind = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* Send RP-DATA */</span><br><span>   rc = gsm411_send_rp_data(net, vsub,</span><br><span>          gsup_msg->sm_rp_oa_len, gsup_msg->sm_rp_oa,</span><br><span style="color: hsl(0, 100%, 40%);">-               gsup_msg->sm_rp_ui_len, gsup_msg->sm_rp_ui);</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%);">+             sm_rp_mmts_ind);</span><br><span>     if (rc) {</span><br><span>            LOGP(DLSMS, LOGL_NOTICE, "Failed to send MT SMS, "</span><br><span>                         "ignoring MT-forwardSM-Req message...\n");</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12059">change 12059</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/12059"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ic46b04913b2e8cc5d11a39426dcc1bfe11f1d31e </div>
<div style="display:none"> Gerrit-Change-Number: 12059 </div>
<div style="display:none"> Gerrit-PatchSet: 11 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Assignee: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </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>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>