<p>Max <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12710">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  osmith: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add ping probe support<br><br>Use liboping (new dependency) to add 'ping XXX' entries support in .cfg<br>file, where XXX can be either IP address or FQDN.<br><br>Sample output:<br>...<br>  ping<br>    ya.ru<br>      IP: 2a02:6b8::2:242<br>      dropped: 3/3<br>    8.8.8.8<br>      IP: 8.8.8.8<br>      dropped: 0/3<br>      latency: 20.4 ms<br>      TTL: 120<br>...<br><br>N. B: to gather actual ping statistic we have to be able to send ICMP<br>requests (have enough privileges to work with RAW sockets).<br><br>Related: SYS#2655<br>Change-Id: Ife32540b532fb54368f63c78fb7837b84d4e8c76<br>---<br>M configure.ac<br>M src/Makefile.am<br>M src/osysmon.h<br>M src/osysmon_main.c<br>A src/osysmon_ping.c<br>5 files changed, 281 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index 734ac99..d98de89 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -43,6 +43,8 @@</span><br><span> PKG_CHECK_MODULES(LIBOSMOCTRL, libosmoctrl >= 0.11.0)</span><br><span> PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.11.0)</span><br><span> PKG_CHECK_MODULES(LIBMNL, libmnl)</span><br><span style="color: hsl(120, 100%, 40%);">+dnl FIXME: bump to 1.10.0 once it's available on build slaves and remove workaround from osysmon_ping.c</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOPING, liboping >= 1.9.0)</span><br><span> </span><br><span> dnl checks for header files</span><br><span> AC_HEADER_STDC</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index cb85da2..d0d6a22 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -24,11 +24,12 @@</span><br><span> libintern_la_SOURCES = simple_ctrl.c</span><br><span> libintern_la_LIBADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-osmo_sysmon_CFLAGS = $(LIBMNL_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(AM_CFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_sysmon_CFLAGS = $(LIBMNL_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOPING_CFLAGS) $(AM_CFLAGS)</span><br><span> </span><br><span> osmo_sysmon_LDADD = $(LDADD) \</span><br><span>       $(LIBOSMOVTY_LIBS) \</span><br><span>         $(LIBMNL_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+      $(LIBOPING_LIBS) \</span><br><span>   $(NULL)</span><br><span> </span><br><span> osmo_sysmon_SOURCES = \</span><br><span>@@ -37,6 +38,7 @@</span><br><span>   osysmon_sysinfo.c \</span><br><span>  osysmon_rtnl.c \</span><br><span>     osysmon_file.c \</span><br><span style="color: hsl(120, 100%, 40%);">+      osysmon_ping.c \</span><br><span>     osysmon_main.c \</span><br><span>     $(NULL)</span><br><span> </span><br><span>diff --git a/src/osysmon.h b/src/osysmon.h</span><br><span>index 735b11e..df8bf8d 100644</span><br><span>--- a/src/osysmon.h</span><br><span>+++ b/src/osysmon.h</span><br><span>@@ -9,6 +9,7 @@</span><br><span> #include "value_node.h"</span><br><span> </span><br><span> struct rtnl_client_state;</span><br><span style="color: hsl(120, 100%, 40%);">+struct ping_state;</span><br><span> </span><br><span> struct osysmon_state {</span><br><span>       struct rtnl_client_state *rcs;</span><br><span>@@ -18,6 +19,7 @@</span><br><span>   struct llist_head netdevs;</span><br><span>   /* list of 'struct osysmon_file' */</span><br><span>  struct llist_head files;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct ping_state *pings;</span><br><span> };</span><br><span> </span><br><span> extern struct osysmon_state *g_oss;</span><br><span>@@ -28,6 +30,7 @@</span><br><span>       CTRL_CLIENT_NODE = _LAST_OSMOVTY_NODE + 1,</span><br><span>   CTRL_CLIENT_GETVAR_NODE,</span><br><span>     NETDEV_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+  PING_NODE,</span><br><span> };</span><br><span> </span><br><span> </span><br><span>@@ -42,5 +45,8 @@</span><br><span> int osysmon_sysinfo_init();</span><br><span> int osysmon_sysinfo_poll(struct value_node *parent);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int osysmon_ping_init();</span><br><span style="color: hsl(120, 100%, 40%);">+int osysmon_ping_poll(struct value_node *parent);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int osysmon_file_init();</span><br><span> int osysmon_file_poll(struct value_node *parent);</span><br><span>diff --git a/src/osysmon_main.c b/src/osysmon_main.c</span><br><span>index 82df61f..eb4f50b 100644</span><br><span>--- a/src/osysmon_main.c</span><br><span>+++ b/src/osysmon_main.c</span><br><span>@@ -193,7 +193,7 @@</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc, ping_init;</span><br><span> </span><br><span>       osmo_init_logging2(NULL, &log_info);</span><br><span> </span><br><span>@@ -207,6 +207,7 @@</span><br><span>   osysmon_sysinfo_init();</span><br><span>      osysmon_ctrl_init();</span><br><span>         osysmon_rtnl_init();</span><br><span style="color: hsl(120, 100%, 40%);">+  ping_init = osysmon_ping_init();</span><br><span>     osysmon_file_init();</span><br><span> </span><br><span>     rc = vty_read_config_file(cmdline_opts.config_file, NULL);</span><br><span>@@ -233,6 +234,10 @@</span><br><span>            osysmon_sysinfo_poll(root);</span><br><span>          osysmon_ctrl_poll(root);</span><br><span>             osysmon_rtnl_poll(root);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            if (ping_init == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                   osysmon_ping_poll(root);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>           osysmon_file_poll(root);</span><br><span> </span><br><span>                 display_update(root);</span><br><span>diff --git a/src/osysmon_ping.c b/src/osysmon_ping.c</span><br><span>new file mode 100644</span><br><span>index 0000000..f736798</span><br><span>--- /dev/null</span><br><span>+++ b/src/osysmon_ping.c</span><br><span>@@ -0,0 +1,264 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Simple Osmocom System Monitor (osysmon): Support for ping probe */</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+ * Author: Max Suraev</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%);">+ * SPDX-License-Identifier: GPL-2.0+</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 General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ *  the Free Software Foundation; either version 2 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 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 General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ *  along with this program; if not, write to the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,</span><br><span style="color: hsl(120, 100%, 40%);">+ *  MA  02110-1301, USA.</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 <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <oping.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/command.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "osysmon.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "value_node.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%);">+ * Data model</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%);">+#define BUFLEN 128</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct ping_state {</span><br><span style="color: hsl(120, 100%, 40%);">+       pingobj_t *ping_handle;</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%);">+/* FIXME: replace with ping_iterator_count() once we bump requirements to liboping 1.10.0+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static unsigned iterator_count(pingobj_t *p)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   pingobj_iter_t *iter;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (iter = ping_iterator_get(p); iter; iter = ping_iterator_next(iter))</span><br><span style="color: hsl(120, 100%, 40%);">+              count++;</span><br><span style="color: hsl(120, 100%, 40%);">+      return count;</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%);">+/* Workaround for liboping issue https://github.com/octo/liboping/issues/43 */</span><br><span style="color: hsl(120, 100%, 40%);">+static int add_host(pingobj_t *pinger, const char *host)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int num_host = iterator_count(pinger),</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = ping_host_add(pinger, host);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (num_host != iterator_count(pinger))</span><br><span style="color: hsl(120, 100%, 40%);">+                       ping_host_remove(pinger, host);</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 rc;</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 bool add_drop(pingobj_iter_t *iter, struct value_node *vn_host)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  char *s = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t drop, seq;</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t len = sizeof(drop);</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc = ping_iterator_get_info(iter, PING_INFO_DROPPED, &drop, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+               return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       len = sizeof(seq);</span><br><span style="color: hsl(120, 100%, 40%);">+    rc = ping_iterator_get_info(iter, PING_INFO_SEQUENCE, &seq, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+               return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_talloc_asprintf(vn_host, s, "%u/%u", drop, seq);</span><br><span style="color: hsl(120, 100%, 40%);">+       value_node_add(vn_host, "dropped", s);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return true;</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 bool add_ttl(pingobj_iter_t *iter, struct value_node *vn_host)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int ttl, rc;</span><br><span style="color: hsl(120, 100%, 40%);">+  size_t len = sizeof(ttl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = ping_iterator_get_info(iter, PING_INFO_RECV_TTL, &ttl, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+               return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ttl > -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            char *s = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_talloc_asprintf(vn_host, s, "%d", ttl);</span><br><span style="color: hsl(120, 100%, 40%);">+                value_node_add(vn_host, "TTL", s);</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 true;</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 bool add_latency(pingobj_iter_t *iter, struct value_node *vn_host)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       double latency;</span><br><span style="color: hsl(120, 100%, 40%);">+       size_t len = sizeof(latency);</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc = ping_iterator_get_info(iter, PING_INFO_LATENCY, &latency, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+               return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (latency > -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                char *s = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_talloc_asprintf(vn_host, s, "%.1lf ms", latency);</span><br><span style="color: hsl(120, 100%, 40%);">+              value_node_add(vn_host, "latency", s);</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 true;</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%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * VTY</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 ping_node = {</span><br><span style="color: hsl(120, 100%, 40%);">+      PING_NODE,</span><br><span style="color: hsl(120, 100%, 40%);">+    "%s(config-ping)# ",</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%);">+int osysmon_ping_go_parent(struct vty *vty)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (vty->node) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case PING_NODE:</span><br><span style="color: hsl(120, 100%, 40%);">+               vty->node = CONFIG_NODE;</span><br><span style="color: hsl(120, 100%, 40%);">+           vty->index = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</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%);">+     return vty->node;</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%);">+#define PING_STR "Configure a host to be monitored/pinged\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(cfg_ping, cfg_ping_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "ping HOST",</span><br><span style="color: hsl(120, 100%, 40%);">+      PING_STR "Name of the host to ping\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   int rc = add_host(g_oss->pings->ping_handle, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "[%d] Couldn't add pinger for %s: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                   iterator_count(g_oss->pings->ping_handle), argv[0],</span><br><span style="color: hsl(120, 100%, 40%);">+                     ping_get_error(g_oss->pings->ping_handle), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              return CMD_WARNING;</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 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_no_ping, cfg_no_ping_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "no ping HOST",</span><br><span style="color: hsl(120, 100%, 40%);">+      NO_STR PING_STR "Name of the host to ping\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc = ping_host_remove(g_oss->pings->ping_handle, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "[%d] Couldn't remove %s pinger: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                    iterator_count(g_oss->pings->ping_handle), argv[0],</span><br><span style="color: hsl(120, 100%, 40%);">+                     ping_get_error(g_oss->pings->ping_handle), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              return CMD_WARNING;</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 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%);">+static int config_write_ping(struct vty *vty)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    char buf[BUFLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+     pingobj_iter_t *iter;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (iter = ping_iterator_get(g_oss->pings->ping_handle); iter; iter = ping_iterator_next(iter)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              size_t len = BUFLEN;</span><br><span style="color: hsl(120, 100%, 40%);">+          /* hostname as it was supplied via vty 'ping' entry */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (ping_iterator_get_info(iter, PING_INFO_USERNAME, buf, &len))</span><br><span style="color: hsl(120, 100%, 40%);">+                  return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, "ping %s%s", buf, 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%);">+   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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/***********************************************************************</span><br><span style="color: hsl(120, 100%, 40%);">+ * Runtime Code</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%);">+/* called once on startup before config file parsing */</span><br><span style="color: hsl(120, 100%, 40%);">+int osysmon_ping_init()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(CONFIG_NODE, &cfg_ping_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(CONFIG_NODE, &cfg_no_ping_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_node(&ping_node, config_write_ping);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    g_oss->pings = talloc_zero(NULL, struct ping_state);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!g_oss->pings)</span><br><span style="color: hsl(120, 100%, 40%);">+         return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     g_oss->pings->ping_handle = ping_construct();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (g_oss->pings->ping_handle)</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%);">+   return -EINVAL;</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%);">+/* called periodically */</span><br><span style="color: hsl(120, 100%, 40%);">+int osysmon_ping_poll(struct value_node *parent)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  char buf[BUFLEN];</span><br><span style="color: hsl(120, 100%, 40%);">+     struct value_node *vn_host;</span><br><span style="color: hsl(120, 100%, 40%);">+   int num_host = iterator_count(g_oss->pings->ping_handle);</span><br><span style="color: hsl(120, 100%, 40%);">+       pingobj_iter_t *iter;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct value_node *vn_ping = value_node_add(parent, "ping", NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!vn_ping)</span><br><span style="color: hsl(120, 100%, 40%);">+         return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     for (iter = ping_iterator_get(g_oss->pings->ping_handle); iter; iter = ping_iterator_next(iter)) {</span><br><span style="color: hsl(120, 100%, 40%);">+              size_t len = BUFLEN;</span><br><span style="color: hsl(120, 100%, 40%);">+          int rc = ping_iterator_get_info(iter, PING_INFO_USERNAME, buf, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             vn_host = value_node_find_or_add(vn_ping, talloc_strdup(vn_ping, buf));</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!vn_host)</span><br><span style="color: hsl(120, 100%, 40%);">+                 return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             len = BUFLEN; /* IP address is looked up on-call, even 40 bytes should be enough */</span><br><span style="color: hsl(120, 100%, 40%);">+           rc = ping_iterator_get_info(iter, PING_INFO_ADDRESS, buf, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (rc)</span><br><span style="color: hsl(120, 100%, 40%);">+                       return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             value_node_add(vn_host, "IP", buf);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               add_drop(iter, vn_host);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Parameters below might be absent from output depending on the host reachability: */</span><br><span style="color: hsl(120, 100%, 40%);">+                add_latency(iter, vn_host);</span><br><span style="color: hsl(120, 100%, 40%);">+           add_ttl(iter, vn_host);</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 (num_host)</span><br><span style="color: hsl(120, 100%, 40%);">+         return ping_send(g_oss->pings->ping_handle);</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></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12710">change 12710</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/12710"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sysmon </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Ife32540b532fb54368f63c78fb7837b84d4e8c76 </div>
<div style="display:none"> Gerrit-Change-Number: 12710 </div>
<div style="display:none"> Gerrit-PatchSet: 10 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>