<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19864">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  fixeria: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">CBSP: rewrite the CBSP link setup and 'cbc' VTY section<br><br>Firstly, make CBSP server and client mutually exclusive: Do not allow osmo-bsc<br>to be configured as CBC client *and* CBC server at the same time.<br>cbsp_link.c expects at most one CBSP link to be established, and, upon sending<br>CBSP messages, probes whether to send the message to a CBSP server or client<br>link. When both listen-port and remote-ip are configured (regardless of an<br>actual CBSP connection), osmo-bsc gets confused about where to send CBSP<br>messages.<br><br>One solution would be more accurate probing for an actual established TCP<br>connection. But the simpler and less confusing solution is to force the user to<br>configure only server or only client mode, never both.<br><br>Introduce 'cbc' / 'mode (server|client|disabled)'.<br><br>Secondly, clarify the 'cbc' config structure into distinct 'server' and<br>'client' subnodes. Refactor the 'cbc' VTY node in such a way that the IP<br>addresses for server and client mode can remain configured when the CBSP link<br>is switched between server/client/disabled modes.<br><br>To implement the above, switch the struct bsc_cbc_link to use osmo_sockaddr_str<br>for address configuration.<br><br>Related: OS#4702<br>Related: I7eea0dd39de50ed80af79e0f10c836b8685d8644 (osmo-ttcn3-hacks)<br>Related: I9e9760121265b3661f1c179610e975cf7a0873f1 (docker-playground)<br>Change-Id: Icaa2775cc20a99227dabe38a775ff808b374cf98<br>---<br>M include/osmocom/bsc/smscb.h<br>M include/osmocom/bsc/vty.h<br>M src/osmo-bsc/bsc_init.c<br>M src/osmo-bsc/cbsp_link.c<br>A tests/cbc.vty<br>5 files changed, 358 insertions(+), 110 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/smscb.h b/include/osmocom/bsc/smscb.h</span><br><span>index 22a258d..c7002f6 100644</span><br><span>--- a/include/osmocom/bsc/smscb.h</span><br><span>+++ b/include/osmocom/bsc/smscb.h</span><br><span>@@ -2,6 +2,7 @@</span><br><span> #include <osmocom/bsc/gsm_data.h></span><br><span> </span><br><span> #include <osmocom/core/msgb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/sockaddr_str.h></span><br><span> #include <osmocom/netif/stream.h></span><br><span> #include <osmocom/gsm/cbsp.h></span><br><span> </span><br><span>@@ -27,21 +28,25 @@</span><br><span>                          uint8_t slot_count);</span><br><span> void bts_cbch_timer_schedule(struct gsm_bts *bts);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum bsc_cbc_link_mode {</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_CBC_LINK_MODE_DISABLED = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_CBC_LINK_MODE_SERVER,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_CBC_LINK_MODE_CLIENT,</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 const struct value_string bsc_cbc_link_mode_names[];</span><br><span style="color: hsl(120, 100%, 40%);">+static inline const char *bsc_cbc_link_mode_name(enum bsc_cbc_link_mode val)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return get_value_string(bsc_cbc_link_mode_names, val); }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct osmo_sockaddr_str bsc_cbc_default_server_local_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* cbsp_link.c */</span><br><span> struct bsc_cbc_link {</span><br><span>   struct gsm_network *net;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* hostname/IP of CBC */</span><br><span style="color: hsl(0, 100%, 40%);">-                char *cbc_hostname;</span><br><span style="color: hsl(0, 100%, 40%);">-             /* TCP port (Default: 48049) of CBC */</span><br><span style="color: hsl(0, 100%, 40%);">-          int cbc_port;</span><br><span style="color: hsl(0, 100%, 40%);">-           /* local listening port (0 for disabling local server) */</span><br><span style="color: hsl(0, 100%, 40%);">-               int listen_port;</span><br><span style="color: hsl(0, 100%, 40%);">-                /* local listening hostname/IP */</span><br><span style="color: hsl(0, 100%, 40%);">-               char *listen_hostname;</span><br><span style="color: hsl(0, 100%, 40%);">-  } config;</span><br><span style="color: hsl(120, 100%, 40%);">+     enum bsc_cbc_link_mode mode;</span><br><span>         /* for handling inbound TCP connections */</span><br><span>   struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct osmo_sockaddr_str local_addr;</span><br><span>                 struct osmo_stream_srv *srv;</span><br><span>                 struct osmo_stream_srv_link *link;</span><br><span>           char *sock_name;</span><br><span>@@ -49,6 +54,7 @@</span><br><span>         } server;</span><br><span>    /* for handling outbound TCP connections */</span><br><span>  struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct osmo_sockaddr_str remote_addr;</span><br><span>                struct osmo_stream_cli *cli;</span><br><span>                 char *sock_name;</span><br><span>             struct msgb *msg;</span><br><span>diff --git a/include/osmocom/bsc/vty.h b/include/osmocom/bsc/vty.h</span><br><span>index 10ce16b..ba44f5e 100644</span><br><span>--- a/include/osmocom/bsc/vty.h</span><br><span>+++ b/include/osmocom/bsc/vty.h</span><br><span>@@ -25,6 +25,8 @@</span><br><span>       OM2K_CON_GROUP_NODE,</span><br><span>         BSC_NODE,</span><br><span>    CBC_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+     CBC_SERVER_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+      CBC_CLIENT_NODE,</span><br><span> };</span><br><span> </span><br><span> struct log_info;</span><br><span>diff --git a/src/osmo-bsc/bsc_init.c b/src/osmo-bsc/bsc_init.c</span><br><span>index 22eba50..e722199 100644</span><br><span>--- a/src/osmo-bsc/bsc_init.c</span><br><span>+++ b/src/osmo-bsc/bsc_init.c</span><br><span>@@ -129,11 +129,11 @@</span><br><span>      osmo_timer_schedule(&net->t3122_chan_load_timer, T3122_CHAN_LOAD_SAMPLE_INTERVAL, 0);</span><br><span> </span><br><span>     net->cbc->net = net;</span><br><span style="color: hsl(0, 100%, 40%);">-      /* no cbc_hostname: client not started by default */</span><br><span style="color: hsl(0, 100%, 40%);">-    net->cbc->config.cbc_port = CBSP_TCP_PORT;</span><br><span style="color: hsl(0, 100%, 40%);">-        /* listen_port == -1: server not started by default */</span><br><span style="color: hsl(0, 100%, 40%);">-  net->cbc->config.listen_port = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-        net->cbc->config.listen_hostname = talloc_strdup(net->cbc, "127.0.0.1");</span><br><span style="color: hsl(120, 100%, 40%);">+   net->cbc->mode = BSC_CBC_LINK_MODE_DISABLED;</span><br><span style="color: hsl(120, 100%, 40%);">+    net->cbc->server.local_addr = bsc_cbc_default_server_local_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* For CBSP client mode: default remote CBSP server port is CBSP_TCP_PORT == 48049. Leave the IP address unset.</span><br><span style="color: hsl(120, 100%, 40%);">+        * Also leave the local bind for the CBSP client disabled (unconfigured). */</span><br><span style="color: hsl(120, 100%, 40%);">+  net->cbc->client.remote_addr = (struct osmo_sockaddr_str){ .port = CBSP_TCP_PORT, };</span><br><span> </span><br><span>       return net;</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/cbsp_link.c b/src/osmo-bsc/cbsp_link.c</span><br><span>index d93bd1a..d587675 100644</span><br><span>--- a/src/osmo-bsc/cbsp_link.c</span><br><span>+++ b/src/osmo-bsc/cbsp_link.c</span><br><span>@@ -35,6 +35,19 @@</span><br><span>  * TCP port, we expect the CBC to connect to us.  If neither of the two is configured,</span><br><span>  * CBSP is effectively disabled */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+const struct value_string bsc_cbc_link_mode_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        { BSC_CBC_LINK_MODE_DISABLED, "disabled" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { BSC_CBC_LINK_MODE_SERVER, "server" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { BSC_CBC_LINK_MODE_CLIENT, "client" },</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 osmo_sockaddr_str bsc_cbc_default_server_local_addr = {</span><br><span style="color: hsl(120, 100%, 40%);">+        .af = AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+        .ip = "127.0.0.1",</span><br><span style="color: hsl(120, 100%, 40%);">+  .port = CBSP_TCP_PORT,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*********************************************************************************</span><br><span>  * CBSP Server (inbound TCP connection from CBC)</span><br><span>  *********************************************************************************/</span><br><span>@@ -195,7 +208,7 @@</span><br><span>  struct bsc_cbc_link *cbc = bsc_gsmnet->cbc;</span><br><span> </span><br><span>   /* shut down client, if no longer configured */</span><br><span style="color: hsl(0, 100%, 40%);">- if (cbc->client.cli && !cbc->config.cbc_hostname) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (cbc->client.cli && cbc->mode != BSC_CBC_LINK_MODE_CLIENT) {</span><br><span>                LOGP(DCBS, LOGL_NOTICE, "Stopping CBSP client\n");</span><br><span>                 osmo_stream_cli_close(cbc->client.cli);</span><br><span>           osmo_stream_cli_destroy(cbc->client.cli);</span><br><span>@@ -203,7 +216,7 @@</span><br><span>   }</span><br><span> </span><br><span>        /* shut down server, if no longer configured */</span><br><span style="color: hsl(0, 100%, 40%);">- if (cbc->config.listen_port == -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (cbc->mode != BSC_CBC_LINK_MODE_SERVER) {</span><br><span>              if (cbc->server.srv || cbc->server.link)</span><br><span>                       LOGP(DCBS, LOGL_NOTICE, "Stopping CBSP server\n");</span><br><span>                 if (cbc->server.srv) {</span><br><span>@@ -217,10 +230,16 @@</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* start client, if configured */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (cbc->config.cbc_hostname) {</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGP(DCBS, LOGL_NOTICE, "Starting CBSP Client (to CBC at %s:%u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                   cbc->config.cbc_hostname, cbc->config.cbc_port);</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (cbc->mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case BSC_CBC_LINK_MODE_CLIENT:</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!osmo_sockaddr_str_is_nonzero(&cbc->client.remote_addr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOGP(DCBS, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                             "Cannot start CBSP in client mode: invalid remote-ip or -port in 'cbc' / 'client')\n");</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%);">+           LOGP(DCBS, LOGL_NOTICE, "Starting CBSP Client (to CBC at " OSMO_SOCKADDR_STR_FMT ")\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                OSMO_SOCKADDR_STR_FMT_ARGS(&cbc->client.remote_addr));</span><br><span>           if (!cbc->client.cli) {</span><br><span>                   cbc->client.cli = osmo_stream_cli_create(cbc);</span><br><span>                    osmo_stream_cli_set_data(cbc->client.cli, cbc);</span><br><span>@@ -229,32 +248,44 @@</span><br><span>                   osmo_stream_cli_set_read_cb(cbc->client.cli, cbsp_client_read_cb);</span><br><span>                }</span><br><span>            /* CBC side */</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_stream_cli_set_addr(cbc->client.cli, cbc->config.cbc_hostname);</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_stream_cli_set_port(cbc->client.cli, cbc->config.cbc_port);</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_stream_cli_set_addr(cbc->client.cli, cbc->client.remote_addr.ip);</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_stream_cli_set_port(cbc->client.cli, cbc->client.remote_addr.port);</span><br><span>               /* Close/Reconnect? */</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_stream_cli_open(cbc->client.cli);</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (osmo_stream_cli_open(cbc->client.cli) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOGP(DCBS, LOGL_ERROR, "Cannot open CBSP client link to " OSMO_SOCKADDR_STR_FMT "\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                          OSMO_SOCKADDR_STR_FMT_ARGS(&cbc->client.remote_addr));</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%);">+             return 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* start server, if configured */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (cbc->config.listen_port != -1) {</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGP(DCBS, LOGL_NOTICE, "Starting CBSP Server (bound to %s:%u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                    cbc->config.listen_hostname, cbc->config.listen_port);</span><br><span style="color: hsl(120, 100%, 40%);">+  case BSC_CBC_LINK_MODE_SERVER:</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!osmo_sockaddr_str_is_set(&cbc->server.local_addr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGP(DCBS, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                             "Cannot start CBSP in server mode: invalid local-ip or -port in 'cbc' / 'server')\n");</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%);">+             LOGP(DCBS, LOGL_NOTICE, "Starting CBSP Server (listening at " OSMO_SOCKADDR_STR_FMT ")\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     OSMO_SOCKADDR_STR_FMT_ARGS(&cbc->server.local_addr));</span><br><span>            if (!cbc->server.link) {</span><br><span>                  LOGP(DCBS, LOGL_NOTICE, "Creating CBSP Server\n");</span><br><span>                         cbc->server.link = osmo_stream_srv_link_create(cbc);</span><br><span>                      osmo_stream_srv_link_set_data(cbc->server.link, cbc);</span><br><span>                     osmo_stream_srv_link_set_accept_cb(cbc->server.link, cbsp_srv_link_accept_cb);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_stream_srv_link_set_addr(cbc->server.link, cbc->config.listen_hostname);</span><br><span style="color: hsl(0, 100%, 40%);">-                     osmo_stream_srv_link_set_port(cbc->server.link, cbc->config.listen_port);</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_stream_srv_link_set_addr(cbc->server.link, cbc->server.local_addr.ip);</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_stream_srv_link_set_port(cbc->server.link, cbc->server.local_addr.port);</span><br><span> </span><br><span>                      if (osmo_stream_srv_link_open(cbc->server.link) < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                            LOGP(DCBS, LOGL_ERROR, "Cannot open CBSP Server link on %s:%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                  cbc->config.listen_hostname, cbc->config.listen_port);</span><br><span style="color: hsl(120, 100%, 40%);">+                             LOGP(DCBS, LOGL_ERROR, "Cannot open CBSP Server link at " OSMO_SOCKADDR_STR_FMT ")\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 OSMO_SOCKADDR_STR_FMT_ARGS(&cbc->server.local_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+                             return -1;</span><br><span>                   }</span><br><span>            }</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%);">+   default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return 0;</span><br><span>    }</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span> }</span><br><span> </span><br><span> /*! Encode + Transmit a 'decoded' CBSP message over given CBC link</span><br><span>@@ -301,60 +332,71 @@</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_cbc_remote_ip, cfg_cbc_remote_ip_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-     "remote-ip A.B.C.D",</span><br><span style="color: hsl(0, 100%, 40%);">-  "IP Address of the Cell Broadcast Centre\n"</span><br><span style="color: hsl(0, 100%, 40%);">-   "IP Address of the Cell Broadcast Centre\n")</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_cbc_mode, cfg_cbc_mode_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "mode (server|client|disabled)",</span><br><span style="color: hsl(120, 100%, 40%);">+    "Set OsmoBSC as CBSP server or client\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "CBSP Server: listen for inbound TCP connections from a remote Cell Broadcast Centre\n"</span><br><span style="color: hsl(120, 100%, 40%);">+     "CBSP Client: establish outbound TCP connection to a remote Cell Broadcast Centre\n"</span><br><span style="color: hsl(120, 100%, 40%);">+        "Disable CBSP link\n")</span><br><span> {</span><br><span>        struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_talloc_replace_string(cbc, &cbc->config.cbc_hostname, argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-     return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_cbc_no_remote_ip, cfg_cbc_no_remote_ip_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-       "no remote-ip",</span><br><span style="color: hsl(0, 100%, 40%);">-       NO_STR "Remove IP address of CBC; disables outbound CBSP connections\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-   talloc_free(cbc->config.cbc_hostname);</span><br><span style="color: hsl(0, 100%, 40%);">-       cbc->config.cbc_hostname = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+   cbc->mode = get_string_value(bsc_cbc_link_mode_names, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(cbc->mode >= 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    bsc_cbc_link_restart();</span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_cbc_remote_port, cfg_cbc_remote_port_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_cbc_server, cfg_cbc_server_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+    "server", "Configure OsmoBSC's CBSP server role\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        vty->node = CBC_SERVER_NODE;</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_cbc_server_local_ip, cfg_cbc_server_local_ip_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "local-ip " VTY_IPV46_CMD,</span><br><span style="color: hsl(120, 100%, 40%);">+  "Set IP Address to listen on for inbound CBSP from a Cell Broadcast Centre\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "IPv4 address\n" "IPv6 address\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_sockaddr_str_from_str(&cbc->server.local_addr, argv[0], cbc->server.local_addr.port);</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_cbc_server_local_port, cfg_cbc_server_local_port_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+     "local-port <1-65535>",</span><br><span style="color: hsl(120, 100%, 40%);">+       "Set TCP port to listen on for inbound CBSP from a Cell Broadcast Centre\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "CBSP port number (Default: " OSMO_STRINGIFY_VAL(CBSP_TCP_PORT) ")\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span style="color: hsl(120, 100%, 40%);">+ cbc->server.local_addr.port = 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_cbc_client, cfg_cbc_client_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+   "client", "Configure OsmoBSC's CBSP client role\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        vty->node = CBC_CLIENT_NODE;</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_cbc_client_remote_ip, cfg_cbc_client_remote_ip_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "remote-ip " VTY_IPV46_CMD,</span><br><span style="color: hsl(120, 100%, 40%);">+ "Set IP Address of the Cell Broadcast Centre, to establish CBSP link to\n"</span><br><span style="color: hsl(120, 100%, 40%);">+  "IPv4 address\n" "IPv6 address\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_sockaddr_str_from_str(&cbc->client.remote_addr, argv[0], cbc->client.remote_addr.port);</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_cbc_client_remote_port, cfg_cbc_client_remote_port_cmd,</span><br><span>  "remote-port <1-65535>",</span><br><span style="color: hsl(0, 100%, 40%);">-        "TCP Port number of the Cell Broadcast Centre (Default: 48049)\n"</span><br><span style="color: hsl(0, 100%, 40%);">-     "TCP Port number of the Cell Broadcast Centre (Default: 48049)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+  "Set TCP port of the Cell Broadcast Centre, to establish CBSP link to\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "CBSP port number (Default: " OSMO_STRINGIFY_VAL(CBSP_TCP_PORT) ")\n")</span><br><span> {</span><br><span>      struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-   cbc->config.cbc_port = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-        return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_cbc_listen_port, cfg_cbc_listen_port_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "listen-port <1-65535>",</span><br><span style="color: hsl(0, 100%, 40%);">-        "Local TCP port at which BSC listens for incoming CBSP connections from CBC\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "Local TCP port at which BSC listens for incoming CBSP connections from CBC\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-   cbc->config.listen_port = atoi(argv[0]);</span><br><span style="color: hsl(0, 100%, 40%);">-     return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_cbc_no_listen_port, cfg_cbc_no_listen_port_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-   "no listen-port",</span><br><span style="color: hsl(0, 100%, 40%);">-     NO_STR "Remove CBSP Listen Port; disables inbound CBSP connections\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-   cbc->config.listen_port = -1;</span><br><span style="color: hsl(0, 100%, 40%);">-        return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(cfg_cbc_listen_ip, cfg_cbc_listen_ip_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">-     "listen-ip A.B.C.D",</span><br><span style="color: hsl(0, 100%, 40%);">-  "Local IP Address where BSC listens for incoming CBC connections (Default: 0.0.0.0)\n"</span><br><span style="color: hsl(0, 100%, 40%);">-        "Local IP Address where BSC listens for incoming CBC connections\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_talloc_replace_string(cbc, &cbc->config.listen_hostname, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        cbc->client.remote_addr.port = atoi(argv[0]);</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -364,23 +406,56 @@</span><br><span>         1,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static struct cmd_node cbc_server_node = {</span><br><span style="color: hsl(120, 100%, 40%);">+      CBC_SERVER_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+      "%s(config-cbc-server)# ",</span><br><span style="color: hsl(120, 100%, 40%);">+  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%);">+static struct cmd_node cbc_client_node = {</span><br><span style="color: hsl(120, 100%, 40%);">+  CBC_CLIENT_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+      "%s(config-cbc-client)# ",</span><br><span style="color: hsl(120, 100%, 40%);">+  1,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int config_write_cbc(struct vty *vty)</span><br><span> {</span><br><span>        struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     bool default_server_local;</span><br><span style="color: hsl(120, 100%, 40%);">+    bool default_client_remote;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ default_server_local = !osmo_sockaddr_str_cmp(&cbc->server.local_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                               &bsc_cbc_default_server_local_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+        default_client_remote = !osmo_sockaddr_str_is_set(&cbc->client.remote_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* If all reflects default values, skip the 'cbc' section */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (cbc->mode == BSC_CBC_LINK_MODE_DISABLED</span><br><span style="color: hsl(120, 100%, 40%);">+            && default_server_local</span><br><span style="color: hsl(120, 100%, 40%);">+       && default_client_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+         return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  vty_out(vty, "cbc%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " mode %s%s", bsc_cbc_link_mode_name(cbc->mode), VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if (cbc->config.cbc_hostname) {</span><br><span style="color: hsl(0, 100%, 40%);">-              vty_out(vty, " remote-ip %s%s", cbc->config.cbc_hostname, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-            vty_out(vty, " remote-port %u%s", cbc->config.cbc_port, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-      } else</span><br><span style="color: hsl(0, 100%, 40%);">-          vty_out(vty, " no remote-ip%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!default_server_local) {</span><br><span style="color: hsl(120, 100%, 40%);">+          vty_out(vty, " server%s", VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (cbc->config.listen_port >= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, " listen-port %u%s", cbc->config.listen_port, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-           vty_out(vty, " listen-ip %s%s", cbc->config.listen_hostname, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- } else</span><br><span style="color: hsl(0, 100%, 40%);">-          vty_out(vty, " no listen-port%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (strcmp(cbc->server.local_addr.ip, bsc_cbc_default_server_local_addr.ip))</span><br><span style="color: hsl(120, 100%, 40%);">+                       vty_out(vty, "  local-ip %s%s", cbc->server.local_addr.ip, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (cbc->server.local_addr.port != bsc_cbc_default_server_local_addr.port)</span><br><span style="color: hsl(120, 100%, 40%);">+                 vty_out(vty, "  local-port %u%s", cbc->server.local_addr.port, VTY_NEWLINE);</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 (!default_client_remote) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, " client%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           if (osmo_sockaddr_str_is_set(&cbc->client.remote_addr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      vty_out(vty, "  remote-ip %s%s", cbc->client.remote_addr.ip, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (cbc->client.remote_addr.port != CBSP_TCP_PORT)</span><br><span style="color: hsl(120, 100%, 40%);">+                         vty_out(vty, "  remote-port %u%s", cbc->client.remote_addr.port, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> </span><br><span>        return 0;</span><br><span> }</span><br><span>@@ -391,34 +466,43 @@</span><br><span> {</span><br><span>  struct bsc_cbc_link *cbc = vty_cbc_data(vty);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if (!cbc->config.cbc_hostname)</span><br><span style="color: hsl(0, 100%, 40%);">-               vty_out(vty, "CBSP Client Config: Disabled%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-  else {</span><br><span style="color: hsl(0, 100%, 40%);">-          vty_out(vty, "CBSP Client Config: CBC IP=%s, CBC Port=%u%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                  cbc->config.cbc_hostname, cbc->config.cbc_port, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-             vty_out(vty, "CBSP Client Connection: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                  cbc->client.sock_name ? cbc->client.sock_name : "Disconnected", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (cbc->config.listen_port < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-          vty_out(vty, "CBSP Server Config: Disabled%s\n", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-        else {</span><br><span style="color: hsl(0, 100%, 40%);">-          vty_out(vty, "CBSP Server Config: Listen IP=%s, Port=%u%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 cbc->config.listen_hostname, cbc->config.listen_port, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (cbc->mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case BSC_CBC_LINK_MODE_DISABLED:</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "CBSP link is disabled%s", VTY_NEWLINE);</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%);">+      case BSC_CBC_LINK_MODE_SERVER:</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "OsmoBSC is configured as CBSP Server on " OSMO_SOCKADDR_STR_FMT "%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                       OSMO_SOCKADDR_STR_FMT_ARGS(&cbc->server.local_addr), VTY_NEWLINE);</span><br><span>            vty_out(vty, "CBSP Server Connection: %s%s",</span><br><span>                       cbc->server.sock_name ? cbc->server.sock_name : "Disconnected", VTY_NEWLINE);</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%);">+      case BSC_CBC_LINK_MODE_CLIENT:</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, "OsmoBSC is configured as CBSP Client to remote CBC at " OSMO_SOCKADDR_STR_FMT "%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                 OSMO_SOCKADDR_STR_FMT_ARGS(&cbc->client.remote_addr), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+            vty_out(vty, "CBSP Client Connection: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                        cbc->client.sock_name ? cbc->client.sock_name : "Disconnected", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span>       }</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span> void cbc_vty_init(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    install_element(VIEW_NODE, &show_cbc_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element_ve(&show_cbc_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     install_element(CONFIG_NODE, &cfg_cbc_cmd);</span><br><span>      install_node(&cbc_node, config_write_cbc);</span><br><span style="color: hsl(0, 100%, 40%);">-  install_element(CBC_NODE, &cfg_cbc_remote_ip_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-  install_element(CBC_NODE, &cfg_cbc_no_remote_ip_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-       install_element(CBC_NODE, &cfg_cbc_remote_port_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-        install_element(CBC_NODE, &cfg_cbc_listen_port_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-        install_element(CBC_NODE, &cfg_cbc_no_listen_port_cmd);</span><br><span style="color: hsl(0, 100%, 40%);">-     install_element(CBC_NODE, &cfg_cbc_listen_ip_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(CBC_NODE, &cfg_cbc_mode_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(CBC_NODE, &cfg_cbc_server_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_node(&cbc_server_node, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(CBC_SERVER_NODE, &cfg_cbc_server_local_ip_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(CBC_SERVER_NODE, &cfg_cbc_server_local_port_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(CBC_NODE, &cfg_cbc_client_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_node(&cbc_client_node, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     install_element(CBC_CLIENT_NODE, &cfg_cbc_client_remote_ip_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+  install_element(CBC_CLIENT_NODE, &cfg_cbc_client_remote_port_cmd);</span><br><span> }</span><br><span>diff --git a/tests/cbc.vty b/tests/cbc.vty</span><br><span>new file mode 100644</span><br><span>index 0000000..2cad609</span><br><span>--- /dev/null</span><br><span>+++ b/tests/cbc.vty</span><br><span>@@ -0,0 +1,156 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC> ### CBSP link config</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC> list</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  show cbc</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%);">+OsmoBSC> enable</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# list</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  show cbc</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%);">+OsmoBSC# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+... !cbc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# show cbc</span><br><span style="color: hsl(120, 100%, 40%);">+CBSP link is disabled</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# configure terminal</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config)# cbc</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# list</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  mode (server|client|disabled)</span><br><span style="color: hsl(120, 100%, 40%);">+  server</span><br><span style="color: hsl(120, 100%, 40%);">+  client</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# ?</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  mode    Set OsmoBSC as CBSP server or client</span><br><span style="color: hsl(120, 100%, 40%);">+  server  Configure OsmoBSC's CBSP server role</span><br><span style="color: hsl(120, 100%, 40%);">+  client  Configure OsmoBSC's CBSP client role</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# mode ?</span><br><span style="color: hsl(120, 100%, 40%);">+  server    CBSP Server: listen for inbound TCP connections from a remote Cell Broadcast Centre</span><br><span style="color: hsl(120, 100%, 40%);">+  client    CBSP Client: establish outbound TCP connection to a remote Cell Broadcast Centre</span><br><span style="color: hsl(120, 100%, 40%);">+  disabled  Disable CBSP link</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# server</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# list</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip (A.B.C.D|X:X::X:X)</span><br><span style="color: hsl(120, 100%, 40%);">+  local-port <1-65535></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# ?</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip    Set IP Address to listen on for inbound CBSP from a Cell Broadcast Centre</span><br><span style="color: hsl(120, 100%, 40%);">+  local-port  Set TCP port to listen on for inbound CBSP from a Cell Broadcast Centre</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# local-ip ?</span><br><span style="color: hsl(120, 100%, 40%);">+  A.B.C.D   IPv4 address</span><br><span style="color: hsl(120, 100%, 40%);">+  X:X::X:X  IPv6 address</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# local-port ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <1-65535>  CBSP port number (Default: 48049)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# local-ip 1.2.3.4</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# local-port 12345</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+cbc</span><br><span style="color: hsl(120, 100%, 40%);">+ mode disabled</span><br><span style="color: hsl(120, 100%, 40%);">+ server</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip 1.2.3.4</span><br><span style="color: hsl(120, 100%, 40%);">+  local-port 12345</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%);">+OsmoBSC(config-cbc-server)# local-port 48049</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+cbc</span><br><span style="color: hsl(120, 100%, 40%);">+ mode disabled</span><br><span style="color: hsl(120, 100%, 40%);">+ server</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip 1.2.3.4</span><br><span style="color: hsl(120, 100%, 40%);">+... !local-port</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# local-ip ::1</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+cbc</span><br><span style="color: hsl(120, 100%, 40%);">+ mode disabled</span><br><span style="color: hsl(120, 100%, 40%);">+ server</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip ::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%);">+OsmoBSC(config-cbc-server)# do show cbc</span><br><span style="color: hsl(120, 100%, 40%);">+CBSP link is disabled</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-server)# exit</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# client</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# list</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip (A.B.C.D|X:X::X:X)</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-port <1-65535></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# ?</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip    Set IP Address of the Cell Broadcast Centre, to establish CBSP link to</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-port  Set TCP port of the Cell Broadcast Centre, to establish CBSP link to</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# remote-ip ?</span><br><span style="color: hsl(120, 100%, 40%);">+  A.B.C.D   IPv4 address</span><br><span style="color: hsl(120, 100%, 40%);">+  X:X::X:X  IPv6 address</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# remote-port ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <1-65535>  CBSP port number (Default: 48049)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# remote-ip 1.2.3.4</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# remote-port 12345</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+cbc</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+ client</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 1.2.3.4</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-port 12345</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%);">+OsmoBSC(config-cbc-client)# remote-port 48049</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+cbc</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+ client</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 1.2.3.4</span><br><span style="color: hsl(120, 100%, 40%);">+... !remote-port</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# remote-ip 1:2:3:4::5</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+cbc</span><br><span style="color: hsl(120, 100%, 40%);">+...</span><br><span style="color: hsl(120, 100%, 40%);">+ client</span><br><span style="color: hsl(120, 100%, 40%);">+  remote-ip 1:2:3:4::5</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%);">+OsmoBSC(config-cbc-client)# do show cbc</span><br><span style="color: hsl(120, 100%, 40%);">+CBSP link is disabled</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# exit</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# mode server</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# do show cbc</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC is configured as CBSP Server on [::1]:48049</span><br><span style="color: hsl(120, 100%, 40%);">+CBSP Server Connection: Disconnected</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# mode client</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# do show cbc</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC is configured as CBSP Client to remote CBC at [1:2:3:4::5]:48049</span><br><span style="color: hsl(120, 100%, 40%);">+CBSP Client Connection: Disconnected</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# mode disabled</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc)# do show cbc</span><br><span style="color: hsl(120, 100%, 40%);">+CBSP link is disabled</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19864">change 19864</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/+/19864"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Icaa2775cc20a99227dabe38a775ff808b374cf98 </div>
<div style="display:none"> Gerrit-Change-Number: 19864 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>