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
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
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-RAN
Commits
c3e7cb7e
Commit
c3e7cb7e
authored
1 year ago
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
Branches unavailable
2025.w08
2025.w07
2025.w06
2025.w05
2025.w04
2025.w03
2025.w02
2024.w51
2024.w50
2024.w49
2024.w48
2024.w47
2024.w46
2024.w45
2024.w44
2024.w43
2024.w42
2024.w41
2024.w40
2024.w39
2024.w38
2024.w36
2024.w35
2024.w34
2024.w33
2024.w32
2024.w31
2024.w30
2024.w29
2024.w28
2024.w27
2024.w26
2024.w25
2024.w24
2024.w23
2024.w22
2024.w21
2024.w18
2024.w17
2024.w16
2024.w15
2024.w14
2024.w13
2024.w12
2024.w11
2024.w10
2024.w09
2024.w08
2024.w06
v2.2.0
v2.1.0
ARC_1.3
No related merge requests found
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
)
This diff is collapsed.
Click to expand it.
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
;
}
This diff is collapsed.
Click to expand it.
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
This diff is collapsed.
Click to expand it.
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
This diff is collapsed.
Click to expand it.
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
);
}
This diff is collapsed.
Click to expand it.
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
This diff is collapsed.
Click to expand it.
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
...
...
This diff is collapsed.
Click to expand it.
flexric
@
29af8408
Subproject commit
70dd779f5339f4dac3ac176a24b49c45046a59fa
Subproject commit
29af8408afad3da36824bd7912562202023ae924
This diff is collapsed.
Click to expand it.
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 */
}
...
...
This diff is collapsed.
Click to expand it.
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