#include "ran_func_rc.h" #include "../../flexric/test/rnd/fill_rnd_data_rc.h" #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 #include #include #include void read_rc_sm(void* data) { assert(data != NULL); // assert(data->type == RAN_CTRL_STATS_V1_03); assert(0!=0 && "Not implemented"); } void read_rc_setup_sm(void* data) { assert(data != NULL); // 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(); } sm_ag_if_ans_t write_ctrl_rc_sm(void const* data) { assert(data != NULL); // assert(data->type == RAN_CONTROL_CTRL_V1_03 ); rc_ctrl_req_data_t const* ctrl = (rc_ctrl_req_data_t const*)data; if(ctrl->hdr.format == FORMAT_1_E2SM_RC_CTRL_HDR){ if(ctrl->hdr.frmt_1.ric_style_type == 1 && ctrl->hdr.frmt_1.ctrl_act_id == 2){ printf("QoS flow mapping configuration \n"); e2sm_rc_ctrl_msg_frmt_1_t const* frmt_1 = &ctrl->msg.frmt_1; for(size_t i = 0; i < frmt_1->sz_ran_param; ++i){ seq_ran_param_t const* rp = frmt_1->ran_param; if(rp[i].ran_param_id == 1){ assert(rp[i].ran_param_val.type == ELEMENT_KEY_FLAG_TRUE_RAN_PARAMETER_VAL_TYPE ); printf("DRB ID %ld \n", rp[i].ran_param_val.flag_true->int_ran); } else if(rp[i].ran_param_id == 2){ assert(rp[i].ran_param_val.type == LIST_RAN_PARAMETER_VAL_TYPE); printf("List of QoS Flows to be modified \n"); for(size_t j = 0; j < ctrl->msg.frmt_1.ran_param[i].ran_param_val.lst->sz_lst_ran_param; ++j){ lst_ran_param_t const* lrp = rp[i].ran_param_val.lst->lst_ran_param; // The following assertion should be true, but there is a bug in the std // check src/sm/rc_sm/enc/rc_enc_asn.c:1085 and src/sm/rc_sm/enc/rc_enc_asn.c:984 // assert(lrp[j].ran_param_id == 3); assert(lrp[j].ran_param_struct.ran_param_struct[0].ran_param_id == 4) ; assert(lrp[j].ran_param_struct.ran_param_struct[0].ran_param_val.type == ELEMENT_KEY_FLAG_TRUE_RAN_PARAMETER_VAL_TYPE); int64_t qfi = lrp[j].ran_param_struct.ran_param_struct[0].ran_param_val.flag_true->int_ran; assert(qfi > -1 && qfi < 65); assert(lrp[j].ran_param_struct.ran_param_struct[1].ran_param_id == 5); assert(lrp[j].ran_param_struct.ran_param_struct[1].ran_param_val.type == ELEMENT_KEY_FLAG_FALSE_RAN_PARAMETER_VAL_TYPE); int64_t dir = lrp[j].ran_param_struct.ran_param_struct[1].ran_param_val.flag_false->int_ran; assert(dir == 0 || dir == 1); printf("qfi = %ld dir %ld \n", qfi, dir); } } } } } sm_ag_if_ans_t ans = {.type = CTRL_OUTCOME_SM_AG_IF_ANS_V0}; ans.ctrl_out.type = RAN_CTRL_V1_3_AGENT_IF_CTRL_ANS_V0; 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) { 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}; return ans; }