Commit Graph

156 Commits

Author SHA1 Message Date
Pau Espin 27d2c697e5 tbf_ul: Clean and assert code path generating new UL data block
Clarify the several paths when generating a new BSN (UL data block).
The function create_new_bsn() is only called if there's some LLC frame
ready to be transmitted and put in ul_tbf->llc_tx_msg, so the do while
{} condition checking for no llc_tx_msg is guaranteed to only be run in
the event some LLC frame chunks have been included in the UL RLC block.
This fact allows simplifying the code and at the same time fix a
Coverity CID regarding a code path which could not really happen. We now
guard this case with an ASSERT.

Related: Coverity CID#345063
Change-Id: I6d4ae377a60839f76295c0e7e6aaa1fe53e37315
2024-02-06 11:43:29 +01:00
Vadim Yanitskiy 053b5e73e8 rlcmac: refactor gprs_rlcmac_rlc_ul_window_move_window()
* drop unused variable 'i' (fixes -Wunused-but-set-variable)
* reduce nesting in the for-loop

Change-Id: Ic0efd2f84a17d287b73261c102bca84e8274bb2a
2024-02-05 23:31:37 +07:00
Pau Espin 8c98d1332e rlcmac: Fix Last RLC block (CV=0) not encoding >1 LLC frames
Before this patch, the last RLC block (CV=0) would only be filled with
up to 1 LLC frame, even if several LLC frames were enqueued and expected
to be put in that RLC frame (CV calculation).
Fixes the unit test provided in an earlier patch.

Related: OS#6351
Change-Id: Id51f595f967b721a5ebe9d44b4e31b6ef9c1b4ae
2024-02-05 16:04:06 +01:00
Pau Espin 0f5d5a4836 rlcmac: tbf_ul: Fix wrong parenthesis around macro
The logic doesn't seem to be affected by the fact that the parenthesis
were wrong.

Change-Id: I3f4aeff45c3fd5a007b050bd78283baaca2a18d7
2024-02-05 16:02:36 +01:00
Pau Espin 20853c3bf9 rlcmac: Implement RLC_OCTET_COUNT in DL ACK/NACK
This helps debugging what's already in the MS tx queue when requesting a
new UL TBF.

Change-Id: Ie5f399fa0bffed8e39811075feba47a54054c8e5
2024-02-05 16:02:32 +01:00
Pau Espin ffc388ed4c Delay deleting UL TBF until last Pkt Ctrl Ack is fully transmitted
This in turn delays reconfiguring the lower layers (L1CTL-CFG_UL_TBF.req
mask=0x0) until the last block has been transmited.

Change-Id: Ic38b4207623ccbda3b77d4b0a47431c25de95034
2024-02-05 16:00:32 +01:00
Vadim Yanitskiy 5e0c5d990f rlcmac: add definition for OSMO_GPRS_RLCMAC_L1CTL_PDCH_DATA | Cnf
Change-Id: I145b9586f83ae0235b4648916bd44996e8dc57f0
2024-02-02 23:49:53 +01:00
Pau Espin d4c441f431 rlcmac: ul_tbf: Register UL ACK/NACK poll inside FSM
The poll is part of the FSM mechanism to get events to transit over the
different states. Register it from within the FSM to have more fine
grained control as well as have knowledge about the FN being reserved.

This knowledge will be used ina follow up patch for the UL TBF to wait
for the correct PKT CTRL ACK BLOCk.conf.

Change-Id: Iaa8ad8052b9f3b52b05af2b7fc9cb8172f1b6bb7
2024-02-02 23:49:53 +01:00
Pau Espin 31b298dfa5 rlcmac: Add new structure to allow passing FN+TN to TBF handling functions
The different paths will be updated as required as needed in the future.
Until now it was difficult while still valuable to have access to
current FN+TS, even if only for logging.

Follow up patch will use this info to be able to calculate poll FN from
RRBP more deep in the stack (ul_tbf_fsm).

