<p>Harald Welte has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12874">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">OML: Ensure minimum required attributes are set before accepting OPSTART<br><br>There are some vital configuration bits such as ARFCN, BSIC, channel<br>config, .. for which there are no reasonable defaults.  As a result,<br>the BSC must set those attributes before issuing OPSTART.<br><br>Prior to this patch we would blindly accept OPSTART and then transmit<br>on ARFCN 0, which is definitely not the intended behavior.<br><br>Closes: OS#3789<br>Change-Id: I3a818f8eceb6abef1b20d2b3892a749dbc9e4b05<br>---<br>M src/common/oml.c<br>1 file changed, 53 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/74/12874/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/common/oml.c b/src/common/oml.c</span><br><span>index 1de8054..560c262 100644</span><br><span>--- a/src/common/oml.c</span><br><span>+++ b/src/common/oml.c</span><br><span>@@ -993,6 +993,54 @@</span><br><span>     return bts_model_apply_oml(bts, msg, tp_merged, NM_OC_CHANNEL, ts);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* return a list of mandatory attributes for given object class */</span><br><span style="color: hsl(120, 100%, 40%);">+static unsigned int get_mand_attr_for_obj_class(uint8_t obj_class, const uint8_t **attr)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ static const uint8_t bts_mand_attr[] = { NM_ATT_BCCH_ARFCN, NM_ATT_BSIC };</span><br><span style="color: hsl(120, 100%, 40%);">+    static const uint8_t trx_mand_attr[] = { NM_ATT_ARFCN_LIST, NM_ATT_RF_MAXPOWR_R };</span><br><span style="color: hsl(120, 100%, 40%);">+    static const uint8_t ts_mand_attr[] = { NM_ATT_CHAN_COMB };</span><br><span style="color: hsl(120, 100%, 40%);">+   static const uint8_t nse_mand_attr[] = { NM_ATT_IPACC_NSEI };</span><br><span style="color: hsl(120, 100%, 40%);">+ static const uint8_t cell_mand_attr[] = { NM_ATT_IPACC_BVCI, NM_ATT_IPACC_RAC };</span><br><span style="color: hsl(120, 100%, 40%);">+      static const uint8_t nsvc_mand_attr[] = { NM_ATT_IPACC_NSVCI, NM_ATT_IPACC_NS_LINK_CFG };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (obj_class) {</span><br><span style="color: hsl(120, 100%, 40%);">+  case NM_OC_BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               *attr = bts_mand_attr;</span><br><span style="color: hsl(120, 100%, 40%);">+                return sizeof(bts_mand_attr);</span><br><span style="color: hsl(120, 100%, 40%);">+ case NM_OC_RADIO_CARRIER:</span><br><span style="color: hsl(120, 100%, 40%);">+             *attr = trx_mand_attr;</span><br><span style="color: hsl(120, 100%, 40%);">+                return sizeof(trx_mand_attr);</span><br><span style="color: hsl(120, 100%, 40%);">+ case NM_OC_CHANNEL:</span><br><span style="color: hsl(120, 100%, 40%);">+           *attr = ts_mand_attr;</span><br><span style="color: hsl(120, 100%, 40%);">+         return sizeof(ts_mand_attr);</span><br><span style="color: hsl(120, 100%, 40%);">+  case NM_OC_GPRS_NSE:</span><br><span style="color: hsl(120, 100%, 40%);">+          *attr = nse_mand_attr;</span><br><span style="color: hsl(120, 100%, 40%);">+                return sizeof(nse_mand_attr);</span><br><span style="color: hsl(120, 100%, 40%);">+ case NM_OC_GPRS_CELL:</span><br><span style="color: hsl(120, 100%, 40%);">+         *attr = cell_mand_attr;</span><br><span style="color: hsl(120, 100%, 40%);">+               return sizeof(cell_mand_attr);</span><br><span style="color: hsl(120, 100%, 40%);">+        case NM_OC_GPRS_NSVC:</span><br><span style="color: hsl(120, 100%, 40%);">+         *attr = nsvc_mand_attr;</span><br><span style="color: hsl(120, 100%, 40%);">+               return sizeof(nsvc_mand_attr);</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return 0;</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%);">+/* Verify if a given OML MO has the minimal attributes set to enable it */</span><br><span style="color: hsl(120, 100%, 40%);">+static bool oml_mo_has_minimal_attributes(const struct gsm_abis_mo *mo)</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%);">+       const uint8_t *mand_attr = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned int num_mand_attr = get_mand_attr_for_obj_class(mo->obj_class, &mand_attr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < num_mand_attr; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!mo->nm_attr || !TLVP_PRESENT(mo->nm_attr, mand_attr[i]))</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%);">+     return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* 8.9.2 Opstart has been received */</span><br><span> static int oml_rx_opstart(struct gsm_bts *bts, struct msgb *msg)</span><br><span> {</span><br><span>@@ -1015,7 +1063,11 @@</span><br><span>                 return oml_mo_opstart_ack(mo);</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Step 3: Ask BTS driver to apply the opstart */</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Step 3: Check if all mandatory minimum attributes have been set */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!oml_mo_has_minimal_attributes(mo))</span><br><span style="color: hsl(120, 100%, 40%);">+               return oml_fom_ack_nack(msg, NM_NACK_CANT_PERFORM);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Step 4: Ask BTS driver to apply the opstart */</span><br><span>    return bts_model_opstart(bts, mo, obj);</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12874">change 12874</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/12874"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I3a818f8eceb6abef1b20d2b3892a749dbc9e4b05 </div>
<div style="display:none"> Gerrit-Change-Number: 12874 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>