<p>Max has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12710">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add ping probe support<br><br>If liboping is available during ./configure than 'ping XXX' entries will<br>be supported in .cfg 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><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, 278 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sysmon refs/changes/10/12710/1</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..be60a8e 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -111,6 +111,9 @@</span><br><span>    AC_SUBST([COVERAGE_LDFLAGS])</span><br><span> fi</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOPING, liboping, found_oping=yes, [AC_DEFINE([NO_OPING], [1], [Don't use liboping])])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL(HAVE_OPING, test "$found_oping" = yes)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AC_ARG_ENABLE(profile,</span><br><span>            [AS_HELP_STRING([--enable-profile], [Compile with profiling support enabled], )],</span><br><span>            [profile=$enableval], [profile="no"])</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index 412337b..2e5f260 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -37,6 +37,12 @@</span><br><span>        osysmon_main.c \</span><br><span>     $(NULL)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+if HAVE_OPING</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_sysmon_SOURCES += osysmon_ping.c</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_sysmon_LDADD += $(LIBOPING_LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_sysmon_CFLAGS = $(AM_CFLAGS) $(LIBOPING_CFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> osmo_ctrl_client_SOURCES = \</span><br><span>      simple_ctrl.c \</span><br><span>      osmo-ctrl-client.c \</span><br><span>diff --git a/src/osysmon.h b/src/osysmon.h</span><br><span>index 735b11e..8b17972 100644</span><br><span>--- a/src/osysmon.h</span><br><span>+++ b/src/osysmon.h</span><br><span>@@ -6,9 +6,11 @@</span><br><span> </span><br><span> #include <stdbool.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include "config.h"</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 +20,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 +31,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 +46,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..96dfa69 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,9 @@</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%);">+#ifndef NO_OPING</span><br><span style="color: hsl(120, 100%, 40%);">+        ping_init = osysmon_ping_init();</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</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 +236,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%);">+#ifndef NO_OPING</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%);">+#endif</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..eaa3d1b</span><br><span>--- /dev/null</span><br><span>+++ b/src/osysmon_ping.c</span><br><span>@@ -0,0 +1,254 @@</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%);">+/* 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 = ping_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 != ping_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%);">+                   ping_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%);">+                    ping_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 = ping_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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </div>