Commit 6106207b authored by Sakthivel Velumani's avatar Sakthivel Velumani

Fixing build issues

parent 67235fac
...@@ -1325,6 +1325,8 @@ add_library(NFAPI_COMMON_LIB ${NFAPI_COMMON_SRC}) ...@@ -1325,6 +1325,8 @@ add_library(NFAPI_COMMON_LIB ${NFAPI_COMMON_SRC})
include_directories(${NFAPI_DIR}/common/public_inc) include_directories(${NFAPI_DIR}/common/public_inc)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/openair2/E1AP/MESSAGES/)
set(NFAPI_SRC set(NFAPI_SRC
${NFAPI_DIR}/nfapi/src/nfapi.c ${NFAPI_DIR}/nfapi/src/nfapi.c
${NFAPI_DIR}/nfapi/src/nfapi_p4.c ${NFAPI_DIR}/nfapi/src/nfapi_p4.c
......
...@@ -79,6 +79,7 @@ typedef struct IttiMsgText_s { ...@@ -79,6 +79,7 @@ typedef struct IttiMsgText_s {
#include <openair2/COMMON/as_message.h> #include <openair2/COMMON/as_message.h>
#include <openair2/RRC/LTE/rrc_types.h> #include <openair2/RRC/LTE/rrc_types.h>
#include <openair2/COMMON/rrc_messages_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/UTIL/OctetString.h>
#include <openair3/NAS/COMMON/IES/AccessPointName.h> #include <openair3/NAS/COMMON/IES/AccessPointName.h>
......
...@@ -19,13 +19,13 @@ ...@@ -19,13 +19,13 @@
* contact@openairinterface.org * contact@openairinterface.org
*/ */
#ifndef E1AP_MESSAGES_DEF_H_
#define E1AP_MESSAGES_DEF_H_
/* gNB_CUUP application layer -> E1AP messages */ /* gNB_CUUP application layer -> E1AP messages */
MESSAGE_DEF(E1AP_SETUP_REQ , MESSAGE_PRIORITY_MED , e1ap_setup_req_t , e1ap_setup_req) 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 */ /* 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) 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)
/*
* 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 */
...@@ -42,4 +42,4 @@ ...@@ -42,4 +42,4 @@
#include "udp_messages_def.h" #include "udp_messages_def.h"
#include "gtpv1_u_messages_def.h" #include "gtpv1_u_messages_def.h"
#include "flexran_messages_def.h" #include "flexran_messages_def.h"
#include "e1ap_message_types.h" #include "e1ap_messages_def.h"
add_subdirectory(MESSAGES) add_subdirectory(MESSAGES)
add_library(E1AP e1ap.c) add_library(E1AP e1ap.c e1ap_common.c)
target_link_libraries(E1AP target_link_libraries(E1AP
PUBLIC ASN1_E1AP_LIB PUBLIC ASN1_E1AP_LIB
PRIVATE UTIL) PRIVATE UTIL)
......
...@@ -22,34 +22,39 @@ ...@@ -22,34 +22,39 @@
*/ */
#include "e1ap.h" #include "e1ap.h"
#include "e1ap_common.h"
#define NUM_E1AP_MSG_HANDLERS 14
#define E1AP_NUM_MSG_HANDLERS 14
e1ap_message_processing_t e1ap_message_processing[NUM_E1AP_MSG_HANDLERS][3] = {
e1ap_message_processing_t e1ap_message_processing[E1AP_NUM_MSG_HANDLERS][3] = {
{ 0, 0, 0 } /* Reset */
{ 0, 0, 0 } /* ErrorIndication */ { 0, 0, 0 }, /* Reset */
{ 0, 0, 0 } /* privateMessage */ { 0, 0, 0 }, /* ErrorIndication */
{ e1apCUCP_handle_SETUP_REQUEST, e1apCUUP_handle_SETUP_RESPONSE, e1apCUUP_handle_SETUP_FAILURE } /* gNBCUUPE1Setup */ { 0, 0, 0 }, /* privateMessage */
{ 0, 0, 0 } /* gNBCUCPE1Setup */ { e1apCUCP_handle_SETUP_REQUEST, e1apCUUP_handle_SETUP_RESPONSE, e1apCUUP_handle_SETUP_FAILURE }, /* gNBCUUPE1Setup */
{ 0, 0, 0 } /* gNBCUUPConfigurationUpdate */ { 0, 0, 0 }, /* gNBCUCPE1Setup */
{ 0, 0, 0 } /* gNBCUCPConfigurationUpdate */ { 0, 0, 0 }, /* gNBCUUPConfigurationUpdate */
{ 0, 0, 0 } /* E1Release */ { 0, 0, 0 }, /* gNBCUCPConfigurationUpdate */
{ e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST, e1apCUCP_handle_BEARER_CONTEXT_SETUP_RESPONSE, e1apCUCP_handle_BEARER_CONTEXT_SETUP_FAILURE } /* bearerContextSetup */ { 0, 0, 0 }, /* E1Release */
{ 0, 0, 0 } /* bearerContextModification */ { e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST, e1apCUCP_handle_BEARER_CONTEXT_SETUP_RESPONSE, e1apCUCP_handle_BEARER_CONTEXT_SETUP_FAILURE }, /* bearerContextSetup */
{ 0, 0, 0 } /* bearerContextModificationRequired */ { 0, 0, 0 }, /* bearerContextModification */
{ 0, 0, 0 } /* bearerContextRelease */ { 0, 0, 0 }, /* bearerContextModificationRequired */
{ 0, 0, 0 } /* bearerContextReleaseRequired */ { 0, 0, 0 }, /* bearerContextRelease */
{ 0, 0, 0 }, /* bearerContextReleaseRequired */
{ 0, 0, 0 } /* bearerContextInactivityNotification */ { 0, 0, 0 } /* bearerContextInactivityNotification */
}; };
int asn1_encoder_xer_print = 1; const char *e1ap_direction2String(int e1ap_dir) {
static const char *e1ap_direction_String[] = {
int e1ap_assoc_id(bool isCu, instance_t instance) { "", /* Nothing */
return 0; "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) { const uint8_t *const data, const uint32_t data_length) {
E1AP_E1AP_PDU_t pdu= {0}; E1AP_E1AP_PDU_t pdu= {0};
int ret; int ret;
...@@ -61,7 +66,7 @@ int e1ap_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream, ...@@ -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 */ /* 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_unsuccessfulOutcome)
|| (pdu.present <= E1AP_E1AP_PDU_PR_NOTHING)) { || (pdu.present <= E1AP_E1AP_PDU_PR_NOTHING)) {
LOG_E(E1AP, "[SCTP %d] Either procedureCode %ld or direction %d exceed expected\n", 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, ...@@ -70,17 +75,17 @@ int e1ap_handle_message(instance_t instance, uint32_t assoc_id, int32_t stream,
return -1; 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). // 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", LOG_E(E1AP, "[SCTP %d] No handler for procedureCode %ld in %s\n",
assoc_id, pdu.choice.initiatingMessage->procedureCode, assoc_id, pdu.choice.initiatingMessage->procedureCode,
f1ap_direction2String(pdu.present - 1)); e1ap_direction2String(pdu.present - 1));
ret=-1; ret=-1;
} else { } else {
/* Calling the right handler */ /* Calling the right handler */
LOG_I(E1AP, "Calling handler with instance %ld\n",instance); LOG_I(E1AP, "Calling handler with instance %ld\n",instance);
ret = (*e1ap_messages_processing[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1]) ret = (*e1ap_message_processing[pdu.choice.initiatingMessage->procedureCode][pdu.present - 1])
(instance, assoc_id, stream, &pdu); (instance, &pdu);
} }
ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_E1AP_E1AP_PDU, &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, ...@@ -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) { void cuup_task_handle_sctp_data_ind(instance_t instance, sctp_data_ind_t *sctp_data_ind) {
int result; int result;
DevAssert(sctp_data_ind != NULL); 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); sctp_data_ind->buffer, sctp_data_ind->buffer_length);
result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer); result = itti_free(TASK_UNKNOWN, sctp_data_ind->buffer);
AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result); 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) { void e1ap_itti_send_sctp_close_association(bool isCu, instance_t instance) {
MessageDef *message = itti_alloc_new_message(TASK_S1AP, 0, SCTP_CLOSE_ASSOCIATION); MessageDef *message = itti_alloc_new_message(TASK_S1AP, 0, SCTP_CLOSE_ASSOCIATION);
sctp_close_association_t *sctp_close_association = &message->ittiMsg.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) { ...@@ -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) { int e1ap_send_RESET_ACKNOWLEDGE(instance_t instance, E1AP_Reset_t *Reset) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1ap_handle_RESET(instance_t instance, int e1ap_handle_RESET(instance_t instance,
...@@ -155,6 +124,7 @@ int e1ap_handle_RESET(instance_t instance, ...@@ -155,6 +124,7 @@ int e1ap_handle_RESET(instance_t instance,
uint32_t stream, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1ap_handle_RESET_ACKNOWLEDGE(instance_t instance, int e1ap_handle_RESET_ACKNOWLEDGE(instance_t instance,
...@@ -162,6 +132,7 @@ int e1ap_handle_RESET_ACKNOWLEDGE(instance_t instance, ...@@ -162,6 +132,7 @@ int e1ap_handle_RESET_ACKNOWLEDGE(instance_t instance,
uint32_t stream, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
/* /*
...@@ -172,10 +143,12 @@ int e1ap_handle_ERROR_INDICATION(instance_t instance, ...@@ -172,10 +143,12 @@ int e1ap_handle_ERROR_INDICATION(instance_t instance,
uint32_t stream, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1ap_send_ERROR_INDICATION(instance_t instance, E1AP_ErrorIndication_t *ErrorIndication) { int e1ap_send_ERROR_INDICATION(instance_t instance, E1AP_ErrorIndication_t *ErrorIndication) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
...@@ -185,14 +158,14 @@ int e1ap_send_ERROR_INDICATION(instance_t instance, E1AP_ErrorIndication_t *Erro ...@@ -185,14 +158,14 @@ int e1ap_send_ERROR_INDICATION(instance_t instance, E1AP_ErrorIndication_t *Erro
int e1apCUUP_send_SETUP_REQUEST(instance_t instance) { int e1apCUUP_send_SETUP_REQUEST(instance_t instance) {
E1AP_E1AP_PDU_t pdu = {0}; 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 */ /* Create */
/* 0. pdu Type */ /* 0. pdu Type */
pdu.present = E1AP_E1AP_PDU_PR_initiatingMessage; pdu.present = E1AP_E1AP_PDU_PR_initiatingMessage;
asn1cCalloc(pdu.choice.initiatingMessage, initMsg); asn1cCalloc(pdu.choice.initiatingMessage, initMsg);
initMsg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup; initMsg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup;
initMsg->criticality = E1AP_Criticality_reject; 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; E1AP_GNB_CU_UP_E1SetupRequest_t *e1SetupUP = &initMsg->value.choice.GNB_CU_UP_E1SetupRequest;
/* mandatory */ /* mandatory */
/* c1. Transaction ID (integer value) */ /* c1. Transaction ID (integer value) */
...@@ -212,27 +185,28 @@ int e1apCUUP_send_SETUP_REQUEST(instance_t instance) { ...@@ -212,27 +185,28 @@ int e1apCUUP_send_SETUP_REQUEST(instance_t instance) {
/* mandatory */ /* mandatory */
/* c4. CN Support */ /* c4. CN Support */
asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC4); 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->criticality = E1AP_Criticality_reject;
iec4->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_CNSupport; ieC4->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_CNSupport;
iec4->value.choice.CNSupport = setup->cn_support; ieC4->value.choice.CNSupport = setup->cn_support;
/* mandatory */ /* mandatory */
/* c5. Supported PLMNs */ /* c5. Supported PLMNs */
asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC5); asn1cSequenceAdd(e1SetupUP->protocolIEs.list, E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ieC5);
iec5->id = E1AP_ProtocolIE_ID_id_SupportedPLMNs; ieC5->id = E1AP_ProtocolIE_ID_id_SupportedPLMNs;
iec5->criticality = E1AP_Criticality_reject; ieC5->criticality = E1AP_Criticality_reject;
iec5->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_SupportedPLMNs_List; ieC5->value.present = E1AP_GNB_CU_UP_E1SetupRequestIEs__value_PR_SupportedPLMNs_List;
int numSupportedPLMNs = setup->supported_plmns; int numSupportedPLMNs = setup->supported_plmns;
for (int i=0; i < numSupportedPLMNs; i++) { 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 */ /* 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, int e1apCUCP_send_SETUP_RESPONSE(instance_t instance,
...@@ -248,16 +222,18 @@ 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; E1AP_GNB_CU_UP_E1SetupResponse_t *out = &pdu.choice.successfulOutcome->value.choice.GNB_CU_UP_E1SetupResponse;
/* mandatory */ /* mandatory */
/* c1. Transaction ID (integer value) */ /* 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->id = E1AP_ProtocolIE_ID_id_TransactionID;
ieC1->criticality = E1AP_Criticality_reject; ieC1->criticality = E1AP_Criticality_reject;
ieC1->value.present = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_TransactionID; ieC1->value.present = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_TransactionID;
ieC1->value.choice.TransactionID = e1ap_setup_resp->transac_id; 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}; E1AP_E1AP_PDU_t pdu = {0};
/* Create */ /* Create */
/* 0. pdu Type */ /* 0. pdu Type */
...@@ -266,56 +242,56 @@ int e1apCUCP_send_SETUP_FAILURE(e1ap_setup_resp_t *e1ap_setup_resp) { ...@@ -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->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_E1Setup;
initMsg->criticality = E1AP_Criticality_reject; initMsg->criticality = E1AP_Criticality_reject;
initMsg->value.present = E1AP_UnsuccessfulOutcome__value_PR_GNB_CU_UP_E1SetupFailure; 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 */ /* mandatory */
/* c1. Transaction ID (integer value) */ /* 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->id = E1AP_ProtocolIE_ID_id_TransactionID;
ieC1->criticality = E1AP_Criticality_reject; ieC1->criticality = E1AP_Criticality_reject;
ieC1->value.present = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_TransactionID; ieC1->value.present = E1AP_GNB_CU_UP_E1SetupResponseIEs__value_PR_TransactionID;
ieC1->value.choice.TransactionID = e1ap_setup_resp->transac_id; ieC1->value.choice.TransactionID = e1ap_setup_resp->transac_id;
/* mandatory */ /* mandatory */
/* c2. cause (integer value) */ /* 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->id = E1AP_ProtocolIE_ID_id_Cause;
ieC2->criticality = E1AP_Criticality_ignore; ieC2->criticality = E1AP_Criticality_ignore;
ieC2->value.present = E1AP_GNB_CU_UP_E1SetupFailureIEs__value_PR_Cause; 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.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, int e1apCUCP_handle_SETUP_REQUEST(instance_t instance,
uint32_t assoc_id,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
E1AP_GNB_CU_UP_E1SetupRequestIEs_t *ie; E1AP_GNB_CU_UP_E1SetupRequestIEs_t *ie;
DevAssert(pdu != NULL); 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 */ /* assoc_id */
req->assoc_id = assoc_id; /* req->assoc_id = assoc_id; */
/* transac_id */ /* transac_id */
F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in,
E1AP_ProtocolIE_ID_id_TransactionID, true); E1AP_ProtocolIE_ID_id_TransactionID, true);
asn_INTEGER2ulong(&ie->value.choice.TransactionID, &req->transac_id); req->transac_id = ie->value.choice.TransactionID;
LOG_D(E1AP, "gNB CU UP E1 setup request transaction ID: %d\n", req->transac_id); LOG_D(E1AP, "gNB CU UP E1 setup request transaction ID: %ld\n", req->transac_id);
/* gNB CU UP ID */ /* gNB CU UP ID */
F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in,
E1AP_ProtocolIE_ID_id_gNB_CU_UP_ID, true); E1AP_ProtocolIE_ID_id_gNB_CU_UP_ID, true);
asn_INTEGER2ulong(&ie->value.choice.GNB_CU_UP_ID, &req->gNB_cu_up_id); 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 */ /* CN Support */
F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in,
E1AP_ProtocolIE_ID_id_CNSupport, true); E1AP_ProtocolIE_ID_id_CNSupport, true);
asn_INTEGER2ulong(&ie->value.choice.GNB_CU_UP_ID, &req->cn_support); req->cn_support = ie->value.choice.CNSupport;
LOG_D(E1AP, "E1ap CN support: %d\n", req->cn_support); LOG_D(E1AP, "E1ap CN support: %ld\n", req->cn_support);
/* Supported PLMNs */ /* Supported PLMNs */
F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupRequestIEs_t, ie, in, 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, ...@@ -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]); E1AP_SupportedPLMNs_Item_t *supported_plmn_item = (E1AP_SupportedPLMNs_Item_t *)(ie->value.choice.SupportedPLMNs_List.list.array[i]);
/* PLMN Identity */ /* 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].mcc,
req->plmns[i].mnc, req->plmns[i].mnc,
req->plmns[i].mnc_digit_length); 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); LOG_D(E1AP, "MCC: %d\nMNC: %d\n", req->plmns[i].mcc, req->plmns[i].mnc);
} }
/* Create ITTI message and send to queue */ /* Create ITTI message and send to queue */
return 0;
} }
int e1apCUUP_handle_SETUP_RESPONSE(instance_t instance, int e1apCUUP_handle_SETUP_RESPONSE(instance_t instance,
...@@ -351,25 +327,26 @@ 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, 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"); "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_E1SetupResponse_t *in = &pdu->choice.successfulOutcome->value.choice.GNB_CU_UP_E1SetupResponse;
E1AP_GNB_CU_UP_E1SetupResponseIEs *ie; E1AP_GNB_CU_UP_E1SetupResponseIEs_t *ie;
/* transac_id */ /* transac_id */
int transaction_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); 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); LOG_D(E1AP, "gNB CU UP E1 setup response transaction ID: %d\n", transaction_id);
/* do the required processing */ /* do the required processing */
return 0;
} }
int e1apCUUP_handle_SETUP_FAILURE(instance_t instance, int e1apCUUP_handle_SETUP_FAILURE(instance_t instance,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
E1AP_GNB_CU_UP_E1SetupFailureIEs_t *ie; E1AP_GNB_CU_UP_E1SetupFailureIEs_t *ie;
DevAssert(pdu != NULL); 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 */ /* Transaction ID */
F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie, in, F1AP_FIND_PROTOCOLIE_BY_ID(E1AP_GNB_CU_UP_E1SetupFailureIEs_t, ie, in,
E1AP_ProtocolIE_ID_id_TransactionID, true); E1AP_ProtocolIE_ID_id_TransactionID, true);
...@@ -393,25 +370,25 @@ int e1apCUUP_send_CONFIGURATION_UPDATE(instance_t instance) { ...@@ -393,25 +370,25 @@ int e1apCUUP_send_CONFIGURATION_UPDATE(instance_t instance) {
msg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_ConfigurationUpdate; msg->procedureCode = E1AP_ProcedureCode_id_gNB_CU_UP_ConfigurationUpdate;
msg->criticality = E1AP_Criticality_reject; msg->criticality = E1AP_Criticality_reject;
msg->value.present = E1AP_InitiatingMessage__value_PR_GNB_CU_UP_ConfigurationUpdate; 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 */ /* mandatory */
/* c1. Transaction ID (integer value) */ /* c1. Transaction ID (integer value) */
asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_ConfigurationUpdateIEs_t, ieC1); asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_ConfigurationUpdateIEs_t, ieC1);
ieC1->id = E1AP_ProtocolIE_ID_id_TransactionID; ieC1->id = E1AP_ProtocolIE_ID_id_TransactionID;
ieC1->criticality = E1AP_Criticality_reject; ieC1->criticality = E1AP_Criticality_reject;
ieC1->value.present = E1AP_GNB_CU_UP_ConfigurationUpdateIEs__value_PR_TransactionID; 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 */ /* mandatory */
/* c2. Supported PLMNs */ /* c2. Supported PLMNs */
asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_ConfigurationUpdateIEs_t, ieC2); asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_ConfigurationUpdateIEs_t, ieC2);
iec2->id = E1AP_ProtocolIE_ID_id_SupportedPLMNs; ieC2->id = E1AP_ProtocolIE_ID_id_SupportedPLMNs;
iec2->criticality = E1AP_Criticality_reject; ieC2->criticality = E1AP_Criticality_reject;
iec2->value.present = E1AP_GNB_CU_UP_ConfigurationUpdateIEs__value_PR_SupportedPLMNs_List; ieC2->value.present = E1AP_GNB_CU_UP_ConfigurationUpdateIEs__value_PR_SupportedPLMNs_List;
int numSupportedPLMNs = 1; int numSupportedPLMNs = 1;
for (int i=0; i < numSupportedPLMNs; i++) { 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 */ /* 5.1 PLMN Identity */
OCTET_STRING_fromBuf(&supportedPLMN->pLMN_Identity, "OAI", strlen("OAI")); OCTET_STRING_fromBuf(&supportedPLMN->pLMN_Identity, "OAI", strlen("OAI"));
} }
...@@ -419,39 +396,43 @@ int e1apCUUP_send_CONFIGURATION_UPDATE(instance_t instance) { ...@@ -419,39 +396,43 @@ int e1apCUUP_send_CONFIGURATION_UPDATE(instance_t instance) {
/* mandatory */ /* mandatory */
/* c3. TNLA to remove list */ /* c3. TNLA to remove list */
asn1cSequenceAdd(out->protocolIEs.list, E1AP_GNB_CU_UP_ConfigurationUpdateIEs_t, ieC3); 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->id = E1AP_ProtocolIE_ID_id_GNB_CU_UP_TNLA_To_Remove_List;
iec3->criticality = E1AP_Criticality_reject; ieC3->criticality = E1AP_Criticality_reject;
iec3->value.present = E1AP_GNB_CU_UP_ConfigurationUpdateIEs__value_PR_GNB_CU_UP_TNLA_To_Remove_List; ieC3->value.present = E1AP_GNB_CU_UP_ConfigurationUpdateIEs__value_PR_GNB_CU_UP_TNLA_To_Remove_List;
int numTNLAtoRemoveList = 1; int numTNLAtoRemoveList = 1;
for (int i=0; i < numTNLAtoRemoveList; i++) { 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.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) { int e1apCUCP_send_gNB_DU_CONFIGURATION_FAILURE(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_send_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance) { int e1apCUCP_send_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_handle_CONFIGURATION_UPDATE(instance_t instance, int e1apCUCP_handle_CONFIGURATION_UPDATE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
/*
E1AP_GNB_CU_UP_E1SetupRequestIEs_t *ie; E1AP_GNB_CU_UP_E1SetupRequestIEs_t *ie;
DevAssert(pdu != NULL); 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"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance, 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, ...@@ -459,6 +440,7 @@ int e1apCUUP_handle_gNB_DU_CONFIGURATION_UPDATE_ACKNOWLEDGE(instance_t instance,
uint32_t stream, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance, int e1apCUUP_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance,
...@@ -466,6 +448,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
/* /*
...@@ -474,10 +457,12 @@ int e1apCUUP_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance, ...@@ -474,10 +457,12 @@ int e1apCUUP_handle_gNB_DU_CONFIGURATION_FAILURE(instance_t instance,
int e1ap_send_RELEASE_REQUEST(instance_t instance) { int e1ap_send_RELEASE_REQUEST(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1ap_send_RELEASE_ACKNOWLEDGE(instance_t instance) { int e1ap_send_RELEASE_ACKNOWLEDGE(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1ap_handle_RELEASE_REQUEST(instance_t instance, int e1ap_handle_RELEASE_REQUEST(instance_t instance,
...@@ -485,6 +470,7 @@ int e1ap_handle_RELEASE_REQUEST(instance_t instance, ...@@ -485,6 +470,7 @@ int e1ap_handle_RELEASE_REQUEST(instance_t instance,
uint32_t stream, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1ap_handle_RELEASE_ACKNOWLEDGE(instance_t instance, int e1ap_handle_RELEASE_ACKNOWLEDGE(instance_t instance,
...@@ -492,6 +478,7 @@ int e1ap_handle_RELEASE_ACKNOWLEDGE(instance_t instance, ...@@ -492,6 +478,7 @@ int e1ap_handle_RELEASE_ACKNOWLEDGE(instance_t instance,
uint32_t stream, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
/* /*
...@@ -499,7 +486,7 @@ int e1ap_handle_RELEASE_ACKNOWLEDGE(instance_t instance, ...@@ -499,7 +486,7 @@ int e1ap_handle_RELEASE_ACKNOWLEDGE(instance_t instance,
*/ */
int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(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}; E1AP_E1AP_PDU_t pdu = {0};
/* Create */ /* Create */
/* 0. pdu Type */ /* 0. pdu Type */
...@@ -537,8 +524,7 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, ...@@ -537,8 +524,7 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
ieC4->id = E1AP_ProtocolIE_ID_id_Serving_PLMN; ieC4->id = E1AP_ProtocolIE_ID_id_Serving_PLMN;
ieC4->criticality = E1AP_Criticality_ignore; ieC4->criticality = E1AP_Criticality_ignore;
ieC4->value.present = E1AP_BearerContextSetupRequestIEs__value_PR_PLMN_Identity; ieC4->value.present = E1AP_BearerContextSetupRequestIEs__value_PR_PLMN_Identity;
uint64_t servingPLMNId = getServingPlmn(); // TODO: define this MCC_MNC_TO_PLMNID(bearerCxt->servingPLMNid.mcc, bearerCxt->servingPLMNid.mnc, bearerCxt->servingPLMNid.mnc_digit_length, &ieC4->value.choice.PLMN_Identity);
OCTET_STRING_fromBuf(&ieC4->value.choice.PLMN_Identity, servingPLMNId);
/* mandatory */ /* mandatory */
/* Activity Notification Level */ /* Activity Notification Level */
asn1cSequenceAdd(out->protocolIEs.list, E1AP_BearerContextSetupRequestIEs_t, ieC5); asn1cSequenceAdd(out->protocolIEs.list, E1AP_BearerContextSetupRequestIEs_t, ieC5);
...@@ -552,25 +538,25 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, ...@@ -552,25 +538,25 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
ieC6->id = E1AP_ProtocolIE_ID_id_System_BearerContextSetupRequest; ieC6->id = E1AP_ProtocolIE_ID_id_System_BearerContextSetupRequest;
ieC6->criticality = E1AP_Criticality_reject; ieC6->criticality = E1AP_Criticality_reject;
if (0) { // EUTRAN 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)); E1AP_EUTRAN_BearerContextSetupRequest_t *msgEUTRAN = calloc(1, sizeof(E1AP_EUTRAN_BearerContextSetupRequest_t));
ieC6->System_BearerContextSetupRequest.choice.e_UTRAN_BearerContextSetupRequest = (E1AP_ProtocolIE_Container *) msgEUTRAN; 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->id = E1AP_ProtocolIE_ID_id_DRB_To_Setup_List_EUTRAN;
msgEUTRAN->value.present = E1AP_EUTRAN_BearerContextSetupRequest__value_PR_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; 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++) { 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->dRB_ID = i->drbId;
ieC6_1->pDPC_Configuration.pDCP_SN_Size_UL = i->pDCP_SN_Size_UL; ieC6_1->pDCP_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->pDCP_Configuration.pDCP_SN_Size_DL = i->pDCP_SN_Size_DL;
ieC6_1->pDPC_Configuration.rLC_Mode = i->rLC_Mode; ieC6_1->pDCP_Configuration.rLC_Mode = i->rLC_Mode;
ieC6_1->eUTRAN_QoS.qCI = i->qci; ieC6_1->eUTRAN_QoS.qCI = i->qci;
ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.priorityLevel = i->qosPriorityLevel; ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.priorityLevel = i->qosPriorityLevel;
ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.pre_emptionCapability = i->preEmptionCapability; ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.pre_emptionCapability = i->pre_emptionCapability;
ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.pre_emptionVulnerability = i->preEmptionVulnerability; ieC6_1->eUTRAN_QoS.eUTRANallocationAndRetentionPriority.pre_emptionVulnerability = i->pre_emptionVulnerability;
ieC6_1->s1_UL_UP_TNL_Information.present = E1AP_UP_TNL_Information_PR_gTPTunnel; 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); 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, ...@@ -578,22 +564,22 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID); INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID);
for (cell_group_t *j=i->cellGroupList; j < i->cellGroupList+i->numCellGroups; j++) { 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; ieC6_1_1->cell_Group_ID = j->id;
} }
} }
} else { } else {
/* mandatory */ /* 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)); 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->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; 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; 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++) { 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_ID = i->sessionId;
ieC6_1->pDU_Session_Type = i->sessionType; ieC6_1->pDU_Session_Type = i->sessionType;
...@@ -609,20 +595,20 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, ...@@ -609,20 +595,20 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID); INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID);
for (DRB_nGRAN_to_setup_t *j=i->DRBnGRanList; j < i->DRBnGRanList+i->numDRB2Setup; j++) { 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->dRB_ID = j->id;
ieC6_1_1->sDAP_Configuration.defaultDRB = j->defaultDRB; 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_UL = j->sDAP_Header_UL;
ieC6_1_1->sDAP_Configuration.sDAP_Header_DL = j->sDAP_Header_DL; ieC6_1_1->sDAP_Configuration.sDAP_Header_DL = j->sDAP_Header_DL;
for (cell_group_t *k=j->cellGroupList; k < j->cellGroupList+numCellGroups; k++) { 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, ieC6_1_1_1); 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; ieC6_1_1_1->cell_Group_ID = k->id;
} }
for (qos_flow_to_setup_t *k=j->qosFlows; k < j->qosFlows+j->numQosFlow2Setup; k++) { 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; ieC6_1_1_1->qoS_Flow_Identifier = k->id;
if (0) { // non Dynamic 5QI if (0) { // non Dynamic 5QI
...@@ -646,7 +632,8 @@ int e1apCUCP_send_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, ...@@ -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, int e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance,
...@@ -655,49 +642,49 @@ 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 */ /* Create */
/* 0. pdu Type */ /* 0. pdu Type */
pdu.present = E1AP_E1AP_PDU_PR_successfulOutcome; pdu.present = E1AP_E1AP_PDU_PR_successfulOutcome;
asn1cCalloc(pdu.choice.initiatingMessage, msg); asn1cCalloc(pdu.choice.successfulOutcome, msg);
msg->procedureCode = E1AP_ProcedureCode_id_bearerContextSetup; msg->procedureCode = E1AP_ProcedureCode_id_bearerContextSetup;
msg->criticality = E1AP_Criticality_reject; msg->criticality = E1AP_Criticality_reject;
msg->value.present = E1AP_SuccessfulOutcome__value_PR_BearerContextSetupResponse; 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 */ /* mandatory */
/* c1. gNB-CU-CP UE E1AP ID */ /* 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->id = E1AP_ProtocolIE_ID_id_gNB_CU_CP_UE_E1AP_ID;
ieC1->criticality = E1AP_Criticality_reject; ieC1->criticality = E1AP_Criticality_reject;
ieC1->value.present = E1AP_BearerContextSetupResponseIEs__value_PR_GNB_CU_CP_UE_E1AP_ID; 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; ieC1->value.choice.GNB_CU_CP_UE_E1AP_ID = resp->gNB_cu_cp_ue_id;
/* mandatory */ /* mandatory */
/* c2. gNB-CU-UP UE E1AP ID */ /* 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->id = E1AP_ProtocolIE_ID_id_gNB_CU_UP_UE_E1AP_ID;
ieC2->criticality = E1AP_Criticality_reject; ieC2->criticality = E1AP_Criticality_reject;
ieC2->value.present = E1AP_BearerContextSetupResponseIEs__value_PR_GNB_CU_UP_UE_E1AP_ID; 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; 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->id = E1AP_ProtocolIE_ID_id_System_BearerContextSetupRequest;
ieC3->criticality = E1AP_Criticality_reject; ieC3->criticality = E1AP_Criticality_reject;
if (0) { // EUTRAN 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)); E1AP_EUTRAN_BearerContextSetupResponse_t *msgEUTRAN = calloc(1, sizeof(E1AP_EUTRAN_BearerContextSetupResponse_t));
ieC3->System_BearerContextSetupResponse.choice.e_UTRAN_BearerContextSetupResponse = (E1AP_ProtocolIE_Container *) msgEUTRAN; 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->id = E1AP_ProtocolIE_ID_id_DRB_Setup_List_EUTRAN;
msgEUTRAN.criticality = E1AP_Criticality_reject; msgEUTRAN->criticality = E1AP_Criticality_reject;
msgEUTRAN->value.present = E1AP_EUTRAN_BearerContextSetupResponse__value_PR_DRB_Setup_List_EUTRAN; 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; 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++) { 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->dRB_ID = i->drbId;
ieC3_1->s1_DL_UP_TNL_Information.present = E1AP_UP_TNL_Information_PR_gTPTunnel; 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); TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(i->tlAddress, &gTPTunnel->transportLayerAddress);
INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID); INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID);
for (up_params_t *j=i->UpParamList; j < i->UpParamList+i->numUpParam; j++) { 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; ieC3_1_1->uP_TNL_Information.present = E1AP_UP_TNL_Information_PR_gTPTunnel;
asn1cCalloc(ieC3_1_1->uP_TNL_Information.choice.gTPTunnel, gTPTunnel); asn1cCalloc(ieC3_1_1->uP_TNL_Information.choice.gTPTunnel, gTPTunnel);
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(j->tlAddress, &gTPTunnel->transportLayerAddress); 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, ...@@ -705,16 +692,16 @@ int e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance,
} }
} }
} else { } else {
ieC3->System_BearerContextSetupResponse.present = E1AP_System_BearerContextSetupResponse_PR_nG_RAN_BearerContextSetupResponse; ieC3->value.choice.System_BearerContextSetupResponse.present = E1AP_System_BearerContextSetupResponse_PR_nG_RAN_BearerContextSetupResponse;
E1AP_NG_RAN_BearerContextSetupResponse_t *msgEUTRAN = calloc(1, sizeof(E1AP_NG_RAN_BearerContextSetupResponse_t)); E1AP_NG_RAN_BearerContextSetupResponse_t *msgNGRAN = calloc(1, sizeof(E1AP_NG_RAN_BearerContextSetupResponse_t));
ieC3->System_BearerContextSetupResponse.choice.nG_RAN_BearerContextSetupResponse = (E1AP_ProtocolIE_Container *) msgNGRAN; 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->id = E1AP_ProtocolIE_ID_id_DRB_Setup_List_EUTRAN;
msgNGRAN.criticality = E1AP_Criticality_reject; msgNGRAN->criticality = E1AP_Criticality_reject;
msgNGRAN->value.present = E1AP_NG_RAN_BearerContextSetupResponse__value_PR_PDU_Session_Resource_Setup_List; 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; 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++) { 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->pDU_Session_ID = i->id;
ieC3_1->nG_DL_UP_TNL_Information.present = E1AP_UP_TNL_Information_PR_gTPTunnel; 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, ...@@ -723,26 +710,26 @@ int e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance,
INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID); INT32_TO_OCTET_STRING(i->teId, &gTPTunnel->gTP_TEID);
for (DRB_nGRAN_setup_t *j=i->DRBnGRanList; j < i->DRBnGRanList+i->numDRBSetup; j++) { 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; ieC3_1_1->dRB_ID = j->id;
for (up_params_t *k=j->UpParamList; k < j->UpParamList+j->numUpParam; k++) { 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); asn1cSequenceAdd(ieC3_1_1->uL_UP_Transport_Parameters.list, E1AP_UP_Parameters_Item_t, ieC3_1_1_1);
ieC3_1_1->uP_TNL_Information.present = E1AP_UP_TNL_Information_PR_gTPTunnel; ieC3_1_1_1->uP_TNL_Information.present = E1AP_UP_TNL_Information_PR_gTPTunnel;
asn1cCalloc(ieC3_1_1->uP_TNL_Information.choice.gTPTunnel, gTPTunnel); asn1cCalloc(ieC3_1_1_1->uP_TNL_Information.choice.gTPTunnel, gTPTunnel);
TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(k->tlAddress, &gTPTunnel->transportLayerAddress); TRANSPORT_LAYER_ADDRESS_IPv4_TO_BIT_STRING(k->tlAddress, &gTPTunnel->transportLayerAddress);
INT32_TO_OCTET_STRING(k->teId, &gTPTunnel->gTP_TEID); INT32_TO_OCTET_STRING(k->teId, &gTPTunnel->gTP_TEID);
} }
for (qos_flow_setup_t *k=j->qosFlows; k < j->qosFlows+j->numQosFlowSetup; k++) { 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; 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++) { 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->dRB_ID = j->id;
ieC3_1_1->cause.present = j->cause_type; ieC3_1_1->cause.present = j->cause_type;
...@@ -770,11 +757,13 @@ int e1apCUUP_send_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance, ...@@ -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) { int e1apCUUP_send_BEARER_CONTEXT_SETUP_FAILURE(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
...@@ -789,17 +778,17 @@ 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, AssertFatal(pdu->choice.initiatingMessage->value.present == E1AP_InitiatingMessage__value_PR_BearerContextSetupRequest,
"initiatingMessage->value.present != E1AP_InitiatingMessage__value_PR_BearerContextSetupRequest\n"); "initiatingMessage->value.present != E1AP_InitiatingMessage__value_PR_BearerContextSetupRequest\n");
E1AP_BearerContextSetupRequest_t *in = pdu->choice.initiatingMessage->value.choice.BearerContextSetupRequest; E1AP_BearerContextSetupRequest_t *in = &pdu->choice.initiatingMessage->value.choice.BearerContextSetupRequest;
E1AP_GNB_CU_CP_E1SetupRequestIEs_t *ie; 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); 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++) { for (int i=0; i < in->protocolIEs.list.count; i++) {
ie = in.protocolIEs.list.array[i]; ie = in->protocolIEs.list.array[i];
switch(ie->id) { switch(ie->id) {
case E1AP_ProtocolIE_ID_id_gNB_CU_CP_UE_E1AP_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, ...@@ -807,7 +796,7 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
"ie->criticality != E1AP_Criticality_reject\n"); "ie->criticality != E1AP_Criticality_reject\n");
AssertFatal(ie->value.present == E1AP_BearerContextSetupRequestIEs__value_PR_GNB_CU_CP_UE_E1AP_ID, 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"); "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; break;
case E1AP_ProtocolIE_ID_id_SecurityInformation: case E1AP_ProtocolIE_ID_id_SecurityInformation:
...@@ -816,7 +805,9 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, ...@@ -816,7 +805,9 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
AssertFatal(ie->value.present == E1AP_BearerContextSetupRequestIEs__value_PR_SecurityInformation, AssertFatal(ie->value.present == E1AP_BearerContextSetupRequestIEs__value_PR_SecurityInformation,
"ie->value.present != E1AP_BearerContextSetupRequestIEs__value_PR_SecurityInformation\n"); "ie->value.present != E1AP_BearerContextSetupRequestIEs__value_PR_SecurityInformation\n");
bearerCxt->cipheringAlgorithm = ie->value.choice.SecurityInformation.securityAlgorithm.cipheringAlgorithm; 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; break;
case E1AP_ProtocolIE_ID_id_UEDLAggregateMaximumBitRate: case E1AP_ProtocolIE_ID_id_UEDLAggregateMaximumBitRate:
...@@ -824,7 +815,7 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, ...@@ -824,7 +815,7 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance,
"ie->criticality != E1AP_Criticality_reject\n"); "ie->criticality != E1AP_Criticality_reject\n");
AssertFatal(ie->value.present == E1AP_BearerContextSetupRequestIEs__value_PR_BitRate, AssertFatal(ie->value.present == E1AP_BearerContextSetupRequestIEs__value_PR_BitRate,
"ie->value.present != E1AP_BearerContextSetupRequestIEs__value_PR_BitRate\n"); "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; break;
case E1AP_ProtocolIE_ID_id_Serving_PLMN: case E1AP_ProtocolIE_ID_id_Serving_PLMN:
...@@ -851,42 +842,41 @@ int e1apCUUP_handle_BEARER_CONTEXT_SETUP_REQUEST(instance_t instance, ...@@ -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, int e1apCUCP_handle_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(pdu->present == E1AP_E1AP_PDU_PR_successfulOutcome, AssertFatal(pdu->present == E1AP_E1AP_PDU_PR_successfulOutcome,
"pdu->present != E1AP_E1AP_PDU_PR_successfulOutcome\n"); "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"); "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"); "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"); "initiatingMessage->value.present != E1AP_InitiatingMessage__value_PR_BearerContextSetupRequest\n");
E1AP_BearerContextSetupResponse_t *in = pdu->choice.initiatingMessage->value.choice.BearerContextSetupRequest; E1AP_BearerContextSetupResponse_t *in = &pdu->choice.successfulOutcome->value.choice.BearerContextSetupResponse;
E1AP_GNB_CU_CP_E1SetupRequestIEs_t *ie; 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); 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++) { for (int i=0; i < in->protocolIEs.list.count; i++) {
ie = in.protocolIEs.list.array[i]; ie = in->protocolIEs.list.array[i];
switch(ie->id) { switch(ie->id) {
case E1AP_ProtocolIE_ID_id_gNB_CU_UP_UE_E1AP_ID: case E1AP_ProtocolIE_ID_id_gNB_CU_UP_UE_E1AP_ID:
AssertFatal(ie->criticality == E1AP_Criticality_reject, AssertFatal(ie->criticality == E1AP_Criticality_reject,
"ie->criticality != E1AP_Criticality_reject\n"); "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"); "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; break;
// TODO: remaining IE handlers // TODO: remaining IE handlers
...@@ -897,15 +887,15 @@ int e1apCUCP_handle_BEARER_CONTEXT_SETUP_RESPONSE(instance_t instance, ...@@ -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, int e1apCUCP_handle_BEARER_CONTEXT_SETUP_FAILURE(instance_t instance,
uint32_t assoc_id,
uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
/* /*
...@@ -914,14 +904,17 @@ int e1apCUCP_handle_BEARER_CONTEXT_SETUP_FAILURE(instance_t instance, ...@@ -914,14 +904,17 @@ int e1apCUCP_handle_BEARER_CONTEXT_SETUP_FAILURE(instance_t instance,
int e1apCUCP_send_BEARER_CONTEXT_MODIFICATION_REQUEST(instance_t instance) { int e1apCUCP_send_BEARER_CONTEXT_MODIFICATION_REQUEST(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) { int e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_RESPONSE(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_FAILURE(instance_t instance) { int e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_FAILURE(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_REQUEST(instance_t instance, int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_REQUEST(instance_t instance,
...@@ -929,6 +922,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_RESPONSE(instance_t instance, int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_RESPONSE(instance_t instance,
...@@ -936,6 +930,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_FAILURE(instance_t instance, int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_FAILURE(instance_t instance,
...@@ -943,14 +938,17 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_REQUIRED(instance_t instance) { int e1apCUUP_send_BEARER_CONTEXT_MODIFICATION_REQUIRED(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_send_BEARER_CONTEXT_MODIFICATION_CONFIRM(instance_t instance) { int e1apCUCP_send_BEARER_CONTEXT_MODIFICATION_CONFIRM(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_REQUIRED(instance_t instance, int e1apCUCP_handle_BEARER_CONTEXT_MODIFICATION_REQUIRED(instance_t instance,
...@@ -958,6 +956,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_CONFIRM(instance_t instance, int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_CONFIRM(instance_t instance,
...@@ -965,6 +964,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
/* /*
BEARER CONTEXT RELEASE BEARER CONTEXT RELEASE
...@@ -972,14 +972,17 @@ int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_CONFIRM(instance_t instance, ...@@ -972,14 +972,17 @@ int e1apCUUP_handle_BEARER_CONTEXT_MODIFICATION_CONFIRM(instance_t instance,
int e1apCUCP_send_BEARER_CONTEXT_RELEASE_COMMAND(instance_t instance) { int e1apCUCP_send_BEARER_CONTEXT_RELEASE_COMMAND(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_send_BEARER_CONTEXT_RELEASE_COMPLETE(instance_t instance) { int e1apCUUP_send_BEARER_CONTEXT_RELEASE_COMPLETE(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_send_BEARER_CONTEXT_RELEASE_REQUEST(instance_t instance) { int e1apCUUP_send_BEARER_CONTEXT_RELEASE_REQUEST(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_handle_BEARER_CONTEXT_RELEASE_COMMAND(instance_t instance, int e1apCUUP_handle_BEARER_CONTEXT_RELEASE_COMMAND(instance_t instance,
...@@ -987,6 +990,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_handle_BEARER_CONTEXT_RELEASE_COMPLETE(instance_t instance, int e1apCUCP_handle_BEARER_CONTEXT_RELEASE_COMPLETE(instance_t instance,
...@@ -994,6 +998,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_handle_BEARER_CONTEXT_RELEASE_REQUEST(instance_t instance, int e1apCUCP_handle_BEARER_CONTEXT_RELEASE_REQUEST(instance_t instance,
...@@ -1001,6 +1006,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
/* /*
...@@ -1009,6 +1015,7 @@ BEARER CONTEXT INACTIVITY NOTIFICATION ...@@ -1009,6 +1015,7 @@ BEARER CONTEXT INACTIVITY NOTIFICATION
int e1apCUUP_send_BEARER_CONTEXT_INACTIVITY_NOTIFICATION(instance_t instance) { int e1apCUUP_send_BEARER_CONTEXT_INACTIVITY_NOTIFICATION(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_handle_BEARER_CONTEXT_INACTIVITY_NOTIFICATION(instance_t instance, int e1apCUCP_handle_BEARER_CONTEXT_INACTIVITY_NOTIFICATION(instance_t instance,
...@@ -1016,6 +1023,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
/* /*
DL DATA DL DATA
...@@ -1023,10 +1031,12 @@ int e1apCUCP_handle_BEARER_CONTEXT_INACTIVITY_NOTIFICATION(instance_t instance, ...@@ -1023,10 +1031,12 @@ int e1apCUCP_handle_BEARER_CONTEXT_INACTIVITY_NOTIFICATION(instance_t instance,
int e1apCUUP_send_DL_DATA_NOTIFICATION(instance_t instance) { int e1apCUUP_send_DL_DATA_NOTIFICATION(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUUP_send_DATA_USAGE_REPORT(instance_t instance) { int e1apCUUP_send_DATA_USAGE_REPORT(instance_t instance) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_handle_DL_DATA_NOTIFICATION(instance_t instance, int e1apCUCP_handle_DL_DATA_NOTIFICATION(instance_t instance,
...@@ -1034,6 +1044,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); AssertFatal(false,"Not implemented yet\n");
return -1;
} }
int e1apCUCP_handle_send_DATA_USAGE_REPORT(instance_t instance, int e1apCUCP_handle_send_DATA_USAGE_REPORT(instance_t instance,
...@@ -1041,6 +1052,7 @@ 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, uint32_t stream,
E1AP_E1AP_PDU_t *pdu) { E1AP_E1AP_PDU_t *pdu) {
AssertFatal(false,"Not implemented yet\n"); 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) { 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 * ...@@ -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); 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); DevAssert(sctp_new_association_resp != NULL);
if (sctp_new_association_resp->sctp_state != SCTP_STATE_ESTABLISHED) { 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 ...@@ -1076,7 +1088,7 @@ void cuup_task_handle_sctp_association_resp(instance_t instance, sctp_new_associ
return; 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->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_in_streams = sctp_new_association_resp->in_streams;
e1ap_cuup_setup_req->sctp_out_streams = sctp_new_association_resp->out_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) { ...@@ -1107,7 +1119,7 @@ void cucp_task_send_sctp_init_req(instance_t instance, char *my_addr) {
void *E1AP_CUCP_task(void *arg) { void *E1AP_CUCP_task(void *arg) {
LOG_I(E1AP, "Starting E1AP at CU CP\n"); LOG_I(E1AP, "Starting E1AP at CU CP\n");
MessageDef *msg = NULL; MessageDef *msg = NULL;
int result; e1ap_common_init();
while (1) { while (1) {
itti_receive_msg(TASK_CUCP_E1, &msg); itti_receive_msg(TASK_CUCP_E1, &msg);
...@@ -1120,7 +1132,7 @@ void *E1AP_CUCP_task(void *arg) { ...@@ -1120,7 +1132,7 @@ void *E1AP_CUCP_task(void *arg) {
char *ipaddr; char *ipaddr;
if (req->CUCP_e1_ip_address.ipv4 == 0) { if (req->CUCP_e1_ip_address.ipv4 == 0) {
LOG_E(E1AP, "No IPv4 address configured\n"); LOG_E(E1AP, "No IPv4 address configured\n");
return -1; return NULL;
} }
else else
ipaddr = req->CUCP_e1_ip_address.ipv4_address; ipaddr = req->CUCP_e1_ip_address.ipv4_address;
...@@ -1136,6 +1148,7 @@ void *E1AP_CUCP_task(void *arg) { ...@@ -1136,6 +1148,7 @@ void *E1AP_CUCP_task(void *arg) {
void *E1AP_CUUP_task(void *arg) { void *E1AP_CUUP_task(void *arg) {
LOG_I(E1AP, "Starting E1AP at CU UP\n"); LOG_I(E1AP, "Starting E1AP at CU UP\n");
e1ap_common_init();
// SCTP // SCTP
while (1) { while (1) {
...@@ -1147,19 +1160,19 @@ void *E1AP_CUUP_task(void *arg) { ...@@ -1147,19 +1160,19 @@ void *E1AP_CUUP_task(void *arg) {
case E1AP_SETUP_REQ: case E1AP_SETUP_REQ:
LOG_I(E1AP, "CUUP Task Received E1AP_SETUP_REQ\n"); LOG_I(E1AP, "CUUP Task Received E1AP_SETUP_REQ\n");
e1ap_setup_req_t *msgSetup = &E1AP_SETUP_REQ(msg); 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; break;
case SCTP_NEW_ASSOCIATION_RESP: case SCTP_NEW_ASSOCIATION_RESP:
LOG_I(E1AP, "CUUP Task Received SCTP_NEW_ASSOCIATION_RESP\n"); 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; break;
case SCTP_DATA_IND: case SCTP_DATA_IND:
LOG_I(E1AP, "CUUP Task Received SCTP_DATA_IND\n"); 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; break;
default: default:
......
...@@ -27,9 +27,61 @@ ...@@ -27,9 +27,61 @@
#include <common/utils/LOG/log.h> #include <common/utils/LOG/log.h>
#include "openairinterface5g_limits.h" #include "openairinterface5g_limits.h"
#include <openair2/RRC/NR/MESSAGES/asn1_msg.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_Cause.h>
#include <E1AP_InitiatingMessage.h> #include <E1AP_InitiatingMessage.h>
#include <E1AP_E1AP-PDU.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 #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);
...@@ -23,34 +23,42 @@ ...@@ -23,34 +23,42 @@
#include <time.h> #include <time.h>
#include <stdlib.h> #include <stdlib.h>
#include "e1ap.h"
#include "e1ap_common.h" #include "e1ap_common.h"
static e1ap_upcp_inst_t *e1_cp_inst[NUMBER_OF_gNB_MAX] = {0}; static e1ap_upcp_inst_t *e1ap_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_up_inst[NUMBER_OF_gNB_MAX] = {0};
e1ap_upcp_inst_t *getCxt(E1_t type, instance_t instance) { e1ap_upcp_inst_t *getCxtE1(E1_t type, instance_t instance) {
AssertFatal( instance < sizeofArray(e1_cp_inst), "instance exceeds limit\n"); AssertFatal( instance < sizeofArray(e1ap_cp_inst), "instance exceeds limit\n");
return type ? e1_up_inst[instance] : e1_cp_inst[instance]; 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) { void createE1inst(E1_t type, instance_t instance, e1ap_setup_req_t *req) {
if (type == CPtype) { if (type == CPtype) {
AssertFatal(e1_cp_inst[instance] == NULL, "Double call to E1 CP instance %d\n", instance); AssertFatal(e1ap_cp_inst[instance] == NULL, "Double call to E1 CP instance %d\n", (int)instance);
e1_cp_inst[instance] = (e1_upcp_inst_t *) calloc(1, sizeof(e1_upcp_inst_t)); e1ap_cp_inst[instance] = (e1ap_upcp_inst_t *) calloc(1, sizeof(e1ap_upcp_inst_t));
} else { } else {
AssertFatal(e1_up_inst[instance] == NULL, "Double call to E1 UP instance %d\n", instance); AssertFatal(e1ap_up_inst[instance] == NULL, "Double call to E1 UP instance %d\n", (int)instance);
e1_up_inst[instance] = (e1_upcp_inst_t *) calloc(1, sizeof(e1_upcp_inst_t)); e1ap_up_inst[instance] = (e1ap_upcp_inst_t *) calloc(1, sizeof(e1ap_upcp_inst_t));
memcpy(&e1_up_inst[instance]->setupReq, req, sizeof(e1ap_setup_req_t)); memcpy(&e1ap_up_inst[instance]->setupReq, req, sizeof(e1ap_setup_req_t));
} }
} }
E1AP_TransactionID_t transacID[MAX_NUM_TRANSAC_IDS] = {0}; E1AP_TransactionID_t transacID[E1AP_MAX_NUM_TRANSAC_IDS] = {0};
srand(time(NULL));
void e1ap_common_init() {
srand(time(NULL));
}
bool check_transac_id(E1AP_TransactionID_t id, int *freeIdx) { bool check_transac_id(E1AP_TransactionID_t id, int *freeIdx) {
bool isFreeIdxSet = false; 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]) if (id == transacID[i])
return false; return false;
else if (!isFreeIdxSet && (transacID[i] == 0)) { else if (!isFreeIdxSet && (transacID[i] == 0)) {
...@@ -69,14 +77,68 @@ E1AP_TransactionID_t E1AP_get_next_transaction_identifier() { ...@@ -69,14 +77,68 @@ E1AP_TransactionID_t E1AP_get_next_transaction_identifier() {
while (!isTransacIdValid) { while (!isTransacIdValid) {
genTransacId = rand(); 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; transacID[freeIdx] = genTransacId;
return 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) { int e1ap_decode_pdu(E1AP_E1AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t length) {
asn_dec_rval_t dec_ret; asn_dec_rval_t dec_ret;
DevAssert(buffer != NULL); DevAssert(buffer != NULL);
...@@ -88,7 +150,7 @@ int e1ap_decode_pdu(E1AP_E1AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t ...@@ -88,7 +150,7 @@ int e1ap_decode_pdu(E1AP_E1AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t
0, 0,
0); 0);
if (asn1_decoder_xer_print) { if (asn1_xer_print_e1ap) {
LOG_E(F1AP, "----------------- ASN1 DECODER PRINT START----------------- \n"); LOG_E(F1AP, "----------------- ASN1 DECODER PRINT START----------------- \n");
xer_fprint(stdout, &asn_DEF_E1AP_E1AP_PDU, pdu); xer_fprint(stdout, &asn_DEF_E1AP_E1AP_PDU, pdu);
LOG_E(F1AP, "----------------- ASN1 DECODER PRINT END ----------------- \n"); 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 ...@@ -116,3 +178,41 @@ int e1ap_decode_pdu(E1AP_E1AP_PDU_t *pdu, const uint8_t *const buffer, uint32_t
return -1; 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;
}
...@@ -24,153 +24,21 @@ ...@@ -24,153 +24,21 @@
#ifndef E1AP_COMMON_H_ #ifndef E1AP_COMMON_H_
#define E1AP_COMMON_H_ #define E1AP_COMMON_H_
#include "E1AP_E1AP-PDU.h" #include "openair2/COMMON/e1ap_messages_types.h"
#include "E1AP_TransactionID.h"
#include "E1AP_PriorityLevel.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 e1ap_upcp_inst_t *getCxtE1(E1_t type, instance_t instance);
#define E1AP_SETUP_RESP(mSGpTR) (mSGpTR)->ittiMsg.e1ap_setup_resp
#define E1AP_PORT_NUMBER 25 E1AP_TransactionID_t E1AP_get_next_transaction_identifier();
#define E1AP_SCTP_PPID 63
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)( bool check_transac_id(E1AP_TransactionID_t id, int *freeIdx);
instance_t instance;
uint32_t assoc_id;
uint32_t stream;
E1AP_E1AP_PDU_t *message_p;
};
typedef struct cell_group_s { int e1ap_assoc_id(bool isCu, instance_t instance);
long id;
} cell_group_t;
typedef struct drb_to_setup_s { int e1ap_encode_send(bool isCu, instance_t instance, E1AP_E1AP_PDU_t *pdu, uint16_t stream, const char *func);
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;
void e1ap_common_init();
#endif /* E1AP_COMMON_H_ */ #endif /* E1AP_COMMON_H_ */
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include "nfapi/oai_integration/vendor_ext.h" #include "nfapi/oai_integration/vendor_ext.h"
#include <openair2/LAYER2/nr_pdcp/nr_pdcp.h> #include <openair2/LAYER2/nr_pdcp/nr_pdcp.h>
#include "openair2/LAYER2/PDCP_v10.1.0/pdcp.h" #include "openair2/LAYER2/PDCP_v10.1.0/pdcp.h"
#include "openair2/E1AP/e1ap.h"
extern unsigned char NB_gNB_INST; extern unsigned char NB_gNB_INST;
extern RAN_CONTEXT_t RC; extern RAN_CONTEXT_t RC;
......
...@@ -1845,7 +1845,7 @@ int RCconfig_NR_CU_E1(MessageDef *msg_p, uint32_t i) { ...@@ -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); "gNB id %u is not defined in configuration file\n",i);
config_getlist(&GNBE1ParamList, GNBE1Params, sizeof(GNBE1Params)/sizeof(paramdef_t), NULL); config_getlist(&GNBE1ParamList, GNBE1Params, sizeof(GNBE1Params)/sizeof(paramdef_t), NULL);
e1ap_setup_req_t *e1Setup = &E1AP_SETUP_REQ(msg_p); 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; paramdef_t PLMNParams[] = GNBPLMNPARAMS_DESC;
paramlist_def_t PLMNParamList = {GNB_CONFIG_STRING_PLMN_LIST, NULL, 0}; 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) { ...@@ -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) for (int I = 0; I < sizeof(PLMNParams) / sizeof(paramdef_t); ++I)
PLMNParams[I].chkPptr = &(config_check_PLMNParams[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; int numPLMNs = PLMNParamList.numelt;
e1Setup->supported_plmns = numPLMNs; e1Setup->supported_plmns = numPLMNs;
...@@ -1865,12 +1865,12 @@ int RCconfig_NR_CU_E1(MessageDef *msg_p, uint32_t i) { ...@@ -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; 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); 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; 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); 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->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; return 0;
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include "s1ap_messages_types.h" #include "s1ap_messages_types.h"
#include "ngap_messages_types.h" #include "ngap_messages_types.h"
#include "f1ap_messages_types.h" #include "f1ap_messages_types.h"
#include "e1ap_messages_types.h"
#include "rrc_messages_types.h" #include "rrc_messages_types.h"
#include "intertask_interface.h" #include "intertask_interface.h"
...@@ -107,6 +108,8 @@ int RCconfig_NR_DU_F1(MessageDef *msg_p, uint32_t i); ...@@ -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_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); 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 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_ */ #endif /* GNB_CONFIG_H_ */
/** @} */ /** @} */
...@@ -387,8 +387,8 @@ typedef enum { ...@@ -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_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_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_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_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_CN_SUPPORT, NULL, 0, uptr :NULL, defintval:1L, TYPE_UINT, 0} \
} }
/* L1 configuration section names */ /* L1 configuration section names */
......
...@@ -476,6 +476,7 @@ typedef struct nr_mac_rrc_dl_if_s { ...@@ -476,6 +476,7 @@ typedef struct nr_mac_rrc_dl_if_s {
typedef struct gNB_RRC_INST_s { typedef struct gNB_RRC_INST_s {
ngran_node_t node_type; ngran_node_t node_type;
int cu_type;
uint32_t node_id; uint32_t node_id;
char *node_name; char *node_name;
int module_id; int module_id;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment