Skip to main content
Version: v4.0.0 [Denim]

Lab 10: Lower-Layer Control ORAN SM

This experiment deploys a 5G Standalone (SA) network using OpenAirInterface (OAI) gNB and OAI minimal 5GC. Additionally, deploys FlexRIC as the Near-RT RIC. Finally O-RAN LLC SM xApp for extracting uplink Sounding Reference Signal (SRS) I/Q samples is deployed on bare-metal connecting to the RIC.

warning

This lab is only meant to be performed using OAI RAN on Over-the-Air deployments (i.e. using USRP, LITEON RU or Benetel RU) The sample network template file is for a deployment with LITEON RU, for USRP and Benetel RU, refer to our Github blueprint repository.

open-ran-liteon.yaml
apiVersion: athena.trirematics.io/v1
kind: Network
metadata:
name: bubbleran
namespace: trirematics
spec:
slices:
- plmn: "00101"
dnn: internet
network-mode: IPv4
service-type: eMBB
differentiator: 0x000000
ipv4-range: 12.1.1.0/24
ipv6-range: 2001:db8:1::/64
access:
- name: oai-gnb
stack: 5g-sa
model: oai-ran/monolithic-gnb-ru #cu-du-ru
identity:
an-id: 30
tracking-area: 1
radio:
device: oran-7.2
antenna:
formation: 4x4
annotations:
# Flag for reboot, after first use, it can be set to `false` if values in 'cells' is not changed
extras.t9s.io/liteon-ru-reboot: 'true' #'false'
cells:
- band: n78
arfcn: 643296
bandwidth: 100MHz
subcarrier-spacing: 30kHz
tdd-config:
period: 2.5ms
dl-slots: 3
dl-symbols: 6
ul-slots: 1
ul-symbols: 4
controller: flexric.bubbleran
core-networks:
- ogscore.bubbleran
core:
- name: ogscore
stack: 5g-sa
model: open5gs/5gc
profiles:
- debug
identity:
region: 128
cn-group: 4
cn-id: 5
edge:
- name: flexric
stack: 5g-sa
model: mosaic5g/flexric
dns:
ipv4:
default: 8.8.8.8
secondary: 8.8.4.4

Deployment​

Use the command brc install network open-ran-liteon.yaml to deploy the network. It should finish without errors and printout the three Kubernetes resource names that were created. Check for the status of the deployment using the command brc observe. Wait until all the Elements other than the UE are in the STATUS set to 1/1 Y state.

tip

Please refer to this guide for detailed steps to run pre-checks before deploying networks using O-RAN 7.2 FHI with LITEON RU.

After deploying the network, before running the xApp, you should update the xApp configuration file with the IP of the deployed Near-RT RIC, the local source IP in the cluster subnet and the deployed database. To do so you may execute the update_conf.py script which automatically extract the IPs from the cluster and updates the specified configuration file:

cd /path/to/xapp_sdk/conf
python3 update_conf.py xapp.yaml
tip

Once the network is deployed, traffic can be generated between the UEs and the network with the following commands:

brc test throughput ue1 dl gateway -- -t 600
brc test throughput ue2 dl gateway -- -t 600

With the brc test throughput tool the user can generate iperf traffic from the UPF (gateway) to the UE for downlink traffic (dl) or vice-versa for uplink (ul). For more details you may check the BubbleRAN CLI reference.

The script will prompt the user for selecting which Near-RT RIC the xApp should connect to (in case of multiple RICs and/or networks currently deployed). Since xapp_all_sm.yaml also defines the database information, the script will prompt the user to specify which database in the deployed network to connect to.

After selecting a RIC and database to connect, an output as the following is obtained:

Select the RIC to configure:
1) flexric.flexric.bubbleran (10.244.1.75 - trirematics, pod)
Choice [1-1]: 1
Select the Database to configure:
1) vmsingle-vmks-victoria-metrics-k8s-stack (10.106.214.123 - monitoring, svc)
Choice [1-1]: 1
Port-forwarding enabled for vmsingle-vmks-victoria-metrics-k8s-stack on port 8428.
Enter the scenario name for VictoriaMetrics: lab4
Config 'xapp_all_sm.yaml' updated: ip_ric=10.244.1.75, ip_xapp=10.244.0.235, db.ip=localhost
warning

