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
lizhongxiao
OpenXG-RAN
Commits
a8aa383f
Commit
a8aa383f
authored
Aug 18, 2023
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/NR_RLC_LCID_indexing' into integration_2023_w33
parents
f8f7c408
cb003e4f
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
147 additions
and
186 deletions
+147
-186
openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+133
-186
openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h
openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h
+14
-0
No files found.
openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
View file @
a8aa383f
...
...
@@ -54,23 +54,33 @@ static uint64_t nr_rlc_current_time;
static
int
nr_rlc_current_time_last_frame
;
static
int
nr_rlc_current_time_last_subframe
;
void
mac_rlc_data_ind
(
const
module_id_t
module_idP
,
const
rnti_t
rntiP
,
const
eNB_index_t
eNB_index
,
const
frame_t
frameP
,
const
eNB_flag_t
enb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
logical_chan_id_t
channel_idP
,
char
*
buffer_pP
,
const
tb_size_t
tb_sizeP
,
num_tb_t
num_tbP
,
crc_t
*
crcs_pP
)
nr_rlc_entity_t
*
get_rlc_entity_from_lcid
(
nr_rlc_ue_t
*
ue
,
logical_chan_id_t
channel_id
)
{
nr_rlc_ue_t
*
ue
;
nr_rlc_entity_t
*
rb
;
if
(
channel_id
==
0
)
return
ue
->
srb0
;
nr_rlc_rb_t
*
rb
=
&
ue
->
lcid2rb
[
channel_id
-
1
];
if
(
rb
->
type
==
NR_RLC_SRB
)
return
ue
->
srb
[
rb
->
choice
.
srb_id
-
1
];
else
{
AssertFatal
(
rb
->
type
==
NR_RLC_DRB
,
"Invalid RB type
\n
"
);
return
ue
->
drb
[
rb
->
choice
.
drb_id
-
1
];
}
}
void
mac_rlc_data_ind
(
const
module_id_t
module_idP
,
const
rnti_t
rntiP
,
const
eNB_index_t
eNB_index
,
const
frame_t
rameP
,
const
eNB_flag_t
enb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
logical_chan_id_t
channel_idP
,
char
*
buffer_pP
,
const
tb_size_t
tb_sizeP
,
num_tb_t
num_tbP
,
crc_t
*
crcs_pP
)
{
if
(
module_idP
!=
0
||
eNB_index
!=
0
||
/*enb_flagP != 1 ||*/
MBMS_flagP
!=
0
)
{
LOG_E
(
RLC
,
"%s:%d:%s: fatal
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
exit
(
1
);
...
...
@@ -81,20 +91,15 @@ void mac_rlc_data_ind (
T_INT
(
channel_idP
),
T_INT
(
tb_sizeP
));
nr_rlc_manager_lock
(
nr_rlc_ue_manager
);
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rntiP
);
nr_rlc_ue_t
*
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rntiP
);
if
(
ue
==
NULL
)
LOG_I
(
RLC
,
"RLC instance for the given UE was not found
\n
"
);
LOG_I
(
RLC
,
"RLC instance for the given UE was not found
\n
"
);
switch
(
channel_idP
)
{
case
0
:
rb
=
ue
->
srb0
;
break
;
case
1
...
3
:
rb
=
ue
->
srb
[
channel_idP
-
1
];
break
;
case
4
...
32
:
rb
=
ue
->
drb
[
channel_idP
-
4
];
break
;
default:
rb
=
NULL
;
break
;
}
nr_rlc_entity_t
*
rb
=
get_rlc_entity_from_lcid
(
ue
,
channel_idP
);
if
(
rb
!=
NULL
)
{
LOG_D
(
RLC
,
"RB found! (channel ID %d)
\n
"
,
channel_idP
);
LOG_D
(
RLC
,
"RB found! (channel ID %d)
\n
"
,
channel_idP
);
rb
->
set_time
(
rb
,
nr_rlc_current_time
);
rb
->
recv_pdu
(
rb
,
buffer_pP
,
tb_sizeP
);
}
else
{
...
...
@@ -106,37 +111,24 @@ void mac_rlc_data_ind (
nr_rlc_manager_unlock
(
nr_rlc_ue_manager
);
}
tbs_size_t
mac_rlc_data_req
(
const
module_id_t
module_idP
,
const
rnti_t
rntiP
,
const
eNB_index_t
eNB_index
,
const
frame_t
frameP
,
const
eNB_flag_t
enb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
logical_chan_id_t
channel_idP
,
const
tb_size_t
tb_sizeP
,
char
*
buffer_pP
,
const
uint32_t
sourceL2Id
,
const
uint32_t
destinationL2Id
)
tbs_size_t
mac_rlc_data_req
(
const
module_id_t
module_idP
,
const
rnti_t
rntiP
,
const
eNB_index_t
eNB_index
,
const
frame_t
frameP
,
const
eNB_flag_t
enb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
logical_chan_id_t
channel_idP
,
const
tb_size_t
tb_sizeP
,
char
*
buffer_pP
,
const
uint32_t
sourceL2Id
,
const
uint32_t
destinationL2Id
)
{
int
ret
;
nr_rlc_ue_t
*
ue
;
nr_rlc_entity_t
*
rb
;
int
maxsize
;
nr_rlc_manager_lock
(
nr_rlc_ue_manager
);
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rntiP
);
switch
(
channel_idP
)
{
case
0
:
rb
=
ue
->
srb0
;
break
;
case
1
...
3
:
rb
=
ue
->
srb
[
channel_idP
-
1
];
break
;
case
4
...
32
:
rb
=
ue
->
drb
[
channel_idP
-
4
];
break
;
default:
rb
=
NULL
;
LOG_E
(
RLC
,
"In %s:%d:%s: data request for unknown RB with LCID 0x%02x !
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
channel_idP
);
break
;
}
nr_rlc_ue_t
*
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rntiP
);
nr_rlc_entity_t
*
rb
=
get_rlc_entity_from_lcid
(
ue
,
channel_idP
);
if
(
rb
!=
NULL
)
{
LOG_D
(
RLC
,
"MAC PDU to get created for channel_idP:%d
\n
"
,
channel_idP
);
...
...
@@ -157,32 +149,22 @@ tbs_size_t mac_rlc_data_req(
return
ret
;
}
mac_rlc_status_resp_t
mac_rlc_status_ind
(
const
module_id_t
module_idP
,
const
rnti_t
rntiP
,
const
eNB_index_t
eNB_index
,
const
frame_t
frameP
,
const
sub_frame_t
subframeP
,
const
eNB_flag_t
enb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
logical_chan_id_t
channel_idP
,
const
uint32_t
sourceL2Id
,
const
uint32_t
destinationL2Id
)
mac_rlc_status_resp_t
mac_rlc_status_ind
(
const
module_id_t
module_idP
,
const
rnti_t
rntiP
,
const
eNB_index_t
eNB_index
,
const
frame_t
frameP
,
const
sub_frame_t
subframeP
,
const
eNB_flag_t
enb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
logical_chan_id_t
channel_idP
,
const
uint32_t
sourceL2Id
,
const
uint32_t
destinationL2Id
)
{
nr_rlc_ue_t
*
ue
;
mac_rlc_status_resp_t
ret
;
nr_rlc_entity_t
*
rb
;
nr_rlc_manager_lock
(
nr_rlc_ue_manager
);
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rntiP
);
switch
(
channel_idP
)
{
case
0
:
rb
=
ue
->
srb0
;
break
;
case
1
...
3
:
rb
=
ue
->
srb
[
channel_idP
-
1
];
break
;
case
4
...
MAX_DRBS_PER_UE
:
rb
=
ue
->
drb
[
channel_idP
-
4
];
break
;
default:
rb
=
NULL
;
break
;
}
nr_rlc_ue_t
*
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rntiP
);
nr_rlc_entity_t
*
rb
=
get_rlc_entity_from_lcid
(
ue
,
channel_idP
);
if
(
rb
!=
NULL
)
{
nr_rlc_entity_buffer_status_t
buf_stat
;
...
...
@@ -212,18 +194,15 @@ mac_rlc_status_resp_t mac_rlc_status_ind(
return
ret
;
}
rlc_buffer_occupancy_t
mac_rlc_get_buffer_occupancy_ind
(
const
module_id_t
module_idP
,
const
rnti_t
rntiP
,
const
eNB_index_t
eNB_index
,
const
frame_t
frameP
,
const
sub_frame_t
subframeP
,
const
eNB_flag_t
enb_flagP
,
const
logical_chan_id_t
channel_idP
)
rlc_buffer_occupancy_t
mac_rlc_get_buffer_occupancy_ind
(
const
module_id_t
module_idP
,
const
rnti_t
rntiP
,
const
eNB_index_t
eNB_index
,
const
frame_t
frameP
,
const
sub_frame_t
subframeP
,
const
eNB_flag_t
enb_flagP
,
const
logical_chan_id_t
channel_idP
)
{
nr_rlc_ue_t
*
ue
;
rlc_buffer_occupancy_t
ret
;
nr_rlc_entity_t
*
rb
;
if
(
enb_flagP
)
{
LOG_E
(
RLC
,
"Tx mac_rlc_get_buffer_occupancy_ind function is not implemented for eNB LcId=%u
\n
"
,
channel_idP
);
...
...
@@ -239,13 +218,8 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(
}
nr_rlc_manager_lock
(
nr_rlc_ue_manager
);
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rntiP
);
switch
(
channel_idP
)
{
case
1
...
3
:
rb
=
ue
->
srb
[
channel_idP
-
1
];
break
;
case
4
...
MAX_DRBS_PER_UE
:
rb
=
ue
->
drb
[
channel_idP
-
4
];
break
;
default:
rb
=
NULL
;
break
;
}
nr_rlc_ue_t
*
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rntiP
);
nr_rlc_entity_t
*
rb
=
get_rlc_entity_from_lcid
(
ue
,
channel_idP
);
if
(
rb
!=
NULL
)
{
nr_rlc_entity_buffer_status_t
buf_stat
;
...
...
@@ -272,17 +246,16 @@ rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(
}
rlc_op_status_t
rlc_data_req
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
srb_flag_t
srb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
rb_id_t
rb_idP
,
const
mui_t
muiP
,
confirm_t
confirmP
,
sdu_size_t
sdu_sizeP
,
mem_block_t
*
sdu_pP
,
const
uint32_t
*
const
sourceL2Id
,
const
uint32_t
*
const
destinationL2Id
)
rlc_op_status_t
rlc_data_req
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
srb_flag_t
srb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
rb_id_t
rb_idP
,
const
mui_t
muiP
,
confirm_t
confirmP
,
sdu_size_t
sdu_sizeP
,
mem_block_t
*
sdu_pP
,
const
uint32_t
*
const
sourceL2Id
,
const
uint32_t
*
const
destinationL2Id
)
{
int
rnti
=
ctxt_pP
->
rntiMaybeUEid
;
nr_rlc_ue_t
*
ue
;
...
...
@@ -322,22 +295,14 @@ rlc_op_status_t rlc_data_req (const protocol_ctxt_t *const ctxt_pP,
return
RLC_OP_STATUS_OK
;
}
int
nr_rlc_get_available_tx_space
(
const
rnti_t
rntiP
,
const
logical_chan_id_t
channel_idP
)
int
nr_rlc_get_available_tx_space
(
const
rnti_t
rntiP
,
const
logical_chan_id_t
channel_idP
)
{
nr_rlc_ue_t
*
ue
;
nr_rlc_entity_t
*
rb
;
int
ret
;
nr_rlc_manager_lock
(
nr_rlc_ue_manager
);
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rntiP
);
switch
(
channel_idP
)
{
case
1
...
3
:
rb
=
ue
->
srb
[
channel_idP
-
1
];
break
;
case
4
...
MAX_DRBS_PER_UE
:
rb
=
ue
->
drb
[
channel_idP
-
4
];
break
;
default:
rb
=
NULL
;
break
;
}
nr_rlc_ue_t
*
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rntiP
);
nr_rlc_entity_t
*
rb
=
get_rlc_entity_from_lcid
(
ue
,
channel_idP
);
if
(
rb
!=
NULL
)
{
ret
=
rb
->
available_tx_space
(
rb
);
...
...
@@ -617,12 +582,8 @@ rb_found:
void
nr_rlc_add_srb
(
int
rnti
,
int
srb_id
,
const
NR_RLC_BearerConfig_t
*
rlc_BearerConfig
)
{
nr_rlc_entity_t
*
nr_rlc_am
;
nr_rlc_ue_t
*
ue
;
struct
NR_RLC_Config
*
r
=
rlc_BearerConfig
->
rlc_Config
;
struct
NR_LogicalChannelConfig
*
l
=
rlc_BearerConfig
->
mac_LogicalChannelConfig
;
int
channel_id
=
rlc_BearerConfig
->
logicalChannelIdentity
;
int
logical_channel_group
;
int
t_status_prohibit
;
...
...
@@ -634,17 +595,8 @@ void nr_rlc_add_srb(int rnti, int srb_id, const NR_RLC_BearerConfig_t *rlc_Beare
int
sn_field_length
;
LOG_D
(
RLC
,
"Trying to add SRB %d
\n
"
,
srb_id
);
if
(
srb_id
!=
1
&&
srb_id
!=
2
)
{
LOG_E
(
RLC
,
"%s:%d:%s: fatal, bad srb id %d
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
srb_id
);
exit
(
1
);
}
if
(
channel_id
!=
srb_id
)
{
LOG_E
(
RLC
,
"%s:%d:%s: todo, remove this limitation
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
exit
(
1
);
}
AssertFatal
(
srb_id
>
0
&&
srb_id
<
4
,
"Invalid srb id %d
\n
"
,
srb_id
);
logical_channel_group
=
*
l
->
ul_SpecificParameters
->
logicalChannelGroup
;
...
...
@@ -677,9 +629,16 @@ void nr_rlc_add_srb(int rnti, int srb_id, const NR_RLC_BearerConfig_t *rlc_Beare
}
nr_rlc_manager_lock
(
nr_rlc_ue_manager
);
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rnti
);
nr_rlc_ue_t
*
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rnti
);
AssertFatal
(
rlc_BearerConfig
->
servedRadioBearer
&&
(
rlc_BearerConfig
->
servedRadioBearer
->
present
==
NR_RLC_BearerConfig__servedRadioBearer_PR_srb_Identity
),
"servedRadioBearer for SRB mandatory present when setting up an SRB RLC entity
\n
"
);
int
local_id
=
rlc_BearerConfig
->
logicalChannelIdentity
-
1
;
// LCID 0 for SRB 0 not mapped
ue
->
lcid2rb
[
local_id
].
type
=
NR_RLC_SRB
;
ue
->
lcid2rb
[
local_id
].
choice
.
srb_id
=
rlc_BearerConfig
->
servedRadioBearer
->
choice
.
srb_Identity
;
if
(
ue
->
srb
[
srb_id
-
1
]
!=
NULL
)
{
LOG_
W
(
RLC
,
"%s:%d:%s: SRB %d already exists for UE with RNTI %04x, do nothing
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
srb_id
,
rnti
);
LOG_
E
(
RLC
,
"%s:%d:%s: SRB %d already exists for UE with RNTI %04x, do nothing
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
srb_id
,
rnti
);
}
else
{
/* hack: hardcode values for NR */
t_poll_retransmit
=
45
;
...
...
@@ -689,15 +648,15 @@ void nr_rlc_add_srb(int rnti, int srb_id, const NR_RLC_BearerConfig_t *rlc_Beare
poll_byte
=
-
1
;
max_retx_threshold
=
8
;
sn_field_length
=
12
;
nr_rlc_am
=
new_nr_rlc_entity_am
(
RLC_RX_MAXSIZE
,
RLC_TX_MAXSIZE
,
deliver_sdu
,
ue
,
successful_delivery
,
ue
,
max_retx_reached
,
ue
,
t_poll_retransmit
,
t_reassembly
,
t_status_prohibit
,
poll_pdu
,
poll_byte
,
max_retx_threshold
,
sn_field_length
);
nr_rlc_
entity_t
*
nr_rlc_
am
=
new_nr_rlc_entity_am
(
RLC_RX_MAXSIZE
,
RLC_TX_MAXSIZE
,
deliver_sdu
,
ue
,
successful_delivery
,
ue
,
max_retx_reached
,
ue
,
t_poll_retransmit
,
t_reassembly
,
t_status_prohibit
,
poll_pdu
,
poll_byte
,
max_retx_threshold
,
sn_field_length
);
nr_rlc_ue_add_srb_rlc_entity
(
ue
,
srb_id
,
nr_rlc_am
);
LOG_I
(
RLC
,
"%s:%d:%s: added srb %d to UE with RNTI 0x%x
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
srb_id
,
rnti
);
...
...
@@ -707,12 +666,8 @@ void nr_rlc_add_srb(int rnti, int srb_id, const NR_RLC_BearerConfig_t *rlc_Beare
static
void
add_drb_am
(
int
rnti
,
int
drb_id
,
const
NR_RLC_BearerConfig_t
*
rlc_BearerConfig
)
{
nr_rlc_entity_t
*
nr_rlc_am
;
nr_rlc_ue_t
*
ue
;
struct
NR_RLC_Config
*
r
=
rlc_BearerConfig
->
rlc_Config
;
struct
NR_LogicalChannelConfig
*
l
=
rlc_BearerConfig
->
mac_LogicalChannelConfig
;
int
channel_id
=
rlc_BearerConfig
->
logicalChannelIdentity
;
int
logical_channel_group
;
int
t_status_prohibit
;
...
...
@@ -723,17 +678,8 @@ static void add_drb_am(int rnti, int drb_id, const NR_RLC_BearerConfig_t *rlc_Be
int
t_reassembly
;
int
sn_field_length
;
if
(
!
(
drb_id
>=
1
&&
drb_id
<=
MAX_DRBS_PER_UE
))
{
LOG_E
(
RLC
,
"%s:%d:%s: fatal, bad srb id %d
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
drb_id
);
exit
(
1
);
}
if
(
channel_id
!=
drb_id
+
3
)
{
LOG_E
(
RLC
,
"%s:%d:%s: todo, remove this limitation
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
exit
(
1
);
}
AssertFatal
(
drb_id
>
0
&&
drb_id
<=
MAX_DRBS_PER_UE
,
"Invalid DRB ID %d
\n
"
,
drb_id
);
logical_channel_group
=
*
l
->
ul_SpecificParameters
->
logicalChannelGroup
;
...
...
@@ -766,19 +712,26 @@ static void add_drb_am(int rnti, int drb_id, const NR_RLC_BearerConfig_t *rlc_Be
}
nr_rlc_manager_lock
(
nr_rlc_ue_manager
);
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rnti
);
nr_rlc_ue_t
*
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rnti
);
AssertFatal
(
rlc_BearerConfig
->
servedRadioBearer
&&
(
rlc_BearerConfig
->
servedRadioBearer
->
present
==
NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity
),
"servedRadioBearer for DRB mandatory present when setting up an SRB RLC entity
\n
"
);
int
local_id
=
rlc_BearerConfig
->
logicalChannelIdentity
-
1
;
// LCID 0 for SRB 0 not mapped
ue
->
lcid2rb
[
local_id
].
type
=
NR_RLC_DRB
;
ue
->
lcid2rb
[
local_id
].
choice
.
drb_id
=
rlc_BearerConfig
->
servedRadioBearer
->
choice
.
drb_Identity
;
if
(
ue
->
drb
[
drb_id
-
1
]
!=
NULL
)
{
LOG_
W
(
RLC
,
"%s:%d:%s: DRB %d already exists for UE with RNTI %04x, do nothing
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
drb_id
,
rnti
);
LOG_
E
(
RLC
,
"%s:%d:%s: DRB %d already exists for UE with RNTI %04x, do nothing
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
drb_id
,
rnti
);
}
else
{
nr_rlc_am
=
new_nr_rlc_entity_am
(
RLC_RX_MAXSIZE
,
RLC_TX_MAXSIZE
,
deliver_sdu
,
ue
,
successful_delivery
,
ue
,
max_retx_reached
,
ue
,
t_poll_retransmit
,
t_reassembly
,
t_status_prohibit
,
poll_pdu
,
poll_byte
,
max_retx_threshold
,
sn_field_length
);
nr_rlc_
entity_t
*
nr_rlc_
am
=
new_nr_rlc_entity_am
(
RLC_RX_MAXSIZE
,
RLC_TX_MAXSIZE
,
deliver_sdu
,
ue
,
successful_delivery
,
ue
,
max_retx_reached
,
ue
,
t_poll_retransmit
,
t_reassembly
,
t_status_prohibit
,
poll_pdu
,
poll_byte
,
max_retx_threshold
,
sn_field_length
);
nr_rlc_ue_add_drb_rlc_entity
(
ue
,
drb_id
,
nr_rlc_am
);
LOG_I
(
RLC
,
"%s:%d:%s: added drb %d to UE with RNTI 0x%x
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
drb_id
,
rnti
);
...
...
@@ -788,28 +741,15 @@ static void add_drb_am(int rnti, int drb_id, const NR_RLC_BearerConfig_t *rlc_Be
static
void
add_drb_um
(
int
rnti
,
int
drb_id
,
const
NR_RLC_BearerConfig_t
*
rlc_BearerConfig
)
{
nr_rlc_entity_t
*
nr_rlc_um
;
nr_rlc_ue_t
*
ue
;
struct
NR_RLC_Config
*
r
=
rlc_BearerConfig
->
rlc_Config
;
struct
NR_LogicalChannelConfig
*
l
=
rlc_BearerConfig
->
mac_LogicalChannelConfig
;
int
channel_id
=
rlc_BearerConfig
->
logicalChannelIdentity
;
int
logical_channel_group
;
int
sn_field_length
;
int
t_reassembly
;
if
(
!
(
drb_id
>=
1
&&
drb_id
<=
MAX_DRBS_PER_UE
))
{
LOG_E
(
RLC
,
"%s:%d:%s: fatal, bad srb id %d
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
drb_id
);
exit
(
1
);
}
if
(
channel_id
!=
drb_id
+
3
)
{
LOG_E
(
RLC
,
"%s:%d:%s: todo, remove this limitation
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
exit
(
1
);
}
AssertFatal
(
drb_id
>
0
&&
drb_id
<=
MAX_DRBS_PER_UE
,
"Invalid DRB ID %d
\n
"
,
drb_id
);
logical_channel_group
=
*
l
->
ul_SpecificParameters
->
logicalChannelGroup
;
...
...
@@ -837,15 +777,22 @@ static void add_drb_um(int rnti, int drb_id, const NR_RLC_BearerConfig_t *rlc_Be
}
nr_rlc_manager_lock
(
nr_rlc_ue_manager
);
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rnti
);
nr_rlc_ue_t
*
ue
=
nr_rlc_manager_get_ue
(
nr_rlc_ue_manager
,
rnti
);
AssertFatal
(
rlc_BearerConfig
->
servedRadioBearer
&&
(
rlc_BearerConfig
->
servedRadioBearer
->
present
==
NR_RLC_BearerConfig__servedRadioBearer_PR_drb_Identity
),
"servedRadioBearer for DRB mandatory present when setting up an SRB RLC entity
\n
"
);
int
local_id
=
rlc_BearerConfig
->
logicalChannelIdentity
-
1
;
// LCID 0 for SRB 0 not mapped
ue
->
lcid2rb
[
local_id
].
type
=
NR_RLC_DRB
;
ue
->
lcid2rb
[
local_id
].
choice
.
drb_id
=
rlc_BearerConfig
->
servedRadioBearer
->
choice
.
drb_Identity
;
if
(
ue
->
drb
[
drb_id
-
1
]
!=
NULL
)
{
LOG_
W
(
RLC
,
"DEBUG add_drb_um %s:%d:%s: warning DRB %d already exist for ue %d, do nothing
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
drb_id
,
rnti
);
LOG_
E
(
RLC
,
"DEBUG add_drb_um %s:%d:%s: warning DRB %d already exist for ue %d, do nothing
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
drb_id
,
rnti
);
}
else
{
nr_rlc_um
=
new_nr_rlc_entity_um
(
RLC_RX_MAXSIZE
,
RLC_TX_MAXSIZE
,
deliver_sdu
,
ue
,
t_reassembly
,
sn_field_length
);
nr_rlc_
entity_t
*
nr_rlc_
um
=
new_nr_rlc_entity_um
(
RLC_RX_MAXSIZE
,
RLC_TX_MAXSIZE
,
deliver_sdu
,
ue
,
t_reassembly
,
sn_field_length
);
nr_rlc_ue_add_drb_rlc_entity
(
ue
,
drb_id
,
nr_rlc_um
);
LOG_D
(
RLC
,
"%s:%d:%s: added drb %d to UE with RNTI 0x%x
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
drb_id
,
rnti
);
...
...
openair2/LAYER2/nr_rlc/nr_rlc_ue_manager.h
View file @
a8aa383f
...
...
@@ -27,12 +27,26 @@
typedef
void
nr_rlc_ue_manager_t
;
typedef
enum
nr_rlc_rb_type
{
NR_RLC_SRB
=
0
,
NR_RLC_DRB
=
1
}
nr_rlc_rb_type
;
typedef
struct
nr_rlc_rb_t
{
nr_rlc_rb_type
type
;
union
{
int
srb_id
;
int
drb_id
;
}
choice
;
}
nr_rlc_rb_t
;
typedef
struct
nr_rlc_ue_t
{
int
rnti
;
ue_id_t
ue_id
;
nr_rlc_entity_t
*
srb0
;
nr_rlc_entity_t
*
srb
[
3
];
nr_rlc_entity_t
*
drb
[
MAX_DRBS_PER_UE
];
nr_rlc_rb_t
lcid2rb
[
32
];
}
nr_rlc_ue_t
;
/***********************************************************************/
...
...
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