dexter has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-pcu/+/31174 )
Change subject: pcu_l1_if: receive E1 connection parameters ......................................................................
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