AssertFatal(oai_args.sm_dir!=NULL,"Please, specify the directory where the SMs are located in the config file, i.e., add in config file the next line: e2_agent = {near_ric_ip_addr = \"127.0.0.1\"; sm_dir = \"/usr/local/lib/flexric/\");} ");
AssertFatal(oai_args.ip!=NULL,"Please, specify the IP address of the nearRT-RIC in the config file, i.e., e2_agent = {near_ric_ip_addr = \"127.0.0.1\"; sm_dir = \"/usr/local/lib/flexric/\"");
../flexric/test/rnd/fill_rnd_data_e2_setup_req.c # this is not rnd data; it is used to fill E2 Node Component Configuration Addition List in E2 Setup Request message
CUSTOMIZED/ran_func_gtp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP
CUSTOMIZED/ran_func_pdcp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP
CUSTOMIZED/ran_func_tc.c # currently, not implemented; therefore, filling rnd data
../flexric/test/rnd/fill_rnd_data_tc.c
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
../flexric/test/rnd/fill_rnd_data_rc.c # this dependancy will be taken out once RAN Function Definition is implemented
)
add_library(e2_ran_func STATIC
init_ran_func.c
read_setup_ran.c
../flexric/test/rnd/fill_rnd_data_e2_setup_req.c
)
target_link_libraries(e2_ran_func_cuup PUBLIC asn1_nr_rrc nr_rrc asn1_nr_rrc_hdrs e2_time_obj kpm_ric_info_common_obj 3gpp_derived_ie_obj)
target_compile_definitions(e2_ran_func_cuup PUBLIC ${E2AP_VERSION}${KPM_VERSION} NGRAN_GNB_CUUP)
target_link_libraries(e2_ran_func
PUBLIC
e2_ran_func_cust
e2_ran_func_oran
)
# This dependency sucks! Create pointers and forward declarations!
../flexric/test/rnd/fill_rnd_data_e2_setup_req.c # this is not rnd data; it is used to fill E2 Node Component Configuration Addition List in E2 Setup Request message
CUSTOMIZED/ran_func_gtp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP
CUSTOMIZED/ran_func_pdcp.c # current implementation doesn't take split architecture into account, neither CU/DU nor CU-UP/CU-CP
O-RAN/ran_func_kpm.c # this file should only contain RRC/PDCP-C; to be done in the future
# when nr-softmodem is divided in separate executables
../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
../flexric/test/rnd/fill_rnd_data_rc.c # this dependancy will be taken out once RAN Function Definition is implemented
CUSTOMIZED/ran_func_mac.c
CUSTOMIZED/ran_func_rlc.c
CUSTOMIZED/ran_func_slice.c
CUSTOMIZED/ran_func_tc.c
../flexric/test/rnd/fill_rnd_data_tc.c
../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_compile_definitions(e2_ran_func_du_cucp_cuup PUBLIC ${E2AP_VERSION}${KPM_VERSION} NGRAN_GNB_DU NGRAN_GNB_CUCP NGRAN_GNB_CUUP)
rd->txpdu_pkts=rb_pdcp.txpdu_pkts;/* aggregated number of tx packets */
rd->txpdu_bytes=rb_pdcp.txpdu_bytes;/* aggregated bytes of tx packets */
rd->txpdu_sn=rb_pdcp.txpdu_sn;/* current sequence number of last tx packet (or TX_NEXT) */
rd->rxpdu_pkts=rb_pdcp.rxpdu_pkts;/* aggregated number of rx packets */
rd->rxpdu_bytes=rb_pdcp.rxpdu_bytes;/* aggregated bytes of rx packets */
rd->rxpdu_sn=rb_pdcp.rxpdu_sn;/* current sequence number of last rx packet (or RX_NEXT) */
rd->rxpdu_oo_pkts=rb_pdcp.rxpdu_oo_pkts;/* aggregated number of out-of-order rx pkts (or RX_REORD) */
rd->rxpdu_oo_bytes=rb_pdcp.rxpdu_oo_bytes;/* aggregated amount of out-of-order rx bytes */
rd->rxpdu_dd_pkts=rb_pdcp.rxpdu_dd_pkts;/* aggregated number of duplicated discarded packets (or dropped packets because of other reasons such as integrity failure) (or RX_DELIV) */
rd->rxpdu_dd_bytes=rb_pdcp.rxpdu_dd_bytes;/* aggregated amount of discarded packets' bytes */
rd->rxpdu_ro_count=rb_pdcp.rxpdu_ro_count;/* this state variable indicates the COUNT value following the COUNT value associated with the PDCP Data PDU which triggered t-Reordering. (RX_REORD) */
rd->txsdu_pkts=rb_pdcp.txsdu_pkts;/* number of SDUs delivered */
rd->txsdu_bytes=rb_pdcp.txsdu_bytes;/* number of bytes of SDUs delivered */
rd->rxsdu_pkts=rb_pdcp.rxsdu_pkts;/* number of SDUs received */
rd->rxsdu_bytes=rb_pdcp.rxsdu_bytes;/* number of bytes of SDUs received */
rd->txpdu_pkts=rb_pdcp.txpdu_pkts;/* aggregated number of tx packets */
rd->txpdu_bytes=rb_pdcp.txpdu_bytes;/* aggregated bytes of tx packets */
rd->txpdu_sn=rb_pdcp.txpdu_sn;/* current sequence number of last tx packet (or TX_NEXT) */
rd->rxpdu_pkts=rb_pdcp.rxpdu_pkts;/* aggregated number of rx packets */
rd->rxpdu_bytes=rb_pdcp.rxpdu_bytes;/* aggregated bytes of rx packets */
rd->rxpdu_sn=rb_pdcp.rxpdu_sn;/* current sequence number of last rx packet (or RX_NEXT) */
rd->rxpdu_oo_pkts=rb_pdcp.rxpdu_oo_pkts;/* aggregated number of out-of-order rx pkts (or RX_REORD) */
rd->rxpdu_oo_bytes=rb_pdcp.rxpdu_oo_bytes;/* aggregated amount of out-of-order rx bytes */
rd->rxpdu_dd_pkts=rb_pdcp.rxpdu_dd_pkts;/* aggregated number of duplicated discarded packets (or dropped packets because of other reasons such as integrity failure) (or RX_DELIV) */
rd->rxpdu_dd_bytes=rb_pdcp.rxpdu_dd_bytes;/* aggregated amount of discarded packets' bytes */
rd->rxpdu_ro_count=rb_pdcp.rxpdu_ro_count;/* this state variable indicates the COUNT value following the COUNT value associated with the PDCP Data PDU which triggered t-Reordering. (RX_REORD) */
rd->txsdu_pkts=rb_pdcp.txsdu_pkts;/* number of SDUs delivered */
rd->txsdu_bytes=rb_pdcp.txsdu_bytes;/* number of bytes of SDUs delivered */
rd->rxsdu_pkts=rb_pdcp.rxsdu_pkts;/* number of SDUs received */
rd->rxsdu_bytes=rb_pdcp.rxsdu_bytes;/* number of bytes of SDUs received */
rd->txpdu_pkts=rb_pdcp.txpdu_pkts;/* aggregated number of tx packets */
rd->txpdu_bytes=rb_pdcp.txpdu_bytes;/* aggregated bytes of tx packets */
rd->txpdu_sn=rb_pdcp.txpdu_sn;/* current sequence number of last tx packet (or TX_NEXT) */
rd->rxpdu_pkts=rb_pdcp.rxpdu_pkts;/* aggregated number of rx packets */
rd->rxpdu_bytes=rb_pdcp.rxpdu_bytes;/* aggregated bytes of rx packets */
rd->rxpdu_sn=rb_pdcp.rxpdu_sn;/* current sequence number of last rx packet (or RX_NEXT) */
rd->rxpdu_oo_pkts=rb_pdcp.rxpdu_oo_pkts;/* aggregated number of out-of-order rx pkts (or RX_REORD) */
rd->rxpdu_oo_bytes=rb_pdcp.rxpdu_oo_bytes;/* aggregated amount of out-of-order rx bytes */
rd->rxpdu_dd_pkts=rb_pdcp.rxpdu_dd_pkts;/* aggregated number of duplicated discarded packets (or dropped packets because of other reasons such as integrity failure) (or RX_DELIV) */
rd->rxpdu_dd_bytes=rb_pdcp.rxpdu_dd_bytes;/* aggregated amount of discarded packets' bytes */
rd->rxpdu_ro_count=rb_pdcp.rxpdu_ro_count;/* this state variable indicates the COUNT value following the COUNT value associated with the PDCP Data PDU which triggered t-Reordering. (RX_REORD) */
rd->txsdu_pkts=rb_pdcp.txsdu_pkts;/* number of SDUs delivered */
rd->txsdu_bytes=rb_pdcp.txsdu_bytes;/* number of bytes of SDUs delivered */
rd->rxsdu_pkts=rb_pdcp.rxsdu_pkts;/* number of SDUs received */
rd->rxsdu_bytes=rb_pdcp.rxsdu_bytes;/* number of bytes of SDUs received */
msg_frm_1.meas_data_lst[i].meas_record_len=act_def_fr_1->meas_info_lst_len;// record data list length corresponds to info list length from action definition
/* note: by default this measurement is calculated for previous 100ms (openair2/LAYER2/nr_rlc/nr_rlc_entity.c:118, 173, 213); please, update according to your needs */
msg_frm_1.meas_data_lst[i].meas_record_len=act_def_fr_1->meas_info_lst_len;// record data list length corresponds to info list length from action definition
msg_frm_1.meas_data_lst[i].meas_record_len=act_def_fr_1->meas_info_lst_len;// record data list length corresponds to info list length from action definition
msg_frm_1.meas_data_lst[i].meas_record_len=act_def_fr_1->meas_info_lst_len;// record data list length corresponds to info list length from action definition
#if defined (NGRAN_GNB_CUCP)
typedefstruct{
uint32_trrc_ue_id_list[MAX_MOBILES_PER_GNB];// list of matched UEs on RRC level containing only rrc_ue_id (gNB CU UE ID)
- By default, OAI will build the E2 Agent with E2AP v2 and KPM v2. If you want a different version, edit the variable E2AP\_VERSION and KPM\_VERSION at OAI's CMakeLists.txt file.
Currently available versions:
| |KPM v2.03|KPM v3.00|
|:-----------|:--------|:--------|
| E2AP v1.01 | Y | Y |
| E2AP v2.03 | Y | Y |
| E2AP v3.01 | Y | Y |
Please note that KPM SM v2.01 is supported only in FlexRIC, but not in OAI.
By default the service model libraries will be installed in the path `/usr/local/lib/flexric` while the configuration file in `/usr/local/etc/flexric`.
Available SMs in this version are:
* KPM v02.03 and KPM v03.00 (xapp_kpm_moni)
* RC v01.03 (xapp_kpm_rc)
* GTP (xapp_gtp_moni)
* MAC + RLC + PDCP (xapp_mac_rlc_pdcp_moni)
#### 2.2.3.1 Available Service Models
1. KPM v02.03 and KPM v03.00 (`xapp_kpm_moni`)
At the moment, the following measurements are supported in OAI RAN:
* "DRB.PdcpSduVolumeDL"
* "DRB.PdcpSduVolumeUL"
* "DRB.RlcSduDelayDl"
* "DRB.UEThpDl"
* "DRB.UEThpUl"
* "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.
3. MAC + RLC + PDCP + GTP (`xapp_gtp_mac_rlc_pdcp_moni`)
If you are interested in TC and SLICE SMs, please follow the instructions at https://gitlab.eurecom.fr/mosaic5g/flexric.
The latency that you observe in your monitor xApp is the latency from the E2 Agent to the nearRT-RIC and xApp.
Therefore, FlexRIC is well suited for use cases with ultra low-latency requirements.
Additionally, all the data received in the `xapp_gtp_mac_rlc_pdcp_moni` xApp is also written to /tmp/xapp_db in case that offline data processing is wanted (e.g., Machine Learning/Artificial Intelligence applications). You can browse the data using e.g., sqlitebrowser.
Please note:
* KPM SM database is not been updated, therefore commented in `flexric/src/xApp/db/sqlite3/sqlite3_wrapper.c:1152`