Merge remote-tracking branch 'origin/nr-rlc-retx-modification' into integration_2023_w33
This commit is contained in:
@@ -1759,7 +1759,7 @@ static void check_t_poll_retransmit(nr_rlc_entity_am_t *entity)
|
|||||||
if (!check_poll_after_pdu_assembly(entity))
|
if (!check_poll_after_pdu_assembly(entity))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* retransmit the head of wait list, this is the case
|
/* retransmit the SDU at the head of wait list, this is the case
|
||||||
* "consider any RLC SDU which has not been positively acknowledged for
|
* "consider any RLC SDU which has not been positively acknowledged for
|
||||||
* retransmission" of 36.322 5.3.3.4.
|
* retransmission" of 36.322 5.3.3.4.
|
||||||
* We don't search for the highest SN, it's simpler to just take the head
|
* We don't search for the highest SN, it's simpler to just take the head
|
||||||
@@ -1771,39 +1771,45 @@ static void check_t_poll_retransmit(nr_rlc_entity_am_t *entity)
|
|||||||
* It seems that no, the wait list should not be empty here, but not sure.
|
* It seems that no, the wait list should not be empty here, but not sure.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
entity->wait_list = cur->next;
|
|
||||||
if (entity->wait_list == NULL)
|
|
||||||
entity->wait_end = NULL;
|
|
||||||
|
|
||||||
/* 38.322 says "SDU", not "SDU segment", but let's retransmit only
|
|
||||||
* the 'cur' SDU segment. To be changed if needed. (Maybe we have
|
|
||||||
* to retransmit all SDU segments with the same SN that are in the
|
|
||||||
* wait list.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* increase retx count. Don't care about segmentation, so maybe we
|
/* increase retx count. Don't care about segmentation, so maybe we
|
||||||
* increase too much.
|
* increase too much.
|
||||||
*/
|
*/
|
||||||
cur->sdu->retx_count++;
|
cur->sdu->retx_count++;
|
||||||
|
|
||||||
|
int sdu_retx_count = cur->sdu->retx_count;
|
||||||
|
int retransmit_sn = cur->sdu->sn;
|
||||||
|
|
||||||
|
/* 38.322 says "SDU", not "SDU segment", so let's retransmit all
|
||||||
|
* SDU segments with the retransmit SN in the wait list.
|
||||||
|
*/
|
||||||
|
do {
|
||||||
|
entity->wait_list = cur->next;
|
||||||
|
if (entity->wait_list == NULL)
|
||||||
|
entity->wait_end = NULL;
|
||||||
|
|
||||||
|
/* update buffer status */
|
||||||
|
entity->common.bstatus.retx_size += compute_pdu_header_size(entity, cur)
|
||||||
|
+ cur->size;
|
||||||
|
|
||||||
|
LOG_D(RLC, "put sn %d so %d size %d in retx list (retx_count %d)\n",
|
||||||
|
cur->sdu->sn, cur->so, cur->size, cur->sdu->retx_count);
|
||||||
|
|
||||||
|
/* put in retransmit list */
|
||||||
|
entity->retransmit_list = nr_rlc_sdu_segment_list_add(sn_compare_tx, entity,
|
||||||
|
entity->retransmit_list, cur);
|
||||||
|
|
||||||
|
cur = entity->wait_list;
|
||||||
|
} while (cur != NULL && cur->sdu->sn == retransmit_sn);
|
||||||
|
|
||||||
/* report max RETX reached for all retx_count >= max_retx_threshold
|
/* report max RETX reached for all retx_count >= max_retx_threshold
|
||||||
* (specs say to report if retx_count == max_retx_threshold).
|
* (specs say to report if retx_count == max_retx_threshold).
|
||||||
* Upper layers should react (radio link failure), so no big deal.
|
* Upper layers should react (radio link failure), so no big deal.
|
||||||
* We deal with segmentation by requiring
|
* Because of segmentation, we may report too early/too late, not
|
||||||
* retx_count >= max_retx_threshold * number of segments.
|
* very clear. To refine if needed.
|
||||||
* We may report max RETX reached too late/early. To be refined if
|
|
||||||
* this is a problem.
|
|
||||||
*/
|
*/
|
||||||
if (cur->sdu->retx_count
|
if (sdu_retx_count >= entity->max_retx_threshold)
|
||||||
>= entity->max_retx_threshold * cur->sdu->ref_count)
|
|
||||||
entity->common.max_retx_reached(entity->common.max_retx_reached_data,
|
entity->common.max_retx_reached(entity->common.max_retx_reached_data,
|
||||||
(nr_rlc_entity_t *)entity);
|
(nr_rlc_entity_t *)entity);
|
||||||
/* update buffer status */
|
|
||||||
entity->common.bstatus.retx_size += compute_pdu_header_size(entity, cur)
|
|
||||||
+ cur->size;
|
|
||||||
|
|
||||||
/* put in retransmit list */
|
|
||||||
entity->retransmit_list = nr_rlc_sdu_segment_list_add(sn_compare_tx, entity,
|
|
||||||
entity->retransmit_list, cur);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void check_t_reassembly(nr_rlc_entity_am_t *entity)
|
static void check_t_reassembly(nr_rlc_entity_am_t *entity)
|
||||||
|
|||||||
Reference in New Issue
Block a user