Change-Id: Ifa09cd70c915aa3a2b799412cb02315aaebc0503
2024-02-02 23:49:48 +01:00
Pau Espin e9ea7fc768 cosmetic: tbf_ul_fsm: add missing state to tdef_state_timeout array
Change-Id: I6e825a105de4a49329912db6c79aaebbfd3ddf9f
2024-02-01 17:20:37 +01:00
Pau Espin b0aae5bcd1 rlcmac: ul_tbf: Implement T3180
Related: OS#6209
Change-Id: I350b277532d36ed7928b33ee3b77d98d083a3179
2023-10-17 12:10:21 +02:00
Pau Espin 8d347143ba rlcmac: Avoid re-arming T3182 in TBF Acknowledged mode
Re-arming upon retransmission of block CV=0 is only described in the
unacknowledged mode of operation.

Change-Id: I532def7f87367b446b5370daf8c81f511e26eb5f
2023-10-17 10:09:19 +00:00
Pau Espin 383150fe06 tbf_ul_fsm: Avoid freeing tbf after 4 CV=0 retrans in acknowledged mode
The restriction to only to transmit last data block (CV=0) up to 4 times
only applies in Unacknowledged mode of operation, which we don't
support. Hence, simply comment it out so that it can be enabled if
unacknowledge mode is ever supported.

Related: OS#6208
Change-Id: Ie7cdb286b9c7255e3fbf9f936f103fab04acf96a
2023-10-06 19:45:40 +02:00
Pau Espin df4f1cf0a3 rlcmac: tbf_ul_ass_fsm: Fix logic delay starting time
The previous logic was wrongly written. We want:
* If PKT UL ASS didn't have a tbf_starting_time but had an S/P+RRBP,
  it means we have to delay completing the FSM until we send the PKT CTRL ACK (next_blk)
* If it contained tbf_starting_time, if it happens before next_blk, still wait until next_blk

Change-Id: I60cdc0315e28f71843c51eba88acc78780c6ab43
2023-10-05 17:49:01 +02:00
Pau Espin 7475f79fb5 rlcmac: tbf_ul_ass_fsm: Fix 'sba' field wrongly reset to true
Change-Id: Ibf0c60516c337f4428ff33afbfb65a39a37a3719
2023-10-05 15:14:14 +02:00
Vadim Yanitskiy 5162449b71 rlcmac: migrate from fn_cmp() to gsm0502_fncmp()
Change-Id: I3030d00c6881713a088b1739b2b5ba77bac84e46
Depends: libosmocore.git I9590f2e836fc48650decf1564b6ab46306c4fe2d
Depends: libosmocore.git Ie8bb9c49c6f81b8f4a1766547d6943f9880d1186
2023-10-04 11:40:57 +00:00
Pau Espin f81a7389f1 rlcmac: tbf_ul_ass_fsm: Fix state not reset after first UL-TBF re-assignment
The FSM can be reused several times to assign a UL TBF over its
lifespan, eg. if a DL TBF DL ACK/NACK is reuse to request allocation of
a UL TBF several times.

Some state like ctx->tbf_starting_time_exists was being left as =true
during the initial run of the FSM, and as a result subsequent runs going
through the check delaying completing after sending the PKT CTRL ACK.

Change-Id: Iaddbd1e3924036be1cf6eed41367031d3e127f57
2023-10-04 10:15:44 +00:00
Pau Espin 0e62f970dc rlcmac: tbf_ul: Fix wrong field assignment (no bug in practice)
Fixes following warning detected by clang:
"""
tbf_ul.c:1118:37: warning: implicit conversion from enumeration type
'enum gprs_rlcmac_rlc_egprs_ul_reseg_bsn_state' to different enumeration type
'enum gprs_rlcmac_rlc_egprs_dl_reseg_bsn_state' [-Wenum-conversion]
blk->spb_status.block_status_dl = reseg_status;
"""

In practice it's not much of a problem since both fields are put
together in a union, so it ends up in the same place in memory.

