aboutsummaryrefslogtreecommitdiffstats
path: root/src/common/rsl.c
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2017-03-07 17:30:35 +0100
committerMax <msuraev@sysmocom.de>2017-04-26 12:42:09 +0200
commitb4bf603c9866cf8ed7c59b812fc84b3138bb4dda (patch)
treee4ad59d3434a2909c21062f9544845124a3aad10 /src/common/rsl.c
parent25742a5929edecc545a4fc254f678cc834f8c3b3 (diff)
Add MS TO to RSL measurements
Add optional MS timing offset (3GPP TS 45.010 § 1.2) to RSL MEASUREMENT RESULT (3GPP TS 48.058 § 8.4.8). The value is calculated either directly from corresponding BTS measurement or from 3GPP TS 48.058 § 9.3.17 Access Delay (for known TA) and is invalidated after RSL report is sent until new measurement indication or RACH is received. Change-Id: I4dfe5c48834a083e757d5de3236a02e15a238b28 Related: OS#1574
Diffstat (limited to 'src/common/rsl.c')
-rw-r--r--src/common/rsl.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/common/rsl.c b/src/common/rsl.c
index 1d0bcea7..5fe5a1d3 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -2220,8 +2220,18 @@ static int rslms_is_meas_rep(struct msgb *msg)
return 0;
}
+static inline uint8_t ms_to2rsl(const struct gsm_lchan *lchan, const struct lapdm_entity *le)
+{
+ return (lchan->ms_t_offs >= 0) ? lchan->ms_t_offs : (lchan->p_offs - le->ta);
+}
+
+static inline bool ms_to_valid(const struct gsm_lchan *lchan)
+{
+ return (lchan->ms_t_offs >= 0) || (lchan->p_offs >= 0);
+}
+
/* 8.4.8 MEASUREMENT RESult */
-static int rsl_tx_meas_res(struct gsm_lchan *lchan, uint8_t *l3, int l3_len)
+static int rsl_tx_meas_res(struct gsm_lchan *lchan, uint8_t *l3, int l3_len, const struct lapdm_entity *le)
{
struct msgb *msg;
uint8_t meas_res[16];
@@ -2253,7 +2263,11 @@ static int rsl_tx_meas_res(struct gsm_lchan *lchan, uint8_t *l3, int l3_len)
lchan->meas.flags &= ~LC_UL_M_F_L1_VALID;
}
msgb_tl16v_put(msg, RSL_IE_L3_INFO, l3_len, l3);
- //msgb_tv_put(msg, RSL_IE_MS_TIMING_OFFSET, FIXME);
+ if (ms_to_valid(lchan)) {
+ msgb_tv_put(msg, RSL_IE_MS_TIMING_OFFSET, ms_to2rsl(lchan, le));
+ lchan->ms_t_offs = -1;
+ lchan->p_offs = -1;
+ }
rsl_dch_push_hdr(msg, RSL_MT_MEAS_RES, chan_nr);
msg->trx = lchan->ts->trx;
@@ -2267,8 +2281,6 @@ int lapdm_rll_tx_cb(struct msgb *msg, struct lapdm_entity *le, void *ctx)
struct gsm_lchan *lchan = ctx;
struct abis_rsl_common_hdr *rh;
- /* NOTE: Parameter lapdm_entity *le is ignored */
-
OSMO_ASSERT(msg);
rh = msgb_l2(msg);
@@ -2306,7 +2318,7 @@ int lapdm_rll_tx_cb(struct msgb *msg, struct lapdm_entity *le, void *ctx)
return 0;
}
- rc = rsl_tx_meas_res(lchan, msgb_l3(msg), msgb_l3len(msg));
+ rc = rsl_tx_meas_res(lchan, msgb_l3(msg), msgb_l3len(msg), le);
msgb_free(msg);
return rc;
} else {