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
b0caabc3
Commit
b0caabc3
authored
Dec 16, 2021
by
Laurent THOMAS
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'develop' of
https://gitlab.eurecom.fr/oai/openairinterface5g
into tx-thread-update
parents
3e692fa1
de4d3a9b
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
235 additions
and
68 deletions
+235
-68
ci-scripts/cls_containerize.py
ci-scripts/cls_containerize.py
+8
-5
common/utils/telnetsrv/telnetsrv.c
common/utils/telnetsrv/telnetsrv.c
+0
-1
doc/FEATURE_SET.md
doc/FEATURE_SET.md
+4
-2
openair1/PHY/TOOLS/nr_phy_scope.c
openair1/PHY/TOOLS/nr_phy_scope.c
+5
-0
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+9
-4
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+18
-0
openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
+177
-56
openair2/RRC/NR/L2_nr_interface.c
openair2/RRC/NR/L2_nr_interface.c
+14
-0
No files found.
ci-scripts/cls_containerize.py
View file @
b0caabc3
...
@@ -606,6 +606,9 @@ class Containerize():
...
@@ -606,6 +606,9 @@ class Containerize():
HTML
.
CreateHtmlTestRow
(
RAN
.
runtime_stats
,
'KO'
,
logStatus
)
HTML
.
CreateHtmlTestRow
(
RAN
.
runtime_stats
,
'KO'
,
logStatus
)
else
:
else
:
HTML
.
CreateHtmlTestRow
(
RAN
.
runtime_stats
,
'OK'
,
CONST
.
ALL_PROCESSES_OK
)
HTML
.
CreateHtmlTestRow
(
RAN
.
runtime_stats
,
'OK'
,
CONST
.
ALL_PROCESSES_OK
)
# all the xNB run logs shall be on the server 0 for logCollecting
if
self
.
eNB_serverId
[
self
.
eNB_instance
]
!=
'0'
:
mySSH
.
copyout
(
self
.
eNBIPAddress
,
self
.
eNBUserName
,
self
.
eNBPassword
,
'./'
+
self
.
eNB_logFile
[
self
.
eNB_instance
],
self
.
eNBSourceCodePath
+
'/cmake_targets/'
)
logging
.
info
(
'
\u001B
[1m Undeploying OAI Object Pass
\u001B
[0m'
)
logging
.
info
(
'
\u001B
[1m Undeploying OAI Object Pass
\u001B
[0m'
)
def
DeployGenObject
(
self
,
HTML
):
def
DeployGenObject
(
self
,
HTML
):
...
@@ -638,7 +641,7 @@ class Containerize():
...
@@ -638,7 +641,7 @@ class Containerize():
cmd
=
'cd '
+
self
.
yamlPath
[
0
]
+
' && docker-compose -f docker-compose-ci.yml up -d '
+
self
.
services
[
0
]
cmd
=
'cd '
+
self
.
yamlPath
[
0
]
+
' && docker-compose -f docker-compose-ci.yml up -d '
+
self
.
services
[
0
]
logging
.
debug
(
cmd
)
logging
.
debug
(
cmd
)
try
:
try
:
deployStatus
=
subprocess
.
check_output
(
cmd
,
shell
=
True
,
stderr
=
subprocess
.
STDOUT
,
universal_newlines
=
True
,
timeout
=
3
0
)
deployStatus
=
subprocess
.
check_output
(
cmd
,
shell
=
True
,
stderr
=
subprocess
.
STDOUT
,
universal_newlines
=
True
,
timeout
=
10
0
)
except
Exception
as
e
:
except
Exception
as
e
:
self
.
exitStatus
=
1
self
.
exitStatus
=
1
logging
.
error
(
'Could not deploy'
)
logging
.
error
(
'Could not deploy'
)
...
@@ -651,7 +654,7 @@ class Containerize():
...
@@ -651,7 +654,7 @@ class Containerize():
healthy
=
0
healthy
=
0
while
(
count
<
10
):
while
(
count
<
10
):
count
+=
1
count
+=
1
deployStatus
=
subprocess
.
check_output
(
cmd
,
shell
=
True
,
stderr
=
subprocess
.
STDOUT
,
universal_newlines
=
True
,
timeout
=
1
0
)
deployStatus
=
subprocess
.
check_output
(
cmd
,
shell
=
True
,
stderr
=
subprocess
.
STDOUT
,
universal_newlines
=
True
,
timeout
=
3
0
)
healthy
=
0
healthy
=
0
for
state
in
deployStatus
.
split
(
'
\n
'
):
for
state
in
deployStatus
.
split
(
'
\n
'
):
res
=
re
.
search
(
'Up \(healthy\)'
,
state
)
res
=
re
.
search
(
'Up \(healthy\)'
,
state
)
...
@@ -683,7 +686,7 @@ class Containerize():
...
@@ -683,7 +686,7 @@ class Containerize():
# if the containers are running, recover the logs!
# if the containers are running, recover the logs!
cmd
=
'cd '
+
self
.
yamlPath
[
0
]
+
' && docker-compose -f docker-compose-ci.yml ps --all'
cmd
=
'cd '
+
self
.
yamlPath
[
0
]
+
' && docker-compose -f docker-compose-ci.yml ps --all'
logging
.
debug
(
cmd
)
logging
.
debug
(
cmd
)
deployStatus
=
subprocess
.
check_output
(
cmd
,
shell
=
True
,
stderr
=
subprocess
.
STDOUT
,
universal_newlines
=
True
,
timeout
=
1
0
)
deployStatus
=
subprocess
.
check_output
(
cmd
,
shell
=
True
,
stderr
=
subprocess
.
STDOUT
,
universal_newlines
=
True
,
timeout
=
3
0
)
anyLogs
=
False
anyLogs
=
False
for
state
in
deployStatus
.
split
(
'
\n
'
):
for
state
in
deployStatus
.
split
(
'
\n
'
):
res
=
re
.
search
(
'Name|----------'
,
state
)
res
=
re
.
search
(
'Name|----------'
,
state
)
...
@@ -697,7 +700,7 @@ class Containerize():
...
@@ -697,7 +700,7 @@ class Containerize():
cName
=
res
.
group
(
'container_name'
)
cName
=
res
.
group
(
'container_name'
)
cmd
=
'cd '
+
self
.
yamlPath
[
0
]
+
' && docker logs '
+
cName
+
' > '
+
cName
+
'.log 2>&1'
cmd
=
'cd '
+
self
.
yamlPath
[
0
]
+
' && docker logs '
+
cName
+
' > '
+
cName
+
'.log 2>&1'
logging
.
debug
(
cmd
)
logging
.
debug
(
cmd
)
deployStatus
=
subprocess
.
check_output
(
cmd
,
shell
=
True
,
stderr
=
subprocess
.
STDOUT
,
universal_newlines
=
True
,
timeout
=
1
0
)
deployStatus
=
subprocess
.
check_output
(
cmd
,
shell
=
True
,
stderr
=
subprocess
.
STDOUT
,
universal_newlines
=
True
,
timeout
=
3
0
)
if
anyLogs
:
if
anyLogs
:
cmd
=
'mkdir -p ../cmake_targets/log && mv '
+
self
.
yamlPath
[
0
]
+
'/*.log ../cmake_targets/log'
cmd
=
'mkdir -p ../cmake_targets/log && mv '
+
self
.
yamlPath
[
0
]
+
'/*.log ../cmake_targets/log'
logging
.
debug
(
cmd
)
logging
.
debug
(
cmd
)
...
@@ -805,7 +808,7 @@ class Containerize():
...
@@ -805,7 +808,7 @@ class Containerize():
time
.
sleep
(
5
)
time
.
sleep
(
5
)
cmd
=
'docker cp '
+
self
.
svrContName
+
':/tmp/iperf_server.log ../cmake_targets/log/iperf_server_'
+
HTML
.
testCase_id
+
'.log'
cmd
=
'docker cp '
+
self
.
svrContName
+
':/tmp/iperf_server.log ../cmake_targets/log/iperf_server_'
+
HTML
.
testCase_id
+
'.log'
logging
.
debug
(
cmd
)
logging
.
debug
(
cmd
)
serverStatus
=
subprocess
.
check_output
(
cmd
,
shell
=
True
,
stderr
=
subprocess
.
STDOUT
,
universal_newlines
=
True
,
timeout
=
1
0
)
serverStatus
=
subprocess
.
check_output
(
cmd
,
shell
=
True
,
stderr
=
subprocess
.
STDOUT
,
universal_newlines
=
True
,
timeout
=
3
0
)
# Analyze client output
# Analyze client output
result
=
re
.
search
(
'Server Report:'
,
clientStatus
)
result
=
re
.
search
(
'Server Report:'
,
clientStatus
)
...
...
common/utils/telnetsrv/telnetsrv.c
View file @
b0caabc3
...
@@ -51,7 +51,6 @@
...
@@ -51,7 +51,6 @@
#include <dlfcn.h>
#include <dlfcn.h>
#include <sys/time.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/resource.h>
#include <form.h>
#include "common/utils/load_module_shlib.h"
#include "common/utils/load_module_shlib.h"
#include "common/config/config_userapi.h"
#include "common/config/config_userapi.h"
#include "common/utils/threadPool/thread-pool.h"
#include "common/utils/threadPool/thread-pool.h"
...
...
doc/FEATURE_SET.md
View file @
b0caabc3
...
@@ -307,8 +307,10 @@ The following features are valid for the gNB and the 5G-NR UE.
...
@@ -307,8 +307,10 @@ The following features are valid for the gNB and the 5G-NR UE.
-
MAC
<->
PHY data interface using FAPI P7 interface for BCH PDU, DCI PDU, PDSCH PDU
-
MAC
<->
PHY data interface using FAPI P7 interface for BCH PDU, DCI PDU, PDSCH PDU
-
Scheduler procedures for SIB1
-
Scheduler procedures for SIB1
-
Scheduler procedures for RA
-
Scheduler procedures for RA
-
Contention free RA procedure
-
Contention Free RA procedure
-
Contention based RA procedure
-
Contention Based RA procedure
-
Msg3 can transfer uplink CCCH, DTCH or DCCH messages
-
CBRA can be performed using MAC CE or C-RNTI
-
Scheduler procedures for CSI-RS
-
Scheduler procedures for CSI-RS
-
MAC downlink scheduler
-
MAC downlink scheduler
-
phy-test scheduler (fixed allocation and usable also without UE)
-
phy-test scheduler (fixed allocation and usable also without UE)
...
...
openair1/PHY/TOOLS/nr_phy_scope.c
View file @
b0caabc3
...
@@ -448,6 +448,7 @@ static OAI_phy_scope_t *create_phy_scope_gnb(void) {
...
@@ -448,6 +448,7 @@ static OAI_phy_scope_t *create_phy_scope_gnb(void) {
OAI_phy_scope_t
*
fdui
=
calloc
((
sizeof
*
fdui
),
1
);
OAI_phy_scope_t
*
fdui
=
calloc
((
sizeof
*
fdui
),
1
);
// Define form
// Define form
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
800
);
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
800
);
fl_set_form_dblbuffer
(
fdui
->
phy_scope
,
1
);
// This the whole UI box
// This the whole UI box
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
800
,
""
);
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
800
,
""
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_WHITE
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_WHITE
);
...
@@ -529,7 +530,10 @@ static void *scope_thread_gNB(void *arg) {
...
@@ -529,7 +530,10 @@ static void *scope_thread_gNB(void *arg) {
OAI_phy_scope_t
*
form_gnb
=
create_phy_scope_gnb
();
OAI_phy_scope_t
*
form_gnb
=
create_phy_scope_gnb
();
while
(
!
oai_exit
)
{
while
(
!
oai_exit
)
{
fl_freeze_form
(
form_gnb
->
phy_scope
);
phy_scope_gNB
(
form_gnb
,
p
,
nb_ue
);
phy_scope_gNB
(
form_gnb
,
p
,
nb_ue
);
fl_unfreeze_form
(
form_gnb
->
phy_scope
);
fl_redraw_form
(
form_gnb
->
phy_scope
);
usleep
(
99
*
1000
);
usleep
(
99
*
1000
);
}
}
...
@@ -800,6 +804,7 @@ static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) {
...
@@ -800,6 +804,7 @@ static OAI_phy_scope_t *create_phy_scope_nrue( int ID ) {
OAI_phy_scope_t
*
fdui
=
calloc
((
sizeof
*
fdui
),
1
);
OAI_phy_scope_t
*
fdui
=
calloc
((
sizeof
*
fdui
),
1
);
// Define form
// Define form
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
900
);
fdui
->
phy_scope
=
fl_bgn_form
(
FL_NO_BOX
,
800
,
900
);
fl_set_form_dblbuffer
(
fdui
->
phy_scope
,
1
);
// This the whole UI box
// This the whole UI box
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
900
,
""
);
obj
=
fl_add_box
(
FL_BORDER_BOX
,
0
,
0
,
800
,
900
,
""
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_BLACK
);
fl_set_object_color
(
obj
,
FL_BLACK
,
FL_BLACK
);
...
...
openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
View file @
b0caabc3
...
@@ -195,5 +195,10 @@ void nr_mac_gNB_rrc_ul_failure(const module_id_t Mod_instP,
...
@@ -195,5 +195,10 @@ void nr_mac_gNB_rrc_ul_failure(const module_id_t Mod_instP,
const
int
CC_idP
,
const
int
CC_idP
,
const
frame_t
frameP
,
const
frame_t
frameP
,
const
sub_frame_t
subframeP
,
const
sub_frame_t
subframeP
,
const
rnti_t
rntiP
)
;
const
rnti_t
rntiP
);
void
nr_mac_gNB_rrc_ul_failure_reset
(
const
module_id_t
Mod_instP
,
const
frame_t
frameP
,
const
sub_frame_t
subframeP
,
const
rnti_t
rntiP
);
#endif
#endif
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
View file @
b0caabc3
...
@@ -822,6 +822,24 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
...
@@ -822,6 +822,24 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
ra
->
state
=
Msg4
;
ra
->
state
=
Msg4
;
ra
->
Msg4_frame
=
(
frameP
+
2
)
%
1024
;
ra
->
Msg4_frame
=
(
frameP
+
2
)
%
1024
;
ra
->
Msg4_slot
=
1
;
ra
->
Msg4_slot
=
1
;
if
(
ra
->
msg3_dcch_dtch
)
{
// Check if the UE identified by C-RNTI still exists at the gNB
int
UE_id_C
=
find_nr_UE_id
(
gnb_mod_idP
,
ra
->
crnti
);
if
(
UE_id_C
<
0
)
{
// The UE identified by C-RNTI no longer exists at the gNB
// Let's abort the current RA, so the UE will trigger a new RA later but using RRCSetupRequest instead. A better solution may be implemented
mac_remove_nr_ue
(
gnb_mod_idP
,
ra
->
rnti
);
nr_clear_ra_proc
(
gnb_mod_idP
,
CC_idP
,
frameP
,
ra
);
return
;
}
else
{
// The UE identified by C-RNTI still exists at the gNB
// Reset uplink failure flags/counters/timers at MAC and at RRC so gNB will resume again scheduling resources for this UE
UE_info
->
UE_sched_ctrl
[
UE_id_C
].
pusch_consecutive_dtx_cnt
=
0
;
UE_info
->
UE_sched_ctrl
[
UE_id_C
].
ul_failure
=
0
;
nr_mac_gNB_rrc_ul_failure_reset
(
gnb_mod_idP
,
frameP
,
slotP
,
ra
->
crnti
);
}
}
LOG_I
(
NR_MAC
,
"Scheduling RA-Msg4 for TC_RNTI 0x%04x (state %d, frame %d, slot %d)
\n
"
,
LOG_I
(
NR_MAC
,
"Scheduling RA-Msg4 for TC_RNTI 0x%04x (state %d, frame %d, slot %d)
\n
"
,
(
ra
->
msg3_dcch_dtch
?
ra
->
crnti
:
ra
->
rnti
),
ra
->
state
,
ra
->
Msg4_frame
,
ra
->
Msg4_slot
);
(
ra
->
msg3_dcch_dtch
?
ra
->
crnti
:
ra
->
rnti
),
ra
->
state
,
ra
->
Msg4_frame
,
ra
->
Msg4_slot
);
}
}
...
...
openair2/LAYER2/nr_pdcp/nr_pdcp_oai_api.c
View file @
b0caabc3
...
@@ -215,6 +215,182 @@ void du_rlc_data_req(const protocol_ctxt_t *const ctxt_pP,
...
@@ -215,6 +215,182 @@ void du_rlc_data_req(const protocol_ctxt_t *const ctxt_pP,
/* rlc_data_req queue - end */
/* rlc_data_req queue - end */
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/* pdcp_data_ind thread - begin */
/****************************************************************************/
typedef
struct
{
protocol_ctxt_t
ctxt_pP
;
srb_flag_t
srb_flagP
;
MBMS_flag_t
MBMS_flagP
;
rb_id_t
rb_id
;
sdu_size_t
sdu_buffer_size
;
mem_block_t
*
sdu_buffer
;
}
pdcp_data_ind_queue_item
;
#define PDCP_DATA_IND_QUEUE_SIZE 10000
typedef
struct
{
pdcp_data_ind_queue_item
q
[
PDCP_DATA_IND_QUEUE_SIZE
];
volatile
int
start
;
volatile
int
length
;
pthread_mutex_t
m
;
pthread_cond_t
c
;
}
pdcp_data_ind_queue
;
static
pdcp_data_ind_queue
pq
;
static
void
do_pdcp_data_ind
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
srb_flag_t
srb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
rb_id_t
rb_id
,
const
sdu_size_t
sdu_buffer_size
,
mem_block_t
*
const
sdu_buffer
)
{
nr_pdcp_ue_t
*
ue
;
nr_pdcp_entity_t
*
rb
;
int
rnti
=
ctxt_pP
->
rnti
;
if
(
ctxt_pP
->
module_id
!=
0
||
//ctxt_pP->enb_flag != 1 ||
ctxt_pP
->
instance
!=
0
||
ctxt_pP
->
eNB_index
!=
0
||
ctxt_pP
->
configured
!=
1
||
ctxt_pP
->
brOption
!=
0
)
{
LOG_E
(
PDCP
,
"%s:%d:%s: fatal
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
exit
(
1
);
}
if
(
ctxt_pP
->
enb_flag
)
T
(
T_ENB_PDCP_UL
,
T_INT
(
ctxt_pP
->
module_id
),
T_INT
(
rnti
),
T_INT
(
rb_id
),
T_INT
(
sdu_buffer_size
));
nr_pdcp_manager_lock
(
nr_pdcp_ue_manager
);
ue
=
nr_pdcp_manager_get_ue
(
nr_pdcp_ue_manager
,
rnti
);
if
(
srb_flagP
==
1
)
{
if
(
rb_id
<
1
||
rb_id
>
2
)
rb
=
NULL
;
else
rb
=
ue
->
srb
[
rb_id
-
1
];
}
else
{
if
(
rb_id
<
1
||
rb_id
>
5
)
rb
=
NULL
;
else
rb
=
ue
->
drb
[
rb_id
-
1
];
}
if
(
rb
!=
NULL
)
{
rb
->
recv_pdu
(
rb
,
(
char
*
)
sdu_buffer
->
data
,
sdu_buffer_size
);
}
else
{
LOG_E
(
PDCP
,
"%s:%d:%s: fatal: no RB found (rb_id %ld, srb_flag %d)
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
rb_id
,
srb_flagP
);
exit
(
1
);
}
nr_pdcp_manager_unlock
(
nr_pdcp_ue_manager
);
free_mem_block
(
sdu_buffer
,
__FUNCTION__
);
}
static
void
*
pdcp_data_ind_thread
(
void
*
_
)
{
int
i
;
pthread_setname_np
(
pthread_self
(),
"PDCP data ind"
);
while
(
1
)
{
if
(
pthread_mutex_lock
(
&
pq
.
m
)
!=
0
)
abort
();
while
(
pq
.
length
==
0
)
if
(
pthread_cond_wait
(
&
pq
.
c
,
&
pq
.
m
)
!=
0
)
abort
();
i
=
pq
.
start
;
if
(
pthread_mutex_unlock
(
&
pq
.
m
)
!=
0
)
abort
();
do_pdcp_data_ind
(
&
pq
.
q
[
i
].
ctxt_pP
,
pq
.
q
[
i
].
srb_flagP
,
pq
.
q
[
i
].
MBMS_flagP
,
pq
.
q
[
i
].
rb_id
,
pq
.
q
[
i
].
sdu_buffer_size
,
pq
.
q
[
i
].
sdu_buffer
);
if
(
pthread_mutex_lock
(
&
pq
.
m
)
!=
0
)
abort
();
pq
.
length
--
;
pq
.
start
=
(
pq
.
start
+
1
)
%
PDCP_DATA_IND_QUEUE_SIZE
;
if
(
pthread_cond_signal
(
&
pq
.
c
)
!=
0
)
abort
();
if
(
pthread_mutex_unlock
(
&
pq
.
m
)
!=
0
)
abort
();
}
}
static
void
init_nr_pdcp_data_ind_queue
(
void
)
{
pthread_t
t
;
pthread_mutex_init
(
&
pq
.
m
,
NULL
);
pthread_cond_init
(
&
pq
.
c
,
NULL
);
if
(
pthread_create
(
&
t
,
NULL
,
pdcp_data_ind_thread
,
NULL
)
!=
0
)
{
LOG_E
(
PDCP
,
"%s:%d:%s: fatal
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
exit
(
1
);
}
}
static
void
enqueue_pdcp_data_ind
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
srb_flag_t
srb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
rb_id_t
rb_id
,
const
sdu_size_t
sdu_buffer_size
,
mem_block_t
*
const
sdu_buffer
)
{
int
i
;
int
logged
=
0
;
if
(
pthread_mutex_lock
(
&
pq
.
m
)
!=
0
)
abort
();
while
(
pq
.
length
==
PDCP_DATA_IND_QUEUE_SIZE
)
{
if
(
!
logged
)
{
logged
=
1
;
LOG_W
(
PDCP
,
"%s: pdcp_data_ind queue is full
\n
"
,
__FUNCTION__
);
}
if
(
pthread_cond_wait
(
&
pq
.
c
,
&
pq
.
m
)
!=
0
)
abort
();
}
i
=
(
pq
.
start
+
pq
.
length
)
%
PDCP_DATA_IND_QUEUE_SIZE
;
pq
.
length
++
;
pq
.
q
[
i
].
ctxt_pP
=
*
ctxt_pP
;
pq
.
q
[
i
].
srb_flagP
=
srb_flagP
;
pq
.
q
[
i
].
MBMS_flagP
=
MBMS_flagP
;
pq
.
q
[
i
].
rb_id
=
rb_id
;
pq
.
q
[
i
].
sdu_buffer_size
=
sdu_buffer_size
;
pq
.
q
[
i
].
sdu_buffer
=
sdu_buffer
;
if
(
pthread_cond_signal
(
&
pq
.
c
)
!=
0
)
abort
();
if
(
pthread_mutex_unlock
(
&
pq
.
m
)
!=
0
)
abort
();
}
boolean_t
pdcp_data_ind
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
srb_flag_t
srb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
rb_id_t
rb_id
,
const
sdu_size_t
sdu_buffer_size
,
mem_block_t
*
const
sdu_buffer
)
{
enqueue_pdcp_data_ind
(
ctxt_pP
,
srb_flagP
,
MBMS_flagP
,
rb_id
,
sdu_buffer_size
,
sdu_buffer
);
return
true
;
}
/****************************************************************************/
/* pdcp_data_ind thread - end */
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/* hacks to be cleaned up at some point - begin */
/* hacks to be cleaned up at some point - begin */
/****************************************************************************/
/****************************************************************************/
...
@@ -375,6 +551,7 @@ void pdcp_layer_init(void)
...
@@ -375,6 +551,7 @@ void pdcp_layer_init(void)
init_nr_rlc_data_req_queue
();
init_nr_rlc_data_req_queue
();
}
}
init_nr_pdcp_data_ind_queue
();
nr_pdcp_init_timer_thread
(
nr_pdcp_ue_manager
);
nr_pdcp_init_timer_thread
(
nr_pdcp_ue_manager
);
}
}
...
@@ -639,62 +816,6 @@ srb_found:
...
@@ -639,62 +816,6 @@ srb_found:
}
}
}
}
boolean_t
pdcp_data_ind
(
const
protocol_ctxt_t
*
const
ctxt_pP
,
const
srb_flag_t
srb_flagP
,
const
MBMS_flag_t
MBMS_flagP
,
const
rb_id_t
rb_id
,
const
sdu_size_t
sdu_buffer_size
,
mem_block_t
*
const
sdu_buffer
)
{
nr_pdcp_ue_t
*
ue
;
nr_pdcp_entity_t
*
rb
;
int
rnti
=
ctxt_pP
->
rnti
;
if
(
ctxt_pP
->
module_id
!=
0
||
//ctxt_pP->enb_flag != 1 ||
ctxt_pP
->
instance
!=
0
||
ctxt_pP
->
eNB_index
!=
0
||
ctxt_pP
->
configured
!=
1
||
ctxt_pP
->
brOption
!=
0
)
{
LOG_E
(
PDCP
,
"%s:%d:%s: fatal
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
);
exit
(
1
);
}
if
(
ctxt_pP
->
enb_flag
)
T
(
T_ENB_PDCP_UL
,
T_INT
(
ctxt_pP
->
module_id
),
T_INT
(
rnti
),
T_INT
(
rb_id
),
T_INT
(
sdu_buffer_size
));
nr_pdcp_manager_lock
(
nr_pdcp_ue_manager
);
ue
=
nr_pdcp_manager_get_ue
(
nr_pdcp_ue_manager
,
rnti
);
if
(
srb_flagP
==
1
)
{
if
(
rb_id
<
1
||
rb_id
>
2
)
rb
=
NULL
;
else
rb
=
ue
->
srb
[
rb_id
-
1
];
}
else
{
if
(
rb_id
<
1
||
rb_id
>
5
)
rb
=
NULL
;
else
rb
=
ue
->
drb
[
rb_id
-
1
];
}
if
(
rb
!=
NULL
)
{
rb
->
recv_pdu
(
rb
,
(
char
*
)
sdu_buffer
->
data
,
sdu_buffer_size
);
}
else
{
LOG_E
(
PDCP
,
"%s:%d:%s: fatal: no RB found (rb_id %ld, srb_flag %d)
\n
"
,
__FILE__
,
__LINE__
,
__FUNCTION__
,
rb_id
,
srb_flagP
);
exit
(
1
);
}
nr_pdcp_manager_unlock
(
nr_pdcp_ue_manager
);
free_mem_block
(
sdu_buffer
,
__FUNCTION__
);
return
1
;
}
void
pdcp_run
(
const
protocol_ctxt_t
*
const
ctxt_pP
)
void
pdcp_run
(
const
protocol_ctxt_t
*
const
ctxt_pP
)
{
{
MessageDef
*
msg_p
;
MessageDef
*
msg_p
;
...
...
openair2/RRC/NR/L2_nr_interface.c
View file @
b0caabc3
...
@@ -383,3 +383,17 @@ void nr_mac_gNB_rrc_ul_failure(const module_id_t Mod_instP,
...
@@ -383,3 +383,17 @@ void nr_mac_gNB_rrc_ul_failure(const module_id_t Mod_instP,
LOG_D
(
RRC
,
"Frame %d, Subframe %d: UL failure: UE %x unknown
\n
"
,
frameP
,
subframeP
,
rntiP
);
LOG_D
(
RRC
,
"Frame %d, Subframe %d: UL failure: UE %x unknown
\n
"
,
frameP
,
subframeP
,
rntiP
);
}
}
}
}
void
nr_mac_gNB_rrc_ul_failure_reset
(
const
module_id_t
Mod_instP
,
const
frame_t
frameP
,
const
sub_frame_t
subframeP
,
const
rnti_t
rntiP
)
{
struct
rrc_gNB_ue_context_s
*
ue_context_p
=
NULL
;
ue_context_p
=
rrc_gNB_get_ue_context
(
RC
.
nrrrc
[
Mod_instP
],
rntiP
);
if
(
ue_context_p
!=
NULL
)
{
LOG_W
(
RRC
,
"Frame %d, Subframe %d: UE %x UL failure reset, deactivating timer
\n
"
,
frameP
,
subframeP
,
rntiP
);
ue_context_p
->
ue_context
.
ul_failure_timer
=
0
;
}
else
{
LOG_W
(
RRC
,
"Frame %d, Subframe %d: UL failure reset: UE %x unknown
\n
"
,
frameP
,
subframeP
,
rntiP
);
}
}
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