If VictoriaMetrics is the selected database, the user should build the targets with VICTORIAMETRICS_XAPP CMakeList as shown in the Build and Install section.

note

For VictoriaMetrics, the script will automatically port-forward database to http://localhost:8428. It will also prompt for the scenario name to be configured for the xapp (lab4 in the example). Please, refer to xApp Generated Metrics to know more about it.

Once the configuration file is updated, the LLC xApp can run.

O-RAN LLC xApp​

This xApp uses the LLC Service Model to subscribe to aperiodic SRS event triggers generated by the UE. In its callback, it unpacks each indication messgae to read the SRS I/Q buffer length (len_srs_iq) in raw 16-bit I/Q pairs, in addition to the received noise and the estimated value. The values are written to a file.

xapp_llc_srs.c
#include "../include/src/xApp/e42_xapp_api.h"
#include "../include/src/util/alg_ds/alg/defer.h"
#include "../include/src/sm/llc_sm/llc_sm_id.h"
#include "../include/src/util/alg_ds/ds/latch_cv/latch_cv.h"
#include "../include/src/util/time_now_us.h"
#include "../include/src/sm/rc_sm/rc_sm_id.h"

#include <assert.h>
#include <poll.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

static
ue_id_e2sm_t ue_id;

static
latch_cv_t latch;

static
global_e2_node_id_t src_e2_node = {0};

// Event Trigger
static
e2sm_rc_event_trigger_t gen_ev_trig(void)
{
// On Demand trigger. Snapshot.
// No need to send a subscription delete afterwards
e2sm_rc_event_trigger_t dst = {.format = FORMAT_5_E2SM_RC_EV_TRIGGER_FORMAT};
dst.frmt_5.on_demand = TRUE_ON_DEMAND_FRMT_5;

return dst;
}

static
e2sm_rc_act_def_frmt_1_t gen_rc_frmt_1(void)
{
e2sm_rc_act_def_frmt_1_t dst = {0};

dst.sz_param_report_def = 1;
dst.param_report_def = calloc(dst.sz_param_report_def, sizeof(param_report_def_t));
assert(dst.param_report_def != NULL && "Memory exhausted");
dst.param_report_def[0].ran_param_id = UE_CTX_INFO_8_2_5;

return dst;
}

// Action Definition
e2sm_rc_action_def_t gen_act_def(void)
{
e2sm_rc_action_def_t dst = {0};

// RIC Style Type
// Mandatory
// 9.3.3
// Defined in common 6.2.2.2.

// 5 - On Demand Report
// This style is used to report snapshot of UE related information and
// Cell related information upon request from Near-RT RIC.
dst.ric_style_type = 5;

//9.2.1.2.1
dst.format = FORMAT_1_E2SM_RC_ACT_DEF;
dst.frmt_1 = gen_rc_frmt_1();

return dst;
}

// 7.4.6
// REPORT Service Style 5: On Demand Report
static
rc_sub_data_t on_demand_rc_sub(void)
{
rc_sub_data_t dst = {0};

// Event Trigger
dst.et = gen_ev_trig();

// Action Definition
dst.sz_ad = 1;
dst.ad = calloc(dst.sz_ad, sizeof(e2sm_rc_action_def_t));
assert(dst.ad != NULL && "Memory exhausted");
dst.ad[0] = gen_act_def();

return dst;
}

