Change in osmo-bsc[master]: om2k: Add support for MCTR configuration

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

tnt gerrit-no-reply at lists.osmocom.org
Fri May 8 11:59:00 UTC 2020


tnt has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/18124 )


Change subject: om2k: Add support for MCTR configuration
......................................................................

om2k: Add support for MCTR configuration

Currently only supports a single MCTR with fixed configuration

Signed-off-by: Sylvain Munaut <tnt at 246tNt.com>
Change-Id: I96b8bb2c01c05bf153fc924f62bd6aafa96725ee
---
M include/osmocom/bsc/gsm_data.h
M src/osmo-bsc/abis_om2000.c
2 files changed, 83 insertions(+), 1 deletion(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/24/18124/1

diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h
index c2115a6..3fd466c 100644
--- a/include/osmocom/bsc/gsm_data.h
+++ b/include/osmocom/bsc/gsm_data.h
@@ -1134,6 +1134,10 @@
 				struct om2k_mo om2k_mo;
 				struct gsm_abis_mo mo;
 			} tf;
+			struct {
+				struct om2k_mo om2k_mo;
+				struct gsm_abis_mo mo;
+			} mctr;
 			uint32_t use_superchannel:1;
 			struct {
 				uint16_t limit;
diff --git a/src/osmo-bsc/abis_om2000.c b/src/osmo-bsc/abis_om2000.c
index 42b0d6f..41b2317 100644
--- a/src/osmo-bsc/abis_om2000.c
+++ b/src/osmo-bsc/abis_om2000.c
@@ -30,6 +30,7 @@
 
 #include <arpa/inet.h>
 
+#include <osmocom/core/byteswap.h>
 #include <osmocom/core/msgb.h>
 #include <osmocom/gsm/tlv.h>
 #include <osmocom/core/talloc.h>
@@ -778,6 +779,9 @@
 	case OM2K_MO_CLS_TF:
 		mo = &bts->rbs2000.tf.om2k_mo;
 		break;
+	case OM2K_MO_CLS_MCTR:
+		mo = &bts->rbs2000.mctr.om2k_mo;
+		break;
 
 	case OM2K_MO_CLS_TRXC:
 		trx = gsm_bts_trx_num(bts, abis_mo->inst);
@@ -1254,6 +1258,35 @@
 	return abis_om2k_sendmsg(bts, msg);
 }
 
+int abis_om2k_tx_mctr_conf_req(struct gsm_bts *bts)
+{
+	struct msgb *msg = om2k_msgb_alloc();
+	struct abis_om2k_hdr *o2k;
+	struct gsm_bts_trx *trx;
+	uint8_t trxc_list = 0;
+	const uint8_t features[] = { 0x00 };
+
+	/* build trxc list */
+	llist_for_each_entry(trx, &bts->trx_list, list)
+		trxc_list |= (1 << trx->nr);
+
+	/* fill message */
+	msgb_tv16_put(msg, OM2K_DEI_TRXC_LIST, osmo_swab16(trxc_list)); /* Read as LE by the BTS ... */
+	msgb_tv_put  (msg, OM2K_DEI_MAX_ALLOWED_POWER, 0x31);
+	msgb_tv_put  (msg, OM2K_DEI_MAX_ALLOWED_NUM_TRXCS, 0x08);
+	msgb_tlv_put (msg, OM2K_DEI_MCTR_FEAT_STATUS_BMAP, 1, features);
+
+	/* pre-pend the OM2K header */
+	o2k = (struct abis_om2k_hdr *) msgb_push(msg, sizeof(*o2k));
+	fill_om2k_hdr(o2k, &bts->rbs2000.mctr.om2k_mo.addr,
+			OM2K_MSGT_MCTR_CONF_REQ);
+	DEBUGP(DNM, "Tx MO=%s %s\n",
+		om2k_mo_name(&bts->rbs2000.mctr.om2k_mo.addr),
+		get_value_string(om2k_msgcode_vals, OM2K_MSGT_MCTR_CONF_REQ));
+
+	return abis_om2k_sendmsg(bts, msg);
+}
+
 static void om2k_trx_to_mo(struct abis_om2k_mo *mo,
 			   const struct gsm_bts_trx *trx,
 			   enum abis_om2k_mo_cls cls)
