From e5a83474cc6a78a504f4a1916e26cbbcba4d2304 Mon Sep 17 00:00:00 2001 From: Pedro Alvarez Date: Thu, 1 Jul 2021 12:34:00 +0100 Subject: [PATCH] Added max_s1_setup retries option to S1AP --- lib/src/common/network_utils.cc | 2 ++ srsenb/hdr/stack/s1ap/s1ap.h | 4 +++- srsenb/src/stack/s1ap/s1ap.cc | 18 ++++++++++++++---- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/src/common/network_utils.cc b/lib/src/common/network_utils.cc index e6dc6a97b..29759d153 100644 --- a/lib/src/common/network_utils.cc +++ b/lib/src/common/network_utils.cc @@ -234,11 +234,13 @@ bool connect_to(int fd, const char* dest_addr_str, int dest_port, sockaddr_in* d if (dest_sockaddr != nullptr) { *dest_sockaddr = sockaddr_tmp; } + if (connect(fd, (const struct sockaddr*)&sockaddr_tmp, sizeof(sockaddr_tmp)) == -1) { srslog::fetch_basic_logger(LOGSERVICE).info("Failed to establish socket connection to %s", dest_addr_str); perror("connect()"); return false; } + return true; } diff --git a/srsenb/hdr/stack/s1ap/s1ap.h b/srsenb/hdr/stack/s1ap/s1ap.h index 79b58a56a..0f37ef5ae 100644 --- a/srsenb/hdr/stack/s1ap/s1ap.h +++ b/srsenb/hdr/stack/s1ap/s1ap.h @@ -122,6 +122,7 @@ private: rrc_interface_s1ap* rrc = nullptr; s1ap_args_t args; srslog::basic_logger& logger; + srslog::log_channel& alarms_channel; srsran::task_sched_handle task_sched; srsran::task_queue_handle mme_task_queue; srsran::socket_manager_itf* rx_socket_handler; @@ -329,8 +330,9 @@ private: srsran::proc_outcome_t init(); srsran::proc_outcome_t step() { return srsran::proc_outcome_t::yield; } srsran::proc_outcome_t react(const s1setupresult& event); - void then(const srsran::proc_state_t& result) const; + void then(const srsran::proc_state_t& result); const char* name() const { return "MME Connection"; } + uint16_t connect_count = 0; private: srsran::proc_outcome_t start_mme_connection(); diff --git a/srsenb/src/stack/s1ap/s1ap.cc b/srsenb/src/stack/s1ap/s1ap.cc index f64b6a2a9..d1af2535d 100644 --- a/srsenb/src/stack/s1ap/s1ap.cc +++ b/srsenb/src/stack/s1ap/s1ap.cc @@ -220,6 +220,7 @@ void s1ap::ue::ho_prep_proc_t::then(const srsran::proc_state_t& result) srsran::proc_outcome_t s1ap::s1_setup_proc_t::init() { procInfo("Starting new MME connection."); + connect_count++; return start_mme_connection(); } @@ -265,7 +266,7 @@ srsran::proc_outcome_t s1ap::s1_setup_proc_t::react(const srsenb::s1ap::s1_setup return srsran::proc_outcome_t::error; } -void s1ap::s1_setup_proc_t::then(const srsran::proc_state_t& result) const +void s1ap::s1_setup_proc_t::then(const srsran::proc_state_t& result) { if (result.is_error()) { procInfo("Failed to initiate S1 connection. Attempting reconnection in %d seconds", @@ -276,7 +277,12 @@ void s1ap::s1_setup_proc_t::then(const srsran::proc_state_t& result) const s1ap_ptr->mme_socket.close(); procInfo("S1AP socket closed."); s1ap_ptr->mme_connect_timer.run(); + if (connect_count > s1ap_ptr->args.max_s1_setup_retries) { + s1ap_ptr->alarms_channel("s1apError"); + } // Try again with in 10 seconds + } else { + connect_count = 0; } } @@ -287,7 +293,11 @@ void s1ap::s1_setup_proc_t::then(const srsran::proc_state_t& result) const s1ap::s1ap(srsran::task_sched_handle task_sched_, srslog::basic_logger& logger, srsran::socket_manager_itf* rx_socket_handler_) : - s1setup_proc(this), logger(logger), task_sched(task_sched_), rx_socket_handler(rx_socket_handler_) + s1setup_proc(this), + logger(logger), + task_sched(task_sched_), + rx_socket_handler(rx_socket_handler_), + alarms_channel(srslog::fetch_log_channel("alarms")) { mme_task_queue = task_sched.make_task_queue(); } @@ -303,7 +313,7 @@ int s1ap::init(const s1ap_args_t& args_, rrc_interface_s1ap* rrc_) mme_connect_timer = task_sched.get_unique_timer(); auto mme_connect_run = [this](uint32_t tid) { if (s1setup_proc.is_busy()) { - logger.error("Failed to initiate S1Setup procedure."); + logger.error("Failed to initiate S1Setup procedure: procedure is busy."); } s1setup_proc.launch(); }; @@ -321,7 +331,7 @@ int s1ap::init(const s1ap_args_t& args_, rrc_interface_s1ap* rrc_) running = true; // starting MME connection if (not s1setup_proc.launch()) { - logger.error("Failed to initiate S1Setup procedure."); + logger.error("Failed to initiate S1Setup procedure: error launching procedure."); } return SRSRAN_SUCCESS;