#/*
# * 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.0  (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
# *
# * 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
# */

# Author: Lionel GAUTHIER

cmake_minimum_required(VERSION 2.8)
set(CMAKE_VERBOSE_MAKEFILE ON)


project(at_nas_ue)


ENABLE_LANGUAGE(C)
#Sends the -std=c99 flag to the gcc compiler
#add_definitions(-std=c99)

ADD_DEFINITIONS(-D_GNU_SOURCE)

set (OPENAIR_DIR     $ENV{OPENAIR_DIR})

if( NOT DEFINED OPENAIR_DIR)
  message(SEND_ERROR "OPENAIR_DIR not set: ${OPENAIR_DIR}")
endif( NOT DEFINED OPENAIR_DIR)

set(OPENAIR1_DIR          ${OPENAIR_DIR}/openair1)
set(OPENAIR2_DIR          ${OPENAIR_DIR}/openair2)
set(OPENAIR3_DIR          ${OPENAIR_DIR}/openair3)
set(OPENAIR3_DIR         ${OPENAIR_DIR}/openair3)
set(OPENAIR_TARGETS       ${OPENAIR_DIR}/targets)
set(OPENAIR_CMAKE_SCRIPTS ${OPENAIR_DIR}/cmake_targets/tools)
set(OPENAIR_BIN_DIR       ${OPENAIR_DIR}/targets/bin)
set(OPENAIR_NAS_DIR       ${OPENAIR_DIR}/openair3/NAS)


set(CMAKE_MODULE_PATH "${OPENAIR_DIR}/cmake_targets/tools/MODULES" "${CMAKE_MODULE_PATH}")

macro(add_option name val helpstr)
  if(DEFINED ${name})
    set(value ${${name}})
  else(DEFINED ${name})
    set(value ${val})
  endif()
  set(${name} ${value} CACHE STRING "${helpstr}")
  add_definitions("-D${name}=${value}")
endmacro(add_option)

macro(add_boolean_option name val helpstr)
  if(DEFINED ${name})
    set(value ${${name}})
  else(DEFINED ${name})
    set(value ${val})
  endif()
  set(${name} ${value} CACHE STRING "${helpstr}")
  set_property(CACHE ${name} PROPERTY TYPE BOOL)
  if (${value})
    add_definitions("-D${name}")
  endif (${value})
endmacro(add_boolean_option)

# compilation flags
# added CMAKER conditional compilation to not bother legacy building system
#############################################
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: None(CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif()
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel)

#
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse4.2 -std=gnu99 -Wall -Wstrict-prototypes -fno-strict-aliasing -rdynamic -funroll-loops -Wno-packed-bitfield-compat -DCMAKER")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -ggdb -DMALLOC_CHECK_=3")
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ggdb -DMALLOC_CHECK_=3 -O2")


include(FindPkgConfig)

INCLUDE(FindNettle)
IF( NOT NETTLE_FOUND )
  MESSAGE( SEND_ERROR "Nettle is required" )
ENDIF( NOT NETTLE_FOUND )


pkg_search_module(OPENSSL openssl REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIRS})


pkg_search_module(CRYPTO libcrypto REQUIRED)
include_directories(${CRYPTO_INCLUDE_DIRS})


set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)

set (FIRMWARE_VERSION "No svn information")
add_definitions("-DFIRMWARE_VERSION=\"${FIRMWARE_VERSION}\"")

add_boolean_option(LINUX   True  "????")
add_boolean_option(ENB_MODE   True  "????") # to avoid backtrace

##########################
# NAS LAYER OPTIONS
##########################
add_boolean_option(ENABLE_NAS_UE_LOGGING   True  "????")
add_boolean_option(NAS_BUILT_IN_EPC        False "MME NAS layer not present in this executable")
add_boolean_option(NAS_BUILT_IN_UE         False  "UE NAS layer present in this executable")
add_boolean_option(NAS_UE                  True  "NAS UE INSTANCE (<> NAS_MME)")
add_boolean_option(NAS_MME                 False "NAS_UE and NAS_MME are incompatible options")

################################################################################
# SECU LIB
################################################################################
set(secu_cn_SRC
  ${OPENAIR3_DIR}/SECU/kdf.c
  ${OPENAIR3_DIR}/SECU/rijndael.c
  ${OPENAIR3_DIR}/SECU/snow3g.c
  ${OPENAIR3_DIR}/SECU/key_nas_deriver.c
  ${OPENAIR3_DIR}/SECU/nas_stream_eea1.c
  ${OPENAIR3_DIR}/SECU/nas_stream_eia1.c
  ${OPENAIR3_DIR}/SECU/nas_stream_eea2.c
  ${OPENAIR3_DIR}/SECU/nas_stream_eia2.c
  )
add_library(secu_cn ${secu_cn_SRC})
target_include_directories(secu_cn PRIVATE 
                            ${OPENAIR_DIR}/common/utils/itti
                            ${OPENAIR_DIR}/openair2/COMMON
                            ${OPENAIR3_DIR}/UTILS
)

################################################################################
# UTIL LIB
################################################################################
set(util_SRC
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/device.c
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/memory.c
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/nas_log.c
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/nas_timer.c
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/OctetString.c
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/parser.c
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/TLVDecoder.c
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/TLVEncoder.c
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/socket.c
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/stty.c
)
set(util_HDR
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/device.h
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/memory.h
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/nas_log.h
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/nas_timer.h
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/OctetString.h
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/parser.h
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/TLVDecoder.h
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/TLVEncoder.h
    ${OPENAIR_NAS_DIR}/COMMON/UTIL/socket.h
)

add_library(util ${util_SRC} ${util_HDR})
target_include_directories(util PRIVATE ${OPENAIR_NAS_DIR}/COMMON/UTIL
                                        ${OPENAIR_NAS_DIR}/COMMON
                                        )


################################################################################
# api_user LIB
################################################################################
set(api_user_SRC
    ${OPENAIR_NAS_DIR}/UE/API/USER/at_command.c
    ${OPENAIR_NAS_DIR}/UE/API/USER/at_error.c
    ${OPENAIR_NAS_DIR}/UE/API/USER/at_response.c
    ${OPENAIR_NAS_DIR}/UE/API/USER/user_api.c
    ${OPENAIR_NAS_DIR}/UE/API/USER/user_indication.c
)

set(api_user_HDR
    ${OPENAIR_NAS_DIR}/UE/API/USER/at_command.h
    ${OPENAIR_NAS_DIR}/UE/API/USER/at_error.h
    ${OPENAIR_NAS_DIR}/UE/API/USER/at_response.h
    ${OPENAIR_NAS_DIR}/UE/API/USER/user_api.h
    ${OPENAIR_NAS_DIR}/UE/API/USER/user_indication.h
)

add_library(api_user ${api_user_SRC} ${api_user_HDR})
target_include_directories(api_user PRIVATE ${OPENAIR_NAS_DIR}/UE/API/USER
                                            ${OPENAIR_NAS_DIR}/UE
                                            ${OPENAIR_NAS_DIR}/COMMON
                                            )

################################################################################
# api_usim LIB
################################################################################
set(api_usim_SRC
    ${OPENAIR_NAS_DIR}/UE/API/USIM/aka_functions.c
    ${OPENAIR_NAS_DIR}/UE/API/USIM/usim_api.c
)

set(api_usim_HDR
    ${OPENAIR_NAS_DIR}/UE/API/USIM/aka_functions.h
    ${OPENAIR_NAS_DIR}/UE/API/USIM/usim_api.h

)

add_library(api_usim ${api_usim_SRC} ${api_usim_HDR})
target_include_directories(api_usim PRIVATE ${OPENAIR_NAS_DIR}/UE/API/USIM)

################################################################################
# api_network LIB
################################################################################
set(api_network_SRC
    ${OPENAIR_NAS_DIR}/COMMON/API/NETWORK/as_message.c
    ${OPENAIR_NAS_DIR}/COMMON/API/NETWORK/nas_message.c
    ${OPENAIR_NAS_DIR}/COMMON/API/NETWORK/network_api.c
)
set(api_network_HDR
    ${OPENAIR_NAS_DIR}/COMMON/API/NETWORK/as_message.h
    ${OPENAIR_NAS_DIR}/COMMON/API/NETWORK/nas_message.h
    ${OPENAIR_NAS_DIR}/COMMON/API/NETWORK/network_api.h
)

add_library(api_network ${api_network_SRC} ${api_network_HDR})
target_include_directories(api_network PRIVATE ${OPENAIR_NAS_DIR}/COMMON/API/NETWORK
                                               ${OPENAIR_NAS_DIR}/COMMON
                                               )


################################################################################
# emm LIB
################################################################################
set(emm_SRC
    ${OPENAIR_NAS_DIR}/UE/EMM/Attach.c
    ${OPENAIR_NAS_DIR}/UE/EMM/Authentication.c
    ${OPENAIR_NAS_DIR}/UE/EMM/Detach.c
    ${OPENAIR_NAS_DIR}/UE/EMM/emm_main.c
    ${OPENAIR_NAS_DIR}/UE/EMM/EmmStatusHdl.c
    ${OPENAIR_NAS_DIR}/UE/EMM/Identification.c
    ${OPENAIR_NAS_DIR}/UE/EMM/IdleMode.c
    ${OPENAIR_NAS_DIR}/UE/EMM/LowerLayer.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SecurityModeControl.c
    ${OPENAIR_NAS_DIR}/UE/EMM/ServiceRequestHdl.c
    ${OPENAIR_NAS_DIR}/UE/EMM/TrackingAreaUpdate.c

    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/emm_msg.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachAccept.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachComplete.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachReject.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachAccept.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachComplete.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachReject.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AuthenticationFailure.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AuthenticationReject.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AuthenticationRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AuthenticationResponse.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/CsServiceNotification.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/DetachAccept.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/DetachRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/DownlinkNasTransport.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/EmmInformation.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/emm_msg.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/EmmStatus.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/ExtendedServiceRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/GutiReallocationCommand.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/GutiReallocationComplete.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/IdentityRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/IdentityResponse.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/SecurityModeCommand.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/SecurityModeComplete.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/SecurityModeReject.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/ServiceReject.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/ServiceRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/TrackingAreaUpdateAccept.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/TrackingAreaUpdateComplete.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/TrackingAreaUpdateReject.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/TrackingAreaUpdateRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/UplinkNasTransport.c
    
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_as.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmDeregisteredAttachNeeded.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmDeregisteredAttemptingToAttach.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmDeregistered.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmDeregisteredInitiated.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmDeregisteredLimitedService.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmDeregisteredNoCellAvailable.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmDeregisteredNoImsi.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmDeregisteredNormalService.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmDeregisteredPlmnSearch.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_esm.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_fsm.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmNull.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_recv.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_reg.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmRegisteredAttemptingToUpdate.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmRegistered.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmRegisteredImsiDetachInitiated.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmRegisteredInitiated.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmRegisteredLimitedService.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmRegisteredNoCellAvailable.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmRegisteredNormalService.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmRegisteredPlmnSearch.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmRegisteredUpdateNeeded.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_sap.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_send.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmServiceRequestInitiated.c
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/EmmTrackingAreaUpdatingInitiated.c
    
)

