Use enc/dec lib for E1 Bearer Context Setup Response in stack
This commit is contained in:
+9
-242
@@ -579,150 +579,11 @@ void e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(sctp_assoc_t assoc_id, e1ap_bear
|
||||
e1ap_encode_send(CPtype, assoc_id, pdu, 0, __func__);
|
||||
}
|
||||
|
||||
static void fill_BEARER_CONTEXT_SETUP_RESPONSE(const e1ap_bearer_setup_resp_t *resp, E1AP_E1AP_PDU_t *pdu)
|
||||
{
|
||||
/* Create */
|
||||
/* 0. pdu Type */
|
||||
pdu->present = E1AP_E1AP_PDU_PR_successfulOutcome;
|
||||
asn1cCalloc(pdu->choice.successfulOutcome, msg);
|
||||
msg->procedureCode = E1AP_ProcedureCode_id_bearerContextSetup;
|
||||
msg->criticality = E1AP_Criticality_reject;
|
||||
msg->value.present = E1AP_SuccessfulOutcome__value_PR_BearerContextSetupResponse;
|
||||
E1AP_BearerContextSetupResponse_t *out = &pdu->choice.successfulOutcome->value.choice.BearerContextSetupResponse;
|
||||
/* mandatory */
|
||||
/* c1. gNB-CU-CP UE E1AP ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, E1AP_BearerContextSetupResponseIEs_t, ieC1);
|
||||
ieC1->id = E1AP_ProtocolIE_ID_id_gNB_CU_CP_UE_E1AP_ID;
|
||||
ieC1->criticality = E1AP_Criticality_reject;
|
||||
ieC1->value.present = E1AP_BearerContextSetupResponseIEs__value_PR_GNB_CU_CP_UE_E1AP_ID;
|
||||
ieC1->value.choice.GNB_CU_CP_UE_E1AP_ID = resp->gNB_cu_cp_ue_id;
|
||||
/* mandatory */
|
||||
/* c2. gNB-CU-UP UE E1AP ID */
|
||||
asn1cSequenceAdd(out->protocolIEs.list, E1AP_BearerContextSetupResponseIEs_t, ieC2);
|
||||
ieC2->id = E1AP_ProtocolIE_ID_id_gNB_CU_UP_UE_E1AP_ID;
|
||||
ieC2->criticality = E1AP_Criticality_reject;
|
||||
ieC2->value.present = E1AP_BearerContextSetupResponseIEs__value_PR_GNB_CU_UP_UE_E1AP_ID;
|
||||
ieC2->value.choice.GNB_CU_CP_UE_E1AP_ID = resp->gNB_cu_up_ue_id;
|
||||
|
||||
asn1cSequenceAdd(out->protocolIEs.list, E1AP_BearerContextSetupResponseIEs_t, ieC3);
|
||||
ieC3->id = E1AP_ProtocolIE_ID_id_System_BearerContextSetupResponse;
|
||||
ieC3->criticality = E1AP_Criticality_reject;
|
||||
ieC3->value.present = E1AP_BearerContextSetupResponseIEs__value_PR_System_BearerContextSetupResponse;
|
||||
/*if (0) { // EUTRAN
|
||||
ieC3->value.choice.System_BearerContextSetupResponse.present =
|
||||
E1AP_System_BearerContextSetupResponse_PR_e_UTRAN_BearerContextSetupResponse;
|
||||
E1AP_ProtocolIE_Container_4932P21_t *msgEUTRAN_list = calloc(1,
|
||||
sizeof(E1AP_ProtocolIE_Container_4932P21_t));
|
||||
ieC3->value.choice.System_BearerContextSetupResponse.choice.e_UTRAN_BearerContextSetupResponse
|
||||
= (struct E1AP_ProtocolIE_Container *) msgEUTRAN_list;
|
||||
asn1cSequenceAdd(msgEUTRAN_list->list,
|
||||
E1AP_EUTRAN_BearerContextSetupResponse_t, msgEUTRAN); msgEUTRAN->id =
|
||||
E1AP_ProtocolIE_ID_id_DRB_Setup_List_EUTRAN; msgEUTRAN->criticality =
|
||||
E1AP_Criticality_reject; msgEUTRAN->value.present =
|
||||
E1AP_EUTRAN_BearerContextSetupResponse__value_PR_DRB_Setup_List_EUTRAN;
|
||||
E1AP_DRB_Setup_List_EUTRAN_t *drbSetup =
|
||||
&msgEUTRAN->value.choice.DRB_Setup_List_EUTRAN;
|
||||
|
||||
for (drb_setup_t *i=resp->DRBList; i < resp->DRBList+resp->numDRBs; i++) {
|
||||
asn1cSequenceAdd(drbSetup->list, E1AP_DRB_Setup_Item_EUTRAN_t, ieC3_1);
|
||||
ieC3_1->dRB_ID = i->drbId;
|
||||
|
||||
ieC3_1->s1_DL_UP_TNL_Information.present =
|
||||
E1AP_UP_TNL_Information_PR_gTPTunnel;
|
||||
asn1cCalloc(ieC3_1->s1_DL_UP_TNL_Information.choice.gTPTunnel, gTPTunnel);
|
||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(i->tlAddress,
|
||||
&gTPTunnel->transportLayerAddress); INT32_TO_OCTET_STRING(i->teId,
|
||||
&gTPTunnel->gTP_TEID);
|
||||
|
||||
for (up_params_t *j=i->UpParamList; j < i->UpParamList+i->numUpParam; j++)
|
||||
{ asn1cSequenceAdd(ieC3_1->uL_UP_Transport_Parameters.list,
|
||||
E1AP_UP_Parameters_Item_t, ieC3_1_1); ieC3_1_1->uP_TNL_Information.present =
|
||||
E1AP_UP_TNL_Information_PR_gTPTunnel;
|
||||
asn1cCalloc(ieC3_1_1->uP_TNL_Information.choice.gTPTunnel, gTPTunnel);
|
||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(j->tlAddress,
|
||||
&gTPTunnel->transportLayerAddress); INT32_TO_OCTET_STRING(j->teId,
|
||||
&gTPTunnel->gTP_TEID);
|
||||
}
|
||||
}
|
||||
} else */
|
||||
{
|
||||
ieC3->value.choice.System_BearerContextSetupResponse.present =
|
||||
E1AP_System_BearerContextSetupResponse_PR_nG_RAN_BearerContextSetupResponse;
|
||||
E1AP_ProtocolIE_Container_4932P22_t *msgNGRAN_list = calloc(1, sizeof(E1AP_ProtocolIE_Container_4932P22_t));
|
||||
ieC3->value.choice.System_BearerContextSetupResponse.choice.nG_RAN_BearerContextSetupResponse =
|
||||
(struct E1AP_ProtocolIE_Container *)msgNGRAN_list;
|
||||
asn1cSequenceAdd(msgNGRAN_list->list, E1AP_NG_RAN_BearerContextSetupResponse_t, msgNGRAN);
|
||||
msgNGRAN->id = E1AP_ProtocolIE_ID_id_PDU_Session_Resource_Setup_List;
|
||||
msgNGRAN->criticality = E1AP_Criticality_reject;
|
||||
msgNGRAN->value.present = E1AP_NG_RAN_BearerContextSetupResponse__value_PR_PDU_Session_Resource_Setup_List;
|
||||
E1AP_PDU_Session_Resource_Setup_List_t *pduSetup = &msgNGRAN->value.choice.PDU_Session_Resource_Setup_List;
|
||||
|
||||
for (const pdu_session_setup_t *i = resp->pduSession; i < resp->pduSession + resp->numPDUSessions; i++) {
|
||||
asn1cSequenceAdd(pduSetup->list, E1AP_PDU_Session_Resource_Setup_Item_t, ieC3_1);
|
||||
ieC3_1->pDU_Session_ID = i->id;
|
||||
|
||||
ieC3_1->nG_DL_UP_TNL_Information.present = E1AP_UP_TNL_Information_PR_gTPTunnel;
|
||||
asn1cCalloc(ieC3_1->nG_DL_UP_TNL_Information.choice.gTPTunnel, gTPTunnel);
|
||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(i->tlAddress, &gTPTunnel->transportLayerAddress);
|
||||
INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID);
|
||||
|
||||
for (const DRB_nGRAN_setup_t *j = i->DRBnGRanList; j < i->DRBnGRanList + i->numDRBSetup; j++) {
|
||||
asn1cSequenceAdd(ieC3_1->dRB_Setup_List_NG_RAN.list, E1AP_DRB_Setup_Item_NG_RAN_t, ieC3_1_1);
|
||||
ieC3_1_1->dRB_ID = j->id;
|
||||
|
||||
for (const up_params_t *k = j->UpParamList; k < j->UpParamList + j->numUpParam; k++) {
|
||||
asn1cSequenceAdd(ieC3_1_1->uL_UP_Transport_Parameters.list, E1AP_UP_Parameters_Item_t, ieC3_1_1_1);
|
||||
ieC3_1_1_1->uP_TNL_Information.present = E1AP_UP_TNL_Information_PR_gTPTunnel;
|
||||
asn1cCalloc(ieC3_1_1_1->uP_TNL_Information.choice.gTPTunnel, gTPTunnel);
|
||||
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(k->tlAddress, &gTPTunnel->transportLayerAddress);
|
||||
INT32_TO_OCTET_STRING(k->teId, &gTPTunnel->gTP_TEID);
|
||||
}
|
||||
|
||||
for (const qos_flow_setup_t *k = j->qosFlows; k < j->qosFlows + j->numQosFlowSetup; k++) {
|
||||
asn1cSequenceAdd(ieC3_1_1->flow_Setup_List.list, E1AP_QoS_Flow_Item_t, ieC3_1_1_1);
|
||||
ieC3_1_1_1->qoS_Flow_Identifier = k->qfi;
|
||||
}
|
||||
}
|
||||
|
||||
if (i->numDRBFailed > 0)
|
||||
ieC3_1->dRB_Failed_List_NG_RAN = calloc(1, sizeof(E1AP_DRB_Failed_List_NG_RAN_t));
|
||||
|
||||
for (const DRB_nGRAN_failed_t *j = i->DRBnGRanFailedList; j < i->DRBnGRanFailedList + i->numDRBFailed; j++) {
|
||||
asn1cSequenceAdd(ieC3_1->dRB_Failed_List_NG_RAN->list, E1AP_DRB_Failed_Item_NG_RAN_t, ieC3_1_1);
|
||||
ieC3_1_1->dRB_ID = j->id;
|
||||
|
||||
ieC3_1_1->cause.present = j->cause_type;
|
||||
switch (ieC3_1_1->cause.present) {
|
||||
case E1AP_Cause_PR_radioNetwork:
|
||||
ieC3_1_1->cause.choice.radioNetwork = j->cause;
|
||||
break;
|
||||
|
||||
case E1AP_Cause_PR_transport:
|
||||
ieC3_1_1->cause.choice.transport = j->cause;
|
||||
break;
|
||||
|
||||
case E1AP_Cause_PR_protocol:
|
||||
ieC3_1_1->cause.choice.protocol = j->cause;
|
||||
break;
|
||||
|
||||
case E1AP_Cause_PR_misc:
|
||||
ieC3_1_1->cause.choice.misc = j->cause;
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_E(E1AP, "DRB setup failure cause out of expected range\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(sctp_assoc_t assoc_id, const e1ap_bearer_setup_resp_t *resp)
|
||||
{
|
||||
E1AP_E1AP_PDU_t pdu = {0};
|
||||
fill_BEARER_CONTEXT_SETUP_RESPONSE(resp, &pdu);
|
||||
e1ap_encode_send(UPtype, assoc_id, &pdu, 0, __func__);
|
||||
// Encode
|
||||
E1AP_E1AP_PDU_t *pdu = encode_E1_bearer_context_setup_response(resp);
|
||||
e1ap_encode_send(UPtype, assoc_id, pdu, 0, __func__);
|
||||
}
|
||||
|
||||
int e1apCUUP_send_BEARER_CONTEXT_SETUP_FAILURE(instance_t instance)
|
||||
@@ -743,110 +604,15 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(sctp_assoc_t assoc_id, e1ap_upc
|
||||
return 0;
|
||||
}
|
||||
|
||||
void extract_BEARER_CONTEXT_SETUP_RESPONSE(const E1AP_E1AP_PDU_t *pdu, e1ap_bearer_setup_resp_t *bearerCxt)
|
||||
{
|
||||
const E1AP_BearerContextSetupResponse_t *in = &pdu->choice.successfulOutcome->value.choice.BearerContextSetupResponse;
|
||||
E1AP_BearerContextSetupResponseIEs_t *ie;
|
||||
|
||||
LOG_D(E1AP, "Bearer context setup response number of IEs %d\n", in->protocolIEs.list.count);
|
||||
|
||||
for (int i = 0; i < in->protocolIEs.list.count; i++) {
|
||||
ie = in->protocolIEs.list.array[i];
|
||||
|
||||
switch(ie->id) {
|
||||
case E1AP_ProtocolIE_ID_id_gNB_CU_CP_UE_E1AP_ID:
|
||||
DevAssert(ie->criticality == E1AP_Criticality_reject);
|
||||
DevAssert(ie->value.present == E1AP_BearerContextSetupResponseIEs__value_PR_GNB_CU_CP_UE_E1AP_ID);
|
||||
bearerCxt->gNB_cu_cp_ue_id = ie->value.choice.GNB_CU_CP_UE_E1AP_ID;
|
||||
break;
|
||||
|
||||
case E1AP_ProtocolIE_ID_id_gNB_CU_UP_UE_E1AP_ID:
|
||||
DevAssert(ie->criticality == E1AP_Criticality_reject);
|
||||
DevAssert(ie->value.present == E1AP_BearerContextSetupResponseIEs__value_PR_GNB_CU_UP_UE_E1AP_ID);
|
||||
bearerCxt->gNB_cu_up_ue_id = ie->value.choice.GNB_CU_UP_UE_E1AP_ID;
|
||||
break;
|
||||
|
||||
case E1AP_ProtocolIE_ID_id_System_BearerContextSetupResponse:
|
||||
DevAssert(ie->criticality == E1AP_Criticality_reject);
|
||||
DevAssert(ie->value.present == E1AP_BearerContextSetupResponseIEs__value_PR_System_BearerContextSetupResponse);
|
||||
DevAssert(ie->value.choice.System_BearerContextSetupResponse.present
|
||||
== E1AP_System_BearerContextSetupResponse_PR_nG_RAN_BearerContextSetupResponse);
|
||||
E1AP_ProtocolIE_Container_4932P22_t *msgNGRAN_list =
|
||||
(E1AP_ProtocolIE_Container_4932P22_t *)
|
||||
ie->value.choice.System_BearerContextSetupResponse.choice.nG_RAN_BearerContextSetupResponse;
|
||||
DevAssert(msgNGRAN_list->list.count == 1);
|
||||
E1AP_NG_RAN_BearerContextSetupResponse_t *msgNGRAN = msgNGRAN_list->list.array[0];
|
||||
DevAssert(msgNGRAN->id == E1AP_ProtocolIE_ID_id_PDU_Session_Resource_Setup_List);
|
||||
DevAssert(msgNGRAN->criticality == E1AP_Criticality_reject);
|
||||
DevAssert(msgNGRAN->value.present == E1AP_NG_RAN_BearerContextSetupResponse__value_PR_PDU_Session_Resource_Setup_List);
|
||||
E1AP_PDU_Session_Resource_Setup_List_t *pduSetupList = &msgNGRAN->value.choice.PDU_Session_Resource_Setup_List;
|
||||
bearerCxt->numPDUSessions = pduSetupList->list.count;
|
||||
|
||||
for (int i = 0; i < pduSetupList->list.count; i++) {
|
||||
pdu_session_setup_t *pduSetup = bearerCxt->pduSession + i;
|
||||
E1AP_PDU_Session_Resource_Setup_Item_t *pdu_session = pduSetupList->list.array[i];
|
||||
pduSetup->id = pdu_session->pDU_Session_ID;
|
||||
|
||||
if (pdu_session->nG_DL_UP_TNL_Information.choice.gTPTunnel) {
|
||||
DevAssert(pdu_session->nG_DL_UP_TNL_Information.present == E1AP_UP_TNL_Information_PR_gTPTunnel);
|
||||
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(
|
||||
&pdu_session->nG_DL_UP_TNL_Information.choice.gTPTunnel->transportLayerAddress,
|
||||
pduSetup->tlAddress);
|
||||
OCTET_STRING_TO_INT32(&pdu_session->nG_DL_UP_TNL_Information.choice.gTPTunnel->gTP_TEID, pduSetup->teId);
|
||||
}
|
||||
|
||||
pduSetup->numDRBSetup = pdu_session->dRB_Setup_List_NG_RAN.list.count;
|
||||
for (int j = 0; j < pdu_session->dRB_Setup_List_NG_RAN.list.count; j++) {
|
||||
DRB_nGRAN_setup_t *drbSetup = pduSetup->DRBnGRanList + j;
|
||||
E1AP_DRB_Setup_Item_NG_RAN_t *drb = pdu_session->dRB_Setup_List_NG_RAN.list.array[j];
|
||||
|
||||
drbSetup->id = drb->dRB_ID;
|
||||
|
||||
drbSetup->numUpParam = drb->uL_UP_Transport_Parameters.list.count;
|
||||
for (int k = 0; k < drb->uL_UP_Transport_Parameters.list.count; k++) {
|
||||
up_params_t *UL_UP_param = drbSetup->UpParamList + k;
|
||||
E1AP_UP_Parameters_Item_t *in_UL_UP_param = drb->uL_UP_Transport_Parameters.list.array[k];
|
||||
|
||||
DevAssert(in_UL_UP_param->uP_TNL_Information.present == E1AP_UP_TNL_Information_PR_gTPTunnel);
|
||||
E1AP_GTPTunnel_t *gTPTunnel = in_UL_UP_param->uP_TNL_Information.choice.gTPTunnel;
|
||||
if (gTPTunnel) {
|
||||
BIT_STRING_TO_TRANSPORT_LAYER_ADDRESS_IPv4(&gTPTunnel->transportLayerAddress, UL_UP_param->tlAddress);
|
||||
OCTET_STRING_TO_INT32(&gTPTunnel->gTP_TEID, UL_UP_param->teId);
|
||||
} else {
|
||||
AssertFatal(false, "gTPTunnel information in required\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Qos Flow Information
|
||||
drbSetup->numQosFlowSetup = drb->flow_Setup_List.list.count;
|
||||
for (int q = 0; q < drb->flow_Setup_List.list.count; q++) {
|
||||
qos_flow_setup_t *qosflowSetup = &drbSetup->qosFlows[q];
|
||||
E1AP_QoS_Flow_Item_t *in_qosflowSetup = drb->flow_Setup_List.list.array[q];
|
||||
qosflowSetup->qfi = in_qosflowSetup->qoS_Flow_Identifier;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// TODO: remaining IE handlers
|
||||
|
||||
default:
|
||||
LOG_E(E1AP, "Handle for this IE is not implemented (or) invalid IE detected\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int e1apCUCP_handle_BEARER_CONTEXT_SETUP_RESPONSE(sctp_assoc_t assoc_id, e1ap_upcp_inst_t *inst, const E1AP_E1AP_PDU_t *pdu)
|
||||
{
|
||||
DevAssert(pdu->present == E1AP_E1AP_PDU_PR_successfulOutcome);
|
||||
DevAssert(pdu->choice.successfulOutcome->procedureCode == E1AP_ProcedureCode_id_bearerContextSetup);
|
||||
DevAssert(pdu->choice.successfulOutcome->criticality == E1AP_Criticality_reject);
|
||||
DevAssert(pdu->choice.successfulOutcome->value.present == E1AP_SuccessfulOutcome__value_PR_BearerContextSetupResponse);
|
||||
|
||||
MessageDef *msg = itti_alloc_new_message(TASK_CUCP_E1, 0, E1AP_BEARER_CONTEXT_SETUP_RESP);
|
||||
// Decode
|
||||
e1ap_bearer_setup_resp_t *bearerCxt = &E1AP_BEARER_CONTEXT_SETUP_RESP(msg);
|
||||
extract_BEARER_CONTEXT_SETUP_RESPONSE(pdu, bearerCxt);
|
||||
if (!decode_E1_bearer_context_setup_response(pdu, bearerCxt)) {
|
||||
LOG_E(E1AP, "Failed to decode Bearer Context Setup Response\n");
|
||||
return -1;
|
||||
}
|
||||
msg->ittiMsgHeader.originInstance = assoc_id;
|
||||
// Fixme: instance is the NGAP instance, no good way to set it here
|
||||
instance_t instance = 0;
|
||||
@@ -1739,6 +1505,7 @@ void *E1AP_CUUP_task(void *arg)
|
||||
const e1ap_upcp_inst_t *inst = getCxtE1(myInstance);
|
||||
AssertFatal(inst, "no E1 instance found for instance %ld\n", myInstance);
|
||||
e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(inst->cuup.assoc_id, resp);
|
||||
free_e1ap_context_setup_response(resp);
|
||||
} break;
|
||||
|
||||
case E1AP_BEARER_CONTEXT_MODIFICATION_RESP: {
|
||||
|
||||
@@ -94,6 +94,7 @@
|
||||
#include "utils.h"
|
||||
#include "x2ap_messages_types.h"
|
||||
#include "xer_encoder.h"
|
||||
#include "E1AP/lib/e1ap_bearer_context_management.h"
|
||||
|
||||
#ifdef E2_AGENT
|
||||
#include "openair2/E2AP/RAN_FUNCTION/O-RAN/ran_func_rc_extern.h"
|
||||
@@ -2595,6 +2596,7 @@ void *rrc_gnb_task(void *args_p) {
|
||||
|
||||
case E1AP_BEARER_CONTEXT_SETUP_RESP:
|
||||
rrc_gNB_process_e1_bearer_context_setup_resp(&E1AP_BEARER_CONTEXT_SETUP_RESP(msg_p), instance);
|
||||
free_e1ap_context_setup_response(&E1AP_BEARER_CONTEXT_SETUP_RESP(msg_p));
|
||||
break;
|
||||
|
||||
case E1AP_BEARER_CONTEXT_MODIFICATION_RESP:
|
||||
|
||||
Reference in New Issue
Block a user