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
fecc9b2d
Commit
fecc9b2d
authored
Feb 22, 2017
by
fnabet
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
RLC AM Tx buffer: fix sn modulo window size access
parent
ef8aff87
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
50 additions
and
42 deletions
+50
-42
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c
+2
-2
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
+3
-3
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c
+30
-27
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c
+2
-0
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h
+2
-1
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
+3
-3
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c
+8
-6
No files found.
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_in_sdu.c
View file @
fecc9b2d
...
...
@@ -120,8 +120,8 @@ rlc_am_pdu_sdu_data_cnf(
int
pdu_sdu_index
;
int
sdu_index
;
for
(
pdu_sdu_index
=
0
;
pdu_sdu_index
<
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
nb_sdus
;
pdu_sdu_index
++
)
{
sdu_index
=
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
sdus_index
[
pdu_sdu_index
];
for
(
pdu_sdu_index
=
0
;
pdu_sdu_index
<
rlc_pP
->
tx_data_pdu_buffer
[
snP
%
RLC_AM_WINDOW_SIZE
].
nb_sdus
;
pdu_sdu_index
++
)
{
sdu_index
=
rlc_pP
->
tx_data_pdu_buffer
[
snP
%
RLC_AM_WINDOW_SIZE
].
sdus_index
[
pdu_sdu_index
];
assert
(
sdu_index
>=
0
);
assert
(
sdu_index
<
RLC_AM_SDU_CONTROL_BUFFER_SIZE
);
rlc_pP
->
input_sdus
[
sdu_index
].
nb_pdus_ack
+=
1
;
...
...
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_init.c
View file @
fecc9b2d
...
...
@@ -175,9 +175,9 @@ rlc_am_cleanup(
if
(
rlc_pP
->
tx_data_pdu_buffer
!=
NULL
)
{
for
(
i
=
0
;
i
<
RLC_AM_PDU_RETRANSMISSION_BUFFER_SIZE
;
i
++
)
{
if
(
rlc_pP
->
tx_data_pdu_buffer
[
i
].
mem_block
!=
NULL
)
{
free_mem_block
(
rlc_pP
->
tx_data_pdu_buffer
[
i
].
mem_block
,
__func__
);
rlc_pP
->
tx_data_pdu_buffer
[
i
].
mem_block
=
NULL
;
if
(
rlc_pP
->
tx_data_pdu_buffer
[
i
%
RLC_AM_WINDOW_SIZE
].
mem_block
!=
NULL
)
{
free_mem_block
(
rlc_pP
->
tx_data_pdu_buffer
[
i
%
RLC_AM_WINDOW_SIZE
].
mem_block
,
__func__
);
rlc_pP
->
tx_data_pdu_buffer
[
i
%
RLC_AM_WINDOW_SIZE
].
mem_block
=
NULL
;
}
}
...
...
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_retransmit.c
View file @
fecc9b2d
...
...
@@ -51,8 +51,8 @@ boolean_t rlc_am_nack_pdu (
// - indicate to upper layers that max retransmission has been reached.
mem_block_t
*
mb_p
=
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
mem_block
;
rlc_am_tx_data_pdu_management_t
*
tx_data_pdu_buffer_p
=
&
rlc_pP
->
tx_data_pdu_buffer
[
snP
];
mem_block_t
*
mb_p
=
rlc_pP
->
tx_data_pdu_buffer
[
snP
%
RLC_AM_WINDOW_SIZE
].
mem_block
;
rlc_am_tx_data_pdu_management_t
*
tx_data_pdu_buffer_p
=
&
rlc_pP
->
tx_data_pdu_buffer
[
snP
%
RLC_AM_WINDOW_SIZE
];
//int pdu_sdu_index;
//int sdu_index;
boolean_t
status
=
TRUE
;
...
...
@@ -208,23 +208,24 @@ void rlc_am_ack_pdu (
rlc_am_entity_t
*
const
rlc_pP
,
const
rlc_sn_t
snP
)
{
mem_block_t
*
mb_p
=
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
mem_block
;
mem_block_t
*
mb_p
=
rlc_pP
->
tx_data_pdu_buffer
[
snP
%
RLC_AM_WINDOW_SIZE
].
mem_block
;
rlc_am_tx_data_pdu_management_t
*
tx_data_pdu_buffer
=
&
rlc_pP
->
tx_data_pdu_buffer
[
snP
%
RLC_AM_WINDOW_SIZE
];
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
flags
.
retransmit
=
0
;
tx_data_pdu_buffer
->
flags
.
retransmit
=
0
;
if
((
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
flags
.
ack
==
0
)
&&
(
mb_p
!=
NULL
))
{
if
((
tx_data_pdu_buffer
->
flags
.
ack
==
0
)
&&
(
mb_p
!=
NULL
))
{
//if (mb_pP != NULL) {
free_mem_block
(
mb_p
,
__func__
);
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
mem_block
=
NULL
;
tx_data_pdu_buffer
->
mem_block
=
NULL
;
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
"[ACK-PDU] ACK PDU SN %05d previous retx_count %d
\n
"
,
PROTOCOL_RLC_AM_CTXT_ARGS
(
ctxt_pP
,
rlc_pP
),
snP
,
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
retx_count
);
tx_data_pdu_buffer
->
retx_count
);
if
(
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
retx_payload_size
)
{
rlc_pP
->
retrans_num_bytes_to_retransmit
-=
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
retx_payload_size
;
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
retx_payload_size
=
0
;
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
num_holes
=
0
;
if
(
tx_data_pdu_buffer
->
retx_payload_size
)
{
rlc_pP
->
retrans_num_bytes_to_retransmit
-=
tx_data_pdu_buffer
->
retx_payload_size
;
tx_data_pdu_buffer
->
retx_payload_size
=
0
;
tx_data_pdu_buffer
->
num_holes
=
0
;
rlc_pP
->
retrans_num_pdus
--
;
}
...
...
@@ -235,12 +236,12 @@ void rlc_am_ack_pdu (
if
(
mb_p
!=
NULL
)
{
free_mem_block
(
mb_p
,
__func__
);
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
mem_block
=
NULL
;
tx_data_pdu_buffer
->
mem_block
=
NULL
;
}
}
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
flags
.
ack
=
1
;
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
flags
.
transmitted
=
0
;
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
flags
.
retransmit
=
0
;
tx_data_pdu_buffer
->
flags
.
ack
=
1
;
tx_data_pdu_buffer
->
flags
.
transmitted
=
0
;
tx_data_pdu_buffer
->
flags
.
retransmit
=
0
;
}
//-----------------------------------------------------------------------------
...
...
@@ -249,12 +250,12 @@ mem_block_t* rlc_am_retransmit_get_copy (
rlc_am_entity_t
*
const
rlc_pP
,
const
rlc_sn_t
snP
)
{
mem_block_t
*
mb_original_p
=
rlc_pP
->
tx_data_pdu_buffer
[
snP
].
mem_block
;
mem_block_t
*
mb_original_p
=
rlc_pP
->
tx_data_pdu_buffer
[
snP
%
RLC_AM_WINDOW_SIZE
].
mem_block
;
AssertFatal
(
mb_original_p
!=
NULL
,
"RLC AM PDU Copy Error: Empty block sn=%d vtA=%d vtS=%d LcId=%d !
\n
"
,
snP
,
rlc_pP
->
vt_a
,
rlc_pP
->
vt_s
,
rlc_pP
->
channel_id
);
rlc_am_tx_data_pdu_management_t
*
pdu_mngt
=
&
rlc_pP
->
tx_data_pdu_buffer
[
snP
%
RLC_AM_
PDU_RETRANSMISSION_BUFFER
_SIZE
];
rlc_am_tx_data_pdu_management_t
*
pdu_mngt
=
&
rlc_pP
->
tx_data_pdu_buffer
[
snP
%
RLC_AM_
WINDOW
_SIZE
];
/* We need to allocate a new buffer and copy to it because header content may change for Polling bit */
int
size
=
pdu_mngt
->
header_and_payload_size
+
sizeof
(
struct
mac_tb_req
);
...
...
@@ -1061,6 +1062,7 @@ void rlc_am_tx_buffer_display (
{
rlc_sn_t
sn
=
rlc_pP
->
vt_a
;
int
i
,
loop
=
0
;
rlc_am_tx_data_pdu_management_t
*
tx_data_pdu_buffer_p
;
if
(
message_pP
)
{
LOG_D
(
RLC
,
PROTOCOL_RLC_AM_CTXT_FMT
" Retransmission buffer %s VT(A)=%04d VT(S)=%04d:"
,
...
...
@@ -1076,25 +1078,26 @@ void rlc_am_tx_buffer_display (
}
while
(
rlc_pP
->
vt_s
!=
sn
)
{
if
(
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
mem_block
)
{
tx_data_pdu_buffer_p
=
&
rlc_pP
->
tx_data_pdu_buffer
[
sn
%
RLC_AM_WINDOW_SIZE
];
if
(
tx_data_pdu_buffer_p
->
mem_block
)
{
if
((
loop
%
1
)
==
0
)
{
LOG_D
(
RLC
,
"
\n
TX SN:
\t
"
);
}
if
(
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
flags
.
retransmit
)
{
LOG_D
(
RLC
,
"%04d %d/%d Bytes (NACK RTX:%02d "
,
sn
,
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
header_and_payload_size
,
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
payload_size
,
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
retx_count
);
if
(
tx_data_pdu_buffer_p
->
flags
.
retransmit
)
{
LOG_D
(
RLC
,
"%04d %d/%d Bytes (NACK RTX:%02d "
,
sn
,
tx_data_pdu_buffer_p
->
header_and_payload_size
,
tx_data_pdu_buffer_p
->
payload_size
,
tx_data_pdu_buffer_p
->
retx_count
);
}
else
{
LOG_D
(
RLC
,
"%04d %d/%d Bytes (RTX:%02d "
,
sn
,
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
header_and_payload_size
,
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
payload_size
,
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
retx_count
);
LOG_D
(
RLC
,
"%04d %d/%d Bytes (RTX:%02d "
,
sn
,
tx_data_pdu_buffer_p
->
header_and_payload_size
,
tx_data_pdu_buffer_p
->
payload_size
,
tx_data_pdu_buffer_p
->
retx_count
);
}
if
(
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
num_holes
==
0
)
{
LOG_D
(
RLC
,
"SO:%04d->%04d)
\t
"
,
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
nack_so_start
,
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
nack_so_stop
);
if
(
tx_data_pdu_buffer_p
->
num_holes
==
0
)
{
LOG_D
(
RLC
,
"SO:%04d->%04d)
\t
"
,
tx_data_pdu_buffer_p
->
nack_so_start
,
tx_data_pdu_buffer_p
->
nack_so_stop
);
}
else
{
for
(
i
=
0
;
i
<
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
num_holes
;
i
++
)
{
for
(
i
=
0
;
i
<
tx_data_pdu_buffer_p
->
num_holes
;
i
++
)
{
assert
(
i
<
RLC_AM_MAX_HOLES_REPORT_PER_PDU
);
LOG_D
(
RLC
,
"SO:%04d->%04d)
\t
"
,
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
hole_so_start
[
i
],
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
hole_so_stop
[
i
]);
LOG_D
(
RLC
,
"SO:%04d->%04d)
\t
"
,
tx_data_pdu_buffer_p
->
hole_so_start
[
i
],
tx_data_pdu_buffer_p
->
hole_so_stop
[
i
]);
}
}
...
...
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.c
View file @
fecc9b2d
...
...
@@ -19,6 +19,7 @@
* contact@openairinterface.org
*/
#if 0
#define RLC_AM_MODULE 1
#define RLC_AM_SEGMENT_HOLES_C 1
//-----------------------------------------------------------------------------
...
...
@@ -315,3 +316,4 @@ void rlc_am_add_hole (
assert(rlc_pP->tx_data_pdu_buffer[snP].num_holes < RLC_AM_MAX_HOLES_REPORT_PER_PDU);
assert(rlc_pP->tx_data_pdu_buffer[snP].nack_so_start < rlc_pP->tx_data_pdu_buffer[snP].payload_size);
}
#endif
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_segments_holes.h
View file @
fecc9b2d
...
...
@@ -32,7 +32,7 @@
* @ingroup _rlc_am_internal_segment_impl_
* @{
*/
#if 0
#ifndef __RLC_AM_SEGMENT_HOLES_H__
# define __RLC_AM_SEGMENT_HOLES_H__
//-----------------------------------------------------------------------------
...
...
@@ -108,3 +108,4 @@ protected_rlc_am_segments_holes(void rlc_am_add_hole (
sdu_size_t
so_stopP
);)
/** @} */
#endif
#endif
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
View file @
fecc9b2d
...
...
@@ -268,7 +268,7 @@ rlc_am_receive_process_control_pdu(
{
rlc_am_pdu_sn_10_t
*
rlc_am_pdu_sn_10_p
=
(
rlc_am_pdu_sn_10_t
*
)
*
first_byte_ppP
;
sdu_size_t
initial_pdu_size
=
*
tb_size_in_bytes_pP
;
rlc_sn_t
ack_sn
=
rlc_pP
->
control_pdu_info
.
ack_sn
;
rlc_sn_t
ack_sn
=
RLC_AM_NEXT_SN
(
rlc_pP
->
vt_a
)
;
rlc_sn_t
sn_cursor
=
rlc_pP
->
vt_a
;
rlc_sn_t
vt_a_new
=
rlc_pP
->
vt_a
;
rlc_sn_t
sn_data_cnf
;
...
...
@@ -288,7 +288,7 @@ rlc_am_receive_process_control_pdu(
rlc_pP
->
control_pdu_info
.
ack_sn
);
rlc_am_display_control_pdu_infos
(
&
rlc_pP
->
control_pdu_info
);
ack_sn
=
rlc_pP
->
control_pdu_info
.
ack_sn
;
// 5.2.1 Retransmission
//
// The transmitting side of an AM RLC entity can receive a negative acknowledgement (notification of reception failure
...
...
@@ -337,7 +337,7 @@ rlc_am_receive_process_control_pdu(
vt_a_new
=
nack_sn
;
// catch DataCfn
rlc_am_tx_data_pdu_management_t
*
tx_data_pdu_buffer_p
=
&
rlc_pP
->
tx_data_pdu_buffer
[
nack_sn
];
rlc_am_tx_data_pdu_management_t
*
tx_data_pdu_buffer_p
=
&
rlc_pP
->
tx_data_pdu_buffer
[
nack_sn
%
RLC_AM_WINDOW_SIZE
];
if
(
tx_data_pdu_buffer_p
->
retx_payload_size
==
tx_data_pdu_buffer_p
->
payload_size
)
{
sn_data_cnf
=
RLC_AM_PREV_SN
(
nack_sn
);
}
...
...
openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_timer_poll_retransmit.c
View file @
fecc9b2d
...
...
@@ -83,18 +83,20 @@ rlc_am_check_timer_poll_retransmit(
// force BO to be > 0
rlc_sn_t
sn
=
RLC_AM_PREV_SN
(
rlc_pP
->
vt_s
);
rlc_sn_t
sn_end
=
RLC_AM_PREV_SN
(
rlc_pP
->
vt_a
);
rlc_am_tx_data_pdu_management_t
*
tx_data_pdu_buffer_p
;
/* Look for the first retransmittable PDU starting from vtS - 1 */
while
(
sn
!=
sn_end
)
{
AssertFatal
(
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
mem_block
!=
NULL
,
"RLC AM Tpoll Retx expiry sn=%d is empty vtA=%d vtS=%d LcId=%d
\n
"
,
tx_data_pdu_buffer_p
=
&
rlc_pP
->
tx_data_pdu_buffer
[
sn
%
RLC_AM_WINDOW_SIZE
];
AssertFatal
(
tx_data_pdu_buffer_p
->
mem_block
!=
NULL
,
"RLC AM Tpoll Retx expiry sn=%d is empty vtA=%d vtS=%d LcId=%d
\n
"
,
sn
,
rlc_pP
->
vt_a
,
rlc_pP
->
vt_s
,
rlc_pP
->
channel_id
);
if
((
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
flags
.
ack
==
0
)
&&
(
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
flags
.
max_retransmit
==
0
))
{
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
flags
.
retransmit
=
1
;
if
(
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
retx_count
==
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
retx_count_next
)
{
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
retx_count_next
++
;
if
((
tx_data_pdu_buffer_p
->
flags
.
ack
==
0
)
&&
(
tx_data_pdu_buffer_p
->
flags
.
max_retransmit
==
0
))
{
tx_data_pdu_buffer_p
->
flags
.
retransmit
=
1
;
if
(
tx_data_pdu_buffer_p
->
retx_count
==
tx_data_pdu_buffer_p
->
retx_count_next
)
{
tx_data_pdu_buffer_p
->
retx_count_next
++
;
}
rlc_pP
->
retrans_num_pdus
+=
1
;
rlc_pP
->
retrans_num_bytes_to_retransmit
+=
rlc_pP
->
tx_data_pdu_buffer
[
sn
].
payload_size
;
rlc_pP
->
retrans_num_bytes_to_retransmit
+=
tx_data_pdu_buffer_p
->
payload_size
;
break
;
}
else
...
...
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