dexter has uploaded this change for review.

View Change

pcu_sock: transfer E1 connection information to PCU

The BSC has all information about the E1 line configuration of each
timeslot/channel. The PCU is responsible for opening and managing the
CCU connection. To enable the CCU to do that, we have to transfer the E1
connection information (which TS, SS, rate) to the PCU.

Change-Id: I6d44373336b41009ff4c6e459d32d0a81081676c
Related: OS#5198
---
M src/osmo-bsc/pcu_sock.c
1 file changed, 79 insertions(+), 1 deletion(-)

git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/44/31144/1
diff --git a/src/osmo-bsc/pcu_sock.c b/src/osmo-bsc/pcu_sock.c
index 28fd9a0..45e44ca 100644
--- a/src/osmo-bsc/pcu_sock.c
+++ b/src/osmo-bsc/pcu_sock.c
@@ -106,6 +106,19 @@
}
}

+/* Check if it is possible to use the TS as PDCH (not now, but maybe later) */
+static bool ts_usable_as_pdch(const struct gsm_bts_trx_ts *ts)
+{
+ switch (ts->pchan_from_config) {
+ case GSM_PCHAN_TCH_F_PDCH:
+ case GSM_PCHAN_OSMO_DYN:
+ case GSM_PCHAN_PDCH:
+ return true;
+ default:
+ return false;
+ }
+}
+
/* Fill the frequency hopping parameter */
static void info_ind_fill_fhp(struct gsm_pcu_if_info_trx_ts *ts_info,
const struct gsm_bts_trx_ts *ts)
@@ -291,11 +304,76 @@
return pcu_sock_send(bts, msg);
}

+static int pcu_tx_e1_ccu_ind(struct gsm_bts *bts)
+{
+ struct msgb *msg;
+ struct gsm_pcu_if *pcu_prim;
+ struct gsm_pcu_if_e1_ccu_ind *e1_ccu_ind;
+ int i;
+ int k;
+ struct gsm_bts_trx *trx;
+ struct gsm_bts_trx_ts *ts;
+ int rc;
+
+ OSMO_ASSERT(bts);
+ OSMO_ASSERT(bts->network);
+ OSMO_ASSERT(bts->site_mgr);
+
+ for (i = 0; i < PCU_IF_NUM_TRX; i++) {
+ trx = gsm_bts_trx_num(bts, i);
+ if (!trx)
+ continue;
+ if (trx->nr >= PCU_IF_NUM_TRX) {
+ LOG_TRX(trx, DPCU, LOGL_NOTICE, "PCU interface (version %u) "
+ "cannot handle more than %u transceivers => skipped\n",
+ PCU_IF_VERSION, PCU_IF_NUM_TRX);
+ continue;
+ }
+
+ for (k = 0; k < ARRAY_SIZE(trx->ts); k++) {
+ ts = &trx->ts[k];
+
+ if (ts->mo.nm_state.operational != NM_OPSTATE_ENABLED)
+ continue;
+ if (!ts_usable_as_pdch(ts))
+ continue;
+
+ msg = pcu_msgb_alloc(PCU_IF_MSG_E1_CCU_IND, bts->nr);
+ if (!msg)
+ return -ENOMEM;
+ pcu_prim = (struct gsm_pcu_if *)msg->data;
+ e1_ccu_ind = &pcu_prim->u.e1_ccu_ind;
+ e1_ccu_ind->ts_nr = ts->nr;
+ e1_ccu_ind->trx_nr = trx->nr;
+ e1_ccu_ind->e1_nr = ts->e1_link.e1_nr;
+ e1_ccu_ind->e1_ts = ts->e1_link.e1_ts;
+ e1_ccu_ind->e1_ts_ss = ts->e1_link.e1_ts_ss;
+
+ LOGP(DPCU, LOGL_INFO, "Sending E1 CCU info for BTS %d, TRX %d, TS %d\n", bts->nr,
+ e1_ccu_ind->trx_nr, e1_ccu_ind->ts_nr);
+
+ rc = pcu_sock_send(bts, msg);
+ if (rc < 0)
+ return -EINVAL;
+ }
+ }
+
+ return 0;
+}
+
/* Allow test to overwrite it */
__attribute__((weak)) void pcu_info_update(struct gsm_bts *bts)
{
- if (pcu_connected(bts))
+ if (pcu_connected(bts)) {
+ /* In cases where the CCU is connected via an E1 line, we
+ * transmit the connection parameters for the PDCH before
+ * we announce the other BTS related parameters. At the
+ * moment Ericsson RBS is the only E1 BTS we support. */
+ if (is_ericsson_bts(bts))
+ pcu_tx_e1_ccu_ind(bts);
+
pcu_tx_info_ind(bts);
+ }
}

int pcu_tx_data_ind(struct gsm_bts_trx_ts *ts, uint8_t sapi, uint32_t fn,

To view, visit change 31144. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: I6d44373336b41009ff4c6e459d32d0a81081676c
Gerrit-Change-Number: 31144
Gerrit-PatchSet: 1
Gerrit-Owner: dexter <pmaier@sysmocom.de>
Gerrit-MessageType: newchange