Change-Id: Iccd57b74640754f2aebf81a149a633f141c6e38f
2023-10-03 13:48:05 +02:00
Pau Espin 99d44fa8d7 rlcmac: Fix compilation error 'rlcmac_prim may be used uninitialized'
Change-Id: Ica93447bc1f2e60984be7c9c73b153b4eb508aaa
2023-09-26 14:41:00 +02:00
Vadim Yanitskiy fef4af9381 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
2023-09-23 03:28:31 +07:00
Pau Espin 5d806d88e3 rlcmac: tbf_dl: Log with FN request of UL TBF through PKT DL ACK/NACK
Change-Id: Ib81f1003361ca6501ce5a0e16ab2cdafc8ed66d3
2023-09-05 19:03:52 +02:00
Pau Espin 330b7c078f rlcmac: Log RTS.ind
Change-Id: I678f2aaea419a0cb5dad58610784144538914cf5
2023-09-05 17:23:30 +02:00
Pau Espin f815b8f690 tbf_ul_ass_fsm: Listen only on 1 TS for PKT UL ASS when assignment done from DL TBF
This also fixes a memcpy writing out of bounds reported by Coverity
CID#323120 in gprs_rlcmac_tbf_ul_ass_start_from_dl_tbf_ack_nack(), due
to the difference of size between struct gprs_rlcmac_ul_tbf_allocation
and struct gprs_rlcmac_dl_tbf_allocation.
While fixing it, actually properly implement passing of the 1 only
interesting TS to the tbf_ul_ass_fsm at that point in time.

Change-Id: I89b15982b73f00599183981142495d7b9befbb78
2023-09-05 11:55:25 +02:00
Pau Espin 5eafbdcafe rlcmac: Several fixes and improvements to have 2phase access working
Some solutions are not meant to be final ones, but some small
workarounds to have the whole thing running until the lower layers are
fixed/improved.

Related: OS#5500
Change-Id: I94bd0de6917b004cba73d2fffc7cf69b3b5c305d
2023-09-04 16:56:15 +02:00
Pau Espin ffb7833ce7 tbf_ul_ass: Don't check USF during SingleBlock Allocation
Change-Id: Icc2c17dc1933ad95da1b6b050f38a769909b23e5
2023-08-21 18:10:02 +02:00
Pau Espin 7419d04213 rlcmac: ul_tbf: Implement TBF_Starting time (phase1)
This is unfortunately not yet working since lower layers are always
sending hardcoded fn=0 and hence ctx->tbf_starting_time calculated in
handle_imm_ass()->TBF_StartingTime_to_fn() is wrong.

Related: OS#6130
Change-Id: If6b7766ee1ba6667db4e54e897f376f5b27ad73d
2023-08-21 18:10:02 +02:00
Pau Espin 7c6773f6ff rlcmac: ul_tbf: Factor out function configuring TBF to lower layers
This code part will also be used by tbf_ul_ass_fsm.c to temporarily
configure lower layers with ctx->phase1_alloc in order to receive RTS
indications which the RLC/MAC uses to tick the FSM in state
GPRS_RLCMAC_TBF_UL_ASS_ST_WAIT_TBF_STARTING_TIME1.

Change-Id: I174327b25b726662a6b5902008e205ddb3de2fe0
2023-08-21 18:10:02 +02:00
Vadim Yanitskiy 9fd9d34e44 rlcmac: l1ctl_prim: add 'start_rfn' field to cfg_{ul,dl}_tbf_req
Change-Id: I27a7a896fe3839fa4f9b8cd9500c4ab7867bbaa0
Related: OS#5500
2023-08-21 18:10:02 +02:00
Pau Espin fe2a399be6 rlcmac: Fix Starting Time rfn->fn calculation
The Starting time contains a "frame number, FN modulo 42432", aka RFN.
The translation to absolute FN was missing.

Depends: libosmocore.git Change-Id Ib71e8da976f6cc84c3a4ab17b0a8c2101492e243
Change-Id: I00741289333853a8db472950ee2ac38dc2c74fd3
2023-08-21 18:09:45 +02:00
Pau Espin 200725e609 rlcmac: rx pkt_uk_ack_nack: Use correct field containing UL TFI
Change-Id: If0bbd9989413a550243a6496bce16b6eb04508db
2023-07-31 18:24:10 +02:00
Pau Espin 58342fdbe2 rlcmac: keep looking up GRE based on old TLLI
This is needed after RAU Update since the PCU may still be using the old
TLLI to reference the MS for a while until it finds out about the TLLI update.

Change-Id: I2653db3dac58342df02a1b4d0c76e69e0e8d583f
2023-07-31 16:12:58 +02:00
Pau Espin ee091182c5 rlcmac: Initial selection of packet-access-procedure mode based on originating cause
Change-Id: I930a1fcf23506f75562a6795f9a6e42b187d2974
2023-07-28 17:56:45 +02:00
Pau Espin 27bbb88d27 rlcmac: Use enum gprs_rlcmac_radio_priority internally everywhere
This simplifies the array handling in the LLC queue, and moves param
checking to the rx rlcmac_prim path instead of deep in the llc_queue
enqueuing code.

