|
|
|
@@ -209,7 +209,7 @@ extern uint16_t slot_ahead;
|
|
|
|
|
void oai_create_enb(void) {
|
|
|
|
|
int bodge_counter=0;
|
|
|
|
|
PHY_VARS_eNB *eNB = RC.eNB[0][0];
|
|
|
|
|
printf("[VNF] RC.eNB[0][0]. Mod_id:%d CC_id:%d nb_CC[0]:%d abstraction_flag:%d single_thread_flag:%d if_inst:%p\n", eNB->Mod_id, eNB->CC_id, RC.nb_CC[0], eNB->abstraction_flag,
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] RC.eNB[0][0]. Mod_id:%d CC_id:%d nb_CC[0]:%d abstraction_flag:%d single_thread_flag:%d if_inst:%p\n", eNB->Mod_id, eNB->CC_id, RC.nb_CC[0], eNB->abstraction_flag,
|
|
|
|
|
eNB->single_thread_flag, eNB->if_inst);
|
|
|
|
|
eNB->Mod_id = bodge_counter;
|
|
|
|
|
eNB->CC_id = bodge_counter;
|
|
|
|
@@ -225,20 +225,20 @@ void oai_create_enb(void) {
|
|
|
|
|
// that will result in eNB->configured being set to TRUE.
|
|
|
|
|
// See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values
|
|
|
|
|
if (RC.eNB[0][0]->if_inst==0 || RC.eNB[0][0]->if_inst->PHY_config_req==0 || RC.eNB[0][0]->if_inst->schedule_response==0) {
|
|
|
|
|
printf("RC.eNB[0][0]->if_inst->PHY_config_req is not installed - install it\n");
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.eNB[0][0]->if_inst->PHY_config_req is not installed - install it\n");
|
|
|
|
|
install_schedule_handlers(RC.eNB[0][0]->if_inst);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
printf("%s() Waiting for eNB to become configured (by RRC/PHY) - need to wait otherwise NFAPI messages won't contain correct values\n", __FUNCTION__);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Waiting for eNB to become configured (by RRC/PHY) - need to wait otherwise NFAPI messages won't contain correct values\n", __FUNCTION__);
|
|
|
|
|
usleep(50000);
|
|
|
|
|
} while(eNB->configured != 1);
|
|
|
|
|
|
|
|
|
|
printf("%s() eNB is now configured\n", __FUNCTION__);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() eNB is now configured\n", __FUNCTION__);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void oai_enb_init(void) {
|
|
|
|
|
printf("%s() About to call init_eNB_afterRU()\n", __FUNCTION__);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() About to call init_eNB_afterRU()\n", __FUNCTION__);
|
|
|
|
|
init_eNB_afterRU();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -275,20 +275,20 @@ void oai_create_gnb(void) {
|
|
|
|
|
// that will result in gNB->configured being set to TRUE.
|
|
|
|
|
// See we need to wait for that to happen otherwise the NFAPI message exchanges won't contain the right parameter values
|
|
|
|
|
if (RC.gNB[0]->if_inst==0 || RC.gNB[0]->if_inst->NR_PHY_config_req==0 || RC.gNB[0]->if_inst->NR_Schedule_response==0) {
|
|
|
|
|
printf("RC.gNB[0][0]->if_inst->NR_PHY_config_req is not installed - install it\n");
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.gNB[0][0]->if_inst->NR_PHY_config_req is not installed - install it\n");
|
|
|
|
|
install_nr_schedule_handlers(RC.gNB[0]->if_inst);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
printf("%s() Waiting for gNB to become configured (by RRC/PHY) - need to wait otherwise NFAPI messages won't contain correct values\n", __FUNCTION__);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() Waiting for gNB to become configured (by RRC/PHY) - need to wait otherwise NFAPI messages won't contain correct values\n", __FUNCTION__);
|
|
|
|
|
usleep(50000);
|
|
|
|
|
} while(gNB->configured != 1);
|
|
|
|
|
|
|
|
|
|
printf("%s() gNB is now configured\n", __FUNCTION__);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s() gNB is now configured\n", __FUNCTION__);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int pnf_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
|
|
|
|
printf("[VNF] pnf connection indication idx:%d\n", p5_idx);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf connection indication idx:%d\n", p5_idx);
|
|
|
|
|
oai_create_enb();
|
|
|
|
|
nfapi_pnf_param_request_t req;
|
|
|
|
|
memset(&req, 0, sizeof(req));
|
|
|
|
@@ -298,7 +298,7 @@ int pnf_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int pnf_nr_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
|
|
|
|
printf("[VNF] pnf connection indication idx:%d\n", p5_idx);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf connection indication idx:%d\n", p5_idx);
|
|
|
|
|
oai_create_gnb();
|
|
|
|
|
nfapi_nr_pnf_param_request_t req;
|
|
|
|
|
memset(&req, 0, sizeof(req));
|
|
|
|
@@ -308,7 +308,7 @@ int pnf_nr_connection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int pnf_disconnection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
|
|
|
|
printf("[VNF] pnf disconnection indication idx:%d\n", p5_idx);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf disconnection indication idx:%d\n", p5_idx);
|
|
|
|
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
|
|
|
|
pnf_info *pnf = vnf->pnfs;
|
|
|
|
|
phy_info *phy = pnf->phys;
|
|
|
|
@@ -318,7 +318,7 @@ int pnf_disconnection_indication_cb(nfapi_vnf_config_t *config, int p5_idx) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int pnf_nr_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_param_response_t *resp) {
|
|
|
|
|
printf("[VNF] pnf param response idx:%d error:%d\n", p5_idx, resp->error_code);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf param response idx:%d error:%d\n", p5_idx, resp->error_code);
|
|
|
|
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
|
|
|
|
pnf_info *pnf = vnf->pnfs;
|
|
|
|
|
|
|
|
|
@@ -326,11 +326,11 @@ int pnf_nr_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_pa
|
|
|
|
|
phy_info phy;
|
|
|
|
|
memset(&phy,0,sizeof(phy));
|
|
|
|
|
phy.index = resp->pnf_phy.phy[i].phy_config_index;
|
|
|
|
|
printf("[VNF] (PHY:%d) phy_config_idx:%d\n", i, resp->pnf_phy.phy[i].phy_config_index);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] (PHY:%d) phy_config_idx:%d\n", i, resp->pnf_phy.phy[i].phy_config_index);
|
|
|
|
|
nfapi_vnf_allocate_phy(config, p5_idx, &(phy.id));
|
|
|
|
|
|
|
|
|
|
for(int j = 0; j < resp->pnf_phy.phy[i].number_of_rfs; ++j) {
|
|
|
|
|
printf("[VNF] (PHY:%d) (RF%d) %d\n", i, j, resp->pnf_phy.phy[i].rf_config[j].rf_config_index);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] (PHY:%d) (RF%d) %d\n", i, j, resp->pnf_phy.phy[i].rf_config[j].rf_config_index);
|
|
|
|
|
phy.rfs[0] = resp->pnf_phy.phy[i].rf_config[j].rf_config_index;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -341,7 +341,7 @@ int pnf_nr_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_pa
|
|
|
|
|
req.header.message_id = NFAPI_PNF_CONFIG_REQUEST;
|
|
|
|
|
req.pnf_phy_rf_config.tl.tag = NFAPI_PNF_PHY_RF_TAG;
|
|
|
|
|
req.pnf_phy_rf_config.number_phy_rf_config_info = 2; // DJP pnf.phys.size();
|
|
|
|
|
printf("DJP:Hard coded num phy rf to 2\n");
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "DJP:Hard coded num phy rf to 2\n");
|
|
|
|
|
|
|
|
|
|
for(unsigned i = 0; i < 2; ++i) {
|
|
|
|
|
req.pnf_phy_rf_config.phy_rf_config[i].phy_id = pnf->phys[i].id;
|
|
|
|
@@ -354,7 +354,7 @@ int pnf_nr_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_pa
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int pnf_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_param_response_t *resp) {
|
|
|
|
|
printf("[VNF] pnf param response idx:%d error:%d\n", p5_idx, resp->error_code);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf param response idx:%d error:%d\n", p5_idx, resp->error_code);
|
|
|
|
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
|
|
|
|
pnf_info *pnf = vnf->pnfs;
|
|
|
|
|
|
|
|
|
@@ -362,11 +362,11 @@ int pnf_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_param_re
|
|
|
|
|
phy_info phy;
|
|
|
|
|
memset(&phy,0,sizeof(phy));
|
|
|
|
|
phy.index = resp->pnf_phy.phy[i].phy_config_index;
|
|
|
|
|
printf("[VNF] (PHY:%d) phy_config_idx:%d\n", i, resp->pnf_phy.phy[i].phy_config_index);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] (PHY:%d) phy_config_idx:%d\n", i, resp->pnf_phy.phy[i].phy_config_index);
|
|
|
|
|
nfapi_vnf_allocate_phy(config, p5_idx, &(phy.id));
|
|
|
|
|
|
|
|
|
|
for(int j = 0; j < resp->pnf_phy.phy[i].number_of_rfs; ++j) {
|
|
|
|
|
printf("[VNF] (PHY:%d) (RF%d) %d\n", i, j, resp->pnf_phy.phy[i].rf_config[j].rf_config_index);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] (PHY:%d) (RF%d) %d\n", i, j, resp->pnf_phy.phy[i].rf_config[j].rf_config_index);
|
|
|
|
|
phy.rfs[0] = resp->pnf_phy.phy[i].rf_config[j].rf_config_index;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -376,7 +376,7 @@ int pnf_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_param_re
|
|
|
|
|
rf_info rf;
|
|
|
|
|
memset(&rf,0,sizeof(rf));
|
|
|
|
|
rf.index = resp->pnf_rf.rf[i].rf_config_index;
|
|
|
|
|
printf("[VNF] (RF:%d) rf_config_idx:%d\n", i, resp->pnf_rf.rf[i].rf_config_index);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] (RF:%d) rf_config_idx:%d\n", i, resp->pnf_rf.rf[i].rf_config_index);
|
|
|
|
|
pnf->rfs[0] = rf;
|
|
|
|
|
}
|
|
|
|
|
nfapi_pnf_config_request_t req;
|
|
|
|
@@ -384,7 +384,7 @@ int pnf_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_param_re
|
|
|
|
|
req.header.message_id = NFAPI_PNF_CONFIG_REQUEST;
|
|
|
|
|
req.pnf_phy_rf_config.tl.tag = NFAPI_PNF_PHY_RF_TAG;
|
|
|
|
|
req.pnf_phy_rf_config.number_phy_rf_config_info = 2; // DJP pnf.phys.size();
|
|
|
|
|
printf("DJP:Hard coded num phy rf to 2\n");
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "DJP:Hard coded num phy rf to 2\n");
|
|
|
|
|
|
|
|
|
|
for(unsigned i = 0; i < 2; ++i) {
|
|
|
|
|
req.pnf_phy_rf_config.phy_rf_config[i].phy_id = pnf->phys[i].id;
|
|
|
|
@@ -397,7 +397,7 @@ int pnf_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_param_re
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int pnf_nr_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_config_response_t *resp) {
|
|
|
|
|
printf("[VNF] pnf config response idx:%d resp[header[phy_id:%u message_id:%02x message_length:%u]]\n", p5_idx, resp->header.phy_id, resp->header.message_id, resp->header.message_length);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf config response idx:%d resp[header[phy_id:%u message_id:%02x message_length:%u]]\n", p5_idx, resp->header.phy_id, resp->header.message_id, resp->header.message_length);
|
|
|
|
|
|
|
|
|
|
if(1) {
|
|
|
|
|
nfapi_nr_pnf_start_request_t req;
|
|
|
|
@@ -422,7 +422,7 @@ int pnf_nr_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_c
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int pnf_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_config_response_t *resp) {
|
|
|
|
|
printf("[VNF] pnf config response idx:%d resp[header[phy_id:%u message_id:%02x message_length:%u]]\n", p5_idx, resp->header.phy_id, resp->header.message_id, resp->header.message_length);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf config response idx:%d resp[header[phy_id:%u message_id:%02x message_length:%u]]\n", p5_idx, resp->header.phy_id, resp->header.message_id, resp->header.message_length);
|
|
|
|
|
|
|
|
|
|
if(1) {
|
|
|
|
|
nfapi_pnf_start_request_t req;
|
|
|
|
@@ -449,12 +449,12 @@ int pnf_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_config_
|
|
|
|
|
int wake_gNB_rxtx(PHY_VARS_gNB *gNB, uint16_t sfn, uint16_t slot) {
|
|
|
|
|
struct timespec curr_t;
|
|
|
|
|
clock_gettime(CLOCK_MONOTONIC,&curr_t);
|
|
|
|
|
//printf("\n wake_gNB_rxtx before assignment sfn:%d slot:%d TIME %d.%d",sfn,slot,curr_t.tv_sec,curr_t.tv_nsec);
|
|
|
|
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "\n wake_gNB_rxtx before assignment sfn:%d slot:%d TIME %d.%d",sfn,slot,curr_t.tv_sec,curr_t.tv_nsec);
|
|
|
|
|
gNB_L1_proc_t *proc=&gNB->proc;
|
|
|
|
|
gNB_L1_rxtx_proc_t *L1_proc= (slot&1)? &proc->L1_proc : &proc->L1_proc_tx;
|
|
|
|
|
|
|
|
|
|
NR_DL_FRAME_PARMS *fp = &gNB->frame_parms;
|
|
|
|
|
//printf("%s(eNB:%p, sfn:%d, sf:%d)\n", __FUNCTION__, eNB, sfn, sf);
|
|
|
|
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(eNB:%p, sfn:%d, sf:%d)\n", __FUNCTION__, eNB, sfn, sf);
|
|
|
|
|
//int i;
|
|
|
|
|
struct timespec wait;
|
|
|
|
|
clock_gettime(CLOCK_REALTIME, &wait);
|
|
|
|
@@ -477,7 +477,7 @@ int wake_gNB_rxtx(PHY_VARS_gNB *gNB, uint16_t sfn, uint16_t slot) {
|
|
|
|
|
// Try to be 1 frame back
|
|
|
|
|
old_slot = slot;
|
|
|
|
|
old_sfn = sfn;
|
|
|
|
|
//printf("\n wake_gNB_rxtx after assignment sfn:%d slot:%d",proc->frame_rx,proc->slot_rx);
|
|
|
|
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "\n wake_gNB_rxtx after assignment sfn:%d slot:%d",proc->frame_rx,proc->slot_rx);
|
|
|
|
|
if (old_slot == 0 && old_sfn % 100 == 0) LOG_W( PHY,"[gNB] sfn/slot:%d%d old_sfn/slot:%d%d proc[rx:%d%d]\n", sfn, slot, old_sfn, old_slot, proc->frame_rx, proc->slot_rx);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -496,7 +496,7 @@ int wake_gNB_rxtx(PHY_VARS_gNB *gNB, uint16_t sfn, uint16_t slot) {
|
|
|
|
|
L1_proc->slot_tx = (L1_proc->slot_rx + slot_ahead)%20;
|
|
|
|
|
|
|
|
|
|
//LOG_I(PHY, "sfn/sf:%d%d proc[rx:%d%d] rx:%d%d] About to wake rxtx thread\n\n", sfn, slot, proc->frame_rx, proc->slot_rx, L1_proc->frame_rx, L1_proc->slot_rx);
|
|
|
|
|
//printf("\nEntering wake_gNB_rxtx sfn %d slot %d\n",L1_proc->frame_rx,L1_proc->slot_rx);
|
|
|
|
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "\nEntering wake_gNB_rxtx sfn %d slot %d\n",L1_proc->frame_rx,L1_proc->slot_rx);
|
|
|
|
|
// the thread can now be woken up
|
|
|
|
|
if (pthread_cond_signal(&L1_proc->cond) != 0) {
|
|
|
|
|
LOG_E( PHY, "[gNB] ERROR pthread_cond_signal for gNB RXn-TXnp4 thread\n");
|
|
|
|
@@ -514,7 +514,7 @@ int wake_eNB_rxtx(PHY_VARS_eNB *eNB, uint16_t sfn, uint16_t sf) {
|
|
|
|
|
L1_proc_t *proc=&eNB->proc;
|
|
|
|
|
L1_rxtx_proc_t *L1_proc= (sf&1)? &proc->L1_proc : &proc->L1_proc_tx;
|
|
|
|
|
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
|
|
|
|
//printf("%s(eNB:%p, sfn:%d, sf:%d)\n", __FUNCTION__, eNB, sfn, sf);
|
|
|
|
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "%s(eNB:%p, sfn:%d, sf:%d)\n", __FUNCTION__, eNB, sfn, sf);
|
|
|
|
|
//int i;
|
|
|
|
|
struct timespec wait;
|
|
|
|
|
wait.tv_sec=0;
|
|
|
|
@@ -602,11 +602,11 @@ extern pthread_mutex_t nfapi_sync_mutex;
|
|
|
|
|
extern int nfapi_sync_var;
|
|
|
|
|
|
|
|
|
|
int phy_sync_indication(struct nfapi_vnf_p7_config *config, uint8_t sync) {
|
|
|
|
|
//printf("[VNF] SYNC %s\n", sync==1 ? "ACHIEVED" : "LOST");
|
|
|
|
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] SYNC %s\n", sync==1 ? "ACHIEVED" : "LOST");
|
|
|
|
|
|
|
|
|
|
if (sync==1 && nfapi_sync_var!=0) {
|
|
|
|
|
|
|
|
|
|
printf("[VNF] Signal to OAI main code that it can go\n");
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Signal to OAI main code that it can go\n");
|
|
|
|
|
pthread_mutex_lock(&nfapi_sync_mutex);
|
|
|
|
|
nfapi_sync_var=0;
|
|
|
|
|
pthread_cond_broadcast(&nfapi_sync_cond);
|
|
|
|
@@ -623,7 +623,7 @@ int phy_slot_indication(struct nfapi_vnf_p7_config *config, uint16_t phy_id, uin
|
|
|
|
|
static uint8_t first_time = 1;
|
|
|
|
|
|
|
|
|
|
if (first_time) {
|
|
|
|
|
printf("[VNF] slot indication %d\n", NFAPI_SFNSLOT2DEC(sfn, slot));
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] slot indication %d\n", NFAPI_SFNSLOT2DEC(sfn, slot));
|
|
|
|
|
first_time = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -635,9 +635,9 @@ int phy_slot_indication(struct nfapi_vnf_p7_config *config, uint16_t phy_id, uin
|
|
|
|
|
LOG_D(PHY,"[VNF] slot indication sfn:%d slot:%d\n", sfn, slot);
|
|
|
|
|
wake_gNB_rxtx(RC.gNB[0], sfn, slot); // DONE: find NR equivalent
|
|
|
|
|
} else {
|
|
|
|
|
printf("[VNF] %s() RC.gNB:%p\n", __FUNCTION__, RC.gNB);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() RC.gNB:%p\n", __FUNCTION__, RC.gNB);
|
|
|
|
|
|
|
|
|
|
if (RC.gNB) printf("RC.gNB[0]->configured:%d\n", RC.gNB[0]->configured);
|
|
|
|
|
if (RC.gNB) NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.gNB[0]->configured:%d\n", RC.gNB[0]->configured);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
@@ -647,7 +647,7 @@ int phy_subframe_indication(struct nfapi_vnf_p7_config *config, uint16_t phy_id,
|
|
|
|
|
static uint8_t first_time = 1;
|
|
|
|
|
|
|
|
|
|
if (first_time) {
|
|
|
|
|
printf("[VNF] subframe indication %d\n", NFAPI_SFNSF2DEC(sfn_sf));
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] subframe indication %d\n", NFAPI_SFNSF2DEC(sfn_sf));
|
|
|
|
|
first_time = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -657,9 +657,9 @@ int phy_subframe_indication(struct nfapi_vnf_p7_config *config, uint16_t phy_id,
|
|
|
|
|
//LOG_D(PHY,"[VNF] subframe indication sfn_sf:%d sfn:%d sf:%d\n", sfn_sf, sfn, sf);
|
|
|
|
|
wake_eNB_rxtx(RC.eNB[0][0], sfn, sf);
|
|
|
|
|
} else {
|
|
|
|
|
printf("[VNF] %s() RC.eNB:%p\n", __FUNCTION__, RC.eNB);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s() RC.eNB:%p\n", __FUNCTION__, RC.eNB);
|
|
|
|
|
|
|
|
|
|
if (RC.eNB) printf("RC.eNB[0][0]->configured:%d\n", RC.eNB[0][0]->configured);
|
|
|
|
|
if (RC.eNB) NFAPI_TRACE(NFAPI_TRACE_INFO, "RC.eNB[0][0]->configured:%d\n", RC.eNB[0][0]->configured);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
@@ -1231,14 +1231,14 @@ int phy_cqi_indication(struct nfapi_vnf_p7_config *config, nfapi_cqi_indication_
|
|
|
|
|
|
|
|
|
|
int phy_nr_slot_indication(nfapi_nr_slot_indication_scf_t *ind) {
|
|
|
|
|
|
|
|
|
|
uint8_t vnf_slot_ahead = 2;
|
|
|
|
|
uint8_t vnf_slot_ahead = 0;
|
|
|
|
|
uint32_t vnf_sfn_slot = sfnslot_add_slot(ind->sfn, ind->slot, vnf_slot_ahead);
|
|
|
|
|
uint16_t vnf_sfn = NFAPI_SFNSLOT2SFN(vnf_sfn_slot);
|
|
|
|
|
uint8_t vnf_slot = NFAPI_SFNSLOT2SLOT(vnf_sfn_slot); //offsetting the vnf from pnf by vnf_slot_head slots
|
|
|
|
|
uint16_t vnf_sfn = NFAPI_SFNSLOT2SFN(vnf_sfn_slot);
|
|
|
|
|
uint8_t vnf_slot = NFAPI_SFNSLOT2SLOT(vnf_sfn_slot); //offsetting the vnf from pnf by vnf_slot_head slots
|
|
|
|
|
struct PHY_VARS_gNB_s *gNB = RC.gNB[0];
|
|
|
|
|
pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
|
|
|
|
gNB->UL_INFO.frame = vnf_sfn;
|
|
|
|
|
gNB->UL_INFO.slot = vnf_slot;
|
|
|
|
|
gNB->UL_INFO.slot = vnf_slot;
|
|
|
|
|
pthread_mutex_unlock(&gNB->UL_INFO_mutex);
|
|
|
|
|
LOG_D(MAC, "VNF SFN/Slot %d.%d \n", gNB->UL_INFO.frame, gNB->UL_INFO.slot);
|
|
|
|
|
|
|
|
|
@@ -1309,9 +1309,9 @@ void vnf_trace(nfapi_trace_level_t nfapi_level, const char *message, ...) {
|
|
|
|
|
int phy_vendor_ext(struct nfapi_vnf_p7_config *config, nfapi_p7_message_header_t *msg) {
|
|
|
|
|
if(msg->message_id == P7_VENDOR_EXT_IND) {
|
|
|
|
|
//vendor_ext_p7_ind* ind = (vendor_ext_p7_ind*)msg;
|
|
|
|
|
//printf("[VNF] vendor_ext (error_code:%d)\n", ind->error_code);
|
|
|
|
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] vendor_ext (error_code:%d)\n", ind->error_code);
|
|
|
|
|
} else {
|
|
|
|
|
printf("[VNF] unknown %02x\n", msg->message_id);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] unknown %02x\n", msg->message_id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
@@ -1401,7 +1401,7 @@ static pthread_t vnf_start_pthread;
|
|
|
|
|
static pthread_t vnf_p7_start_pthread;
|
|
|
|
|
|
|
|
|
|
void *vnf_nr_p7_start_thread(void *ptr) {
|
|
|
|
|
printf("%s()\n", __FUNCTION__);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__);
|
|
|
|
|
pthread_setname_np(pthread_self(), "VNF_P7");
|
|
|
|
|
nfapi_vnf_p7_config_t *config = (nfapi_vnf_p7_config_t *)ptr;
|
|
|
|
|
nfapi_nr_vnf_p7_start(config);
|
|
|
|
@@ -1409,7 +1409,7 @@ void *vnf_nr_p7_start_thread(void *ptr) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void *vnf_p7_start_thread(void *ptr) {
|
|
|
|
|
printf("%s()\n", __FUNCTION__);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "%s()\n", __FUNCTION__);
|
|
|
|
|
pthread_setname_np(pthread_self(), "VNF_P7");
|
|
|
|
|
nfapi_vnf_p7_config_t *config = (nfapi_vnf_p7_config_t *)ptr;
|
|
|
|
|
nfapi_vnf_p7_start(config);
|
|
|
|
@@ -1501,7 +1501,7 @@ int pnf_nr_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_st
|
|
|
|
|
vnf_p7_info *p7_vnf = vnf->p7_vnfs;
|
|
|
|
|
pnf_info *pnf = vnf->pnfs;
|
|
|
|
|
nfapi_nr_param_request_scf_t req;
|
|
|
|
|
printf("[VNF] pnf start response idx:%d config:%p user_data:%p p7_vnf[config:%p thread_started:%d]\n", p5_idx, config, config->user_data, vnf->p7_vnfs[0].config, vnf->p7_vnfs[0].thread_started);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf start response idx:%d config:%p user_data:%p p7_vnf[config:%p thread_started:%d]\n", p5_idx, config, config->user_data, vnf->p7_vnfs[0].config, vnf->p7_vnfs[0].thread_started);
|
|
|
|
|
|
|
|
|
|
if(p7_vnf->thread_started == 0) {
|
|
|
|
|
pthread_t vnf_p7_thread;
|
|
|
|
@@ -1512,7 +1512,7 @@ int pnf_nr_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_pnf_st
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// start all the phys in the pnf.
|
|
|
|
|
printf("[VNF] Sending NFAPI_VNF_PARAM_REQUEST phy_id:%d\n", pnf->phys[0].id);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Sending NFAPI_VNF_PARAM_REQUEST phy_id:%d\n", pnf->phys[0].id);
|
|
|
|
|
memset(&req, 0, sizeof(req));
|
|
|
|
|
req.header.message_id = NFAPI_NR_PHY_MSG_TYPE_PARAM_REQUEST;
|
|
|
|
|
req.header.phy_id = pnf->phys[0].id;
|
|
|
|
@@ -1525,7 +1525,7 @@ int pnf_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_start_re
|
|
|
|
|
vnf_p7_info *p7_vnf = vnf->p7_vnfs;
|
|
|
|
|
pnf_info *pnf = vnf->pnfs;
|
|
|
|
|
nfapi_param_request_t req;
|
|
|
|
|
printf("[VNF] pnf start response idx:%d config:%p user_data:%p p7_vnf[config:%p thread_started:%d]\n", p5_idx, config, config->user_data, vnf->p7_vnfs[0].config, vnf->p7_vnfs[0].thread_started);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] pnf start response idx:%d config:%p user_data:%p p7_vnf[config:%p thread_started:%d]\n", p5_idx, config, config->user_data, vnf->p7_vnfs[0].config, vnf->p7_vnfs[0].thread_started);
|
|
|
|
|
|
|
|
|
|
if(p7_vnf->thread_started == 0) {
|
|
|
|
|
pthread_t vnf_p7_thread;
|
|
|
|
@@ -1536,7 +1536,7 @@ int pnf_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_pnf_start_re
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// start all the phys in the pnf.
|
|
|
|
|
printf("[VNF] Sending NFAPI_VNF_PARAM_REQUEST phy_id:%d\n", pnf->phys[0].id);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Sending NFAPI_VNF_PARAM_REQUEST phy_id:%d\n", pnf->phys[0].id);
|
|
|
|
|
memset(&req, 0, sizeof(req));
|
|
|
|
|
req.header.message_id = NFAPI_PARAM_REQUEST;
|
|
|
|
|
req.header.phy_id = pnf->phys[0].id;
|
|
|
|
@@ -1548,7 +1548,7 @@ extern uint32_t to_earfcn(int eutra_bandP,uint32_t dl_CarrierFreq,uint32_t bw);
|
|
|
|
|
|
|
|
|
|
int nr_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_param_response_scf_t *resp) {
|
|
|
|
|
|
|
|
|
|
printf("[VNF] Received NFAPI_PARAM_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_PARAM_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
|
|
|
|
vnf_p7_info *p7_vnf = vnf->p7_vnfs;
|
|
|
|
|
pnf_info *pnf = vnf->pnfs;
|
|
|
|
@@ -1560,26 +1560,26 @@ int nr_param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_param_resp
|
|
|
|
|
memcpy(&pnf_p7_sockaddr.sin_addr.s_addr, &(resp->nfapi_config.p7_pnf_address_ipv4.address[0]), 4);
|
|
|
|
|
phy->remote_addr = inet_ntoa(pnf_p7_sockaddr.sin_addr);
|
|
|
|
|
// for now just 1
|
|
|
|
|
printf("[VNF] %d.%d pnf p7 %s:%d timing %u %u %u %u\n", p5_idx, phy->id, phy->remote_addr, phy->remote_port, p7_vnf->timing_window, p7_vnf->periodic_timing_period, p7_vnf->aperiodic_timing_enabled,
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %d.%d pnf p7 %s:%d timing %u %u %u %u\n", p5_idx, phy->id, phy->remote_addr, phy->remote_port, p7_vnf->timing_window, p7_vnf->periodic_timing_period, p7_vnf->aperiodic_timing_enabled,
|
|
|
|
|
p7_vnf->periodic_timing_period);
|
|
|
|
|
req->header.message_id = NFAPI_NR_PHY_MSG_TYPE_CONFIG_REQUEST;
|
|
|
|
|
req->header.phy_id = phy->id;
|
|
|
|
|
printf("[VNF] Send NFAPI_CONFIG_REQUEST\n");
|
|
|
|
|
//printf("\n NR bandP =%d\n",req->nfapi_config.rf_bands.rf_band[0]);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Send NFAPI_CONFIG_REQUEST\n");
|
|
|
|
|
//NFAPI_TRACE(NFAPI_TRACE_INFO, "\n NR bandP =%d\n",req->nfapi_config.rf_bands.rf_band[0]);
|
|
|
|
|
|
|
|
|
|
req->nfapi_config.p7_vnf_port.tl.tag = NFAPI_NR_NFAPI_P7_VNF_PORT_TAG;
|
|
|
|
|
req->nfapi_config.p7_vnf_port.value = p7_vnf->local_port;
|
|
|
|
|
req->num_tlv++;
|
|
|
|
|
printf("[VNF] DJP local_port:%d\n", p7_vnf->local_port);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] DJP local_port:%d\n", p7_vnf->local_port);
|
|
|
|
|
req->nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NR_NFAPI_P7_VNF_ADDRESS_IPV4_TAG;
|
|
|
|
|
struct sockaddr_in vnf_p7_sockaddr;
|
|
|
|
|
vnf_p7_sockaddr.sin_addr.s_addr = inet_addr(p7_vnf->local_addr);
|
|
|
|
|
memcpy(&(req->nfapi_config.p7_vnf_address_ipv4.address[0]), &vnf_p7_sockaddr.sin_addr.s_addr, 4);
|
|
|
|
|
req->num_tlv++;
|
|
|
|
|
printf("[VNF] DJP local_addr:%s\n", p7_vnf->local_addr);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] DJP local_addr:%s\n", p7_vnf->local_addr);
|
|
|
|
|
req->nfapi_config.timing_window.tl.tag = NFAPI_NR_NFAPI_TIMING_WINDOW_TAG;
|
|
|
|
|
req->nfapi_config.timing_window.value = p7_vnf->timing_window;
|
|
|
|
|
printf("\n[VNF]Timing window tag : %d Timing window:%u\n",NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, p7_vnf->timing_window);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "\n[VNF]Timing window tag : %d Timing window:%u\n",NFAPI_NR_NFAPI_TIMING_WINDOW_TAG, p7_vnf->timing_window);
|
|
|
|
|
req->num_tlv++;
|
|
|
|
|
|
|
|
|
|
if(p7_vnf->periodic_timing_enabled || p7_vnf->aperiodic_timing_enabled) {
|
|
|
|
@@ -1611,7 +1611,7 @@ req->nfapi_config.tx_data_timing_offset.tl.tag = NFAPI_NR_NFAPI_TX_DATA_TIMING_O
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_param_response_t *resp) {
|
|
|
|
|
printf("[VNF] Received NFAPI_PARAM_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_PARAM_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
|
|
|
|
vnf_p7_info *p7_vnf = vnf->p7_vnfs;
|
|
|
|
|
pnf_info *pnf = vnf->pnfs;
|
|
|
|
@@ -1622,24 +1622,24 @@ int param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_param_response_t
|
|
|
|
|
memcpy(&pnf_p7_sockaddr.sin_addr.s_addr, &(resp->nfapi_config.p7_pnf_address_ipv4.address[0]), 4);
|
|
|
|
|
phy->remote_addr = inet_ntoa(pnf_p7_sockaddr.sin_addr);
|
|
|
|
|
// for now just 1
|
|
|
|
|
printf("[VNF] %d.%d pnf p7 %s:%d timing %u %u %u %u\n", p5_idx, phy->id, phy->remote_addr, phy->remote_port, p7_vnf->timing_window, p7_vnf->periodic_timing_period, p7_vnf->aperiodic_timing_enabled,
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %d.%d pnf p7 %s:%d timing %u %u %u %u\n", p5_idx, phy->id, phy->remote_addr, phy->remote_port, p7_vnf->timing_window, p7_vnf->periodic_timing_period, p7_vnf->aperiodic_timing_enabled,
|
|
|
|
|
p7_vnf->periodic_timing_period);
|
|
|
|
|
req->header.message_id = NFAPI_CONFIG_REQUEST;
|
|
|
|
|
req->header.phy_id = phy->id;
|
|
|
|
|
printf("[VNF] Send NFAPI_CONFIG_REQUEST\n");
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Send NFAPI_CONFIG_REQUEST\n");
|
|
|
|
|
req->nfapi_config.p7_vnf_port.tl.tag = NFAPI_NFAPI_P7_VNF_PORT_TAG;
|
|
|
|
|
req->nfapi_config.p7_vnf_port.value = p7_vnf->local_port;
|
|
|
|
|
req->num_tlv++;
|
|
|
|
|
printf("[VNF] DJP local_port:%d\n", p7_vnf->local_port);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] DJP local_port:%d\n", p7_vnf->local_port);
|
|
|
|
|
req->nfapi_config.p7_vnf_address_ipv4.tl.tag = NFAPI_NFAPI_P7_VNF_ADDRESS_IPV4_TAG;
|
|
|
|
|
struct sockaddr_in vnf_p7_sockaddr;
|
|
|
|
|
vnf_p7_sockaddr.sin_addr.s_addr = inet_addr(p7_vnf->local_addr);
|
|
|
|
|
memcpy(&(req->nfapi_config.p7_vnf_address_ipv4.address[0]), &vnf_p7_sockaddr.sin_addr.s_addr, 4);
|
|
|
|
|
req->num_tlv++;
|
|
|
|
|
printf("[VNF] DJP local_addr:%s\n", p7_vnf->local_addr);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] DJP local_addr:%s\n", p7_vnf->local_addr);
|
|
|
|
|
req->nfapi_config.timing_window.tl.tag = NFAPI_NFAPI_TIMING_WINDOW_TAG;
|
|
|
|
|
req->nfapi_config.timing_window.value = p7_vnf->timing_window;
|
|
|
|
|
printf("[VNF] Timing window:%u\n", p7_vnf->timing_window);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Timing window:%u\n", p7_vnf->timing_window);
|
|
|
|
|
req->num_tlv++;
|
|
|
|
|
|
|
|
|
|
if(p7_vnf->periodic_timing_enabled || p7_vnf->aperiodic_timing_enabled) {
|
|
|
|
@@ -1666,32 +1666,31 @@ int param_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_param_response_t
|
|
|
|
|
|
|
|
|
|
int nr_config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_config_response_scf_t *resp) {
|
|
|
|
|
nfapi_nr_start_request_scf_t req;
|
|
|
|
|
printf("[VNF] Received NFAPI_CONFIG_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
printf("[VNF] Calling oai_enb_init()\n");
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_CONFIG_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Calling oai_enb_init()\n");
|
|
|
|
|
oai_enb_init(); // TODO: change to gnb
|
|
|
|
|
memset(&req, 0, sizeof(req));
|
|
|
|
|
req.header.message_id = NFAPI_NR_PHY_MSG_TYPE_START_REQUEST;
|
|
|
|
|
req.header.phy_id = resp->header.phy_id;
|
|
|
|
|
nfapi_nr_vnf_start_req(config, p5_idx, &req);
|
|
|
|
|
printf("[VNF] Send NFAPI_VNF_START_REQUEST idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int config_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_config_response_t *resp) {
|
|
|
|
|
nfapi_start_request_t req;
|
|
|
|
|
printf("[VNF] Received NFAPI_CONFIG_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
printf("[VNF] Calling oai_enb_init()\n");
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_CONFIG_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Calling oai_enb_init()\n");
|
|
|
|
|
oai_enb_init();
|
|
|
|
|
memset(&req, 0, sizeof(req));
|
|
|
|
|
req.header.message_id = NFAPI_START_REQUEST;
|
|
|
|
|
req.header.phy_id = resp->header.phy_id;
|
|
|
|
|
nfapi_vnf_start_req(config, p5_idx, &req);
|
|
|
|
|
printf("[VNF] Send NFAPI_START_REQUEST idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Send NFAPI_VNF_START_REQUEST idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_start_response_t *resp) {
|
|
|
|
|
printf("[VNF] Received NFAPI_START_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_START_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
|
|
|
|
pnf_info *pnf = vnf->pnfs;
|
|
|
|
|
phy_info *phy = pnf->phys;
|
|
|
|
@@ -1701,7 +1700,7 @@ int start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_start_response_t
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int nr_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_start_response_scf_t *resp) {
|
|
|
|
|
printf("[VNF] Received NFAPI_START_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] Received NFAPI_START_RESP idx:%d phy_id:%d\n", p5_idx, resp->header.phy_id);
|
|
|
|
|
vnf_info *vnf = (vnf_info *)(config->user_data);
|
|
|
|
|
pnf_info *pnf = vnf->pnfs;
|
|
|
|
|
phy_info *phy = pnf->phys;
|
|
|
|
@@ -1712,12 +1711,12 @@ int nr_start_resp_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_nr_start_resp
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int vendor_ext_cb(nfapi_vnf_config_t *config, int p5_idx, nfapi_p4_p5_message_header_t *msg) {
|
|
|
|
|
printf("[VNF] %s\n", __FUNCTION__);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] %s\n", __FUNCTION__);
|
|
|
|
|
|
|
|
|
|
switch(msg->message_id) {
|
|
|
|
|
case P5_VENDOR_EXT_RSP: {
|
|
|
|
|
vendor_ext_p5_rsp *rsp = (vendor_ext_p5_rsp *)msg;
|
|
|
|
|
printf("[VNF] P5_VENDOR_EXT_RSP error_code:%d\n", rsp->error_code);
|
|
|
|
|
NFAPI_TRACE(NFAPI_TRACE_INFO, "[VNF] P5_VENDOR_EXT_RSP error_code:%d\n", rsp->error_code);
|
|
|
|
|
// send the start request
|
|
|
|
|
nfapi_pnf_start_request_t req;
|
|
|
|
|
memset(&req, 0, sizeof(req));
|
|
|
|
|