<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/15885">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">M3UA: Reject ASP activation + RKM registration for incompatible traffic-mode<br><br>If the AS is e.g. configured as broadcast, then individual ASPs cannot<br>be activated in loadshare or override.  Everyone must agree.<br><br>Change-Id: Ic73410fbc88d50710202453f759fa132ce14db4c<br>---<br>M include/osmocom/sigtran/osmo_ss7.h<br>M src/osmo_ss7.c<br>M src/xua_asp_fsm.c<br>M src/xua_rkm.c<br>4 files changed, 44 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/85/15885/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>index 1b5fc31..11eac81 100644</span><br><span>--- a/include/osmocom/sigtran/osmo_ss7.h</span><br><span>+++ b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>@@ -525,6 +525,7 @@</span><br><span> </span><br><span> enum osmo_ss7_as_traffic_mode osmo_ss7_tmode_from_xua(uint32_t in);</span><br><span> int osmo_ss7_tmode_to_xua(enum osmo_ss7_as_traffic_mode tmod);</span><br><span style="color: hsl(120, 100%, 40%);">+bool osmo_ss7_tmode_compatible_xua(enum osmo_ss7_as_traffic_mode tmt, uint32_t m3ua_tmt);</span><br><span> </span><br><span> /* VTY related */</span><br><span> struct vty;</span><br><span>diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c</span><br><span>index efbceb8..0c1d2c5 100644</span><br><span>--- a/src/osmo_ss7.c</span><br><span>+++ b/src/osmo_ss7.c</span><br><span>@@ -2059,6 +2059,28 @@</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+bool osmo_ss7_tmode_compatible_xua(enum osmo_ss7_as_traffic_mode tmt, uint32_t m3ua_tmt)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       switch (m3ua_tmt) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case M3UA_TMOD_OVERRIDE:</span><br><span style="color: hsl(120, 100%, 40%);">+              if (tmt == OSMO_SS7_AS_TMOD_OVERRIDE)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case M3UA_TMOD_LOADSHARE:</span><br><span style="color: hsl(120, 100%, 40%);">+             if (tmt == OSMO_SS7_AS_TMOD_LOADSHARE ||</span><br><span style="color: hsl(120, 100%, 40%);">+                  tmt == OSMO_SS7_AS_TMOD_ROUNDROBIN)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case M3UA_TMOD_BCAST:</span><br><span style="color: hsl(120, 100%, 40%);">+         if (tmt == OSMO_SS7_AS_TMOD_BCAST)</span><br><span style="color: hsl(120, 100%, 40%);">+                    return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</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%);">+     return false;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static osmo_ss7_asp_rx_unknown_cb *g_osmo_ss7_asp_rx_unknown_cb;</span><br><span> </span><br><span> int ss7_asp_rx_unknown(struct osmo_ss7_asp *asp, int ppid_mux, struct msgb *msg)</span><br><span>diff --git a/src/xua_asp_fsm.c b/src/xua_asp_fsm.c</span><br><span>index 890a6b5..011156a 100644</span><br><span>--- a/src/xua_asp_fsm.c</span><br><span>+++ b/src/xua_asp_fsm.c</span><br><span>@@ -416,9 +416,8 @@</span><br><span>        struct xua_asp_fsm_priv *xafp = fi->priv;</span><br><span>         struct osmo_ss7_asp *asp = xafp->asp;</span><br><span>     struct xua_msg *xua_in;</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t traf_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t traf_mode = 0;</span><br><span>      struct xua_msg_part *part;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint32_t rctx;</span><br><span>       int i;</span><br><span> </span><br><span>   check_stop_t_ack(fi, event);</span><br><span>@@ -462,11 +461,20 @@</span><br><span>                 }</span><br><span>            if ((part = xua_msg_find_tag(xua_in, M3UA_IEI_ROUTE_CTX))) {</span><br><span>                         for (i = 0; i < part->len / sizeof(uint32_t); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              rctx = osmo_load32be(&part->dat[i * sizeof(uint32_t)]);</span><br><span style="color: hsl(0, 100%, 40%);">-                          if (!osmo_ss7_as_find_by_rctx(asp->inst, rctx)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          uint32_t rctx = osmo_load32be(&part->dat[i * sizeof(uint32_t)]);</span><br><span style="color: hsl(120, 100%, 40%);">+                               struct osmo_ss7_as *as = osmo_ss7_as_find_by_rctx(asp->inst, rctx);</span><br><span style="color: hsl(120, 100%, 40%);">+                                if (!as) {</span><br><span>                                   peer_send_error(fi, M3UA_ERR_INVAL_ROUT_CTX);</span><br><span>                                        break;</span><br><span>                               }</span><br><span style="color: hsl(120, 100%, 40%);">+                             if (traf_mode) { /* if the peer has specified a traffic mode at all */</span><br><span style="color: hsl(120, 100%, 40%);">+                                        /* Check if given AS(s) are configured for the respective</span><br><span style="color: hsl(120, 100%, 40%);">+                                      * traffic mode type; send ERROR if not */</span><br><span style="color: hsl(120, 100%, 40%);">+                                    if (!osmo_ss7_tmode_compatible_xua(as->cfg.mode, traf_mode)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                             peer_send_error(fi, M3UA_ERR_UNSUPP_TRAF_MOD_TYP);</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%);">+                             }</span><br><span>                    }</span><br><span>            }</span><br><span>            /* send ACK */</span><br><span>diff --git a/src/xua_rkm.c b/src/xua_rkm.c</span><br><span>index b3c785f..208f8ae 100644</span><br><span>--- a/src/xua_rkm.c</span><br><span>+++ b/src/xua_rkm.c</span><br><span>@@ -219,6 +219,15 @@</span><br><span>               }</span><br><span>            if (!as->cfg.mode_set_by_vty && _tmode)</span><br><span>                   as->cfg.mode = osmo_ss7_tmode_from_xua(_tmode);</span><br><span style="color: hsl(120, 100%, 40%);">+            else if (_tmode) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    /* verify if existing AS has same traffic-mode as new request (if any) */</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (!osmo_ss7_tmode_compatible_xua(as->cfg.mode, _tmode)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                LOGPASP(asp, DLSS7, LOGL_NOTICE, "RKM: Non-matching Traffic Mode %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                     _tmode);</span><br><span style="color: hsl(120, 100%, 40%);">+                              msgb_append_reg_res(resp, rk_id, M3UA_RKM_REG_ERR_UNSUPP_TRAF_MODE, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                               return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>    } else if (asp->inst->cfg.permit_dyn_rkm_alloc) {</span><br><span>              /* Create an AS for this routing key */</span><br><span>              snprintf(namebuf, sizeof(namebuf), "as-rkm-%u", rctx);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/15885">change 15885</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/c/libosmo-sccp/+/15885"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-sccp </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic73410fbc88d50710202453f759fa132ce14db4c </div>
<div style="display:none"> Gerrit-Change-Number: 15885 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>