@@ -1708,6 +1741,9 @@
 	case OM2K_MO_CLS_CON:
 		abis_om2k_tx_con_conf_req(omfp->trx->bts);
 		break;
+	case OM2K_MO_CLS_MCTR:
+		abis_om2k_tx_mctr_conf_req(omfp->trx->bts);
+		break;
 	case OM2K_MO_CLS_TX:
 		abis_om2k_tx_tx_conf_req(omfp->trx);
 		break;
@@ -1975,6 +2011,7 @@
 
 	case OM2K_MSGT_CON_CONF_REQ_ACK:
 	case OM2K_MSGT_IS_CONF_REQ_ACK:
+	case OM2K_MSGT_MCTR_CONF_REQ_ACK:
 	case OM2K_MSGT_RX_CONF_REQ_ACK:
 	case OM2K_MSGT_TF_CONF_REQ_ACK:
 	case OM2K_MSGT_TS_CONF_REQ_ACK:
@@ -1985,6 +2022,7 @@
 
 	case OM2K_MSGT_CON_CONF_RES:
 	case OM2K_MSGT_IS_CONF_RES:
+	case OM2K_MSGT_MCTR_CONF_RES:
 	case OM2K_MSGT_RX_CONF_RES:
 	case OM2K_MSGT_TF_CONF_RES:
 	case OM2K_MSGT_TS_CONF_RES:
@@ -2222,6 +2260,7 @@
 	OM2K_BTS_EVT_IS_DONE,
 	OM2K_BTS_EVT_CON_DONE,
 	OM2K_BTS_EVT_TF_DONE,
+	OM2K_BTS_EVT_MCTR_DONE,
 	OM2K_BTS_EVT_TRX_DONE,
 	OM2K_BTS_EVT_STOP,
 };
@@ -2232,6 +2271,7 @@
 	{ OM2K_BTS_EVT_IS_DONE,		"IS-DONE" },
 	{ OM2K_BTS_EVT_CON_DONE,	"CON-DONE" },
 	{ OM2K_BTS_EVT_TF_DONE,		"TF-DONE" },
+	{ OM2K_BTS_EVT_MCTR_DONE,	"MCTR-DONE" },
 	{ OM2K_BTS_EVT_TRX_DONE,	"TRX-DONE" },
 	{ OM2K_BTS_EVT_STOP,		"STOP" },
 	{ 0, NULL }
@@ -2243,6 +2283,7 @@
 	OM2K_BTS_S_WAIT_IS,
 	OM2K_BTS_S_WAIT_CON,
 	OM2K_BTS_S_WAIT_TF,
+	OM2K_BTS_S_WAIT_MCTR,
 	OM2K_BTS_S_WAIT_TRX,
 	OM2K_BTS_S_DONE,
 	OM2K_BTS_S_ERROR,
@@ -2306,10 +2347,33 @@
 static void om2k_bts_s_wait_is(struct osmo_fsm_inst *fi, uint32_t event, void *data)
 {
 	struct om2k_bts_fsm_priv *obfp = fi->priv;
-	struct gsm_bts_trx *trx;
+	struct gsm_bts *bts = obfp->bts;
 
 	OSMO_ASSERT(event == OM2K_BTS_EVT_IS_DONE);
 
+	/* If we're running OML >= G12R13, start MCTR, else skip directly to TRX */
+	if (bts->rbs2000.om2k_version[0].active >= 0x0c0d) {
+		osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_WAIT_MCTR,
+					BTS_FSM_TIMEOUT, 0);
+		om2k_mo_fsm_start(fi, OM2K_BTS_EVT_MCTR_DONE, bts->c0,
+				  &bts->rbs2000.mctr.om2k_mo);
+	} else {
+		struct gsm_bts_trx *trx;
+		osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_WAIT_TRX,
+					BTS_FSM_TIMEOUT, 0);
+		obfp->next_trx_nr = 0;
+		trx = gsm_bts_trx_num(obfp->bts, obfp->next_trx_nr++);
+		om2k_trx_fsm_start(fi, trx, OM2K_BTS_EVT_TRX_DONE);
+	}
+}
+
+static void om2k_bts_s_wait_mctr(struct osmo_fsm_inst *fi, uint32_t event, void *data)
+{
+	struct om2k_bts_fsm_priv *obfp = fi->priv;
+	struct gsm_bts_trx *trx;
+
+	OSMO_ASSERT(event == OM2K_BTS_EVT_MCTR_DONE);
+
 	osmo_fsm_inst_state_chg(fi, OM2K_BTS_S_WAIT_TRX,
 				BTS_FSM_TIMEOUT, 0);
 	obfp->next_trx_nr = 0;
@@ -2368,10 +2432,18 @@
 	[OM2K_BTS_S_WAIT_IS] = {
 		.in_event_mask = S(OM2K_BTS_EVT_IS_DONE),
 		.out_state_mask = S(OM2K_BTS_S_ERROR) |
+				  S(OM2K_BTS_S_WAIT_MCTR) |
 				  S(OM2K_BTS_S_WAIT_TRX),
 		.name = "WAIT-IS",
 		.action = om2k_bts_s_wait_is,
 	},
+	[OM2K_BTS_S_WAIT_MCTR] = {
+		.in_event_mask = S(OM2K_BTS_EVT_MCTR_DONE),
+		.out_state_mask = S(OM2K_BTS_S_ERROR) |
+				  S(OM2K_BTS_S_WAIT_TRX),
+		.name = "WAIT-MCTR",
+		.action = om2k_bts_s_wait_mctr,
+	},
 	[OM2K_BTS_S_WAIT_TRX] = {
 		.in_event_mask = S(OM2K_BTS_EVT_TRX_DONE),
 		.out_state_mask = S(OM2K_BTS_S_ERROR) |
@@ -2792,6 +2864,9 @@
 	case OM2K_MSGT_CON_CONF_RES:
 		rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_CON_CONF_RES_ACK);
 		break;
+	case OM2K_MSGT_MCTR_CONF_RES:
+		rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_MCTR_CONF_RES_ACK);
+		break;
 	case OM2K_MSGT_TX_CONF_RES:
 		rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_TX_CONF_RES_ACK);
 		break;
@@ -2830,6 +2905,7 @@
 	case OM2K_MSGT_TEST_REQ_REJ:
 	case OM2K_MSGT_CON_CONF_REQ_REJ:
 	case OM2K_MSGT_IS_CONF_REQ_REJ:
+	case OM2K_MSGT_MCTR_CONF_REQ_REJ:
 	case OM2K_MSGT_TX_CONF_REQ_REJ:
 	case OM2K_MSGT_RX_CONF_REQ_REJ:
 	case OM2K_MSGT_TS_CONF_REQ_REJ:
@@ -2910,6 +2986,8 @@
 			bts->nr, 0xFF, 0);
 	om2k_mo_init(&bts->rbs2000.tf.om2k_mo, OM2K_MO_CLS_TF,
 			bts->nr, 0xFF, 0);
+	om2k_mo_init(&bts->rbs2000.mctr.om2k_mo, OM2K_MO_CLS_MCTR,
+			bts->nr, 0xFF, 0);	// FIXME: There can be multiple MCTRs ...
 }
 
 static __attribute__((constructor)) void abis_om2k_init(void)

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/18124
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: I96b8bb2c01c05bf153fc924f62bd6aafa96725ee
Gerrit-Change-Number: 18124
Gerrit-PatchSet: 1
Gerrit-Owner: tnt <tnt at 246tNt.com>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200508/1afa9954/attachment.htm>


More information about the gerrit-log mailing list