This commit also fixes the RADIO_PRIORITY field in the Channel Request
Description section of PKT DL ACK/NCK, since
gprs_rlcmac_llc_queue_highest_radio_prio_pending() now returns the enum
normalized 0..3 as expected by the field format (before it was returning
1..4).

Change-Id: If2d1946522bc4a1c19d65acb23605f1a3f05ab45
2023-07-28 13:49:49 +02:00
Pau Espin 678daf22ca rlcmac: recalculate CV as needed when already in Countdown procedure
Getting out of contention resolution means we may have to update our
calculated CV state because we are no longer sending TLLI.

Same happens if a new tx CS is provided by the network, since different
block size means different CV.

In this commit only code paths for the state where already in Countdown
Procedure are added. If TBF has to enter Countdown Procedure due the
above mentioned changes, it will do so using regular path where a new
RLC block is created.

Related specs: TS 44.060 9.3.1
Related: OS#6018

Change-Id: I6ca88c005060ba1302d46717e45b0d9731d86d8d
2023-07-24 16:36:52 +02:00
Pau Espin 459383d531 rlcmac: Apply tx_cs requested by the network through PKT UL ACK/NACK
Recalculating CV when in Countdown Procedure will be implemented in a
follow-up commit.

Related: OS#6108
Change-Id: I1e7b28c2e5f1d77a962ec3070f3a027b8f66a69e
2023-07-24 13:52:51 +02:00
Pau Espin 3ae18f65a8 rlcmac: Avoid discard packets when in Countdown procedure
Discarding a packet through CoDel during Countdown procedure may end up
in the transmitted CV=14..0 being incorrect, since we are not really yet
recalculating them once we enter Countdown procedure.
Hence, to make it simpler for now, avoid dropping packets when in
Countdown procedure to avoid having to recalculate them.

Change-Id: I311302b5282767dc806b1dfe053994f175390b69
2023-07-24 13:46:50 +02:00
Pau Espin 8c935ca0a7 rlcmac: ul_tbf: Move logic selecting proper queue to helper function
This clarifies the logic behind selecting the proper queue, and it will
be used further in the future, for instance when recalculating CV once
already in Countdown procedure.

Change-Id: Icceaf53048e9662176385b2976e2bc8e3387df71
2023-07-24 13:46:46 +02:00
Pau Espin 29dc2b13fb rlcmac: Log LLC PDUs enqueued in llc_queue
This allows gathering more information on the state of the queue and
helps in understanding possible bugs on the CV calculation algo.

Related: OS#6108
Change-Id: I97f4977944a6f82abc7b39c4e578de9d8e152740
2023-07-21 18:33:31 +02:00
Pau Espin 49535bec37 rlcmac: Mark received BSNs falling out of the V(N)/RBB when V(R) is raised
Problem this patch is fixing:
The current RLCMAC window code ported from osmo-pcu is never
invalidating the BSNs which have been received after they are not
needed.
As a result, when the DL TBF keeps sending data for a long time, and
finally BSN wraps around 127->0, when this implementation receives the
BSN=0, it will find it is already received and hence will discard it,
and then keep asking for BSN=0 nevertheless in PKT DL ACK, causing an
endless loop where PCU stays submitting the same block forever.

Explanation of the solution:
The V(N) array contains the status of the previous WS (64 in GPRS) data
blocks. This array is used to construct the RRB signaled to the peer
during PKT DL ACK/NACK messages together with the SSN (start sequence
number), which in our case is mainly V(R), aka one block higher than the
highest received block in the rx window.
Hence, whenever PKT DL ACK/NACK is transmitted, it contains an RRB
ranging [V(R)-1,...V(R)-WS)] mod SNS (SNS=128 in GPRS).

The receive window is basically [V(Q) <= BSN < V(R)] mod SNS, as is of
size 64.
The V(R) is increased whenever a highest new block arrives which is in the
receive window (guaranteeing it will be increased to at most V(Q)+64.

Since we are only announcing state of blocks from V(R)..V(R)-WS, and
blocks received which are before that BSN are dropped since don't fall
inside the rx window, we can securely mark as invalid those blocks
falling behind V(R)-WS whenever we increase V(R).

Related: OS#6102

Change-Id: I962111995e741a7e9c230b2dd4904c2fa9a828e9
2023-07-21 17:59:45 +02:00
Pau Espin 1d41688c56 rlcmac: rlc_window_dl: Fix RBB generation
We want to do mod sns on the BSN, not on the boolean returned by
gprs_rlcmac_rlc_v_n_is_received().
This is a typo which occurred while porting the code from osmo-pcu.git
void gprs_rlc_ul_window::update_rbb(char *rbb), where the following line
is used:
"""
	if (m_v_n.is_received((ssn()-1-i) & mod_sns()))
"""

Change-Id: I37c8fd5c2528f035f077c3e05105f913922ffd84
2023-07-21 16:08:03 +02:00
Pau Espin 937fdb405e rlcmac: Log SSN and FINAL_ACK when preparing PKT DL ACK/NACK msg
Change-Id: Ia8cd3ea341308887953fe76df6821c429b3d8e77
2023-07-21 16:07:44 +02:00
Pau Espin 427949ce75 rlcmac: Fix null ptr dereference
Caught by ASan during test run. This can happen if
gprs_rlcmac_ul_tbf_schedule_next_llc_frame() finds no more llc frames to
submit during the loop iteration.

Change-Id: I5bd6dd6c6b7dc4b911af7bc119cf85eb810959a0
2023-07-20 14:18:35 +02:00
Pau Espin 12311c2561 rlcmac: tbf_ul: Free TBF if submitting RACH.req fails
Change-Id: I63d68e524629a90931497d1181f134830b4819f9
2023-07-20 14:17:32 +02:00
Pau Espin 2d121dcdb1 rlcmac: Introduce L1CTL-CCCH_READY.ind primitive
This is used by lower layer L1CTL to notify the upper layer RLCMAC when
it's prepared to use CCCH.

Change-Id: I4cfb1e2db217a97b7a1dc8849cd13d58e4034c56
2023-07-18 11:31:05 +02:00
Pau Espin cabca87921 rlcmac: tbf_dl: Implement T3192
Related: OS#5500
Change-Id: I49c9068d1819d6189103908f6f92ce05952b74e6
2023-07-05 13:49:20 +02:00
Pau Espin 5dc23ea408 rlcmac: tbf_dl: Implement T3190
Related: OS#5500
Change-Id: I3f69fde298dcd64d30b9d648a96717a8378864c4
2023-07-05 13:49:20 +02:00
Pau Espin 1026e0a417 rlcmac: defer going to pkt_idle_timer after freeing TBF
Give some time to pending tx blocks to be transmitted before jumping
back to CCCH.

Change-Id: I563ad2ee6aacd65314e998626dc27adc29221a7d
2023-07-05 13:49:13 +02:00
Pau Espin 806426525d rlcmac: tbf_ul: Move to packet-idle state when T3164 triggers
TS 44.018 3.5.2.1.4:
"The one phase packet access procedure is completed at a successful
contention resolution. The mobile station has entered the packet transfer
mode. Timer T3141 is stopped on the network side. Timer T3164 is stopped
on the mobile station side."

Change-Id: Ic7420a42e2e81effdde587d7e49acd66b404354c
2023-07-04 14:29:25 +02:00
Pau Espin 2f47cf4edb rlcmac: Rework tbf destructor to signal free() to its gre object
This will be needed in follow-up patches for the MS to trigger actions
when TBFs are freed (like going back to IDLE mode, or start
packet-access-procedure).

Change-Id: I72959e27f2f62c84218d740cfb9e396d70562929
2023-07-04 14:13:02 +02:00
Vadim Yanitskiy f77d343966 rlcmac: add OSMO_GPRS_RLCMAC_L1CTL_PDCH_{ESTABLISH,RELEASE}.req
* Send the PDCH_ESTABLISH.req on receipt of RR IMM ASS,
* Sending of PDCH_RELEASE.req is to be implemented.

Change-Id: I2568c58646ce7511367275ac96cd55e7fdd7ec18
Related: OS#5500
2023-07-04 14:13:02 +02:00