<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/18124">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
laforge: Looks good to me, approved
pespin: Looks good to me, but someone else must approve
</div><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;"><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 dc233c6..2380f5c 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: 5 </div>
<div style="display:none"> Gerrit-Owner: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>