<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>