set(emm_HDR
    ${OPENAIR_NAS_DIR}/UE/EMM/emmData.h
    ${OPENAIR_NAS_DIR}/UE/EMM/emm_main.h
    ${OPENAIR_NAS_DIR}/UE/EMM/emm_proc.h
    ${OPENAIR_NAS_DIR}/UE/EMM/IdleMode.h
    ${OPENAIR_NAS_DIR}/UE/EMM/LowerLayer.h
    
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachAccept.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachComplete.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachReject.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AttachRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AuthenticationFailure.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AuthenticationReject.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AuthenticationRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/AuthenticationResponse.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/CsServiceNotification.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/DetachAccept.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/DetachRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/DownlinkNasTransport.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/emm_cause.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/EmmInformation.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/emm_msgDef.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/emm_msg.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/EmmStatus.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/ExtendedServiceRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/GutiReallocationCommand.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/GutiReallocationComplete.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/IdentityRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/IdentityResponse.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/NASSecurityModeCommand.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/NASSecurityModeComplete.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/SecurityModeReject.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/ServiceReject.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/ServiceRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/TrackingAreaUpdateAccept.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/TrackingAreaUpdateComplete.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/TrackingAreaUpdateReject.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/TrackingAreaUpdateRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG/UplinkNasTransport.h
    
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_asDef.h
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_as.h
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_esmDef.h
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_esm.h
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_fsm.h
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_recv.h
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_regDef.h
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_reg.h
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_sap.h
    ${OPENAIR_NAS_DIR}/UE/EMM/SAP/emm_send.h

)

add_library(emm ${emm_SRC} ${emm_HDR})

target_include_directories(emm PRIVATE 
                     ${OPENAIR_DIR}/common/utils/msc 
                     ${OPENAIR_DIR}/common/utils
                     ${OPENAIR_DIR}/openair2/COMMON
                     ${OPENAIR_NAS_DIR}/UE/API/USIM 
                     ${OPENAIR_NAS_DIR}/UE/EMM
                     ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG
                     ${OPENAIR_NAS_DIR}/UE/EMM/SAP
                     ${OPENAIR_NAS_DIR}/COMMON/IES
)


################################################################################
# esm LIB
################################################################################
set(esm_SRC
    ${OPENAIR_NAS_DIR}/UE/ESM/esm_main.c
    ${OPENAIR_NAS_DIR}/UE/ESM/DedicatedEpsBearerContextActivation.c
    ${OPENAIR_NAS_DIR}/UE/ESM/DefaultEpsBearerContextActivation.c
    ${OPENAIR_NAS_DIR}/UE/ESM/EpsBearerContextDeactivation.c
    ${OPENAIR_NAS_DIR}/UE/ESM/esm_ebr.c
    ${OPENAIR_NAS_DIR}/UE/ESM/esm_ebr_context.c
    ${OPENAIR_NAS_DIR}/UE/ESM/esm_ip.c
    ${OPENAIR_NAS_DIR}/UE/ESM/esm_main.c
    ${OPENAIR_NAS_DIR}/UE/ESM/esm_pt.c
    ${OPENAIR_NAS_DIR}/UE/ESM/EsmStatusHdl.c
    ${OPENAIR_NAS_DIR}/UE/ESM/PdnConnectivity.c
    ${OPENAIR_NAS_DIR}/UE/ESM/PdnDisconnect.c
    
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/BearerResourceAllocationReject.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/BearerResourceAllocationRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/BearerResourceModificationReject.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/BearerResourceModificationRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/EsmInformationRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/EsmInformationResponse.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/esm_msg.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/EsmStatus.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ModifyEpsBearerContextReject.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/PdnConnectivityReject.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/PdnConnectivityRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/PdnDisconnectReject.c
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/PdnDisconnectRequest.c
    
    ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_recv.c
    ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_sap.c
    ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_send.c
)

set(esm_HDR
    ${OPENAIR_NAS_DIR}/UE/ESM/esm_main.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextAccept.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextReject.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDedicatedEpsBearerContextRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextAccept.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextReject.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ActivateDefaultEpsBearerContextRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/BearerResourceAllocationReject.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/BearerResourceAllocationRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/BearerResourceModificationReject.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/BearerResourceModificationRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/DeactivateEpsBearerContextAccept.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/DeactivateEpsBearerContextRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/esm_cause.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/EsmInformationRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/EsmInformationResponse.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/esm_msgDef.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/esm_msg.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/EsmStatus.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ModifyEpsBearerContextAccept.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ModifyEpsBearerContextReject.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/ModifyEpsBearerContextRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/PdnConnectivityReject.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/PdnConnectivityRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/PdnDisconnectReject.h
    ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG/PdnDisconnectRequest.h
    ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_recv.h
    ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_sap.h
    ${OPENAIR_NAS_DIR}/UE/ESM/SAP/esm_send.h
)

