fixeria has uploaded this change for review.

View Change

rlcmac: deal with RACH retransmissions (drop rach_req_ra)

The RA value does change during RACH retransmissions, so we cannot
expect a specific value in gprs_rlcmac_handle_ccch_imm_ass_ul_tbf()
anymore. Offload checking it to the lower layers.

* Rename submit_rach_req() to submit_packet_access_req().
* Get rid of gen_chan_req(), indicate only the access cause.

Ideally, we should also rename the OSMO_GPRS_RLCMAC_L1CTL_RACH
to something like OSMO_GPRS_RLCMAC_L1CTL_PKT_CHAN_ACCESS, but
let's better do this separately.

Change-Id: If0de3ed86b1e2897d70183f3b0f4fbfd7d2bda80
Related: osmocom-bb.git Iab6d9147f6e0aeb99239affacf318a3897fd6ffe
Related: OS#5500, OS#6131
---
M include/osmocom/gprs/rlcmac/tbf_ul_ass_fsm.h
M src/rlcmac/rlcmac.c
M src/rlcmac/tbf_ul_ass_fsm.c
3 files changed, 42 insertions(+), 25 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/libosmo-gprs refs/changes/12/34512/1
diff --git a/include/osmocom/gprs/rlcmac/tbf_ul_ass_fsm.h b/include/osmocom/gprs/rlcmac/tbf_ul_ass_fsm.h
index ad32471..162517d 100644
--- a/include/osmocom/gprs/rlcmac/tbf_ul_ass_fsm.h
+++ b/include/osmocom/gprs/rlcmac/tbf_ul_ass_fsm.h
@@ -35,7 +35,6 @@
};
const struct gprs_rlcmac_dl_tbf *dl_tbf; /* Not null if assignment was started by a DL TBF ACK/NACK */
enum gprs_rlcmac_tbf_ul_ass_type ass_type;
- uint8_t rach_req_ra;
struct gprs_rlcmac_ul_tbf_allocation phase1_alloc;
struct gprs_rlcmac_ul_tbf_allocation phase2_alloc;
bool tbf_starting_time_exists;
@@ -85,7 +84,7 @@
int gprs_rlcmac_tbf_ul_ass_start_from_dl_tbf_ack_nack(struct gprs_rlcmac_ul_tbf *ul_tbf, const struct gprs_rlcmac_dl_tbf *dl_tbf, uint8_t tn);

bool gprs_rlcmac_tbf_ul_ass_pending(struct gprs_rlcmac_ul_tbf *ul_tbf);
-bool gprs_rlcmac_tbf_ul_ass_match_rach_req(struct gprs_rlcmac_ul_tbf *ul_tbf, uint8_t ra);
+bool gprs_rlcmac_tbf_ul_ass_wait_ccch_imm_ass(const struct gprs_rlcmac_ul_tbf *ul_tbf);
bool gprs_rlcmac_tbf_ul_ass_waiting_tbf_starting_time(const struct gprs_rlcmac_ul_tbf *ul_tbf);
void gprs_rlcmac_tbf_ul_ass_fn_tick(const struct gprs_rlcmac_ul_tbf *ul_tbf, uint32_t fn, uint8_t ts_nr);
bool gprs_rlcmac_tbf_ul_ass_rts(const struct gprs_rlcmac_ul_tbf *ul_tbf, const struct gprs_rlcmac_rts_block_ind *bi);
diff --git a/src/rlcmac/rlcmac.c b/src/rlcmac/rlcmac.c
index 212b801..2c809ec 100644
--- a/src/rlcmac/rlcmac.c
+++ b/src/rlcmac/rlcmac.c
@@ -219,7 +219,7 @@
ul_tbf = gre->ul_tbf;
if (!ul_tbf)
continue;
- if (!gprs_rlcmac_tbf_ul_ass_match_rach_req(ul_tbf, ia->req_ref.ra))
+ if (!gprs_rlcmac_tbf_ul_ass_wait_ccch_imm_ass(ul_tbf))
continue;
rc = osmo_fsm_inst_dispatch(ul_tbf->ul_ass_fsm.fi,
GPRS_RLCMAC_TBF_UL_ASS_EV_RX_CCCH_IMM_ASS,
diff --git a/src/rlcmac/tbf_ul_ass_fsm.c b/src/rlcmac/tbf_ul_ass_fsm.c
index 5587ddb..64797aa 100644
--- a/src/rlcmac/tbf_ul_ass_fsm.c
+++ b/src/rlcmac/tbf_ul_ass_fsm.c
@@ -103,27 +103,24 @@
return NULL;
}

