dexter has uploaded this change for review.

View Change

pcu_l1_if: receive E1 connection parameters

The BSC may send E1 connection parameters. Those parameters will be
needed for the Ericsson E1 CCU support that will be introduced in a
follow up patch. At the moment the parameters will be collected and are
available on request.

Change-Id: I1f926b023205a9ecf78d8a8586d6ac21cc73eb0a
Related: OS#5198
---
M src/pcu_l1_if.cpp
M src/pcu_l1_if.h
2 files changed, 79 insertions(+), 0 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/74/31174/1
diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index 0044594..91d6d48 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -41,6 +41,7 @@
#include <osmocom/gsm/gsm48_rest_octets.h>
#include <osmocom/gsm/sysinfo.h>
#include <osmocom/gsm/gsm0502.h>
+#include <osmocom/abis/e1_input.h>

#include <nacc_fsm.h>
}
@@ -69,6 +70,19 @@

#define PAGING_GROUP_LEN 3

+struct e1_ccu_conn_pars {
+ struct llist_head entry;
+
+ /* Related air interface */
+ uint8_t trx_no;
+ uint8_t ts;
+
+ /* E1 communication parameter */
+ struct gsm_e1_subslot e1_link;
+};
+
+static LLIST_HEAD(e1_ccu_table);
+
/* returns [0,999] on success, > 999 on error */
uint16_t imsi2paging_group(const char* imsi)
{
@@ -963,6 +977,64 @@
return rc;
}

+/* Query E1 CCU connection parameters by TS and TRX number */
+int pcu_l1if_get_ccu_conn_pars(struct gsm_e1_subslot *e1_link, uint8_t pdch_ts, uint8_t pdch_trx_no)
+{
+ struct e1_ccu_conn_pars *e1_ccu_conn_pars;
+
+ llist_for_each_entry(e1_ccu_conn_pars, &e1_ccu_table, entry) {
+ if (e1_ccu_conn_pars->ts == pdch_ts && e1_ccu_conn_pars->trx_no == pdch_trx_no) {
+ memcpy(e1_link, &e1_ccu_conn_pars->e1_link, sizeof(*e1_link));
+ return 0;
+ }
+ }
+
+ LOGP(DL1IF, LOGL_ERROR, "(PDCH-TS:%u, TRX:%u) cannot find E1 connection parameters for CCU\n", pdch_ts,
+ pdch_trx_no);
+ return -EINVAL;
+}
+
+static int pcu_rx_e1_ccu_ind(struct gprs_rlcmac_bts *bts, const struct gsm_pcu_if_e1_ccu_ind *e1_ccu_ind)
+{
+ struct e1_ccu_conn_pars *e1_ccu_conn_pars;
+ uint8_t rate;
+ uint8_t subslot;
+
+ if (e1_ccu_ind->e1_ts_ss == 255) {
+ rate = 64;
+ subslot = 0;
+ } else {
+ rate = 16;
+ subslot = e1_ccu_ind->e1_ts_ss;
+ }
+
+ LOGP(DL1IF, LOGL_NOTICE,
+ "(PDCH-TS:%u, TRX:%u) new E1 CCU communication parameters for CCU (E1-line:%u, E1-TS:%u, E1-SS:%u, rate:%ukbps)\n",
+ e1_ccu_ind->ts_nr, e1_ccu_ind->trx_nr, e1_ccu_ind->e1_nr, e1_ccu_ind->e1_ts,
+ subslot, rate);
+
+ /* Search for an existing entry, when found, update it. */
+ llist_for_each_entry(e1_ccu_conn_pars, &e1_ccu_table, entry) {
+ if (e1_ccu_conn_pars->ts == e1_ccu_ind->ts_nr && e1_ccu_conn_pars->trx_no == e1_ccu_ind->trx_nr) {
+ e1_ccu_conn_pars->e1_link.e1_nr = e1_ccu_ind->e1_nr;
+ e1_ccu_conn_pars->e1_link.e1_ts = e1_ccu_ind->e1_ts;
+ e1_ccu_conn_pars->e1_link.e1_ts_ss = e1_ccu_ind->e1_ts_ss;
+ return 0;
+ }
+ }
+
+ /* Create new entry */
+ e1_ccu_conn_pars = talloc_zero(tall_pcu_ctx, struct e1_ccu_conn_pars);
+ e1_ccu_conn_pars->ts = e1_ccu_ind->ts_nr;
+ e1_ccu_conn_pars->trx_no = e1_ccu_ind->trx_nr;
+ e1_ccu_conn_pars->e1_link.e1_nr = e1_ccu_ind->e1_nr;
+ e1_ccu_conn_pars->e1_link.e1_ts = e1_ccu_ind->e1_ts;
+ e1_ccu_conn_pars->e1_link.e1_ts_ss = e1_ccu_ind->e1_ts_ss;
+ llist_add(&e1_ccu_conn_pars->entry, &e1_ccu_table);
+
+ return 0;
+}
+
static int pcu_rx_time_ind(struct gprs_rlcmac_bts *bts, struct gsm_pcu_if_time_ind *time_ind)
{
uint8_t fn13 = time_ind->fn % 13;
@@ -1195,6 +1267,10 @@
CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.info_ind);
rc = pcu_rx_info_ind(bts, &pcu_prim->u.info_ind);
break;
+ case PCU_IF_MSG_E1_CCU_IND:
+ CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.info_ind);
+ rc = pcu_rx_e1_ccu_ind(bts, &pcu_prim->u.e1_ccu_ind);
+ break;
case PCU_IF_MSG_TIME_IND:
CHECK_IF_MSG_SIZE(pcu_prim_length, pcu_prim->u.time_ind);
rc = pcu_rx_time_ind(bts, &pcu_prim->u.time_ind);
diff --git a/src/pcu_l1_if.h b/src/pcu_l1_if.h
index 416a02c..6085cee 100644
--- a/src/pcu_l1_if.h
+++ b/src/pcu_l1_if.h
@@ -31,6 +31,7 @@
#endif

#include "pdch.h"
+struct gsm_e1_subslot;

static inline uint8_t qta2ta(int16_t qta)
{
@@ -178,6 +179,8 @@
void pcu_rx_block_time(struct gprs_rlcmac_bts *bts, uint16_t arfcn, uint32_t fn, uint8_t ts_no);
uint16_t imsi2paging_group(const char* imsi);

+int pcu_l1if_get_ccu_conn_pars(struct gsm_e1_subslot *e1_link, uint8_t pdch_ts, uint8_t pdch_trx_no);
+
#define PCUIF_HDR_SIZE ( sizeof(struct gsm_pcu_if) - sizeof(((struct gsm_pcu_if *)0)->u) )

#ifdef __cplusplus

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

Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Change-Id: I1f926b023205a9ecf78d8a8586d6ac21cc73eb0a
Gerrit-Change-Number: 31174
Gerrit-PatchSet: 1
Gerrit-Owner: dexter <pmaier@sysmocom.de>
Gerrit-MessageType: newchange