From b994255b357477a01e74c4f264a5ce410eb337ba Mon Sep 17 00:00:00 2001 From: Andre Puschmann Date: Thu, 9 Apr 2020 11:20:19 +0200 Subject: [PATCH] enb: fix handling of GTPU and S1AP init return values if the eNB stack startup fails, for example due to binding the wrong GTPU socket or similar issues, the eNB should stop and log a message. Previously the return values for S1AP and GTPU init were not even evaluated. --- srsenb/hdr/stack/upper/gtpu.h | 2 +- srsenb/hdr/stack/upper/s1ap.h | 2 +- srsenb/src/enb.cc | 11 ++++++----- srsenb/src/stack/enb_stack_lte.cc | 22 ++++++++++++++-------- srsenb/src/stack/upper/gtpu.cc | 24 ++++++++++++------------ srsenb/src/stack/upper/s1ap.cc | 10 +++++----- 6 files changed, 39 insertions(+), 32 deletions(-) diff --git a/srsenb/hdr/stack/upper/gtpu.h b/srsenb/hdr/stack/upper/gtpu.h index 2e5591732..e9b6b948d 100644 --- a/srsenb/hdr/stack/upper/gtpu.h +++ b/srsenb/hdr/stack/upper/gtpu.h @@ -39,7 +39,7 @@ class gtpu final : public gtpu_interface_rrc, public gtpu_interface_pdcp public: gtpu(); - bool init(std::string gtp_bind_addr_, + int init(std::string gtp_bind_addr_, std::string mme_addr_, std::string m1u_multiaddr_, std::string m1u_if_addr_, diff --git a/srsenb/hdr/stack/upper/s1ap.h b/srsenb/hdr/stack/upper/s1ap.h index 5f40fb16f..a2adcf9b8 100644 --- a/srsenb/hdr/stack/upper/s1ap.h +++ b/srsenb/hdr/stack/upper/s1ap.h @@ -56,7 +56,7 @@ public: static const uint32_t ts1_reloc_overall_timeout_ms = 10000; s1ap(); - bool init(s1ap_args_t args_, + int init(s1ap_args_t args_, rrc_interface_s1ap* rrc_, srslte::timer_handler* timers_, srsenb::stack_interface_s1ap_lte* stack_); diff --git a/srsenb/src/enb.cc b/srsenb/src/enb.cc index e0b4dc10b..395417cb9 100644 --- a/srsenb/src/enb.cc +++ b/srsenb/src/enb.cc @@ -42,6 +42,7 @@ enb::~enb() int enb::init(const all_args_t& args_, srslte::logger* logger_) { + int ret = SRSLTE_SUCCESS; logger = logger_; // Init UE log @@ -81,17 +82,17 @@ int enb::init(const all_args_t& args_, srslte::logger* logger_) // Init layers if (lte_radio->init(args.rf, lte_phy.get())) { log.console("Error initializing radio.\n"); - return SRSLTE_ERROR; + ret = SRSLTE_ERROR; } if (lte_phy->init(args.phy, phy_cfg, lte_radio.get(), lte_stack.get())) { log.console("Error initializing PHY.\n"); - return SRSLTE_ERROR; + ret = SRSLTE_ERROR; } if (lte_stack->init(args.stack, rrc_cfg, lte_phy.get())) { log.console("Error initializing stack.\n"); - return SRSLTE_ERROR; + ret = SRSLTE_ERROR; } stack = std::move(lte_stack); @@ -101,9 +102,9 @@ int enb::init(const all_args_t& args_, srslte::logger* logger_) log.console("\n==== eNodeB started ===\n"); log.console("Type to view trace\n"); - started = true; + started = (ret == SRSLTE_SUCCESS); - return SRSLTE_SUCCESS; + return ret; } void enb::stop() diff --git a/srsenb/src/stack/enb_stack_lte.cc b/srsenb/src/stack/enb_stack_lte.cc index 81f05d334..0544f5c6a 100644 --- a/srsenb/src/stack/enb_stack_lte.cc +++ b/srsenb/src/stack/enb_stack_lte.cc @@ -107,14 +107,20 @@ int enb_stack_lte::init(const stack_args_t& args_, const rrc_cfg_t& rrc_cfg_) rlc.init(&pdcp, &rrc, &mac, &timers, rlc_log); pdcp.init(&rlc, &rrc, >pu); rrc.init(rrc_cfg, phy, &mac, &rlc, &pdcp, &s1ap, >pu, &timers); - s1ap.init(args.s1ap, &rrc, &timers, this); - gtpu.init(args.s1ap.gtp_bind_addr, - args.s1ap.mme_addr, - args.embms.m1u_multiaddr, - args.embms.m1u_if_addr, - &pdcp, - this, - args.embms.enable); + if (s1ap.init(args.s1ap, &rrc, &timers, this) != SRSLTE_SUCCESS) { + stack_log->error("Couldn't initialize S1AP\n"); + return SRSLTE_ERROR; + } + if (gtpu.init(args.s1ap.gtp_bind_addr, + args.s1ap.mme_addr, + args.embms.m1u_multiaddr, + args.embms.m1u_if_addr, + &pdcp, + this, + args.embms.enable)) { + stack_log->error("Couldn't initialize GTPU\n"); + return SRSLTE_ERROR; + } started = true; start(STACK_MAIN_THREAD_PRIO); diff --git a/srsenb/src/stack/upper/gtpu.cc b/srsenb/src/stack/upper/gtpu.cc index 24e6feb9f..78661529d 100644 --- a/srsenb/src/stack/upper/gtpu.cc +++ b/srsenb/src/stack/upper/gtpu.cc @@ -33,13 +33,13 @@ namespace srsenb { gtpu::gtpu() : m1u(this), gtpu_log("GTPU") {} -bool gtpu::init(std::string gtp_bind_addr_, - std::string mme_addr_, - std::string m1u_multiaddr_, - std::string m1u_if_addr_, - srsenb::pdcp_interface_gtpu* pdcp_, - stack_interface_gtpu_lte* stack_, - bool enable_mbsfn_) +int gtpu::init(std::string gtp_bind_addr_, + std::string mme_addr_, + std::string m1u_multiaddr_, + std::string m1u_if_addr_, + srsenb::pdcp_interface_gtpu* pdcp_, + stack_interface_gtpu_lte* stack_, + bool enable_mbsfn_) { pdcp = pdcp_; gtp_bind_addr = gtp_bind_addr_; @@ -47,13 +47,13 @@ bool gtpu::init(std::string gtp_bind_addr_, pool = byte_buffer_pool::get_instance(); stack = stack_; - char errbuf[128]; + char errbuf[128] = {}; // Set up socket fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { gtpu_log->error("Failed to create socket\n"); - return false; + return SRSLTE_ERROR; } int enable = 1; #if defined(SO_REUSEADDR) @@ -75,7 +75,7 @@ bool gtpu::init(std::string gtp_bind_addr_, snprintf(errbuf, sizeof(errbuf), "%s", strerror(errno)); gtpu_log->error("Failed to bind on address %s, port %d: %s\n", gtp_bind_addr.c_str(), GTPU_PORT, errbuf); gtpu_log->console("Failed to bind on address %s, port %d: %s\n", gtp_bind_addr.c_str(), GTPU_PORT, errbuf); - return false; + return SRSLTE_ERROR; } stack->add_gtpu_s1u_socket_handler(fd); @@ -84,10 +84,10 @@ bool gtpu::init(std::string gtp_bind_addr_, enable_mbsfn = enable_mbsfn_; if (enable_mbsfn) { if (not m1u.init(m1u_multiaddr_, m1u_if_addr_)) { - return false; + return SRSLTE_ERROR; } } - return true; + return SRSLTE_SUCCESS; } void gtpu::stop() diff --git a/srsenb/src/stack/upper/s1ap.cc b/srsenb/src/stack/upper/s1ap.cc index 04d73cd6b..0fe0d0c0a 100644 --- a/srsenb/src/stack/upper/s1ap.cc +++ b/srsenb/src/stack/upper/s1ap.cc @@ -221,10 +221,10 @@ void s1ap::s1_setup_proc_t::then(const srslte::proc_state_t& result) const s1ap::s1ap() : s1setup_proc(this) {} -bool s1ap::init(s1ap_args_t args_, - rrc_interface_s1ap* rrc_, - srslte::timer_handler* timers_, - srsenb::stack_interface_s1ap_lte* stack_) +int s1ap::init(s1ap_args_t args_, + rrc_interface_s1ap* rrc_, + srslte::timer_handler* timers_, + srsenb::stack_interface_s1ap_lte* stack_) { rrc = rrc_; args = args_; @@ -259,7 +259,7 @@ bool s1ap::init(s1ap_args_t args_, s1ap_log->error("Failed to initiate S1Setup procedure.\n"); } - return true; + return SRSLTE_SUCCESS; } void s1ap::stop()