@@ -80,6 +80,7 @@ struct gsm_bts_role_bts {
struct {
uint8_t tc4_ctr;
} si;
+ struct gsm_time gsm_time;
uint8_t radio_link_timeout;
/* used by the sysmoBTS to adjust band */
@@ -69,6 +69,53 @@ struct msgb *l1sap_msgb_alloc(unsigned int l2_len)
return msg;
}
+/* time information received from bts model */
+static int l1sap_info_time_ind(struct gsm_bts_trx *trx,
+ struct osmo_phsap_prim *l1sap,
+ struct info_time_ind_param *info_time_ind)
+{
+ struct gsm_bts *bts = trx->bts;
+ struct gsm_bts_role_bts *btsb = bts->role;
+
+ DEBUGP(DL1P, "MPH_INFO time ind %u\n", info_time_ind->fn);
+
+ /* Update our data structures with the current GSM time */
+ gsm_fn2gsmtime(&btsb->gsm_time, info_time_ind->fn);
+
+ /* Update time on PCU interface */
+ pcu_tx_time_ind(info_time_ind->fn);
+
+ /* check if the measurement period of some lchan has ended
+ * and pre-compute the respective measurement */
+ trx_meas_check_compute(trx, info_time_ind->fn - 1);
+
+ /* increment 'total' for every possible rach */
+ if (bts->c0->ts[0].pchan != GSM_PCHAN_CCCH_SDCCH4
+ || (info_time_ind->fn % 51) < 27)
+ btsb->load.rach.total++;
+
+ return 0;
+}
+
+/* any L1 MPH_INFO indication prim recevied from bts model */
+static int l1sap_mph_info_ind(struct gsm_bts_trx *trx,
+ struct osmo_phsap_prim *l1sap, struct mph_info_param *info)
+{
+ int rc = 0;
+
+ switch (info->type) {
+ case PRIM_INFO_TIME:
+ rc = l1sap_info_time_ind(trx, l1sap, &info->u.time_ind);
+ break;
+ default:
+ LOGP(DL1P, LOGL_NOTICE, "unknown MPH_INFO ind type %d\n",
+ info->type);
+ break;
+ }
+
+ return rc;
+}
+
/* PH-RTS-IND prim recevied from bts model */
static int l1sap_ph_rts_ind(struct gsm_bts_trx *trx,
struct osmo_phsap_prim *l1sap, struct ph_data_param *rts_ind)
@@ -262,6 +309,9 @@ int l1sap_up(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap)
int rc = 0;
switch (OSMO_PRIM_HDR(&l1sap->oph)) {
+ case OSMO_PRIM(PRIM_MPH_INFO, PRIM_OP_INDICATION):
+ rc = l1sap_mph_info_ind(trx, l1sap, &l1sap->u.info);
+ break;
case OSMO_PRIM(PRIM_PH_RTS, PRIM_OP_INDICATION):
rc = l1sap_ph_rts_ind(trx, l1sap, &l1sap->u.data);
break;
@@ -553,6 +553,33 @@ int bts_model_l1sap_down(struct gsm_bts_trx *trx, struct osmo_phsap_prim *l1sap)
return rc;
}
+static int handle_mph_time_ind(struct femtol1_hdl *fl1,
+ GsmL1_MphTimeInd_t *time_ind)
+{
+ struct gsm_bts_trx *trx = fl1->priv;
+ struct gsm_bts *bts = trx->bts;
+ struct osmo_phsap_prim l1sap;
+ uint32_t fn;
+
+ /* increment the primitive count for the alive timer */
+ fl1->alive_prim_cnt++;
+
+ /* ignore every time indication, except for c0 */
+ if (trx != bts->c0) {
+ return 0;
+ }
+
+ fn = time_ind->u32Fn;
+
+ memset(&l1sap, 0, sizeof(l1sap));
+ osmo_prim_init(&l1sap.oph, SAP_GSM_PH, PRIM_MPH_INFO,
+ PRIM_OP_INDICATION, NULL);
+ l1sap.u.info.type = PRIM_INFO_TIME;
+ l1sap.u.info.u.time_ind.fn = fn;
+
+ return l1sap_up(trx, &l1sap);
+}
+
static uint8_t chan_nr_by_sapi(enum gsm_phys_chan_config pchan,
GsmL1_Sapi_t sapi, GsmL1_SubCh_t subCh,
uint8_t u8Tn, uint32_t u32Fn)
@@ -797,44 +824,6 @@ empty_frame:
goto tx;
}
-static int handle_mph_time_ind(struct femtol1_hdl *fl1,
- GsmL1_MphTimeInd_t *time_ind)
-{
- struct gsm_bts_trx *trx = fl1->priv;
- struct gsm_bts *bts = trx->bts;
- struct gsm_bts_role_bts *btsb = bts->role;
-
- int frames_expired = time_ind->u32Fn - fl1->gsm_time.fn;
-
- /* update time on PCU interface */
- pcu_tx_time_ind(time_ind->u32Fn);
-
- /* Update our data structures with the current GSM time */
- gsm_fn2gsmtime(&fl1->gsm_time, time_ind->u32Fn);
-
- /* check if the measurement period of some lchan has ended
- * and pre-compute the respective measurement */
- trx_meas_check_compute(fl1->priv, time_ind->u32Fn -1);
-
- /* increment the primitive count for the alive timer */
- fl1->alive_prim_cnt++;
-
- /* increment number of RACH slots that have passed by since the
- * last time indication */
- if (trx == bts->c0) {
- unsigned int num_rach_per_frame;
- /* 27 / 51 taken from TS 05.01 Figure 3 */
- if (bts->c0->ts[0].pchan == GSM_PCHAN_CCCH_SDCCH4)
- num_rach_per_frame = 27;
- else
- num_rach_per_frame = 51;
-
- btsb->load.rach.total += frames_expired * num_rach_per_frame;
- }
-
- return 0;
-}
-
/* determine LAPDm entity inside LAPDm channel for given L1 sapi */
static struct lapdm_entity *le_by_l1_sapi(struct lapdm_channel *lc, GsmL1_Sapi_t sapi)
{
From: Andreas Eversberg <jolly@eversberg.eu> This part moves GSM time handling from osmo-bts-sysmo part to common part. --- include/osmo-bts/gsm_data.h | 1 + src/common/l1sap.c | 50 ++++++++++++++++++++++++++++++++++ src/osmo-bts-sysmo/l1_if.c | 65 +++++++++++++++++++-------------------------- 3 files changed, 78 insertions(+), 38 deletions(-)