diff --git a/CMakeLists.txt b/CMakeLists.txt index 086ccce195a54bf9ed6ef32695274cf14e0ba646..fe41692e800a09a3cb09d29d4292b43be4fddd11 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1325,6 +1325,8 @@ add_library(NFAPI_COMMON_LIB ${NFAPI_COMMON_SRC}) include_directories(${NFAPI_DIR}/common/public_inc) +include_directories(${CMAKE_CURRENT_BINARY_DIR}/openair2/E1AP/MESSAGES/) + set(NFAPI_SRC ${NFAPI_DIR}/nfapi/src/nfapi.c ${NFAPI_DIR}/nfapi/src/nfapi_p4.c diff --git a/common/utils/ocp_itti/intertask_interface.h b/common/utils/ocp_itti/intertask_interface.h index be4f489fd72e492398c35dadfdcdd03509b07797..cb7b7c6a525bcf530f0e4781f05c558f3b1e98f0 100644 --- a/common/utils/ocp_itti/intertask_interface.h +++ b/common/utils/ocp_itti/intertask_interface.h @@ -79,6 +79,7 @@ typedef struct IttiMsgText_s { #include <openair2/COMMON/as_message.h> #include <openair2/RRC/LTE/rrc_types.h> #include <openair2/COMMON/rrc_messages_types.h> +#include <openair2/COMMON/e1ap_messages_types.h> #include <openair3/NAS/COMMON/UTIL/OctetString.h> #include <openair3/NAS/COMMON/IES/AccessPointName.h> diff --git a/openair2/COMMON/e1ap_messages_def.h b/openair2/COMMON/e1ap_messages_def.h index 40f3b081f458505bc2a0f44fdfe55082e5bfd637..ee3b1e45dfa3403412491913a93305479c56957d 100644 --- a/openair2/COMMON/e1ap_messages_def.h +++ b/openair2/COMMON/e1ap_messages_def.h @@ -19,13 +19,13 @@ * contact@openairinterface.org */ -#ifndef E1AP_MESSAGES_DEF_H_ -#define E1AP_MESSAGES_DEF_H_ - /* gNB_CUUP application layer -> E1AP messages */ MESSAGE_DEF(E1AP_SETUP_REQ , MESSAGE_PRIORITY_MED , e1ap_setup_req_t , e1ap_setup_req) /* E1AP -> eNB_DU or eNB_CU_RRC -> E1AP application layer messages */ MESSAGE_DEF(E1AP_SETUP_RESP , MESSAGE_PRIORITY_MED, e1ap_setup_resp_t , e1ap_setup_resp) -#endif /* E1AP_MESSAGES_DEF_H_ */ +MESSAGE_DEF(E1AP_BEARER_CONTEXT_SETUP_REQ , MESSAGE_PRIORITY_MED , e1ap_bearer_setup_req_t , e1ap_bearer_setup_req) + +MESSAGE_DEF(E1AP_BEARER_CONTEXT_SETUP_RESP , MESSAGE_PRIORITY_MED , e1ap_bearer_setup_resp_t , e1ap_bearer_setup_resp) + diff --git a/openair2/COMMON/e1ap_messages_types.h b/openair2/COMMON/e1ap_messages_types.h new file mode 100644 index 0000000000000000000000000000000000000000..b1161e2b6da6da56d901f885121b1d3156d2266f --- /dev/null +++ b/openair2/COMMON/e1ap_messages_types.h @@ -0,0 +1,211 @@ +/* + * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The OpenAirInterface Software Alliance licenses this file to You under + * the OAI Public License, Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.openairinterface.org/?page_id=698 + * + * Author and copyright: Laurent Thomas, open-cells.com + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *------------------------------------------------------------------------------- + * For more information about the OpenAirInterface (OAI) Software Alliance: + * contact@openairinterface.org + */ + +#ifndef E1AP_MESSAGES_TYPES_H +#define E1AP_MESSAGES_TYPES_H + +#include "E1AP_E1AP-PDU.h" +#include "E1AP_TransactionID.h" +#include "E1AP_PriorityLevel.h" + +#define E1AP_MAX_NUM_TRANSAC_IDS 4 +#define E1AP_MAX_NUM_PLMNS 4 +#define E1AP_MAX_NUM_CELL_GROUPS 4 +#define E1AP_MAX_NUM_QOS_FLOWS 4 +#define E1AP_MAX_NUM_NGRAN_DRB 4 +#define E1AP_MAX_NUM_PDU_SESSIONS 4 +#define E1AP_MAX_NUM_DRBS 4 +#define E1AP_MAX_NUM_DRBS 4 +#define E1AP_MAX_NUM_UP_PARAM 4 + +#define E1AP_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.e1ap_setup_req +#define E1AP_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.e1ap_setup_resp +#define E1AP_BEARER_CONTEXT_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.e1ap_bearer_setup_req +#define E1AP_BEARER_CONTEXT_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.e1ap_bearer_setup_resp + +#define E1AP_PORT_NUMBER 25 +#define E1AP_SCTP_PPID 63 + +typedef f1ap_net_ip_address_t e1ap_net_ip_address_t; + +typedef int (*e1ap_message_processing_t)( + instance_t instance, + E1AP_E1AP_PDU_t *message_p +); + +typedef struct PLMN_ID_s { + int mcc; + int mnc; + int mnc_digit_length; +} PLMN_ID_t; + +typedef struct e1ap_setup_req_s { + uint64_t gNB_cu_up_id; + char * gNB_cu_up_name; + int assoc_id; + uint64_t transac_id; + int supported_plmns; + PLMN_ID_t plmns[E1AP_MAX_NUM_PLMNS]; + uint16_t sctp_in_streams; + uint16_t sctp_out_streams; + uint16_t default_sctp_stream_id; + e1ap_net_ip_address_t CUUP_e1_ip_address; + e1ap_net_ip_address_t CUCP_e1_ip_address; + long cn_support; + int port_cuup; + int port_cucp; +} e1ap_setup_req_t; + +typedef struct e1ap_setup_resp_s { + long transac_id; +} e1ap_setup_resp_t; + +typedef struct cell_group_s { + long id; +} cell_group_t; + +typedef struct drb_to_setup_s { + long drbId; + long pDCP_SN_Size_UL; + long pDCP_SN_Size_DL; + long rLC_Mode; + long qci; + long qosPriorityLevel; + long pre_emptionCapability; + long pre_emptionVulnerability; + in_addr_t tlAddress; + long teId; + int numCellGroups; + cell_group_t cellGroupList[E1AP_MAX_NUM_CELL_GROUPS]; +} drb_to_setup_t; + +typedef struct qos_flow_to_setup_s { + long id; + long fiveQI; + long qoSPriorityLevel; + long packetDelayBudget; + long packetError_scalar; + long packetError_exponent; + long priorityLevel; + long pre_emptionCapability; + long pre_emptionVulnerability; +} qos_flow_to_setup_t; + +typedef struct DRB_nGRAN_to_setup_s { + long id; + long defaultDRB; + long sDAP_Header_UL; + long sDAP_Header_DL; + int numCellGroups; + cell_group_t cellGroupList[E1AP_MAX_NUM_CELL_GROUPS]; + int numQosFlow2Setup; + qos_flow_to_setup_t qosFlows[E1AP_MAX_NUM_QOS_FLOWS]; +} DRB_nGRAN_to_setup_t; + +typedef struct pdu_session_to_setup_s { + long sessionId; + long sessionType; + int32_t sst; + long integrityProtectionIndication; + long confidentialityProtectionIndication; + in_addr_t tlAddress; + int32_t teId; + long numDRB2Setup; + DRB_nGRAN_to_setup_t DRBnGRanList[E1AP_MAX_NUM_NGRAN_DRB]; +} pdu_session_to_setup_t; + +typedef struct e1ap_bearer_setup_req_s { + uint64_t gNB_cu_cp_ue_id; + uint64_t cipheringAlgorithm; + char encryptionKey[128]; + long bitRate; + PLMN_ID_t servingPLMNid; + long activityNotificationLevel; + int numDRBs; + drb_to_setup_t DRBList[E1AP_MAX_NUM_DRBS]; + int numPDUSessions; + pdu_session_to_setup_t pduSession[E1AP_MAX_NUM_PDU_SESSIONS]; +} e1ap_bearer_setup_req_t; + +typedef struct up_params_s { + in_addr_t tlAddress; + long teId; +} up_params_t; + +typedef struct drb_setup_s { + int drbId; + in_addr_t tlAddress; + int teId; + int numUpParam; + up_params_t UpParamList[E1AP_MAX_NUM_UP_PARAM]; +} drb_setup_t; + +typedef struct qos_flow_setup_s { + long id; +} qos_flow_setup_t; + +typedef struct DRB_nGRAN_setup_s { + long id; + int numUpParam; + up_params_t UpParamList[E1AP_MAX_NUM_UP_PARAM]; + int numQosFlowSetup; + qos_flow_setup_t qosFlows[E1AP_MAX_NUM_QOS_FLOWS]; +} DRB_nGRAN_setup_t; + +typedef struct DRB_nGRAN_failed_s { + long id; + long cause_type; + long cause; +} DRB_nGRAN_failed_t; + +typedef struct pdu_session_setup_s { + long id; + in_addr_t tlAddress; + long teId; + int numDRBSetup; + DRB_nGRAN_setup_t DRBnGRanList[E1AP_MAX_NUM_NGRAN_DRB]; + int numDRBFailed; + DRB_nGRAN_failed_t DRBnGRanFailedList[E1AP_MAX_NUM_NGRAN_DRB]; +} pdu_session_setup_t; + +typedef struct e1ap_bearer_setup_resp_s { + uint64_t gNB_cu_cp_ue_id; + uint64_t gNB_cu_up_ue_id; + int numDRBs; + drb_setup_t DRBList[E1AP_MAX_NUM_DRBS]; + int numPDUSessions; + pdu_session_setup_t pduSession[E1AP_MAX_NUM_PDU_SESSIONS]; +} e1ap_bearer_setup_resp_t; + +typedef struct e1ap_upcp_inst_s { + uint32_t assoc_id; + e1ap_setup_req_t setupReq; + e1ap_bearer_setup_req_t bearerSetupReq; + e1ap_bearer_setup_resp_t bearerSetupResp; +} e1ap_upcp_inst_t; + +typedef enum { + CPtype = 0, + UPtype +} E1_t; +#endif /* E1AP_MESSAGES_TYPES_H */ diff --git a/openair2/COMMON/messages_def.h b/openair2/COMMON/messages_def.h index 452e833eaea08c005b5298ac22ccc760790ba02a..7a4e68bb6b393199bb147714bbe3330797f0b57f 100644 --- a/openair2/COMMON/messages_def.h +++ b/openair2/COMMON/messages_def.h @@ -42,4 +42,4 @@ #include "udp_messages_def.h" #include "gtpv1_u_messages_def.h" #include "flexran_messages_def.h" -#include "e1ap_message_types.h" +#include "e1ap_messages_def.h" diff --git a/openair2/E1AP/CMakeLists.txt b/openair2/E1AP/CMakeLists.txt index b600f64d6fa41cf70f1dc43618f1a5546180e7b6..362b2bf4767e40ba3f698527a4ffb77b030c2a73 100644 --- a/openair2/E1AP/CMakeLists.txt +++ b/openair2/E1AP/CMakeLists.txt @@ -1,6 +1,6 @@ add_subdirectory(MESSAGES) -add_library(E1AP e1ap.c) +add_library(E1AP e1ap.c e1ap_common.c) target_link_libraries(E1AP PUBLIC ASN1_E1AP_LIB PRIVATE UTIL) diff --git a/openair2/E1AP/e1ap.c b/openair2/E1AP/e1ap.c index ea1d74a3f7ad1eb8e74cd9c7f18f871da3c61f27..9cc8173eaaa6ae5e9ce58f820cbee8a02c2b0cfa 100644 --- a/openair2/E1AP/e1ap.c +++ b/openair2/E1AP/e1ap.c @@ -22,34 +22,39 @@ */ #include "e1ap.h" - -#define NUM_E1AP_MSG_HANDLERS 14 - -e1ap_message_processing_t e1ap_message_processing[NUM_E1AP_MSG_HANDLERS][3] = { - - { 0, 0, 0 } /* Reset */ - { 0, 0, 0 } /* ErrorIndication */ - { 0, 0, 0 } /* privateMessage */ - { e1apCUCP_handle_SETUP_REQUEST, e1apCUUP_handle_SETUP_RESPONSE, e1apCUUP_handle_SETUP_FAILURE } /* gNBCUUPE1Setup */ - { 0, 0, 0 } /* gNBCUCPE1Setup */ - { 0, 0, 0 } /* gNBCUUPConfigurationUpdate */ - { 0, 0, 0 } /* gNBCUCPConfigurationUpdate */ - { 0, 0, 0 } /* E1Release */ - { e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST, e1apCUCP_handle_BEARER_CONTEXT_SETUP_RESPONSE, e1apCUCP_handle_BEARER_CONTEXT_SETUP_FAILURE } /* bearerContextSetup */ - { 0, 0, 0 } /* bearerContextModification */ - { 0, 0, 0 } /* bearerContextModificationRequired */ - { 0, 0, 0 } /* bearerContextRelease */ - { 0, 0, 0 } /* bearerContextReleaseRequired */ +#include "e1ap_common.h" + +#define E1AP_NUM_MSG_HANDLERS 14 + +e1ap_message_processing_t e1ap_message_processing[E1AP_NUM_MSG_HANDLERS][3] = { + + { 0, 0, 0 }, /* Reset */ + { 0, 0, 0 }, /* ErrorIndication */ + { 0, 0, 0 }, /* privateMessage */ + { e1apCUCP_handle_SETUP_REQUEST, e1apCUUP_handle_SETUP_RESPONSE, e1apCUUP_handle_SETUP_FAILURE }, /* gNBCUUPE1Setup */ + { 0, 0, 0 }, /* gNBCUCPE1Setup */ + { 0, 0, 0 }, /* gNBCUUPConfigurationUpdate */ + { 0, 0, 0 }, /* gNBCUCPConfigurationUpdate */ + { 0, 0, 0 }, /* E1Release */ + { e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST, e1apCUCP_handle_BEARER_CONTEXT_SETUP_RESPONSE, e1apCUCP_handle_BEARER_CONTEXT_SETUP_FAILURE }, /* bearerContextSetup */ + { 0, 0, 0 }, /* bearerContextModification */ + { 0, 0, 0 }, /* bearerContextModificationRequired */ + { 0, 0, 0 }, /* bearerContextRelease */ + { 0, 0, 0 }, /* bearerContextReleaseRequired */ { 0, 0, 0 } /* bearerContextInactivityNotification */ }; -int asn1_encoder_xer_print = 1; - -int e1ap_assoc_id(bool isCu, instance_t instance) { - return 0; +const char *e1ap_direction2String(int e1ap_dir) { + static const char *e1ap_direction_String[] = { + "", /* Nothing */ + "Initiating message", /* initiating message */ + "Successfull outcome", /* successfull outcome */ + "UnSuccessfull outcome", /* successfull outcome */ + }; + return(e1ap_direction_String[e1ap_dir]); } -int e1ap_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream, +int e1ap_handle_message(instance_t instance, uint32_t assoc_id, const uint8_t *const data, const uint32_t data_length) { E1AP_E1AP_PDU_t pdu= {0}; int ret; @@ -61,7 +66,7 @@ int e1ap_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream, } /* Checking procedure Code and direction of message */ - if ((pdu.choice.initiatingMessage->procedureCode >= NUM_MSG_HANDLERS) + if ((pdu.choice.initiatingMessage->procedureCode >= E1AP_NUM_MSG_HANDLERS) || (pdu.present > E1AP_E1AP_PDU_PR_unsuccessfulOutcome) || (pdu.present <= E1AP_E1AP_PDU_PR_NOTHING)) { LOG_E(E1AP, "[SCTP %d] Either procedureCode %ld or direction %d exceed expected\n", @@ -70,17 +75,17 @@ int e1ap_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream, return -1; } - if (e1ap_messages_processing[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1] == NULL) { + if (e1ap_message_processing[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1] == NULL) { // No handler present. This can mean not implemented or no procedure for eNB (wrong direction). LOG_E(E1AP, "[SCTP %d] No handler for procedureCode %ld in %s\n", assoc_id, pdu.choice.initiatingMessage->procedureCode, - f1ap_direction2String(pdu.present - 1)); + e1ap_direction2String(pdu.present - 1)); ret=-1; } else { /* Calling the right handler */ LOG_I(E1AP, "Calling handler with instance %ld\n",instance); - ret = (*e1ap_messages_processing[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1]) - (instance, assoc_id, stream, &pdu); + ret = (*e1ap_message_processing[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1]) + (instance, &pdu); } ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_E1AP_E1AP_PDU, &pdu); @@ -90,49 +95,12 @@ int e1ap_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream, void cuup_task_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_data_ind) { int result; DevAssert(sctp_data_ind != NULL); - e1ap_handle_message(instance, sctp_data_ind->assoc_id, sctp_data_ind->stream, + e1ap_handle_message(instance, sctp_data_ind->assoc_id, sctp_data_ind->buffer, sctp_data_ind->buffer_length); result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer); AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); } -int e1ap_encode_send(bool isCu, instance_t instance, E1AP_E1AP_PDU_t *pdu, uint16_t stream, const char *func) { - DevAssert(pdu != NULL); - - if (asn1_encoder_xer_print) { - LOG_E(E1AP, "----------------- ASN1 ENCODER PRINT START ----------------- \n"); - xer_fprint(stdout, &asn_DEF_E1AP_E1AP_PDU, pdu); - LOG_E(E1AP, "----------------- ASN1 ENCODER PRINT END----------------- \n"); - } - - char errbuf[2048]; /* Buffer for error message */ - size_t errlen = sizeof(errbuf); /* Size of the buffer */ - int ret = asn_check_constraints(&asn_DEF_E1AP_E1AP_PDU, pdu, errbuf, &errlen); - - if(ret) { - LOG_E(E1AP, "%s: Constraint validation failed: %s\n", func, errbuf); - } - - void *buffer = NULL; - ssize_t encoded = aper_encode_to_new_buffer(&asn_DEF_E1AP_E1AP_PDU, 0, pdu, buffer); - - if (encoded < 0) { - LOG_E(E1AP, "%s: Failed to encode E1AP message\n", func); - return -1; - } else { - MessageDef *message = itti_alloc_new_message(isCu?TASK_CUCP_E1:TASK_CUUP_E1, 0, SCTP_DATA_REQ); - sctp_data_req_t *s = &message->ittiMsg.sctp_data_req; - s->assoc_id = e1ap_assoc_id(isCu,instance); - s->buffer = buffer; - s->buffer_length = encoded; - s->stream = stream; - LOG_I(E1AP, "%s: Sending ITTI message to SCTP Task\n", func); - itti_send_msg_to_task(TASK_SCTP, instance, message); - } - - return encoded; -} - void e1ap_itti_send_sctp_close_association(bool isCu, instance_t instance) { MessageDef *message = itti_alloc_new_message(TASK_S1AP, 0, SCTP_CLOSE_ASSOCIATION); sctp_close_association_t *sctp_close_association = &message->ittiMsg.sctp_close_association; @@ -148,6 +116,7 @@ int e1ap_send_RESET(bool isCu, instance_t instance, E1AP_Reset_t *Reset) { int e1ap_send_RESET_ACKNOWLEDGE(instance_t instance, E1AP_Reset_t *Reset) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1ap_handle_RESET(instance_t instance, @@ -155,6 +124,7 @@ int e1ap_handle_RESET(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1ap_handle_RESET_ACKNOWLEDGE(instance_t instance, @@ -162,6 +132,7 @@ int e1ap_handle_RESET_ACKNOWLEDGE(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } /* @@ -172,10 +143,12 @@ int e1ap_handle_ERROR_INDICATION(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1ap_send_ERROR_INDICATION(instance_t instance, E1AP_ErrorIndication_t *ErrorIndication) { AssertFatal(false,"Not implemented yet\n"); + return -1; } @@ -185,14 +158,14 @@ int e1ap_send_ERROR_INDICATION(instance_t instance, E1AP_ErrorIndication_t *Erro int e1apCUUP_send_SETUP_REQUEST(instance_t instance) { E1AP_E1AP_PDU_t pdu = {0}; - e1ap_setup_req_t *setup = &getCxt(UPtype, instance)->setupReq; + e1ap_setup_req_t *setup = &getCxtE1(UPtype, instance)->setupReq; /* Create */ /* 0. pdu Type */ pdu.present = E1AP_E1AP_PDU_PR_initiatingMessage; asn1cCalloc(pdu.choice.initiatingMessage, initMsg); initMsg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup; initMsg->criticality = E1AP_Criticality_reject; - initMsg->present = E1AP_InitiatingMessage__value_PR_GNB_CU_UP_E1SetupRequest; + initMsg->value.present = E1AP_InitiatingMessage__value_PR_GNB_CU_UP_E1SetupRequest; E1AP_GNB_CU_UP_E1SetupRequest_t *e1SetupUP = &initMsg->value.choice.GNB_CU_UP_E1SetupRequest; /* mandatory */ /* c1. Transaction ID (integer value) */ @@ -212,27 +185,28 @@ int e1apCUUP_send_SETUP_REQUEST(instance_t instance) { /* mandatory */ /* c4. CN Support */ asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC4); - iec4->id = E1AP_ProtocolIE_ID_id_CNSupport; + ieC4->id = E1AP_ProtocolIE_ID_id_CNSupport; ieC4->criticality = E1AP_Criticality_reject; - iec4->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_CNSupport; - iec4->value.choice.CNSupport = setup->cn_support; + ieC4->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_CNSupport; + ieC4->value.choice.CNSupport = setup->cn_support; /* mandatory */ /* c5. Supported PLMNs */ asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC5); - iec5->id = E1AP_ProtocolIE_ID_id_SupportedPLMNs; - iec5->criticality = E1AP_Criticality_reject; - iec5->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_SupportedPLMNs_List; + ieC5->id = E1AP_ProtocolIE_ID_id_SupportedPLMNs; + ieC5->criticality = E1AP_Criticality_reject; + ieC5->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_SupportedPLMNs_List; int numSupportedPLMNs = setup->supported_plmns; for (int i=0; i < numSupportedPLMNs; i++) { - asn1cSequenceAdd(iec5->value.choice.SupportedPLMNs_List.list, E1AP_SupportedPLMNs_Item_t, supportedPLMN); + asn1cSequenceAdd(ieC5->value.choice.SupportedPLMNs_List.list, E1AP_SupportedPLMNs_Item_t, supportedPLMN); /* 5.1 PLMN Identity */ - MCC_MNC_TO_PLMNID(setup->plmns[i].mcc, setup->plmns[i].mnc, setup->plmns[i].mnc_digit_length); + MCC_MNC_TO_PLMNID(setup->plmns[i].mcc, setup->plmns[i].mnc, setup->plmns[i].mnc_digit_length, &supportedPLMN->pLMN_Identity); } - e1ap_encode_send(0, instance, pdu, 0, __func__); + e1ap_encode_send(0, instance, &pdu, 0, __func__); + return 0; } int e1apCUCP_send_SETUP_RESPONSE(instance_t instance, @@ -248,16 +222,18 @@ int e1apCUCP_send_SETUP_RESPONSE(instance_t instance, E1AP_GNB_CU_UP_E1SetupResponse_t *out = &pdu.choice.successfulOutcome->value.choice.GNB_CU_UP_E1SetupResponse; /* mandatory */ /* c1. Transaction ID (integer value) */ - asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupResponseIEs, ieC1); + asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupResponseIEs_t, ieC1); ieC1->id = E1AP_ProtocolIE_ID_id_TransactionID; ieC1->criticality = E1AP_Criticality_reject; ieC1->value.present = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_TransactionID; ieC1->value.choice.TransactionID = e1ap_setup_resp->transac_id; - e1ap_encode_send(0, instance, pdu, 0, __func__); + e1ap_encode_send(0, instance, &pdu, 0, __func__); + return 0; } -int e1apCUCP_send_SETUP_FAILURE(e1ap_setup_resp_t *e1ap_setup_resp) { +int e1apCUCP_send_SETUP_FAILURE(instance_t instance, + e1ap_setup_resp_t *e1ap_setup_resp) { E1AP_E1AP_PDU_t pdu = {0}; /* Create */ /* 0. pdu Type */ @@ -266,56 +242,56 @@ int e1apCUCP_send_SETUP_FAILURE(e1ap_setup_resp_t *e1ap_setup_resp) { initMsg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup; initMsg->criticality = E1AP_Criticality_reject; initMsg->value.present = E1AP_UnsuccessfulOutcome__value_PR_GNB_CU_UP_E1SetupFailure; - E1AP_GNB_CU_UP_E1SetupFailure_t *out = &pdu.choice.successfulOutcome->value.choice.GNB_CU_UP_E1SetupFailure; + E1AP_GNB_CU_UP_E1SetupFailure_t *out = &pdu.choice.unsuccessfulOutcome->value.choice.GNB_CU_UP_E1SetupFailure; /* mandatory */ /* c1. Transaction ID (integer value) */ - asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs, ieC1); + asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ieC1); ieC1->id = E1AP_ProtocolIE_ID_id_TransactionID; ieC1->criticality = E1AP_Criticality_reject; ieC1->value.present = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_TransactionID; ieC1->value.choice.TransactionID = e1ap_setup_resp->transac_id; /* mandatory */ /* c2. cause (integer value) */ - asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs, ieC2); + asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ieC2); ieC2->id = E1AP_ProtocolIE_ID_id_Cause; ieC2->criticality = E1AP_Criticality_ignore; ieC2->value.present = E1AP_GNB_CU_UP_E1SetupFailureIEs__value_PR_Cause; ieC2->value.choice.Cause.present = E1AP_Cause_PR_radioNetwork; //choose this accordingly - ieC2->value.choice.Cause.choice.ratioNetwork = E1AP_CauseRadioNetwork_unspecified; + ieC2->value.choice.Cause.choice.radioNetwork = E1AP_CauseRadioNetwork_unspecified; - e1ap_encode_send(0, instance, pdu, 0, __func__); + e1ap_encode_send(0, instance, &pdu, 0, __func__); + return 0; } int e1apCUCP_handle_SETUP_REQUEST(instance_t instance, - uint32_t assoc_id, E1AP_E1AP_PDU_t *pdu) { E1AP_GNB_CU_UP_E1SetupRequestIEs_t *ie; DevAssert(pdu != NULL); - E1AP_GNB_CU_UP_E1SetupRequest_t *in = pdu->choice.initiatingMessage->value.choice.GNB_CU_UP_E1SetupRequest; + E1AP_GNB_CU_UP_E1SetupRequest_t *in = &pdu->choice.initiatingMessage->value.choice.GNB_CU_UP_E1SetupRequest; - e1ap_setup_req_t *req = &getCxt(CPtype, instance)->setupReq; + e1ap_setup_req_t *req = &getCxtE1(CPtype, instance)->setupReq; /* assoc_id */ - req->assoc_id = assoc_id; + /* req->assoc_id = assoc_id; */ /* transac_id */ F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_TransactionID, true); - asn_INTEGER2ulong(&ie->value.choice.TransactionID, &req->transac_id); - LOG_D(E1AP, "gNB CU UP E1 setup request transaction ID: %d\n", req->transac_id); + req->transac_id = ie->value.choice.TransactionID; + LOG_D(E1AP, "gNB CU UP E1 setup request transaction ID: %ld\n", req->transac_id); /* gNB CU UP ID */ F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_gNB_CU_UP_ID, true); asn_INTEGER2ulong(&ie->value.choice.GNB_CU_UP_ID, &req->gNB_cu_up_id); - LOG_D(E1AP, "gNB CU UP ID: %d\n", req->gNB_cu_up_id); + LOG_D(E1AP, "gNB CU UP ID: %ld\n", req->gNB_cu_up_id); /* CN Support */ F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, E1AP_ProtocolIE_ID_id_CNSupport, true); - asn_INTEGER2ulong(&ie->value.choice.GNB_CU_UP_ID, &req->cn_support); - LOG_D(E1AP, "E1ap CN support: %d\n", req->cn_support); + req->cn_support = ie->value.choice.CNSupport; + LOG_D(E1AP, "E1ap CN support: %ld\n", req->cn_support); /* Supported PLMNs */ F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, @@ -327,16 +303,16 @@ int e1apCUCP_handle_SETUP_REQUEST(instance_t instance, E1AP_SupportedPLMNs_Item_t *supported_plmn_item = (E1AP_SupportedPLMNs_Item_t *)(ie->value.choice.SupportedPLMNs_List.list.array[i]); /* PLMN Identity */ - PLMN_TO_MCC_MNC(&supported_plmn_item.pLMN_Identity, + PLMNID_TO_MCC_MNC(&supported_plmn_item->pLMN_Identity, req->plmns[i].mcc, req->plmns[i].mnc, req->plmns[i].mnc_digit_length); - OCTET_STRING_TO_INT16(supported_plmn_item.pLMN_Identity, req->plmns[i].id); LOG_D(E1AP, "MCC: %d\nMNC: %d\n", req->plmns[i].mcc, req->plmns[i].mnc); } /* Create ITTI message and send to queue */ + return 0; } int e1apCUUP_handle_SETUP_RESPONSE(instance_t instance, @@ -351,25 +327,26 @@ int e1apCUUP_handle_SETUP_RESPONSE(instance_t instance, AssertFatal(pdu->choice.successfulOutcome->value.present == E1AP_SuccessfulOutcome__value_PR_GNB_CU_UP_E1SetupResponse, "pdu->choice.successfulOutcome->value.present != E1AP_SuccessfulOutcome__value_PR_GNB_CU_UP_E1SetupResponse\n"); - E1AP_GNB_CU_UP_E1SetupResponse_t *in = &pdu.choice.successfulOutcome->value.choice.GNB_CU_UP_E1SetupResponse; - E1AP_GNB_CU_UP_E1SetupResponseIEs *ie; + E1AP_GNB_CU_UP_E1SetupResponse_t *in = &pdu->choice.successfulOutcome->value.choice.GNB_CU_UP_E1SetupResponse; + E1AP_GNB_CU_UP_E1SetupResponseIEs_t *ie; /* transac_id */ int transaction_id; - F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupResponseIEs, ie, in, + F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupResponseIEs_t, ie, in, E1AP_ProtocolIE_ID_id_TransactionID, true); - asn_INTEGER2ulong(&ie->value.choice.TransactionID, &transaction_id); + transaction_id = ie->value.choice.TransactionID; LOG_D(E1AP, "gNB CU UP E1 setup response transaction ID: %d\n", transaction_id); /* do the required processing */ + return 0; } int e1apCUUP_handle_SETUP_FAILURE(instance_t instance, E1AP_E1AP_PDU_t *pdu) { E1AP_GNB_CU_UP_E1SetupFailureIEs_t *ie; DevAssert(pdu != NULL); - E1AP_GNB_CU_UP_E1SetupFailure_t *in = pdu->choice.unsuccessfulOutcome->value.choice.GNB_CU_UP_E1SetupFailure; + E1AP_GNB_CU_UP_E1SetupFailure_t *in = &pdu->choice.unsuccessfulOutcome->value.choice.GNB_CU_UP_E1SetupFailure; /* Transaction ID */ F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie, in, E1AP_ProtocolIE_ID_id_TransactionID, true); @@ -393,25 +370,25 @@ int e1apCUUP_send_CONFIGURATION_UPDATE(instance_t instance) { msg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_ConfigurationUpdate; msg->criticality = E1AP_Criticality_reject; msg->value.present = E1AP_InitiatingMessage__value_PR_GNB_CU_UP_ConfigurationUpdate; - E1AP_GNB_CU_UP_ConfigurationUpdate_t *out = &pdu.choice.successfulOutcome->value.choice.GNB_CU_UP_ConfigurationUpdate; + E1AP_GNB_CU_UP_ConfigurationUpdate_t *out = &pdu.choice.initiatingMessage->value.choice.GNB_CU_UP_ConfigurationUpdate; /* mandatory */ /* c1. Transaction ID (integer value) */ asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_ConfigurationUpdateIEs_t, ieC1); ieC1->id = E1AP_ProtocolIE_ID_id_TransactionID; ieC1->criticality = E1AP_Criticality_reject; ieC1->value.present = E1AP_GNB_CU_UP_ConfigurationUpdateIEs__value_PR_TransactionID; - ieC1->value.choice.TransactionID = //get this from stored transaction IDs in CU + ieC1->value.choice.TransactionID = 0;//get this from stored transaction IDs in CU /* mandatory */ /* c2. Supported PLMNs */ asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_ConfigurationUpdateIEs_t, ieC2); - iec2->id = E1AP_ProtocolIE_ID_id_SupportedPLMNs; - iec2->criticality = E1AP_Criticality_reject; - iec2->value.present = E1AP_GNB_CU_UP_ConfigurationUpdateIEs__value_PR_SupportedPLMNs_List; + ieC2->id = E1AP_ProtocolIE_ID_id_SupportedPLMNs; + ieC2->criticality = E1AP_Criticality_reject; + ieC2->value.present = E1AP_GNB_CU_UP_ConfigurationUpdateIEs__value_PR_SupportedPLMNs_List; int numSupportedPLMNs = 1; for (int i=0; i < numSupportedPLMNs; i++) { - asn1cSequenceAdd(iec2->value.choice.SupportedPLMNs_List.list, E1AP_SupportedPLMNs_Item_t, supportedPLMN); + asn1cSequenceAdd(ieC2->value.choice.SupportedPLMNs_List.list, E1AP_SupportedPLMNs_Item_t, supportedPLMN); /* 5.1 PLMN Identity */ OCTET_STRING_fromBuf(&supportedPLMN->pLMN_Identity, "OAI", strlen("OAI")); } @@ -419,39 +396,43 @@ int e1apCUUP_send_CONFIGURATION_UPDATE(instance_t instance) { /* mandatory */ /* c3. TNLA to remove list */ asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_ConfigurationUpdateIEs_t, ieC3); - iec3->id = E1AP_ProtocolIE_ID_id_GNB_CU_UP_TNLA_To_Remove_List; - iec3->criticality = E1AP_Criticality_reject; - iec3->value.present = E1AP_GNB_CU_UP_ConfigurationUpdateIEs__value_PR_GNB_CU_UP_TNLA_To_Remove_List; + ieC3->id = E1AP_ProtocolIE_ID_id_GNB_CU_UP_TNLA_To_Remove_List; + ieC3->criticality = E1AP_Criticality_reject; + ieC3->value.present = E1AP_GNB_CU_UP_ConfigurationUpdateIEs__value_PR_GNB_CU_UP_TNLA_To_Remove_List; int numTNLAtoRemoveList = 1; for (int i=0; i < numTNLAtoRemoveList; i++) { - asn1cSequenceAdd(iec2->value.choice.GNB_CU_UP_TNLA_To_Remove_List.list, E1AP_GNB_CU_UP_TNLA_To_Remove_Item_t, TNLAtoRemove); + asn1cSequenceAdd(ieC2->value.choice.GNB_CU_UP_TNLA_To_Remove_List.list, E1AP_GNB_CU_UP_TNLA_To_Remove_Item_t, TNLAtoRemove); TNLAtoRemove->tNLAssociationTransportLayerAddress.present = E1AP_CP_TNL_Information_PR_endpoint_IP_Address; - TNLAtoRemove->tNLAssociationTransportLayerAddress.choice.endpoint_IP_Address = // TODO: include the ip + TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(1234, &TNLAtoRemove->tNLAssociationTransportLayerAddress.choice.endpoint_IP_Address); // TODO: correct me } - e1ap_encode_send(0, instance, pdu, 0, __func__); + e1ap_encode_send(0, instance, &pdu, 0, __func__); + return 0; } int e1apCUCP_send_gNB_DU_CONFIGURATION_FAILURE(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_send_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_handle_CONFIGURATION_UPDATE(instance_t instance, - uint32_t assoc_id, - uint32_t stream, E1AP_E1AP_PDU_t *pdu) { + /* E1AP_GNB_CU_UP_E1SetupRequestIEs_t *ie; DevAssert(pdu != NULL); - E1AP_GNB_CU_UP_E1SetupRequest_t *in = pdu->choice.initiatingMessage->value.choice.GNB_CU_UP_E1SetupRequest; + E1AP_GNB_CU_UP_E1SetupRequest_t *in = &pdu->choice.initiatingMessage->value.choice.GNB_CU_UP_E1SetupRequest; + */ AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, @@ -459,6 +440,7 @@ int e1apCUUP_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance, @@ -466,6 +448,7 @@ int e1apCUUP_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } /* @@ -474,10 +457,12 @@ int e1apCUUP_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance, int e1ap_send_RELEASE_REQUEST(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1ap_send_RELEASE_ACKNOWLEDGE(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1ap_handle_RELEASE_REQUEST(instance_t instance, @@ -485,6 +470,7 @@ int e1ap_handle_RELEASE_REQUEST(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1ap_handle_RELEASE_ACKNOWLEDGE(instance_t instance, @@ -492,6 +478,7 @@ int e1ap_handle_RELEASE_ACKNOWLEDGE(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } /* @@ -499,7 +486,7 @@ int e1ap_handle_RELEASE_ACKNOWLEDGE(instance_t instance, */ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, - e1ap_bearer_setup_t bearerCxt) { + e1ap_bearer_setup_req_t *bearerCxt) { E1AP_E1AP_PDU_t pdu = {0}; /* Create */ /* 0. pdu Type */ @@ -537,8 +524,7 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, ieC4->id = E1AP_ProtocolIE_ID_id_Serving_PLMN; ieC4->criticality = E1AP_Criticality_ignore; ieC4->value.present = E1AP_BearerContextSetupRequestIEs__value_PR_PLMN_Identity; - uint64_t servingPLMNId = getServingPlmn(); // TODO: define this - OCTET_STRING_fromBuf(&ieC4->value.choice.PLMN_Identity, servingPLMNId); + MCC_MNC_TO_PLMNID(bearerCxt->servingPLMNid.mcc, bearerCxt->servingPLMNid.mnc, bearerCxt->servingPLMNid.mnc_digit_length, &ieC4->value.choice.PLMN_Identity); /* mandatory */ /* Activity Notification Level */ asn1cSequenceAdd(out->protocolIEs.list, E1AP_BearerContextSetupRequestIEs_t, ieC5); @@ -552,25 +538,25 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, ieC6->id = E1AP_ProtocolIE_ID_id_System_BearerContextSetupRequest; ieC6->criticality = E1AP_Criticality_reject; if (0) { // EUTRAN - ieC6->System_BearerContextSetupRequest.present = E1AP_System_BearerContextSetupRequest_PR_e_UTRAN_BearerContextSetupRequest; + ieC6->value.choice.System_BearerContextSetupRequest.present = E1AP_System_BearerContextSetupRequest_PR_e_UTRAN_BearerContextSetupRequest; E1AP_EUTRAN_BearerContextSetupRequest_t *msgEUTRAN = calloc(1, sizeof(E1AP_EUTRAN_BearerContextSetupRequest_t)); - ieC6->System_BearerContextSetupRequest.choice.e_UTRAN_BearerContextSetupRequest = (E1AP_ProtocolIE_Container *) msgEUTRAN; - msgEUTRAN.id = E1AP_ProtocolIE_ID_id_DRB_To_Setup_List_EUTRAN; + ieC6->value.choice.System_BearerContextSetupRequest.choice.e_UTRAN_BearerContextSetupRequest = (struct E1AP_ProtocolIE_Container *) msgEUTRAN; + msgEUTRAN->id = E1AP_ProtocolIE_ID_id_DRB_To_Setup_List_EUTRAN; msgEUTRAN->value.present = E1AP_EUTRAN_BearerContextSetupRequest__value_PR_DRB_To_Setup_List_EUTRAN; E1AP_DRB_To_Setup_List_EUTRAN_t *drb2Setup = &msgEUTRAN->value.choice.DRB_To_Setup_List_EUTRAN; for (drb_to_setup_t *i=bearerCxt->DRBList; i < bearerCxt->DRBList+bearerCxt->numDRBs; i++) { - asn1cSequenceAdd(drb2Setup->list, E1AP_DRB_To_Setup_Item_EUTRAN, ieC6_1); + asn1cSequenceAdd(drb2Setup->list, E1AP_DRB_To_Setup_Item_EUTRAN_t, ieC6_1); ieC6_1->dRB_ID = i->drbId; - ieC6_1->pDPC_Configuration.pDCP_SN_Size_UL = i->pDCP_SN_Size_UL; - ieC6_1->pDPC_Configuration.pDCP_SN_Size_DL = i->pDCP_SN_Size_DL; - ieC6_1->pDPC_Configuration.rLC_Mode = i->rLC_Mode; + ieC6_1->pDCP_Configuration.pDCP_SN_Size_UL = i->pDCP_SN_Size_UL; + ieC6_1->pDCP_Configuration.pDCP_SN_Size_DL = i->pDCP_SN_Size_DL; + ieC6_1->pDCP_Configuration.rLC_Mode = i->rLC_Mode; ieC6_1->eUTRAN_QoS.qCI = i->qci; ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.priorityLevel = i->qosPriorityLevel; - ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.pre_emptionCapability = i->preEmptionCapability; - ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.pre_emptionVulnerability = i->preEmptionVulnerability; + ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.pre_emptionCapability = i->pre_emptionCapability; + ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.pre_emptionVulnerability = i->pre_emptionVulnerability; ieC6_1->s1_UL_UP_TNL_Information.present = E1AP_UP_TNL_Information_PR_gTPTunnel; asn1cCalloc(ieC6_1->s1_UL_UP_TNL_Information.choice.gTPTunnel, gTPTunnel); @@ -578,22 +564,22 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID); for (cell_group_t *j=i->cellGroupList; j < i->cellGroupList+i->numCellGroups; j++) { - asn1cSequenceAdd(ieC6_1->cell_Group_Information.list, E1AP_Cell_Group_Information_Item, ieC6_1_1); + asn1cSequenceAdd(ieC6_1->cell_Group_Information.list, E1AP_Cell_Group_Information_Item_t, ieC6_1_1); ieC6_1_1->cell_Group_ID = j->id; } } } else { /* mandatory */ /* */ - ieC6->System_BearerContextSetupRequest.present = E1AP_System_BearerContextSetupRequest_PR_nG_RAN_BearerContextSetupRequest; + ieC6->value.choice.System_BearerContextSetupRequest.present = E1AP_System_BearerContextSetupRequest_PR_nG_RAN_BearerContextSetupRequest; E1AP_NG_RAN_BearerContextSetupRequest_t *msgNGRAN = calloc(1, sizeof(E1AP_NG_RAN_BearerContextSetupRequest_t)); - ieC6->System_BearerContextSetupRequest.choice.nG_RAN_BearerContextSetupRequest = (E1AP_ProtocolIE_Container *) msgNGRAN; + ieC6->value.choice.System_BearerContextSetupRequest.choice.nG_RAN_BearerContextSetupRequest = (struct E1AP_ProtocolIE_Container *) msgNGRAN; msgNGRAN->id = E1AP_ProtocolIE_ID_id_PDU_Session_Resource_To_Setup_List; msgNGRAN->value.present = E1AP_NG_RAN_BearerContextSetupRequest__value_PR_PDU_Session_Resource_To_Setup_List; E1AP_PDU_Session_Resource_To_Setup_List_t *pdu2Setup = &msgNGRAN->value.choice.PDU_Session_Resource_To_Setup_List; for(pdu_session_to_setup_t *i=bearerCxt->pduSession; i < bearerCxt->pduSession+bearerCxt->numPDUSessions; i++) { - asn1cSequenceAdd(pdu2Setup->list, E1AP_PDU_Session_Resource_To_Setup_Item, ieC6_1); + asn1cSequenceAdd(pdu2Setup->list, E1AP_PDU_Session_Resource_To_Setup_Item_t, ieC6_1); ieC6_1->pDU_Session_ID = i->sessionId; ieC6_1->pDU_Session_Type = i->sessionType; @@ -609,20 +595,20 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID); for (DRB_nGRAN_to_setup_t *j=i->DRBnGRanList; j < i->DRBnGRanList+i->numDRB2Setup; j++) { - asn1cSequenceAdd(ieC6_1->dRB_To_Setup_List_NG_RAN.list, E1AP_DRB_To_Setup_Item_NG_RAN, ieC6_1_1); + asn1cSequenceAdd(ieC6_1->dRB_To_Setup_List_NG_RAN.list, E1AP_DRB_To_Setup_Item_NG_RAN_t, ieC6_1_1); ieC6_1_1->dRB_ID = j->id; ieC6_1_1->sDAP_Configuration.defaultDRB = j->defaultDRB; ieC6_1_1->sDAP_Configuration.sDAP_Header_UL = j->sDAP_Header_UL; ieC6_1_1->sDAP_Configuration.sDAP_Header_DL = j->sDAP_Header_DL; - for (cell_group_t *k=j->cellGroupList; k < j->cellGroupList+numCellGroups; k++) { - asn1cSequenceAdd(ieC6_1_1->cell_Group_Information.list, E1AP_Cell_Group_Information_Item, ieC6_1_1_1); + for (cell_group_t *k=j->cellGroupList; k < j->cellGroupList+j->numCellGroups; k++) { + asn1cSequenceAdd(ieC6_1_1->cell_Group_Information.list, E1AP_Cell_Group_Information_Item_t, ieC6_1_1_1); ieC6_1_1_1->cell_Group_ID = k->id; } for (qos_flow_to_setup_t *k=j->qosFlows; k < j->qosFlows+j->numQosFlow2Setup; k++) { - asn1cSequenceAdd(ieC6_1_1->qos_flow_Information_To_Be_Setup, E1AP_QoS_Flow_QoS_Parameter_Item, ieC6_1_1_1); + asn1cSequenceAdd(ieC6_1_1->qos_flow_Information_To_Be_Setup, E1AP_QoS_Flow_QoS_Parameter_Item_t, ieC6_1_1_1); ieC6_1_1_1->qoS_Flow_Identifier = k->id; if (0) { // non Dynamic 5QI @@ -646,7 +632,8 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, } } - e1ap_encode_send(0, instance, pdu, 0, __func__); + e1ap_encode_send(0, instance, &pdu, 0, __func__); + return 0; } int e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance, @@ -655,49 +642,49 @@ int e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance, /* Create */ /* 0. pdu Type */ pdu.present = E1AP_E1AP_PDU_PR_successfulOutcome; - asn1cCalloc(pdu.choice.initiatingMessage, msg); + 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_BearerContextSetupRequest_t *out = &pdu.choice.initiatingMessage->value.choice.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, ieC1); + 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, ieC2); + 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; ieC1->value.choice.GNB_CU_CP_UE_E1AP_ID = resp->gNB_cu_up_ue_id; - asn1cSequenceAdd(out->protocolIEs.list, E1AP_BearerContextSetupResponseIEs, ieC3); + asn1cSequenceAdd(out->protocolIEs.list, E1AP_BearerContextSetupResponseIEs_t, ieC3); ieC3->id = E1AP_ProtocolIE_ID_id_System_BearerContextSetupRequest; ieC3->criticality = E1AP_Criticality_reject; if (0) { // EUTRAN - ieC3->System_BearerContextSetupResponse.present = E1AP_System_BearerContextSetupResponse_PR_e_UTRAN_BearerContextSetupResponse; + ieC3->value.choice.System_BearerContextSetupResponse.present = E1AP_System_BearerContextSetupResponse_PR_e_UTRAN_BearerContextSetupResponse; E1AP_EUTRAN_BearerContextSetupResponse_t *msgEUTRAN = calloc(1, sizeof(E1AP_EUTRAN_BearerContextSetupResponse_t)); - ieC3->System_BearerContextSetupResponse.choice.e_UTRAN_BearerContextSetupResponse = (E1AP_ProtocolIE_Container *) msgEUTRAN; - msgEUTRAN.id = E1AP_ProtocolIE_ID_id_DRB_Setup_List_EUTRAN; - msgEUTRAN.criticality = E1AP_Criticality_reject; + ieC3->value.choice.System_BearerContextSetupResponse.choice.e_UTRAN_BearerContextSetupResponse = (struct E1AP_ProtocolIE_Container *) 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, ieC3_1); + 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_UL_UP_TNL_Information.choice.gTPTunnel, 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, ieC3_1_1); + 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); @@ -705,16 +692,16 @@ int e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance, } } } else { - ieC3->System_BearerContextSetupResponse.present = E1AP_System_BearerContextSetupResponse_PR_nG_RAN_BearerContextSetupResponse; - E1AP_NG_RAN_BearerContextSetupResponse_t *msgEUTRAN = calloc(1, sizeof(E1AP_NG_RAN_BearerContextSetupResponse_t)); - ieC3->System_BearerContextSetupResponse.choice.nG_RAN_BearerContextSetupResponse = (E1AP_ProtocolIE_Container *) msgNGRAN; - msgNGRAN.id = E1AP_ProtocolIE_ID_id_DRB_Setup_List_EUTRAN; - msgNGRAN.criticality = E1AP_Criticality_reject; + ieC3->value.choice.System_BearerContextSetupResponse.present = E1AP_System_BearerContextSetupResponse_PR_nG_RAN_BearerContextSetupResponse; + E1AP_NG_RAN_BearerContextSetupResponse_t *msgNGRAN = calloc(1, sizeof(E1AP_NG_RAN_BearerContextSetupResponse_t)); + ieC3->value.choice.System_BearerContextSetupResponse.choice.nG_RAN_BearerContextSetupResponse = (struct E1AP_ProtocolIE_Container *) msgNGRAN; + msgNGRAN->id = E1AP_ProtocolIE_ID_id_DRB_Setup_List_EUTRAN; + 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 (pdu_session_setup_t *i=resp->pduSession; i < resp->pduSession+resp->numPDUSessions; i++) { - asn1cSequenceAdd(pduSetup->list, E1AP_PDU_Session_Resource_Setup_Item, ieC3_1); + 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; @@ -723,26 +710,26 @@ int e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance, INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID); for (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, ieC3_1_1); + 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 (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, ieC3_1_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); + 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 (qos_flow_setup_t *k=j->qosFlows; k < j->qosFlows+j->numQosFlowSetup; k++) { - asn1cSequenceAdd(ieC3_1_1->qos_flow_Information_To_Be_Setup, E1AP_QoS_Flow_QoS_Parameter_Item, ieC3_1_1_1); + 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->id; } } - E1AP_DRB_Failed_List_NG_RAN *failedDRBList = calloc(1, sizeof(E1AP_DRB_Failed_List_NG_RAN)); + ieC3_1->dRB_Failed_List_NG_RAN = calloc(1, sizeof(E1AP_DRB_Failed_List_NG_RAN_t)); for (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, ieC3_1_1); + 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; @@ -770,11 +757,13 @@ int e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance, } } } - e1ap_encode_send(0, instance, pdu, 0, __func__); + e1ap_encode_send(0, instance, &pdu, 0, __func__); + return 0; } int e1apCUUP_send_BEARER_CONTEXT_SETUP_FAILURE(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, @@ -789,17 +778,17 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, AssertFatal(pdu->choice.initiatingMessage->value.present == E1AP_InitiatingMessage__value_PR_BearerContextSetupRequest, "initiatingMessage->value.present != E1AP_InitiatingMessage__value_PR_BearerContextSetupRequest\n"); - E1AP_BearerContextSetupRequest_t *in = pdu->choice.initiatingMessage->value.choice.BearerContextSetupRequest; - E1AP_GNB_CU_CP_E1SetupRequestIEs_t *ie; + E1AP_BearerContextSetupRequest_t *in = &pdu->choice.initiatingMessage->value.choice.BearerContextSetupRequest; + E1AP_BearerContextSetupRequestIEs_t *ie; - e1ap_bearer_setup_req_t bearerCxt = &getCxt(CPtype, instance)->bearerSetupReq; + e1ap_bearer_setup_req_t *bearerCxt = &getCxtE1(CPtype, instance)->bearerSetupReq; MessageDef *msg = itti_alloc_new_message(TASK_CUUP_E1, 0, E1AP_BEARER_CONTEXT_SETUP_REQ); - LOG_I(E1AP, "Bearer context setup number of IEs %d\n", in.protocolIEs.list.count); + LOG_I(E1AP, "Bearer context setup 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]; + 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: @@ -807,7 +796,7 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, "ie->criticality != E1AP_Criticality_reject\n"); AssertFatal(ie->value.present == E1AP_BearerContextSetupRequestIEs__value_PR_GNB_CU_CP_UE_E1AP_ID, "ie->value.present != E1AP_BearerContextSetupRequestIEs__value_PR_GNB_CU_CP_UE_E1AP_ID\n"); - bearerCxt.gNB_cu_cp_ue_id = ie->value.choice.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_SecurityInformation: @@ -816,7 +805,9 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, AssertFatal(ie->value.present == E1AP_BearerContextSetupRequestIEs__value_PR_SecurityInformation, "ie->value.present != E1AP_BearerContextSetupRequestIEs__value_PR_SecurityInformation\n"); bearerCxt->cipheringAlgorithm = ie->value.choice.SecurityInformation.securityAlgorithm.cipheringAlgorithm; - OCTET_STRING_TO_INT32(&ie->value.choice.SecurityInformation.uPSecuritykey.encryptionKey, bearerCxt->encryptionKey); + memcpy(bearerCxt->encryptionKey, + ie->value.choice.SecurityInformation.uPSecuritykey.encryptionKey.buf, + ie->value.choice.SecurityInformation.uPSecuritykey.encryptionKey.size); break; case E1AP_ProtocolIE_ID_id_UEDLAggregateMaximumBitRate: @@ -824,7 +815,7 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, "ie->criticality != E1AP_Criticality_reject\n"); AssertFatal(ie->value.present == E1AP_BearerContextSetupRequestIEs__value_PR_BitRate, "ie->value.present != E1AP_BearerContextSetupRequestIEs__value_PR_BitRate\n"); - asn_INTEGER2long(&ie->value.choice.BitRate, bearerCxt->bitRate); + asn_INTEGER2long(&ie->value.choice.BitRate, &bearerCxt->bitRate); break; case E1AP_ProtocolIE_ID_id_Serving_PLMN: @@ -851,42 +842,41 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, } } - init_send_msg_to_task(TASK_RRC_GNB, instance, msg); + itti_send_msg_to_task(TASK_RRC_GNB, instance, msg); + return 0; } int e1apCUCP_handle_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance, - uint32_t assoc_id, - uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(pdu->present == E1AP_E1AP_PDU_PR_successfulOutcome, "pdu->present != E1AP_E1AP_PDU_PR_successfulOutcome\n"); - AssertFatal(pdu->choice.initiatingMessage->procedureCode == E1AP_ProcedureCode_id_bearerContextSetup, + AssertFatal(pdu->choice.successfulOutcome->procedureCode == E1AP_ProcedureCode_id_bearerContextSetup, "procedureCode != E1AP_ProcedureCode_id_bearerContextSetup\n"); - AssertFatal(pdu->choice.initiatingMessage->criticality == E1AP_Criticality_reject, + AssertFatal(pdu->choice.successfulOutcome->criticality == E1AP_Criticality_reject, "criticality != E1AP_Criticality_reject\n"); - AssertFatal(pdu->choice.initiatingMessage->value.present == E1AP_SuccessfulOutcome__value_PR_BearerContextSetupResponse, + AssertFatal(pdu->choice.successfulOutcome->value.present == E1AP_SuccessfulOutcome__value_PR_BearerContextSetupResponse, "initiatingMessage->value.present != E1AP_InitiatingMessage__value_PR_BearerContextSetupRequest\n"); - E1AP_BearerContextSetupResponse_t *in = pdu->choice.initiatingMessage->value.choice.BearerContextSetupRequest; - E1AP_GNB_CU_CP_E1SetupRequestIEs_t *ie; + E1AP_BearerContextSetupResponse_t *in = &pdu->choice.successfulOutcome->value.choice.BearerContextSetupResponse; + E1AP_BearerContextSetupResponseIEs_t *ie; - e1ap_bearer_setup_req_t bearerCxt = &getCxt(CPtype, instance)->bearerSetupResp; + e1ap_bearer_setup_resp_t *bearerCxt = &getCxtE1(CPtype, instance)->bearerSetupResp; MessageDef *msg = itti_alloc_new_message(TASK_CUCP_E1, 0, E1AP_BEARER_CONTEXT_SETUP_RESP); - LOG_I(E1AP, "Bearer context setup response number of IEs %d\n", in.protocolIEs.list.count); + LOG_I(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]; + 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_UP_UE_E1AP_ID: AssertFatal(ie->criticality == E1AP_Criticality_reject, "ie->criticality != E1AP_Criticality_reject\n"); - AssertFatal(ie->value.present == E1AP_BearerContextSetupRequestIEs__value_PR_GNB_CU_UP_UE_E1AP_ID, + AssertFatal(ie->value.present == E1AP_BearerContextSetupResponseIEs__value_PR_GNB_CU_UP_UE_E1AP_ID, "ie->value.present != E1AP_BearerContextSetupRequestIEs__value_PR_GNB_CU_UP_UE_E1AP_ID\n"); - bearerCxt.gNB_cu_up_ue_id = ie->value.choice.GNB_CU_UP_UE_E1AP_ID; + bearerCxt->gNB_cu_up_ue_id = ie->value.choice.GNB_CU_UP_UE_E1AP_ID; break; // TODO: remaining IE handlers @@ -897,15 +887,15 @@ int e1apCUCP_handle_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance, } } - init_send_msg_to_task(TASK_RRC_GNB, instance, msg); + itti_send_msg_to_task(TASK_RRC_GNB, instance, msg); + return 0; } int e1apCUCP_handle_BEARER_CONTEXT_SETUP_FAILURE(instance_t instance, - uint32_t assoc_id, - uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } /* @@ -914,14 +904,17 @@ int e1apCUCP_handle_BEARER_CONTEXT_SETUP_FAILURE(instance_t instance, int e1apCUCP_send_BEARER_CONTEXT_MODIFICATION_REQUEST(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_FAILURE(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_REQUEST(instance_t instance, @@ -929,6 +922,7 @@ int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_REQUEST(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, @@ -936,6 +930,7 @@ int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_FAILURE(instance_t instance, @@ -943,14 +938,17 @@ int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_FAILURE(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_REQUIRED(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_send_BEARER_CONTEXT_MODIFICATION_CONFIRM(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_REQUIRED(instance_t instance, @@ -958,6 +956,7 @@ int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_REQUIRED(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_CONFIRM(instance_t instance, @@ -965,6 +964,7 @@ int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_CONFIRM(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } /* BEARER CONTEXT RELEASE @@ -972,14 +972,17 @@ int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_CONFIRM(instance_t instance, int e1apCUCP_send_BEARER_CONTEXT_RELEASE_COMMAND(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_send_BEARER_CONTEXT_RELEASE_COMPLETE(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_send_BEARER_CONTEXT_RELEASE_REQUEST(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_handle_BEARER_CONTEXT_RELEASE_COMMAND(instance_t instance, @@ -987,6 +990,7 @@ int e1apCUUP_handle_BEARER_CONTEXT_RELEASE_COMMAND(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_handle_BEARER_CONTEXT_RELEASE_COMPLETE(instance_t instance, @@ -994,6 +998,7 @@ int e1apCUCP_handle_BEARER_CONTEXT_RELEASE_COMPLETE(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_handle_BEARER_CONTEXT_RELEASE_REQUEST(instance_t instance, @@ -1001,6 +1006,7 @@ int e1apCUCP_handle_BEARER_CONTEXT_RELEASE_REQUEST(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } /* @@ -1009,6 +1015,7 @@ BEARER CONTEXT INACTIVITY NOTIFICATION int e1apCUUP_send_BEARER_CONTEXT_INACTIVITY_NOTIFICATION(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_handle_BEARER_CONTEXT_INACTIVITY_NOTIFICATION(instance_t instance, @@ -1016,6 +1023,7 @@ int e1apCUCP_handle_BEARER_CONTEXT_INACTIVITY_NOTIFICATION(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } /* DL DATA @@ -1023,10 +1031,12 @@ int e1apCUCP_handle_BEARER_CONTEXT_INACTIVITY_NOTIFICATION(instance_t instance, int e1apCUUP_send_DL_DATA_NOTIFICATION(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUUP_send_DATA_USAGE_REPORT(instance_t instance) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_handle_DL_DATA_NOTIFICATION(instance_t instance, @@ -1034,6 +1044,7 @@ int e1apCUCP_handle_DL_DATA_NOTIFICATION(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } int e1apCUCP_handle_send_DATA_USAGE_REPORT(instance_t instance, @@ -1041,6 +1052,7 @@ int e1apCUCP_handle_send_DATA_USAGE_REPORT(instance_t instance, uint32_t stream, E1AP_E1AP_PDU_t *pdu) { AssertFatal(false,"Not implemented yet\n"); + return -1; } void cuup_task_send_sctp_association_req(instance_t instance, e1ap_setup_req_t *e1ap_setup_req) { @@ -1065,7 +1077,7 @@ void cuup_task_send_sctp_association_req(instance_t instance, e1ap_setup_req_t * itti_send_msg_to_task(TASK_SCTP, instance, message_p); } -void cuup_task_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t sctp_new_association_resp) { +void cuup_task_handle_sctp_association_resp(instance_t instance, sctp_new_association_resp_t *sctp_new_association_resp) { DevAssert(sctp_new_association_resp != NULL); if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) { @@ -1076,7 +1088,7 @@ void cuup_task_handle_sctp_association_resp(instance_t instance, sctp_new_associ return; } - e1ap_setup_req_t *e1ap_cuup_setup_req = &getCxt(UPtype, instance)->setupReq; + e1ap_setup_req_t *e1ap_cuup_setup_req = &getCxtE1(UPtype, instance)->setupReq; e1ap_cuup_setup_req->assoc_id = sctp_new_association_resp->assoc_id; e1ap_cuup_setup_req->sctp_in_streams = sctp_new_association_resp->in_streams; e1ap_cuup_setup_req->sctp_out_streams = sctp_new_association_resp->out_streams; @@ -1107,7 +1119,7 @@ void cucp_task_send_sctp_init_req(instance_t instance, char *my_addr) { void *E1AP_CUCP_task(void *arg) { LOG_I(E1AP, "Starting E1AP at CU CP\n"); MessageDef *msg = NULL; - int result; + e1ap_common_init(); while (1) { itti_receive_msg(TASK_CUCP_E1, &msg); @@ -1120,7 +1132,7 @@ void *E1AP_CUCP_task(void *arg) { char *ipaddr; if (req->CUCP_e1_ip_address.ipv4 == 0) { LOG_E(E1AP, "No IPv4 address configured\n"); - return -1; + return NULL; } else ipaddr = req->CUCP_e1_ip_address.ipv4_address; @@ -1136,6 +1148,7 @@ void *E1AP_CUCP_task(void *arg) { void *E1AP_CUUP_task(void *arg) { LOG_I(E1AP, "Starting E1AP at CU UP\n"); + e1ap_common_init(); // SCTP while (1) { @@ -1147,19 +1160,19 @@ void *E1AP_CUUP_task(void *arg) { case E1AP_SETUP_REQ: LOG_I(E1AP, "CUUP Task Received E1AP_SETUP_REQ\n"); e1ap_setup_req_t *msgSetup = &E1AP_SETUP_REQ(msg); - createE1inst(UPtype, instance, msgSetup); + createE1inst(UPtype, myInstance, msgSetup); - cuup_task_send_sctp_association_req(instance, msgSetup); + cuup_task_send_sctp_association_req(myInstance, msgSetup); break; case SCTP_NEW_ASSOCIATION_RESP: LOG_I(E1AP, "CUUP Task Received SCTP_NEW_ASSOCIATION_RESP\n"); - cuup_task_handle_sctp_association_resp(instance, &msg->ittiMsg.sctp_new_association_resp); + cuup_task_handle_sctp_association_resp(myInstance, &msg->ittiMsg.sctp_new_association_resp); break; case SCTP_DATA_IND: LOG_I(E1AP, "CUUP Task Received SCTP_DATA_IND\n"); - cuup_task_handle_sctp_data_ind(instance, &msg->ittiMsg.sctp_data_ind); + cuup_task_handle_sctp_data_ind(myInstance, &msg->ittiMsg.sctp_data_ind); break; default: diff --git a/openair2/E1AP/e1ap.h b/openair2/E1AP/e1ap.h index c4bc7807f3f7da8cd307347e18743a7b0c1227fc..bb9b611a2e3703dbe8128a587ab051ce2ae60657 100644 --- a/openair2/E1AP/e1ap.h +++ b/openair2/E1AP/e1ap.h @@ -27,9 +27,61 @@ #include <common/utils/LOG/log.h> #include "openairinterface5g_limits.h" #include <openair2/RRC/NR/MESSAGES/asn1_msg.h> -#include "e1ap_common.h" +#include "openair2/COMMON/e1ap_messages_types.h" +#include "openair3/UTILS/conversions.h" +#include "openair2/F1AP/f1ap_common.h" #include <E1AP_Cause.h> #include <E1AP_InitiatingMessage.h> #include <E1AP_E1AP-PDU.h> +#include <E1AP_ProtocolIE-Field.h> +#include <E1AP_SupportedPLMNs-Item.h> +#include <E1AP_SuccessfulOutcome.h> +#include <E1AP_ProtocolIE-Field.h> +#include <E1AP_UnsuccessfulOutcome.h> +#include <E1AP_GNB-CU-UP-E1SetupFailure.h> +#include <E1AP_GNB-CU-UP-ConfigurationUpdate.h> +#include <E1AP_GNB-CU-UP-TNLA-To-Remove-Item.h> +#include <E1AP_CP-TNL-Information.h> +#include <E1AP_UP-Parameters-Item.h> +#include <E1AP_UP-TNL-Information.h> +#include <E1AP_PDU-Session-Resource-Setup-Item.h> +#include <E1AP_DRB-Setup-Item-EUTRAN.h> +#include <E1AP_DRB-Setup-Item-NG-RAN.h> +#include <E1AP_QoS-Flow-QoS-Parameter-Item.h> +#include <E1AP_QoS-Flow-Item.h> +#include <E1AP_DRB-Failed-List-NG-RAN.h> +#include <E1AP_DRB-Failed-Item-NG-RAN.h> +#include <E1AP_BearerContextSetupResponse.h> +#include <E1AP_BearerContextSetupRequest.h> +#include <E1AP_DRB-To-Setup-Item-EUTRAN.h> +#include <E1AP_DRB-To-Setup-Item-NG-RAN.h> +#include <E1AP_Cell-Group-Information-Item.h> +#include <E1AP_PDU-Session-Resource-To-Setup-Item.h> +#include <E1AP_GTPTunnel.h> +#include <E1AP_Non-Dynamic5QIDescriptor.h> +#include <E1AP_Dynamic5QIDescriptor.h> #endif + + +int e1apCUCP_handle_SETUP_REQUEST(instance_t instance, + E1AP_E1AP_PDU_t *pdu); + +int e1apCUUP_handle_SETUP_RESPONSE(instance_t instance, + E1AP_E1AP_PDU_t *pdu); + +int e1apCUUP_handle_SETUP_FAILURE(instance_t instance, + E1AP_E1AP_PDU_t *pdu); + +int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, + E1AP_E1AP_PDU_t *pdu); + +int e1apCUCP_handle_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance, + E1AP_E1AP_PDU_t *pdu); + +int e1apCUCP_handle_BEARER_CONTEXT_SETUP_FAILURE(instance_t instance, + E1AP_E1AP_PDU_t *pdu); + +void *E1AP_CUUP_task(void *arg); + +void *E1AP_CUCP_task(void *arg); diff --git a/openair2/E1AP/e1ap_common.c b/openair2/E1AP/e1ap_common.c index 39cfe60b8dd620e3bf3785f12be8570f21248c2b..8b7d20dc3be49c2e827aa1ecf7e1f22dfdcc21da 100644 --- a/openair2/E1AP/e1ap_common.c +++ b/openair2/E1AP/e1ap_common.c @@ -23,34 +23,42 @@ #include <time.h> #include <stdlib.h> +#include "e1ap.h" #include "e1ap_common.h" -static e1ap_upcp_inst_t *e1_cp_inst[NUMBER_OF_gNB_MAX] = {0}; -static e1ap_upcp_inst_t *e1_up_inst[NUMBER_OF_gNB_MAX] = {0}; +static e1ap_upcp_inst_t *e1ap_cp_inst[NUMBER_OF_gNB_MAX] = {0}; +static e1ap_upcp_inst_t *e1ap_up_inst[NUMBER_OF_gNB_MAX] = {0}; -e1ap_upcp_inst_t *getCxt(E1_t type, instance_t instance) { - AssertFatal( instance < sizeofArray(e1_cp_inst), "instance exceeds limit\n"); - return type ? e1_up_inst[instance] : e1_cp_inst[instance]; +e1ap_upcp_inst_t *getCxtE1(E1_t type, instance_t instance) { + AssertFatal( instance < sizeofArray(e1ap_cp_inst), "instance exceeds limit\n"); + return type ? e1ap_up_inst[instance] : e1ap_cp_inst[instance]; +} + +int e1ap_assoc_id(bool isCu, instance_t instance) { + return 0; } void createE1inst(E1_t type, instance_t instance, e1ap_setup_req_t *req) { if (type == CPtype) { - AssertFatal(e1_cp_inst[instance] == NULL, "Double call to E1 CP instance %d\n", instance); - e1_cp_inst[instance] = (e1_upcp_inst_t *) calloc(1, sizeof(e1_upcp_inst_t)); + AssertFatal(e1ap_cp_inst[instance] == NULL, "Double call to E1 CP instance %d\n", (int)instance); + e1ap_cp_inst[instance] = (e1ap_upcp_inst_t *) calloc(1, sizeof(e1ap_upcp_inst_t)); } else { - AssertFatal(e1_up_inst[instance] == NULL, "Double call to E1 UP instance %d\n", instance); - e1_up_inst[instance] = (e1_upcp_inst_t *) calloc(1, sizeof(e1_upcp_inst_t)); - memcpy(&e1_up_inst[instance]->setupReq, req, sizeof(e1ap_setup_req_t)); + AssertFatal(e1ap_up_inst[instance] == NULL, "Double call to E1 UP instance %d\n", (int)instance); + e1ap_up_inst[instance] = (e1ap_upcp_inst_t *) calloc(1, sizeof(e1ap_upcp_inst_t)); + memcpy(&e1ap_up_inst[instance]->setupReq, req, sizeof(e1ap_setup_req_t)); } } -E1AP_TransactionID_t transacID[MAX_NUM_TRANSAC_IDS] = {0}; -srand(time(NULL)); +E1AP_TransactionID_t transacID[E1AP_MAX_NUM_TRANSAC_IDS] = {0}; + +void e1ap_common_init() { + srand(time(NULL)); +} bool check_transac_id(E1AP_TransactionID_t id, int *freeIdx) { bool isFreeIdxSet = false; - for (int i=0; i < MAX_NUM_TRANSAC_IDS; i++) { + for (int i=0; i < E1AP_MAX_NUM_TRANSAC_IDS; i++) { if (id == transacID[i]) return false; else if (!isFreeIdxSet && (transacID[i] == 0)) { @@ -69,14 +77,68 @@ E1AP_TransactionID_t E1AP_get_next_transaction_identifier() { while (!isTransacIdValid) { genTransacId = rand(); - isTransacIdValid = check_transac_Id(genTransacId, &freeIdx); + isTransacIdValid = check_transac_id(genTransacId, &freeIdx); } - AssertFatal(freeIdx < MAX_NUM_TRANSAC_IDS, "Free Index exceeds array length\n"); + AssertFatal(freeIdx < E1AP_MAX_NUM_TRANSAC_IDS, "Free Index exceeds array length\n"); transacID[freeIdx] = genTransacId; return genTransacId; } +int e1ap_decode_initiating_message(E1AP_E1AP_PDU_t *pdu) { + DevAssert(pdu != NULL); + + switch(pdu->choice.initiatingMessage->procedureCode) { + case E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup: + break; + + case E1AP_ProcedureCode_id_gNB_CU_UP_ConfigurationUpdate: + break; + + case E1AP_ProcedureCode_id_bearerContextSetup: + break; + + default: + LOG_E(E1AP, "Unsupported procedure code (%d) for initiating message\n", + (int)pdu->choice.initiatingMessage->procedureCode); + return -1; + } + return 0; +} + +int e1ap_decode_successful_outcome(E1AP_E1AP_PDU_t *pdu) { + DevAssert(pdu != NULL); + switch(pdu->choice.successfulOutcome->procedureCode) { + case E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup: + break; + + case E1AP_ProcedureCode_id_bearerContextSetup: + break; + + default: + LOG_E(E1AP, "Unsupported procedure code (%d) for successful message\n", + (int)pdu->choice.successfulOutcome->procedureCode); + return -1; + } + return 0; +} + +int e1ap_decode_unsuccessful_outcome(E1AP_E1AP_PDU_t *pdu) { + DevAssert(pdu != NULL); + switch(pdu->choice.unsuccessfulOutcome->procedureCode) { + case E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup: + break; + + default: + LOG_E(E1AP, "Unsupported procedure code (%d) for unsuccessful message\n", + (int)pdu->choice.unsuccessfulOutcome->procedureCode); + return -1; + } + return 0; +} + +int asn1_xer_print_e1ap = 1; + int e1ap_decode_pdu(E1AP_E1AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t length) { asn_dec_rval_t dec_ret; DevAssert(buffer != NULL); @@ -88,7 +150,7 @@ int e1ap_decode_pdu(E1AP_E1AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t 0, 0); - if (asn1_decoder_xer_print) { + if (asn1_xer_print_e1ap) { LOG_E(F1AP, "----------------- ASN1 DECODER PRINT START----------------- \n"); xer_fprint(stdout, &asn_DEF_E1AP_E1AP_PDU, pdu); LOG_E(F1AP, "----------------- ASN1 DECODER PRINT END ----------------- \n"); @@ -116,3 +178,41 @@ int e1ap_decode_pdu(E1AP_E1AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t return -1; } + +int e1ap_encode_send(bool isCu, instance_t instance, E1AP_E1AP_PDU_t *pdu, uint16_t stream, const char *func) { + DevAssert(pdu != NULL); + + if (asn1_xer_print_e1ap) { + LOG_E(E1AP, "----------------- ASN1 ENCODER PRINT START ----------------- \n"); + xer_fprint(stdout, &asn_DEF_E1AP_E1AP_PDU, pdu); + LOG_E(E1AP, "----------------- ASN1 ENCODER PRINT END----------------- \n"); + } + + char errbuf[2048]; /* Buffer for error message */ + size_t errlen = sizeof(errbuf); /* Size of the buffer */ + int ret = asn_check_constraints(&asn_DEF_E1AP_E1AP_PDU, pdu, errbuf, &errlen); + + if(ret) { + LOG_E(E1AP, "%s: Constraint validation failed: %s\n", func, errbuf); + } + + void *buffer = NULL; + ssize_t encoded = aper_encode_to_new_buffer(&asn_DEF_E1AP_E1AP_PDU, 0, pdu, buffer); + + if (encoded < 0) { + LOG_E(E1AP, "%s: Failed to encode E1AP message\n", func); + return -1; + } else { + MessageDef *message = itti_alloc_new_message(isCu?TASK_CUCP_E1:TASK_CUUP_E1, 0, SCTP_DATA_REQ); + sctp_data_req_t *s = &message->ittiMsg.sctp_data_req; + s->assoc_id = e1ap_assoc_id(isCu,instance); + s->buffer = buffer; + s->buffer_length = encoded; + s->stream = stream; + LOG_I(E1AP, "%s: Sending ITTI message to SCTP Task\n", func); + itti_send_msg_to_task(TASK_SCTP, instance, message); + } + + return encoded; +} + diff --git a/openair2/E1AP/e1ap_common.h b/openair2/E1AP/e1ap_common.h index ba95a0e74cddcb5bc88f2fcc5c0a4efbce3442c5..c283bb6a1b23feb8953d004a1eb5379fbaa332c0 100644 --- a/openair2/E1AP/e1ap_common.h +++ b/openair2/E1AP/e1ap_common.h @@ -24,153 +24,21 @@ #ifndef E1AP_COMMON_H_ #define E1AP_COMMON_H_ -#include "E1AP_E1AP-PDU.h" -#include "E1AP_TransactionID.h" -#include "E1AP_PriorityLevel.h" +#include "openair2/COMMON/e1ap_messages_types.h" -#define MAX_NUM_TRANSAC_IDS 8 +int e1ap_decode_pdu(E1AP_E1AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t length); -#define E1AP_SETUP_REQ(mSGpTR) (mSGpTR)->ittiMsg.e1ap_setup_req -#define E1AP_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.e1ap_setup_resp +e1ap_upcp_inst_t *getCxtE1(E1_t type, instance_t instance); -#define E1AP_PORT_NUMBER 25 -#define E1AP_SCTP_PPID 63 +E1AP_TransactionID_t E1AP_get_next_transaction_identifier(); -typedef f1ap_net_ip_address_t e1ap_net_ip_address_t; +void createE1inst(E1_t type, instance_t instance, e1ap_setup_req_t *req); -typedef int (*e1ap_message_processing_t)( - instance_t instance; - uint32_t assoc_id; - uint32_t stream; - E1AP_E1AP_PDU_t *message_p; -}; +bool check_transac_id(E1AP_TransactionID_t id, int *freeIdx); -typedef struct cell_group_s { - long id; -} cell_group_t; +int e1ap_assoc_id(bool isCu, instance_t instance); -typedef struct drb_to_setup_s { - long drbId; - long pDCP_SN_Size_UL; - long pDCP_SN_Size_DL; - long rLC_Mode; - long qci; - E1AP_PriorityLevel_t qosPriorityLevel; - E1AP_Pre_emptionCapability_t pre_emptionCapability; - E1AP_Pre_emptionVulnerability_t pre_emptionVulnerability; - in_addr_t tlAddress; - long teId; - int numCellGroups; - cell_group_t cellGroupList[MAX_NUM_CELL_GROUPS]; -} drb_to_setup_t; - -typedef struct qos_flow_to_setup_s { - long id; - long fiveQI; - long qoSPriorityLevel; - long packetDelayBudget; - long packetError_scalar; - long packetError_exponent; - E1AP_PriorityLevel_t priorityLevel; - E1AP_Pre_emptionCapability_t pre_emptionCapability; - E1AP_Pre_emptionVulnerability_t pre_emptionVulnerability; -} qos_flow_to_setup_t; - -typedef struct DRB_nGRAN_to_setup_s { - long id; - E1AP_DefaultDRB_t defaultDRB; - E1AP_SDAP_Header_UL_t sDAP_Header_UL; - E1AP_SDAP_Header_DL_t sDAP_Header_DL; - int numCellGroups; - cell_group_t cellGroupList[MAX_NUM_CELL_GROUPS]; - int numQosFlowSetup; - qos_flow_to_setup_t qosFlows[MAX_NUM_QOS_FLOWS]; -} DRB_nGRAN_to_setup_t; - -typedef struct pdu_session_to_setup_s { - long sessionId; - E1AP_PDU_Session_Type_t sessionType; - int32_t sst; - E1AP_IntegrityProtectionIndication_t integrityProtectionIndication; - E1AP_ConfidentialityProtectionIndication_t confidentialityProtectionIndication; - in_addr_t tlAddress; - long teId; - long numDRB2Setup; - DRB_nGRAN_to_setup_t DRBnGRanList[MAX_NUM_NGRAN_DRB]; -} pdu_session_to_setup_t; - -typedef struct e1ap_bearer_setup_req_s { - uint64_t gNB_cu_cp_ue_id; - uint64_t cipheringAlgorithm; - char encryptionKey[128]; - uint64_t bitRate; - E1AP_ActivityNotificationLevel_t activityNotificationLevel; - int numDRBs; - drb_to_setup_t DRBList[MAX_NUM_DRBS]; - int numPDUSessions; - pdu_session_to_setup_t pduSession[MAX_NUM_PDU_SESSIONS]; -} e1ap_bearer_setup_req_t; - -typedef struct up_params_s { - in_addr_t tlAddress; - long teId; -} up_params_t; - -typedef struct drb_setup_s { - int drbId; - in_addr_t tlAddress; - ling teId; - int numUpParam; - up_params_t UpParamList[MAX_NUM_UP_PARAM]; -} drb_setup_t; - -typedef struct qos_flow_setup_s { - long id; -} qos_flow_setup_t; - -typedef struct DRB_nGRAN_setup_s { - long id; - int numUpParam; - up_params_t UpParamList[MAX_NUM_UP_PARAM]; - int numQosFlowSetup; - qos_flow_setup_t qosFlows[MAX_NUM_QOS_FLOWS]; -} DRB_nGRAN_setup_t; - -typedef struct DRB_nGRAN_failed_s { - long id; - long cause_type; - long cause; -} DRB_nGRAN_failed_t; - -typedef struct pdu_session_setup_s { - long id; - in_addr_t tlAddress; - long teId; - int numDRBSetup; - DRB_nGRAN_setup_t DRBnGRanList[MAX_NUM_NGRAN_DRB]; - int numDRBFailed; - DRB_nGRAN_failed_t DRBnGRanFailedList[MAX_NUM_NGRAN_DRB]; -} pdu_session_setup_t; - - -typedef struct e1ap_bearer_setup_resp_s { - uint64_t gNB_cu_cp_ue_id; - uint64_t gNB_cu_up_ue_id; - int numDRBs; - drb_setup_t DRBList[MAX_NUM_DRBS]; - int numPDUSessions; -} e1ap_bearer_setup_resp_t; - -typedef struct e1ap_upcp_inst_s { - uint32_t assoc_id; - e1ap_setup_req_t setupReq; - e1ap_bearer_setup_req_t bearerSetupReq; - e1ap_bearer_setup_resp_t bearerSetupResp; -} e1ap_upcp_inst_t; - -typedef enum { - CPtype = 0, - UPtype -} E1_t; +int e1ap_encode_send(bool isCu, instance_t instance, E1AP_E1AP_PDU_t *pdu, uint16_t stream, const char *func); +void e1ap_common_init(); #endif /* E1AP_COMMON_H_ */ diff --git a/openair2/GNB_APP/gnb_app.c b/openair2/GNB_APP/gnb_app.c index 2965a6c29b77edb03bfae40c9c7dc0dcf53dd64e..e49a4f4f557dc6f589a0b9d3c6cab4510b2bcc1a 100644 --- a/openair2/GNB_APP/gnb_app.c +++ b/openair2/GNB_APP/gnb_app.c @@ -52,6 +52,7 @@ #include "nfapi/oai_integration/vendor_ext.h" #include <openair2/LAYER2/nr_pdcp/nr_pdcp.h> #include "openair2/LAYER2/PDCP_v10.1.0/pdcp.h" +#include "openair2/E1AP/e1ap.h" extern unsigned char NB_gNB_INST; extern RAN_CONTEXT_t RC; diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c index 9ffd3e2f3aa13b4d7e8bc27276f165f3d7e9cefa..52316f8cc44809839ab5e568c0f57531a52d9c32 100644 --- a/openair2/GNB_APP/gnb_config.c +++ b/openair2/GNB_APP/gnb_config.c @@ -1845,7 +1845,7 @@ int RCconfig_NR_CU_E1(MessageDef *msg_p, uint32_t i) { "gNB id %u is not defined in configuration file\n",i); config_getlist(&GNBE1ParamList, GNBE1Params, sizeof(GNBE1Params)/sizeof(paramdef_t), NULL); e1ap_setup_req_t *e1Setup = &E1AP_SETUP_REQ(msg_p); - e1setup->gNB_cu_up_id = *(GNBParamList.paramarray[0][GNB_GNB_ID_IDX].uptr); + e1Setup->gNB_cu_up_id = *(GNBParamList.paramarray[0][GNB_GNB_ID_IDX].uptr); paramdef_t PLMNParams[] = GNBPLMNPARAMS_DESC; paramlist_def_t PLMNParamList = {GNB_CONFIG_STRING_PLMN_LIST, NULL, 0}; @@ -1855,7 +1855,7 @@ int RCconfig_NR_CU_E1(MessageDef *msg_p, uint32_t i) { for (int I = 0; I < sizeof(PLMNParams) / sizeof(paramdef_t); ++I) PLMNParams[I].chkPptr = &(config_check_PLMNParams[I]); - config_getlist(&PLMNParamList, PLMNParams, sizeof(PLMNParams)/sizeof(paramdef_t), aprefix); + config_getlist(&PLMNParamList, PLMNParams, sizeof(PLMNParams)/sizeof(paramdef_t), NULL); int numPLMNs = PLMNParamList.numelt; e1Setup->supported_plmns = numPLMNs; @@ -1865,12 +1865,12 @@ int RCconfig_NR_CU_E1(MessageDef *msg_p, uint32_t i) { e1Setup->plmns[I].mnc = *PLMNParamList.paramarray[I][GNB_MNC_DIGIT_LENGTH].u8ptr; } - strcpy(e1Setup->CUCP_e1_ip_address.ipv4_address, GNBE1PARAMList.paramarray[0][GNB_CONFIG_E1_IPV4_ADDRESS_CUCP].strptr); - e1Setup->port_cucp = *GNBE1PARAMList.paramarray[0][GNB_CONFIG_E1_PORT_CUCP].uptr; - strcpy(e1Setup->CUUP_e1_ip_address.ipv4_address, GNBE1PARAMList.paramarray[0][GNB_CONFIG_E1_IPV4_ADDRESS_CUUP].strptr); - e1Setup->port_cuup = *GNBE1PARAMList.paramarray[0][GNB_CONFIG_E1_PORT_CUUP].uptr; + strcpy(e1Setup->CUCP_e1_ip_address.ipv4_address, *(GNBE1ParamList.paramarray[0][GNB_CONFIG_E1_IPV4_ADDRESS_CUCP].strptr)); + e1Setup->port_cucp = *GNBE1ParamList.paramarray[0][GNB_CONFIG_E1_PORT_CUCP].uptr; + strcpy(e1Setup->CUUP_e1_ip_address.ipv4_address, *(GNBE1ParamList.paramarray[0][GNB_CONFIG_E1_IPV4_ADDRESS_CUUP].strptr)); + e1Setup->port_cuup = *GNBE1ParamList.paramarray[0][GNB_CONFIG_E1_PORT_CUUP].uptr; - e1Setup->cn_support = *GNBE1PARAMList.Paramarray[0][GNB_CONFIG_E1_CN_SUPPORT].uptr; + e1Setup->cn_support = *GNBE1ParamList.paramarray[0][GNB_CONFIG_E1_CN_SUPPORT].uptr; } return 0; diff --git a/openair2/GNB_APP/gnb_config.h b/openair2/GNB_APP/gnb_config.h index 013997f4397e34bf748ccb59014308af4c3b9e53..ec6e6cf4b7f5d66af87ecf36833495cc2bb2ccce 100644 --- a/openair2/GNB_APP/gnb_config.h +++ b/openair2/GNB_APP/gnb_config.h @@ -41,6 +41,7 @@ #include "s1ap_messages_types.h" #include "ngap_messages_types.h" #include "f1ap_messages_types.h" +#include "e1ap_messages_types.h" #include "rrc_messages_types.h" #include "intertask_interface.h" @@ -107,6 +108,8 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i); int gNB_app_handle_f1ap_setup_resp(f1ap_setup_resp_t *resp); int gNB_app_handle_f1ap_gnb_cu_configuration_update(f1ap_gnb_cu_configuration_update_t *gnb_cu_cfg_update); void nr_read_config_and_init(void); +void set_node_type(void); +int RCconfig_NR_CU_E1(MessageDef *msg_p, uint32_t i); #endif /* GNB_CONFIG_H_ */ /** @} */ diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h index 13197fa39e5edd3a9a448b3df4a16166cd96e39b..6ac8d798918762e8be15200da3304f368b37feef 100644 --- a/openair2/GNB_APP/gnb_paramdef.h +++ b/openair2/GNB_APP/gnb_paramdef.h @@ -387,8 +387,8 @@ typedef enum { {GNB_CONFIG_STRING_E1_IPV4_ADDRESS_CUCP, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ {GNB_CONFIG_STRING_E1_PORT_CUCP, NULL, 0, uptr :NULL, defintval:25L, TYPE_UINT, 0}, \ {GNB_CONFIG_STRING_E1_IPV4_ADDRESS_CUUP, NULL, 0, strptr:NULL, defstrval:NULL, TYPE_STRING, 0}, \ - {GNB_CONFIG_STRING_E1_PORT_CUUP, NULL, 0, uptr :NULL, defintval:25L, TYPE_UINT, 0} \ - {GNB_CONFIG_STRING_E1_CN_SUPPORT, NULL, 0, uptr :NULL, defintval:1L, TYPE_UNIT, 0} \ + {GNB_CONFIG_STRING_E1_PORT_CUUP, NULL, 0, uptr :NULL, defintval:25L, TYPE_UINT, 0}, \ + {GNB_CONFIG_STRING_E1_CN_SUPPORT, NULL, 0, uptr :NULL, defintval:1L, TYPE_UINT, 0} \ } /* L1 configuration section names */ diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h index e9d9766f41b5a7621acc97b1a8a6ffef372d05ce..c8b0bdd2e1e35e878abefe05d137a603024b996e 100644 --- a/openair2/RRC/NR/nr_rrc_defs.h +++ b/openair2/RRC/NR/nr_rrc_defs.h @@ -476,6 +476,7 @@ typedef struct nr_mac_rrc_dl_if_s { typedef struct gNB_RRC_INST_s { ngran_node_t node_type; + int cu_type; uint32_t node_id; char *node_name; int module_id;