summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <axilirator@gmail.com>2019-05-30 06:19:10 +0700
committerfixeria <axilirator@gmail.com>2019-06-02 12:44:12 +0000
commit924d2412c4edb1dedf7a55c390ac45e249cb627f (patch)
tree5c71b71eb3eb385f913291390471aa2a22aff292
parent91d5e5e1912fb0181ab2f69b88ed82f43b1ee9c6 (diff)
trxcon/l1ctl.c: properly handle handover RACH request
During the handover the MS needs to release the existing dedicated channel(s), establish the new one(s) as indicated by the network, and then, depending on the synchronisation state, send one or more HANDOVER ACCESS messages carried by Access Bursts. In order to implement this, trxcon needs to be able to transmit Access Bursts on any TDMA timeslot regardless of the logical channel type and the associated handler, i.e. != TRXC_RACH. The controlling side on L1CTL (layer23 or TTCN-3) needs to send one or more L1CTL_RACH_REQ message(s) with properly populated UL info header. Otherwise a regular RACH on TS0 is assumed. Change-Id: Ia967820a536c99966ba2c60b63d2ea9edb093f46
-rw-r--r--src/host/trxcon/l1ctl.c24
-rw-r--r--src/host/trxcon/sched_lchan_rach.c5
-rw-r--r--src/host/trxcon/sched_trx.c6
3 files changed, 20 insertions, 15 deletions
diff --git a/src/host/trxcon/l1ctl.c b/src/host/trxcon/l1ctl.c
index 30f43d07..e722624c 100644
--- a/src/host/trxcon/l1ctl.c
+++ b/src/host/trxcon/l1ctl.c
@@ -512,7 +512,6 @@ static int l1ctl_rx_rach_req(struct l1ctl_link *l1l, struct msgb *msg, bool ext)
struct l1ctl_rach_req *req;
struct l1ctl_info_ul *ul;
struct trx_ts_prim *prim;
- uint8_t chan_nr, link_id;
size_t len;
int rc;
@@ -537,25 +536,24 @@ static int l1ctl_rx_rach_req(struct l1ctl_link *l1l, struct msgb *msg, bool ext)
"(offset=%u, ra=0x%02x)\n", req->offset, req->ra);
}
- /**
- * FIXME: l1ctl_info_ul doesn't provide channel description
- * FIXME: Can we use other than TS0?
- */
- chan_nr = RSL_CHAN_RACH;
- link_id = 0x00;
+ /* The controlling L1CTL side always does include the UL info header,
+ * but may leave it empty. We assume RACH is on TS0 in this case. */
+ if (ul->chan_nr == 0x00) {
+ LOGP(DL1C, LOGL_NOTICE, "The UL info header is empty, "
+ "assuming RACH is on TS0\n");
+ ul->chan_nr = RSL_CHAN_RACH;
+ }
/* Init a new primitive */
- rc = sched_prim_init(l1l->trx, &prim, len, chan_nr, link_id);
+ rc = sched_prim_init(l1l->trx, &prim, len, ul->chan_nr, ul->link_id);
if (rc)
goto exit;
/**
- * Push this primitive to transmit queue
- *
- * FIXME: what if requested TS is not configured?
- * Or what if one (such as TCH) has no TRXC_RACH slots?
+ * Push this primitive to the transmit queue.
+ * Indicated timeslot needs to be configured.
*/
- rc = sched_prim_push(l1l->trx, prim, chan_nr);
+ rc = sched_prim_push(l1l->trx, prim, ul->chan_nr);
if (rc) {
talloc_free(prim);
goto exit;
diff --git a/src/host/trxcon/sched_lchan_rach.c b/src/host/trxcon/sched_lchan_rach.c
index 7d202b89..e96a0e6b 100644
--- a/src/host/trxcon/sched_lchan_rach.c
+++ b/src/host/trxcon/sched_lchan_rach.c
@@ -155,9 +155,10 @@ int tx_rach_fn(struct trx_instance *trx, struct trx_ts *ts,
/* BN85-156: tail bits & extended guard period */
memset(burst_ptr, 0, burst + GSM_BURST_LEN - burst_ptr);
- LOGP(DSCHD, LOGL_DEBUG, "Transmitting %s RACH (%s) fn=%u\n",
+ LOGP(DSCHD, LOGL_NOTICE, "Transmitting %s RACH (%s) on fn=%u, tn=%u, lchan=%s\n",
PRIM_IS_RACH11(lchan->prim) ? "extended (11-bit)" : "regular (8-bit)",
- get_value_string(rach_synch_seq_names, synch_seq), fn);
+ get_value_string(rach_synch_seq_names, synch_seq), fn,
+ ts->index, trx_lchan_desc[lchan->type].name);
/* Forward burst to scheduler */
rc = sched_trx_handle_tx_burst(trx, ts, lchan, fn, burst);
diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c
index 62fe8703..37d1acf6 100644
--- a/src/host/trxcon/sched_trx.c
+++ b/src/host/trxcon/sched_trx.c
@@ -35,6 +35,7 @@
#include <osmocom/core/logging.h>
#include <osmocom/core/linuxlist.h>
+#include "l1ctl_proto.h"
#include "scheduler.h"
#include "sched_trx.h"
#include "trx_if.h"
@@ -116,6 +117,11 @@ static void sched_frame_clck_cb(struct trx_sched *sched)
if (lchan->prim == NULL)
continue;
+ /* Handover RACH needs to be handled regardless of the
+ * current channel type and the associated handler. */
+ if (PRIM_IS_RACH(lchan->prim) && lchan->prim->chan != TRXC_RACH)
+ handler = trx_lchan_desc[TRXC_RACH].tx_fn;
+
/* Poke lchan handler */
handler(trx, ts, lchan, fn, bid);
}