-/* Generate a 8-bit CHANNEL REQUEST message as per 3GPP TS 44.018, 9.1.8 */
-static uint8_t gen_chan_req(bool single_block)
-{
- uint8_t rnd = (uint8_t)rand();
-
- if (single_block) /* 01110xxx */
- return 0x70 | (rnd & 0x07);
-
- /* 011110xx or 01111x0x or 01111xx0 */
- if ((rnd & 0x07) == 0x07)
- return 0x78;
- return 0x78 | (rnd & 0x07);
-}
-
-static int submit_rach_req(struct gprs_rlcmac_tbf_ul_ass_fsm_ctx *ctx)
+static int submit_packet_access_req(const struct gprs_rlcmac_tbf_ul_ass_fsm_ctx *ctx)
{
struct osmo_gprs_rlcmac_prim *rlcmac_prim;
- ctx->rach_req_ra = gen_chan_req(ctx->ass_type == GPRS_RLCMAC_TBF_UL_ASS_TYPE_2PHASE);

- LOGPFSML(ctx->fi, LOGL_INFO, "Send RACH.req ra=0x%02x\n", ctx->rach_req_ra);
- rlcmac_prim = gprs_rlcmac_prim_alloc_l1ctl_rach8_req(ctx->rach_req_ra);
+ switch (ctx->ass_type) {
+ case GPRS_RLCMAC_TBF_UL_ASS_TYPE_1PHASE:
+ /* 3GPP TS 44.018, table 9.1.8.1: cause 011110xx or 01111x0x or 01111xx0 */
+ LOGPFSML(ctx->fi, LOGL_INFO, "Requesting one-phase packet access using CCCH\n");
+ rlcmac_prim = gprs_rlcmac_prim_alloc_l1ctl_rach8_req(0x78);
+ break;
+ case GPRS_RLCMAC_TBF_UL_ASS_TYPE_2PHASE:
+ /* 3GPP TS 44.018, table 9.1.8.1: cause 011110xx */
+ LOGPFSML(ctx->fi, LOGL_INFO, "Requesting two-phase packet access using CCCH\n");
+ rlcmac_prim = gprs_rlcmac_prim_alloc_l1ctl_rach8_req(0x70);
+ break;
+ /* TODO: EGPRS specific modes (11-bit RACH) */
+ }
+
return gprs_rlcmac_prim_call_down_cb(rlcmac_prim);
}

@@ -271,7 +268,7 @@
/* Inform the main TBF state about the assignment starting: */
osmo_fsm_inst_dispatch(ctx->ul_tbf->state_fsm.fi, GPRS_RLCMAC_TBF_UL_EV_UL_ASS_START, NULL);
ctx->ass_type = *(enum gprs_rlcmac_tbf_ul_ass_type *)data;
- rc = submit_rach_req(ctx);
+ rc = submit_packet_access_req(ctx);
if (rc < 0) {
osmo_fsm_inst_dispatch(ctx->ul_tbf->state_fsm.fi, GPRS_RLCMAC_TBF_UL_EV_UL_ASS_REJ, NULL);
break;
@@ -702,10 +699,9 @@
return ul_tbf->ul_ass_fsm.fi->state != GPRS_RLCMAC_TBF_UL_ASS_ST_IDLE;
}

-bool gprs_rlcmac_tbf_ul_ass_match_rach_req(struct gprs_rlcmac_ul_tbf *ul_tbf, uint8_t ra)
+bool gprs_rlcmac_tbf_ul_ass_wait_ccch_imm_ass(const struct gprs_rlcmac_ul_tbf *ul_tbf)
{
- return ul_tbf->ul_ass_fsm.fi->state == GPRS_RLCMAC_TBF_UL_ASS_ST_WAIT_CCCH_IMM_ASS &&
- ul_tbf->ul_ass_fsm.rach_req_ra == ra;
+ return ul_tbf->ul_ass_fsm.fi->state == GPRS_RLCMAC_TBF_UL_ASS_ST_WAIT_CCCH_IMM_ASS;
}

bool gprs_rlcmac_tbf_ul_ass_waiting_tbf_starting_time(const struct gprs_rlcmac_ul_tbf *ul_tbf)

To view, visit change 34512. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: libosmo-gprs
Gerrit-Branch: master
Gerrit-Change-Id: If0de3ed86b1e2897d70183f3b0f4fbfd7d2bda80
Gerrit-Change-Number: 34512
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de>
Gerrit-MessageType: newchange