static
void cb_sm_rc(sm_ag_if_rd_t const *rd, global_e2_node_id_t const *n)
{
assert(n != NULL);
assert(rd != NULL);
assert(rd->type == INDICATION_MSG_AGENT_IF_ANS_V0);
assert(rd->ind.type == RAN_CTRL_STATS_V1_03);

rc_ind_data_t const* ind = &rd->ind.rc.ind;

// Header
assert(ind->hdr.format == FORMAT_1_E2SM_RC_IND_HDR);
// Ignoring the Event trigger condition as it is an
// on demand message

// Message
assert(ind->msg.format == FORMAT_4_E2SM_RC_IND_MSG);
e2sm_rc_ind_msg_frmt_4_t const* frmt_4 = &ind->msg.frmt_4; // 9.2.1.4.4

assert(frmt_4->sz_seq_ue_info > 0 && "At least one UE connected needed for this example!");

for (size_t i = 0; i < frmt_4->sz_seq_ue_info; i++) {
ue_id = cp_ue_id_e2sm(&frmt_4->seq_ue_info[i].ue_id);
if (ue_id.type == GNB_UE_ID_E2SM)
printf("Found UE(%lu) ran_ue_id %ld in E2 Node (gNB) id %d\n", i, *frmt_4->seq_ue_info[i].ue_id.gnb.ran_ue_id, n->nb_id.nb_id);
else if (ue_id.type == GNB_DU_UE_ID_E2SM)
printf("Found UE(%lu) ran_ue_id %ld in E2 Node (gNB-DU) id %d\n", i, *frmt_4->seq_ue_info[i].ue_id.gnb_du.ran_ue_id, n->nb_id.nb_id);
else
assert(0 != 0 && "cannot get ran_ue_id from this unknown ue_id.type");
}
// Change this array for getting the SRS from a second UE ID
//ue_id = cp_ue_id_e2sm(&frmt_4->seq_ue_info[0].ue_id);
if (ue_id.type == GNB_UE_ID_E2SM)
printf("Monitor ran_ue_id %ld\n", *ue_id.gnb.ran_ue_id);
else if (ue_id.type == GNB_DU_UE_ID_E2SM)
printf("Monitor ran_ue_id %ld\n", *ue_id.gnb_du.ran_ue_id);
else
assert(0 != 0 && "cannot get ran_ue_id from this unknown ue_id.type");

src_e2_node = cp_global_e2_node_id(n);

// Syncronize. Notify that one message arrived
count_down_latch_cv(&latch);
}

void write_iq_text(const char* filename, const uint8_t* buf, size_t len, int64_t collect_time) {
FILE* f = fopen(filename, "w");
if (!f) return;

// buf = [I_l, I_h, Q_l, Q_h]
for (size_t i = 0; i < len; i++) {
size_t o = 4 * i; // offset into buf
int16_t I = buf[o] | (buf[o+1] << 8);
int16_t Q = buf[o+2] | (buf[o+3] << 8);
//printf("%zd: I=%d, Q=%d\n", i, I, Q);
fprintf(f, "%ld %d %d\n", collect_time, I, Q);
}

fclose(f);
}

static void cb_sm_llc(sm_ag_if_rd_t const *rd, global_e2_node_id_t const *n)
{
assert(n != NULL);
assert(rd != NULL);
assert(rd->type == INDICATION_MSG_AGENT_IF_ANS_V0);
assert(rd->ind.type == LLC_STATS_V1_0);

llc_ind_data_t const* ind = &rd->ind.llc.ind;

assert(ind->msg.format == FORMAT_1_E2SM_LLC_IND_MSG && "Only Aperiodic event supported");
e2sm_llc_ind_msg_frmt_1_t const* frmt_1 = &ind->msg.frmt_1;
assert(frmt_1->ll_info_type == SRS_LL_INFO_TYPE_E && "srs samples expected");

int64_t t0 = 0;
memcpy(&t0,frmt_1->slot_tstamp.slot_start_time, 8);
printf("receive ind msg from gnb-du id %u, msg latency %lu us\n", n->nb_id.nb_id, time_now_us() - t0);

for(size_t i = 0; i < frmt_1->srs.sz_srs_rx_antenna; i++) {
srs_rx_antenna_t* rx = &frmt_1->srs.rx[i];
for (size_t j = 0; j < rx->sz_srs_symbols; j++) {
srs_symbol_t* symbol = &rx->symbol[j];
byte_array_t raw_iq = symbol->raw_iq;
// raw_iq includes three types of I/Q sample: rx srs, noise, estimated channel
size_t sz = raw_iq.len / 3 / 4; // rx, noise, estimated // sizeof(c16_t) = 4
// Offsets in bytes
size_t rx_offset = 0;
size_t noise_offset = 4 * sz;
size_t est_offset = 4 * sz * 2;

char filename_rx[256] = {0};
char filename_noise[256] = {0};
char filename_estimated[256] = {0};
snprintf(filename_rx, sizeof(filename_rx),
"iq_srs_rx_ant%lu_symbol%lu_nbid%u.txt", i, j, n->nb_id.nb_id);
write_iq_text(filename_rx, raw_iq.buf + rx_offset, sz, t0);

snprintf(filename_noise, sizeof(filename_noise),
"iq_srs_noise_ant%lu_symbol%lu_nbid%u.txt", i, j, n->nb_id.nb_id);
write_iq_text(filename_noise, raw_iq.buf + noise_offset, sz, t0);

snprintf(filename_estimated, sizeof(filename_estimated),
"iq_srs_estimated_ant%lu_symbol%lu_nbid%u.txt", i, j, n->nb_id.nb_id);
write_iq_text(filename_estimated, raw_iq.buf + est_offset, sz, t0);
}

}
}

