<p>Neels Hofmeyr <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13147">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Pau Espin Pedrol: Looks good to me, but someone else must approve
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">osmo-hnbgw: reply with RESET ACK when receiving a RESET<br><br>Rationale: current osmo-msc refactoring introduces RESET handling on IuCS.<br><br>In particular, it makes osmo-hnbgw be able to operate with an (upcoming)<br>osmo-msc that has strict RESET handling: it will send a RESET and require a<br>RESET ACK if it sees a new IuCS peer sending messages without prior RESET.<br><br>Even though a workaround to ignore missing RESET messages on IuCS will also be<br>in place in the new osmo-msc, this is a first small step towards more sane<br>RESET handling in osmo-hnbgw.<br><br>Related: OS#3820<br>Change-Id: I02bc74ef9fef61f4490b4d4dc3ce6c0a6d965909<br>---<br>M src/hnbgw_cn.c<br>1 file changed, 42 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/hnbgw_cn.c b/src/hnbgw_cn.c</span><br><span>index 875a0d0..0623561 100644</span><br><span>--- a/src/hnbgw_cn.c</span><br><span>+++ b/src/hnbgw_cn.c</span><br><span>@@ -63,6 +63,23 @@</span><br><span>                                        msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int transmit_reset_ack(struct hnb_gw *gw, RANAP_CN_DomainIndicator_t domain,</span><br><span style="color: hsl(120, 100%, 40%);">+                        const struct osmo_sccp_addr *remote_addr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DRANAP, LOGL_NOTICE, "Tx RESET ACK to %s %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+             domain == CN_DomainIndicator_cs_domain ? "IuCS" : "IuPS",</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_sccp_inst_addr_name(gw->sccp.cnlink->sccp, remote_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   msg = ranap_new_msg_reset_ack(domain, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return osmo_sccp_tx_unitdata_msg(gw->sccp.cnlink->sccp_user,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     &gw->sccp.local_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  remote_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Timer callback once T_RafC expires */</span><br><span> static void cnlink_trafc_cb(void *data)</span><br><span> {</span><br><span>@@ -99,15 +116,28 @@</span><br><span>  ***********************************************************************/</span><br><span> </span><br><span> static int cn_ranap_rx_reset_cmd(struct hnbgw_cnlink *cnlink,</span><br><span style="color: hsl(120, 100%, 40%);">+                               const struct osmo_scu_unitdata_param *unitdata,</span><br><span>                              RANAP_InitiatingMessage_t *imsg)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+        CN_DomainIndicator_t domain;</span><br><span>         RANAP_ResetIEs_t ies;</span><br><span>        int rc;</span><br><span> </span><br><span>  rc = ranap_decode_reseties(&ies, &imsg->value);</span><br><span style="color: hsl(0, 100%, 40%);">-      /* FIXME: reset resources and return reset ack */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+     domain = ies.cN_DomainIndicator;</span><br><span>     ranap_free_reseties(&ies);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DRANAP, LOGL_NOTICE, "Rx RESET from %s %s, returning ACK\n",</span><br><span style="color: hsl(120, 100%, 40%);">+        domain == CN_DomainIndicator_cs_domain ? "IuCS" : "IuPS",</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_sccp_inst_addr_name(cnlink->sccp, &unitdata->calling_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* FIXME: actually reset connections, if any */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (transmit_reset_ack(cnlink->gw, domain, &unitdata->calling_addr))</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DRANAP, LOGL_ERROR, "Error: cannot send RESET ACK to %s %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              domain == CN_DomainIndicator_cs_domain ? "IuCS" : "IuPS",</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_sccp_inst_addr_name(cnlink->sccp, &unitdata->calling_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   return rc;</span><br><span> }</span><br><span> </span><br><span>@@ -149,12 +179,13 @@</span><br><span> }</span><br><span> </span><br><span> static int cn_ranap_rx_initiating_msg(struct hnbgw_cnlink *cnlink,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  const struct osmo_scu_unitdata_param *unitdata,</span><br><span>                                      RANAP_InitiatingMessage_t *imsg,</span><br><span>                                     const uint8_t *data, unsigned int len)</span><br><span> {</span><br><span>    switch (imsg->procedureCode) {</span><br><span>    case RANAP_ProcedureCode_id_Reset:</span><br><span style="color: hsl(0, 100%, 40%);">-              return cn_ranap_rx_reset_cmd(cnlink, imsg);</span><br><span style="color: hsl(120, 100%, 40%);">+           return cn_ranap_rx_reset_cmd(cnlink, unitdata, imsg);</span><br><span>        case RANAP_ProcedureCode_id_Paging:</span><br><span>          return cn_ranap_rx_paging_cmd(cnlink, imsg, data, len);</span><br><span>      case RANAP_ProcedureCode_id_OverloadControl: /* Overload ind */</span><br><span>@@ -198,14 +229,15 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int _cn_ranap_rx(struct hnbgw_cnlink *cnlink, RANAP_RANAP_PDU_t *pdu,</span><br><span style="color: hsl(0, 100%, 40%);">-                        const uint8_t *data, unsigned int len)</span><br><span style="color: hsl(120, 100%, 40%);">+static int _cn_ranap_rx(struct hnbgw_cnlink *cnlink,</span><br><span style="color: hsl(120, 100%, 40%);">+                  const struct osmo_scu_unitdata_param *unitdata,</span><br><span style="color: hsl(120, 100%, 40%);">+                       RANAP_RANAP_PDU_t *pdu, const uint8_t *data, unsigned int len)</span><br><span> {</span><br><span>  int rc;</span><br><span> </span><br><span>  switch (pdu->present) {</span><br><span>   case RANAP_RANAP_PDU_PR_initiatingMessage:</span><br><span style="color: hsl(0, 100%, 40%);">-              rc = cn_ranap_rx_initiating_msg(cnlink, &pdu->choice.initiatingMessage,</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = cn_ranap_rx_initiating_msg(cnlink, unitdata, &pdu->choice.initiatingMessage,</span><br><span>                                             data, len);</span><br><span>          break;</span><br><span>       case RANAP_RANAP_PDU_PR_successfulOutcome:</span><br><span>@@ -227,8 +259,8 @@</span><br><span>     return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int handle_cn_ranap(struct hnbgw_cnlink *cnlink, const uint8_t *data,</span><br><span style="color: hsl(0, 100%, 40%);">-                    unsigned int len)</span><br><span style="color: hsl(120, 100%, 40%);">+static int handle_cn_ranap(struct hnbgw_cnlink *cnlink, const struct osmo_scu_unitdata_param *unitdata,</span><br><span style="color: hsl(120, 100%, 40%);">+                    const uint8_t *data, unsigned int len)</span><br><span> {</span><br><span>       RANAP_RANAP_PDU_t _pdu, *pdu = &_pdu;</span><br><span>    asn_dec_rval_t dec_ret;</span><br><span>@@ -242,7 +274,7 @@</span><br><span>                return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rc = _cn_ranap_rx(cnlink, pdu, data, len);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = _cn_ranap_rx(cnlink, unitdata, pdu, data, len);</span><br><span> </span><br><span>     return rc;</span><br><span> }</span><br><span>@@ -286,7 +318,7 @@</span><br><span>        if (classify_cn_remote_addr(cnlink->gw, &param->calling_addr, NULL) < 0)</span><br><span>                return -1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  return handle_cn_ranap(cnlink, msgb_l2(oph->msg), msgb_l2len(oph->msg));</span><br><span style="color: hsl(120, 100%, 40%);">+        return handle_cn_ranap(cnlink, param, msgb_l2(oph->msg), msgb_l2len(oph->msg));</span><br><span> }</span><br><span> </span><br><span> static int handle_cn_conn_conf(struct hnbgw_cnlink *cnlink,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13147">change 13147</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/13147"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-iuh </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I02bc74ef9fef61f4490b4d4dc3ce6c0a6d965909 </div>
<div style="display:none"> Gerrit-Change-Number: 13147 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: 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: Pau Espin Pedrol <pespin@sysmocom.de> </div>