add_library(esm ${esm_SRC} ${esm_HDR})

target_include_directories(esm PRIVATE 
                     ${OPENAIR_NAS_DIR}/UE/API/USER 
                     ${OPENAIR_NAS_DIR}/UE/ESM
                     ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG
                     ${OPENAIR_NAS_DIR}/UE/ESM/SAP
                     ${OPENAIR_NAS_DIR}/COMMON/IES
)

################################################################################
# ies LIB
################################################################################
set(ies_SRC
    ${OPENAIR_NAS_DIR}/COMMON/IES/AccessPointName.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/AdditionalUpdateResult.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/AdditionalUpdateType.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/ApnAggregateMaximumBitRate.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/AuthenticationFailureParameter.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/AuthenticationParameterAutn.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/AuthenticationParameterRand.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/AuthenticationResponseParameter.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/CipheringKeySequenceNumber.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/Cli.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/CsfbResponse.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/DaylightSavingTime.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/DetachType.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/DrxParameter.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EmergencyNumberList.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EmmCause.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsAttachResult.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsAttachType.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsBearerContextStatus.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsBearerIdentity.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsMobileIdentity.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsNetworkFeatureSupport.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsQualityOfService.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsUpdateResult.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsUpdateType.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EsmCause.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EsmInformationTransferFlag.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/EsmMessageContainer.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/GprsTimer.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/GutiType.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/IdentityType2.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/ImeisvRequest.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/KsiAndSequenceNumber.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/LcsClientIdentity.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/LcsIndicator.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/LinkedEpsBearerIdentity.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/LlcServiceAccessPointIdentifier.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/LocationAreaIdentification.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/MessageType.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/MobileIdentity.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/MobileStationClassmark2.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/MobileStationClassmark3.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/MsNetworkCapability.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/MsNetworkFeatureSupport.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/NasKeySetIdentifier.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/NasMessageContainer.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/NasRequestType.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/NasSecurityAlgorithms.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/NetworkName.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/Nonce.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/PacketFlowIdentifier.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/PagingIdentity.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/PdnAddress.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/PdnType.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/PlmnList.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/ProcedureTransactionIdentity.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/ProtocolConfigurationOptions.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/ProtocolDiscriminator.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/PTmsiSignature.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/QualityOfService.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/RadioPriority.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/SecurityHeaderType.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/ServiceType.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/ShortMac.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/SsCode.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/SupportedCodecList.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/TimeZoneAndTime.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/TimeZone.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/TmsiStatus.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/TrackingAreaIdentity.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/TrackingAreaIdentityList.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/TrafficFlowAggregateDescription.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/TrafficFlowTemplate.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/TransactionIdentifier.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/UeNetworkCapability.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/UeSecurityCapability.c
    ${OPENAIR_NAS_DIR}/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.c
)
set(ies_HDR
    ${OPENAIR_NAS_DIR}/COMMON/IES/AccessPointName.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/AdditionalUpdateResult.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/AdditionalUpdateType.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/ApnAggregateMaximumBitRate.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/AuthenticationFailureParameter.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/AuthenticationParameterAutn.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/AuthenticationParameterRand.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/AuthenticationResponseParameter.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/CipheringKeySequenceNumber.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/Cli.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/CsfbResponse.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/DaylightSavingTime.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/DetachType.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/DrxParameter.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EmergencyNumberList.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EmmCause.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsAttachResult.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsAttachType.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsBearerContextStatus.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsBearerIdentity.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsMobileIdentity.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsNetworkFeatureSupport.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsQualityOfService.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsUpdateResult.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EpsUpdateType.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EsmCause.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EsmInformationTransferFlag.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/EsmMessageContainer.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/GprsTimer.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/GutiType.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/IdentityType2.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/ImeisvRequest.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/KsiAndSequenceNumber.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/LcsClientIdentity.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/LcsIndicator.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/LinkedEpsBearerIdentity.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/LlcServiceAccessPointIdentifier.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/LocationAreaIdentification.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/MessageType.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/MobileIdentity.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/MobileStationClassmark2.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/MobileStationClassmark3.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/MsNetworkCapability.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/MsNetworkFeatureSupport.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/NasKeySetIdentifier.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/NasMessageContainer.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/NasRequestType.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/NasSecurityAlgorithms.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/NetworkName.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/Nonce.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/PacketFlowIdentifier.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/PagingIdentity.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/PdnAddress.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/PdnType.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/PlmnList.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/ProcedureTransactionIdentity.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/ProtocolConfigurationOptions.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/ProtocolDiscriminator.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/PTmsiSignature.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/QualityOfService.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/RadioPriority.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/SecurityHeaderType.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/ServiceType.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/ShortMac.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/SsCode.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/SupportedCodecList.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/TimeZoneAndTime.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/TimeZone.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/TmsiStatus.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/TrackingAreaIdentity.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/TrackingAreaIdentityList.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/TrafficFlowAggregateDescription.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/TrafficFlowTemplate.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/TransactionIdentifier.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/UeNetworkCapability.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/UeRadioCapabilityInformationUpdateNeeded.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/UeSecurityCapability.h
    ${OPENAIR_NAS_DIR}/COMMON/IES/VoiceDomainPreferenceAndUeUsageSetting.h

)

