This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
neels gerrit-no-reply at lists.osmocom.orgneels has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bts/+/21078 )
Change subject: fix SAPIs for handover to match 48.058 4.1.{3,4}
......................................................................
fix SAPIs for handover to match 48.058 4.1.{3,4}
Change-Id: Ibea973ccadf5d424213f141f97a61395856b76de
---
M include/osmo-bts/gsm_data.h
M src/common/handover.c
M src/common/l1sap.c
M src/common/rsl.c
M src/common/scheduler.c
M src/osmo-bts-sysmo/oml.c
M src/osmo-bts-trx/l1_if.c
7 files changed, 77 insertions(+), 22 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/78/21078/1
diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h
index 1c1c5d4..f16cb21 100644
--- a/include/osmo-bts/gsm_data.h
+++ b/include/osmo-bts/gsm_data.h
@@ -194,6 +194,28 @@
char *name;
+ /* For handover, activation is described in 3GPP TS 48.058 4.1.3 and 4.1.4:
+ *
+ * | | Access || transmit | activate
+ * | MS Power | Delay || on main channel | dl SACCH
+ * ----------------------------------------------------------------------
+ * async ho no * --> yes no
+ * async ho yes * --> yes may be started
+ * sync ho no no --> yes no
+ * sync ho yes no --> yes may be started
+ * sync ho yes yes --> yes shall be started
+ *
+ * Always start the main channel immediately.
+ * dl_sacch.want_active indicates whether dl SACCH should be activated on CHAN ACT.
+ */
+ struct {
+ bool want_active;
+ /* Indicates whether BTS model specific code has activated the dl SACCH SAPI yet.
+ * Note: after deactivating SACCH on channel release or likewise, this remains true, so it is not an
+ * indicator whether SACCH is still active at any point in time, only for initial activation. */
+ bool activated;
+ } dl_sacch;
+
/* Number of different GsmL1_Sapi_t used in osmo_bts_sysmo is 23.
* Currently we don't share these headers so this is a magic number. */
struct llist_head sapi_cmds;
diff --git a/src/common/handover.c b/src/common/handover.c
index b615932..b8298c3 100644
--- a/src/common/handover.c
+++ b/src/common/handover.c
@@ -112,6 +112,7 @@
/* Set timing advance */
lchan->rqd_ta = acc_delay;
+ lchan->dl_sacch.want_active = true;
/* Stop handover detection, wait for valid frame */
lchan->ho.active = HANDOVER_WAIT_FRAME;
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index c9ec9bf..1181e2e 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -1525,6 +1525,7 @@
{
struct gsm_bts *bts = trx->bts;
struct lapdm_channel *lc;
+ struct gsm_lchan *lchan;
DEBUGPFN(DL1P, rach_ind->fn, "Rx PH-RA.ind\n");
@@ -1557,10 +1558,10 @@
bts->load.rach.access++;
lc = &trx->ts[0].lchan[CCCH_LCHAN].lapdm_ch;
+ lchan = get_lchan_by_chan_nr(trx, rach_ind->chan_nr);
/* According to 3GPP TS 48.058 § 9.3.17 Access Delay is expressed same way as TA (number of symbols) */
- set_ms_to_data(get_lchan_by_chan_nr(trx, rach_ind->chan_nr),
- rach_ind->acc_delay, false);
+ set_ms_to_data(lchan, rach_ind->acc_delay, false);
/* check for packet access */
if ((trx == bts->c0 && L1SAP_IS_PACKET_RACH(rach_ind->ra)) ||
diff --git a/src/common/rsl.c b/src/common/rsl.c
index 660fd0c..35e5d9a 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -1095,6 +1095,7 @@
struct tlv_parsed tp;
uint8_t type;
int rc;
+ bool ms_power_present = false;
if (lchan->state != LCHAN_S_NONE) {
LOGPLCHAN(lchan, DRSL, LOGL_ERROR, "error: lchan is not available, but in state: %s.\n",
@@ -1188,6 +1189,7 @@
if (TLVP_PRES_LEN(&tp, RSL_IE_MS_POWER, 1)) {
lchan->ms_power_ctrl.max = *TLVP_VAL(&tp, RSL_IE_MS_POWER) & 0x1F;
lchan->ms_power_ctrl.current = lchan->ms_power_ctrl.max;
+ ms_power_present = true;
}
/* 9.3.24 Timing Advance */
if (TLVP_PRES_LEN(&tp, RSL_IE_TIMING_ADVANCE, 1))
@@ -1312,6 +1314,18 @@
return 0;
}
+ /* Indicate which SAPIs should be enabled before the first RACH is received, for handover. See 3GPP TS 48.058
+ * 4.1.3 and 4.1.4. */
+ switch (type) {
+ case RSL_ACT_INTER_ASYNC:
+ case RSL_ACT_INTER_SYNC:
+ lchan->dl_sacch.want_active = ms_power_present;
+ break;
+ default:
+ lchan->dl_sacch.want_active = true;
+ break;
+ }
+
/* Remember to send an RSL ACK once the lchan is active */
lchan->rel_act_kind = LCHAN_REL_ACT_RSL;
diff --git a/src/common/scheduler.c b/src/common/scheduler.c
index b61330d..d959eb0 100644
--- a/src/common/scheduler.c
+++ b/src/common/scheduler.c
@@ -858,6 +858,12 @@
return -ENODEV;
}
+ /* For handover detection, there are cases where the SACCH should remain inactive until the first RACH
+ * indicating the TA is received. */
+ if (L1SAP_IS_LINK_SACCH(link_id)
+ && !l1t->ts[tn].chan_state[chan].lchan->dl_sacch.activated)
+ return;
+
LOGL1S(DL1P, LOGL_DEBUG, l1t, tn, chan, fn,
"PH-RTS.ind: chan_nr=0x%02x link_id=0x%02x\n", chan_nr, link_id);
diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c
index e8bfb2d..c70f4ba 100644
--- a/src/osmo-bts-sysmo/oml.c
+++ b/src/osmo-bts-sysmo/oml.c
@@ -1176,10 +1176,10 @@
"%s Trying to activate lchan, but commands in queue\n",
gsm_lchan_name(lchan));
- /* override the regular SAPIs if this is the first hand-over
- * related activation of the LCHAN */
+ /* For handover, always start the main channel immediately. lchan->dl_sacch.want_active indicates whether dl
+ * SACCH should be activated. Also, for HO, start the RACH SAPI. */
if (lchan->ho.active == HANDOVER_ENABLED)
- s4l = &sapis_for_ho;
+ enqueue_sapi_act_cmd(lchan, GsmL1_Sapi_Rach, GsmL1_Dir_RxUplink);
for (i = 0; i < s4l->num_sapis; i++) {
int sapi = s4l->sapis[i].sapi;
@@ -1192,6 +1192,15 @@
fl1h->alive_prim_cnt = 0;
osmo_timer_schedule(&fl1h->alive_timer, 5, 0);
}
+
+ /* For handover, possibly postpone activating the dl SACCH until the HO RACH is received. */
+ if (sapi == GsmL1_Sapi_Sacch && dir == GsmL1_Dir_TxDownlink) {
+ if (!lchan->dl_sacch.want_active)
+ continue;
+ else
+ lchan->dl_sacch.activated = true;
+ }
+
enqueue_sapi_act_cmd(lchan, sapi, dir);
}
@@ -1651,17 +1660,9 @@
return enqueue_sapi_deact_cmd(lchan, sapi, dir);
}
-static int release_sapis_for_ho(struct gsm_lchan *lchan)
+static int release_rach_sapi(struct gsm_lchan *lchan)
{
- int res = 0;
- int i;
-
- const struct lchan_sapis *s4l = &sapis_for_ho;
-
- for (i = s4l->num_sapis-1; i >= 0; i--)
- res |= check_sapi_release(lchan,
- s4l->sapis[i].sapi, s4l->sapis[i].dir);
- return res;
+ return check_sapi_release(lchan, GsmL1_Sapi_Rach, GsmL1_Dir_RxUplink);
}
static int lchan_deactivate_sapis(struct gsm_lchan *lchan)
@@ -1678,12 +1679,18 @@
if (s4l->sapis[i].sapi == GsmL1_Sapi_Sch)
osmo_timer_del(&fl1h->alive_timer);
+ /* If no dl SACCH has been activated, skip its release */
+ if (s4l->sapis[i].sapi == GsmL1_Sapi_Sacch
+ && s4l->sapis[i].dir == GsmL1_Dir_TxDownlink
+ && !lchan->dl_sacch.activated)
+ continue;
+
/* Release if it was allocated */
res |= check_sapi_release(lchan, s4l->sapis[i].sapi, s4l->sapis[i].dir);
}
/* always attempt to disable the RACH burst */
- res |= release_sapis_for_ho(lchan);
+ res |= release_rach_sapi(lchan);
/* nothing was queued */
if (res == 0) {
@@ -1886,13 +1893,13 @@
gsm_lchan_name(lchan));
/* Give up listening to RACH bursts */
- release_sapis_for_ho(lchan);
+ release_rach_sapi(lchan);
- /* Activate the normal SAPIs */
- for (i = 0; i < s4l->num_sapis; i++) {
- int sapi = s4l->sapis[i].sapi;
- int dir = s4l->sapis[i].dir;
- enqueue_sapi_act_cmd(lchan, sapi, dir);
+ /* Activate the dl SACCH if not yet active */
+ if (lchan->dl_sacch.want_active
+ && !lchan->dl_sacch.activated) {
+ enqueue_sapi_act_cmd(lchan, GsmL1_Sapi_Sacch, GsmL1_Dir_TxDownlink);
+ lchan->dl_sacch.activated = true;
}
return 0;
diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c
index fc8ef76..21445da 100644
--- a/src/osmo-bts-trx/l1_if.c
+++ b/src/osmo-bts-trx/l1_if.c
@@ -439,6 +439,10 @@
case PRIM_INFO_MODIFY:
chan_nr = l1sap->u.info.u.act_req.chan_nr;
lchan = get_lchan_by_chan_nr(trx, chan_nr);
+ /* For osmo-bts-trx, the dl_sacch.activated directly has the effect of transmitting the SACCH,
+ * no need to interact with another entity to activate the SAPI. Just set it to whatever the
+ * caller wants. */
+ lchan->dl_sacch.activated = lchan->dl_sacch.want_active;
if (l1sap->u.info.type == PRIM_INFO_ACTIVATE) {
if ((chan_nr & 0xE0) == 0x80) {
LOGPLCHAN(lchan, DL1C, LOGL_ERROR, "Cannot activate"
--
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/21078
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: Ibea973ccadf5d424213f141f97a61395856b76de
Gerrit-Change-Number: 21078
Gerrit-PatchSet: 1
Gerrit-Owner: neels <nhofmeyr at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201109/69ec5b58/attachment.htm>