<p>tnt has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18122">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">om2k: Add option to limit OML version during negotiation<br><br>Starting from G12R13 the MCTR swiches to BSC controlled mode. And<br>although we think we know how to configure it (via MCTR Conf Req),<br>something doesn't work right and the timeslot configuration is not<br>accepted. (TS Conf Result shows "Data not according to request").<br><br>So as a workaround for now, we use this version of the protocol where<br>we don't configure the MCTR (it's in "BTS controlled mode") and with<br>this protocol, the BTS accepts our timeslot config and we can bring<br>the system up.<br><br>This commit add a generic option to limit either OML or RSL IWD<br>version to any value. It also keeps track of the actual negotation<br>version so we can react to it in other places of the code.<br><br>Signed-off-by: Sylvain Munaut <tnt@246tNt.com><br>Change-Id: I8f0b0ba72056ea4250fe490e7a38630c77c04f65<br><br>better version limit<br><br>Change-Id: Ia789f8ede3eab7eeca6c759da0109e0b53398f60<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/abis_om2000.c<br>M src/osmo-bsc/abis_om2000_vty.c<br>3 files changed, 90 insertions(+), 8 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/22/18122/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 1d02e39..c2115a6 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1135,6 +1135,10 @@</span><br><span>                                 struct gsm_abis_mo mo;</span><br><span>                       } tf;</span><br><span>                        uint32_t use_superchannel:1;</span><br><span style="color: hsl(120, 100%, 40%);">+                  struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                              uint16_t limit;</span><br><span style="color: hsl(120, 100%, 40%);">+                               uint16_t active;</span><br><span style="color: hsl(120, 100%, 40%);">+                      } om2k_version[16];</span><br><span>          } rbs2000;</span><br><span>           struct {</span><br><span>                     uint8_t bts_type;</span><br><span>diff --git a/src/osmo-bsc/abis_om2000.c b/src/osmo-bsc/abis_om2000.c</span><br><span>index f0b989d..0175535 100644</span><br><span>--- a/src/osmo-bsc/abis_om2000.c</span><br><span>+++ b/src/osmo-bsc/abis_om2000.c</span><br><span>@@ -2447,8 +2447,8 @@</span><br><span> }</span><br><span> </span><br><span> struct iwd_version {</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t gen_char[3+1];</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t rev_char[3+1];</span><br><span style="color: hsl(120, 100%, 40%);">+        char gen_char[3+1];</span><br><span style="color: hsl(120, 100%, 40%);">+   char rev_char[3+1];</span><br><span> };</span><br><span> </span><br><span> struct iwd_type {</span><br><span>@@ -2459,11 +2459,13 @@</span><br><span> static int om2k_rx_negot_req(struct msgb *msg)</span><br><span> {</span><br><span>  struct e1inp_sign_link *sign_link = (struct e1inp_sign_link *)msg->dst;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts *bts = sign_link->trx->bts;</span><br><span>     struct abis_om2k_hdr *o2h = msgb_l2(msg);</span><br><span>    struct iwd_type iwd_types[16];</span><br><span>       uint8_t num_iwd_types = o2h->data[2];</span><br><span>     uint8_t *cur = o2h->data+3;</span><br><span style="color: hsl(0, 100%, 40%);">-  unsigned int i, v;</span><br><span style="color: hsl(120, 100%, 40%);">+    unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+       int v;</span><br><span> </span><br><span>   uint8_t out_buf[1024];</span><br><span>       uint8_t *out_cur = out_buf+1;</span><br><span>@@ -2494,25 +2496,59 @@</span><br><span>      /* Select the last version for each IWD type */</span><br><span>      for (i = 0; i < ARRAY_SIZE(iwd_types); i++) {</span><br><span>             struct iwd_type *type = &iwd_types[i];</span><br><span style="color: hsl(0, 100%, 40%);">-              struct iwd_version *last_v;</span><br><span style="color: hsl(120, 100%, 40%);">+           struct iwd_version *sel_v = NULL, *alt_v = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+              uint16_t sel_ver, alt_ver = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                int gen, rev;</span><br><span> </span><br><span>            if (type->num_vers == 0)</span><br><span>                  continue;</span><br><span> </span><br><span>                out_num_types++;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            last_v = &type->v[type->num_vers-1];</span><br><span style="color: hsl(120, 100%, 40%);">+                for (v = type->num_vers-1; v >= 0; v--) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if ((sscanf(type->v[v].gen_char, "G%2d", &gen) != 1) ||</span><br><span style="color: hsl(120, 100%, 40%);">+                          (sscanf(type->v[v].rev_char, "R%2d", &rev) != 1))</span><br><span style="color: hsl(120, 100%, 40%);">+                                continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     sel_ver = (gen << 8) | rev;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (!alt_v) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         alt_ver = sel_ver;</span><br><span style="color: hsl(120, 100%, 40%);">+                            alt_v = &type->v[v];</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 ((bts->rbs2000.om2k_version[i].limit != 0) &&</span><br><span style="color: hsl(120, 100%, 40%);">+                       (bts->rbs2000.om2k_version[i].limit < sel_ver))</span><br><span style="color: hsl(120, 100%, 40%);">+                             continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   sel_v = &type->v[v];</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%);">+             if (!sel_v) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (!alt_v) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         LOGP(DNM, LOGL_ERROR, "Couldn't find valid version for IWD Type %u."</span><br><span style="color: hsl(120, 100%, 40%);">+                                    "Skipping IWD ... this will most likely fail\n", i);</span><br><span style="color: hsl(120, 100%, 40%);">+                                continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              sel_v   = alt_v;</span><br><span style="color: hsl(120, 100%, 40%);">+                              sel_ver = alt_ver;</span><br><span style="color: hsl(120, 100%, 40%);">+                            LOGP(DNM, LOGL_ERROR, "Couldn't find suitable version for IWD Type %u."</span><br><span style="color: hsl(120, 100%, 40%);">+                                 "Fallback to Gen %s Rev %s\n", i,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   sel_v->gen_char, sel_v->rev_char);</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 style="color: hsl(120, 100%, 40%);">+           bts->rbs2000.om2k_version[i].active = sel_ver;</span><br><span> </span><br><span>                *out_cur++ = i;</span><br><span style="color: hsl(0, 100%, 40%);">-         memcpy(out_cur, last_v->gen_char, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+              memcpy(out_cur, sel_v->gen_char, 3);</span><br><span>              out_cur += 3;</span><br><span style="color: hsl(0, 100%, 40%);">-           memcpy(out_cur, last_v->rev_char, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+              memcpy(out_cur, sel_v->rev_char, 3);</span><br><span>              out_cur += 3;</span><br><span>        }</span><br><span> </span><br><span>        out_buf[0] = out_num_types;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- return abis_om2k_tx_negot_req_ack(sign_link->trx->bts, &o2h->mo, out_buf, out_cur - out_buf);</span><br><span style="color: hsl(120, 100%, 40%);">+    return abis_om2k_tx_negot_req_ack(bts, &o2h->mo, out_buf, out_cur - out_buf);</span><br><span> }</span><br><span> </span><br><span> </span><br><span>diff --git a/src/osmo-bsc/abis_om2000_vty.c b/src/osmo-bsc/abis_om2000_vty.c</span><br><span>index 972fff0..becae3f 100644</span><br><span>--- a/src/osmo-bsc/abis_om2000_vty.c</span><br><span>+++ b/src/osmo-bsc/abis_om2000_vty.c</span><br><span>@@ -467,6 +467,39 @@</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_bts_om2k_version_limit, cfg_bts_om2k_version_limit_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "om2000 version-limit (oml|rsl) gen <0-99> rev <0-99>",</span><br><span style="color: hsl(120, 100%, 40%);">+ "Configure OM2K specific parameters\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Configure optional maximum protocol version to negotiate\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Limit OML IWD version\n"</span><br><span style="color: hsl(120, 100%, 40%);">+   "Limit RSL IWD version\n"</span><br><span style="color: hsl(120, 100%, 40%);">+   "Generation limit\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Revision limit\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts *bts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+  int iwd;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (bts->type != GSM_BTS_TYPE_RBS2000) {</span><br><span style="color: hsl(120, 100%, 40%);">+           vty_out(vty, "%% Command only works for RBS2000%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                 VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         return CMD_WARNING;</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 (!strcmp(argv[0], "oml"))</span><br><span style="color: hsl(120, 100%, 40%);">+                iwd = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      else if (!strcmp(argv[0], "rsl"))</span><br><span style="color: hsl(120, 100%, 40%);">+           iwd = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+      else {</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "%% Invalid IWD%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                    VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         return CMD_WARNING;</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%);">+   bts->rbs2000.om2k_version[iwd].limit = (atoi(argv[1]) << 8) | atoi(argv[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_bts_is_conn_list, cfg_bts_is_conn_list_cmd,</span><br><span>    "is-connection-list (add|del) <0-2047> <0-2047> <0-255>",</span><br><span>        "Interface Switch Connection List\n"</span><br><span>@@ -591,6 +624,7 @@</span><br><span> {</span><br><span>    struct is_conn_group *igrp;</span><br><span>  struct con_group *cgrp;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int i;</span><br><span> </span><br><span>  llist_for_each_entry(igrp, &bts->rbs2000.is.conn_groups, list)</span><br><span>                vty_out(vty, "  is-connection-list add %u %u %u%s",</span><br><span>@@ -604,6 +638,13 @@</span><br><span>         if (bts->rbs2000.use_superchannel)</span><br><span>                vty_out(vty, "  abis-lower-transport super-channel%s",</span><br><span>                     VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < 2; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+            if (bts->rbs2000.om2k_version[i].limit)</span><br><span style="color: hsl(120, 100%, 40%);">+                    vty_out(vty, "  om2000 version-limit %s gen %02d rev %02d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                               i ? "rsl" : "oml",</span><br><span style="color: hsl(120, 100%, 40%);">+                                (bts->rbs2000.om2k_version[i].limit >> 8),</span><br><span style="color: hsl(120, 100%, 40%);">+                           (bts->rbs2000.om2k_version[i].limit & 0xff),</span><br><span style="color: hsl(120, 100%, 40%);">+                           VTY_NEWLINE);</span><br><span> }</span><br><span> </span><br><span> int abis_om2k_vty_init(void)</span><br><span>@@ -631,6 +672,7 @@</span><br><span> </span><br><span>     install_element(BTS_NODE, &cfg_bts_is_conn_list_cmd);</span><br><span>    install_element(BTS_NODE, &cfg_bts_alt_mode_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(BTS_NODE, &cfg_bts_om2k_version_limit_cmd);</span><br><span>      install_element(BTS_NODE, &cfg_om2k_con_group_cmd);</span><br><span>      install_element(BTS_NODE, &del_om2k_con_group_cmd);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18122">change 18122</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/osmo-bsc/+/18122"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia789f8ede3eab7eeca6c759da0109e0b53398f60 </div>
<div style="display:none"> Gerrit-Change-Number: 18122 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>