Use F1 UE context setup/mod Response in stack
Similarly to the commit "Use F1 UE context setup/modif Request in stack", we do both UE context setup/modification response at once because of some functions that are shared by the MAC message handler.
This commit is contained in:
@@ -57,9 +57,9 @@ MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_REQUIRED, MESSAGE_PRIORITY_MED, f1ap_ue
|
||||
MESSAGE_DEF(F1AP_DL_RRC_MESSAGE , MESSAGE_PRIORITY_MED, f1ap_dl_rrc_message_t , f1ap_dl_rrc_message )
|
||||
//MESSAGE_DEF(F1AP_INITIAL_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED, f1ap_initial_context_setup_req_t , f1ap_initial_context_setup_req )
|
||||
MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_REQ, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_req_t, f1ap_ue_context_setup_req)
|
||||
MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_t, f1ap_ue_context_setup_resp)
|
||||
MESSAGE_DEF(F1AP_UE_CONTEXT_SETUP_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_setup_resp_t, f1ap_ue_context_setup_resp)
|
||||
MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_REQ, MESSAGE_PRIORITY_MED, f1ap_ue_context_mod_req_t, f1ap_ue_context_mod_req)
|
||||
MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_modif_resp_t, f1ap_ue_context_modification_resp)
|
||||
MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_RESP, MESSAGE_PRIORITY_MED, f1ap_ue_context_mod_resp_t, f1ap_ue_context_modification_resp)
|
||||
MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_CONFIRM, MESSAGE_PRIORITY_MED, f1ap_ue_context_modif_confirm_t, f1ap_ue_context_modification_confirm)
|
||||
MESSAGE_DEF(F1AP_UE_CONTEXT_MODIFICATION_REFUSE, MESSAGE_PRIORITY_MED, f1ap_ue_context_modif_refuse_t, f1ap_ue_context_modification_refuse)
|
||||
|
||||
|
||||
@@ -418,40 +418,6 @@ typedef struct f1ap_drb_information_s {
|
||||
} f1ap_drb_information_t;
|
||||
|
||||
typedef enum f1ap_rlc_mode_t { F1AP_RLC_MODE_AM, F1AP_RLC_MODE_UM_BIDIR, F1AP_RLC_UM_UNI_UL, F1AP_RLC_UM_UNI_DL } f1ap_rlc_mode_t;
|
||||
typedef struct f1ap_drb_to_be_setup_s {
|
||||
long drb_id;
|
||||
f1ap_up_tnl_t up_ul_tnl[2];
|
||||
uint8_t up_ul_tnl_length;
|
||||
f1ap_up_tnl_t up_dl_tnl[2];
|
||||
uint8_t up_dl_tnl_length;
|
||||
f1ap_drb_information_t drb_info;
|
||||
f1ap_rlc_mode_t rlc_mode;
|
||||
nssai_t nssai;
|
||||
} f1ap_drb_to_be_setup_t;
|
||||
|
||||
typedef struct f1ap_srb_to_be_setup_s {
|
||||
long srb_id;
|
||||
uint8_t lcid;
|
||||
} f1ap_srb_to_be_setup_t;
|
||||
|
||||
typedef struct f1ap_rb_failed_to_be_setup_s {
|
||||
long rb_id;
|
||||
} f1ap_rb_failed_to_be_setup_t;
|
||||
|
||||
typedef struct f1ap_drb_to_be_released_t {
|
||||
long rb_id;
|
||||
} f1ap_drb_to_be_released_t;
|
||||
|
||||
typedef struct cu_to_du_rrc_information_s {
|
||||
uint8_t * cG_ConfigInfo;
|
||||
uint32_t cG_ConfigInfo_length;
|
||||
uint8_t * uE_CapabilityRAT_ContainerList;
|
||||
uint32_t uE_CapabilityRAT_ContainerList_length;
|
||||
uint8_t * measConfig;
|
||||
uint32_t measConfig_length;
|
||||
uint8_t *handoverPreparationInfo;
|
||||
uint32_t handoverPreparationInfo_length;
|
||||
}cu_to_du_rrc_information_t;
|
||||
|
||||
typedef struct f1ap_cu_to_du_rrc_info_s {
|
||||
byte_array_t *cg_configinfo;
|
||||
@@ -474,11 +440,6 @@ typedef struct du_to_cu_rrc_information_s {
|
||||
uint32_t requestedP_MaxFR1_length;
|
||||
}du_to_cu_rrc_information_t;
|
||||
|
||||
typedef enum QoS_information_e {
|
||||
NG_RAN_QoS = 0,
|
||||
EUTRAN_QoS = 1,
|
||||
} QoS_information_t;
|
||||
|
||||
typedef enum ReconfigurationCompl_e {
|
||||
RRCreconf_info_not_present = 0,
|
||||
RRCreconf_failure = 1,
|
||||
@@ -658,40 +619,6 @@ typedef struct f1ap_ue_context_mod_resp {
|
||||
f1ap_srb_setup_t *srbs;
|
||||
} f1ap_ue_context_mod_resp_t;
|
||||
|
||||
typedef struct f1ap_ue_context_setup_s {
|
||||
uint32_t gNB_CU_ue_id;
|
||||
uint32_t gNB_DU_ue_id;
|
||||
// SpCell Info
|
||||
plmn_id_t plmn;
|
||||
uint64_t nr_cellid;
|
||||
uint8_t servCellIndex;
|
||||
uint8_t *cellULConfigured;
|
||||
uint32_t servCellId;
|
||||
cu_to_du_rrc_information_t *cu_to_du_rrc_information;
|
||||
uint8_t cu_to_du_rrc_information_length;
|
||||
//uint8_t *du_to_cu_rrc_information;
|
||||
du_to_cu_rrc_information_t *du_to_cu_rrc_information;
|
||||
uint32_t du_to_cu_rrc_information_length;
|
||||
uint16_t *crnti;
|
||||
f1ap_drb_to_be_setup_t *drbs_to_be_setup;
|
||||
uint8_t drbs_to_be_setup_length;
|
||||
f1ap_drb_to_be_setup_t *drbs_to_be_modified;
|
||||
uint8_t drbs_to_be_modified_length;
|
||||
QoS_information_t QoS_information_type;
|
||||
uint8_t drbs_failed_to_be_setup_length;
|
||||
f1ap_rb_failed_to_be_setup_t *drbs_failed_to_be_setup;
|
||||
f1ap_srb_to_be_setup_t *srbs_to_be_setup;
|
||||
uint8_t srbs_to_be_setup_length;
|
||||
uint8_t srbs_failed_to_be_setup_length;
|
||||
uint8_t drbs_to_be_released_length;
|
||||
f1ap_drb_to_be_released_t *drbs_to_be_released;
|
||||
f1ap_rb_failed_to_be_setup_t *srbs_failed_to_be_setup;
|
||||
ReconfigurationCompl_t ReconfigComplOutcome;
|
||||
uint8_t *rrc_container;
|
||||
int rrc_container_length;
|
||||
TransmActionInd_t *transm_action_ind;
|
||||
} f1ap_ue_context_setup_t, f1ap_ue_context_modif_resp_t;
|
||||
|
||||
typedef enum F1ap_Cause_e {
|
||||
F1AP_CAUSE_NOTHING, /* No components present */
|
||||
F1AP_CAUSE_RADIO_NETWORK,
|
||||
|
||||
@@ -69,134 +69,16 @@ int CU_send_UE_CONTEXT_SETUP_REQUEST(sctp_assoc_t assoc_id, const f1ap_ue_contex
|
||||
|
||||
int CU_handle_UE_CONTEXT_SETUP_RESPONSE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu)
|
||||
{
|
||||
MessageDef *msg_p;
|
||||
F1AP_UEContextSetupResponse_t *container;
|
||||
F1AP_UEContextSetupResponseIEs_t *ie;
|
||||
DevAssert(pdu);
|
||||
msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_SETUP_RESP);
|
||||
msg_p->ittiMsgHeader.originInstance = assoc_id;
|
||||
f1ap_ue_context_setup_t *f1ap_ue_context_setup_resp = &F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
||||
container = &pdu->choice.successfulOutcome->value.choice.UEContextSetupResponse;
|
||||
int i;
|
||||
/* GNB_CU_UE_F1AP_ID */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
||||
f1ap_ue_context_setup_resp->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
||||
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_CU_ue_id is: %d \n", f1ap_ue_context_setup_resp->gNB_CU_ue_id);
|
||||
/* GNB_DU_UE_F1AP_ID */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||
f1ap_ue_context_setup_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||
LOG_D(F1AP, "f1ap_ue_context_setup_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_setup_resp->gNB_DU_ue_id);
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container, F1AP_ProtocolIE_ID_id_C_RNTI, false);
|
||||
if (ie) {
|
||||
f1ap_ue_context_setup_resp->crnti = calloc(1, sizeof(uint16_t));
|
||||
*f1ap_ue_context_setup_resp->crnti = ie->value.choice.C_RNTI;
|
||||
}
|
||||
|
||||
// DUtoCURRCInformation
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_DUtoCURRCInformation, true);
|
||||
|
||||
if (ie == NULL) {
|
||||
LOG_E(F1AP,"%s %d: ie is a NULL pointer \n",__FILE__,__LINE__);
|
||||
f1ap_ue_context_setup_resp_t resp = {0};
|
||||
if (!decode_ue_context_setup_resp(pdu, &resp)) {
|
||||
LOG_E(F1AP, "cannot decode F1 UE Context Setup Resp\n");
|
||||
free_ue_context_setup_resp(&resp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
f1ap_ue_context_setup_resp->du_to_cu_rrc_information = (du_to_cu_rrc_information_t *)calloc(1,sizeof(du_to_cu_rrc_information_t));
|
||||
f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
||||
memcpy(f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
||||
f1ap_ue_context_setup_resp->du_to_cu_rrc_information->cellGroupConfig_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
|
||||
// DRBs_Setup_List
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_DRBs_Setup_List, false);
|
||||
|
||||
if(ie!=NULL) {
|
||||
f1ap_ue_context_setup_resp->drbs_to_be_setup_length = ie->value.choice.DRBs_Setup_List.list.count;
|
||||
f1ap_ue_context_setup_resp->drbs_to_be_setup = calloc(f1ap_ue_context_setup_resp->drbs_to_be_setup_length,
|
||||
sizeof(f1ap_drb_to_be_setup_t));
|
||||
AssertFatal(f1ap_ue_context_setup_resp->drbs_to_be_setup,
|
||||
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
||||
|
||||
for (i = 0; i < f1ap_ue_context_setup_resp->drbs_to_be_setup_length; ++i) {
|
||||
f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_setup_resp->drbs_to_be_setup[i];
|
||||
F1AP_DRBs_Setup_Item_t *drbs_setup_item_p;
|
||||
drbs_setup_item_p = &((F1AP_DRBs_Setup_ItemIEs_t *)ie->value.choice.DRBs_Setup_List.list.array[i])->value.choice.DRBs_Setup_Item;
|
||||
drb_p->drb_id = drbs_setup_item_p->dRBID;
|
||||
// TODO in the following, assume only one UP UL TNL is present.
|
||||
// this matches/assumes OAI CU/DU implementation, can be up to 2!
|
||||
drb_p->up_dl_tnl_length = 1;
|
||||
AssertFatal(drbs_setup_item_p->dLUPTNLInformation_ToBeSetup_List.list.count > 0,
|
||||
"no DL UP TNL Information in DRBs to be Setup list\n");
|
||||
F1AP_DLUPTNLInformation_ToBeSetup_Item_t *dl_up_tnl_info_p = (F1AP_DLUPTNLInformation_ToBeSetup_Item_t *)drbs_setup_item_p->dLUPTNLInformation_ToBeSetup_List.list.array[0];
|
||||
F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel;
|
||||
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address);
|
||||
OCTET_STRING_TO_UINT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid);
|
||||
}
|
||||
}
|
||||
|
||||
// SRBs_FailedToBeSetup_List
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_List, false);
|
||||
|
||||
if(ie!=NULL) {
|
||||
f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length = ie->value.choice.SRBs_FailedToBeSetup_List.list.count;
|
||||
f1ap_ue_context_setup_resp->srbs_failed_to_be_setup = calloc(f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length,
|
||||
sizeof(f1ap_rb_failed_to_be_setup_t));
|
||||
AssertFatal(f1ap_ue_context_setup_resp->srbs_failed_to_be_setup,
|
||||
"could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup\n");
|
||||
|
||||
for (i = 0; i < f1ap_ue_context_setup_resp->srbs_failed_to_be_setup_length; ++i) {
|
||||
f1ap_rb_failed_to_be_setup_t *srb_p = &f1ap_ue_context_setup_resp->srbs_failed_to_be_setup[i];
|
||||
srb_p->rb_id = ((F1AP_SRBs_FailedToBeSetup_Item_t *)ie->value.choice.SRBs_FailedToBeSetup_List.list.array[i])->sRBID;
|
||||
}
|
||||
}
|
||||
|
||||
// DRBs_FailedToBeSetup_List
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_List, false);
|
||||
|
||||
if(ie!=NULL) {
|
||||
f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length = ie->value.choice.DRBs_FailedToBeSetup_List.list.count;
|
||||
f1ap_ue_context_setup_resp->drbs_failed_to_be_setup = calloc(f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length,
|
||||
sizeof(f1ap_rb_failed_to_be_setup_t));
|
||||
AssertFatal(f1ap_ue_context_setup_resp->drbs_failed_to_be_setup,
|
||||
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup\n");
|
||||
|
||||
for (i = 0; i < f1ap_ue_context_setup_resp->drbs_failed_to_be_setup_length; ++i) {
|
||||
f1ap_rb_failed_to_be_setup_t *drb_p = &f1ap_ue_context_setup_resp->drbs_failed_to_be_setup[i];
|
||||
drb_p->rb_id = ((F1AP_DRBs_FailedToBeSetup_Item_t *)ie->value.choice.DRBs_FailedToBeSetup_List.list.array[i])->dRBID;
|
||||
}
|
||||
}
|
||||
|
||||
// SCell_FailedtoSetup_List
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_List, false);
|
||||
|
||||
if(ie!=NULL) {
|
||||
LOG_E (F1AP, "Not supporting handling of SCell_FailedtoSetup_List \n");
|
||||
}
|
||||
|
||||
// SRBs_Setup_List
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextSetupResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_SRBs_Setup_List, false);
|
||||
|
||||
if(ie!=NULL) {
|
||||
f1ap_ue_context_setup_resp->srbs_to_be_setup_length = ie->value.choice.SRBs_Setup_List.list.count;
|
||||
f1ap_ue_context_setup_resp->srbs_to_be_setup = calloc(f1ap_ue_context_setup_resp->srbs_to_be_setup_length,
|
||||
sizeof(f1ap_srb_to_be_setup_t));
|
||||
AssertFatal(f1ap_ue_context_setup_resp->srbs_to_be_setup,
|
||||
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
||||
|
||||
for (i = 0; i < f1ap_ue_context_setup_resp->srbs_to_be_setup_length; ++i) {
|
||||
f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_setup_resp->srbs_to_be_setup[i];
|
||||
F1AP_SRBs_Setup_Item_t *srbs_setup_item_p;
|
||||
srbs_setup_item_p = &((F1AP_SRBs_Setup_ItemIEs_t *)ie->value.choice.SRBs_Setup_List.list.array[i])->value.choice.SRBs_Setup_Item;
|
||||
srb_p->srb_id = srbs_setup_item_p->sRBID;
|
||||
srb_p->lcid = srbs_setup_item_p->lCID;
|
||||
}
|
||||
}
|
||||
|
||||
MessageDef *msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_SETUP_RESP);
|
||||
msg_p->ittiMsgHeader.originInstance = assoc_id;
|
||||
F1AP_UE_CONTEXT_SETUP_RESP(msg_p) = resp;
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
|
||||
return 0;
|
||||
}
|
||||
@@ -407,121 +289,15 @@ int CU_send_UE_CONTEXT_MODIFICATION_REQUEST(sctp_assoc_t assoc_id, const f1ap_ue
|
||||
|
||||
int CU_handle_UE_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu)
|
||||
{
|
||||
MessageDef *msg_p;
|
||||
F1AP_UEContextModificationResponse_t *container;
|
||||
F1AP_UEContextModificationResponseIEs_t *ie;
|
||||
DevAssert(pdu);
|
||||
msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
|
||||
f1ap_ue_context_mod_resp_t resp = {0};
|
||||
if (!decode_ue_context_mod_resp(pdu, &resp)) {
|
||||
LOG_E(F1AP, "cannot decode F1 UE Context Modification Response\n");
|
||||
free_ue_context_mod_resp(&resp);
|
||||
return -1;
|
||||
}
|
||||
MessageDef *msg_p = itti_alloc_new_message(TASK_DU_F1, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
|
||||
msg_p->ittiMsgHeader.originInstance = assoc_id;
|
||||
f1ap_ue_context_modif_resp_t *f1ap_ue_context_modification_resp = &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg_p);
|
||||
container = &pdu->choice.successfulOutcome->value.choice.UEContextModificationResponse;
|
||||
int i;
|
||||
|
||||
/* GNB_CU_UE_F1AP_ID */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID, true);
|
||||
f1ap_ue_context_modification_resp->gNB_CU_ue_id = ie->value.choice.GNB_CU_UE_F1AP_ID;
|
||||
|
||||
LOG_D(F1AP, "f1ap_ue_context_modif_resp->gNB_CU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_CU_ue_id);
|
||||
|
||||
/* GNB_DU_UE_F1AP_ID */
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID, true);
|
||||
f1ap_ue_context_modification_resp->gNB_DU_ue_id = ie->value.choice.GNB_DU_UE_F1AP_ID;
|
||||
|
||||
LOG_D(F1AP, "f1ap_ue_context_modification_resp->gNB_DU_ue_id is: %d \n", f1ap_ue_context_modification_resp->gNB_DU_ue_id);
|
||||
|
||||
// DUtoCURRCInformation
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_DUtoCURRCInformation, false);
|
||||
if(ie!=NULL){
|
||||
f1ap_ue_context_modification_resp->du_to_cu_rrc_information = (du_to_cu_rrc_information_t *)calloc(1, sizeof(du_to_cu_rrc_information_t));
|
||||
f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig = (uint8_t *)calloc(1,ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
||||
|
||||
memcpy(f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.buf, ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size);
|
||||
f1ap_ue_context_modification_resp->du_to_cu_rrc_information->cellGroupConfig_length = ie->value.choice.DUtoCURRCInformation.cellGroupConfig.size;
|
||||
}
|
||||
|
||||
// DRBs_SetupMod_List
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List, false);
|
||||
if(ie!=NULL){
|
||||
f1ap_ue_context_modification_resp->drbs_to_be_setup_length = ie->value.choice.DRBs_SetupMod_List.list.count;
|
||||
f1ap_ue_context_modification_resp->drbs_to_be_setup = calloc(f1ap_ue_context_modification_resp->drbs_to_be_setup_length,
|
||||
sizeof(f1ap_drb_to_be_setup_t));
|
||||
AssertFatal(f1ap_ue_context_modification_resp->drbs_to_be_setup,
|
||||
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
||||
for (i = 0; i < f1ap_ue_context_modification_resp->drbs_to_be_setup_length; ++i) {
|
||||
f1ap_drb_to_be_setup_t *drb_p = &f1ap_ue_context_modification_resp->drbs_to_be_setup[i];
|
||||
F1AP_DRBs_SetupMod_Item_t *drbs_setupmod_item_p;
|
||||
drbs_setupmod_item_p = &((F1AP_DRBs_SetupMod_ItemIEs_t *)ie->value.choice.DRBs_SetupMod_List.list.array[i])->value.choice.DRBs_SetupMod_Item;
|
||||
drb_p->drb_id = drbs_setupmod_item_p->dRBID;
|
||||
// TODO in the following, assume only one UP UL TNL is present.
|
||||
// this matches/assumes OAI CU/DU implementation, can be up to 2!
|
||||
drb_p->up_dl_tnl_length = 1;
|
||||
AssertFatal(drbs_setupmod_item_p->dLUPTNLInformation_ToBeSetup_List.list.count > 0,
|
||||
"no DL UP TNL Information in DRBs to be Setup list\n");
|
||||
F1AP_DLUPTNLInformation_ToBeSetup_Item_t *dl_up_tnl_info_p = (F1AP_DLUPTNLInformation_ToBeSetup_Item_t *)drbs_setupmod_item_p->dLUPTNLInformation_ToBeSetup_List.list.array[0];
|
||||
F1AP_GTPTunnel_t *dl_up_tnl0 = dl_up_tnl_info_p->dLUPTNLInformation.choice.gTPTunnel;
|
||||
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&dl_up_tnl0->transportLayerAddress, drb_p->up_dl_tnl[0].tl_address);
|
||||
OCTET_STRING_TO_UINT32(&dl_up_tnl0->gTP_TEID, drb_p->up_dl_tnl[0].teid);
|
||||
}
|
||||
}
|
||||
// SRBs_FailedToBeSetupMod_List
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List, false);
|
||||
if(ie!=NULL){
|
||||
f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length = ie->value.choice.SRBs_FailedToBeSetupMod_List.list.count;
|
||||
f1ap_ue_context_modification_resp->srbs_failed_to_be_setup = calloc(f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length,
|
||||
sizeof(f1ap_rb_failed_to_be_setup_t));
|
||||
AssertFatal(f1ap_ue_context_modification_resp->srbs_failed_to_be_setup,
|
||||
"could not allocate memory for f1ap_ue_context_setup_resp->srbs_failed_to_be_setup\n");
|
||||
for (i = 0; i < f1ap_ue_context_modification_resp->srbs_failed_to_be_setup_length; ++i) {
|
||||
f1ap_rb_failed_to_be_setup_t *srb_p = &f1ap_ue_context_modification_resp->srbs_failed_to_be_setup[i];
|
||||
srb_p->rb_id = ((F1AP_SRBs_FailedToBeSetupMod_Item_t *)ie->value.choice.SRBs_FailedToBeSetupMod_List.list.array[i])->sRBID;
|
||||
}
|
||||
|
||||
}
|
||||
// DRBs_FailedToBeSetupMod_List
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List, false);
|
||||
if(ie!=NULL){
|
||||
f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length = ie->value.choice.DRBs_FailedToBeSetupMod_List.list.count;
|
||||
f1ap_ue_context_modification_resp->drbs_failed_to_be_setup = calloc(f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length,
|
||||
sizeof(f1ap_rb_failed_to_be_setup_t));
|
||||
AssertFatal(f1ap_ue_context_modification_resp->drbs_failed_to_be_setup,
|
||||
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_failed_to_be_setup\n");
|
||||
for (i = 0; i < f1ap_ue_context_modification_resp->drbs_failed_to_be_setup_length; ++i) {
|
||||
f1ap_rb_failed_to_be_setup_t *drb_p = &f1ap_ue_context_modification_resp->drbs_failed_to_be_setup[i];
|
||||
drb_p->rb_id = ((F1AP_DRBs_FailedToBeSetupMod_Item_t *)ie->value.choice.DRBs_FailedToBeSetupMod_List.list.array[i])->dRBID;
|
||||
}
|
||||
}
|
||||
|
||||
// SCell_FailedtoSetupMod_List
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List, false);
|
||||
if(ie!=NULL){
|
||||
LOG_E (F1AP, "Not supporting handling of SCell_FailedtoSetupMod_List \n");
|
||||
}
|
||||
|
||||
// SRBs_Setup_List
|
||||
F1AP_FIND_PROTOCOLIE_BY_ID(F1AP_UEContextModificationResponseIEs_t, ie, container,
|
||||
F1AP_ProtocolIE_ID_id_SRBs_SetupMod_List, false);
|
||||
if(ie!=NULL){
|
||||
f1ap_ue_context_modification_resp->srbs_to_be_setup_length = ie->value.choice.SRBs_SetupMod_List.list.count;
|
||||
f1ap_ue_context_modification_resp->srbs_to_be_setup = calloc(f1ap_ue_context_modification_resp->srbs_to_be_setup_length,
|
||||
sizeof(f1ap_srb_to_be_setup_t));
|
||||
AssertFatal(f1ap_ue_context_modification_resp->srbs_to_be_setup,
|
||||
"could not allocate memory for f1ap_ue_context_setup_resp->drbs_setup\n");
|
||||
for (i = 0; i < f1ap_ue_context_modification_resp->srbs_to_be_setup_length; ++i) {
|
||||
f1ap_srb_to_be_setup_t *srb_p = &f1ap_ue_context_modification_resp->srbs_to_be_setup[i];
|
||||
F1AP_SRBs_SetupMod_Item_t *srbs_setup_item_p;
|
||||
srbs_setup_item_p = &((F1AP_SRBs_SetupMod_ItemIEs_t *)ie->value.choice.SRBs_SetupMod_List.list.array[i])->value.choice.SRBs_SetupMod_Item;
|
||||
srb_p->srb_id = srbs_setup_item_p->sRBID;
|
||||
srb_p->lcid = srbs_setup_item_p->lCID;
|
||||
}
|
||||
}
|
||||
|
||||
F1AP_UE_CONTEXT_MODIFICATION_RESP(msg_p) = resp;
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, instance, msg_p);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -189,6 +189,7 @@ void *F1AP_DU_task(void *arg) {
|
||||
|
||||
case F1AP_UE_CONTEXT_SETUP_RESP:
|
||||
DU_send_UE_CONTEXT_SETUP_RESPONSE(assoc_id, &F1AP_UE_CONTEXT_SETUP_RESP(msg));
|
||||
free_ue_context_setup_resp(&F1AP_UE_CONTEXT_SETUP_RESP(msg));
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_MODIFICATION_RESP:
|
||||
|
||||
@@ -55,344 +55,19 @@ int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, sctp_assoc_t assoc_i
|
||||
return 0;
|
||||
}
|
||||
|
||||
int DU_send_UE_CONTEXT_SETUP_RESPONSE(sctp_assoc_t assoc_id, f1ap_ue_context_setup_t *resp)
|
||||
int DU_send_UE_CONTEXT_SETUP_RESPONSE(sctp_assoc_t assoc_id, f1ap_ue_context_setup_resp_t *resp)
|
||||
{
|
||||
F1AP_F1AP_PDU_t pdu= {0};
|
||||
F1AP_UEContextSetupResponse_t *out;
|
||||
F1AP_F1AP_PDU_t *pdu = encode_ue_context_setup_resp(resp);
|
||||
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t len = 0;
|
||||
/* Create */
|
||||
/* 0. Message Type */
|
||||
pdu.present = F1AP_F1AP_PDU_PR_successfulOutcome;
|
||||
asn1cCalloc(pdu.choice.successfulOutcome, tmp);
|
||||
tmp->procedureCode = F1AP_ProcedureCode_id_UEContextSetup;
|
||||
tmp->criticality = F1AP_Criticality_reject;
|
||||
tmp->value.present = F1AP_SuccessfulOutcome__value_PR_UEContextSetupResponse;
|
||||
out = &tmp->value.choice.UEContextSetupResponse;
|
||||
/* mandatory */
|
||||
/* c1. GNB_CU_UE_F1AP_ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie1);
|
||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||
ie1->criticality = F1AP_Criticality_reject;
|
||||
ie1->value.present = F1AP_UEContextSetupResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||
ie1->value.choice.GNB_CU_UE_F1AP_ID = resp->gNB_CU_ue_id;
|
||||
/* mandatory */
|
||||
/* c2. GNB_DU_UE_F1AP_ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie2);
|
||||
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||
ie2->criticality = F1AP_Criticality_reject;
|
||||
ie2->value.present = F1AP_UEContextSetupResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||
ie2->value.choice.GNB_DU_UE_F1AP_ID = resp->gNB_DU_ue_id;
|
||||
|
||||
/* mandatory */
|
||||
/* c3. DUtoCURRCInformation */
|
||||
if(resp->du_to_cu_rrc_information){
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie3);
|
||||
ie3->id = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation;
|
||||
ie3->criticality = F1AP_Criticality_reject;
|
||||
ie3->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DUtoCURRCInformation;
|
||||
if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){
|
||||
/* cellGroupConfig */
|
||||
OCTET_STRING_fromBuf(&ie3->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)resp->du_to_cu_rrc_information->cellGroupConfig,
|
||||
resp->du_to_cu_rrc_information->cellGroupConfig_length);
|
||||
}
|
||||
|
||||
/* OPTIONAL */
|
||||
/* measGapConfig */
|
||||
if (resp->du_to_cu_rrc_information->measGapConfig!=NULL) {
|
||||
OCTET_STRING_fromBuf(ie3->value.choice.DUtoCURRCInformation.measGapConfig, (const char *)resp->du_to_cu_rrc_information->measGapConfig,
|
||||
resp->du_to_cu_rrc_information->measGapConfig_length);
|
||||
}
|
||||
|
||||
/* OPTIONAL */
|
||||
/* requestedP_MaxFR1 */
|
||||
if (resp->du_to_cu_rrc_information->requestedP_MaxFR1!=NULL) {
|
||||
OCTET_STRING_fromBuf(ie3->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, (const char *)resp->du_to_cu_rrc_information->requestedP_MaxFR1,
|
||||
resp->du_to_cu_rrc_information->requestedP_MaxFR1_length);
|
||||
}
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* c4. C_RNTI */
|
||||
if (resp->crnti!=NULL) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie4);
|
||||
ie4->id = F1AP_ProtocolIE_ID_id_C_RNTI;
|
||||
ie4->criticality = F1AP_Criticality_ignore;
|
||||
ie4->value.present = F1AP_UEContextSetupResponseIEs__value_PR_C_RNTI;
|
||||
ie4->value.choice.C_RNTI = *resp->crnti;
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* c5. ResourceCoordinationTransferContainer */
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie5);
|
||||
ie5->id = F1AP_ProtocolIE_ID_id_ResourceCoordinationTransferContainer;
|
||||
ie5->criticality = F1AP_Criticality_ignore;
|
||||
ie5->value.present = F1AP_UEContextSetupResponseIEs__value_PR_ResourceCoordinationTransferContainer;
|
||||
OCTET_STRING_fromBuf(&ie5->value.choice.ResourceCoordinationTransferContainer, "asdsa",
|
||||
strlen("asdsa"));
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* c6. FullConfiguration */
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie6);
|
||||
ie6->id = F1AP_ProtocolIE_ID_id_FullConfiguration;
|
||||
ie6->criticality = F1AP_Criticality_ignore;
|
||||
ie6->value.present = F1AP_UEContextSetupResponseIEs__value_PR_FullConfiguration;
|
||||
ie6->value.choice.FullConfiguration = F1AP_FullConfiguration_full; //enum
|
||||
}
|
||||
|
||||
/* mandatory */
|
||||
/* c7. DRBs_Setup_List */
|
||||
if(resp->drbs_to_be_setup_length > 0){
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie7);
|
||||
ie7->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_List;
|
||||
ie7->criticality = F1AP_Criticality_ignore;
|
||||
ie7->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DRBs_Setup_List;
|
||||
for (int i=0; i< resp->drbs_to_be_setup_length; i++) {
|
||||
f1ap_drb_to_be_setup_t *drb = &resp->drbs_to_be_setup[i];
|
||||
//
|
||||
asn1cSequenceAdd(ie7->value.choice.DRBs_Setup_List.list,
|
||||
F1AP_DRBs_Setup_ItemIEs_t, drbs_setup_item_ies);
|
||||
drbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Setup_Item;
|
||||
drbs_setup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||
drbs_setup_item_ies->value.present = F1AP_DRBs_Setup_ItemIEs__value_PR_DRBs_Setup_Item;
|
||||
/* 7.1 DRBs_Setup_Item */
|
||||
/* ADD */
|
||||
F1AP_DRBs_Setup_Item_t *drbs_setup_item=&drbs_setup_item_ies->value.choice.DRBs_Setup_Item;
|
||||
/* dRBID */
|
||||
drbs_setup_item->dRBID = drb->drb_id;
|
||||
|
||||
/* OPTIONAL */
|
||||
/* lCID */
|
||||
//drbs_setup_item.lCID = (F1AP_LCID_t *)calloc(1, sizeof(F1AP_LCID_t));
|
||||
//drbs_setup_item.lCID = 1L;
|
||||
|
||||
for (int j = 0; j < drb->up_dl_tnl_length; j++) {
|
||||
const f1ap_up_tnl_t *tnl = &drb->up_dl_tnl[j];
|
||||
DevAssert(tnl->teid > 0);
|
||||
|
||||
/* ADD */
|
||||
asn1cSequenceAdd(drbs_setup_item->dLUPTNLInformation_ToBeSetup_List.list,
|
||||
F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
|
||||
dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
|
||||
/* gTPTunnel */
|
||||
asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel);
|
||||
/* transportLayerAddress */
|
||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(tnl->tl_address, &gTPTunnel->transportLayerAddress);
|
||||
/* gTP_TEID */
|
||||
INT32_TO_OCTET_STRING(tnl->teid, &gTPTunnel->gTP_TEID);
|
||||
} // for j
|
||||
} // for i
|
||||
|
||||
}
|
||||
|
||||
/* mandatory */
|
||||
/* c8. SRBs_FailedToBeSetup_List */
|
||||
if(0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie8);
|
||||
ie8->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_List;
|
||||
ie8->criticality = F1AP_Criticality_ignore;
|
||||
ie8->value.present = F1AP_UEContextSetupResponseIEs__value_PR_SRBs_FailedToBeSetup_List;
|
||||
|
||||
for (int i=0; i<1; i++) {
|
||||
//
|
||||
asn1cSequenceAdd(ie8->value.choice.SRBs_FailedToBeSetup_List.list,
|
||||
F1AP_SRBs_FailedToBeSetup_ItemIEs_t, srbs_failedToBeSetup_item_ies);
|
||||
srbs_failedToBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetup_Item;
|
||||
srbs_failedToBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||
srbs_failedToBeSetup_item_ies->value.present = F1AP_SRBs_FailedToBeSetup_ItemIEs__value_PR_SRBs_FailedToBeSetup_Item;
|
||||
/* 8.1 SRBs_Setup_Item */
|
||||
F1AP_SRBs_FailedToBeSetup_Item_t *srbs_failedToBeSetup_item=
|
||||
&srbs_failedToBeSetup_item_ies->value.choice.SRBs_FailedToBeSetup_Item;
|
||||
/* sRBID */
|
||||
srbs_failedToBeSetup_item->sRBID = 13L;
|
||||
/* cause */
|
||||
asn1cCalloc(srbs_failedToBeSetup_item->cause, tmp);
|
||||
// dummy value
|
||||
tmp->present = F1AP_Cause_PR_radioNetwork;
|
||||
|
||||
switch(tmp->present) {
|
||||
case F1AP_Cause_PR_radioNetwork:
|
||||
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_transport:
|
||||
tmp->choice.transport = F1AP_CauseTransport_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_protocol:
|
||||
tmp->choice.protocol = F1AP_CauseProtocol_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_misc:
|
||||
tmp->choice.misc = F1AP_CauseMisc_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_NOTHING:
|
||||
default:
|
||||
break;
|
||||
} // switch
|
||||
} // for i
|
||||
}
|
||||
|
||||
/* */
|
||||
/* c9. DRBs_FailedToBeSetup_List */
|
||||
if(0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie9);
|
||||
ie9->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_List;
|
||||
ie9->criticality = F1AP_Criticality_ignore;
|
||||
ie9->value.present = F1AP_UEContextSetupResponseIEs__value_PR_DRBs_FailedToBeSetup_List;
|
||||
|
||||
for (int i=0; i<1; i++) {
|
||||
asn1cSequenceAdd(ie9->value.choice.DRBs_FailedToBeSetup_List.list,
|
||||
F1AP_DRBs_FailedToBeSetup_ItemIEs_t, drbs_failedToBeSetup_item_ies);
|
||||
drbs_failedToBeSetup_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetup_Item;
|
||||
drbs_failedToBeSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||
drbs_failedToBeSetup_item_ies->value.present = F1AP_DRBs_FailedToBeSetup_ItemIEs__value_PR_DRBs_FailedToBeSetup_Item;
|
||||
/* 9.1 DRBs_Setup_Item */
|
||||
/* ADD */
|
||||
F1AP_DRBs_FailedToBeSetup_Item_t *drbs_failedToBeSetup_item=
|
||||
&drbs_failedToBeSetup_item_ies->value.choice.DRBs_FailedToBeSetup_Item;
|
||||
/* dRBID */
|
||||
drbs_failedToBeSetup_item->dRBID = 14;
|
||||
/* cause */
|
||||
asn1cCalloc(drbs_failedToBeSetup_item->cause,tmp);
|
||||
// dummy value
|
||||
tmp->present = F1AP_Cause_PR_radioNetwork;
|
||||
|
||||
switch(tmp->present) {
|
||||
case F1AP_Cause_PR_radioNetwork:
|
||||
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_transport:
|
||||
tmp->choice.transport = F1AP_CauseTransport_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_protocol:
|
||||
tmp->choice.protocol = F1AP_CauseProtocol_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_misc:
|
||||
tmp->choice.misc = F1AP_CauseMisc_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_NOTHING:
|
||||
default:
|
||||
break;
|
||||
} // switch
|
||||
} // for i
|
||||
}
|
||||
|
||||
// /* */
|
||||
/* c10. SCell_FailedtoSetup_List */
|
||||
if(0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie10);
|
||||
ie10->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_List;
|
||||
ie10->criticality = F1AP_Criticality_ignore;
|
||||
ie10->value.present = F1AP_UEContextSetupResponseIEs__value_PR_SCell_FailedtoSetup_List;
|
||||
|
||||
for (int i=0; i<1; i++) {
|
||||
asn1cSequenceAdd(ie10->value.choice.SCell_FailedtoSetup_List.list,
|
||||
F1AP_SCell_FailedtoSetup_ItemIEs_t, sCell_FailedtoSetup_item_ies);
|
||||
sCell_FailedtoSetup_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetup_Item;
|
||||
sCell_FailedtoSetup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||
sCell_FailedtoSetup_item_ies->value.present = F1AP_SCell_FailedtoSetup_ItemIEs__value_PR_SCell_FailedtoSetup_Item;
|
||||
/* 10.1 DRBs_Setup_Item */
|
||||
F1AP_SCell_FailedtoSetup_Item_t *sCell_FailedtoSetup_item=
|
||||
&sCell_FailedtoSetup_item_ies->value.choice.SCell_FailedtoSetup_Item;
|
||||
/* sCell_ID */
|
||||
AssertFatal(false, "handle correct CellID\n");
|
||||
f1ap_served_cell_info_t cellID = {0};
|
||||
addnRCGI(sCell_FailedtoSetup_item->sCell_ID, &cellID);
|
||||
/* cause */
|
||||
asn1cCalloc(sCell_FailedtoSetup_item->cause, tmp);
|
||||
// dummy value
|
||||
tmp->present = F1AP_Cause_PR_radioNetwork;
|
||||
|
||||
switch(tmp->present) {
|
||||
case F1AP_Cause_PR_radioNetwork:
|
||||
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_transport:
|
||||
tmp->choice.transport = F1AP_CauseTransport_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_protocol:
|
||||
tmp->choice.protocol = F1AP_CauseProtocol_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_misc:
|
||||
tmp->choice.misc = F1AP_CauseMisc_unspecified;
|
||||
break;
|
||||
|
||||
case F1AP_Cause_PR_NOTHING:
|
||||
default:
|
||||
break;
|
||||
} // switch
|
||||
} // for i
|
||||
}
|
||||
|
||||
/* mandatory */
|
||||
/* c11. SRBs_Setup_List */
|
||||
if(resp->srbs_to_be_setup_length > 0){
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie11);
|
||||
ie11->id = F1AP_ProtocolIE_ID_id_SRBs_Setup_List;
|
||||
ie11->criticality = F1AP_Criticality_ignore;
|
||||
ie11->value.present = F1AP_UEContextSetupResponseIEs__value_PR_SRBs_Setup_List;
|
||||
|
||||
for (int i=0; i< resp->srbs_to_be_setup_length; i++) {//
|
||||
asn1cSequenceAdd(ie11->value.choice.SRBs_Setup_List.list,
|
||||
F1AP_SRBs_Setup_ItemIEs_t, srbs_setup_item_ies);
|
||||
srbs_setup_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_Setup_Item;
|
||||
srbs_setup_item_ies->criticality = F1AP_Criticality_ignore;
|
||||
srbs_setup_item_ies->value.present = F1AP_SRBs_Setup_ItemIEs__value_PR_SRBs_Setup_Item;
|
||||
/* 11.1 SRBs_Setup_Item */
|
||||
/* ADD */
|
||||
F1AP_SRBs_Setup_Item_t *srbs_setup_item=&srbs_setup_item_ies->value.choice.SRBs_Setup_Item;
|
||||
/* sRBID */
|
||||
srbs_setup_item->sRBID = resp->srbs_to_be_setup[i].srb_id;
|
||||
srbs_setup_item->lCID = resp->srbs_to_be_setup[i].lcid;
|
||||
}
|
||||
}
|
||||
|
||||
/* Optional */
|
||||
/* c12. InactivityMonitoringResponse */
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie11);
|
||||
ie11->id = F1AP_ProtocolIE_ID_id_InactivityMonitoringResponse;
|
||||
ie11->criticality = F1AP_Criticality_ignore;
|
||||
ie11->value.present = F1AP_UEContextSetupResponseIEs__value_PR_InactivityMonitoringResponse;
|
||||
ie11->value.choice.InactivityMonitoringResponse = F1AP_InactivityMonitoringResponse_not_supported;
|
||||
}
|
||||
|
||||
/* Optional */
|
||||
/* c13. CriticalityDiagnostics */
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextSetupResponseIEs_t, ie12);
|
||||
ie12->id = F1AP_ProtocolIE_ID_id_CriticalityDiagnostics;
|
||||
ie12->criticality = F1AP_Criticality_ignore;
|
||||
ie12->value.present = F1AP_UEContextSetupResponseIEs__value_PR_CriticalityDiagnostics;
|
||||
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.procedureCode,
|
||||
F1AP_ProcedureCode_id_UEContextSetup);
|
||||
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.triggeringMessage,
|
||||
F1AP_TriggeringMessage_initiating_message);
|
||||
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.procedureCriticality,
|
||||
F1AP_Criticality_reject);
|
||||
asn1cCallocOne(ie12->value.choice.CriticalityDiagnostics.transactionID,
|
||||
0);
|
||||
}
|
||||
|
||||
/* encode */
|
||||
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
||||
if (f1ap_encode_pdu(pdu, &buffer, &len) < 0) {
|
||||
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT SETUP RESPONSE\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
f1ap_itti_send_sctp_data_req(assoc_id, buffer, len);
|
||||
ASN_STRUCT_FREE(asn_DEF_F1AP_F1AP_PDU, pdu);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -635,325 +310,18 @@ int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, sctp_assoc_t
|
||||
return 0;
|
||||
}
|
||||
|
||||
int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(sctp_assoc_t assoc_id, f1ap_ue_context_modif_resp_t *resp)
|
||||
int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(sctp_assoc_t assoc_id, f1ap_ue_context_mod_resp_t *resp)
|
||||
{
|
||||
F1AP_F1AP_PDU_t pdu= {0};
|
||||
F1AP_UEContextModificationResponse_t *out;
|
||||
F1AP_F1AP_PDU_t *pdu = encode_ue_context_mod_resp(resp);
|
||||
|
||||
uint8_t *buffer = NULL;
|
||||
uint32_t len = 0;
|
||||
/* Create */
|
||||
/* 0. Message Type */
|
||||
pdu.present = F1AP_F1AP_PDU_PR_successfulOutcome;
|
||||
asn1cCalloc(pdu.choice.successfulOutcome,tmp);
|
||||
tmp->procedureCode = F1AP_ProcedureCode_id_UEContextModification;
|
||||
tmp->criticality = F1AP_Criticality_reject;
|
||||
tmp->value.present = F1AP_SuccessfulOutcome__value_PR_UEContextModificationResponse;
|
||||
out = &tmp->value.choice.UEContextModificationResponse;
|
||||
/* mandatory */
|
||||
/* c1. GNB_CU_UE_F1AP_ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie1);
|
||||
ie1->id = F1AP_ProtocolIE_ID_id_gNB_CU_UE_F1AP_ID;
|
||||
ie1->criticality = F1AP_Criticality_reject;
|
||||
ie1->value.present = F1AP_UEContextModificationResponseIEs__value_PR_GNB_CU_UE_F1AP_ID;
|
||||
ie1->value.choice.GNB_CU_UE_F1AP_ID = resp->gNB_CU_ue_id;
|
||||
/* mandatory */
|
||||
/* c2. GNB_DU_UE_F1AP_ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie2);
|
||||
ie2->id = F1AP_ProtocolIE_ID_id_gNB_DU_UE_F1AP_ID;
|
||||
ie2->criticality = F1AP_Criticality_reject;
|
||||
ie2->value.present = F1AP_UEContextModificationResponseIEs__value_PR_GNB_DU_UE_F1AP_ID;
|
||||
ie2->value.choice.GNB_DU_UE_F1AP_ID = resp->gNB_DU_ue_id;
|
||||
|
||||
/* optional */
|
||||
/* c3. ResourceCoordinationTransferContainer */
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie3);
|
||||
ie3->id = F1AP_ProtocolIE_ID_id_ResourceCoordinationTransferContainer;
|
||||
ie3->criticality = F1AP_Criticality_ignore;
|
||||
ie3->value.present = F1AP_UEContextModificationResponseIEs__value_PR_ResourceCoordinationTransferContainer;
|
||||
OCTET_STRING_fromBuf(&ie3->value.choice.ResourceCoordinationTransferContainer, "asdsa1d32sa1d31asd31as",
|
||||
strlen("asdsa1d32sa1d31asd31as"));
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* c4. DUtoCURRCInformation */
|
||||
if(resp->du_to_cu_rrc_information!=NULL){
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie4);
|
||||
ie4->id = F1AP_ProtocolIE_ID_id_DUtoCURRCInformation;
|
||||
ie4->criticality = F1AP_Criticality_reject;
|
||||
ie4->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DUtoCURRCInformation;
|
||||
if(resp->du_to_cu_rrc_information->cellGroupConfig!=NULL){
|
||||
/* cellGroupConfig */
|
||||
OCTET_STRING_fromBuf(&ie4->value.choice.DUtoCURRCInformation.cellGroupConfig, (const char *)resp->du_to_cu_rrc_information->cellGroupConfig,
|
||||
resp->du_to_cu_rrc_information->cellGroupConfig_length);
|
||||
}
|
||||
|
||||
/* OPTIONAL */
|
||||
/* measGapConfig */
|
||||
if (resp->du_to_cu_rrc_information->measGapConfig!=NULL) {
|
||||
OCTET_STRING_fromBuf(ie4->value.choice.DUtoCURRCInformation.measGapConfig, (const char *)resp->du_to_cu_rrc_information->measGapConfig,
|
||||
resp->du_to_cu_rrc_information->measGapConfig_length);
|
||||
}
|
||||
|
||||
/* OPTIONAL */
|
||||
/* requestedP_MaxFR1 */
|
||||
if (resp->du_to_cu_rrc_information->requestedP_MaxFR1!=NULL) {
|
||||
OCTET_STRING_fromBuf(ie4->value.choice.DUtoCURRCInformation.requestedP_MaxFR1, (const char *)resp->du_to_cu_rrc_information->requestedP_MaxFR1,
|
||||
resp->du_to_cu_rrc_information->requestedP_MaxFR1_length);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* optional */
|
||||
/* c5. DRBs_Setup_List */
|
||||
if(resp->drbs_to_be_setup_length > 0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie5);
|
||||
ie5->id = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_List;
|
||||
ie5->criticality = F1AP_Criticality_ignore;
|
||||
ie5->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_SetupMod_List;
|
||||
for (int i=0; i< resp->drbs_to_be_setup_length; i++) {
|
||||
asn1cSequenceAdd(ie5->value.choice.DRBs_SetupMod_List.list, F1AP_DRBs_SetupMod_ItemIEs_t, drbs_setupmod_item_ies);
|
||||
drbs_setupmod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_SetupMod_Item;
|
||||
drbs_setupmod_item_ies->criticality = F1AP_Criticality_ignore;
|
||||
drbs_setupmod_item_ies->value.present = F1AP_DRBs_SetupMod_ItemIEs__value_PR_DRBs_SetupMod_Item;
|
||||
/* 7.1 DRBs_Setup_Item */
|
||||
/* ADD */
|
||||
F1AP_DRBs_SetupMod_Item_t *drbs_setupmod_item=&drbs_setupmod_item_ies->value.choice.DRBs_SetupMod_Item;
|
||||
/* dRBID */
|
||||
drbs_setupmod_item->dRBID = resp->drbs_to_be_setup[i].drb_id;
|
||||
|
||||
for (int j=0; j<resp->drbs_to_be_setup[i].up_dl_tnl_length; j++) {
|
||||
const f1ap_up_tnl_t *tnl = &resp->drbs_to_be_setup[i].up_dl_tnl[j];
|
||||
DevAssert(tnl->teid > 0);
|
||||
|
||||
/* ADD */
|
||||
asn1cSequenceAdd(drbs_setupmod_item->dLUPTNLInformation_ToBeSetup_List.list,
|
||||
F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
|
||||
dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
|
||||
/* gTPTunnel */
|
||||
asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel,gTPTunnel);
|
||||
/* transportLayerAddress */
|
||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(tnl->tl_address, &gTPTunnel->transportLayerAddress);
|
||||
/* gTP_TEID */
|
||||
INT32_TO_OCTET_STRING(tnl->teid, &gTPTunnel->gTP_TEID);
|
||||
} // for j
|
||||
} // for i
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* c6. DRBs_Modified_List */
|
||||
if(resp->drbs_to_be_modified_length > 0){
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie6);
|
||||
ie6->id = F1AP_ProtocolIE_ID_id_DRBs_Modified_List;
|
||||
ie6->criticality = F1AP_Criticality_ignore;
|
||||
ie6->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_Modified_List;
|
||||
|
||||
for (int i=0; i<resp->drbs_to_be_modified_length; i++) {
|
||||
asn1cSequenceAdd(ie6->value.choice.DRBs_Modified_List.list,
|
||||
F1AP_DRBs_Modified_ItemIEs_t, drbs_modified_item_ies);
|
||||
drbs_modified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_Modified_Item;
|
||||
drbs_modified_item_ies->criticality = F1AP_Criticality_ignore;
|
||||
drbs_modified_item_ies->value.present = F1AP_DRBs_Modified_ItemIEs__value_PR_DRBs_Modified_Item;
|
||||
/* DRBs_modified_Item */
|
||||
F1AP_DRBs_Modified_Item_t *drbs_modified_item= &drbs_modified_item_ies->value.choice.DRBs_Modified_Item;
|
||||
/* dRBID */
|
||||
drbs_modified_item->dRBID = resp->drbs_to_be_modified[i].drb_id;
|
||||
|
||||
/* ULTunnels_Modified_List */
|
||||
for (int j=0; j<resp->drbs_to_be_modified[i].up_dl_tnl_length; j++) {
|
||||
/* DLTunnels_Modified_Item */
|
||||
asn1cSequenceAdd(drbs_modified_item->dLUPTNLInformation_ToBeSetup_List.list,
|
||||
F1AP_DLUPTNLInformation_ToBeSetup_Item_t, dLUPTNLInformation_ToBeSetup_Item);
|
||||
asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item, tmp);
|
||||
tmp->dLUPTNLInformation.present = F1AP_UPTransportLayerInformation_PR_gTPTunnel;
|
||||
asn1cCalloc(dLUPTNLInformation_ToBeSetup_Item->dLUPTNLInformation.choice.gTPTunnel, gTPTunnel);
|
||||
/* transportLayerAddress */
|
||||
struct sockaddr_in addr= {0};
|
||||
inet_pton(AF_INET, getCxt(0)->net_config.DU_f1u_ip_address, &addr.sin_addr.s_addr);
|
||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(addr.sin_addr.s_addr, &gTPTunnel->transportLayerAddress);
|
||||
/* gTP_TEID */
|
||||
INT32_TO_OCTET_STRING(resp->drbs_to_be_modified[i].up_dl_tnl[j].teid, &gTPTunnel->gTP_TEID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* c7. SRBs_FailedToBeSetupMod_List */
|
||||
if(resp->srbs_failed_to_be_setup_length > 0){
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie7);
|
||||
ie7->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_List;
|
||||
ie7->criticality = F1AP_Criticality_reject;
|
||||
ie7->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_FailedToBeSetupMod_List;
|
||||
|
||||
for (int i=0; i<resp->srbs_to_be_setup_length; i++) {
|
||||
asn1cSequenceAdd(ie7->value.choice.SRBs_FailedToBeSetupMod_List.list,
|
||||
F1AP_SRBs_FailedToBeSetupMod_ItemIEs_t, srbs_failedToBeSetupMod_item_ies);
|
||||
srbs_failedToBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_FailedToBeSetupMod_Item;
|
||||
srbs_failedToBeSetupMod_item_ies->criticality = F1AP_Criticality_ignore;
|
||||
srbs_failedToBeSetupMod_item_ies->value.present = F1AP_SRBs_FailedToBeSetupMod_ItemIEs__value_PR_SRBs_FailedToBeSetupMod_Item;
|
||||
/* 9.1 SRBs_FailedToBeSetupMod_Item */
|
||||
F1AP_SRBs_FailedToBeSetupMod_Item_t *srbs_failedToBeSetupMod_item=
|
||||
&srbs_failedToBeSetupMod_item_ies->value.choice.SRBs_FailedToBeSetupMod_Item;
|
||||
/* - sRBID */
|
||||
srbs_failedToBeSetupMod_item->sRBID = resp->srbs_failed_to_be_setup[i].rb_id;
|
||||
asn1cCalloc(srbs_failedToBeSetupMod_item->cause, tmp);
|
||||
tmp->present = F1AP_Cause_PR_radioNetwork;
|
||||
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
|
||||
}
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* c8. DRBs_FailedToBeSetupMod_List */
|
||||
if(resp->drbs_failed_to_be_setup_length > 0){
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie8);
|
||||
ie8->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_List;
|
||||
ie8->criticality = F1AP_Criticality_reject;
|
||||
ie8->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeSetupMod_List;
|
||||
|
||||
for (int i=0; i<resp->drbs_failed_to_be_setup_length; i++) {
|
||||
asn1cSequenceAdd(ie8->value.choice.DRBs_FailedToBeSetupMod_List.list,
|
||||
F1AP_DRBs_FailedToBeSetupMod_ItemIEs_t, drbs_failedToBeSetupMod_item_ies);
|
||||
drbs_failedToBeSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeSetupMod_Item;
|
||||
drbs_failedToBeSetupMod_item_ies->criticality = F1AP_Criticality_reject;
|
||||
drbs_failedToBeSetupMod_item_ies->value.present = F1AP_DRBs_FailedToBeSetupMod_ItemIEs__value_PR_DRBs_FailedToBeSetupMod_Item;
|
||||
/* DRBs_FailedToBeSetupMod_Item */
|
||||
F1AP_DRBs_FailedToBeSetupMod_Item_t *drbs_failedToBeSetupMod_item=
|
||||
&drbs_failedToBeSetupMod_item_ies->value.choice.DRBs_FailedToBeSetupMod_Item;
|
||||
/* dRBID */
|
||||
drbs_failedToBeSetupMod_item->dRBID = resp->drbs_failed_to_be_setup[i].rb_id;
|
||||
drbs_failedToBeSetupMod_item->cause = (F1AP_Cause_t *)calloc(1, sizeof(F1AP_Cause_t));
|
||||
drbs_failedToBeSetupMod_item->cause->present = F1AP_Cause_PR_radioNetwork;
|
||||
drbs_failedToBeSetupMod_item->cause->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
|
||||
}
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* c9. SCell_FailedtoSetupMod_List */
|
||||
if(0){
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie9);
|
||||
ie9->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_List;
|
||||
ie9->criticality = F1AP_Criticality_ignore;
|
||||
ie9->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SCell_FailedtoSetupMod_List;
|
||||
|
||||
for (int i=0; i<1; i++) {
|
||||
asn1cSequenceAdd(ie9->value.choice.SCell_FailedtoSetupMod_List.list,
|
||||
F1AP_SCell_FailedtoSetupMod_ItemIEs_t, scell_failedtoSetupMod_item_ies);
|
||||
scell_failedtoSetupMod_item_ies->id = F1AP_ProtocolIE_ID_id_SCell_FailedtoSetupMod_Item;
|
||||
scell_failedtoSetupMod_item_ies->criticality = F1AP_Criticality_ignore;
|
||||
scell_failedtoSetupMod_item_ies->value.present = F1AP_SCell_FailedtoSetupMod_ItemIEs__value_PR_SCell_FailedtoSetupMod_Item;
|
||||
/* 8.1 SCell_ToBeSetup_Item */
|
||||
F1AP_SCell_FailedtoSetupMod_Item_t *scell_failedtoSetupMod_item=&scell_failedtoSetupMod_item_ies->value.choice.SCell_FailedtoSetupMod_Item;
|
||||
/* - sCell_ID */
|
||||
addnRCGI(scell_failedtoSetupMod_item->sCell_ID, &getCxt(0)->setupReq.cell[i].info);
|
||||
asn1cCalloc(scell_failedtoSetupMod_item->cause, tmp);
|
||||
tmp->present = F1AP_Cause_PR_radioNetwork;
|
||||
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
|
||||
}
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* c10. DRBs_FailedToBeModified_List */
|
||||
if(0){
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie10);
|
||||
ie10->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_List;
|
||||
ie10->criticality = F1AP_Criticality_reject;
|
||||
ie10->value.present = F1AP_UEContextModificationResponseIEs__value_PR_DRBs_FailedToBeModified_List;
|
||||
|
||||
for (int i=0; i<1; i++) {
|
||||
asn1cSequenceAdd(ie10->value.choice.DRBs_FailedToBeModified_List.list,
|
||||
F1AP_DRBs_FailedToBeModified_ItemIEs_t, drbs_failedToBeModified_item_ies);
|
||||
drbs_failedToBeModified_item_ies->id = F1AP_ProtocolIE_ID_id_DRBs_FailedToBeModified_Item;
|
||||
drbs_failedToBeModified_item_ies->criticality = F1AP_Criticality_reject;
|
||||
drbs_failedToBeModified_item_ies->value.present = F1AP_DRBs_FailedToBeModified_ItemIEs__value_PR_DRBs_FailedToBeModified_Item;
|
||||
/* 13.1 DRBs_FailedToBeModified_Item */
|
||||
F1AP_DRBs_FailedToBeModified_Item_t *drbs_failedToBeModified_item=
|
||||
&drbs_failedToBeModified_item_ies->value.choice.DRBs_FailedToBeModified_Item ;
|
||||
/* dRBID */
|
||||
drbs_failedToBeModified_item->dRBID = 30L;
|
||||
asn1cCalloc(drbs_failedToBeModified_item->cause, tmp);
|
||||
tmp->present = F1AP_Cause_PR_radioNetwork;
|
||||
tmp->choice.radioNetwork = F1AP_CauseRadioNetwork_unknown_or_already_allocated_gnb_du_ue_f1ap_id;
|
||||
}
|
||||
}
|
||||
|
||||
// /* */
|
||||
/* c11. CriticalityDiagnostics */
|
||||
if (0) {
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie11);
|
||||
ie11->id = F1AP_ProtocolIE_ID_id_CriticalityDiagnostics;
|
||||
ie11->criticality = F1AP_Criticality_ignore;
|
||||
ie11->value.present = F1AP_UEContextModificationResponseIEs__value_PR_CriticalityDiagnostics;
|
||||
|
||||
// dummy value
|
||||
/* optional */
|
||||
/* procedureCode */
|
||||
if (0) {
|
||||
ie11->value.choice.CriticalityDiagnostics.procedureCode = (F1AP_ProcedureCode_t *)calloc(1, sizeof(F1AP_ProcedureCode_t));
|
||||
*ie11->value.choice.CriticalityDiagnostics.procedureCode = 0L;
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* triggeringMessage */
|
||||
if (0) {
|
||||
ie11->value.choice.CriticalityDiagnostics.triggeringMessage = (F1AP_TriggeringMessage_t *)calloc(1, sizeof(F1AP_TriggeringMessage_t));
|
||||
*ie11->value.choice.CriticalityDiagnostics.triggeringMessage = F1AP_TriggeringMessage_successful_outcome;
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* procedureCriticality */
|
||||
if (0) {
|
||||
ie11->value.choice.CriticalityDiagnostics.procedureCriticality = (F1AP_Criticality_t *)calloc(1, sizeof(F1AP_Criticality_t));
|
||||
*ie11->value.choice.CriticalityDiagnostics.procedureCriticality = F1AP_Criticality_reject;
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* transactionID */
|
||||
if (0) {
|
||||
ie11->value.choice.CriticalityDiagnostics.transactionID = (F1AP_TransactionID_t *)calloc(1, sizeof(F1AP_TransactionID_t));
|
||||
*ie11->value.choice.CriticalityDiagnostics.transactionID = 0L;
|
||||
}
|
||||
|
||||
/* optional */
|
||||
/* F1AP_CriticalityDiagnostics_IE_List */
|
||||
if (0) {
|
||||
for (int i=0; i<0; i++) {
|
||||
asn1cSequenceAdd(ie11->value.choice.CriticalityDiagnostics.iEsCriticalityDiagnostics->list, F1AP_CriticalityDiagnostics_IE_Item_t, criticalityDiagnostics_ie_item);
|
||||
criticalityDiagnostics_ie_item->iECriticality = F1AP_Criticality_reject;
|
||||
criticalityDiagnostics_ie_item->iE_ID = 0L;
|
||||
criticalityDiagnostics_ie_item->typeOfError = F1AP_TypeOfError_not_understood;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* optional */
|
||||
/* c12. SRBs_Setup_List */
|
||||
if(resp->srbs_to_be_setup_length > 0){
|
||||
asn1cSequenceAdd(out->protocolIEs.list, F1AP_UEContextModificationResponseIEs_t, ie12);
|
||||
ie12->id = F1AP_ProtocolIE_ID_id_SRBs_SetupMod_List;
|
||||
ie12->criticality = F1AP_Criticality_ignore;
|
||||
ie12->value.present = F1AP_UEContextModificationResponseIEs__value_PR_SRBs_SetupMod_List;
|
||||
|
||||
for (int i=0; i< resp->srbs_to_be_setup_length; i++) {//
|
||||
asn1cSequenceAdd(ie12->value.choice.SRBs_SetupMod_List.list,
|
||||
F1AP_SRBs_SetupMod_ItemIEs_t, srbs_setupmod_item_ies);
|
||||
srbs_setupmod_item_ies->id = F1AP_ProtocolIE_ID_id_SRBs_SetupMod_Item;
|
||||
srbs_setupmod_item_ies->criticality = F1AP_Criticality_ignore;
|
||||
srbs_setupmod_item_ies->value.present = F1AP_SRBs_SetupMod_ItemIEs__value_PR_SRBs_SetupMod_Item;
|
||||
/* 11.1 SRBs_Setup_Item */
|
||||
/* ADD */
|
||||
F1AP_SRBs_SetupMod_Item_t *srbs_setupmod_item=&srbs_setupmod_item_ies->value.choice.SRBs_SetupMod_Item;
|
||||
/* sRBID */
|
||||
srbs_setupmod_item->sRBID = resp->srbs_to_be_setup[i].srb_id;
|
||||
srbs_setupmod_item->lCID = resp->srbs_to_be_setup[i].srb_id;
|
||||
}
|
||||
}
|
||||
|
||||
/* encode */
|
||||
if (f1ap_encode_pdu(&pdu, &buffer, &len) < 0) {
|
||||
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT MODIFICATION RESPONSE\n");
|
||||
if (f1ap_encode_pdu(pdu, &buffer, &len) < 0) {
|
||||
LOG_E(F1AP, "Failed to encode F1 UE CONTEXT SETUP RESPONSE\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
f1ap_itti_send_sctp_data_req(assoc_id, buffer, len);
|
||||
ASN_STRUCT_FREE(asn_DEF_F1AP_F1AP_PDU, pdu);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
/*
|
||||
* UE Context Setup
|
||||
*/
|
||||
int DU_send_UE_CONTEXT_SETUP_RESPONSE(sctp_assoc_t assoc_id, f1ap_ue_context_setup_t *req);
|
||||
int DU_send_UE_CONTEXT_SETUP_RESPONSE(sctp_assoc_t assoc_id, f1ap_ue_context_setup_resp_t *resp);
|
||||
|
||||
int DU_handle_UE_CONTEXT_SETUP_REQUEST(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu);
|
||||
int DU_send_UE_CONTEXT_SETUP_FAILURE(sctp_assoc_t assoc_id);
|
||||
@@ -63,7 +63,7 @@ int DU_send_UE_CONTEXT_RELEASE_COMPLETE(sctp_assoc_t assoc_id, f1ap_ue_context_r
|
||||
* UE Context Modification (gNB-CU initiated)
|
||||
*/
|
||||
int DU_handle_UE_CONTEXT_MODIFICATION_REQUEST(instance_t instance, sctp_assoc_t assoc_id, uint32_t stream, F1AP_F1AP_PDU_t *pdu);
|
||||
int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(sctp_assoc_t assoc_id, f1ap_ue_context_modif_resp_t *resp);
|
||||
int DU_send_UE_CONTEXT_MODIFICATION_RESPONSE(sctp_assoc_t assoc_id, f1ap_ue_context_mod_resp_t *resp);
|
||||
int DU_send_UE_CONTEXT_MODIFICATION_FAILURE(sctp_assoc_t assoc_id);
|
||||
|
||||
|
||||
|
||||
@@ -235,7 +235,7 @@ static NR_RLC_BearerConfig_t *get_bearerconfig_from_srb(const f1ap_srb_to_setup_
|
||||
static int handle_ue_context_srbs_setup(NR_UE_info_t *UE,
|
||||
int srbs_len,
|
||||
const f1ap_srb_to_setup_t *req_srbs,
|
||||
f1ap_srb_to_be_setup_t **resp_srbs,
|
||||
f1ap_srb_setup_t **resp_srbs,
|
||||
NR_CellGroupConfig_t *cellGroupConfig,
|
||||
const nr_rlc_configuration_t *rlc_config)
|
||||
{
|
||||
@@ -252,7 +252,7 @@ static int handle_ue_context_srbs_setup(NR_UE_info_t *UE,
|
||||
nr_lc_config_t c = {.lcid = rlc_BearerConfig->logicalChannelIdentity, .priority = priority};
|
||||
nr_mac_add_lcid(&UE->UE_sched_ctrl, &c);
|
||||
|
||||
(*resp_srbs)[i].srb_id = srb->id;
|
||||
(*resp_srbs)[i].id = srb->id;
|
||||
(*resp_srbs)[i].lcid = c.lcid;
|
||||
|
||||
if (rlc_BearerConfig->logicalChannelIdentity == 1) {
|
||||
@@ -308,7 +308,7 @@ static NR_QoS_config_t get_qos_config(const f1ap_qos_flow_param_t *qos)
|
||||
static int handle_ue_context_drbs_setup(NR_UE_info_t *UE,
|
||||
int drbs_len,
|
||||
const f1ap_drb_to_setup_t *req_drbs,
|
||||
f1ap_drb_to_be_setup_t **resp_drbs,
|
||||
f1ap_drb_setup_t **resp_drbs,
|
||||
NR_CellGroupConfig_t *cellGroupConfig,
|
||||
const nr_rlc_configuration_t *rlc_config)
|
||||
{
|
||||
@@ -322,7 +322,7 @@ static int handle_ue_context_drbs_setup(NR_UE_info_t *UE,
|
||||
for (int i = 0; i < drbs_len; i++) {
|
||||
const f1ap_drb_to_setup_t *drb = &req_drbs[i];
|
||||
AssertFatal(drb->qos_choice == F1AP_QOS_CHOICE_NR, "only NR QoS supported\n");
|
||||
f1ap_drb_to_be_setup_t *resp_drb = &(*resp_drbs)[i];
|
||||
f1ap_drb_setup_t *resp_drb = &(*resp_drbs)[i];
|
||||
NR_RLC_BearerConfig_t *rlc_BearerConfig = get_bearerconfig_from_drb(drb, rlc_config);
|
||||
nr_rlc_add_drb(UE->rnti, drb->id, rlc_BearerConfig);
|
||||
|
||||
@@ -335,11 +335,12 @@ static int handle_ue_context_drbs_setup(NR_UE_info_t *UE,
|
||||
c.priority = prio;
|
||||
nr_mac_add_lcid(&UE->UE_sched_ctrl, &c);
|
||||
|
||||
resp_drb->drb_id = drb->id;
|
||||
// TODO lcid
|
||||
resp_drb->id = drb->id;
|
||||
resp_drb->lcid = malloc_or_fail(sizeof(*resp_drb->lcid));
|
||||
*resp_drb->lcid = c.lcid;
|
||||
// just put same number of tunnels in DL as in UL
|
||||
DevAssert(drb->up_ul_tnl_len == 1);
|
||||
resp_drb->up_dl_tnl_length = drb->up_ul_tnl_len;
|
||||
resp_drb->up_dl_tnl_len = drb->up_ul_tnl_len;
|
||||
|
||||
if (f1inst >= 0) { // we actually use F1-U
|
||||
int qfi = -1; // don't put PDU session marker in GTP
|
||||
@@ -608,8 +609,7 @@ void ue_context_setup_request(const f1ap_ue_context_setup_req_t *req)
|
||||
const bool is_SA = IS_SA_MODE(get_softmodem_params());
|
||||
gNB_MAC_INST *mac = RC.nrmac[0];
|
||||
|
||||
/* TODO: update response */
|
||||
f1ap_ue_context_setup_t resp = {
|
||||
f1ap_ue_context_setup_resp_t resp = {
|
||||
.gNB_CU_ue_id = req->gNB_CU_ue_id,
|
||||
};
|
||||
|
||||
@@ -639,7 +639,8 @@ void ue_context_setup_request(const f1ap_ue_context_setup_req_t *req)
|
||||
if (!ue_id_provided) {
|
||||
UE = create_new_UE(mac, req->gNB_CU_ue_id, cg_configinfo);
|
||||
resp.gNB_DU_ue_id = UE->rnti;
|
||||
resp.crnti = &UE->rnti;
|
||||
resp.crnti = malloc_or_fail(sizeof(*resp.crnti));
|
||||
*resp.crnti = UE->rnti;
|
||||
} else {
|
||||
DevAssert(is_SA);
|
||||
UE = find_nr_UE(&mac->UE_info, *req->gNB_DU_ue_id);
|
||||
@@ -650,21 +651,12 @@ void ue_context_setup_request(const f1ap_ue_context_setup_req_t *req)
|
||||
NR_CellGroupConfig_t *new_CellGroup = clone_CellGroupConfig(UE->CellGroup);
|
||||
|
||||
if (req->srbs_len > 0) {
|
||||
resp.srbs_to_be_setup_length = handle_ue_context_srbs_setup(UE,
|
||||
req->srbs_len,
|
||||
req->srbs,
|
||||
&resp.srbs_to_be_setup,
|
||||
new_CellGroup,
|
||||
&mac->rlc_config);
|
||||
resp.srbs_len = handle_ue_context_srbs_setup(UE, req->srbs_len, req->srbs, &resp.srbs, new_CellGroup, &mac->rlc_config);
|
||||
}
|
||||
|
||||
if (req->drbs_len > 0) {
|
||||
resp.drbs_to_be_setup_length = handle_ue_context_drbs_setup(UE,
|
||||
req->drbs_len,
|
||||
req->drbs,
|
||||
&resp.drbs_to_be_setup,
|
||||
new_CellGroup,
|
||||
&mac->rlc_config);
|
||||
resp.drbs_len =
|
||||
handle_ue_context_drbs_setup(UE, req->drbs_len, req->drbs, &resp.drbs, new_CellGroup, &mac->rlc_config);
|
||||
}
|
||||
|
||||
if (req->rrc_container != NULL) {
|
||||
@@ -692,14 +684,12 @@ void ue_context_setup_request(const f1ap_ue_context_setup_req_t *req)
|
||||
}
|
||||
}
|
||||
|
||||
resp.du_to_cu_rrc_information = calloc(1, sizeof(du_to_cu_rrc_information_t));
|
||||
AssertFatal(resp.du_to_cu_rrc_information != NULL, "out of memory\n");
|
||||
resp.du_to_cu_rrc_information->cellGroupConfig = calloc(1,1024);
|
||||
AssertFatal(resp.du_to_cu_rrc_information->cellGroupConfig != NULL, "out of memory\n");
|
||||
byte_array_t cgc = { .buf = calloc_or_fail(1,1024) };
|
||||
asn_enc_rval_t enc_rval =
|
||||
uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, NULL, new_CellGroup, resp.du_to_cu_rrc_information->cellGroupConfig, 1024);
|
||||
uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig, NULL, new_CellGroup, cgc.buf, 1024);
|
||||
AssertFatal(enc_rval.encoded > 0, "Could not encode CellGroup, failed element %s\n", enc_rval.failed_type->name);
|
||||
resp.du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded + 7) >> 3;
|
||||
cgc.len = (enc_rval.encoded + 7) >> 3;
|
||||
resp.du_to_cu_rrc_info.cell_group_config = cgc;
|
||||
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, UE->CellGroup);
|
||||
UE->CellGroup = new_CellGroup;
|
||||
@@ -708,24 +698,16 @@ void ue_context_setup_request(const f1ap_ue_context_setup_req_t *req)
|
||||
|
||||
NR_SCHED_UNLOCK(&mac->sched_lock);
|
||||
|
||||
/* some sanity checks, since we use the same type for request and response */
|
||||
DevAssert(resp.cu_to_du_rrc_information == NULL);
|
||||
DevAssert(resp.du_to_cu_rrc_information != NULL);
|
||||
DevAssert(resp.rrc_container == NULL && resp.rrc_container_length == 0);
|
||||
|
||||
mac->mac_rrc.ue_context_setup_response(&resp);
|
||||
|
||||
/* free the memory we allocated above */
|
||||
free(resp.srbs_to_be_setup);
|
||||
free(resp.drbs_to_be_setup);
|
||||
free(resp.du_to_cu_rrc_information->cellGroupConfig);
|
||||
free(resp.du_to_cu_rrc_information);
|
||||
free_ue_context_setup_resp(&resp);
|
||||
}
|
||||
|
||||
void ue_context_modification_request(const f1ap_ue_context_mod_req_t *req)
|
||||
{
|
||||
gNB_MAC_INST *mac = RC.nrmac[0];
|
||||
f1ap_ue_context_modif_resp_t resp = {
|
||||
f1ap_ue_context_mod_resp_t resp = {
|
||||
.gNB_CU_ue_id = req->gNB_CU_ue_id,
|
||||
.gNB_DU_ue_id = req->gNB_DU_ue_id,
|
||||
};
|
||||
@@ -751,25 +733,15 @@ void ue_context_modification_request(const f1ap_ue_context_mod_req_t *req)
|
||||
NR_CellGroupConfig_t *new_CellGroup = clone_CellGroupConfig(UE->CellGroup);
|
||||
|
||||
if (req->srbs_len > 0) {
|
||||
resp.srbs_to_be_setup_length = handle_ue_context_srbs_setup(UE,
|
||||
req->srbs_len,
|
||||
req->srbs,
|
||||
&resp.srbs_to_be_setup,
|
||||
new_CellGroup,
|
||||
&mac->rlc_config);
|
||||
resp.srbs_len = handle_ue_context_srbs_setup(UE, req->srbs_len, req->srbs, &resp.srbs, new_CellGroup, &mac->rlc_config);
|
||||
}
|
||||
|
||||
if (req->drbs_len > 0) {
|
||||
resp.drbs_to_be_setup_length = handle_ue_context_drbs_setup(UE,
|
||||
req->drbs_len,
|
||||
req->drbs,
|
||||
&resp.drbs_to_be_setup,
|
||||
new_CellGroup,
|
||||
&mac->rlc_config);
|
||||
resp.drbs_len = handle_ue_context_drbs_setup(UE, req->drbs_len, req->drbs, &resp.drbs, new_CellGroup, &mac->rlc_config);
|
||||
}
|
||||
|
||||
if (req->drbs_rel_len > 0) {
|
||||
resp.drbs_to_be_released_length = handle_ue_context_drbs_release(UE, req->drbs_rel_len, req->drbs_rel, new_CellGroup);
|
||||
handle_ue_context_drbs_release(UE, req->drbs_rel_len, req->drbs_rel, new_CellGroup);
|
||||
}
|
||||
|
||||
if (req->rrc_container != NULL) {
|
||||
@@ -808,17 +780,16 @@ void ue_context_modification_request(const f1ap_ue_context_mod_req_t *req)
|
||||
}
|
||||
|
||||
if (req->srbs_len > 0 || req->drbs_len > 0 || req->drbs_rel_len > 0 || ue_cap != NULL) {
|
||||
resp.du_to_cu_rrc_information = calloc(1, sizeof(du_to_cu_rrc_information_t));
|
||||
AssertFatal(resp.du_to_cu_rrc_information != NULL, "out of memory\n");
|
||||
resp.du_to_cu_rrc_information->cellGroupConfig = calloc(1, 1024);
|
||||
AssertFatal(resp.du_to_cu_rrc_information->cellGroupConfig != NULL, "out of memory\n");
|
||||
resp.du_to_cu_rrc_info = calloc_or_fail(1, sizeof(du_to_cu_rrc_information_t));
|
||||
byte_array_t cgc = { .buf = calloc_or_fail(1, 1024) };
|
||||
asn_enc_rval_t enc_rval = uper_encode_to_buffer(&asn_DEF_NR_CellGroupConfig,
|
||||
NULL,
|
||||
new_CellGroup,
|
||||
resp.du_to_cu_rrc_information->cellGroupConfig,
|
||||
cgc.buf,
|
||||
1024);
|
||||
AssertFatal(enc_rval.encoded > 0, "Could not encode CellGroup, failed element %s\n", enc_rval.failed_type->name);
|
||||
resp.du_to_cu_rrc_information->cellGroupConfig_length = (enc_rval.encoded + 7) >> 3;
|
||||
cgc.len = (enc_rval.encoded + 7) >> 3;
|
||||
resp.du_to_cu_rrc_info->cell_group_config = cgc;
|
||||
|
||||
ASN_STRUCT_FREE(asn_DEF_NR_CellGroupConfig, UE->CellGroup);
|
||||
UE->CellGroup = new_CellGroup;
|
||||
@@ -833,20 +804,10 @@ void ue_context_modification_request(const f1ap_ue_context_mod_req_t *req)
|
||||
}
|
||||
NR_SCHED_UNLOCK(&mac->sched_lock);
|
||||
|
||||
/* some sanity checks, since we use the same type for request and response */
|
||||
DevAssert(resp.cu_to_du_rrc_information == NULL);
|
||||
// resp.du_to_cu_rrc_information can be either NULL or not
|
||||
DevAssert(resp.rrc_container == NULL && resp.rrc_container_length == 0);
|
||||
|
||||
mac->mac_rrc.ue_context_modification_response(&resp);
|
||||
|
||||
/* free the memory we allocated above */
|
||||
free(resp.srbs_to_be_setup);
|
||||
free(resp.drbs_to_be_setup);
|
||||
if (resp.du_to_cu_rrc_information != NULL) {
|
||||
free(resp.du_to_cu_rrc_information->cellGroupConfig);
|
||||
free(resp.du_to_cu_rrc_information);
|
||||
}
|
||||
free_ue_context_mod_resp(&resp);
|
||||
}
|
||||
|
||||
void ue_context_modification_confirm(const f1ap_ue_context_modif_confirm_t *confirm)
|
||||
|
||||
@@ -31,8 +31,8 @@ typedef void (*f1_reset_acknowledge_cu_initiated_func_t)(const f1ap_reset_ack_t
|
||||
typedef void (*f1_setup_request_func_t)(const f1ap_setup_req_t* req);
|
||||
typedef void (*gnb_du_configuration_update_t)(const f1ap_gnb_du_configuration_update_t *upd);
|
||||
|
||||
typedef void (*ue_context_setup_response_func_t)(const f1ap_ue_context_setup_t *resp);
|
||||
typedef void (*ue_context_modification_response_func_t)(const f1ap_ue_context_modif_resp_t *resp);
|
||||
typedef void (*ue_context_setup_response_func_t)(const f1ap_ue_context_setup_resp_t *resp);
|
||||
typedef void (*ue_context_modification_response_func_t)(const f1ap_ue_context_mod_resp_t *resp);
|
||||
typedef void (*ue_context_modification_required_func_t)(const f1ap_ue_context_modif_required_t *t);
|
||||
typedef void (*ue_context_release_request_func_t)(const f1ap_ue_context_release_req_t* req);
|
||||
typedef void (*ue_context_release_complete_func_t)(const f1ap_ue_context_release_complete_t *complete);
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include "mac_rrc_ul.h"
|
||||
#include "lib/f1ap_rrc_message_transfer.h"
|
||||
#include "lib/f1ap_interface_management.h"
|
||||
#include "lib/f1ap_ue_context.h"
|
||||
|
||||
static void f1_reset_du_initiated_direct(const f1ap_reset_t *reset)
|
||||
{
|
||||
@@ -58,91 +59,19 @@ static void gnb_du_configuration_update_direct(const f1ap_gnb_du_configuration_u
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, 0, msg);
|
||||
}
|
||||
|
||||
static void ue_context_setup_response_direct(const f1ap_ue_context_setup_t *resp)
|
||||
static void ue_context_setup_response_direct(const f1ap_ue_context_setup_resp_t *resp)
|
||||
{
|
||||
MessageDef *msg = itti_alloc_new_message (TASK_MAC_GNB, 0, F1AP_UE_CONTEXT_SETUP_RESP);
|
||||
msg->ittiMsgHeader.originInstance = -1; // means monolithic
|
||||
f1ap_ue_context_setup_t *f1ap_msg = &F1AP_UE_CONTEXT_SETUP_RESP(msg);
|
||||
/* copy all fields, but reallocate memory buffers! */
|
||||
*f1ap_msg = *resp;
|
||||
|
||||
if (resp->srbs_to_be_setup_length > 0) {
|
||||
DevAssert(resp->srbs_to_be_setup != NULL);
|
||||
f1ap_msg->srbs_to_be_setup_length = resp->srbs_to_be_setup_length;
|
||||
f1ap_msg->srbs_to_be_setup = calloc(f1ap_msg->srbs_to_be_setup_length, sizeof(*f1ap_msg->srbs_to_be_setup));
|
||||
for (int i = 0; i < f1ap_msg->srbs_to_be_setup_length; ++i)
|
||||
f1ap_msg->srbs_to_be_setup[i] = resp->srbs_to_be_setup[i];
|
||||
}
|
||||
if (resp->drbs_to_be_setup_length > 0) {
|
||||
DevAssert(resp->drbs_to_be_setup != NULL);
|
||||
f1ap_msg->drbs_to_be_setup_length = resp->drbs_to_be_setup_length;
|
||||
f1ap_msg->drbs_to_be_setup = calloc(f1ap_msg->drbs_to_be_setup_length, sizeof(*f1ap_msg->drbs_to_be_setup));
|
||||
for (int i = 0; i < f1ap_msg->drbs_to_be_setup_length; ++i)
|
||||
f1ap_msg->drbs_to_be_setup[i] = resp->drbs_to_be_setup[i];
|
||||
}
|
||||
|
||||
f1ap_msg->du_to_cu_rrc_information = malloc(sizeof(*resp->du_to_cu_rrc_information));
|
||||
AssertFatal(f1ap_msg->du_to_cu_rrc_information != NULL, "out of memory\n");
|
||||
f1ap_msg->du_to_cu_rrc_information_length = resp->du_to_cu_rrc_information_length;
|
||||
du_to_cu_rrc_information_t *du2cu = f1ap_msg->du_to_cu_rrc_information;
|
||||
du2cu->cellGroupConfig_length = resp->du_to_cu_rrc_information->cellGroupConfig_length;
|
||||
du2cu->cellGroupConfig = calloc(du2cu->cellGroupConfig_length, sizeof(*du2cu->cellGroupConfig));
|
||||
AssertFatal(du2cu->cellGroupConfig != NULL, "out of memory\n");
|
||||
memcpy(du2cu->cellGroupConfig, resp->du_to_cu_rrc_information->cellGroupConfig, du2cu->cellGroupConfig_length);
|
||||
|
||||
F1AP_UE_CONTEXT_SETUP_RESP(msg) = cp_ue_context_setup_resp(resp);
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, 0, msg);
|
||||
}
|
||||
|
||||
static void ue_context_modification_response_direct(const f1ap_ue_context_modif_resp_t *resp)
|
||||
static void ue_context_modification_response_direct(const f1ap_ue_context_mod_resp_t *resp)
|
||||
{
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
|
||||
msg->ittiMsgHeader.originInstance = -1; // means monolithic
|
||||
f1ap_ue_context_modif_resp_t *f1ap_msg = &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg);
|
||||
|
||||
f1ap_msg->gNB_CU_ue_id = resp->gNB_CU_ue_id;
|
||||
f1ap_msg->gNB_DU_ue_id = resp->gNB_DU_ue_id;
|
||||
f1ap_msg->plmn = resp->plmn;
|
||||
f1ap_msg->nr_cellid = resp->nr_cellid;
|
||||
f1ap_msg->servCellIndex = resp->servCellIndex;
|
||||
AssertFatal(resp->cellULConfigured == NULL, "not handled\n");
|
||||
f1ap_msg->servCellId = resp->servCellId;
|
||||
|
||||
DevAssert(resp->cu_to_du_rrc_information == NULL && resp->cu_to_du_rrc_information_length == 0);
|
||||
if (resp->du_to_cu_rrc_information) {
|
||||
f1ap_msg->du_to_cu_rrc_information = malloc(sizeof(*resp->du_to_cu_rrc_information));
|
||||
AssertFatal(f1ap_msg->du_to_cu_rrc_information != NULL, "out of memory\n");
|
||||
f1ap_msg->du_to_cu_rrc_information_length = resp->du_to_cu_rrc_information_length;
|
||||
du_to_cu_rrc_information_t *du2cu = f1ap_msg->du_to_cu_rrc_information;
|
||||
du2cu->cellGroupConfig_length = resp->du_to_cu_rrc_information->cellGroupConfig_length;
|
||||
du2cu->cellGroupConfig = calloc(du2cu->cellGroupConfig_length, sizeof(*du2cu->cellGroupConfig));
|
||||
AssertFatal(du2cu->cellGroupConfig != NULL, "out of memory\n");
|
||||
memcpy(du2cu->cellGroupConfig, resp->du_to_cu_rrc_information->cellGroupConfig, du2cu->cellGroupConfig_length);
|
||||
}
|
||||
|
||||
if (resp->drbs_to_be_setup_length > 0) {
|
||||
DevAssert(resp->drbs_to_be_setup != NULL);
|
||||
f1ap_msg->drbs_to_be_setup_length = resp->drbs_to_be_setup_length;
|
||||
f1ap_msg->drbs_to_be_setup = calloc(f1ap_msg->drbs_to_be_setup_length, sizeof(*f1ap_msg->drbs_to_be_setup));
|
||||
for (int i = 0; i < f1ap_msg->drbs_to_be_setup_length; ++i)
|
||||
f1ap_msg->drbs_to_be_setup[i] = resp->drbs_to_be_setup[i];
|
||||
}
|
||||
|
||||
DevAssert(resp->drbs_to_be_modified == NULL && resp->drbs_to_be_modified_length == 0);
|
||||
f1ap_msg->QoS_information_type = resp->QoS_information_type;
|
||||
AssertFatal(resp->drbs_failed_to_be_setup_length == 0 && resp->drbs_failed_to_be_setup == NULL, "not implemented yet\n");
|
||||
|
||||
if (resp->srbs_to_be_setup_length > 0) {
|
||||
DevAssert(resp->srbs_to_be_setup != NULL);
|
||||
f1ap_msg->srbs_to_be_setup_length = resp->srbs_to_be_setup_length;
|
||||
f1ap_msg->srbs_to_be_setup = calloc(f1ap_msg->srbs_to_be_setup_length, sizeof(*f1ap_msg->srbs_to_be_setup));
|
||||
for (int i = 0; i < f1ap_msg->srbs_to_be_setup_length; ++i)
|
||||
f1ap_msg->srbs_to_be_setup[i] = resp->srbs_to_be_setup[i];
|
||||
}
|
||||
|
||||
AssertFatal(resp->srbs_failed_to_be_setup_length == 0 && resp->srbs_failed_to_be_setup == NULL, "not implemented yet\n");
|
||||
|
||||
DevAssert(resp->rrc_container == NULL && resp->rrc_container_length == 0);
|
||||
|
||||
F1AP_UE_CONTEXT_MODIFICATION_RESP(msg) = cp_ue_context_mod_resp(resp);
|
||||
itti_send_msg_to_task(TASK_RRC_GNB, 0, msg);
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
|
||||
#include "lib/f1ap_rrc_message_transfer.h"
|
||||
#include "lib/f1ap_interface_management.h"
|
||||
#include "lib/f1ap_ue_context.h"
|
||||
|
||||
static f1ap_net_config_t read_DU_IP_config(const eth_params_t* f1_params, const char *f1u_ip_addr)
|
||||
{
|
||||
@@ -85,77 +86,17 @@ static void gnb_du_configuration_update_f1ap(const f1ap_gnb_du_configuration_upd
|
||||
itti_send_msg_to_task(TASK_DU_F1, 0, msg);
|
||||
}
|
||||
|
||||
static void ue_context_setup_response_f1ap(const f1ap_ue_context_setup_t *resp)
|
||||
static void ue_context_setup_response_f1ap(const f1ap_ue_context_setup_resp_t *resp)
|
||||
{
|
||||
MessageDef *msg = itti_alloc_new_message (TASK_MAC_GNB, 0, F1AP_UE_CONTEXT_SETUP_RESP);
|
||||
f1ap_ue_context_setup_t *f1ap_msg = &F1AP_UE_CONTEXT_SETUP_RESP(msg);
|
||||
/* copy all fields, but reallocate rrc_containers! */
|
||||
*f1ap_msg = *resp;
|
||||
|
||||
if (resp->srbs_to_be_setup_length > 0) {
|
||||
DevAssert(resp->srbs_to_be_setup != NULL);
|
||||
f1ap_msg->srbs_to_be_setup_length = resp->srbs_to_be_setup_length;
|
||||
f1ap_msg->srbs_to_be_setup = calloc(f1ap_msg->srbs_to_be_setup_length, sizeof(*f1ap_msg->srbs_to_be_setup));
|
||||
for (int i = 0; i < f1ap_msg->srbs_to_be_setup_length; ++i)
|
||||
f1ap_msg->srbs_to_be_setup[i] = resp->srbs_to_be_setup[i];
|
||||
}
|
||||
if (resp->drbs_to_be_setup_length > 0) {
|
||||
DevAssert(resp->drbs_to_be_setup != NULL);
|
||||
f1ap_msg->drbs_to_be_setup_length = resp->drbs_to_be_setup_length;
|
||||
f1ap_msg->drbs_to_be_setup = calloc(f1ap_msg->drbs_to_be_setup_length, sizeof(*f1ap_msg->drbs_to_be_setup));
|
||||
for (int i = 0; i < f1ap_msg->drbs_to_be_setup_length; ++i)
|
||||
f1ap_msg->drbs_to_be_setup[i] = resp->drbs_to_be_setup[i];
|
||||
}
|
||||
if (resp->crnti) {
|
||||
f1ap_msg->crnti = calloc(1, sizeof(uint16_t));
|
||||
*f1ap_msg->crnti = *resp->crnti;
|
||||
}
|
||||
|
||||
f1ap_msg->du_to_cu_rrc_information = malloc(sizeof(*resp->du_to_cu_rrc_information));
|
||||
AssertFatal(f1ap_msg->du_to_cu_rrc_information != NULL, "out of memory\n");
|
||||
f1ap_msg->du_to_cu_rrc_information_length = resp->du_to_cu_rrc_information_length;
|
||||
du_to_cu_rrc_information_t *du2cu = f1ap_msg->du_to_cu_rrc_information;
|
||||
du2cu->cellGroupConfig_length = resp->du_to_cu_rrc_information->cellGroupConfig_length;
|
||||
du2cu->cellGroupConfig = calloc(du2cu->cellGroupConfig_length, sizeof(*du2cu->cellGroupConfig));
|
||||
AssertFatal(du2cu->cellGroupConfig != NULL, "out of memory\n");
|
||||
memcpy(du2cu->cellGroupConfig, resp->du_to_cu_rrc_information->cellGroupConfig, du2cu->cellGroupConfig_length);
|
||||
|
||||
F1AP_UE_CONTEXT_SETUP_RESP(msg) = cp_ue_context_setup_resp(resp);
|
||||
itti_send_msg_to_task(TASK_DU_F1, 0, msg);
|
||||
}
|
||||
|
||||
static void ue_context_modification_response_f1ap(const f1ap_ue_context_modif_resp_t *resp)
|
||||
static void ue_context_modification_response_f1ap(const f1ap_ue_context_mod_resp_t *resp)
|
||||
{
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_MAC_GNB, 0, F1AP_UE_CONTEXT_MODIFICATION_RESP);
|
||||
f1ap_ue_context_modif_resp_t *f1ap_msg = &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg);
|
||||
/* copy all fields, but reallocate rrc_containers! */
|
||||
*f1ap_msg = *resp;
|
||||
|
||||
if (resp->srbs_to_be_setup_length > 0) {
|
||||
DevAssert(resp->srbs_to_be_setup != NULL);
|
||||
f1ap_msg->srbs_to_be_setup_length = resp->srbs_to_be_setup_length;
|
||||
f1ap_msg->srbs_to_be_setup = calloc(f1ap_msg->srbs_to_be_setup_length, sizeof(*f1ap_msg->srbs_to_be_setup));
|
||||
for (int i = 0; i < f1ap_msg->srbs_to_be_setup_length; ++i)
|
||||
f1ap_msg->srbs_to_be_setup[i] = resp->srbs_to_be_setup[i];
|
||||
}
|
||||
if (resp->drbs_to_be_setup_length > 0) {
|
||||
DevAssert(resp->drbs_to_be_setup != NULL);
|
||||
f1ap_msg->drbs_to_be_setup_length = resp->drbs_to_be_setup_length;
|
||||
f1ap_msg->drbs_to_be_setup = calloc(f1ap_msg->drbs_to_be_setup_length, sizeof(*f1ap_msg->drbs_to_be_setup));
|
||||
for (int i = 0; i < f1ap_msg->drbs_to_be_setup_length; ++i)
|
||||
f1ap_msg->drbs_to_be_setup[i] = resp->drbs_to_be_setup[i];
|
||||
}
|
||||
|
||||
if (resp->du_to_cu_rrc_information != NULL) {
|
||||
f1ap_msg->du_to_cu_rrc_information = calloc(1, sizeof(*resp->du_to_cu_rrc_information));
|
||||
AssertFatal(f1ap_msg->du_to_cu_rrc_information != NULL, "out of memory\n");
|
||||
f1ap_msg->du_to_cu_rrc_information_length = resp->du_to_cu_rrc_information_length;
|
||||
du_to_cu_rrc_information_t *du2cu = f1ap_msg->du_to_cu_rrc_information;
|
||||
du2cu->cellGroupConfig_length = resp->du_to_cu_rrc_information->cellGroupConfig_length;
|
||||
du2cu->cellGroupConfig = calloc(du2cu->cellGroupConfig_length, sizeof(*du2cu->cellGroupConfig));
|
||||
AssertFatal(du2cu->cellGroupConfig != NULL, "out of memory\n");
|
||||
memcpy(du2cu->cellGroupConfig, resp->du_to_cu_rrc_information->cellGroupConfig, du2cu->cellGroupConfig_length);
|
||||
}
|
||||
|
||||
F1AP_UE_CONTEXT_MODIFICATION_RESP(msg) = cp_ue_context_mod_resp(resp);
|
||||
itti_send_msg_to_task(TASK_DU_F1, 0, msg);
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
#define SRB2 2
|
||||
|
||||
void rrc_add_nsa_user(gNB_RRC_INST *rrc, x2ap_ENDC_sgnb_addition_req_t *m, sctp_assoc_t assoc_id);
|
||||
void rrc_add_nsa_user_resp(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, const f1ap_ue_context_setup_t *resp);
|
||||
void rrc_add_nsa_user_resp(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, const f1ap_ue_context_setup_resp_t *resp);
|
||||
void rrc_release_nsa_user(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context);
|
||||
void rrc_remove_nsa_user_context(gNB_RRC_INST *rrc, rrc_gNB_ue_context_t *ue_context);
|
||||
|
||||
|
||||
+30
-32
@@ -1999,10 +1999,10 @@ void rrc_gNB_process_dc_overall_timeout(const module_id_t gnb_mod_idP, x2ap_ENDC
|
||||
/* \brief fill E1 bearer modification's DRB from F1 DRB
|
||||
* \param drb_e1 pointer to a DRB inside an E1 bearer modification message
|
||||
* \param drb_f1 pointer to a DRB inside an F1 UE Ctxt modification Response */
|
||||
static void fill_e1_bearer_modif(DRB_nGRAN_to_mod_t *drb_e1, const f1ap_drb_to_be_setup_t *drb_f1)
|
||||
static void fill_e1_bearer_modif(DRB_nGRAN_to_mod_t *drb_e1, const f1ap_drb_setup_t *drb_f1)
|
||||
{
|
||||
drb_e1->id = drb_f1->drb_id;
|
||||
drb_e1->numDlUpParam = drb_f1->up_dl_tnl_length;
|
||||
drb_e1->id = drb_f1->id;
|
||||
drb_e1->numDlUpParam = drb_f1->up_dl_tnl_len;
|
||||
drb_e1->DlUpParamList[0].tl_info.tlAddress = drb_f1->up_dl_tnl[0].tl_address;
|
||||
drb_e1->DlUpParamList[0].tl_info.teId = drb_f1->up_dl_tnl[0].teid;
|
||||
}
|
||||
@@ -2019,20 +2019,20 @@ static gtpu_tunnel_t f1u_gtp_update(uint32_t teid, const in_addr_t addr)
|
||||
/**
|
||||
* @brief Update DRB TEID information in RRC storage from received DRB list
|
||||
*/
|
||||
static void store_du_f1u_tunnel(const f1ap_drb_to_be_setup_t *drbs, int n, gNB_RRC_UE_t *ue)
|
||||
static void store_du_f1u_tunnel(const f1ap_drb_setup_t *drbs, int n, gNB_RRC_UE_t *ue)
|
||||
{
|
||||
for (int i = 0; i < n; i++) {
|
||||
const f1ap_drb_to_be_setup_t *drb_f1 = &drbs[i];
|
||||
AssertFatal(drb_f1->up_dl_tnl_length == 1, "can handle only one UP param\n");
|
||||
AssertFatal(drb_f1->drb_id < MAX_DRBS_PER_UE, "illegal DRB ID %ld\n", drb_f1->drb_id);
|
||||
drb_t *drb = get_drb(ue, drb_f1->drb_id);
|
||||
const f1ap_drb_setup_t *drb_f1 = &drbs[i];
|
||||
AssertFatal(drb_f1->up_dl_tnl_len == 1, "can handle only one UP param\n");
|
||||
AssertFatal(drb_f1->id < MAX_DRBS_PER_UE, "illegal DRB ID %d\n", drb_f1->id);
|
||||
drb_t *drb = get_drb(ue, drb_f1->id);
|
||||
drb->du_tunnel_config = f1u_gtp_update(drb_f1->up_dl_tnl[0].teid, drb_f1->up_dl_tnl[0].tl_address);
|
||||
}
|
||||
}
|
||||
|
||||
/* \brief use list of DRBs and send the corresponding bearer update message via
|
||||
* E1 to the CU of this UE. Also updates TEID info internally */
|
||||
static void e1_send_bearer_updates(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, f1ap_drb_to_be_setup_t *drbs)
|
||||
static void e1_send_bearer_updates(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, f1ap_drb_setup_t *drbs)
|
||||
{
|
||||
// Quit bearer updates if no CU-UP is associated
|
||||
if (!is_cuup_associated(rrc)) {
|
||||
@@ -2046,10 +2046,10 @@ static void e1_send_bearer_updates(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, f
|
||||
};
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
const f1ap_drb_to_be_setup_t *drb_f1 = &drbs[i];
|
||||
rrc_pdu_session_param_t *pdu_ue = find_pduSession_from_drbId(UE, drb_f1->drb_id);
|
||||
const f1ap_drb_setup_t *drb_f1 = &drbs[i];
|
||||
rrc_pdu_session_param_t *pdu_ue = find_pduSession_from_drbId(UE, drb_f1->id);
|
||||
if (pdu_ue == NULL) {
|
||||
LOG_E(RRC, "UE %d: UE Context Modif Response: no PDU session for DRB ID %ld\n", UE->rrc_ue_id, drb_f1->drb_id);
|
||||
LOG_E(RRC, "UE %d: UE Context Modif Response: no PDU session for DRB ID %d\n", UE->rrc_ue_id, drb_f1->id);
|
||||
continue;
|
||||
}
|
||||
pdu_session_to_mod_t *pdu_e1 = find_or_next_pdu_session(&req, pdu_ue->param.pdusession_id);
|
||||
@@ -2074,7 +2074,7 @@ static void e1_send_bearer_updates(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, int n, f
|
||||
|
||||
static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
f1ap_ue_context_setup_t *resp = &F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
||||
f1ap_ue_context_setup_resp_t *resp = &F1AP_UE_CONTEXT_SETUP_RESP(msg_p);
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[instance];
|
||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, resp->gNB_CU_ue_id);
|
||||
if (!ue_context_p) {
|
||||
@@ -2085,11 +2085,9 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, instance
|
||||
UE->f1_ue_context_active = true;
|
||||
|
||||
NR_CellGroupConfig_t *cellGroupConfig = NULL;
|
||||
asn_dec_rval_t dec_rval = uper_decode_complete(NULL,
|
||||
&asn_DEF_NR_CellGroupConfig,
|
||||
(void **)&cellGroupConfig,
|
||||
(uint8_t *)resp->du_to_cu_rrc_information->cellGroupConfig,
|
||||
resp->du_to_cu_rrc_information->cellGroupConfig_length);
|
||||
byte_array_t *cgc = &resp->du_to_cu_rrc_info.cell_group_config;
|
||||
asn_dec_rval_t dec_rval =
|
||||
uper_decode_complete(NULL, &asn_DEF_NR_CellGroupConfig, (void **)&cellGroupConfig, (uint8_t *)cgc->buf, cgc->len);
|
||||
AssertFatal(dec_rval.code == RC_OK && dec_rval.consumed > 0, "Cell group config decode error\n");
|
||||
|
||||
if (UE->masterCellGroup) {
|
||||
@@ -2105,16 +2103,16 @@ static void rrc_CU_process_ue_context_setup_response(MessageDef *msg_p, instance
|
||||
return;
|
||||
}
|
||||
|
||||
if (resp->drbs_to_be_setup_length > 0) {
|
||||
if (resp->drbs_len > 0) {
|
||||
int num_drb = get_number_active_drbs(UE);
|
||||
DevAssert(num_drb == 0 || num_drb == resp->drbs_to_be_setup_length);
|
||||
DevAssert(num_drb == 0 || num_drb == resp->drbs_len);
|
||||
|
||||
/* Note: we would ideally check that SRB2 is acked, but at least LiteOn DU
|
||||
* seems buggy and does not ack, so simply check that locally we activated */
|
||||
AssertFatal(UE->Srb[1].Active && UE->Srb[2].Active, "SRBs 1 and 2 must be active during DRB Establishment");
|
||||
store_du_f1u_tunnel(resp->drbs_to_be_setup, resp->drbs_to_be_setup_length, UE);
|
||||
store_du_f1u_tunnel(resp->drbs, resp->drbs_len, UE);
|
||||
if (num_drb == 0)
|
||||
e1_send_bearer_updates(rrc, UE, resp->drbs_to_be_setup_length, resp->drbs_to_be_setup);
|
||||
e1_send_bearer_updates(rrc, UE, resp->drbs_len, resp->drbs);
|
||||
else
|
||||
cuup_notify_reestablishment(rrc, UE);
|
||||
}
|
||||
@@ -2232,7 +2230,7 @@ static void rrc_CU_process_ue_context_release_complete(MessageDef *msg_p)
|
||||
|
||||
static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, instance_t instance)
|
||||
{
|
||||
f1ap_ue_context_modif_resp_t *resp = &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg_p);
|
||||
f1ap_ue_context_mod_resp_t *resp = &F1AP_UE_CONTEXT_MODIFICATION_RESP(msg_p);
|
||||
gNB_RRC_INST *rrc = RC.nrrrc[instance];
|
||||
rrc_gNB_ue_context_t *ue_context_p = rrc_gNB_get_ue_context(rrc, resp->gNB_CU_ue_id);
|
||||
if (!ue_context_p) {
|
||||
@@ -2241,18 +2239,16 @@ static void rrc_CU_process_ue_context_modification_response(MessageDef *msg_p, i
|
||||
}
|
||||
gNB_RRC_UE_t *UE = &ue_context_p->ue_context;
|
||||
|
||||
if (resp->drbs_to_be_setup_length > 0) {
|
||||
store_du_f1u_tunnel(resp->drbs_to_be_setup, resp->drbs_to_be_setup_length, UE);
|
||||
e1_send_bearer_updates(rrc, UE, resp->drbs_to_be_setup_length, resp->drbs_to_be_setup);
|
||||
if (resp->drbs_len > 0) {
|
||||
store_du_f1u_tunnel(resp->drbs, resp->drbs_len, UE);
|
||||
e1_send_bearer_updates(rrc, UE, resp->drbs_len, resp->drbs);
|
||||
}
|
||||
|
||||
if (resp->du_to_cu_rrc_information != NULL && resp->du_to_cu_rrc_information->cellGroupConfig != NULL) {
|
||||
if (resp->du_to_cu_rrc_info) {
|
||||
NR_CellGroupConfig_t *cellGroupConfig = NULL;
|
||||
asn_dec_rval_t dec_rval = uper_decode_complete(NULL,
|
||||
&asn_DEF_NR_CellGroupConfig,
|
||||
(void **)&cellGroupConfig,
|
||||
(uint8_t *)resp->du_to_cu_rrc_information->cellGroupConfig,
|
||||
resp->du_to_cu_rrc_information->cellGroupConfig_length);
|
||||
byte_array_t *cgc = &resp->du_to_cu_rrc_info->cell_group_config;
|
||||
asn_dec_rval_t dec_rval =
|
||||
uper_decode_complete(NULL, &asn_DEF_NR_CellGroupConfig, (void **)&cellGroupConfig, (uint8_t *)cgc->buf, cgc->len);
|
||||
AssertFatal(dec_rval.code == RC_OK && dec_rval.consumed > 0, "Cell group config decode error\n");
|
||||
|
||||
if (UE->masterCellGroup) {
|
||||
@@ -2769,10 +2765,12 @@ void *rrc_gnb_task(void *args_p) {
|
||||
|
||||
case F1AP_UE_CONTEXT_SETUP_RESP:
|
||||
rrc_CU_process_ue_context_setup_response(msg_p, instance);
|
||||
free_ue_context_setup_resp(&F1AP_UE_CONTEXT_SETUP_RESP(msg_p));
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_MODIFICATION_RESP:
|
||||
rrc_CU_process_ue_context_modification_response(msg_p, instance);
|
||||
free_ue_context_mod_resp(&F1AP_UE_CONTEXT_MODIFICATION_RESP(msg_p));
|
||||
break;
|
||||
|
||||
case F1AP_UE_CONTEXT_MODIFICATION_REQUIRED:
|
||||
|
||||
@@ -385,7 +385,7 @@ static NR_CG_Config_t *generate_CG_Config(const NR_RRCReconfiguration_t *reconfi
|
||||
return cg_Config;
|
||||
}
|
||||
|
||||
void rrc_add_nsa_user_resp(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, const f1ap_ue_context_setup_t *resp)
|
||||
void rrc_add_nsa_user_resp(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, const f1ap_ue_context_setup_resp_t *resp)
|
||||
{
|
||||
DevAssert(resp->crnti != NULL);
|
||||
/* we did not fill any DU-related ID info in rrc_add_nsa_user() */
|
||||
@@ -400,12 +400,12 @@ void rrc_add_nsa_user_resp(gNB_RRC_INST *rrc, gNB_RRC_UE_t *UE, const f1ap_ue_co
|
||||
if (f1inst >= 0) {
|
||||
// Note: E1 support for NSA/phy-test/do-ra not implemented yet
|
||||
// so set up GTP from here
|
||||
for (int i = 0; i < resp->drbs_to_be_setup_length; ++i) {
|
||||
f1ap_drb_to_be_setup_t *drb = &resp->drbs_to_be_setup[i];
|
||||
DevAssert(drb->up_dl_tnl_length == 1);
|
||||
for (int i = 0; i < resp->drbs_len; ++i) {
|
||||
f1ap_drb_setup_t *drb = &resp->drbs[i];
|
||||
DevAssert(drb->up_dl_tnl_len == 1);
|
||||
in_addr_t addr = drb->up_dl_tnl[0].tl_address;
|
||||
uint32_t teid = drb->up_dl_tnl[0].teid;
|
||||
GtpuUpdateTunnelOutgoingAddressAndTeid(f1inst, UE->rrc_ue_id, drb->drb_id, addr, teid);
|
||||
GtpuUpdateTunnelOutgoingAddressAndTeid(f1inst, UE->rrc_ue_id, drb->id, addr, teid);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user