<p>daniel has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9402">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gb_proxy: Add ctrl interface and ns-state, gbproxy-state commands<br><br>This patch adds a control interface to osmo-gbproxy as well as the first<br>two commands to query the state of each NSVC and gbproxy peer.<br><br>The "ns-state" command replies with<br>nsei, nsvci, local state, role, remote state of all NSVCs.<br><br>The "gbproxy-state" command replies with<br>nsei, bvci, mcc, mnc, lac, rac, and state of each peer.<br><br>If there are no entries an error is returned.<br><br>$ ./osmo_ctrl.py -d 127.0.0.1 -p 4263 -g ns-state<br>Got message: b'GET_REPLY 23 gb-status 101,101,DEAD,BLOCKED,SGSN,DEAD,UNBLOCKED;'<br>$ ./osmo_ctrl.py -d 127.0.0.1 -p 4263 -g gbproxy-state<br>Got message: b'ERROR 23 No peers found'<br><br>Change-Id: I82c74fd0bfcb9ba4ec3619d9fdaa0cae201b3177<br>Ticket: OS#3281, SYS#4235<br>Sponsored-by: On-Waves ehf<br>---<br>M include/osmocom/sgsn/gb_proxy.h<br>M src/gprs/Makefile.am<br>A src/gprs/gb_proxy_ctrl.c<br>M src/gprs/gb_proxy_main.c<br>4 files changed, 131 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sgsn refs/changes/02/9402/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sgsn/gb_proxy.h b/include/osmocom/sgsn/gb_proxy.h</span><br><span>index 2540a7e..70de3d7 100644</span><br><span>--- a/include/osmocom/sgsn/gb_proxy.h</span><br><span>+++ b/include/osmocom/sgsn/gb_proxy.h</span><br><span>@@ -184,6 +184,9 @@</span><br><span> int gbproxy_vty_init(void);</span><br><span> int gbproxy_parse_config(const char *config_file, struct gbproxy_config *cfg);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* gb_proxy_ctrl.c */</span><br><span style="color: hsl(120, 100%, 40%);">+int gb_ctrl_cmds_install(void);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span> /* gb_proxy.c */</span><br><span> int gbproxy_init_config(struct gbproxy_config *cfg);</span><br><span>diff --git a/src/gprs/Makefile.am b/src/gprs/Makefile.am</span><br><span>index 4c7f730..1cf6785 100644</span><br><span>--- a/src/gprs/Makefile.am</span><br><span>+++ b/src/gprs/Makefile.am</span><br><span>@@ -44,6 +44,7 @@</span><br><span>     gb_proxy.c \</span><br><span>         gb_proxy_main.c \</span><br><span>    gb_proxy_vty.c \</span><br><span style="color: hsl(120, 100%, 40%);">+      gb_proxy_ctrl.c \</span><br><span>    gb_proxy_patch.c \</span><br><span>   gb_proxy_tlli.c \</span><br><span>    gb_proxy_peer.c \</span><br><span>diff --git a/src/gprs/gb_proxy_ctrl.c b/src/gprs/gb_proxy_ctrl.c</span><br><span>new file mode 100644</span><br><span>index 0000000..9096edc</span><br><span>--- /dev/null</span><br><span>+++ b/src/gprs/gb_proxy_ctrl.c</span><br><span>@@ -0,0 +1,109 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Control Interface Implementation for the Gb-proxy */</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018 by Daniel Willmann</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018 by sysmocom s.f.m.c. GmbH</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/licenses/>.</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 <osmocom/core/talloc.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%);">+#include <osmocom/gprs/gprs_bssgp.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_if.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_cmd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/gb_proxy.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/sgsn/debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern vector ctrl_node_vec;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_ns_status(struct ctrl_cmd *cmd, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gbproxy_config *cfg = data;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_ns_inst *nsi = cfg->nsi;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_nsvc *nsvc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     cmd->reply = talloc_strdup(cmd, "");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_for_each_entry(nsvc, &nsi->gprs_nsvcs, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+           if (nsvc == nsi->unknown_nsvc)</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           cmd->reply = talloc_asprintf_append(cmd->reply,</span><br><span style="color: hsl(120, 100%, 40%);">+                         "%u,%u,%s,%s,%s,%s,%s;",</span><br><span style="color: hsl(120, 100%, 40%);">+                            nsvc->nsei, nsvc->nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                                NS_DESC_A(nsvc->state),</span><br><span style="color: hsl(120, 100%, 40%);">+                            NS_DESC_B(nsvc->state),</span><br><span style="color: hsl(120, 100%, 40%);">+                            nsvc->remote_end_is_sgsn ? "SGSN" : "BSS",</span><br><span style="color: hsl(120, 100%, 40%);">+                             NS_DESC_A(nsvc->remote_state),</span><br><span style="color: hsl(120, 100%, 40%);">+                             NS_DESC_B(nsvc->remote_state));</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%);">+   if (strnlen(cmd->reply, 2) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         talloc_free(cmd->reply);</span><br><span style="color: hsl(120, 100%, 40%);">+           cmd->reply = "No NSVCs found";</span><br><span style="color: hsl(120, 100%, 40%);">+           goto err;</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%);">+   return CTRL_CMD_REPLY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+err:</span><br><span style="color: hsl(120, 100%, 40%);">+        return CTRL_CMD_ERROR;</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%);">+CTRL_CMD_DEFINE_RO(ns_status, "ns-state");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_gbproxy_status(struct ctrl_cmd *cmd, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gbproxy_config *cfg = data;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gbproxy_peer *peer;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  cmd->reply = talloc_strdup(cmd, "");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_for_each_entry(peer, &cfg->bts_peers, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+            struct gprs_ra_id raid;</span><br><span style="color: hsl(120, 100%, 40%);">+               gsm48_parse_ra(&raid, peer->ra);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             cmd->reply = talloc_asprintf_append(cmd->reply, "%u,%u,%u,%u,%u,%u,%s;",</span><br><span style="color: hsl(120, 100%, 40%);">+                              peer->nsei, peer->bvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                         raid.mcc, raid.mnc,</span><br><span style="color: hsl(120, 100%, 40%);">+                           raid.lac, raid.rac,</span><br><span style="color: hsl(120, 100%, 40%);">+                           peer->blocked ? "BLOCKED" : "UNBLOCKED");</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 (strnlen(cmd->reply, 2) == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         talloc_free(cmd->reply);</span><br><span style="color: hsl(120, 100%, 40%);">+           cmd->reply = "No peers found";</span><br><span style="color: hsl(120, 100%, 40%);">+           goto err;</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%);">+   return CTRL_CMD_REPLY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+err:</span><br><span style="color: hsl(120, 100%, 40%);">+        return CTRL_CMD_ERROR;</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%);">+CTRL_CMD_DEFINE_RO(gbproxy_status, "gbproxy-state");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int gb_ctrl_cmds_install(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_ns_status);</span><br><span style="color: hsl(120, 100%, 40%);">+   rc |= ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_gbproxy_status);</span><br><span style="color: hsl(120, 100%, 40%);">+      return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/gprs/gb_proxy_main.c b/src/gprs/gb_proxy_main.c</span><br><span>index 474aa52..97e6342 100644</span><br><span>--- a/src/gprs/gb_proxy_main.c</span><br><span>+++ b/src/gprs/gb_proxy_main.c</span><br><span>@@ -46,6 +46,10 @@</span><br><span> #include <osmocom/sgsn/vty.h></span><br><span> #include <osmocom/sgsn/gb_proxy.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/control_if.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/ctrl/ports.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include <osmocom/vty/command.h></span><br><span> #include <osmocom/vty/telnet_interface.h></span><br><span> #include <osmocom/vty/logging.h></span><br><span>@@ -263,6 +267,7 @@</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span>        int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ctrl_handle *ctrl;</span><br><span> </span><br><span>        tall_bsc_ctx = talloc_named_const(NULL, 0, "nsip_proxy");</span><br><span>  msgb_talloc_ctx_init(tall_bsc_ctx, 0);</span><br><span>@@ -334,6 +339,19 @@</span><br><span>        if (rc < 0)</span><br><span>               exit(1);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* Start control interface after getting config for</span><br><span style="color: hsl(120, 100%, 40%);">+    * ctrl_vty_get_bind_addr() */</span><br><span style="color: hsl(120, 100%, 40%);">+        ctrl = ctrl_interface_setup_dynip(gbcfg, ctrl_vty_get_bind_addr(), OSMO_CTRL_PORT_GBPROXY, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!ctrl) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DGPRS, LOGL_FATAL, "Failed to create CTRL interface.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              exit(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%);">+   if (gb_ctrl_cmds_install() != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DGPRS, LOGL_FATAL, "Failed to install CTRL commands.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!gprs_nsvc_by_nsei(gbcfg->nsi, gbcfg->nsip_sgsn_nsei)) {</span><br><span>           LOGP(DGPRS, LOGL_FATAL, "You cannot proxy to NSEI %u "</span><br><span>                     "without creating that NSEI before\n",</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9402">change 9402</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/9402"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sgsn </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I82c74fd0bfcb9ba4ec3619d9fdaa0cae201b3177 </div>
<div style="display:none"> Gerrit-Change-Number: 9402 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: daniel <dwillmann@sysmocom.de> </div>