static
llc_sub_data_t gen_llc_sub(ue_id_e2sm_t* ue_id)
{
assert(ue_id != NULL);

llc_sub_data_t dst = {0};

// Aperiodic event
dst.et.format = FORMAT_1_E2SM_LLC_EV_TRIGGER_FORMAT;
// List of LLI for Event Trigger
// [1,63]
dst.et.frmt_1.sz_lst_lli_ev_trg = 1;
dst.et.frmt_1.lst_lli_ev_trg = calloc(dst.et.frmt_1.sz_lst_lli_ev_trg, sizeof(lst_lli_ev_trg_t));
assert(dst.et.frmt_1.lst_lli_ev_trg != NULL && "Memory exhausted");

// For each message event configured, Event Trigger Condition ID
// is assigned so that E2 Node can reply to Near-RT RIC in the
// RIC INDICATION message to inform which event(s) are the cause for triggering.
// O-RAN E2SM-LLC pag. 11
dst.et.frmt_1.lst_lli_ev_trg[0].ev_trg_cond_id = 1;
dst.et.frmt_1.lst_lli_ev_trg[0].lower_layer_info = SRS_LOWER_LAYER_INFO_E;

dst.et.frmt_1.ev_trg_ue_info = calloc(1, sizeof(ev_trg_ue_info_t));
assert(dst.et.frmt_1.ev_trg_ue_info != NULL && "Memory exhausted");


// subscribe to specifc UE
dst.et.frmt_1.ev_trg_ue_info->sz_assoc_ue_info = 1;
dst.et.frmt_1.ev_trg_ue_info->assoc_ue_info = calloc(1, sizeof(assoc_ue_info_llc_t));
assert(dst.et.frmt_1.ev_trg_ue_info->assoc_ue_info != NULL && "Memory exhausted" );
dst.et.frmt_1.ev_trg_ue_info->assoc_ue_info[0].ev_trg_id_ue = 1;
dst.et.frmt_1.ev_trg_ue_info->assoc_ue_info[0].ue_type = INDIVIDUAL_UE_UE_TYPE_E;
dst.et.frmt_1.ev_trg_ue_info->assoc_ue_info[0].ue = cp_ue_id_e2sm(ue_id);

// [1-16]
dst.sz_ad = 1;
dst.ad = calloc(dst.sz_ad, sizeof(e2sm_llc_action_def_t));
assert(dst.ad != NULL && "Memory exhausted");

// RIC Style Type Style Name Style Description
// 1-LLI copy: This style is used to report a copy of LLI received from UE.
// 2-Periodic: This style is used to report the lower layers measurements collected
//by the E2 Node
dst.ad[0].ric_style_type = 1;
dst.ad[0].format = FORMAT_1_E2SM_LLC_ACT_DEF;
dst.ad[0].frmt_1.lower_layer_info = SRS_LOWER_LAYER_INFO_E;

return dst;
}

