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
c3e7cb7e
Commit
c3e7cb7e
authored
Feb 09, 2024
by
Jaroslava Fiedlerova
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/update-rc-sm' into integration_2024_w06
parents
638acd60
1675e6e1
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
419 additions
and
55 deletions
+419
-55
openair2/E2AP/RAN_FUNCTION/CMakeLists.txt
openair2/E2AP/RAN_FUNCTION/CMakeLists.txt
+4
-1
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.c
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.c
+180
-44
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.h
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.h
+3
-4
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h
+30
-0
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_subs.c
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_subs.c
+114
-0
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_subs.h
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_subs.h
+56
-0
openair2/E2AP/README.md
openair2/E2AP/README.md
+19
-5
openair2/E2AP/flexric
openair2/E2AP/flexric
+1
-1
openair2/RRC/NR/rrc_gNB.c
openair2/RRC/NR/rrc_gNB.c
+12
-0
No files found.
openair2/E2AP/RAN_FUNCTION/CMakeLists.txt
View file @
c3e7cb7e
...
...
@@ -9,6 +9,7 @@ add_library(e2_ran_func_cuup STATIC
O-RAN/ran_func_kpm.c
# this file should only contain PDCP-U/GTP; to be done in the future
../flexric/test/rnd/fill_rnd_data_kpm.c
# this dependancy will be taken out once RAN Function Definition is implemented
O-RAN/ran_func_rc.c
# this file should only contain PDCP-U/GTP; to be done in the future
O-RAN/ran_func_rc_subs.c
../flexric/test/rnd/fill_rnd_data_rc.c
# this dependancy will be taken out once RAN Function Definition is implemented
)
...
...
@@ -27,7 +28,9 @@ add_library(e2_ran_func_du_cucp_cuup STATIC
../flexric/test/rnd/fill_rnd_data_kpm.c
# this dependancy will be taken out once RAN Function Definition is implemented
O-RAN/ran_func_rc.c
# this file should only contain RRC/PDCP-C; to be done in the future
# when nr-softmodem is divided in separate executables
O-RAN/ran_func_rc_subs.c
../flexric/test/rnd/fill_rnd_data_rc.c
# this dependancy will be taken out once RAN Function Definition is implemented
../flexric/src/sm/rc_sm/ie/rc_data_ie.c
CUSTOMIZED/ran_func_mac.c
CUSTOMIZED/ran_func_rlc.c
CUSTOMIZED/ran_func_slice.c
...
...
@@ -36,5 +39,5 @@ add_library(e2_ran_func_du_cucp_cuup STATIC
../flexric/test/rnd/fill_rnd_data_slice.c
)
target_link_libraries
(
e2_ran_func_du_cucp_cuup PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs e2_time_obj kpm_ric_info_common_obj 3gpp_derived_ie_obj
)
target_link_libraries
(
e2_ran_func_du_cucp_cuup PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs e2_time_obj kpm_ric_info_common_obj 3gpp_derived_ie_obj
e2sm_rc_ir_obj sm_common_ie_obj
)
target_compile_definitions
(
e2_ran_func_du_cucp_cuup PUBLIC
${
E2AP_VERSION
}
${
KPM_VERSION
}
NGRAN_GNB_DU NGRAN_GNB_CUCP NGRAN_GNB_CUUP
)
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.c
View file @
c3e7cb7e
...
...
@@ -20,25 +20,24 @@
*/
#include "ran_func_rc.h"
#include "ran_func_rc_subs.h"
#include "ran_func_rc_extern.h"
#include "../../flexric/test/rnd/fill_rnd_data_rc.h" // this dependancy will be taken out once RAN Function Definition is implemented
#include "../../flexric/src/sm/rc_sm/ie/ir/lst_ran_param.h"
#include "../../flexric/src/sm/rc_sm/ie/ir/ran_param_list.h"
#include "../../flexric/src/agent/e2_agent_api.h"
#include <assert.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include "common/ran_context.h"
// Please note: current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP
static
pthread_once_t
once_rc_mutex
=
PTHREAD_ONCE_INIT
;
static
rc_subs_data_t
rc_subs_data
=
{
0
};
static
pthread_mutex_t
rc_mutex
=
PTHREAD_MUTEX_INITIALIZER
;
bool
read_rc_sm
(
void
*
data
)
static
void
init_once_rc
(
void
)
{
assert
(
data
!=
NULL
);
// assert(data->type == RAN_CTRL_STATS_V1_03);
assert
(
0
!=
0
&&
"Not implemented"
);
return
true
;
init_rc_subs_data
(
&
rc_subs_data
);
}
void
read_rc_setup_sm
(
void
*
data
)
...
...
@@ -47,8 +46,175 @@ void read_rc_setup_sm(void* data)
// assert(data->type == RAN_CTRL_V1_3_AGENT_IF_E2_SETUP_ANS_V0);
rc_e2_setup_t
*
rc
=
(
rc_e2_setup_t
*
)
data
;
rc
->
ran_func_def
=
fill_rc_ran_func_def
();
// E2 Setup Request is sent periodically until the connection is established
// RC subscritpion data should be initialized only once
const
int
ret
=
pthread_once
(
&
once_rc_mutex
,
init_once_rc
);
DevAssert
(
ret
==
0
);
}
RB_PROTOTYPE
(
ric_id_2_param_id_trees
,
ric_req_id_s
,
entries
,
cmp_ric_req_id
);
static
ue_id_e2sm_t
fill_ue_id_data
(
const
gNB_RRC_UE_t
*
rrc_ue_context
)
{
ue_id_e2sm_t
ue_id
=
{
0
};
// Check the E2 node type
#if defined (NGRAN_GNB_CUUP) && defined (NGRAN_GNB_CUCP)
ue_id
.
type
=
GNB_UE_ID_E2SM
;
if
(
RC
.
nrrrc
[
0
]
->
node_type
==
ngran_gNB_CU
)
{
// gNB-CU UE F1AP ID List
// C-ifCUDUseparated
ue_id
.
gnb
.
gnb_cu_ue_f1ap_lst_len
=
1
;
ue_id
.
gnb
.
gnb_cu_ue_f1ap_lst
=
calloc
(
ue_id
.
gnb
.
gnb_cu_ue_f1ap_lst_len
,
sizeof
(
uint32_t
));
assert
(
ue_id
.
gnb
.
gnb_cu_ue_f1ap_lst
!=
NULL
&&
"Memory exhausted"
);
for
(
size_t
i
=
0
;
i
<
ue_id
.
gnb
.
gnb_cu_ue_f1ap_lst_len
;
i
++
)
{
ue_id
.
gnb
.
gnb_cu_ue_f1ap_lst
[
i
]
=
rrc_ue_context
->
rrc_ue_id
;
}
}
else
if
(
RC
.
nrrrc
[
0
]
->
node_type
==
ngran_gNB_CUCP
)
{
//gNB-CU-CP UE E1AP ID List
//C-ifCPUPseparated
ue_id
.
gnb
.
gnb_cu_cp_ue_e1ap_lst_len
=
1
;
ue_id
.
gnb
.
gnb_cu_cp_ue_e1ap_lst
=
calloc
(
ue_id
.
gnb
.
gnb_cu_cp_ue_e1ap_lst_len
,
sizeof
(
uint32_t
));
assert
(
ue_id
.
gnb
.
gnb_cu_cp_ue_e1ap_lst
!=
NULL
&&
"Memory exhausted"
);
for
(
size_t
i
=
0
;
i
<
ue_id
.
gnb
.
gnb_cu_cp_ue_e1ap_lst_len
;
i
++
)
{
ue_id
.
gnb
.
gnb_cu_cp_ue_e1ap_lst
[
i
]
=
rrc_ue_context
->
rrc_ue_id
;
}
}
else
if
(
RC
.
nrrrc
[
0
]
->
node_type
==
ngran_gNB_DU
)
{
assert
(
false
&&
"RRC state change cannot be triggered from DU
\n
"
);
}
#elif defined (NGRAN_GNB_CUUP)
assert
(
false
&&
"RRC state change cannot be triggered from CU-UP
\n
"
);
#endif
ue_id
.
gnb
.
amf_ue_ngap_id
=
rrc_ue_context
->
rrc_ue_id
;
ue_id
.
gnb
.
guami
.
amf_ptr
=
rrc_ue_context
->
ue_guami
.
amf_pointer
;
ue_id
.
gnb
.
guami
.
amf_region_id
=
rrc_ue_context
->
ue_guami
.
amf_region_id
;
ue_id
.
gnb
.
guami
.
amf_set_id
=
rrc_ue_context
->
ue_guami
.
amf_set_id
;
ue_id
.
gnb
.
guami
.
plmn_id
.
mcc
=
rrc_ue_context
->
ue_guami
.
mcc
;
ue_id
.
gnb
.
guami
.
plmn_id
.
mnc
=
rrc_ue_context
->
ue_guami
.
mnc
;
ue_id
.
gnb
.
guami
.
plmn_id
.
mnc_digit_len
=
rrc_ue_context
->
ue_guami
.
mnc_len
;
return
ue_id
;
}
static
seq_ran_param_t
fill_rrc_state_change_seq_ran
(
const
rc_sm_rrc_state_e
rrc_state
)
{
seq_ran_param_t
seq_ran_param
=
{
0
};
seq_ran_param
.
ran_param_id
=
RRC_STATE_CHANGED_TO_E2SM_RC_RAN_PARAM_ID
;
seq_ran_param
.
ran_param_val
.
type
=
ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE
;
seq_ran_param
.
ran_param_val
.
flag_false
=
calloc
(
1
,
sizeof
(
ran_parameter_value_t
));
assert
(
seq_ran_param
.
ran_param_val
.
flag_false
!=
NULL
&&
"Memory exhausted"
);
seq_ran_param
.
ran_param_val
.
flag_false
->
type
=
INTEGER_RAN_PARAMETER_VALUE
;
seq_ran_param
.
ran_param_val
.
flag_false
->
int_ran
=
rrc_state
;
return
seq_ran_param
;
}
static
rc_ind_data_t
*
fill_ue_rrc_state_change
(
const
gNB_RRC_UE_t
*
rrc_ue_context
,
const
rc_sm_rrc_state_e
rrc_state
)
{
rc_ind_data_t
*
rc_ind
=
calloc
(
1
,
sizeof
(
rc_ind_data_t
));
assert
(
rc_ind
!=
NULL
&&
"Memory exhausted"
);
// Generate Indication Header
rc_ind
->
hdr
.
format
=
FORMAT_1_E2SM_RC_IND_HDR
;
rc_ind
->
hdr
.
frmt_1
.
ev_trigger_id
=
NULL
;
// Generate Indication Message
rc_ind
->
msg
.
format
=
FORMAT_2_E2SM_RC_IND_MSG
;
//Sequence of UE Identifier
//[1-65535]
rc_ind
->
msg
.
frmt_2
.
sz_seq_ue_id
=
1
;
rc_ind
->
msg
.
frmt_2
.
seq_ue_id
=
calloc
(
rc_ind
->
msg
.
frmt_2
.
sz_seq_ue_id
,
sizeof
(
seq_ue_id_t
));
assert
(
rc_ind
->
msg
.
frmt_2
.
seq_ue_id
!=
NULL
&&
"Memory exhausted"
);
// UE ID
// Mandatory
// 9.3.10
rc_ind
->
msg
.
frmt_2
.
seq_ue_id
[
0
].
ue_id
=
fill_ue_id_data
(
rrc_ue_context
);
// Sequence of
// RAN Parameter
// [1- 65535]
rc_ind
->
msg
.
frmt_2
.
seq_ue_id
[
0
].
sz_seq_ran_param
=
1
;
rc_ind
->
msg
.
frmt_2
.
seq_ue_id
[
0
].
seq_ran_param
=
calloc
(
rc_ind
->
msg
.
frmt_2
.
seq_ue_id
[
0
].
sz_seq_ran_param
,
sizeof
(
seq_ran_param_t
));
assert
(
rc_ind
->
msg
.
frmt_2
.
seq_ue_id
[
0
].
seq_ran_param
!=
NULL
&&
"Memory exhausted"
);
rc_ind
->
msg
.
frmt_2
.
seq_ue_id
[
0
].
seq_ran_param
[
0
]
=
fill_rrc_state_change_seq_ran
(
rrc_state
);
return
rc_ind
;
}
void
signal_rrc_state_changed_to
(
const
gNB_RRC_UE_t
*
rrc_ue_context
,
const
rc_sm_rrc_state_e
rrc_state
)
{
pthread_mutex_lock
(
&
rc_mutex
);
if
(
rc_subs_data
.
rb
[
RRC_STATE_CHANGED_TO_E2SM_RC_RAN_PARAM_ID
].
rbh_root
==
NULL
)
{
pthread_mutex_unlock
(
&
rc_mutex
);
return
;
}
struct
ric_req_id_s
*
node
;
RB_FOREACH
(
node
,
ric_id_2_param_id_trees
,
&
rc_subs_data
.
rb
[
RRC_STATE_CHANGED_TO_E2SM_RC_RAN_PARAM_ID
])
{
rc_ind_data_t
*
rc_ind_data
=
fill_ue_rrc_state_change
(
rrc_ue_context
,
rrc_state
);
// Needs review: memory ownership of the type rc_ind_data_t is transferred to the E2 Agent. Bad
async_event_agent_api
(
node
->
ric_req_id
,
rc_ind_data
);
printf
(
"Event for RIC Req ID %u generated
\n
"
,
node
->
ric_req_id
);
}
pthread_mutex_unlock
(
&
rc_mutex
);
}
static
void
free_aperiodic_subscription
(
uint32_t
ric_req_id
)
{
remove_rc_subs_data
(
&
rc_subs_data
,
ric_req_id
);
}
sm_ag_if_ans_t
write_subs_rc_sm
(
void
const
*
src
)
{
assert
(
src
!=
NULL
);
// && src->type == RAN_CTRL_SUBS_V1_03);
wr_rc_sub_data_t
*
wr_rc
=
(
wr_rc_sub_data_t
*
)
src
;
assert
(
wr_rc
->
rc
.
ad
!=
NULL
&&
"Cannot be NULL"
);
// 9.2.1.2 RIC ACTION DEFINITION IE
switch
(
wr_rc
->
rc
.
ad
->
format
)
{
case
FORMAT_1_E2SM_RC_ACT_DEF
:
{
// Parameters to be Reported List
// [1-65535]
const
uint32_t
ric_req_id
=
wr_rc
->
ric_req_id
;
arr_ran_param_id_t
*
arr_ran_param_id
=
calloc
(
1
,
sizeof
(
arr_ran_param_id_t
));
assert
(
arr_ran_param_id
!=
NULL
&&
"Memory exhausted"
);
arr_ran_param_id
->
len
=
wr_rc
->
rc
.
ad
->
frmt_1
.
sz_param_report_def
;
arr_ran_param_id
->
ran_param_id
=
calloc
(
arr_ran_param_id
->
len
,
sizeof
(
ran_param_id_e
));
const
size_t
sz
=
arr_ran_param_id
->
len
;
for
(
size_t
i
=
0
;
i
<
sz
;
i
++
)
{
arr_ran_param_id
->
ran_param_id
[
i
]
=
wr_rc
->
rc
.
ad
->
frmt_1
.
param_report_def
[
i
].
ran_param_id
;
}
insert_rc_subs_data
(
&
rc_subs_data
,
ric_req_id
,
arr_ran_param_id
);
break
;
}
default:
AssertFatal
(
wr_rc
->
rc
.
ad
->
format
==
FORMAT_1_E2SM_RC_ACT_DEF
,
"Action Definition Format %d not yet implemented"
,
wr_rc
->
rc
.
ad
->
format
);
}
sm_ag_if_ans_t
ans
=
{.
type
=
SUBS_OUTCOME_SM_AG_IF_ANS_V0
};
ans
.
subs_out
.
type
=
APERIODIC_SUBSCRIPTION_FLRC
;
ans
.
subs_out
.
aper
.
free_aper_subs
=
free_aperiodic_subscription
;
return
ans
;
}
sm_ag_if_ans_t
write_ctrl_rc_sm
(
void
const
*
data
)
{
assert
(
data
!=
NULL
);
...
...
@@ -94,42 +260,12 @@ sm_ag_if_ans_t write_ctrl_rc_sm(void const* data)
return
ans
;
}
static
void
*
emulate_rrc_msg
(
void
*
ptr
)
{
uint32_t
*
ric_id
=
(
uint32_t
*
)
ptr
;
for
(
size_t
i
=
0
;
i
<
5
;
++
i
){
usleep
(
rand
()
%
4000
);
rc_ind_data_t
*
d
=
calloc
(
1
,
sizeof
(
rc_ind_data_t
));
assert
(
d
!=
NULL
&&
"Memory exhausted"
);
*
d
=
fill_rnd_rc_ind_data
();
async_event_agent_api
(
*
ric_id
,
d
);
printf
(
"Event for RIC Req ID %u generated
\n
"
,
*
ric_id
);
}
free
(
ptr
);
return
NULL
;
}
static
pthread_t
t_ran_ctrl
;
sm_ag_if_ans_t
write_subs_rc_sm
(
void
const
*
src
)
bool
read_rc_sm
(
void
*
data
)
{
assert
(
src
!=
NULL
);
// && src->type == RAN_CTRL_SUBS_V1_03);
wr_rc_sub_data_t
*
wr_rc
=
(
wr_rc_sub_data_t
*
)
src
;
printf
(
"ric req id %d
\n
"
,
wr_rc
->
ric_req_id
);
uint32_t
*
ptr
=
malloc
(
sizeof
(
uint32_t
));
assert
(
ptr
!=
NULL
);
*
ptr
=
wr_rc
->
ric_req_id
;
int
rc
=
pthread_create
(
&
t_ran_ctrl
,
NULL
,
emulate_rrc_msg
,
ptr
);
assert
(
rc
==
0
);
sm_ag_if_ans_t
ans
=
{
0
};
assert
(
data
!=
NULL
);
// assert(data->type == RAN_CTRL_STATS_V1_03);
assert
(
0
!=
0
&&
"Not implemented"
);
return
ans
;
return
true
;
}
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc.h
View file @
c3e7cb7e
...
...
@@ -24,13 +24,12 @@
#include "openair2/E2AP/flexric/src/agent/../sm/sm_io.h"
bool
read_rc_sm
(
void
*
);
void
read_rc_setup_sm
(
void
*
data
);
sm_ag_if_ans_t
write_subs_rc_sm
(
void
const
*
src
);
sm_ag_if_ans_t
write_ctrl_rc_sm
(
void
const
*
data
);
sm_ag_if_ans_t
write_subs_rc_sm
(
void
const
*
src
);
bool
read_rc_sm
(
void
*
);
#endif
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h
0 → 100644
View file @
c3e7cb7e
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef RAN_FUNC_SM_RAN_CTRL_EXTERN_AGENT_H
#define RAN_FUNC_SM_RAN_CTRL_EXTERN_AGENT_H
#include "openair2/RRC/NR/nr_rrc_defs.h"
typedef
enum
{
RC_SM_RRC_CONNECTED
,
RC_SM_RRC_INACTIVE
,
RC_SM_RRC_IDLE
,
RC_SM_RRC_ANY
}
rc_sm_rrc_state_e
;
void
signal_rrc_state_changed_to
(
const
gNB_RRC_UE_t
*
rrc_ue_context
,
const
rc_sm_rrc_state_e
rrc_state
);
#endif
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_subs.c
0 → 100644
View file @
c3e7cb7e
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#include "ran_func_rc_subs.h"
#include "common/utils/assertions.h"
#include <assert.h>
#include <pthread.h>
#define MAX_NUM_RIC_REQ_ID 64
static
pthread_mutex_t
rc_mutex
=
PTHREAD_MUTEX_INITIALIZER
;
int
cmp_ric_req_id
(
struct
ric_req_id_s
*
c1
,
struct
ric_req_id_s
*
c2
)
{
if
(
c1
->
ric_req_id
<
c2
->
ric_req_id
)
return
-
1
;
if
(
c1
->
ric_req_id
>
c2
->
ric_req_id
)
return
1
;
return
0
;
}
RB_GENERATE
(
ric_id_2_param_id_trees
,
ric_req_id_s
,
entries
,
cmp_ric_req_id
);
void
init_rc_subs_data
(
rc_subs_data_t
*
rc_subs_data
)
{
pthread_mutex_lock
(
&
rc_mutex
);
// Initialize hash table
DevAssert
(
rc_subs_data
->
htable
==
NULL
);
// Initialize RB trees
// 1 RB tree = 1 ran_param_id => many ric_req_id(s)
for
(
size_t
i
=
0
;
i
<
END_E2SM_RC_RAN_PARAM_ID
;
i
++
)
{
RB_INIT
(
&
rc_subs_data
->
rb
[
i
]);
}
rc_subs_data
->
htable
=
hashtable_create
(
MAX_NUM_RIC_REQ_ID
,
NULL
,
free
);
assert
(
rc_subs_data
->
htable
!=
NULL
&&
"Memory exhausted"
);
pthread_mutex_unlock
(
&
rc_mutex
);
}
void
insert_rc_subs_data
(
rc_subs_data_t
*
rc_subs_data
,
uint32_t
ric_req_id
,
arr_ran_param_id_t
*
arr_ran_param_id
)
{
pthread_mutex_lock
(
&
rc_mutex
);
// Insert in hash table
DevAssert
(
rc_subs_data
->
htable
!=
NULL
);
uint64_t
key
=
ric_req_id
;
// Check if the subscription already exists
AssertFatal
(
hashtable_is_key_exists
(
rc_subs_data
->
htable
,
key
)
==
HASH_TABLE_KEY_NOT_EXISTS
,
"RIC req ID %d already subscribed"
,
ric_req_id
);
arr_ran_param_id_t
*
data
=
malloc
(
sizeof
(
*
data
));
assert
(
data
!=
NULL
);
*
data
=
*
arr_ran_param_id
;
hashtable_rc_t
ret
=
hashtable_insert
(
rc_subs_data
->
htable
,
key
,
data
);
assert
(
ret
==
HASH_TABLE_OK
&&
"Hash table not ok"
);
// Insert in RB trees
// 1 RB tree = 1 ran_param_id => many ric_req_id(s)
const
size_t
sz
=
arr_ran_param_id
->
len
;
rb_ric_req_id_t
*
node
=
calloc
(
1
,
sizeof
(
*
node
));
assert
(
node
!=
NULL
);
node
->
ric_req_id
=
ric_req_id
;
for
(
size_t
i
=
0
;
i
<
sz
;
i
++
)
{
RB_INSERT
(
ric_id_2_param_id_trees
,
&
rc_subs_data
->
rb
[
arr_ran_param_id
->
ran_param_id
[
i
]],
node
);
}
pthread_mutex_unlock
(
&
rc_mutex
);
}
void
remove_rc_subs_data
(
rc_subs_data_t
*
rc_subs_data
,
uint32_t
ric_req_id
)
{
pthread_mutex_lock
(
&
rc_mutex
);
DevAssert
(
rc_subs_data
->
htable
!=
NULL
);
uint64_t
key
=
ric_req_id
;
// Get the array of ran_param_id(s)
void
*
data
=
NULL
;
hashtable_rc_t
ret
=
hashtable_get
(
rc_subs_data
->
htable
,
key
,
&
data
);
AssertFatal
(
ret
==
HASH_TABLE_OK
&&
data
!=
NULL
,
"element for ue_id %d not found
\n
"
,
ric_req_id
);
arr_ran_param_id_t
arr_ran_param_id
=
*
(
arr_ran_param_id_t
*
)
data
;
// Remove ric_req_id with its ran_param_id(s) from hash table
ret
=
hashtable_remove
(
rc_subs_data
->
htable
,
key
);
// Remove ric_req_id from each ran_param_id tree where subscribed
rb_ric_req_id_t
*
node
=
calloc
(
1
,
sizeof
(
*
node
));
assert
(
node
!=
NULL
);
node
->
ric_req_id
=
ric_req_id
;
for
(
size_t
i
=
0
;
i
<
arr_ran_param_id
.
len
;
i
++
)
{
RB_REMOVE
(
ric_id_2_param_id_trees
,
&
rc_subs_data
->
rb
[
arr_ran_param_id
.
ran_param_id
[
i
]],
node
);
}
pthread_mutex_unlock
(
&
rc_mutex
);
}
openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_subs.h
0 → 100644
View file @
c3e7cb7e
/*
* Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The OpenAirInterface Software Alliance licenses this file to You under
* the OAI Public License, Version 1.1 (the "License"); you may not use this file
* except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.openairinterface.org/?page_id=698
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*-------------------------------------------------------------------------------
* For more information about the OpenAirInterface (OAI) Software Alliance:
* contact@openairinterface.org
*/
#ifndef RAN_FUNC_SM_RAN_CTRL_SUBSCRIPTION_AGENT_H
#define RAN_FUNC_SM_RAN_CTRL_SUBSCRIPTION_AGENT_H
#include "common/utils/hashtable/hashtable.h"
#include "common/utils/collection/tree.h"
typedef
enum
{
RRC_STATE_CHANGED_TO_E2SM_RC_RAN_PARAM_ID
=
202
,
// 8.2.4 RAN Parameters for Report Service Style 4
END_E2SM_RC_RAN_PARAM_ID
}
ran_param_id_e
;
typedef
struct
{
size_t
len
;
ran_param_id_e
*
ran_param_id
;
}
arr_ran_param_id_t
;
typedef
struct
ric_req_id_s
{
RB_ENTRY
(
ric_req_id_s
)
entries
;
uint32_t
ric_req_id
;
}
rb_ric_req_id_t
;
typedef
struct
{
RB_HEAD
(
ric_id_2_param_id_trees
,
ric_req_id_s
)
rb
[
END_E2SM_RC_RAN_PARAM_ID
];
// 1 RB tree = (1 RAN Parameter ID) : (n RIC Request ID) => m RB tree = (m RAN Parameter ID) : (n RIC Request ID)
hash_table_t
*
htable
;
// 1 Hash table = (n RIC Request ID) : (m RAN Parameter ID)
}
rc_subs_data_t
;
int
cmp_ric_req_id
(
struct
ric_req_id_s
*
c1
,
struct
ric_req_id_s
*
c2
);
void
init_rc_subs_data
(
rc_subs_data_t
*
rc_subs_data
);
void
insert_rc_subs_data
(
rc_subs_data_t
*
rc_subs_data
,
uint32_t
ric_req_id
,
arr_ran_param_id_t
*
arr_ran_param_id
);
void
remove_rc_subs_data
(
rc_subs_data_t
*
rc_subs_data
,
uint32_t
ric_req_id
);
#endif
openair2/E2AP/README.md
View file @
c3e7cb7e
...
...
@@ -98,7 +98,7 @@ git submodule update
```
bash
git clone https://gitlab.eurecom.fr/mosaic5g/flexric flexric
cd
flexric/
git checkout
70dd779f5339f4dac3ac176a24b49c45046a59fa
git checkout
29af8408afad3da36824bd7912562202023ae924
```
### 2.2.2 Build FlexRIC
...
...
@@ -124,8 +124,10 @@ At the moment, the following measurements are supported in OAI RAN:
*
"RRU.PrbTotDl"
*
"RRU.PrbTotUl"
2.
RC v01.03 (
`xapp_kpm_rc`
)
At the moment, OAI RAN supports the RAN control function "QoS flow mapping configuration", i.e. creating a new DRB.
2.
RC v01.03
Currently available RC xApps:
*
`xapp_kpm_rc`
- RAN control function "QoS flow mapping configuration" support, i.e. creating a new DRB.
*
`xapp_rc_moni`
- aperiodic subscription support for "UE RRC State Change"
3.
MAC + RLC + PDCP + GTP (
`xapp_gtp_mac_rlc_pdcp_moni`
)
...
...
@@ -172,13 +174,25 @@ cd flexric
./build/examples/ric/nearRT-RIC
```
*
start the KPM xApp
*
start the KPM
monitor
xApp
```
bash
cd
flexric
./build/examples/xApp/c/monitor/xapp_kpm_moni
```
*
start the (MAC + RLC + PDCP + GTP) xApp
*
start the RC monitor xApp
```
bash
cd
flexric
./build/examples/xApp/c/monitor/xapp_rc_moni
```
*
start the RC control xApp
```
bash
cd
flexric
./build/examples/xApp/c/kpm_rc/xapp_kpm_rc
```
*
start the (MAC + RLC + PDCP + GTP) monitor xApp
```
bash
cd
flexric
./build/examples/xApp/c/monitor/xapp_gtp_mac_rlc_pdcp_moni
...
...
flexric
@
29af8408
Subproject commit
70dd779f5339f4dac3ac176a24b49c45046a59fa
Subproject commit
29af8408afad3da36824bd7912562202023ae924
openair2/RRC/NR/rrc_gNB.c
View file @
c3e7cb7e
...
...
@@ -102,6 +102,10 @@
#include "BIT_STRING.h"
#include "assertions.h"
#ifdef E2_AGENT
#include "openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h"
#endif
//#define XER_PRINT
extern
RAN_CONTEXT_t
RC
;
...
...
@@ -500,6 +504,10 @@ static void rrc_gNB_process_RRCSetupComplete(const protocol_ctxt_t *const ctxt_p
AssertFatal
(
ctxt_pP
->
rntiMaybeUEid
==
ue_context_pP
->
ue_context
.
rrc_ue_id
,
"logic bug: inconsistent IDs, must use CU UE ID!
\n
"
);
rrc_gNB_send_NGAP_NAS_FIRST_REQ
(
ctxt_pP
,
ue_context_pP
,
rrcSetupComplete
);
#ifdef E2_AGENT
signal_rrc_state_changed_to
(
&
ue_context_pP
->
ue_context
,
RC_SM_RRC_CONNECTED
);
#endif
}
//-----------------------------------------------------------------------------
...
...
@@ -2585,6 +2593,10 @@ rrc_gNB_generate_RRCRelease(
rrc
->
cucp_cuup
.
bearer_context_release
(
assoc_id
,
&
cmd
);
}
#ifdef E2_AGENT
signal_rrc_state_changed_to
(
UE
,
RC_SM_RRC_IDLE
);
#endif
/* UE will be freed after UE context release complete */
}
...
...
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