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
lizhongxiao
OpenXG UE
Commits
f65ac504
Commit
f65ac504
authored
Jan 19, 2017
by
fnabet
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
main AM RX process PDU changes
parent
23292569
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
165 additions
and
46 deletions
+165
-46
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h
+33
-3
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h
+2
-1
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
+5
-2
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c
+97
-39
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c
+4
-0
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
+1
-1
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h
+22
-0
openair2/LAYER2/RLC/rlc_def.h
openair2/LAYER2/RLC/rlc_def.h
+1
-0
No files found.
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_constants.h
View file @
f65ac504
...
@@ -51,7 +51,7 @@
...
@@ -51,7 +51,7 @@
# define RLC_AM_SDU_CONTROL_BUFFER_SIZE 128
# define RLC_AM_SDU_CONTROL_BUFFER_SIZE 128
/** Size of the retransmission buffer (number of PDUs). */
/** Size of the retransmission buffer (number of PDUs). */
# define RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE RLC_AM_
SN_MODULO
# define RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE RLC_AM_
WINDOW_SIZE
/** PDU minimal header size in bytes. */
/** PDU minimal header size in bytes. */
# define RLC_AM_HEADER_MIN_SIZE 2
# define RLC_AM_HEADER_MIN_SIZE 2
...
@@ -69,6 +69,36 @@
...
@@ -69,6 +69,36 @@
# define RLC_AM_MAX_NACK_IN_STATUS_PDU 1023
# define RLC_AM_MAX_NACK_IN_STATUS_PDU 1023
/** Max holes created by NACK_SN with segment offsets for a PDU in the retransmission buffer. */
/** Max holes created by NACK_SN with segment offsets for a PDU in the retransmission buffer. */
# define RLC_AM_MAX_HOLES_REPORT_PER_PDU
32
# define RLC_AM_MAX_HOLES_REPORT_PER_PDU
16
/** @} */
/** @} */
# endif
/* MACRO DEFINITIONS */
#define RLC_AM_NEXT_SN(sn) (((sn)+1) & ((RLC_AM_SN_MODULO)-1))
#define RLC_AM_PREV_SN(sn) (((sn)+(RLC_AM_SN_MODULO)-1) & ((RLC_AM_SN_MODULO)-1))
#define RLC_DIFF_SN(sn,snref,modulus) ((sn+(modulus)-snref) & ((modulus)-1))
#define RLC_SN_IN_WINDOW(sn,snref,modulus) ((RLC_DIFF_SN(sn,snref,modulus)) < ((modulus) >> 1))
#define RLC_AM_DIFF_SN(sn,snref) (RLC_DIFF_SN(sn,snref,RLC_AM_SN_MODULO))
#define RLC_AM_SN_IN_WINDOW(sn,snref) (RLC_SN_IN_WINDOW(sn,snref,RLC_AM_SN_MODULO))
#define RLC_SET_EVENT(x,event) ((x) |= (event))
#define RLC_GET_EVENT(x,event) ((x) & (event))
#define RLC_CLEAR_EVENT(x,event) ((x) &= (~(event)))
/* Uplink STATUS PDU trigger events */
#define RLC_AM_STATUS_NOT_TRIGGERED 0
#define RLC_AM_STATUS_TRIGGERED_POLL 0x01
/* Status Report is triggered by a received poll */
#define RLC_AM_STATUS_TRIGGERED_T_REORDERING 0x02
/* Status Report is triggered by Timer Reordering Expiry */
#define RLC_AM_STATUS_TRIGGERED_DELAYED 0x10
/* Status is delayed until SN(receivedPoll) < VR(MS) */
#define RLC_AM_STATUS_PROHIBIT 0x20
/* TimerStatusProhibit still running */
/* Status triggered (bit 5-7) will be concatenated with Poll triggered (bit 0-4) for RLCdec. RLC_AM_STATUS_TRIGGERED_DELAYED is not recorded. */
#define RLC_AM_SET_STATUS(x,event) (RLC_SET_EVENT(x,event))
#define RLC_AM_GET_STATUS(x,event) (RLC_GET_EVENT(x,event))
#define RLC_AM_CLEAR_STATUS(x,event) (RLC_CLEAR_EVENT(x,event))
#define RLC_AM_CLEAR_ALL_STATUS(x) ((x) = (RLC_AM_STATUS_NOT_TRIGGERED))
#endif
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_entity.h
View file @
f65ac504
...
@@ -182,7 +182,8 @@ typedef struct rlc_am_entity_s {
...
@@ -182,7 +182,8 @@ typedef struct rlc_am_entity_s {
rlc_sn_t
first_retrans_pdu_sn
;
/*!< \brief Lowest sequence number of PDU to be retransmitted. */
rlc_sn_t
first_retrans_pdu_sn
;
/*!< \brief Lowest sequence number of PDU to be retransmitted. */
list_t
segmentation_pdu_list
;
/*!< \brief List of "freshly" segmented PDUs. */
list_t
segmentation_pdu_list
;
/*!< \brief List of "freshly" segmented PDUs. */
boolean_t
status_requested
;
/*!< \brief Status requested by peer. */
uint8_t
status_requested
;
/*!< \brief Status bitmap requested by peer. */
rlc_sn_t
sn_status_triggered_delayed
;
/*!< \brief SN of the last received poll for which Status is delayed until SN is out of Rx Window. */
frame_t
last_frame_status_indication
;
/*!< \brief The last frame number a MAC status indication has been received by RLC. */
frame_t
last_frame_status_indication
;
/*!< \brief The last frame number a MAC status indication has been received by RLC. */
//-----------------------------
//-----------------------------
// buffer occupancy measurements sent to MAC
// buffer occupancy measurements sent to MAC
...
...
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
View file @
f65ac504
...
@@ -74,9 +74,10 @@ rlc_am_init(
...
@@ -74,9 +74,10 @@ rlc_am_init(
// RX state variables
// RX state variables
//rlc_pP->vr_r = 0;
//rlc_pP->vr_r = 0;
rlc_pP
->
vr_mr
=
rlc_pP
->
vr_r
+
RLC_AM_WINDOW_SIZE
;
rlc_pP
->
vr_mr
=
rlc_pP
->
vr_r
+
RLC_AM_WINDOW_SIZE
;
//rlc_pP->vr_x = 0
;
rlc_pP
->
vr_x
=
RLC_SN_UNDEFINED
;
//rlc_pP->vr_ms = 0;
//rlc_pP->vr_ms = 0;
//rlc_pP->vr_h = 0;
//rlc_pP->vr_h = 0;
rlc_pP
->
sn_status_triggered_delayed
=
RLC_SN_UNDEFINED
;
rlc_pP
->
last_frame_status_indication
=
123456
;
// any value > 1
rlc_pP
->
last_frame_status_indication
=
123456
;
// any value > 1
rlc_pP
->
first_retrans_pdu_sn
=
-
1
;
rlc_pP
->
first_retrans_pdu_sn
=
-
1
;
...
@@ -128,9 +129,11 @@ rlc_am_reestablish(
...
@@ -128,9 +129,11 @@ rlc_am_reestablish(
// RX state variables
// RX state variables
rlc_pP
->
vr_r
=
0
;
rlc_pP
->
vr_r
=
0
;
rlc_pP
->
vr_mr
=
rlc_pP
->
vr_r
+
RLC_AM_WINDOW_SIZE
;
rlc_pP
->
vr_mr
=
rlc_pP
->
vr_r
+
RLC_AM_WINDOW_SIZE
;
rlc_pP
->
vr_x
=
0
;
rlc_pP
->
vr_x
=
RLC_SN_UNDEFINED
;
rlc_pP
->
vr_ms
=
0
;
rlc_pP
->
vr_ms
=
0
;
rlc_pP
->
vr_h
=
0
;
rlc_pP
->
vr_h
=
0
;
rlc_pP
->
sn_status_triggered_delayed
=
RLC_SN_UNDEFINED
;
rlc_pP
->
status_requested
=
RLC_AM_STATUS_NOT_TRIGGERED
;
rlc_pP
->
last_frame_status_indication
=
123456
;
// any value > 1
rlc_pP
->
last_frame_status_indication
=
123456
;
// any value > 1
rlc_pP
->
first_retrans_pdu_sn
=
-
1
;
rlc_pP
->
first_retrans_pdu_sn
=
-
1
;
...
...
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_receiver.c
View file @
f65ac504
...
@@ -47,7 +47,8 @@ rlc_am_get_data_pdu_infos(
...
@@ -47,7 +47,8 @@ rlc_am_get_data_pdu_infos(
pdu_info_pP
->
num_li
=
0
;
pdu_info_pP
->
num_li
=
0
;
if
(
pdu_info_pP
->
d_c
)
{
AssertFatal
(
pdu_info_pP
->
d_c
!=
0
,
"RLC AM Rx PDU Data D/C Header Error LcId=%d
\n
"
,
rlc_pP
->
channel_id
);
pdu_info_pP
->
rf
=
(
header_pP
->
b1
>>
6
)
&
0x01
;
pdu_info_pP
->
rf
=
(
header_pP
->
b1
>>
6
)
&
0x01
;
pdu_info_pP
->
p
=
(
header_pP
->
b1
>>
5
)
&
0x01
;
pdu_info_pP
->
p
=
(
header_pP
->
b1
>>
5
)
&
0x01
;
pdu_info_pP
->
fi
=
(
header_pP
->
b1
>>
3
)
&
0x03
;
pdu_info_pP
->
fi
=
(
header_pP
->
b1
>>
3
)
&
0x03
;
...
@@ -117,12 +118,6 @@ rlc_am_get_data_pdu_infos(
...
@@ -117,12 +118,6 @@ rlc_am_get_data_pdu_infos(
}
}
return
0
;
return
0
;
}
else
{
LOG_W
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[GET DATA PDU INFO] SN %04d ERROR CONTROL PDU "
,
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
),
pdu_info_pP
->
sn
);
return
-
1
;
}
}
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void
void
...
@@ -181,26 +176,22 @@ rlc_am_rx_update_vr_ms(
...
@@ -181,26 +176,22 @@ rlc_am_rx_update_vr_ms(
do
{
do
{
pdu_info_cursor_p
=
&
((
rlc_am_rx_pdu_management_t
*
)(
cursor_p
->
data
))
->
pdu_info
;
pdu_info_cursor_p
=
&
((
rlc_am_rx_pdu_management_t
*
)(
cursor_p
->
data
))
->
pdu_info
;
if
(((
rlc_am_rx_pdu_management_t
*
)(
cursor_p
->
data
))
->
all_segments_received
==
0
)
{
if
((((
rlc_am_rx_pdu_management_t
*
)(
cursor_p
->
data
))
->
all_segments_received
==
0
)
||
(
rlc_pP
->
vr_ms
!=
pdu_info_cursor_p
->
sn
))
{
#if TRACE_RLC_AM_RX
#if TRACE_RLC_AM_RX
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[UPDATE VR(MS)] UPDATED VR(MS) %04d -> %04d
\n
"
,
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[UPDATE VR(MS)] UPDATED VR(MS) %04d -> %04d
\n
"
,
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
),
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
),
rlc_pP
->
vr_ms
,
pdu_info_cursor_p
->
sn
);
rlc_pP
->
vr_ms
,
pdu_info_cursor_p
->
sn
);
#endif
#endif
rlc_pP
->
vr_ms
=
pdu_info_cursor_p
->
sn
;
return
;
return
;
}
}
rlc_pP
->
vr_ms
=
RLC_AM_NEXT_SN
(
pdu_info_cursor_p
->
sn
);
cursor_p
=
cursor_p
->
next
;
cursor_p
=
cursor_p
->
next
;
}
while
(
cursor_p
!=
NULL
);
}
while
(
(
cursor_p
!=
NULL
)
&&
(
rlc_pP
->
vr_ms
!=
rlc_pP
->
vr_h
)
);
#if TRACE_RLC_AM_RX
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[UPDATE VR(MS)] UPDATED VR(MS) %04d -> %04d
\n
"
,
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
),
rlc_pP
->
vr_ms
,
(
pdu_info_cursor_p
->
sn
+
1
)
&
RLC_AM_SN_MASK
);
#endif
rlc_pP
->
vr_ms
=
(
pdu_info_cursor_p
->
sn
+
1
)
&
RLC_AM_SN_MASK
;
}
}
}
}
// assumed the sn of the tb_p is equal to VR(R)
// assumed the sn of the tb_p is equal to VR(R)
...
@@ -322,18 +313,14 @@ rlc_am_receive_process_data_pdu (
...
@@ -322,18 +313,14 @@ rlc_am_receive_process_data_pdu (
// - discard the duplicate byte segments.
// - discard the duplicate byte segments.
rlc_am_pdu_info_t
*
pdu_info_p
=
&
((
rlc_am_rx_pdu_management_t
*
)(
tb_pP
->
data
))
->
pdu_info
;
rlc_am_pdu_info_t
*
pdu_info_p
=
&
((
rlc_am_rx_pdu_management_t
*
)(
tb_pP
->
data
))
->
pdu_info
;
rlc_am_pdu_sn_10_t
*
rlc_am_pdu_sn_10_p
=
(
rlc_am_pdu_sn_10_t
*
)
first_byte_pP
;
rlc_am_pdu_sn_10_t
*
rlc_am_pdu_sn_10_p
=
(
rlc_am_pdu_sn_10_t
*
)
first_byte_pP
;
rlc_am_rx_pdu_status_t
pdu_status
=
RLC_AM_DATA_PDU_STATUS_OK
;
boolean_t
reassemble
=
false
;
if
(
rlc_am_get_data_pdu_infos
(
ctxt_pP
,
rlc_pP
,
rlc_am_pdu_sn_10_p
,
tb_size_in_bytesP
,
pdu_info_p
)
>=
0
)
{
if
(
rlc_am_get_data_pdu_infos
(
ctxt_pP
,
rlc_pP
,
rlc_am_pdu_sn_10_p
,
tb_size_in_bytesP
,
pdu_info_p
)
>=
0
)
{
((
rlc_am_rx_pdu_management_t
*
)(
tb_pP
->
data
))
->
all_segments_received
=
0
;
((
rlc_am_rx_pdu_management_t
*
)(
tb_pP
->
data
))
->
all_segments_received
=
0
;
if
(
rlc_am_in_rx_window
(
ctxt_pP
,
rlc_pP
,
pdu_info_p
->
sn
))
{
if
(
RLC_AM_SN_IN_WINDOW
(
pdu_info_p
->
sn
,
rlc_pP
->
vr_r
))
{
if
(
pdu_info_p
->
p
)
{
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[PROCESS RX PDU] POLL BIT SET, STATUS REQUESTED:
\n
"
,
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
));
rlc_pP
->
status_requested
=
1
;
}
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[PROCESS RX PDU] VR(R) %04d VR(H) %04d VR(MR) %04d VR(MS) %04d VR(X) %04d
\n
"
,
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[PROCESS RX PDU] VR(R) %04d VR(H) %04d VR(MR) %04d VR(MS) %04d VR(X) %04d
\n
"
,
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
),
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
),
...
@@ -346,10 +333,8 @@ rlc_am_receive_process_data_pdu (
...
@@ -346,10 +333,8 @@ rlc_am_receive_process_data_pdu (
if
(
rlc_am_rx_list_insert_pdu
(
ctxt_pP
,
rlc_pP
,
tb_pP
)
<
0
)
{
if
(
rlc_am_rx_list_insert_pdu
(
ctxt_pP
,
rlc_pP
,
tb_pP
)
<
0
)
{
rlc_pP
->
stat_rx_data_pdu_dropped
+=
1
;
rlc_pP
->
stat_rx_data_pdu_dropped
+=
1
;
rlc_pP
->
stat_rx_data_bytes_dropped
+=
tb_size_in_bytesP
;
rlc_pP
->
stat_rx_data_bytes_dropped
+=
tb_size_in_bytesP
;
free_mem_block
(
tb_pP
,
__func__
);
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[PROCESS RX PDU] PDU DISCARDED, STATUS REQUESTED:
\n
"
,
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[PROCESS RX PDU] PDU DISCARDED, STATUS REQUESTED:
\n
"
,
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
));
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
));
rlc_pP
->
status_requested
=
1
;
#if RLC_STOP_ON_LOST_PDU
#if RLC_STOP_ON_LOST_PDU
AssertFatal
(
0
==
1
,
AssertFatal
(
0
==
1
,
PROTOCOL_RLC_AM_CTXT_FMT
" LOST PDU DETECTED
\n
"
,
PROTOCOL_RLC_AM_CTXT_FMT
" LOST PDU DETECTED
\n
"
,
...
@@ -394,12 +379,15 @@ rlc_am_receive_process_data_pdu (
...
@@ -394,12 +379,15 @@ rlc_am_receive_process_data_pdu (
rlc_am_rx_list_display
(
rlc_pP
,
"rlc_am_receive_process_data_pdu AFTER INSERTION "
);
rlc_am_rx_list_display
(
rlc_pP
,
"rlc_am_receive_process_data_pdu AFTER INSERTION "
);
#endif
#endif
if
(
rlc_am_sn_gte_vr_h
(
ctxt_pP
,
rlc_pP
,
pdu_info_p
->
sn
)
>
0
)
{
/* 1) Update vrH if sn >= vrH */
rlc_pP
->
vr_h
=
(
pdu_info_p
->
sn
+
1
)
&
RLC_AM_SN_MASK
;
if
(
RLC_AM_DIFF_SN
(
pdu_info_p
->
sn
,
rlc_pP
->
vr_r
)
>=
RLC_AM_DIFF_SN
(
rlc_pP
->
vr_h
,
rlc_pP
->
vr_r
))
{
rlc_pP
->
vr_h
=
RLC_AM_NEXT_SN
(
pdu_info_p
->
sn
);
}
}
rlc_am_rx_check_all_byte_segments
(
ctxt_pP
,
rlc_pP
,
tb_pP
);
rlc_am_rx_check_all_byte_segments
(
ctxt_pP
,
rlc_pP
,
tb_pP
);
/* 2) Reordering Window Processing: Update vr_ms if sn = vr_ms and all bytes received for sn */
if
((
pdu_info_p
->
sn
==
rlc_pP
->
vr_ms
)
&&
(((
rlc_am_rx_pdu_management_t
*
)(
tb_pP
->
data
))
->
all_segments_received
))
{
if
((
pdu_info_p
->
sn
==
rlc_pP
->
vr_ms
)
&&
(((
rlc_am_rx_pdu_management_t
*
)(
tb_pP
->
data
))
->
all_segments_received
))
{
rlc_am_rx_update_vr_ms
(
ctxt_pP
,
rlc_pP
,
tb_pP
);
rlc_am_rx_update_vr_ms
(
ctxt_pP
,
rlc_pP
,
tb_pP
);
}
}
...
@@ -410,20 +398,35 @@ rlc_am_receive_process_data_pdu (
...
@@ -410,20 +398,35 @@ rlc_am_receive_process_data_pdu (
rlc_pP
->
vr_mr
=
(
rlc_pP
->
vr_r
+
RLC_AM_WINDOW_SIZE
)
&
RLC_AM_SN_MASK
;
rlc_pP
->
vr_mr
=
(
rlc_pP
->
vr_r
+
RLC_AM_WINDOW_SIZE
)
&
RLC_AM_SN_MASK
;
}
}
rlc_am_rx_list_reassemble_rlc_sdus
(
ctxt_pP
,
rlc_pP
);
reassemble
=
true
;
//TODO : optimization : check whether a reassembly is needed by looking at LI, FI, SO, etc...
}
}
//FNA: fix check VrX out of receiving window
//FNA: fix check VrX out of receiving window
if
(
rlc_pP
->
t_reordering
.
running
)
{
if
(
(
rlc_pP
->
t_reordering
.
running
)
||
((
rlc_pP
->
t_reordering
.
ms_duration
==
0
)
&&
(
rlc_pP
->
vr_x
!=
RLC_SN_UNDEFINED
))
)
{
if
((
rlc_pP
->
vr_x
==
rlc_pP
->
vr_r
)
||
(
(
rlc_am_in_rx_window
(
ctxt_pP
,
rlc_pP
,
rlc_pP
->
vr_x
)
==
0
)
&&
(
rlc_pP
->
vr_x
!=
rlc_pP
->
vr_mr
)))
{
if
((
rlc_pP
->
vr_x
==
rlc_pP
->
vr_r
)
||
(
!
(
RLC_AM_SN_IN_WINDOW
(
rlc_pP
->
vr_x
,
rlc_pP
->
vr_r
)
)
&&
(
rlc_pP
->
vr_x
!=
rlc_pP
->
vr_mr
)))
{
rlc_am_stop_and_reset_timer_reordering
(
ctxt_pP
,
rlc_pP
);
rlc_am_stop_and_reset_timer_reordering
(
ctxt_pP
,
rlc_pP
);
rlc_pP
->
vr_x
=
RLC_SN_UNDEFINED
;
}
}
}
}
if
(
!
(
rlc_pP
->
t_reordering
.
running
))
{
if
(
!
(
rlc_pP
->
t_reordering
.
running
))
{
if
(
rlc_pP
->
vr_h
!=
rlc_pP
->
vr_r
)
{
// - if VR (H) > VR(R) translated to - if VR (H) != VR(R)
if
(
rlc_pP
->
vr_h
!=
rlc_pP
->
vr_r
)
{
// - if VR (H) > VR(R) translated to - if VR (H) != VR(R)
rlc_am_start_timer_reordering
(
ctxt_pP
,
rlc_pP
);
rlc_pP
->
vr_x
=
rlc_pP
->
vr_h
;
rlc_pP
->
vr_x
=
rlc_pP
->
vr_h
;
if
(
rlc_pP
->
t_reordering
.
ms_duration
!=
0
)
{
rlc_am_start_timer_reordering
(
ctxt_pP
,
rlc_pP
);
}
else
{
/* specific case for no timer reordering configured */
/* reordering window directly advances with vrH */
rlc_pP
->
vr_ms
=
rlc_pP
->
vr_h
;
/* Trigger a Status and clear any existing Delay Flag */
RLC_AM_SET_STATUS
(
rlc_pP
->
status_requested
,
RLC_AM_STATUS_TRIGGERED_T_REORDERING
);
RLC_AM_CLEAR_STATUS
(
rlc_pP
->
status_requested
,
RLC_AM_STATUS_TRIGGERED_DELAYED
);
rlc_pP
->
sn_status_triggered_delayed
=
RLC_SN_UNDEFINED
;
}
}
}
}
}
}
}
...
@@ -437,12 +440,67 @@ rlc_am_receive_process_data_pdu (
...
@@ -437,12 +440,67 @@ rlc_am_receive_process_data_pdu (
}
else
{
}
else
{
rlc_pP
->
stat_rx_data_pdu_out_of_window
+=
1
;
rlc_pP
->
stat_rx_data_pdu_out_of_window
+=
1
;
rlc_pP
->
stat_rx_data_bytes_out_of_window
+=
tb_size_in_bytesP
;
rlc_pP
->
stat_rx_data_bytes_out_of_window
+=
tb_size_in_bytesP
;
free_mem_block
(
tb_pP
,
__func__
)
;
pdu_status
=
RLC_AM_DATA_PDU_STATUS_SN_OUTSIDE_WINDOW
;
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[PROCESS RX PDU] PDU OUT OF RX WINDOW, DISCARDED, STATUS REQUESTED:
\n
"
,
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[PROCESS RX PDU] PDU OUT OF RX WINDOW, DISCARDED, STATUS REQUESTED:
\n
"
,
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
));
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
));
rlc_pP
->
status_requested
=
1
;
}
}
/* 3) Check for triggering a Tx Status PDU if a poll is received or if a pending status was delayed */
if
(
pdu_info_p
->
p
)
{
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[PROCESS RX PDU] POLL BIT SET, STATUS REQUESTED:
\n
"
,
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
));
/* Polling Info Saving for In and Out of Window PDU */
/* avoid multi status trigger */
if
((
RLC_AM_GET_STATUS
(
rlc_pP
->
status_requested
,
RLC_AM_STATUS_TRIGGERED_DELAYED
))
||
!
(
RLC_AM_GET_STATUS
(
rlc_pP
->
status_requested
,(
RLC_AM_STATUS_TRIGGERED_POLL
|
RLC_AM_STATUS_TRIGGERED_T_REORDERING
))))
{
RLC_AM_SET_STATUS
(
rlc_pP
->
status_requested
,
RLC_AM_STATUS_TRIGGERED_POLL
);
if
((
pdu_status
!=
RLC_AM_DATA_PDU_STATUS_OK
)
||
((
pdu_status
==
RLC_AM_DATA_PDU_STATUS_OK
)
&&
(
!
(
RLC_AM_SN_IN_WINDOW
(
pdu_info_p
->
sn
,
rlc_pP
->
vr_r
))
||
(
RLC_AM_DIFF_SN
(
pdu_info_p
->
sn
,
rlc_pP
->
vr_r
)
<
RLC_AM_DIFF_SN
(
rlc_pP
->
vr_ms
,
rlc_pP
->
vr_r
)))
)
)
{
/* Conditions are met for sending a Status Report */
/* Then clear Delay Flag and reset its corresponding sn */
RLC_AM_CLEAR_STATUS
(
rlc_pP
->
status_requested
,
RLC_AM_STATUS_TRIGGERED_DELAYED
);
rlc_pP
->
sn_status_triggered_delayed
=
RLC_SN_UNDEFINED
;
}
else
if
(
rlc_pP
->
sn_status_triggered_delayed
==
RLC_SN_UNDEFINED
)
{
/* Delay status trigger if pdustatus OK and sn>= vr_ms */
/* Note: vr_r and vr_ms have been updated */
RLC_AM_SET_STATUS
(
rlc_pP
->
status_requested
,
RLC_AM_STATUS_TRIGGERED_DELAYED
);
rlc_pP
->
sn_status_triggered_delayed
=
pdu_info_p
->
sn
;
}
}
}
/* ReEnable a previously delayed Status Trigger if PDU discarded or */
/* sn no more in RxWindow due to RxWindow advance or sn < vr_ms */
if
((
RLC_AM_GET_STATUS
(
rlc_pP
->
status_requested
,
RLC_AM_STATUS_TRIGGERED_DELAYED
))
&&
(
pdu_status
==
RLC_AM_DATA_PDU_STATUS_OK
)
&&
(
!
(
RLC_AM_SN_IN_WINDOW
(
rlc_pP
->
sn_status_triggered_delayed
,
rlc_pP
->
vr_r
))
||
(
RLC_AM_DIFF_SN
(
rlc_pP
->
sn_status_triggered_delayed
,
rlc_pP
->
vr_r
)
<
RLC_AM_DIFF_SN
(
rlc_pP
->
vr_ms
,
rlc_pP
->
vr_r
)))
)
{
RLC_AM_CLEAR_STATUS
(
rlc_pP
->
status_requested
,
RLC_AM_STATUS_TRIGGERED_DELAYED
);
rlc_pP
->
sn_status_triggered_delayed
=
RLC_SN_UNDEFINED
;
}
}
else
{
}
else
{
pdu_status
=
RLC_AM_DATA_PDU_STATUS_HEADER_ERROR
;
}
if
(
pdu_status
!=
RLC_AM_DATA_PDU_STATUS_OK
)
{
/* Discard received block if out of window, duplicate or header error */
free_mem_block
(
tb_pP
,
__func__
);
free_mem_block
(
tb_pP
,
__func__
);
}
}
else
if
(
reassemble
)
{
/* Reassemble SDUs */
rlc_am_rx_list_reassemble_rlc_sdus
(
ctxt_pP
,
rlc_pP
);
}
}
}
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_rx_list.c
View file @
f65ac504
...
@@ -49,6 +49,10 @@ rlc_am_rx_list_insert_pdu(
...
@@ -49,6 +49,10 @@ rlc_am_rx_list_insert_pdu(
cursor_p
=
rlc_pP
->
receiver_buffer
.
head
;
cursor_p
=
rlc_pP
->
receiver_buffer
.
head
;
// it is assumed this pdu is in rx window
// it is assumed this pdu is in rx window
//TODO : check for duplicate
// should be rewrite
/* look for previous SN */
if
(
cursor_p
)
{
if
(
cursor_p
)
{
if
(
rlc_pP
->
vr_mr
<
rlc_pP
->
vr_r
)
{
if
(
rlc_pP
->
vr_mr
<
rlc_pP
->
vr_r
)
{
if
(
pdu_info_p
->
sn
>=
rlc_pP
->
vr_r
)
{
if
(
pdu_info_p
->
sn
>=
rlc_pP
->
vr_r
)
{
...
...
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
View file @
f65ac504
...
@@ -474,7 +474,7 @@ rlc_am_send_status_pdu(
...
@@ -474,7 +474,7 @@ rlc_am_send_status_pdu(
pdu_info_cursor_p
=
&
((
rlc_am_rx_pdu_management_t
*
)(
cursor_p
->
data
))
->
pdu_info
;
pdu_info_cursor_p
=
&
((
rlc_am_rx_pdu_management_t
*
)(
cursor_p
->
data
))
->
pdu_info
;
sn_cursor
=
pdu_info_cursor_p
->
sn
;
sn_cursor
=
pdu_info_cursor_p
->
sn
;
while
(
rlc_am_in_rx_window
(
ctxt_pP
,
rlc_pP
,
sn_cursor
)
==
0
)
{
while
(
!
(
RLC_AM_SN_IN_WINDOW
(
sn_cursor
,
rlc_pP
->
vr_r
))
)
{
cursor_p
=
cursor_p
->
next
;
cursor_p
=
cursor_p
->
next
;
previous_sn_cursor
=
sn_cursor
;
previous_sn_cursor
=
sn_cursor
;
...
...
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_structs.h
View file @
f65ac504
...
@@ -236,6 +236,28 @@ typedef struct rlc_am_rx_pdu_management {
...
@@ -236,6 +236,28 @@ typedef struct rlc_am_rx_pdu_management {
uint8_t
all_segments_received
;
/*!< \brief Is all segments of PDU SN have been received. */
uint8_t
all_segments_received
;
/*!< \brief Is all segments of PDU SN have been received. */
}
rlc_am_rx_pdu_management_t
;
}
rlc_am_rx_pdu_management_t
;
/** @} */
/** @} */
typedef
enum
rlc_am_rx_pdu_status
{
/** PDU okay. */
RLC_AM_DATA_PDU_STATUS_OK
=
0
,
/** SN outside RX window */
RLC_AM_DATA_PDU_STATUS_SN_OUTSIDE_WINDOW
=
1
,
/** SN already available */
RLC_AM_DATA_PDU_STATUS_SN_DUPLICATE
=
2
,
/** SN already available */
RLC_AM_DATA_PDU_STATUS_AM_SEGMENT_DUPLICATE
=
3
,
/** Buffer full */
RLC_AM_DATA_PDU_STATUS_BUFFER_FULL
=
4
,
/** Header Error (LI,SO...) */
RLC_AM_DATA_PDU_STATUS_HEADER_ERROR
=
5
,
/** Unknown bearer */
RLC_AM_DATA_PDU_STATUS_INVALID_BEARER
=
6
,
/** RLC in wrong state */
RLC_AM_DATA_PDU_STATUS_WRONG_STATE
=
7
}
rlc_am_rx_pdu_status_t
;
/*! \cond PRIVATE */
/*! \cond PRIVATE */
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// interlayers optimizations
// interlayers optimizations
...
...
openair2/LAYER2/RLC/rlc_def.h
View file @
f65ac504
...
@@ -64,6 +64,7 @@ enum RLC_OPERATION_MODE { TRANSMITTER_ONLY = 0x00,
...
@@ -64,6 +64,7 @@ enum RLC_OPERATION_MODE { TRANSMITTER_ONLY = 0x00,
// dimensions
// dimensions
# define SN_12BITS_MASK 0x0FFF
# define SN_12BITS_MASK 0x0FFF
# define RLC_SN_OVERFLOW 0xFFFF
# define RLC_SN_OVERFLOW 0xFFFF
# define RLC_SN_UNDEFINED RLC_SN_OVERFLOW
//----------------------------------------------------------
//----------------------------------------------------------
// DISCARD
// DISCARD
//----------------------------------------------------------
//----------------------------------------------------------
...
...
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