int main(int argc, char *argv[])
{
assert(argc == 2 && "Configuration file needed");

//Init the xApp
init_xapp_api(argv[1]);
poll(NULL, 0, 1000);

e2_node_arr_xapp_t arr = e2_nodes_xapp_api();
defer({ free_e2_node_arr_xapp(&arr); });


for (size_t i = 0; i < arr.len; i++) {
e2ap_ngran_node_t const type = arr.n[i].id.type;
uint32_t const nb_id = arr.n[i].id.nb_id.nb_id;

if (type == e2ap_ngran_gNB_CU) {
printf("We don't collect SRS signal from E2 Node nb_id %d (type gNB-CU)\n", nb_id);
continue;
}

if (type != e2ap_ngran_gNB && type != e2ap_ngran_gNB_DU)
assert(0 != 0 && "unsupported E2 node type in this xApp");

// WARNING: This xapp SUPPOSES one E2 node with at least one UE connected
global_e2_node_id_t* target_e2node = &arr.n[i].id;
printf("Send RC and LLC subscriptions to target_nb_id %d\n", target_e2node->nb_id.nb_id);

// Init latch to synchronize threads
latch = init_latch_cv(1);
defer({ free_latch_cv(&latch); } );

// Generate RAN CONTROL Subscription
rc_sub_data_t rc_sub = on_demand_rc_sub();
defer({ free_rc_sub_data(&rc_sub); });

// Retrieve information about the E2 Nodes in the callback func (cb)
sm_ans_xapp_t hndl = report_sm_xapp_api(target_e2node, SM_RC_ID, &rc_sub, cb_sm_rc);
assert(hndl.success == true);

// Syncronize. Wait until all the previous messages arrive using a latch
// Wait there is a UE connect to this E2-Node
wait_latch_cv(&latch);

// Generate subscription event for the connected UE
llc_sub_data_t llc_sub = gen_llc_sub(&ue_id);

// Retrieve information about the E2 Nodes in the callback func (cb)
hndl = report_sm_xapp_api(target_e2node, SM_LLC_ID, &llc_sub, cb_sm_llc);
assert(hndl.success == true);

// sleep for 10 seconds
sleep(10);

rm_report_sm_xapp_api(hndl.u.handle);
break;
}

return 0;
}

The user can compile this xApp from the terminal:

cd /path/to/xapp_sdk/build
cmake ..
make -j8
sudo make install
sudo ldconfig

To run it:

./build/src/dev/c/xapp_oran_llc_srs conf/xapp.yaml

If ran successfully the output should be as follows:

$ ./build/src/dev/c/xapp_oran_llc_srs conf/xapp.yaml
17:42:41.023848 [INFO]: e42_xapp_api.c:93
##########################################################################################
##########################################################################################
##########################################################################################
Copyright (C) 2021-2026 BubbleRAN SAS
Project: MX-RIC
Full License: https://bubbleran.com/resources/files/BubbleRAN_Licence-Agreement-1.3.pdf
##########################################################################################
##########################################################################################
##########################################################################################
17:42:41.023948 [INFO]: e42_xapp_api.c:97 Git SHA1 f04542cfbbb694c803cd76f13b45eb9689b16cff
17:42:41.023956 [INFO]: xapp_conf.c:196 Configuration file path conf/xapp.yaml
17:42:41.024013 [INFO]: xapp_conf.c:201 ---------------------------------------------------
17:42:41.024022 [INFO]: xapp_conf.c:202 Configuration file encoded in base64. To decode use $base64 --decode tmp.txt
17:42:41.024022 [INFO]: xapp_conf.c:203 ---------------------------------------------------
17:42:41.024023 [INFO]: xapp_conf.c:204
eGFwcDoKICAgIGlwX3JpYzogMTI3LjAuMC4xCiAgICBlNDJfcG9ydDogMzY0MjIKICAgICMgSVAgdG8gYmluZCBTQ1RQIGNsaWVudAogICAgIyBOZWVkcyB0byBiZSBpbiB0aGUgcmFuZ2Ugb2YKICAgICMgaXBfcmljLiBJdCBpcyB0aGUgaW50ZXJmYWNlCiAgICAjIGZyb20gaWZjb25maWcgY21kCiAgICBpcF94YXBwOiAxMjcuMC4wLjEKICAgIHNtX2RpcjogL3Vzci9sb2NhbC9saWIvZmxleHJpYy8KICAgIGxvZzogMgogICAgICAgICMgdHJhY2U6IDAKICAgICAgICAjIGRlYnVnOiAxCiAgICAgICAgIyBpbmZvOiAyCiAgICAgICAgIyB3YXJuOiAzCiAgICAgICAgIyBlcnJvcjogNAogICAgICAgICMgZmF0YWw6IDUKICAgICAgICAjIGUuZy4sIGxldmVsID0gMiAtPiBsZXZlbCA9IGluZm8KICAgICMgQ29tbWVudCB0aGUgZGF0YWJhc2Ugc2VjdGlvbgogICAgIyBpZiBubyBkYXRhYmFzZSBpcyBuZWVkZWQvdXNlZAogICAgI2RiOgogICAgICAgICNpcDogMTI3LjAuMC4xCiAgICAgICAgI3BvcnQ6IDg0MjgKICAgICAgICAjZmlsZW5hbWU6IHNjZW5hcmlvICAjVGhpcyByZWZlcnMgdG8gdGhlIHNjZW5hcmlvIG5hbWUgKHRhZykgaW4gdmljdG9yaWEgbWV0cmljcwogICAgICAgIAogICAgICAgICMjIG15c3FsIHBhcmFtZXRlcnMgKG5vdCB1c2VkIGZvciB2aWN0b3JpYSBtZXRyaWNzKQogICAgICAgICNkaXI6IC90bXAvCiAgICAgICAgI3VzcjogeGFwcAogICAgICAgICNwc3c6IEJ1YmJsZVJBTgogICAgICAgICNmaWxlbmFtZTogdGVzdGRiCiAgICAgICAgIyBDb21tYW5kcyBmb3Igc2V0dGluZyB1cCBteXNxbAogICAgICAgICMgJCBzdWRvIG15c3FsCiAgICAgICAgIyAkIG15c3FsPiBDUkVBVEUgVVNFUiAndXNlcm5hbWUnQCdsb2NhbGhvc3QnIElERU5USUZJRUQgQlkgJ3Bhc3N3b3JkJzsKICAgICAgICAjICQgbXlzcWw+IGdyYW50IGFsbCBwcml2aWxlZ2VzIG9uICouKiB0byAndXNlcm5hbWUnQCdsb2NhbGhvc3QnOwogICAgICAgICMgJCBteXNxbD4gZXhpdAoK
17:42:41.024024 [INFO]: xapp_conf.c:205 ---------------------------------------------------
17:42:41.024024 [INFO]: xapp_conf.c:206 ---------------------------------------------------
17:42:41.024025 [INFO]: xapp_conf.c:207 ---------------------------------------------------
17:42:41.024071 [INFO]: e42_xapp.c:161 NearRT-RIC Server IP Address = 10.244.1.202, PORT = 36422
17:42:41.024072 [INFO]: e42_xapp.c:162 xApp IP Address = 10.244.0.158
17:42:41.024118 [INFO]: endpoint_xapp.c:74 [xApp]: SCTP client bind to IP 10.244.0.158, Port 40457
17:42:41.024181 [INFO]: emb_sm_ag.c:95 Loaded SM(s) 11, custom SMs true
17:42:41.024229 [INFO]: emb_sm_ric.c:95 Loaded SM(s) 11, custom SMs true
17:42:41.024828 [INFO]: msg_handler_xapp.c:553 E42 SETUP-REQUEST tx
17:42:41.025388 [INFO]: msg_handler_xapp.c:394 E42 SETUP-RESPONSE rx xApp ID 7
17:42:41.025402 [INFO]: msg_handler_xapp.c:410 Connected E2 Node(s) 1
Send RC and LLC subscriptions to target_nb_id 1
17:42:42.026879 [INFO]: msg_handler_xapp.c:588 RIC_SUBSCRIPTION_REQUEST tx RAN_FUNC_ID 3 RIC_REQ_ID 1
17:42:42.028280 [INFO]: msg_handler_xapp.c:155 RIC_SUBSCRIPTION_RESPONSE rx RAN_FUNC_ID 3 RIC_REQ_ID 1
Found UE(0) ran_ue_id 14294967296 in E2 Node (gNB) id 1
Monitor ran_ue_id 14294967296
17:42:42.029025 [INFO]: msg_handler_xapp.c:588 RIC_SUBSCRIPTION_REQUEST tx RAN_FUNC_ID 5 RIC_REQ_ID 2
17:42:42.029523 [INFO]: msg_handler_xapp.c:155 RIC_SUBSCRIPTION_RESPONSE rx RAN_FUNC_ID 5 RIC_REQ_ID 2
receive ind msg from gnb-du id 1, msg latency 728 us
receive ind msg from gnb-du id 1, msg latency 559 us
...
...
...
17:42:52.029630 [INFO]: msg_handler_xapp.c:601 RIC_SUBSCRIPTION_DELETE_REQUEST tx RAN_FUNC_ID 5 RIC_REQ_ID 2
17:42:52.030187 [INFO]: msg_handler_xapp.c:196 RIC_SUBSCRIPTION_DELETE_RESPONSE rx RAN_FUNC_ID 5 rx RIC_REQ_ID 2

The directory were the xapp run, will be populated with files that follow the pattern iq_srs__ant_symbol_nbid.txt