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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Fix output of route destination in 'show ss7 instance <0-15> route'<br><br>We were printing the mask of the route, but not the point code itself.<br><br>Best would probably be to print both?<br><br>Closes: OS#3835<br>Change-Id: Ifa4fdbad953d40f222beb470a082eed8c20991ef<br>---<br>M include/osmocom/sigtran/osmo_ss7.h<br>M src/osmo_ss7.c<br>M src/osmo_ss7_vty.c<br>M tests/ss7/ss7_test.c<br>M tests/ss7/ss7_test.ok<br>5 files changed, 53 insertions(+), 1 deletion(-)<br><br></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 a97e236..f448ce7 100644</span><br><span>--- a/include/osmocom/sigtran/osmo_ss7.h</span><br><span>+++ b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>@@ -238,6 +238,7 @@</span><br><span> osmo_ss7_route_create(struct osmo_ss7_route_table *rtbl, uint32_t dpc,</span><br><span>                    uint32_t mask, const char *linkset_name);</span><br><span> void osmo_ss7_route_destroy(struct osmo_ss7_route *rt);</span><br><span style="color: hsl(120, 100%, 40%);">+const char *osmo_ss7_route_print(const struct osmo_ss7_route *rt);</span><br><span> const char *osmo_ss7_route_name(struct osmo_ss7_route *rt, bool list_asps);</span><br><span> </span><br><span> </span><br><span>diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c</span><br><span>index f8633b6..e8a6918 100644</span><br><span>--- a/src/osmo_ss7.c</span><br><span>+++ b/src/osmo_ss7.c</span><br><span>@@ -838,6 +838,48 @@</span><br><span>  talloc_free(rt);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* count number of consecutive leading (MSB) bits that are '1' */</span><br><span style="color: hsl(120, 100%, 40%);">+static unsigned int count_leading_one_bits(uint32_t inp, unsigned int nbits)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < nbits; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!(inp & (1 << (nbits-1-i))))</span><br><span style="color: hsl(120, 100%, 40%);">+                    return i;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return i;</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%);">+/* determine the mask length in number of bits; negative if non-consecutive mask */</span><br><span style="color: hsl(120, 100%, 40%);">+static int u32_masklen(uint32_t mask, unsigned int nbits)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int leading_one_bits = count_leading_one_bits(mask, nbits);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* are there any bits set after the initial bits? */</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = leading_one_bits; i < nbits; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (mask & (1 << (nbits-1-i)))</span><br><span style="color: hsl(120, 100%, 40%);">+                      return -1; /* not a simple prefix mask */</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     return leading_one_bits;</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%);">+const char *osmo_ss7_route_print(const struct osmo_ss7_route *rt)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   const struct osmo_ss7_instance *inst = rt->rtable->inst;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int pc_width = osmo_ss7_pc_width(&inst->cfg.pc_fmt);</span><br><span style="color: hsl(120, 100%, 40%);">+  static char buf[64];</span><br><span style="color: hsl(120, 100%, 40%);">+  int rc = u32_masklen(rt->cfg.mask, pc_width);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                snprintf(buf, sizeof(buf), "%s/%s", osmo_ss7_pointcode_print(inst, rt->cfg.pc),</span><br><span style="color: hsl(120, 100%, 40%);">+                   osmo_ss7_pointcode_print2(inst, rt->cfg.mask));</span><br><span style="color: hsl(120, 100%, 40%);">+   else</span><br><span style="color: hsl(120, 100%, 40%);">+          snprintf(buf, sizeof(buf), "%s/%u", osmo_ss7_pointcode_print(inst, rt->cfg.pc), rc);</span><br><span style="color: hsl(120, 100%, 40%);">+     return buf;</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> /***********************************************************************</span><br><span>  * SS7 Application Server</span><br><span>  ***********************************************************************/</span><br><span>diff --git a/src/osmo_ss7_vty.c b/src/osmo_ss7_vty.c</span><br><span>index 950eb08..cc53b05 100644</span><br><span>--- a/src/osmo_ss7_vty.c</span><br><span>+++ b/src/osmo_ss7_vty.c</span><br><span>@@ -384,7 +384,7 @@</span><br><span> </span><br><span>      llist_for_each_entry(rt, &rtbl->routes, list) {</span><br><span>               vty_out(vty, "%-22s %c %c %u %-19s %-7s %-7s %-7s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                 osmo_ss7_pointcode_print(rtbl->inst, rt->cfg.mask),</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_ss7_route_print(rt),</span><br><span>                    ' ', ' ', rt->cfg.priority, rt->cfg.linkset_name, "?", "?", "?", VTY_NEWLINE);</span><br><span>   }</span><br><span> }</span><br><span>diff --git a/tests/ss7/ss7_test.c b/tests/ss7/ss7_test.c</span><br><span>index 0c0cf25..a3f47b6 100644</span><br><span>--- a/tests/ss7/ss7_test.c</span><br><span>+++ b/tests/ss7/ss7_test.c</span><br><span>@@ -162,12 +162,14 @@</span><br><span>  /* route with full mask */</span><br><span>   OSMO_ASSERT(osmo_ss7_route_find_dpc(rtbl, 12) == NULL);</span><br><span>      rt = osmo_ss7_route_create(rtbl, 12, 0xffff, "a");</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("route with full mask: %s\n", osmo_ss7_route_print(rt));</span><br><span>    OSMO_ASSERT(rt);</span><br><span>     OSMO_ASSERT(osmo_ss7_route_find_dpc(rtbl, 12) == rt);</span><br><span>        osmo_ss7_route_destroy(rt);</span><br><span> </span><br><span>      /* route with partial mask */</span><br><span>        rt = osmo_ss7_route_create(rtbl, 8, 0xfff8, "a");</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("route with partial mask: %s\n", osmo_ss7_route_print(rt));</span><br><span>         OSMO_ASSERT(osmo_ss7_route_find_dpc(rtbl, 8) == rt);</span><br><span>         OSMO_ASSERT(osmo_ss7_route_find_dpc(rtbl, 9) == rt);</span><br><span>         OSMO_ASSERT(osmo_ss7_route_find_dpc(rtbl, 12) == rt);</span><br><span>@@ -189,6 +191,10 @@</span><br><span>         osmo_ss7_route_destroy(rt12);</span><br><span>        osmo_ss7_route_destroy(rt);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       rt = osmo_ss7_route_create(rtbl, 8, 0xfff9, "a");</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("route with non-consecutive mask: %s\n", osmo_ss7_route_print(rt));</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_ss7_route_destroy(rt);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        osmo_ss7_linkset_destroy(lset_a);</span><br><span>    osmo_ss7_linkset_destroy(lset_b);</span><br><span> }</span><br><span>diff --git a/tests/ss7/ss7_test.ok b/tests/ss7/ss7_test.ok</span><br><span>index 8aea63d..1f8c0d8 100644</span><br><span>--- a/tests/ss7/ss7_test.ok</span><br><span>+++ b/tests/ss7/ss7_test.ok</span><br><span>@@ -24,4 +24,7 @@</span><br><span> mask /24 => 16777215 (0xffffff) 255-255-255</span><br><span> Testing SS7 user</span><br><span> Testing SS7 routing</span><br><span style="color: hsl(120, 100%, 40%);">+route with full mask: 0.1.4/14</span><br><span style="color: hsl(120, 100%, 40%);">+route with partial mask: 0.1.0/11</span><br><span style="color: hsl(120, 100%, 40%);">+route with non-consecutive mask: 0.1.0/7.255.1</span><br><span> Testing SS7 linkset/link</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13233">change 13233</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/13233"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ifa4fdbad953d40f222beb470a082eed8c20991ef </div>
<div style="display:none"> Gerrit-Change-Number: 13233 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </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: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: Max <msuraev@sysmocom.de> </div>