summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-01-12 20:47:33 +0600
committerfixeria <vyanitskiy@sysmocom.de>2023-01-12 14:55:01 +0000
commitc209242d196a9c30401c383104f5063d4dbde4cd (patch)
treee2c4831c6752bacd22bdb21949102340ede735d8
parent372f65d17257749911ba5be22216fcbed92a1a93 (diff)
modem: send CHANNEL REQUEST from modem_rx_bcch()
Sending CHANNEL REQUEST from handle_si13() was a bad idea because this function returns early if SI13 was received before SI1. Change-Id: I21f1d68cb9b1d20b356697ba1efe28c3d87fa004 Fixes: 49d993e4abdd8fac8b111e92078563fd9bb28df1 Related: OS#5500
-rw-r--r--src/host/layer23/src/modem/app_modem.c39
1 files changed, 24 insertions, 15 deletions
diff --git a/src/host/layer23/src/modem/app_modem.c b/src/host/layer23/src/modem/app_modem.c
index ec267e58..8af32430 100644
--- a/src/host/layer23/src/modem/app_modem.c
+++ b/src/host/layer23/src/modem/app_modem.c
@@ -67,6 +67,26 @@ static uint8_t gen_chan_req(bool single_block)
return 0x78 | (rnd & 0x07);
}
+static int modem_tx_chan_req(struct osmocom_ms *ms, bool single_block)
+{
+ struct gsm48_rrlayer *rr = &ms->rrlayer;
+
+ OSMO_ASSERT(rr->state == GSM48_RR_ST_IDLE);
+
+ if (!app_data.si.si1)
+ return -EBUSY;
+ if (!app_data.si.gprs.supported)
+ return -ENOTSUP;
+
+ rr->cr_ra = gen_chan_req(single_block);
+ LOGP(DRR, LOGL_NOTICE, "Sending CHANNEL REQUEST (0x%02x)\n", rr->cr_ra);
+ l1ctl_tx_rach_req(ms, RSL_CHAN_RACH, 0x00, rr->cr_ra, 0,
+ app_data.ccch_mode == CCCH_MODE_COMBINED);
+
+ rr->state = GSM48_RR_ST_CONN_PEND;
+ return 0;
+}
+
static int handle_si1(struct osmocom_ms *ms, struct msgb *msg)
{
int rc;
@@ -147,7 +167,6 @@ static int handle_si4(struct osmocom_ms *ms, struct msgb *msg)
static int handle_si13(struct osmocom_ms *ms, struct msgb *msg)
{
- struct gsm48_rrlayer *rr = &ms->rrlayer;
int rc;
if (msgb_l3len(msg) != GSM_MACBLOCK_LEN)
@@ -159,20 +178,6 @@ static int handle_si13(struct osmocom_ms *ms, struct msgb *msg)
if (rc != 0)
return rc;
- /* HACK: request an Uplink TBF here (one phase access) */
- if (rr->state == GSM48_RR_ST_IDLE) {
- if (!app_data.si.si1)
- return 0;
- if (!app_data.si.gprs.supported)
- return 0;
-
- rr->cr_ra = gen_chan_req(false);
- LOGP(DRR, LOGL_NOTICE, "Sending CHANNEL REQUEST (0x%02x)\n", rr->cr_ra);
- l1ctl_tx_rach_req(ms, RSL_CHAN_RACH, 0x00, rr->cr_ra, 0,
- app_data.ccch_mode == CCCH_MODE_COMBINED);
- rr->state = GSM48_RR_ST_CONN_PEND;
- }
-
return 0;
}
@@ -184,6 +189,10 @@ static int modem_rx_bcch(struct osmocom_ms *ms, struct msgb *msg)
LOGP(DRR, LOGL_INFO, "BCCH message (type=0x%02x): %s\n",
si_type, gsm48_rr_msg_name(si_type));
+ /* HACK: request an Uplink TBF here (one phase access) */
+ if (ms->rrlayer.state == GSM48_RR_ST_IDLE)
+ modem_tx_chan_req(ms, false);
+
switch (si_type) {
case GSM48_MT_RR_SYSINFO_1:
return handle_si1(ms, msg);