add_library(ies ${ies_SRC} ${ies_HDR})

target_include_directories(ies PRIVATE 
                     ${OPENAIR_NAS_DIR}/COMMON/IES 
)



################################################################################
# EXECUTABLE at_nas_ue
################################################################################
include_directories( 
                     ${OPENAIR_DIR}/common/utils/msc 
                     ${OPENAIR3_DIR}/COMMON 
                     ${OPENAIR3_DIR}/SECU 
                     ${OPENAIR_NAS_DIR}/src 
                     ${OPENAIR_NAS_DIR}/COMMON 
                     ${OPENAIR_NAS_DIR}/COMMON/API/NETWORK 
                     ${OPENAIR_NAS_DIR}/UE/API/USER 
                     ${OPENAIR_NAS_DIR}/UE/EMM 
                     ${OPENAIR_NAS_DIR}/COMMON/EMM/MSG 
                     ${OPENAIR_NAS_DIR}/UE/EMM/SAP 
                     ${OPENAIR_NAS_DIR}/UE/ESM 
                     ${OPENAIR_NAS_DIR}/UE/ESM/SAP 
                     ${OPENAIR_NAS_DIR}/COMMON/ESM/MSG 
                     ${OPENAIR_NAS_DIR}/COMMON/IES 
                     ${OPENAIR_NAS_DIR}/COMMON/UTIL )
                     
ADD_EXECUTABLE(at_nas_ue  ${OPENAIR_NAS_DIR}/UE/UEprocess.c 
                          ${OPENAIR_NAS_DIR}/UE/nas_network.c  
                          ${OPENAIR_NAS_DIR}/UE/nas_parser.c
                          ${OPENAIR_NAS_DIR}/UE/nas_proc.c  
                          ${OPENAIR_NAS_DIR}/UE/nas_user.c  
                          )
                          
target_link_libraries (at_nas_ue 
                       -Wl,-whole-archive 
                       api_network api_user api_usim emm esm ies util secu_cn
                       -Wl,-no-whole-archive
                       ${NETTLE_LIBRARIES} 
                       ${OPENSSL_LIBRARIES} 
                       ${CMAKE_THREAD_LIBS_INIT} m )