aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2013-08-31 19:49:12 +0200
committerHarald Welte <laforge@gnumonks.org>2015-09-06 12:37:08 +0200
commitbf8962041f779b6b3d4d0fbbc5c11994b65bc3f8 (patch)
tree750112c2021daffdd3ecb81209fefbf53ffd3c75
parent06d41facb1f782080107ba0417b1eb5e84270e1e (diff)
Add TIME (MPH_INFO) IND messages to PH-/MPH-/TCH-SAP interface
This part moves GSM time handling from osmo-bts-sysmo part to common part.
-rw-r--r--include/osmo-bts/gsm_data.h1
-rw-r--r--src/common/l1sap.c50
-rw-r--r--src/osmo-bts-sysmo/l1_if.c65
3 files changed, 78 insertions, 38 deletions
diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h
index 0562ecaf..f2f7ee74 100644
--- a/include/osmo-bts/gsm_data.h
+++ b/include/osmo-bts/gsm_data.h
@@ -81,6 +81,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 */
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index 633a5a5b..6cb636d7 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -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;
diff --git a/src/osmo-bts-sysmo/l1_if.c b/src/osmo-bts-sysmo/l1_if.c
index 12c063ff..bf7cc4c0 100644
--- a/src/osmo-bts-sysmo/l1_if.c
+++ b/src/osmo-bts-sysmo/l1_if.c
@@ -563,6 +563,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)
@@ -815,44 +842,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)
{