Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Michael Black
OpenXG-RAN
Commits
0a6c2e18
Commit
0a6c2e18
authored
3 years ago
by
hardy
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/speedup-nr-rlc-buffer-status' into integration_2021_wk49_a
parents
1e343f60
1495a6b0
Branches unavailable
2023.w22
2023.w21
2023.w20
2023.w19
2023.w18
2023.w18b
2023.w16
2023.w15
2023.w14
2023.w13
2023.w12
2023.w11
2023.w11b
2023.w10
2023.w10b
2023.w09
2023.w08
2023.w08b
2023.w07
2023.w06
2023.w05
2023.w03
2023.w02
2022.42
2022.41
2022.w51
2022.w50
2022.w49
2022.w48
2022.w47
2022.w46
2022.w45
2022.w43
2022.w42
2022.w42b
2022.w41
2022.w40
2022.w39
2022.w38
2022.w37
2022.w37b
2022.w36
2022.w35
2022.w33
2022.w32
2022.w31
2022.w31b
2022.w30
2022.w29
2022.w26
2022.w25
2022.w24
2022.w24b
2022.w23
2022.w22
2022.w21
2022.w20
2022.w19
2022.w18
2022.w17
2022.w15
2022.w15b
2022.w14a
2022.w13
2022.w13b
2022.w13a
2022.w12
2022.w10
2022.w09
2022.w09b
2022.w08
2022.w08b
2022.w07
2022.w07b
2022.w06
2022.w06a
2022.w05
2022.w05b
2022.w03_hotfix
2022.w03_b
2022.w02
2022.w01
2021.w51_c
2021.w51_a
2021.w50_a
2021.w49_b
2021.w49_a
setparam
flexran-eol
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
93 additions
and
83 deletions
+93
-83
openair2/LAYER2/nr_rlc/nr_rlc_entity.h
openair2/LAYER2/nr_rlc/nr_rlc_entity.h
+2
-0
openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
+49
-35
openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
+9
-14
openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
+33
-34
No files found.
openair2/LAYER2/nr_rlc/nr_rlc_entity.h
View file @
0a6c2e18
...
...
@@ -63,6 +63,8 @@ typedef struct nr_rlc_entity_t {
void
(
*
max_retx_reached
)(
void
*
max_retx_reached_data
,
struct
nr_rlc_entity_t
*
entity
);
void
*
max_retx_reached_data
;
/* buffer status computation */
nr_rlc_entity_buffer_status_t
bstatus
;
}
nr_rlc_entity_t
;
nr_rlc_entity_t
*
new_nr_rlc_entity_am
(
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
View file @
0a6c2e18
...
...
@@ -28,6 +28,19 @@
#include "LOG/log.h"
/* for a given SDU/SDU segment, computes the corresponding PDU header size */
static
int
compute_pdu_header_size
(
nr_rlc_entity_am_t
*
entity
,
nr_rlc_sdu_segment_t
*
sdu
)
{
int
header_size
=
2
;
/* one more byte if SN field length is 18 */
if
(
entity
->
sn_field_length
==
18
)
header_size
++
;
/* two more bytes for SO if SDU segment is not the first */
if
(
!
sdu
->
is_first
)
header_size
+=
2
;
return
header_size
;
}
/*************************************************************************/
/* PDU RX functions */
/*************************************************************************/
...
...
@@ -114,6 +127,10 @@ static void consider_retransmission(nr_rlc_entity_am_t *entity,
nr_rlc_sdu_segment_list_append
(
&
entity
->
retransmit_list
,
&
entity
->
retransmit_end
,
cur
);
/* update buffer status */
entity
->
common
.
bstatus
.
retx_size
+=
compute_pdu_header_size
(
entity
,
cur
)
+
cur
->
size
;
}
/* checks that all the bytes of the SDU sn have been received (but SDU
...
...
@@ -351,6 +368,9 @@ static void process_received_ack(nr_rlc_entity_am_t *entity, int ack_sn)
}
/* remove from retransmit list */
prev
->
next
=
cur
->
next
;
/* update buffer status */
entity
->
common
.
bstatus
.
retx_size
-=
compute_pdu_header_size
(
entity
,
cur
)
+
cur
->
size
;
/* put the PDU in the ack list */
entity
->
ack_list
=
nr_rlc_sdu_segment_list_add
(
sn_compare_tx
,
entity
,
entity
->
ack_list
,
cur
);
...
...
@@ -840,19 +860,6 @@ static int serialize_sdu(nr_rlc_entity_am_t *entity,
return
encoder
.
byte
+
sdu
->
size
;
}
/* for a given SDU/SDU segment, computes the corresponding PDU header size */
static
int
compute_pdu_header_size
(
nr_rlc_entity_am_t
*
entity
,
nr_rlc_sdu_segment_t
*
sdu
)
{
int
header_size
=
2
;
/* one more byte if SN field length is 18 */
if
(
entity
->
sn_field_length
==
18
)
header_size
++
;
/* two more bytes for SO if SDU segment is not the first */
if
(
!
sdu
->
is_first
)
header_size
+=
2
;
return
header_size
;
}
/* resize SDU/SDU segment for the corresponding PDU to fit into 'pdu_size'
* bytes
* - modifies SDU/SDU segment to become an SDU segment
...
...
@@ -1426,8 +1433,12 @@ static int generate_retx_pdu(nr_rlc_entity_am_t *entity, char *buffer,
sdu
->
next
=
NULL
;
/* segment if necessary */
pdu_size
=
pdu_header_size
+
sdu
->
size
;
/* update buffer status */
entity
->
common
.
bstatus
.
retx_size
-=
pdu_size
;
/* segment if necessary */
if
(
pdu_size
>
size
)
{
nr_rlc_sdu_segment_t
*
next_sdu
;
next_sdu
=
resegment
(
sdu
,
entity
,
size
);
...
...
@@ -1436,6 +1447,9 @@ static int generate_retx_pdu(nr_rlc_entity_am_t *entity, char *buffer,
entity
->
retransmit_list
=
next_sdu
;
if
(
entity
->
retransmit_end
==
NULL
)
entity
->
retransmit_end
=
entity
->
retransmit_list
;
/* update buffer status */
entity
->
common
.
bstatus
.
retx_size
+=
compute_pdu_header_size
(
entity
,
next_sdu
)
+
next_sdu
->
size
;
}
/* put SDU/SDU segment in the wait list */
...
...
@@ -1479,11 +1493,15 @@ static int generate_tx_pdu(nr_rlc_entity_am_t *entity, char *buffer, int size)
sdu
->
next
=
NULL
;
pdu_size
=
pdu_header_size
+
sdu
->
size
;
/* update buffer status */
entity
->
common
.
bstatus
.
tx_size
-=
pdu_size
;
/* assign SN to SDU */
sdu
->
sdu
->
sn
=
entity
->
tx_next
;
/* segment if necessary */
pdu_size
=
pdu_header_size
+
sdu
->
size
;
if
(
pdu_size
>
size
)
{
nr_rlc_sdu_segment_t
*
next_sdu
;
next_sdu
=
resegment
(
sdu
,
entity
,
size
);
...
...
@@ -1492,6 +1510,9 @@ static int generate_tx_pdu(nr_rlc_entity_am_t *entity, char *buffer, int size)
entity
->
tx_list
=
next_sdu
;
if
(
entity
->
tx_end
==
NULL
)
entity
->
tx_end
=
entity
->
tx_list
;
/* update buffer status */
entity
->
common
.
bstatus
.
tx_size
+=
compute_pdu_header_size
(
entity
,
next_sdu
)
+
next_sdu
->
size
;
}
/* update tx_next if the SDU segment is the last */
...
...
@@ -1520,24 +1541,6 @@ static int generate_tx_pdu(nr_rlc_entity_am_t *entity, char *buffer, int size)
return
serialize_sdu
(
entity
,
sdu
,
buffer
,
size
,
p
);
}
/* Pretend to serialize all the SDUs in a list and return the size
* of all the PDUs it would produce, limited to 'maxsize'.
* Used for buffer status reporting.
*/
static
int
tx_list_size
(
nr_rlc_entity_am_t
*
entity
,
nr_rlc_sdu_segment_t
*
l
,
int
maxsize
)
{
int
ret
=
0
;
while
(
l
!=
NULL
&&
ret
<
maxsize
)
{
ret
+=
compute_pdu_header_size
(
entity
,
l
)
+
l
->
size
;
l
=
l
->
next
;
}
if
(
ret
>
maxsize
)
ret
=
maxsize
;
return
ret
;
}
nr_rlc_entity_buffer_status_t
nr_rlc_entity_am_buffer_status
(
nr_rlc_entity_t
*
_entity
,
int
maxsize
)
{
...
...
@@ -1549,8 +1552,8 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_am_buffer_status(
else
ret
.
status_size
=
0
;
ret
.
tx_size
=
tx_list_size
(
entity
,
entity
->
tx_list
,
maxsize
)
;
ret
.
retx_size
=
tx_list_size
(
entity
,
entity
->
retransmit_list
,
maxsize
)
;
ret
.
tx_size
=
entity
->
common
.
bstatus
.
tx_size
;
ret
.
retx_size
=
entity
->
common
.
bstatus
.
retx_size
;
return
ret
;
}
...
...
@@ -1606,6 +1609,10 @@ void nr_rlc_entity_am_recv_sdu(nr_rlc_entity_t *_entity,
LOG_D
(
RLC
,
"Created new RLC SDU and append it to the RLC list
\n
"
);
nr_rlc_sdu_segment_list_append
(
&
entity
->
tx_list
,
&
entity
->
tx_end
,
sdu
);
/* update buffer status */
entity
->
common
.
bstatus
.
tx_size
+=
compute_pdu_header_size
(
entity
,
sdu
)
+
sdu
->
size
;
}
/*************************************************************************/
...
...
@@ -1793,6 +1800,10 @@ void nr_rlc_entity_am_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id)
entity
->
tx_end
=
NULL
;
}
/* update buffer status */
entity
->
common
.
bstatus
.
tx_size
-=
compute_pdu_header_size
(
entity
,
cur
)
+
cur
->
size
;
nr_rlc_free_sdu_segment
(
cur
);
}
...
...
@@ -1845,6 +1856,9 @@ static void clear_entity(nr_rlc_entity_am_t *entity)
entity
->
retransmit_end
=
NULL
;
entity
->
ack_list
=
NULL
;
entity
->
common
.
bstatus
.
tx_size
=
0
;
entity
->
common
.
bstatus
.
retx_size
=
0
;
}
void
nr_rlc_entity_am_reestablishment
(
nr_rlc_entity_t
*
_entity
)
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
View file @
0a6c2e18
...
...
@@ -68,22 +68,12 @@ static int generate_tx_pdu(nr_rlc_entity_tm_t *entity, char *buffer, int size)
memcpy
(
buffer
,
sdu
->
sdu
->
data
,
sdu
->
size
);
entity
->
tx_size
-=
sdu
->
size
;
nr_rlc_free_sdu_segment
(
sdu
);
return
ret
;
}
static
int
tx_list_size
(
nr_rlc_entity_tm_t
*
entity
,
nr_rlc_sdu_segment_t
*
l
,
int
maxsize
)
{
int
ret
=
0
;
/* update buffer status */
entity
->
common
.
bstatus
.
tx_size
-=
sdu
->
size
;
while
(
l
!=
NULL
&&
ret
<
maxsize
)
{
ret
+=
l
->
size
;
l
=
l
->
next
;
}
nr_rlc_free_sdu_segment
(
sdu
);
if
(
ret
>
maxsize
)
ret
=
maxsize
;
return
ret
;
}
...
...
@@ -94,7 +84,7 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_tm_buffer_status(
nr_rlc_entity_buffer_status_t
ret
;
ret
.
status_size
=
0
;
ret
.
tx_size
=
tx_list_size
(
entity
,
entity
->
tx_list
,
maxsize
)
;
ret
.
tx_size
=
entity
->
common
.
bstatus
.
tx_size
;
ret
.
retx_size
=
0
;
return
ret
;
...
...
@@ -136,6 +126,9 @@ void nr_rlc_entity_tm_recv_sdu(nr_rlc_entity_t *_entity,
sdu
=
nr_rlc_new_sdu
(
buffer
,
size
,
sdu_id
);
nr_rlc_sdu_segment_list_append
(
&
entity
->
tx_list
,
&
entity
->
tx_end
,
sdu
);
/* update buffer status */
entity
->
common
.
bstatus
.
tx_size
+=
sdu
->
size
;
}
/*************************************************************************/
...
...
@@ -165,6 +158,8 @@ static void clear_entity(nr_rlc_entity_tm_t *entity)
entity
->
tx_list
=
NULL
;
entity
->
tx_end
=
NULL
;
entity
->
tx_size
=
0
;
entity
->
common
.
bstatus
.
tx_size
=
0
;
}
void
nr_rlc_entity_tm_reestablishment
(
nr_rlc_entity_t
*
_entity
)
...
...
This diff is collapsed.
Click to expand it.
openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
View file @
0a6c2e18
...
...
@@ -28,6 +28,20 @@
#include "LOG/log.h"
/* for a given SDU/SDU segment, computes the corresponding PDU header size */
static
int
compute_pdu_header_size
(
nr_rlc_entity_um_t
*
entity
,
nr_rlc_sdu_segment_t
*
sdu
)
{
int
header_size
=
1
;
/* if SN to be included then one more byte if SN field length is 12 */
if
(
!
(
sdu
->
is_first
&&
sdu
->
is_last
)
&&
entity
->
sn_field_length
==
12
)
header_size
++
;
/* two more bytes for SO if SDU segment is not the first */
if
(
!
sdu
->
is_first
)
header_size
+=
2
;
return
header_size
;
}
/*************************************************************************/
/* PDU RX functions */
/*************************************************************************/
...
...
@@ -375,20 +389,6 @@ static int serialize_sdu(nr_rlc_entity_um_t *entity,
return
encoder
.
byte
+
sdu
->
size
;
}
/* for a given SDU/SDU segment, computes the corresponding PDU header size */
static
int
compute_pdu_header_size
(
nr_rlc_entity_um_t
*
entity
,
nr_rlc_sdu_segment_t
*
sdu
)
{
int
header_size
=
1
;
/* if SN to be included then one more byte if SN field length is 12 */
if
(
!
(
sdu
->
is_first
&&
sdu
->
is_last
)
&&
entity
->
sn_field_length
==
12
)
header_size
++
;
/* two more bytes for SO if SDU segment is not the first */
if
(
!
sdu
->
is_first
)
header_size
+=
2
;
return
header_size
;
}
/* resize SDU/SDU segment for the corresponding PDU to fit into 'pdu_size'
* bytes
* - modifies SDU/SDU segment to become an SDU segment
...
...
@@ -462,8 +462,12 @@ static int generate_tx_pdu(nr_rlc_entity_um_t *entity, char *buffer, int size)
/* assign SN to SDU */
sdu
->
sdu
->
sn
=
entity
->
tx_next
;
/* segment if necessary */
pdu_size
=
pdu_header_size
+
sdu
->
size
;
/* update buffer status */
entity
->
common
.
bstatus
.
tx_size
-=
pdu_size
;
/* segment if necessary */
if
(
pdu_size
>
size
)
{
nr_rlc_sdu_segment_t
*
next_sdu
;
next_sdu
=
resegment
(
sdu
,
entity
,
size
);
...
...
@@ -474,6 +478,9 @@ static int generate_tx_pdu(nr_rlc_entity_um_t *entity, char *buffer, int size)
entity
->
tx_list
=
next_sdu
;
if
(
entity
->
tx_end
==
NULL
)
entity
->
tx_end
=
entity
->
tx_list
;
/* update buffer status */
entity
->
common
.
bstatus
.
tx_size
+=
compute_pdu_header_size
(
entity
,
next_sdu
)
+
next_sdu
->
size
;
}
/* update tx_next if the SDU is an SDU segment and is the last */
...
...
@@ -488,24 +495,6 @@ static int generate_tx_pdu(nr_rlc_entity_um_t *entity, char *buffer, int size)
return
ret
;
}
/* Pretend to serialize all the SDUs in a list and return the size
* of all the PDUs it would produce, limited to 'maxsize'.
* Used for buffer status reporting.
*/
static
int
tx_list_size
(
nr_rlc_entity_um_t
*
entity
,
nr_rlc_sdu_segment_t
*
l
,
int
maxsize
)
{
int
ret
=
0
;
while
(
l
!=
NULL
&&
ret
<
maxsize
)
{
ret
+=
compute_pdu_header_size
(
entity
,
l
)
+
l
->
size
;
l
=
l
->
next
;
}
if
(
ret
>
maxsize
)
ret
=
maxsize
;
return
ret
;
}
nr_rlc_entity_buffer_status_t
nr_rlc_entity_um_buffer_status
(
nr_rlc_entity_t
*
_entity
,
int
maxsize
)
{
...
...
@@ -513,7 +502,7 @@ nr_rlc_entity_buffer_status_t nr_rlc_entity_um_buffer_status(
nr_rlc_entity_buffer_status_t
ret
;
ret
.
status_size
=
0
;
ret
.
tx_size
=
tx_list_size
(
entity
,
entity
->
tx_list
,
maxsize
)
;
ret
.
tx_size
=
entity
->
common
.
bstatus
.
tx_size
;
ret
.
retx_size
=
0
;
return
ret
;
...
...
@@ -555,6 +544,10 @@ void nr_rlc_entity_um_recv_sdu(nr_rlc_entity_t *_entity,
sdu
=
nr_rlc_new_sdu
(
buffer
,
size
,
sdu_id
);
nr_rlc_sdu_segment_list_append
(
&
entity
->
tx_list
,
&
entity
->
tx_end
,
sdu
);
/* update buffer status */
entity
->
common
.
bstatus
.
tx_size
+=
compute_pdu_header_size
(
entity
,
sdu
)
+
sdu
->
size
;
}
/*************************************************************************/
...
...
@@ -650,6 +643,10 @@ void nr_rlc_entity_um_discard_sdu(nr_rlc_entity_t *_entity, int sdu_id)
entity
->
tx_end
=
NULL
;
}
/* update buffer status */
entity
->
common
.
bstatus
.
tx_size
-=
compute_pdu_header_size
(
entity
,
cur
)
+
cur
->
size
;
nr_rlc_free_sdu_segment
(
cur
);
}
...
...
@@ -682,6 +679,8 @@ static void clear_entity(nr_rlc_entity_um_t *entity)
entity
->
tx_list
=
NULL
;
entity
->
tx_end
=
NULL
;
entity
->
tx_size
=
0
;
entity
->
common
.
bstatus
.
tx_size
=
0
;
}
void
nr_rlc_entity_um_reestablishment
(
nr_rlc_entity_t
*
_entity
)
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment