<p>tnt has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18124">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">om2k: Add support for MCTR configuration<br><br>Currently only supports a single MCTR with fixed configuration<br><br>Signed-off-by: Sylvain Munaut <tnt@246tNt.com><br>Change-Id: I96b8bb2c01c05bf153fc924f62bd6aafa96725ee<br>---<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/abis_om2000.c<br>2 files changed, 83 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/24/18124/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 c2115a6..3fd466c 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1134,6 +1134,10 @@</span><br><span>                                 struct om2k_mo om2k_mo;</span><br><span>                              struct gsm_abis_mo mo;</span><br><span>                       } tf;</span><br><span style="color: hsl(120, 100%, 40%);">+                 struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                              struct om2k_mo om2k_mo;</span><br><span style="color: hsl(120, 100%, 40%);">+                               struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+                        } mctr;</span><br><span>                      uint32_t use_superchannel:1;</span><br><span>                         struct {</span><br><span>                             uint16_t limit;</span><br><span>diff --git a/src/osmo-bsc/abis_om2000.c b/src/osmo-bsc/abis_om2000.c</span><br><span>index 42b0d6f..41b2317 100644</span><br><span>--- a/src/osmo-bsc/abis_om2000.c</span><br><span>+++ b/src/osmo-bsc/abis_om2000.c</span><br><span>@@ -30,6 +30,7 @@</span><br><span> </span><br><span> #include <arpa/inet.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/byteswap.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/gsm/tlv.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span>@@ -778,6 +779,9 @@</span><br><span>     case OM2K_MO_CLS_TF:</span><br><span>                 mo = &bts->rbs2000.tf.om2k_mo;</span><br><span>                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case OM2K_MO_CLS_MCTR:</span><br><span style="color: hsl(120, 100%, 40%);">+                mo = &bts->rbs2000.mctr.om2k_mo;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span> </span><br><span>   case OM2K_MO_CLS_TRXC:</span><br><span>               trx = gsm_bts_trx_num(bts, abis_mo->inst);</span><br><span>@@ -1254,6 +1258,35 @@</span><br><span>       return abis_om2k_sendmsg(bts, msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int abis_om2k_tx_mctr_conf_req(struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct msgb *msg = om2k_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+ struct abis_om2k_hdr *o2k;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t trxc_list = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+        const uint8_t features[] = { 0x00 };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* build trxc list */</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(trx, &bts->trx_list, list)</span><br><span style="color: hsl(120, 100%, 40%);">+                trxc_list |= (1 << trx->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* fill message */</span><br><span style="color: hsl(120, 100%, 40%);">+    msgb_tv16_put(msg, OM2K_DEI_TRXC_LIST, osmo_swab16(trxc_list)); /* Read as LE by the BTS ... */</span><br><span style="color: hsl(120, 100%, 40%);">+       msgb_tv_put  (msg, OM2K_DEI_MAX_ALLOWED_POWER, 0x31);</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_tv_put  (msg, OM2K_DEI_MAX_ALLOWED_NUM_TRXCS, 0x08);</span><br><span style="color: hsl(120, 100%, 40%);">+     msgb_tlv_put (msg, OM2K_DEI_MCTR_FEAT_STATUS_BMAP, 1, features);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* pre-pend the OM2K header */</span><br><span style="color: hsl(120, 100%, 40%);">+        o2k = (struct abis_om2k_hdr *) msgb_push(msg, sizeof(*o2k));</span><br><span style="color: hsl(120, 100%, 40%);">+  fill_om2k_hdr(o2k, &bts->rbs2000.mctr.om2k_mo.addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                    OM2K_MSGT_MCTR_CONF_REQ);</span><br><span style="color: hsl(120, 100%, 40%);">+     DEBUGP(DNM, "Tx MO=%s %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                om2k_mo_name(&bts->rbs2000.mctr.om2k_mo.addr),</span><br><span style="color: hsl(120, 100%, 40%);">+         get_value_string(om2k_msgcode_vals, OM2K_MSGT_MCTR_CONF_REQ));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return abis_om2k_sendmsg(bts, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void om2k_trx_to_mo(struct abis_om2k_mo *mo,</span><br><span>                         const struct gsm_bts_trx *trx,</span><br><span>                       enum abis_om2k_mo_cls cls)</span><br><span>@@ -1708,6 +1741,9 @@</span><br><span>        case OM2K_MO_CLS_CON:</span><br><span>                abis_om2k_tx_con_conf_req(omfp->trx->bts);</span><br><span>             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case OM2K_MO_CLS_MCTR:</span><br><span style="color: hsl(120, 100%, 40%);">+                abis_om2k_tx_mctr_conf_req(omfp->trx->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span>       case OM2K_MO_CLS_TX:</span><br><span>                 abis_om2k_tx_tx_conf_req(omfp->trx);</span><br><span>              break;</span><br><span>@@ -1975,6 +2011,7 @@</span><br><span> </span><br><span>   case OM2K_MSGT_CON_CONF_REQ_ACK:</span><br><span>     case OM2K_MSGT_IS_CONF_REQ_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+       case OM2K_MSGT_MCTR_CONF_REQ_ACK:</span><br><span>    case OM2K_MSGT_RX_CONF_REQ_ACK:</span><br><span>      case OM2K_MSGT_TF_CONF_REQ_ACK:</span><br><span>      case OM2K_MSGT_TS_CONF_REQ_ACK:</span><br><span>@@ -1985,6 +2022,7 @@</span><br><span> </span><br><span>  case OM2K_MSGT_CON_CONF_RES:</span><br><span>         case OM2K_MSGT_IS_CONF_RES:</span><br><span style="color: hsl(120, 100%, 40%);">+   case OM2K_MSGT_MCTR_CONF_RES:</span><br><span>        case OM2K_MSGT_RX_CONF_RES:</span><br><span>  case OM2K_MSGT_TF_CONF_RES:</span><br><span>  case OM2K_MSGT_TS_CONF_RES:</span><br><span>@@ -2222,6 +2260,7 @@</span><br><span>  OM2K_BTS_EVT_IS_DONE,</span><br><span>        OM2K_BTS_EVT_CON_DONE,</span><br><span>       OM2K_BTS_EVT_TF_DONE,</span><br><span style="color: hsl(120, 100%, 40%);">+ OM2K_BTS_EVT_MCTR_DONE,</span><br><span>      OM2K_BTS_EVT_TRX_DONE,</span><br><span>       OM2K_BTS_EVT_STOP,</span><br><span> };</span><br><span>@@ -2232,6 +2271,7 @@</span><br><span>     { OM2K_BTS_EVT_IS_DONE,         "IS-DONE" },</span><br><span>       { OM2K_BTS_EVT_CON_DONE,        "CON-DONE" },</span><br><span>      { OM2K_BTS_EVT_TF_DONE,         "TF-DONE" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { OM2K_BTS_EVT_MCTR_DONE,       "MCTR-DONE" },</span><br><span>     { OM2K_BTS_EVT_TRX_DONE,        "TRX-DONE" },</span><br><span>      { OM2K_BTS_EVT_STOP,            "STOP" },</span><br><span>  { 0, NULL }</span><br><span>@@ -2243,6 +2283,7 @@</span><br><span>  OM2K_BTS_S_WAIT_IS,</span><br><span>  OM2K_BTS_S_WAIT_CON,</span><br><span>         OM2K_BTS_S_WAIT_TF,</span><br><span style="color: hsl(120, 100%, 40%);">+   OM2K_BTS_S_WAIT_MCTR,</span><br><span>        OM2K_BTS_S_WAIT_TRX,</span><br><span>         OM2K_BTS_S_DONE,</span><br><span>     OM2K_BTS_S_ERROR,</span><br><span>@@ -2306,10 +2347,33 @@</span><br><span> static void om2k_bts_s_wait_is(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>     struct om2k_bts_fsm_priv *obfp = fi->priv;</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts *bts = obfp->bts;</span><br><span> </span><br><span>      OSMO_ASSERT(event == OM2K_BTS_EVT_IS_DONE);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       /* If we're running OML >= G12R13, start MCTR, else skip directly to TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (bts->rbs2000.om2k_version[0].active >= 0x0c0d) {</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_WAIT_MCTR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                     BTS_FSM_TIMEOUT, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+          om2k_mo_fsm_start(fi, OM2K_BTS_EVT_MCTR_DONE, bts->c0,</span><br><span style="color: hsl(120, 100%, 40%);">+                               &bts->rbs2000.mctr.om2k_mo);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_WAIT_TRX,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      BTS_FSM_TIMEOUT, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+          obfp->next_trx_nr = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+             trx = gsm_bts_trx_num(obfp->bts, obfp->next_trx_nr++);</span><br><span style="color: hsl(120, 100%, 40%);">+          om2k_trx_fsm_start(fi, trx, OM2K_BTS_EVT_TRX_DONE);</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%);">+static void om2k_bts_s_wait_mctr(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct om2k_bts_fsm_priv *obfp = fi->priv;</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%);">+    OSMO_ASSERT(event == OM2K_BTS_EVT_MCTR_DONE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_WAIT_TRX,</span><br><span>                             BTS_FSM_TIMEOUT, 0);</span><br><span>         obfp->next_trx_nr = 0;</span><br><span>@@ -2368,10 +2432,18 @@</span><br><span>  [OM2K_BTS_S_WAIT_IS] = {</span><br><span>             .in_event_mask = S(OM2K_BTS_EVT_IS_DONE),</span><br><span>            .out_state_mask = S(OM2K_BTS_S_ERROR) |</span><br><span style="color: hsl(120, 100%, 40%);">+                                 S(OM2K_BTS_S_WAIT_MCTR) |</span><br><span>                            S(OM2K_BTS_S_WAIT_TRX),</span><br><span>            .name = "WAIT-IS",</span><br><span>                 .action = om2k_bts_s_wait_is,</span><br><span>        },</span><br><span style="color: hsl(120, 100%, 40%);">+    [OM2K_BTS_S_WAIT_MCTR] = {</span><br><span style="color: hsl(120, 100%, 40%);">+            .in_event_mask = S(OM2K_BTS_EVT_MCTR_DONE),</span><br><span style="color: hsl(120, 100%, 40%);">+           .out_state_mask = S(OM2K_BTS_S_ERROR) |</span><br><span style="color: hsl(120, 100%, 40%);">+                                 S(OM2K_BTS_S_WAIT_TRX),</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "WAIT-MCTR",</span><br><span style="color: hsl(120, 100%, 40%);">+                .action = om2k_bts_s_wait_mctr,</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span>   [OM2K_BTS_S_WAIT_TRX] = {</span><br><span>            .in_event_mask = S(OM2K_BTS_EVT_TRX_DONE),</span><br><span>           .out_state_mask = S(OM2K_BTS_S_ERROR) |</span><br><span>@@ -2792,6 +2864,9 @@</span><br><span>      case OM2K_MSGT_CON_CONF_RES:</span><br><span>                 rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_CON_CONF_RES_ACK);</span><br><span>          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case OM2K_MSGT_MCTR_CONF_RES:</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_MCTR_CONF_RES_ACK);</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span>       case OM2K_MSGT_TX_CONF_RES:</span><br><span>          rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_TX_CONF_RES_ACK);</span><br><span>           break;</span><br><span>@@ -2830,6 +2905,7 @@</span><br><span>       case OM2K_MSGT_TEST_REQ_REJ:</span><br><span>         case OM2K_MSGT_CON_CONF_REQ_REJ:</span><br><span>     case OM2K_MSGT_IS_CONF_REQ_REJ:</span><br><span style="color: hsl(120, 100%, 40%);">+       case OM2K_MSGT_MCTR_CONF_REQ_REJ:</span><br><span>    case OM2K_MSGT_TX_CONF_REQ_REJ:</span><br><span>      case OM2K_MSGT_RX_CONF_REQ_REJ:</span><br><span>      case OM2K_MSGT_TS_CONF_REQ_REJ:</span><br><span>@@ -2910,6 +2986,8 @@</span><br><span>                      bts->nr, 0xFF, 0);</span><br><span>        om2k_mo_init(&bts->rbs2000.tf.om2k_mo, OM2K_MO_CLS_TF,</span><br><span>                        bts->nr, 0xFF, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ om2k_mo_init(&bts->rbs2000.mctr.om2k_mo, OM2K_MO_CLS_MCTR,</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts->nr, 0xFF, 0);   // FIXME: There can be multiple MCTRs ...</span><br><span> }</span><br><span> </span><br><span> static __attribute__((constructor)) void abis_om2k_init(void)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18124">change 18124</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/+/18124"/><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: I96b8bb2c01c05bf153fc924f62bd6aafa96725ee </div>
<div style="display:none"> Gerrit-Change-Number: 18124 </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>