<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19865">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">CBSP: add local bind to client mode<br><br>Add the ability to set a local bind address for the CBSP client mode.<br><br>Change-Id: I56a420d204a9a487b27dd460f4cc52e0b4093d69<br>---<br>M include/osmocom/bsc/smscb.h<br>M src/osmo-bsc/bsc_init.c<br>M src/osmo-bsc/cbsp_link.c<br>M tests/cbc.vty<br>4 files changed, 113 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 refs/changes/65/19865/1</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 c7002f6..f48c1a1 100644</span><br><span>--- a/include/osmocom/bsc/smscb.h</span><br><span>+++ b/include/osmocom/bsc/smscb.h</span><br><span>@@ -55,6 +55,7 @@</span><br><span>   /* for handling outbound TCP connections */</span><br><span>  struct {</span><br><span>             struct osmo_sockaddr_str remote_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+         struct osmo_sockaddr_str local_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/src/osmo-bsc/bsc_init.c b/src/osmo-bsc/bsc_init.c</span><br><span>index e722199..1460af4 100644</span><br><span>--- a/src/osmo-bsc/bsc_init.c</span><br><span>+++ b/src/osmo-bsc/bsc_init.c</span><br><span>@@ -134,6 +134,7 @@</span><br><span>     /* For CBSP client mode: default remote CBSP server port is CBSP_TCP_PORT == 48049. Leave the IP address unset.</span><br><span>       * Also leave the local bind for the CBSP client disabled (unconfigured). */</span><br><span>         net->cbc->client.remote_addr = (struct osmo_sockaddr_str){ .port = CBSP_TCP_PORT, };</span><br><span style="color: hsl(120, 100%, 40%);">+    net->cbc->client.local_addr = (struct osmo_sockaddr_str){};</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 d587675..e5e72de 100644</span><br><span>--- a/src/osmo-bsc/cbsp_link.c</span><br><span>+++ b/src/osmo-bsc/cbsp_link.c</span><br><span>@@ -250,6 +250,11 @@</span><br><span>          /* CBC side */</span><br><span>               osmo_stream_cli_set_addr(cbc->client.cli, cbc->client.remote_addr.ip);</span><br><span>                 osmo_stream_cli_set_port(cbc->client.cli, cbc->client.remote_addr.port);</span><br><span style="color: hsl(120, 100%, 40%);">+                /* local side */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (osmo_sockaddr_str_is_set(&cbc->client.local_addr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_stream_cli_set_local_addr(cbc->client.cli, cbc->client.local_addr.ip);</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_stream_cli_set_local_port(cbc->client.cli, cbc->client.local_addr.port);</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span>            /* Close/Reconnect? */</span><br><span>               if (osmo_stream_cli_open(cbc->client.cli) < 0) {</span><br><span>                       LOGP(DCBS, LOGL_ERROR, "Cannot open CBSP client link to " OSMO_SOCKADDR_STR_FMT "\n",</span><br><span>@@ -400,6 +405,44 @@</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_cbc_client_local_ip, cfg_cbc_client_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 local bind address for the outbound CBSP link to the 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->client.local_addr, argv[0], cbc->client.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_client_local_port, cfg_cbc_client_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 local bind port for the outbound CBSP link to the Cell Broadcast Centre\n"</span><br><span style="color: hsl(120, 100%, 40%);">+     "port number\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->client.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_no_local_ip, cfg_cbc_client_no_local_ip_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+   "no local-ip",</span><br><span style="color: hsl(120, 100%, 40%);">+      NO_STR "Remove local IP address bind config for the CBSP client mode\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->client.local_addr = (struct osmo_sockaddr_str){ .port = cbc->client.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_client_no_local_port, cfg_cbc_client_no_local_port_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+       "no local-port",</span><br><span style="color: hsl(120, 100%, 40%);">+    NO_STR "Remove local TCP port bind config for the CBSP client mode\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->client.local_addr.port = 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> static struct cmd_node cbc_node = {</span><br><span>      CBC_NODE,</span><br><span>    "%s(config-cbc)# ",</span><br><span>@@ -424,15 +467,17 @@</span><br><span> </span><br><span>    bool default_server_local;</span><br><span>   bool default_client_remote;</span><br><span style="color: hsl(120, 100%, 40%);">+   bool default_client_local;</span><br><span> </span><br><span>       default_server_local = !osmo_sockaddr_str_cmp(&cbc->server.local_addr,</span><br><span>                                                      &bsc_cbc_default_server_local_addr);</span><br><span>       default_client_remote = !osmo_sockaddr_str_is_set(&cbc->client.remote_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+   default_client_local = !osmo_sockaddr_str_is_set(&cbc->client.local_addr);</span><br><span> </span><br><span>        /* If all reflects default values, skip the 'cbc' section */</span><br><span>         if (cbc->mode == BSC_CBC_LINK_MODE_DISABLED</span><br><span>           && default_server_local</span><br><span style="color: hsl(0, 100%, 40%);">-         && default_client_remote)</span><br><span style="color: hsl(120, 100%, 40%);">+     && default_client_remote && default_client_local)</span><br><span>                return 0;</span><br><span> </span><br><span>        vty_out(vty, "cbc%s", VTY_NEWLINE);</span><br><span>@@ -447,7 +492,7 @@</span><br><span>                  vty_out(vty, "  local-port %u%s", cbc->server.local_addr.port, VTY_NEWLINE);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (!default_client_remote) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!(default_client_remote && default_client_local)) {</span><br><span>              vty_out(vty, " client%s", VTY_NEWLINE);</span><br><span> </span><br><span>                if (osmo_sockaddr_str_is_set(&cbc->client.remote_addr)) {</span><br><span>@@ -455,6 +500,11 @@</span><br><span>                      if (cbc->client.remote_addr.port != CBSP_TCP_PORT)</span><br><span>                                vty_out(vty, "  remote-port %u%s", cbc->client.remote_addr.port, VTY_NEWLINE);</span><br><span>          }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           if (cbc->client.local_addr.ip[0])</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, "  local-ip %s%s", cbc->client.local_addr.ip, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (cbc->client.local_addr.port)</span><br><span style="color: hsl(120, 100%, 40%);">+                   vty_out(vty, "  local-port %u%s", cbc->client.local_addr.port, VTY_NEWLINE);</span><br><span>    }</span><br><span> </span><br><span>        return 0;</span><br><span>@@ -505,4 +555,8 @@</span><br><span>      install_node(&cbc_client_node, NULL);</span><br><span>    install_element(CBC_CLIENT_NODE, &cfg_cbc_client_remote_ip_cmd);</span><br><span>         install_element(CBC_CLIENT_NODE, &cfg_cbc_client_remote_port_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(CBC_CLIENT_NODE, &cfg_cbc_client_local_ip_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(CBC_CLIENT_NODE, &cfg_cbc_client_local_port_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(CBC_CLIENT_NODE, &cfg_cbc_client_no_local_ip_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(CBC_CLIENT_NODE, &cfg_cbc_client_no_local_port_cmd);</span><br><span> }</span><br><span>diff --git a/tests/cbc.vty b/tests/cbc.vty</span><br><span>index 2cad609..7a4031f 100644</span><br><span>--- a/tests/cbc.vty</span><br><span>+++ b/tests/cbc.vty</span><br><span>@@ -94,11 +94,18 @@</span><br><span> ...</span><br><span>   remote-ip (A.B.C.D|X:X::X:X)</span><br><span>   remote-port <1-65535></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%);">+  no local-ip</span><br><span style="color: hsl(120, 100%, 40%);">+  no local-port</span><br><span> </span><br><span> OsmoBSC(config-cbc-client)# ?</span><br><span> ...</span><br><span>   remote-ip    Set IP Address of the Cell Broadcast Centre, to establish CBSP link to</span><br><span>   remote-port  Set TCP port of the Cell Broadcast Centre, to establish CBSP link to</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip     Set local bind address for the outbound CBSP link to the Cell Broadcast Centre</span><br><span style="color: hsl(120, 100%, 40%);">+  local-port   Set local bind port for the outbound CBSP link to the Cell Broadcast Centre</span><br><span style="color: hsl(120, 100%, 40%);">+  no           Negate a command or set its defaults</span><br><span> </span><br><span> OsmoBSC(config-cbc-client)# remote-ip ?</span><br><span>   A.B.C.D   IPv4 address</span><br><span>@@ -106,6 +113,10 @@</span><br><span> OsmoBSC(config-cbc-client)# remote-port ?</span><br><span>   <1-65535>  CBSP port number (Default: 48049)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# no ?</span><br><span style="color: hsl(120, 100%, 40%);">+  local-ip    Remove local IP address bind config for the CBSP client mode</span><br><span style="color: hsl(120, 100%, 40%);">+  local-port  Remove local TCP port bind config for the CBSP client mode</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> OsmoBSC(config-cbc-client)# remote-ip 1.2.3.4</span><br><span> OsmoBSC(config-cbc-client)# remote-port 12345</span><br><span> OsmoBSC(config-cbc-client)# show running-config</span><br><span>@@ -136,6 +147,50 @@</span><br><span>   remote-ip 1:2:3:4::5</span><br><span> ...</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# local-ip 1.2.3.4</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::5</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-client)# local-port 12345</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::5</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-client)# no local-ip</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::5</span><br><span style="color: hsl(120, 100%, 40%);">+  local-port 12345</span><br><span style="color: hsl(120, 100%, 40%);">+... !local</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-cbc-client)# no local-port</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::5</span><br><span style="color: hsl(120, 100%, 40%);">+... !local</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> OsmoBSC(config-cbc-client)# do show cbc</span><br><span> CBSP link is disabled</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19865">change 19865</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/+/19865"/><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: I56a420d204a9a487b27dd460f4cc52e0b4093d69 </div>
<div style="display:none"> Gerrit-Change-Number: 19865 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>