ASCI: Increase channel request history to 5 entries

3 entries are enough for random access on CCCH. 5 are required for
uplink request on VGCS channel.

The history is used to remember when the random access bursts were send.
The RR layer can check if the IMMEDIATE ASSIGNMENT or VGCS UPLINK GRANT
message has matching frame number and random value of up to 5 random
access bursts previously sent.

Related: OS#5364
Change-Id: I62f18685bf05663f3ee6e94f6884ffb9a6b07ea4
This commit is contained in:
Andreas Eversberg 2023-09-11 14:25:01 +02:00
parent dd60a527be
commit bb32882adc
2 changed files with 13 additions and 15 deletions

View File

@ -159,7 +159,7 @@ struct gsm48_rrlayer {
/* cr_hist */
uint8_t cr_ra; /* stores requested ra until confirmed */
struct gsm48_cr_hist cr_hist[3];
struct gsm48_cr_hist cr_hist[5];
/* V(SD) sequence numbers */
uint16_t v_sd; /* 16 PD 1-bit sequence numbers packed */

View File

@ -84,6 +84,9 @@
#include <l1ctl_proto.h>
/* Check response for the last 3 channel requests only. See TS 44.018 §3.3.1.1.3.1 and §3.3.1.1.3.2. */
#define IMM_ASS_HISTORY 3
static void start_rr_t_meas(struct gsm48_rrlayer *rr, int sec, int micro);
static void stop_rr_t_starting(struct gsm48_rrlayer *rr);
static void stop_rr_t3124(struct gsm48_rrlayer *rr);
@ -1489,12 +1492,10 @@ rel_ind:
return -EINVAL;
}
/* store value, mask and history */
/* store value, mask and clear history */
rr->chan_req_val = chan_req_val;
rr->chan_req_mask = chan_req_mask;
rr->cr_hist[2].valid = 0;
rr->cr_hist[1].valid = 0;
rr->cr_hist[0].valid = 0;
memset(rr->cr_hist, 0, sizeof(rr->cr_hist));
/* store establishment cause, so 'choose cell' selects the last cell
* after location updating */
@ -1545,10 +1546,7 @@ int gsm48_rr_tx_rand_acc(struct osmocom_ms *ms, struct msgb *msg)
}
/* shift history and store */
memcpy(&(rr->cr_hist[2]), &(rr->cr_hist[1]),
sizeof(struct gsm48_cr_hist));
memcpy(&(rr->cr_hist[1]), &(rr->cr_hist[0]),
sizeof(struct gsm48_cr_hist));
memmove(rr->cr_hist + 1, rr->cr_hist, sizeof(rr->cr_hist) - sizeof(rr->cr_hist[0]));
rr->cr_hist[0].valid = 1;
rr->cr_hist[0].ref.ra = rr->cr_ra;
rr->cr_hist[0].ref.t1 = ref->t1;
@ -2364,14 +2362,14 @@ static int gsm48_rr_rx_pag_req_3(struct osmocom_ms *ms, struct msgb *msg)
*/
/* match request reference against request history */
static int gsm48_match_ra(struct osmocom_ms *ms, struct gsm48_req_ref *ref)
static int gsm48_match_ra(struct osmocom_ms *ms, struct gsm48_req_ref *ref, uint8_t hist_num)
{
struct gsm48_rrlayer *rr = &ms->rrlayer;
int i;
uint8_t ia_t1, ia_t2, ia_t3;
uint8_t cr_t1, cr_t2, cr_t3;
for (i = 0; i < 3; i++) {
for (i = 0; i < hist_num; i++) {
/* filter confirmed RACH requests only */
if (rr->cr_hist[i].valid && ref->ra == rr->cr_hist[i].ref.ra) {
ia_t1 = ref->t1;
@ -2492,7 +2490,7 @@ static int gsm48_rr_rx_imm_ass(struct osmocom_ms *ms, struct msgb *msg)
}
/* request ref */
if (gsm48_match_ra(ms, &ia->req_ref)) {
if (gsm48_match_ra(ms, &ia->req_ref, IMM_ASS_HISTORY)) {
/* channel description */
memcpy(&rr->cd_now, &cd, sizeof(rr->cd_now));
/* timing advance */
@ -2640,7 +2638,7 @@ static int gsm48_rr_rx_imm_ass_ext(struct osmocom_ms *ms, struct msgb *msg)
}
/* request ref 1 */
if (gsm48_match_ra(ms, &ia->req_ref1)) {
if (gsm48_match_ra(ms, &ia->req_ref1, IMM_ASS_HISTORY)) {
/* channel description */
memcpy(&rr->cd_now, &cd1, sizeof(rr->cd_now));
/* timing advance */
@ -2656,7 +2654,7 @@ static int gsm48_rr_rx_imm_ass_ext(struct osmocom_ms *ms, struct msgb *msg)
return gsm48_rr_dl_est(ms);
}
/* request ref 2 */
if (gsm48_match_ra(ms, &ia->req_ref2)) {
if (gsm48_match_ra(ms, &ia->req_ref2, IMM_ASS_HISTORY)) {
/* channel description */
memcpy(&rr->cd_now, &cd2, sizeof(rr->cd_now));
/* timing advance */
@ -2706,7 +2704,7 @@ static int gsm48_rr_rx_imm_ass_rej(struct osmocom_ms *ms, struct msgb *msg)
(((uint8_t *)&ia->req_ref1) + i * 4);
LOGP(DRR, LOGL_INFO, "IMMEDIATE ASSIGNMENT REJECT "
"(ref 0x%02x)\n", req_ref->ra);
if (gsm48_match_ra(ms, req_ref)) {
if (gsm48_match_ra(ms, req_ref, IMM_ASS_HISTORY)) {
/* wait indication */
t3122_value = *(((uint8_t *)&ia->wait_ind1) + i * 4);
if (t3122_value)