Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG UE
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
OpenXG
OpenXG UE
Commits
a9e6d476
Commit
a9e6d476
authored
Dec 02, 2021
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
43068255
c21b593f
Changes
4
Show 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 @
a9e6d476
...
...
@@ -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
(
...
...
openair2/LAYER2/nr_rlc/nr_rlc_entity_am.c
View file @
a9e6d476
...
...
@@ -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
)
...
...
openair2/LAYER2/nr_rlc/nr_rlc_entity_tm.c
View file @
a9e6d476
...
...
@@ -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
)
...
...
openair2/LAYER2/nr_rlc/nr_rlc_entity_um.c
View file @
a9e6d476
...
...
@@ -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
)
...
...
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