<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/26454">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">select: gather statistics for TCP connections<br><br>osmocom applications are deployed in a variety of different situations.<br>Dependung on the medium that interconnects the network components<br>unexpected behaviour may occur. To debug problems with the<br>interconnection between network components it might help to monitor the<br>health of the related TCP connections. This can be done on a lower level<br>so that any TCP connection that is handled by an osmocom process can be<br>monitored through stats items.<br><br>Change-Id: I1416f95aff2adcf13689646b7574845de169fa3d<br>Related: SYS#5701<br>---<br>M include/osmocom/core/select.h<br>M src/Makefile.am<br>M src/select.c<br>A src/stats_tcp.c<br>A src/stats_tcp.h<br>5 files changed, 192 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/54/26454/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/core/select.h b/include/osmocom/core/select.h</span><br><span>index 980bc97..57aee39 100644</span><br><span>--- a/include/osmocom/core/select.h</span><br><span>+++ b/include/osmocom/core/select.h</span><br><span>@@ -45,6 +45,9 @@</span><br><span> unsigned int priv_nr;</span><br><span> /*! human-readable name of this fd (optional) */</span><br><span> const char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! statistics associated with this fd</span><br><span style="color: hsl(120, 100%, 40%);">+ * (automatically managed by libosmocore) */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_stat_item_group *priv_stats;</span><br><span> };</span><br><span> </span><br><span> void osmo_fd_setup(struct osmo_fd *ofd, int fd, unsigned int when,</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index 4bda456..519029d 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -22,6 +22,7 @@</span><br><span> conv.c application.c rbtree.c strrb.c \</span><br><span> loggingrb.c crc8gen.c crc16gen.c crc32gen.c crc64gen.c \</span><br><span> macaddr.c stat_item.c stats.c stats_statsd.c prim.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ stats_tcp.c \</span><br><span> conv_acc.c conv_acc_generic.c sercomm.c prbs.c \</span><br><span> isdnhdlc.c \</span><br><span> tdef.c \</span><br><span>@@ -65,6 +66,7 @@</span><br><span> conv_acc_neon_impl.h \</span><br><span> crcXXgen.c.tpl \</span><br><span> stat_item_internal.h \</span><br><span style="color: hsl(120, 100%, 40%);">+ stats_tcp.h \</span><br><span> $(NULL)</span><br><span> </span><br><span> libosmocore_la_LDFLAGS = -version-info $(LIBVERSION) -no-undefined</span><br><span>diff --git a/src/select.c b/src/select.c</span><br><span>index f7eb5ea..6627c0b 100644</span><br><span>--- a/src/select.c</span><br><span>+++ b/src/select.c</span><br><span>@@ -38,6 +38,8 @@</span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stat_item.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "stats_tcp.h"</span><br><span> </span><br><span> #include "../config.h"</span><br><span> </span><br><span>@@ -168,6 +170,9 @@</span><br><span> g_poll.num_registered++;</span><br><span> #endif /* FORCE_IO_SELECT */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Ensure that priv_stats is set to NULL. */</span><br><span style="color: hsl(120, 100%, 40%);">+ fd->priv_stats = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> llist_add_tail(&fd->list, &osmo_fds);</span><br><span> </span><br><span> return 0;</span><br><span>@@ -186,6 +191,12 @@</span><br><span> #ifndef FORCE_IO_SELECT</span><br><span> g_poll.num_registered--;</span><br><span> #endif /* FORCE_IO_SELECT */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* If existant, free any statistical data */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (fd->priv_stats) {</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_group_free(fd->priv_stats);</span><br><span style="color: hsl(120, 100%, 40%);">+ fd->priv_stats = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> /*! Close a file descriptor, mark it as closed + unregister from select loop abstraction</span><br><span>@@ -373,6 +384,10 @@</span><br><span> unsigned int n_poll;</span><br><span> int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#if !defined(EMBEDDED)</span><br><span style="color: hsl(120, 100%, 40%);">+ stats_tcp_poll(&osmo_fds);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif /* !EMBEDDED */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* prepare read and write fdsets */</span><br><span> n_poll = poll_fill_fds();</span><br><span> </span><br><span>diff --git a/src/stats_tcp.c b/src/stats_tcp.c</span><br><span>new file mode 100644</span><br><span>index 0000000..d35dcb2</span><br><span>--- /dev/null</span><br><span>+++ b/src/stats_tcp.c</span><br><span>@@ -0,0 +1,167 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom - s.f.m.c. GmbH</span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Philipp Maier <pmaier@sysmocom.de></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 along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \addtogroup stats</span><br><span style="color: hsl(120, 100%, 40%);">+ * @{</span><br><span style="color: hsl(120, 100%, 40%);">+ * \file stats_tcp.c */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include "config.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#if !defined(EMBEDDED)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/types.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/stat.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/in.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <netinet/ip.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <linux/tcp.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/select.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stat_item.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "stats_tcp.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum {</span><br><span style="color: hsl(120, 100%, 40%);">+ STATS_TCP_UNACKED,</span><br><span style="color: hsl(120, 100%, 40%);">+ STATS_TCP_RETRANS,</span><br><span style="color: hsl(120, 100%, 40%);">+ STATS_TCP_RTT,</span><br><span style="color: hsl(120, 100%, 40%);">+ STATS_TCP_RCV_RTT,</span><br><span style="color: hsl(120, 100%, 40%);">+ STATS_TCP_NOTSENT_BYTES,</span><br><span style="color: hsl(120, 100%, 40%);">+ STATS_TCP_RWND_LIMITED,</span><br><span style="color: hsl(120, 100%, 40%);">+ STATS_TCP_REORD_SEEN,</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%);">+struct stats_tcp_entry {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct llist_head entry;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_stat_item_group *stats_tcp;</span><br><span style="color: hsl(120, 100%, 40%);">+ int fd;</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_stat_item_desc stats_tcp_item_desc[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [STATS_TCP_UNACKED] = { "tcp:unacked", "unacknowledged packets", "", 60, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+ [STATS_TCP_RETRANS] = { "tcp:retrans", "retransmitted packets", "", 60, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+ [STATS_TCP_RTT] = { "tcp:rtt", "roundtrip-time", "", 60, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+ [STATS_TCP_RCV_RTT] = { "tcp:rcv_rtt", "roundtrip-time (receive)", "", 60, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+ [STATS_TCP_NOTSENT_BYTES] = { "tcp:notsent_bytes", "bytes not yet sent", "", 60, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+ [STATS_TCP_RWND_LIMITED] = { "tcp:rwnd_limited", "time (usec) limited by receive window", "", 60, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+ [STATS_TCP_REORD_SEEN] = { "tcp:sndbuf_limited", "reordering events seen", "", 60, 0 },</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_stat_item_group_desc stats_tcp_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .group_name_prefix = "tcp",</span><br><span style="color: hsl(120, 100%, 40%);">+ .group_description = "stats tcp",</span><br><span style="color: hsl(120, 100%, 40%);">+ .class_id = OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(120, 100%, 40%);">+ .num_items = ARRAY_SIZE(stats_tcp_item_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+ .item_desc = stats_tcp_item_desc,</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 void fill_stats(struct osmo_fd *ufd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct tcp_info tcp_info;</span><br><span style="color: hsl(120, 100%, 40%);">+ socklen_t tcp_info_len = sizeof(tcp_info);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = getsockopt(ufd->fd, IPPROTO_TCP, TCP_INFO, &tcp_info, &tcp_info_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_set(osmo_stat_item_group_get_item(ufd->priv_stats, STATS_TCP_UNACKED), tcp_info.tcpi_unacked);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_set(osmo_stat_item_group_get_item(ufd->priv_stats, STATS_TCP_RETRANS), tcp_info.tcpi_retrans);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_set(osmo_stat_item_group_get_item(ufd->priv_stats, STATS_TCP_RTT), tcp_info.tcpi_rtt);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_set(osmo_stat_item_group_get_item(ufd->priv_stats, STATS_TCP_RCV_RTT),</span><br><span style="color: hsl(120, 100%, 40%);">+ tcp_info.tcpi_notsent_bytes);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_set(osmo_stat_item_group_get_item(ufd->priv_stats, STATS_TCP_NOTSENT_BYTES),</span><br><span style="color: hsl(120, 100%, 40%);">+ tcp_info.tcpi_rwnd_limited);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_set(osmo_stat_item_group_get_item(ufd->priv_stats, STATS_TCP_RWND_LIMITED),</span><br><span style="color: hsl(120, 100%, 40%);">+ tcp_info.tcpi_sndbuf_limited);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_set(osmo_stat_item_group_get_item(ufd->priv_stats, STATS_TCP_REORD_SEEN),</span><br><span style="color: hsl(120, 100%, 40%);">+ tcp_info.tcpi_reord_seen);</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%);">+/* Check if the socket we dealing with is associated with a stream (TCP) */</span><br><span style="color: hsl(120, 100%, 40%);">+static bool is_stream(struct osmo_fd *ufd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct stat fd_stat;</span><br><span style="color: hsl(120, 100%, 40%);">+ int so_type = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ socklen_t so_type_len = sizeof(so_type);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = fstat(ufd->fd, &fd_stat);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</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 (S_ISSOCK(fd_stat.st_mode)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = getsockopt(ufd->fd, SOL_SOCKET, SO_TYPE, &so_type, &so_type_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</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 (so_type == SOCK_STREAM)</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%);">+ return false;</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%);">+/* Check if the socket is connected to a remote end. */</span><br><span style="color: hsl(120, 100%, 40%);">+static bool is_connected(struct osmo_fd *ufd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (osmo_sock_get_ip_and_port(ufd->fd, NULL, 0, NULL, 0, false) != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</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%);">+void add_stats(struct osmo_fd *ufd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ char stat_name[256];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ufd->priv_stats = osmo_stat_item_group_alloc(NULL, &stats_tcp_desc, ufd->fd);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(ufd->priv_stats);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ufd->name)</span><br><span style="color: hsl(120, 100%, 40%);">+ snprintf(stat_name, sizeof(stat_name), "%s,%s", ufd->name, osmo_sock_get_name2(ufd->fd));</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ snprintf(stat_name, sizeof(stat_name), "%s", osmo_sock_get_name2(ufd->fd));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_stat_item_group_set_name(ufd->priv_stats, stat_name);</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%);">+void stats_tcp_poll(struct llist_head *osmo_fds)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct osmo_fd *ufd;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(ufd, osmo_fds, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ufd->priv_stats == NULL && is_stream(ufd) && is_connected(ufd))</span><br><span style="color: hsl(120, 100%, 40%);">+ add_stats(ufd);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ufd->priv_stats)</span><br><span style="color: hsl(120, 100%, 40%);">+ fill_stats(ufd);</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%);">+#endif /* !EMBEDDED */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* @} */</span><br><span>diff --git a/src/stats_tcp.h b/src/stats_tcp.h</span><br><span>new file mode 100644</span><br><span>index 0000000..1c0b475</span><br><span>--- /dev/null</span><br><span>+++ b/src/stats_tcp.h</span><br><span>@@ -0,0 +1,5 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct llist_head;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void stats_tcp_poll(struct llist_head *osmo_fds);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/26454">change 26454</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/libosmocore/+/26454"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I1416f95aff2adcf13689646b7574845de169fa3d </div>
<div style="display:none"> Gerrit-Change-Number: 26454 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>