<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21502">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  fixeria: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Handle BTS/BBTRANSC Get Attributes (Ack) in NM FSMs<br><br>Before this patch, Get Attributes was sent quicklyafter the OML link<br>became up, even if the BTS/BB_TRANSC objects were still powered off,<br>which is wrong since attributes should only be available after the<br>objects transition out of the Power off state.<br><br>Furthermore, information about get attr response already received will<br>be required in future patches to delay NSVC setting.<br><br>Related: OS#4870<br>Change-Id: I8ec39c7e1f956ffce9aecd58a5590c43200ba086<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M include/osmocom/bsc/nm_common_fsm.h<br>M src/osmo-bsc/bts_ipaccess_nanobts.c<br>M src/osmo-bsc/nm_bb_transc_fsm.c<br>M src/osmo-bsc/nm_bts_fsm.c<br>M src/osmo-bsc/nm_common_fsm.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>7 files changed, 97 insertions(+), 24 deletions(-)<br><br></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 d8f8be2..6904266 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -399,6 +399,8 @@</span><br><span>         struct osmo_fsm_inst *fi;</span><br><span>    bool opstart_sent;</span><br><span>   bool adm_unlock_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool get_attr_sent;</span><br><span style="color: hsl(120, 100%, 40%);">+   bool get_attr_rep_received;</span><br><span>  bool set_attr_sent;</span><br><span>  bool set_attr_ack_received;</span><br><span>  bool force_rf_lock;</span><br><span>diff --git a/include/osmocom/bsc/nm_common_fsm.h b/include/osmocom/bsc/nm_common_fsm.h</span><br><span>index 7ad3df6..bceefbe 100644</span><br><span>--- a/include/osmocom/bsc/nm_common_fsm.h</span><br><span>+++ b/include/osmocom/bsc/nm_common_fsm.h</span><br><span>@@ -30,6 +30,7 @@</span><br><span> enum nm_fsm_events {</span><br><span>     NM_EV_SW_ACT_REP,</span><br><span>    NM_EV_STATE_CHG_REP,</span><br><span style="color: hsl(120, 100%, 40%);">+  NM_EV_GET_ATTR_REP,</span><br><span>  NM_EV_SET_ATTR_ACK,</span><br><span>  NM_EV_OPSTART_ACK,</span><br><span>   NM_EV_OPSTART_NACK,</span><br><span>diff --git a/src/osmo-bsc/bts_ipaccess_nanobts.c b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>index 6d8f91f..c84d750 100644</span><br><span>--- a/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>+++ b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>@@ -339,6 +339,27 @@</span><br><span>  }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void nm_rx_get_attr_rep(struct msgb *oml_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct abis_om_fom_hdr *foh = msgb_l3(oml_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct e1inp_sign_link *sign_link = oml_msg->dst;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts *bts = sign_link->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    switch (foh->obj_class) {</span><br><span style="color: hsl(120, 100%, 40%);">+  case NM_OC_BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_GET_ATTR_REP, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NM_OC_BASEB_TRANSC:</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!(trx = gsm_bts_trx_num(bts, foh->obj_inst.trx_nr)))</span><br><span style="color: hsl(120, 100%, 40%);">+                   return;</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_fsm_inst_dispatch(trx->bb_transc.mo.fi, NM_EV_GET_ATTR_REP, NULL);</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%);">+              LOGPFOH(DNM, LOGL_ERROR, foh, "Get Attributes Response received on incorrect object class %d!\n", foh->obj_class);</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> static void nm_rx_set_bts_attr_ack(struct msgb *oml_msg)</span><br><span> {</span><br><span>      struct abis_om_fom_hdr *foh = msgb_l3(oml_msg);</span><br><span>@@ -432,6 +453,9 @@</span><br><span>        case S_NM_OPSTART_NACK:</span><br><span>              nm_rx_opstart_nack(signal_data);</span><br><span>             return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     case S_NM_GET_ATTR_REP:</span><br><span style="color: hsl(120, 100%, 40%);">+               nm_rx_get_attr_rep(signal_data);</span><br><span style="color: hsl(120, 100%, 40%);">+              return 0;</span><br><span>    case S_NM_SET_BTS_ATTR_ACK:</span><br><span>          nm_rx_set_bts_attr_ack(signal_data);</span><br><span>                 return 0;</span><br><span>diff --git a/src/osmo-bsc/nm_bb_transc_fsm.c b/src/osmo-bsc/nm_bb_transc_fsm.c</span><br><span>index e7132e8..31e5f34 100644</span><br><span>--- a/src/osmo-bsc/nm_bb_transc_fsm.c</span><br><span>+++ b/src/osmo-bsc/nm_bb_transc_fsm.c</span><br><span>@@ -48,6 +48,8 @@</span><br><span> {</span><br><span>  struct gsm_bts_bb_trx *bb_transc = (struct gsm_bts_bb_trx *)fi->priv;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  bb_transc->mo.get_attr_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+       bb_transc->mo.get_attr_rep_received = false;</span><br><span>      bb_transc->mo.adm_unlock_sent = false;</span><br><span>    bb_transc->mo.opstart_sent = false;</span><br><span> }</span><br><span>@@ -87,7 +89,20 @@</span><br><span> static void configure_loop(struct gsm_bts_bb_trx *bb_transc, struct gsm_nm_state *state, bool allow_opstart)</span><br><span> {</span><br><span>        struct gsm_bts_trx *trx = gsm_bts_bb_trx_get_trx(bb_transc);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (state->administrative != NM_STATE_UNLOCKED && !bb_transc->mo.adm_unlock_sent) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Request TRX-level attributes */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bb_transc->mo.get_attr_sent && !bb_transc->mo.get_attr_rep_received) {</span><br><span style="color: hsl(120, 100%, 40%);">+             bb_transc->mo.get_attr_sent = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* N. B: we rely on attribute order when parsing response in abis_nm_rx_get_attr_resp() */</span><br><span style="color: hsl(120, 100%, 40%);">+            const uint8_t trx_attr[] = { NM_ATT_MANUF_STATE, NM_ATT_SW_CONFIG, };</span><br><span style="color: hsl(120, 100%, 40%);">+         /* we should not request more attributes than we're ready to handle */</span><br><span style="color: hsl(120, 100%, 40%);">+            OSMO_ASSERT(sizeof(trx_attr) < MAX_BTS_ATTR);</span><br><span style="color: hsl(120, 100%, 40%);">+              abis_nm_get_attr(trx->bts, NM_OC_BASEB_TRANSC, 0, trx->nr, 0xff,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 trx_attr, sizeof(trx_attr));</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 (bb_transc->mo.get_attr_rep_received &&</span><br><span style="color: hsl(120, 100%, 40%);">+     state->administrative != NM_STATE_UNLOCKED && !bb_transc->mo.adm_unlock_sent) {</span><br><span>            bb_transc->mo.adm_unlock_sent = true;</span><br><span>             /* Note: nanoBTS sometimes fails NACKing the BaseBand</span><br><span>                   Transceiver Unlock command while in Dependency, specially</span><br><span>@@ -105,7 +120,7 @@</span><br><span>           /* TRX software is active, tell it to initiate RSL Link */</span><br><span>           abis_nm_ipaccess_rsl_connect(trx, trx->bts->ip_access.rsl_ip,</span><br><span>                                       3003, trx->rsl_tei);</span><br><span style="color: hsl(0, 100%, 40%);">-        }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> static void st_op_disabled_dependency_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span>@@ -127,6 +142,11 @@</span><br><span>   struct gsm_nm_state *new_state;</span><br><span> </span><br><span>  switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case NM_EV_GET_ATTR_REP:</span><br><span style="color: hsl(120, 100%, 40%);">+              bb_transc->mo.get_attr_rep_received = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                bb_transc->mo.get_attr_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+               configure_loop(bb_transc, &bb_transc->mo.nm_state, false);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span>      case NM_EV_STATE_CHG_REP:</span><br><span>            nsd = (struct nm_statechg_signal_data *)data;</span><br><span>                new_state = nsd->new_state;</span><br><span>@@ -172,6 +192,11 @@</span><br><span>        struct gsm_nm_state *new_state;</span><br><span> </span><br><span>  switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case NM_EV_GET_ATTR_REP:</span><br><span style="color: hsl(120, 100%, 40%);">+              bb_transc->mo.get_attr_rep_received = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                bb_transc->mo.get_attr_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+               configure_loop(bb_transc, &bb_transc->mo.nm_state, true);</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span>      case NM_EV_STATE_CHG_REP:</span><br><span>            nsd = (struct nm_statechg_signal_data *)data;</span><br><span>                new_state = nsd->new_state;</span><br><span>@@ -214,6 +239,8 @@</span><br><span> </span><br><span>     /* Reset state, we don't need it in this state and it will need to be</span><br><span>      reused as soon as we move back to Disabled */</span><br><span style="color: hsl(120, 100%, 40%);">+       bb_transc->mo.get_attr_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+       bb_transc->mo.get_attr_rep_received = false;</span><br><span>      bb_transc->mo.opstart_sent = false;</span><br><span>       bb_transc->mo.adm_unlock_sent = false;</span><br><span> }</span><br><span>@@ -282,7 +309,8 @@</span><br><span>         },</span><br><span>   [NM_BB_TRANSC_ST_OP_DISABLED_DEPENDENCY] = {</span><br><span>                 .in_event_mask =</span><br><span style="color: hsl(0, 100%, 40%);">-                        X(NM_EV_STATE_CHG_REP),</span><br><span style="color: hsl(120, 100%, 40%);">+                       X(NM_EV_STATE_CHG_REP) |</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(NM_EV_GET_ATTR_REP),</span><br><span>               .out_state_mask =</span><br><span>                    X(NM_BB_TRANSC_ST_OP_DISABLED_NOTINSTALLED) |</span><br><span>                        X(NM_BB_TRANSC_ST_OP_DISABLED_OFFLINE) |</span><br><span>@@ -293,7 +321,8 @@</span><br><span>       },</span><br><span>   [NM_BB_TRANSC_ST_OP_DISABLED_OFFLINE] = {</span><br><span>            .in_event_mask =</span><br><span style="color: hsl(0, 100%, 40%);">-                        X(NM_EV_STATE_CHG_REP),</span><br><span style="color: hsl(120, 100%, 40%);">+                       X(NM_EV_STATE_CHG_REP) |</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(NM_EV_GET_ATTR_REP),</span><br><span>               .out_state_mask =</span><br><span>                    X(NM_BB_TRANSC_ST_OP_DISABLED_NOTINSTALLED) |</span><br><span>                        X(NM_BB_TRANSC_ST_OP_DISABLED_DEPENDENCY) |</span><br><span>diff --git a/src/osmo-bsc/nm_bts_fsm.c b/src/osmo-bsc/nm_bts_fsm.c</span><br><span>index 6c577bd..731b578 100644</span><br><span>--- a/src/osmo-bsc/nm_bts_fsm.c</span><br><span>+++ b/src/osmo-bsc/nm_bts_fsm.c</span><br><span>@@ -48,6 +48,8 @@</span><br><span> {</span><br><span>        struct gsm_bts *bts = (struct gsm_bts *)fi->priv;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      bts->mo.get_attr_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+     bts->mo.get_attr_rep_received = false;</span><br><span>    bts->mo.set_attr_sent = false;</span><br><span>    bts->mo.set_attr_ack_received = false;</span><br><span>    bts->mo.adm_unlock_sent = false;</span><br><span>@@ -89,14 +91,27 @@</span><br><span> static void configure_loop(struct gsm_bts *bts, struct gsm_nm_state *state, bool allow_opstart) {</span><br><span>       struct msgb *msgb;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (!bts->mo.set_attr_sent && !bts->mo.set_attr_ack_received) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Request generic BTS-level attributes */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bts->mo.get_attr_sent && !bts->mo.get_attr_rep_received) {</span><br><span style="color: hsl(120, 100%, 40%);">+         bts->mo.get_attr_sent = true;</span><br><span style="color: hsl(120, 100%, 40%);">+              /* N. B: we rely on attribute order when parsing response in abis_nm_rx_get_attr_resp() */</span><br><span style="color: hsl(120, 100%, 40%);">+            const uint8_t bts_attr[] = { NM_ATT_MANUF_ID, NM_ATT_SW_CONFIG, };</span><br><span style="color: hsl(120, 100%, 40%);">+            /* we should not request more attributes than we're ready to handle */</span><br><span style="color: hsl(120, 100%, 40%);">+            OSMO_ASSERT(sizeof(bts_attr) < MAX_BTS_ATTR);</span><br><span style="color: hsl(120, 100%, 40%);">+              abis_nm_get_attr(bts, NM_OC_BTS, 0, 0xff, 0xff,</span><br><span style="color: hsl(120, 100%, 40%);">+                                bts_attr, sizeof(bts_attr));</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->mo.get_attr_rep_received &&</span><br><span style="color: hsl(120, 100%, 40%);">+           !bts->mo.set_attr_sent && !bts->mo.set_attr_ack_received) {</span><br><span>                bts->mo.set_attr_sent = true;</span><br><span>             msgb = nanobts_attr_bts_get(bts);</span><br><span>            abis_nm_set_bts_attr(bts, msgb->data, msgb->len);</span><br><span>              msgb_free(msgb);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (state->administrative != NM_STATE_UNLOCKED && !bts->mo.adm_unlock_sent) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (bts->mo.set_attr_ack_received &&</span><br><span style="color: hsl(120, 100%, 40%);">+           state->administrative != NM_STATE_UNLOCKED && !bts->mo.adm_unlock_sent) {</span><br><span>          bts->mo.adm_unlock_sent = true;</span><br><span>           abis_nm_chg_adm_state(bts, NM_OC_BTS,</span><br><span>                                      bts->bts_nr, 0xff, 0xff,</span><br><span>@@ -105,11 +120,11 @@</span><br><span> </span><br><span>        if (allow_opstart && state->administrative == NM_STATE_UNLOCKED &&</span><br><span>            bts->mo.set_attr_ack_received) {</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!bts->mo.opstart_sent) {</span><br><span style="color: hsl(0, 100%, 40%);">-                         bts->mo.opstart_sent = true;</span><br><span style="color: hsl(0, 100%, 40%);">-                         abis_nm_opstart(bts, NM_OC_BTS, bts->bts_nr, 0xff, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-                    }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(120, 100%, 40%);">+         if (!bts->mo.opstart_sent) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   bts->mo.opstart_sent = true;</span><br><span style="color: hsl(120, 100%, 40%);">+               abis_nm_opstart(bts, NM_OC_BTS, bts->bts_nr, 0xff, 0xff);</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> static void st_op_disabled_dependency_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span>@@ -133,6 +148,11 @@</span><br><span>   struct gsm_nm_state *new_state;</span><br><span> </span><br><span>  switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case NM_EV_GET_ATTR_REP:</span><br><span style="color: hsl(120, 100%, 40%);">+              bts->mo.get_attr_rep_received = true;</span><br><span style="color: hsl(120, 100%, 40%);">+              bts->mo.get_attr_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+             configure_loop(bts, &bts->mo.nm_state, false);</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span>      case NM_EV_SET_ATTR_ACK:</span><br><span>             bts->mo.set_attr_ack_received = true;</span><br><span>             bts->mo.set_attr_sent = false;</span><br><span>@@ -182,6 +202,11 @@</span><br><span>     struct gsm_nm_state *new_state;</span><br><span> </span><br><span>  switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case NM_EV_GET_ATTR_REP:</span><br><span style="color: hsl(120, 100%, 40%);">+              bts->mo.get_attr_rep_received = true;</span><br><span style="color: hsl(120, 100%, 40%);">+              bts->mo.get_attr_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+             configure_loop(bts, &bts->mo.nm_state, true);</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span>      case NM_EV_SET_ATTR_ACK:</span><br><span>             bts->mo.set_attr_ack_received = true;</span><br><span>             bts->mo.set_attr_sent = false;</span><br><span>@@ -231,6 +256,8 @@</span><br><span>        reused as soon as we move back to Disabled */</span><br><span>      bts->mo.opstart_sent = false;</span><br><span>     bts->mo.adm_unlock_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+   bts->mo.get_attr_sent = false;</span><br><span style="color: hsl(120, 100%, 40%);">+     bts->mo.get_attr_rep_received = false;</span><br><span>    bts->mo.set_attr_sent = false;</span><br><span>    bts->mo.set_attr_ack_received = false;</span><br><span> }</span><br><span>@@ -300,6 +327,7 @@</span><br><span>         [NM_BTS_ST_OP_DISABLED_DEPENDENCY] = {</span><br><span>               .in_event_mask =</span><br><span>                     X(NM_EV_STATE_CHG_REP) |</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(NM_EV_GET_ATTR_REP) |</span><br><span>                      X(NM_EV_SET_ATTR_ACK),</span><br><span>               .out_state_mask =</span><br><span>                    X(NM_BTS_ST_OP_DISABLED_NOTINSTALLED) |</span><br><span>@@ -312,6 +340,7 @@</span><br><span>        [NM_BTS_ST_OP_DISABLED_OFFLINE] = {</span><br><span>          .in_event_mask =</span><br><span>                     X(NM_EV_STATE_CHG_REP) |</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(NM_EV_GET_ATTR_REP) |</span><br><span>                      X(NM_EV_SET_ATTR_ACK),</span><br><span>               .out_state_mask =</span><br><span>                    X(NM_BTS_ST_OP_DISABLED_NOTINSTALLED) |</span><br><span>diff --git a/src/osmo-bsc/nm_common_fsm.c b/src/osmo-bsc/nm_common_fsm.c</span><br><span>index 42c01e0..2a529db 100644</span><br><span>--- a/src/osmo-bsc/nm_common_fsm.c</span><br><span>+++ b/src/osmo-bsc/nm_common_fsm.c</span><br><span>@@ -25,6 +25,7 @@</span><br><span> const struct value_string nm_fsm_event_names[] = {</span><br><span>       { NM_EV_SW_ACT_REP, "SW_ACT_REP" },</span><br><span>        { NM_EV_STATE_CHG_REP, "STATE_CHG_REP" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { NM_EV_GET_ATTR_REP, "GET_ATTR_REP" },</span><br><span>    { NM_EV_SET_ATTR_ACK, "SET_ATTR_ACK" },</span><br><span>    { NM_EV_OPSTART_ACK, "OPSTART_ACK" },</span><br><span>      { NM_EV_OPSTART_NACK, "OPSTART_NACK" },</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>index 3be8593..ca00ba0 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_main.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>@@ -371,13 +371,6 @@</span><br><span> {</span><br><span>   struct input_signal_data *isd = signal_data;</span><br><span>         struct gsm_bts_trx *trx = isd->trx;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* N. B: we rely on attribute order when parsing response in abis_nm_rx_get_attr_resp() */</span><br><span style="color: hsl(0, 100%, 40%);">-      const uint8_t bts_attr[] = { NM_ATT_MANUF_ID, NM_ATT_SW_CONFIG, };</span><br><span style="color: hsl(0, 100%, 40%);">-      const uint8_t trx_attr[] = { NM_ATT_MANUF_STATE, NM_ATT_SW_CONFIG, };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* we should not request more attributes than we're ready to handle */</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(sizeof(bts_attr) < MAX_BTS_ATTR);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(sizeof(trx_attr) < MAX_BTS_ATTR);</span><br><span> </span><br><span>         if (subsys != SS_L_INPUT)</span><br><span>            return -EINVAL;</span><br><span>@@ -395,14 +388,8 @@</span><br><span>                         set bts->si_common.cell_alloc */</span><br><span>                        generate_cell_chan_list(ca, trx->bts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   /* Request generic BTS-level attributes */</span><br><span style="color: hsl(0, 100%, 40%);">-                      abis_nm_get_attr(trx->bts, NM_OC_BTS, 0xFF, 0xFF, 0xFF, bts_attr, sizeof(bts_attr));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>                      llist_for_each_entry(cur_trx, &trx->bts->trx_list, list) {</span><br><span>                                 int i;</span><br><span style="color: hsl(0, 100%, 40%);">-                          /* Request TRX-level attributes */</span><br><span style="color: hsl(0, 100%, 40%);">-                              abis_nm_get_attr(cur_trx->bts, NM_OC_BASEB_TRANSC, 0, cur_trx->nr, 0xFF,</span><br><span style="color: hsl(0, 100%, 40%);">-                                           trx_attr, sizeof(trx_attr));</span><br><span>                                for (i = 0; i < ARRAY_SIZE(cur_trx->ts); i++)</span><br><span>                                  generate_ma_for_ts(&cur_trx->ts[i]);</span><br><span>                  }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21502">change 21502</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/+/21502"/><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: I8ec39c7e1f956ffce9aecd58a5590c43200ba086 </div>
<div style="display:none"> Gerrit-Change-Number: 21502 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>