diff --git a/srsue/hdr/stack/ue_stack_base.h b/srsue/hdr/stack/ue_stack_base.h index 2423f2e00..4cea6e6e4 100644 --- a/srsue/hdr/stack/ue_stack_base.h +++ b/srsue/hdr/stack/ue_stack_base.h @@ -68,6 +68,7 @@ typedef struct { usim_args_t usim; rrc_args_t rrc; std::string ue_category_str; + nas_ext_args_t nas_ext; nas_args_t nas; gw_args_t gw; uint32_t sync_queue_size; // Max allowed difference between PHY and Stack clocks (in TTI) diff --git a/srsue/hdr/stack/ue_stack_lte.h b/srsue/hdr/stack/ue_stack_lte.h index b36823d63..92c72b7e6 100644 --- a/srsue/hdr/stack/ue_stack_lte.h +++ b/srsue/hdr/stack/ue_stack_lte.h @@ -37,6 +37,7 @@ #include "srslte/upper/pdcp.h" #include "srslte/upper/rlc.h" #include "upper/nas.h" +#include "upper/nas_ext.h" #include "upper/usim.h" #include "srslte/common/buffer_pool.h" diff --git a/srsue/src/main.cc b/srsue/src/main.cc index fd9495380..07e6a9467 100644 --- a/srsue/src/main.cc +++ b/srsue/src/main.cc @@ -139,6 +139,9 @@ static int parse_args(all_args_t* args, int argc, char* argv[]) ("nas.eia", bpo::value(&args->stack.nas.eia)->default_value("1,2,3"), "List of integrity algorithms included in UE capabilities") ("nas.eea", bpo::value(&args->stack.nas.eea)->default_value("0,1,2,3"), "List of ciphering algorithms included in UE capabilities") + ("extnas.enable", bpo::value(&args->stack.nas_ext.enable)->default_value(false), "Disable the built-in NAS implementation, provide external interface") + ("extnas.sock_path", bpo::value(&args->stack.nas_ext.sock_path)->default_value("/tmp/ue_extnas.sock"), "UNIX socket path of the external interface") + ("pcap.enable", bpo::value(&args->stack.pcap.enable)->default_value(false), "Enable MAC packet captures for wireshark") ("pcap.filename", bpo::value(&args->stack.pcap.filename)->default_value("ue.pcap"), "MAC layer capture filename") ("pcap.nas_enable", bpo::value(&args->stack.pcap.nas_enable)->default_value(false), "Enable NAS packet captures for wireshark") diff --git a/srsue/src/stack/ue_stack_lte.cc b/srsue/src/stack/ue_stack_lte.cc index ed0ff2e08..5421a2951 100644 --- a/srsue/src/stack/ue_stack_lte.cc +++ b/srsue/src/stack/ue_stack_lte.cc @@ -106,9 +106,13 @@ int ue_stack_lte::init(const stack_args_t& args_, srslte::logger* logger_) extif_log->set_hex_limit(args.log.extif_hex_limit); // Should we use the built-in NAS implementation - // TODO: or provide an external interface (RRCTL)? - std::unique_ptr nas_impl(new srsue::nas(&task_sched, args.nas)); - nas = std::move(nas_impl); + if (!args.nas_ext.enable) { + std::unique_ptr nas_impl(new srsue::nas(&task_sched, args.nas)); + nas = std::move(nas_impl); + } else { // ... or provide an external interface (RRCTL)? + std::unique_ptr nas_impl(new srsue::nas_ext(&task_sched, args.nas_ext)); + nas = std::move(nas_impl); + } // Set up pcap if (args.pcap.enable) { diff --git a/srsue/ue.conf.example b/srsue/ue.conf.example index b9890f966..d1c15da18 100644 --- a/srsue/ue.conf.example +++ b/srsue/ue.conf.example @@ -163,6 +163,16 @@ imei = 353490069873319 #eia = 1,2 #eea = 0,1,2 +##################################################################### +# External NAS interface configuration +# +# enable: Disable the built-in NAS implementation, provide external interface +# sock_path: UNIX socket path of the external interface +##################################################################### +[extnas] +#enable = false +#sock_path = /tmp/ue_extnas.sock + ##################################################################### # GW configuration #