<p>osmith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc-nat/+/26662">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add bsc_nat fsm<br><br>Create the initial FSM that starts and stops two SS7 instances (one for<br>CN, one for RAN), and binds an sccp user to each.<br><br>Related: OS#2545<br>Depends: libosmocore 0066f1bdcb328e7ffc846b4746e3e1d02afe4be8<br>Change-Id: I7d52fa649c397582b18a1a7dcc40bb407f3b2c97<br>---<br>M doc/examples/osmo-bsc-nat/osmo-bsc-nat.cfg<br>M include/osmocom/bsc_nat/Makefile.am<br>M include/osmocom/bsc_nat/bsc_nat.h<br>A include/osmocom/bsc_nat/bsc_nat_fsm.h<br>M src/osmo-bsc-nat/Makefile.am<br>M src/osmo-bsc-nat/bsc_nat.c<br>A src/osmo-bsc-nat/bsc_nat_fsm.c<br>M src/osmo-bsc-nat/main.c<br>M src/osmo-bsc-nat/vty.c<br>9 files changed, 339 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc-nat refs/changes/62/26662/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/examples/osmo-bsc-nat/osmo-bsc-nat.cfg b/doc/examples/osmo-bsc-nat/osmo-bsc-nat.cfg</span><br><span>index e69de29..65ce821 100644</span><br><span>--- a/doc/examples/osmo-bsc-nat/osmo-bsc-nat.cfg</span><br><span>+++ b/doc/examples/osmo-bsc-nat/osmo-bsc-nat.cfg</span><br><span>@@ -0,0 +1,16 @@</span><br><span style="color: hsl(120, 100%, 40%);">+cs7 instance 0</span><br><span style="color: hsl(120, 100%, 40%);">+ point-code 0.23.3</span><br><span style="color: hsl(120, 100%, 40%);">+ asp asp-clnt-OsmoBSCNAT-CN 2905 0 m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip 127.0.0.3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+cs7 instance 1</span><br><span style="color: hsl(120, 100%, 40%);">+ point-code 0.23.1</span><br><span style="color: hsl(120, 100%, 40%);">+ asp asp-clnt-OsmoBSCNAT-RAN 2905 0 m3ua</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 127.0.0.2</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip 127.0.0.4</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bsc-nat</span><br><span style="color: hsl(120, 100%, 40%);">+ cs7-instance-cn 0</span><br><span style="color: hsl(120, 100%, 40%);">+ cs7-instance-ran 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/include/osmocom/bsc_nat/Makefile.am b/include/osmocom/bsc_nat/Makefile.am</span><br><span>index f573dd9..90f44a7 100644</span><br><span>--- a/include/osmocom/bsc_nat/Makefile.am</span><br><span>+++ b/include/osmocom/bsc_nat/Makefile.am</span><br><span>@@ -1,5 +1,6 @@</span><br><span> noinst_HEADERS = \</span><br><span>      bsc_nat.h \</span><br><span style="color: hsl(120, 100%, 40%);">+   bsc_nat_fsm.h \</span><br><span>      logging.h \</span><br><span>  vty.h \</span><br><span>      $(NULL)</span><br><span>diff --git a/include/osmocom/bsc_nat/bsc_nat.h b/include/osmocom/bsc_nat/bsc_nat.h</span><br><span>index 511d5a4..d1a046e 100644</span><br><span>--- a/include/osmocom/bsc_nat/bsc_nat.h</span><br><span>+++ b/include/osmocom/bsc_nat/bsc_nat.h</span><br><span>@@ -18,7 +18,22 @@</span><br><span>  */</span><br><span> #pragma once</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/sccp_sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct bsc_nat_ss7_inst {</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t ss7_id;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_sccp_addr local_sccp_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_sccp_user *scu;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct bsc_nat {</span><br><span style="color: hsl(120, 100%, 40%);">+ bool shutdown;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_fsm_inst *fi;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   struct bsc_nat_ss7_inst *cn;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct bsc_nat_ss7_inst *ran;</span><br><span> };</span><br><span> </span><br><span> struct bsc_nat *bsc_nat_alloc(void *tall_ctx);</span><br><span>diff --git a/include/osmocom/bsc_nat/bsc_nat_fsm.h b/include/osmocom/bsc_nat/bsc_nat_fsm.h</span><br><span>new file mode 100644</span><br><span>index 0000000..252fd67</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/bsc_nat/bsc_nat_fsm.h</span><br><span>@@ -0,0 +1,36 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Oliver Smith <osmith@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/lienses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum bsc_nat_fsm_states {</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_NAT_FSM_ST_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_NAT_FSM_ST_STARTING,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_NAT_FSM_ST_STARTED,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_NAT_FSM_ST_STOPPING,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum bsc_nat_fsm_events {</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_NAT_FSM_EV_START,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSC_NAT_FSM_EV_STOP,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct osmo_fsm bsc_nat_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_nat_start(struct bsc_nat *bsc_nat);</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_nat_stop(struct bsc_nat *bsc_nat, bool exit_proc);</span><br><span>diff --git a/src/osmo-bsc-nat/Makefile.am b/src/osmo-bsc-nat/Makefile.am</span><br><span>index 9aa9524..6a759cb 100644</span><br><span>--- a/src/osmo-bsc-nat/Makefile.am</span><br><span>+++ b/src/osmo-bsc-nat/Makefile.am</span><br><span>@@ -26,6 +26,7 @@</span><br><span> </span><br><span> osmo_bsc_nat_SOURCES = \</span><br><span>        bsc_nat.c \</span><br><span style="color: hsl(120, 100%, 40%);">+   bsc_nat_fsm.c \</span><br><span>      logging.c \</span><br><span>  main.c \</span><br><span>     vty.c \</span><br><span>diff --git a/src/osmo-bsc-nat/bsc_nat.c b/src/osmo-bsc-nat/bsc_nat.c</span><br><span>index 149e7cb..e911c0f 100644</span><br><span>--- a/src/osmo-bsc-nat/bsc_nat.c</span><br><span>+++ b/src/osmo-bsc-nat/bsc_nat.c</span><br><span>@@ -21,6 +21,7 @@</span><br><span> </span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/bsc_nat/bsc_nat.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc_nat/bsc_nat_fsm.h></span><br><span> </span><br><span> struct bsc_nat *bsc_nat_alloc(void *tall_ctx)</span><br><span> {</span><br><span>@@ -29,10 +30,25 @@</span><br><span>         bsc_nat = talloc_zero(tall_ctx, struct bsc_nat);</span><br><span>     OSMO_ASSERT(bsc_nat);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     bsc_nat->cn = talloc_zero(bsc_nat, struct bsc_nat_ss7_inst);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(bsc_nat->cn);</span><br><span style="color: hsl(120, 100%, 40%);">+  talloc_set_name_const(bsc_nat->cn, "struct bsc_nat_ss7_inst (CN)");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    bsc_nat->ran = talloc_zero(bsc_nat, struct bsc_nat_ss7_inst);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(bsc_nat->ran);</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_set_name_const(bsc_nat->ran, "struct bsc_nat_ss7_inst (RAN)");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc_nat->fi = osmo_fsm_inst_alloc(&bsc_nat_fsm, bsc_nat, bsc_nat, LOGL_INFO, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         return bsc_nat;</span><br><span> }</span><br><span> </span><br><span> void bsc_nat_free(struct bsc_nat *bsc_nat)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (bsc_nat->fi) {</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_fsm_inst_free(bsc_nat->fi);</span><br><span style="color: hsl(120, 100%, 40%);">+           bsc_nat->fi = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  talloc_free(bsc_nat);</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc-nat/bsc_nat_fsm.c b/src/osmo-bsc-nat/bsc_nat_fsm.c</span><br><span>new file mode 100644</span><br><span>index 0000000..bfaa7f7</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-bsc-nat/bsc_nat_fsm.c</span><br><span>@@ -0,0 +1,213 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Oliver Smith <osmith@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/lienses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "config.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/select.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/osmo_ss7.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc_nat/bsc_nat.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc_nat/bsc_nat_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc_nat/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define X(s) (1 << (s))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_PC_RAN "0.23.1" /* same as default for OsmoMSC */</span><br><span style="color: hsl(120, 100%, 40%);">+#define DEFAULT_PC_CN "0.23.3" /* same as default for OsmoBSC */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_stopped(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case BSC_NAT_FSM_EV_START:</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_fsm_inst_state_chg(fi, BSC_NAT_FSM_ST_STARTING, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_stopped_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct bsc_nat *bsc_nat = (struct bsc_nat *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (bsc_nat->shutdown) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPFSML(fi, LOGL_NOTICE, "Shutting down\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_select_shutdown_request();</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int sccp_sap_up(struct osmo_prim_hdr *oph, void *priv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DMAIN, LOGL_NOTICE, "STUB: sccp_sap_up() called\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int ss7_inst_init(struct bsc_nat_ss7_inst *inst, const char *name, const char *default_pc_str,</span><br><span style="color: hsl(120, 100%, 40%);">+                  enum osmo_sccp_ssn ssn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int default_pc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_sccp_instance *sccp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    default_pc = osmo_ss7_pointcode_parse(NULL, default_pc_str);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(default_pc >= 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    sccp = osmo_sccp_simple_client_on_ss7_id(inst, inst->ss7_id, name, default_pc, OSMO_SS7_ASP_PROT_M3UA, 0, NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             0, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!sccp) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DMAIN, LOGL_ERROR, "%s: failed to request sccp client instance for sccp user\n", name);</span><br><span style="color: hsl(120, 100%, 40%);">+                return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_sccp_local_addr_by_instance(&inst->local_sccp_addr, sccp, ssn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ inst->scu = osmo_sccp_user_bind(sccp, name, sccp_sap_up, ssn);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!inst->scu) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DMAIN, LOGL_ERROR, "%s: failed to bind sccp user\n", name);</span><br><span style="color: hsl(120, 100%, 40%);">+            return -2;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_sccp_user_set_priv(inst->scu, inst);</span><br><span style="color: hsl(120, 100%, 40%);">+  return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void ss7_inst_free(struct bsc_nat_ss7_inst *inst)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   if (inst->scu) {</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_sccp_user_unbind(inst->scu);</span><br><span style="color: hsl(120, 100%, 40%);">+          inst->scu = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_ss7_instance *ss7 = osmo_ss7_instance_find(inst->ss7_id);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (ss7)</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_ss7_instance_destroy(ss7);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_starting_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct bsc_nat *bsc_nat = (struct bsc_nat *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ss7_inst_init(bsc_nat->cn, "OsmoBSCNAT-CN", DEFAULT_PC_CN, OSMO_SCCP_SSN_RANAP) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_fsm_inst_state_chg(fi, BSC_NAT_FSM_ST_STOPPING, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ss7_inst_init(bsc_nat->ran, "OsmoBSCNAT-RAN", DEFAULT_PC_RAN, OSMO_SCCP_SSN_MSC) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_fsm_inst_state_chg(fi, BSC_NAT_FSM_ST_STOPPING, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_fsm_inst_state_chg(fi, BSC_NAT_FSM_ST_STARTED, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_started(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case BSC_NAT_FSM_EV_STOP:</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_fsm_inst_state_chg(fi, BSC_NAT_FSM_ST_STOPPING, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_stopping_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct bsc_nat *bsc_nat = (struct bsc_nat *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ss7_inst_free(bsc_nat->cn);</span><br><span style="color: hsl(120, 100%, 40%);">+        ss7_inst_free(bsc_nat->ran);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_fsm_inst_state_chg(fi, BSC_NAT_FSM_ST_STOPPED, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_fsm_state bsc_nat_fsm_states[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        [BSC_NAT_FSM_ST_STOPPED] = {</span><br><span style="color: hsl(120, 100%, 40%);">+          .name = "STOPPED",</span><br><span style="color: hsl(120, 100%, 40%);">+          .in_event_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(BSC_NAT_FSM_EV_START),</span><br><span style="color: hsl(120, 100%, 40%);">+              .out_state_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                     X(BSC_NAT_FSM_ST_STARTING),</span><br><span style="color: hsl(120, 100%, 40%);">+           .action = st_stopped,</span><br><span style="color: hsl(120, 100%, 40%);">+         .onenter = st_stopped_on_enter,</span><br><span style="color: hsl(120, 100%, 40%);">+       },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BSC_NAT_FSM_ST_STARTING] = {</span><br><span style="color: hsl(120, 100%, 40%);">+         .name = "STARTING",</span><br><span style="color: hsl(120, 100%, 40%);">+         .out_state_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                     X(BSC_NAT_FSM_ST_STARTED) |</span><br><span style="color: hsl(120, 100%, 40%);">+                   X(BSC_NAT_FSM_ST_STOPPING),</span><br><span style="color: hsl(120, 100%, 40%);">+           .onenter = st_starting_on_enter,</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BSC_NAT_FSM_ST_STARTED] = {</span><br><span style="color: hsl(120, 100%, 40%);">+          .name = "STARTED",</span><br><span style="color: hsl(120, 100%, 40%);">+          .in_event_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(BSC_NAT_FSM_EV_STOP),</span><br><span style="color: hsl(120, 100%, 40%);">+               .out_state_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                     X(BSC_NAT_FSM_ST_STOPPING),</span><br><span style="color: hsl(120, 100%, 40%);">+           .action = st_started,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BSC_NAT_FSM_ST_STOPPING] = {</span><br><span style="color: hsl(120, 100%, 40%);">+         .name = "STOPPING",</span><br><span style="color: hsl(120, 100%, 40%);">+         .out_state_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                     X(BSC_NAT_FSM_ST_STOPPED),</span><br><span style="color: hsl(120, 100%, 40%);">+            .onenter = st_stopping_on_enter,</span><br><span style="color: hsl(120, 100%, 40%);">+      },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const struct value_string bsc_nat_fsm_event_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_VALUE_STRING(BSC_NAT_FSM_EV_START),</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_VALUE_STRING(BSC_NAT_FSM_EV_STOP),</span><br><span style="color: hsl(120, 100%, 40%);">+       { 0, NULL }</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_nat_fsm_timer_cb(struct osmo_fsm_inst *fi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (fi->state) {</span><br><span style="color: hsl(120, 100%, 40%);">+       default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(false);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_fsm bsc_nat_fsm = {</span><br><span style="color: hsl(120, 100%, 40%);">+       .name = "BSC_NAT",</span><br><span style="color: hsl(120, 100%, 40%);">+  .states = bsc_nat_fsm_states,</span><br><span style="color: hsl(120, 100%, 40%);">+ .num_states = ARRAY_SIZE(bsc_nat_fsm_states),</span><br><span style="color: hsl(120, 100%, 40%);">+ .timer_cb = bsc_nat_fsm_timer_cb,</span><br><span style="color: hsl(120, 100%, 40%);">+     .log_subsys = DMAIN,</span><br><span style="color: hsl(120, 100%, 40%);">+  .event_names = bsc_nat_fsm_event_names,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static __attribute__((constructor)) void bsc_nat_fsm_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(osmo_fsm_register(&bsc_nat_fsm) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_nat_start(struct bsc_nat *bsc_nat)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_fsm_inst_dispatch(bsc_nat->fi, BSC_NAT_FSM_EV_START, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void bsc_nat_stop(struct bsc_nat *bsc_nat, bool exit_proc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       if (exit_proc)</span><br><span style="color: hsl(120, 100%, 40%);">+                bsc_nat->shutdown = true;</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_fsm_inst_dispatch(bsc_nat->fi, BSC_NAT_FSM_EV_STOP, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bsc-nat/main.c b/src/osmo-bsc-nat/main.c</span><br><span>index a37d3cb..d1e32a9 100644</span><br><span>--- a/src/osmo-bsc-nat/main.c</span><br><span>+++ b/src/osmo-bsc-nat/main.c</span><br><span>@@ -22,6 +22,8 @@</span><br><span> #include <getopt.h></span><br><span> </span><br><span> #include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/osmo_ss7.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sigtran/sccp_sap.h></span><br><span> #include <osmocom/vty/cpu_sched_vty.h></span><br><span> #include <osmocom/vty/logging.h></span><br><span> #include <osmocom/vty/misc.h></span><br><span>@@ -29,6 +31,7 @@</span><br><span> #include <osmocom/vty/telnet_interface.h></span><br><span> </span><br><span> #include <osmocom/bsc_nat/bsc_nat.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc_nat/bsc_nat_fsm.h></span><br><span> #include <osmocom/bsc_nat/logging.h></span><br><span> #include <osmocom/bsc_nat/vty.h></span><br><span> </span><br><span>@@ -113,7 +116,10 @@</span><br><span> </span><br><span>        logging_vty_add_cmds();</span><br><span>      osmo_talloc_vty_add_cmds();</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_fsm_vty_add_cmds();</span><br><span>     osmo_cpu_sched_vty_init(tall_bsc_nat_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_ss7_vty_init_asp(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_sccp_vty_init();</span><br><span> </span><br><span>    handle_options(argc, argv);</span><br><span> </span><br><span>@@ -139,9 +145,9 @@</span><br><span>        case SIGINT:</span><br><span>         case SIGTERM:</span><br><span>                /* If SIGTERM was already sent before, just terminate immediately. */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (osmo_select_shutdown_requested())</span><br><span style="color: hsl(120, 100%, 40%);">+         if (g_bsc_nat->shutdown)</span><br><span>                  exit(-1);</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_select_shutdown_request();</span><br><span style="color: hsl(120, 100%, 40%);">+               bsc_nat_stop(g_bsc_nat, true);</span><br><span>               break;</span><br><span>       case SIGABRT:</span><br><span>                /* in case of abort, we want to obtain a talloc report and</span><br><span>@@ -185,14 +191,23 @@</span><br><span>   if (rc < 0)</span><br><span>               exit(1);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  rc = osmo_ss7_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   g_bsc_nat = bsc_nat_alloc(tall_bsc_nat_ctx);</span><br><span> </span><br><span>     main_vty_init(argc, argv);</span><br><span>   signal_handler_init();</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    bsc_nat_start(g_bsc_nat);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  while (!osmo_select_shutdown_done())</span><br><span>                 osmo_select_main_ctx(0);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  talloc_report_full(g_bsc_nat, stderr);</span><br><span style="color: hsl(120, 100%, 40%);">+        bsc_nat_free(g_bsc_nat);</span><br><span style="color: hsl(120, 100%, 40%);">+      log_fini();</span><br><span>  talloc_report_full(tall_bsc_nat_ctx, stderr);</span><br><span>        talloc_free(tall_bsc_nat_ctx);</span><br><span>       talloc_free(tall_vty_ctx);</span><br><span>diff --git a/src/osmo-bsc-nat/vty.c b/src/osmo-bsc-nat/vty.c</span><br><span>index 089d27b..128940e 100644</span><br><span>--- a/src/osmo-bsc-nat/vty.c</span><br><span>+++ b/src/osmo-bsc-nat/vty.c</span><br><span>@@ -68,12 +68,36 @@</span><br><span> static int config_write_bsc_nat(struct vty *vty)</span><br><span> {</span><br><span>       vty_out(vty, "bsc-nat%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, " cs7-instance-cn %u%s", g_bsc_nat->cn->ss7_id, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+    vty_out(vty, " cs7-instance-ran %u%s", g_bsc_nat->ran->ss7_id, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define SS7_REF_STR "SS7 instance reference number\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_cs7_instance_cn,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_cs7_instance_cn_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "cs7-instance-cn <0-15>",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Set SS7 to be used to connect to CN-side\n" SS7_REF_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    g_bsc_nat->cn->ss7_id = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+  return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_cs7_instance_ran,</span><br><span style="color: hsl(120, 100%, 40%);">+      cfg_cs7_instance_ran_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "cs7-instance-ran <0-15>",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Set SS7 to be used to connect to RAN-side\n" SS7_REF_STR)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       g_bsc_nat->ran->ss7_id = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> void bsc_nat_vty_init(void)</span><br><span> {</span><br><span>       install_element(CONFIG_NODE, &cfg_bsc_nat_cmd);</span><br><span>  install_node(&bsc_nat_node, config_write_bsc_nat);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(BSC_NAT_NODE, &cfg_cs7_instance_cn_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(BSC_NAT_NODE, &cfg_cs7_instance_ran_cmd);</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc-nat/+/26662">change 26662</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bsc-nat/+/26662"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc-nat </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I7d52fa649c397582b18a1a7dcc40bb407f3b2c97 </div>
<div style="display:none"> Gerrit-Change-Number: 26662 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>