<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/20815">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">vty: introduce the expert mode and a command to enable it<br><br>Change-Id: Ie69c2a19b22fb31d7bd7f6412f0aeac86ea5048f<br>Related: SYS#4910<br>---<br>M include/osmocom/vty/command.h<br>M include/osmocom/vty/vty.h<br>M src/vty/command.c<br>M tests/vty/vty_transcript_test.c<br>M tests/vty/vty_transcript_test.vty<br>5 files changed, 126 insertions(+), 13 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/15/20815/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/vty/command.h b/include/osmocom/vty/command.h</span><br><span>index 2cb45dd..92701fc 100644</span><br><span>--- a/include/osmocom/vty/command.h</span><br><span>+++ b/include/osmocom/vty/command.h</span><br><span>@@ -24,6 +24,7 @@</span><br><span> #pragma once</span><br><span> </span><br><span> #include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span> #include <sys/types.h></span><br><span> #include "vector.h"</span><br><span> </span><br><span>@@ -65,6 +66,9 @@</span><br><span> </span><br><span>     /*! VTY application information */</span><br><span>   const struct vty_app_info *app_info;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /*! Whether the expert mode is enabled. */</span><br><span style="color: hsl(120, 100%, 40%);">+    bool expert_mode;</span><br><span> };</span><br><span> </span><br><span> /*! There are some command levels which called from command node. */</span><br><span>diff --git a/include/osmocom/vty/vty.h b/include/osmocom/vty/vty.h</span><br><span>index 4e83b1b..6a82d7e 100644</span><br><span>--- a/include/osmocom/vty/vty.h</span><br><span>+++ b/include/osmocom/vty/vty.h</span><br><span>@@ -32,7 +32,7 @@</span><br><span> #define VTY_CMD_USR_ATTR_NUM 32</span><br><span> /* Flag characters reserved for global VTY attributes */</span><br><span> #define VTY_CMD_ATTR_FLAGS_RESERVED \</span><br><span style="color: hsl(0, 100%, 40%);">-        { '.', '!', '@' }</span><br><span style="color: hsl(120, 100%, 40%);">+     { '.', '!', '@', '^' }</span><br><span> </span><br><span> /*! VTY events */</span><br><span> enum event {</span><br><span>diff --git a/src/vty/command.c b/src/vty/command.c</span><br><span>index d8649f5..0edfce5 100644</span><br><span>--- a/src/vty/command.c</span><br><span>+++ b/src/vty/command.c</span><br><span>@@ -624,7 +624,7 @@</span><br><span> </span><br><span> static const struct value_string cmd_attr_desc[] = {</span><br><span>   { CMD_ATTR_DEPRECATED,          "This command is deprecated" },</span><br><span style="color: hsl(0, 100%, 40%);">-       { CMD_ATTR_HIDDEN,              "This command is hidden" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { CMD_ATTR_HIDDEN,              "This command is hidden (check expert mode)" },</span><br><span>    { CMD_ATTR_IMMEDIATE,           "This command applies immediately" },</span><br><span>      { CMD_ATTR_NODE_EXIT,           "This command applies on VTY node exit" },</span><br><span>         /* CMD_ATTR_LIB_COMMAND is intentionally skipped */</span><br><span>@@ -639,6 +639,8 @@</span><br><span> static char cmd_attr_get_flag(unsigned int attr)</span><br><span> {</span><br><span>   switch (attr) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case CMD_ATTR_HIDDEN:</span><br><span style="color: hsl(120, 100%, 40%);">+         return '^';</span><br><span>  case CMD_ATTR_IMMEDIATE:</span><br><span>             return '!';</span><br><span>  case CMD_ATTR_NODE_EXIT:</span><br><span>@@ -796,8 +798,11 @@</span><br><span>                      elem = vector_slot(cnode->cmd_vector, j);</span><br><span>                         if (!vty_command_is_common(elem))</span><br><span>                            continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (!(elem->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN)))</span><br><span style="color: hsl(0, 100%, 40%);">-                             vty_dump_element(elem, print_func, data, newline);</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (elem->attr & CMD_ATTR_DEPRECATED)</span><br><span style="color: hsl(120, 100%, 40%);">+                          continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (!host.expert_mode && (elem->attr & CMD_ATTR_HIDDEN))</span><br><span style="color: hsl(120, 100%, 40%);">+                               continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     vty_dump_element(elem, print_func, data, newline);</span><br><span>           }</span><br><span>    }</span><br><span>    print_func(data, "  </node>%s", newline);</span><br><span>@@ -834,8 +839,11 @@</span><br><span>                     elem = vector_slot(cnode->cmd_vector, j);</span><br><span>                         if (vty_command_is_common(elem))</span><br><span>                             continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (!(elem->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN)))</span><br><span style="color: hsl(0, 100%, 40%);">-                             vty_dump_element(elem, print_func, data, newline);</span><br><span style="color: hsl(120, 100%, 40%);">+                    if (elem->attr & CMD_ATTR_DEPRECATED)</span><br><span style="color: hsl(120, 100%, 40%);">+                          continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (!host.expert_mode && (elem->attr & CMD_ATTR_HIDDEN))</span><br><span style="color: hsl(120, 100%, 40%);">+                               continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     vty_dump_element(elem, print_func, data, newline);</span><br><span>           }</span><br><span> </span><br><span>                print_func(data, "  </node>%s", newline);</span><br><span>@@ -2007,7 +2015,9 @@</span><br><span>            if (!cmd_element)</span><br><span>                    continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           if (cmd_element->attr & (CMD_ATTR_DEPRECATED|CMD_ATTR_HIDDEN))</span><br><span style="color: hsl(120, 100%, 40%);">+         if (cmd_element->attr & CMD_ATTR_DEPRECATED)</span><br><span style="color: hsl(120, 100%, 40%);">+                   continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!host.expert_mode && (cmd_element->attr & CMD_ATTR_HIDDEN))</span><br><span>                       continue;</span><br><span> </span><br><span>                strvec = cmd_element->strvec;</span><br><span>@@ -2867,7 +2877,10 @@</span><br><span> }</span><br><span> </span><br><span> /* Enable command */</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(enable, config_enable_cmd, "enable", "Turn on privileged mode command\n")</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(enable, config_enable_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "enable [expert-mode]",</span><br><span style="color: hsl(120, 100%, 40%);">+      "Turn on privileged mode command\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Enable the expert mode (show hidden commands)\n")</span><br><span> {</span><br><span>       /* If enable password is NULL, change to ENABLE_NODE */</span><br><span>      if ((host.enable == NULL && host.enable_encrypt == NULL) ||</span><br><span>@@ -2876,6 +2889,8 @@</span><br><span>  else</span><br><span>                 vty->node = AUTH_ENABLE_NODE;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  host.expert_mode = argc > 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -2885,6 +2900,9 @@</span><br><span> {</span><br><span>    if (vty->node == ENABLE_NODE)</span><br><span>             vty->node = VIEW_NODE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   host.expert_mode = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -3083,7 +3101,9 @@</span><br><span> </span><br><span>                     if ((cmd = vector_slot(cnode->cmd_vector, i)) == NULL)</span><br><span>                            continue;</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (cmd->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN))</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (cmd->attr & CMD_ATTR_DEPRECATED)</span><br><span style="color: hsl(120, 100%, 40%);">+                           continue;</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (!host.expert_mode && (cmd->attr & CMD_ATTR_HIDDEN))</span><br><span>                               continue;</span><br><span>                    if (~cmd->usrattr & ((unsigned)1 << f))</span><br><span>                                 continue;</span><br><span>@@ -3111,7 +3131,9 @@</span><br><span>    char *ptr = &char_mask[0];</span><br><span> </span><br><span>   /* Mutually exclusive global attributes */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (cmd->attr & CMD_ATTR_IMMEDIATE)</span><br><span style="color: hsl(120, 100%, 40%);">+    if (cmd->attr & CMD_ATTR_HIDDEN)</span><br><span style="color: hsl(120, 100%, 40%);">+               *(ptr++) = cmd_attr_get_flag(CMD_ATTR_HIDDEN);</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (cmd->attr & CMD_ATTR_IMMEDIATE)</span><br><span>              *(ptr++) = cmd_attr_get_flag(CMD_ATTR_IMMEDIATE);</span><br><span>    else if (cmd->attr & CMD_ATTR_NODE_EXIT)</span><br><span>              *(ptr++) = cmd_attr_get_flag(CMD_ATTR_NODE_EXIT);</span><br><span>@@ -3170,7 +3192,9 @@</span><br><span>    for (i = 0; i < vector_active(cnode->cmd_vector); i++) {</span><br><span>               if ((cmd = vector_slot(cnode->cmd_vector, i)) == NULL)</span><br><span>                    continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (cmd->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN))</span><br><span style="color: hsl(120, 100%, 40%);">+               if (cmd->attr & CMD_ATTR_DEPRECATED)</span><br><span style="color: hsl(120, 100%, 40%);">+                   continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!host.expert_mode && (cmd->attr & CMD_ATTR_HIDDEN))</span><br><span>                       continue;</span><br><span>            if (!argc)</span><br><span>                   vty_out(vty, "  %s%s", cmd->string, VTY_NEWLINE);</span><br><span>@@ -4244,6 +4268,7 @@</span><br><span>       host.lines = -1;</span><br><span>     host.motd = default_motd;</span><br><span>    host.motdfile = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ host.expert_mode = false;</span><br><span> </span><br><span>        /* Install top nodes. */</span><br><span>     install_node_bare(&view_node, NULL);</span><br><span>diff --git a/tests/vty/vty_transcript_test.c b/tests/vty/vty_transcript_test.c</span><br><span>index abe3702..c9ecf18 100644</span><br><span>--- a/tests/vty/vty_transcript_test.c</span><br><span>+++ b/tests/vty/vty_transcript_test.c</span><br><span>@@ -232,6 +232,23 @@</span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_DEPRECATED(cfg_attr_deprecated,</span><br><span style="color: hsl(120, 100%, 40%);">+            cfg_attr_deprecated_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+              "foo-deprecated",</span><br><span style="color: hsl(120, 100%, 40%);">+           "This command is deprecated\n")</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%);">+DEFUN_HIDDEN(cfg_attr_hidden,</span><br><span style="color: hsl(120, 100%, 40%);">+            cfg_attr_hidden_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+          "foo-hidden [expert-mode]",</span><br><span style="color: hsl(120, 100%, 40%);">+         "This command is hidden\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "But can be seen in the expert mode\n")</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> DEFUN_ATTR(cfg_attr_immediate, cfg_attr_immediate_cmd,</span><br><span>      "foo-immediate",</span><br><span>           "Applies immediately\n",</span><br><span>@@ -293,6 +310,15 @@</span><br><span>         return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_ATTR_USRATTR(cfg_attr_hidden_app_attr_unbelievable,</span><br><span style="color: hsl(120, 100%, 40%);">+                  cfg_attr_hidden_app_attr_unbelievable_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+            CMD_ATTR_HIDDEN, X(TEST_ATTR_UNBELIEVABLE),</span><br><span style="color: hsl(120, 100%, 40%);">+                   "app-hidden-unbelievable",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "Hidden, but still unbelievable help message\n")</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> static void init_vty_cmds()</span><br><span> {</span><br><span>         install_element_ve(&single0_cmd);</span><br><span>@@ -302,6 +328,8 @@</span><br><span> </span><br><span>      install_element(CONFIG_NODE, &cfg_attr_test_cmd);</span><br><span>        install_node(&attr_test_node, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element(ATTR_TEST_NODE, &cfg_attr_deprecated_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(ATTR_TEST_NODE, &cfg_attr_hidden_cmd);</span><br><span>   install_element(ATTR_TEST_NODE, &cfg_attr_immediate_cmd);</span><br><span>        install_element(ATTR_TEST_NODE, &cfg_attr_node_exit_cmd);</span><br><span> </span><br><span>@@ -311,6 +339,7 @@</span><br><span> </span><br><span>  install_element(ATTR_TEST_NODE, &cfg_app_attr_unbelievable_magnificent_cmd);</span><br><span>     install_element(ATTR_TEST_NODE, &cfg_app_attr_unbelievable_wonderful_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element(ATTR_TEST_NODE, &cfg_attr_hidden_app_attr_unbelievable_cmd);</span><br><span> }</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span>diff --git a/tests/vty/vty_transcript_test.vty b/tests/vty/vty_transcript_test.vty</span><br><span>index 2c618d8..7b8241e 100644</span><br><span>--- a/tests/vty/vty_transcript_test.vty</span><br><span>+++ b/tests/vty/vty_transcript_test.vty</span><br><span>@@ -87,6 +87,7 @@</span><br><span> </span><br><span> vty_transcript_test> show vty-attributes</span><br><span>   Global attributes:</span><br><span style="color: hsl(120, 100%, 40%);">+    ^  This command is hidden (check expert mode)</span><br><span>     !  This command applies immediately</span><br><span>     @  This command applies on VTY node exit</span><br><span>   Library specific attributes:</span><br><span>@@ -104,7 +105,7 @@</span><br><span> vty_transcript_test(config)# attribute-test</span><br><span> </span><br><span> vty_transcript_test(config-attr-test)# list</span><br><span style="color: hsl(0, 100%, 40%);">-...</span><br><span style="color: hsl(120, 100%, 40%);">+... !foo-(hidden|deprecated)</span><br><span>   foo-immediate</span><br><span>   foo-node-exit</span><br><span>   app-unbelievable</span><br><span>@@ -112,9 +113,10 @@</span><br><span>   app-wonderful</span><br><span>   app-unbelievable-magnificent</span><br><span>   app-unbelievable-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+... !app-hidden-*</span><br><span> </span><br><span> vty_transcript_test(config-attr-test)# list with-flags</span><br><span style="color: hsl(0, 100%, 40%);">-...</span><br><span style="color: hsl(120, 100%, 40%);">+... !foo-(hidden|deprecated)</span><br><span>   ! ...  foo-immediate</span><br><span>   @ ...  foo-node-exit</span><br><span>   . u..  app-unbelievable</span><br><span>@@ -122,3 +124,56 @@</span><br><span>   . ..w  app-wonderful</span><br><span>   . um.  app-unbelievable-magnificent</span><br><span>   . u.w  app-unbelievable-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+... !app-hidden-*</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# foo-deprecated?</span><br><span style="color: hsl(120, 100%, 40%);">+% There is no matched command.</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# foo-hidden?</span><br><span style="color: hsl(120, 100%, 40%);">+% There is no matched command.</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# app-hidden-unbelievable?</span><br><span style="color: hsl(120, 100%, 40%);">+% There is no matched command.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# end</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test# disable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test> enable?</span><br><span style="color: hsl(120, 100%, 40%);">+  enable  Turn on privileged mode command</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test> enable ?</span><br><span style="color: hsl(120, 100%, 40%);">+  [expert-mode]  Enable the expert mode (show hidden commands)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test> enable expert-mode</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test# configure terminal</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config)# attribute-test</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# list</span><br><span style="color: hsl(120, 100%, 40%);">+... !foo-deprected</span><br><span style="color: hsl(120, 100%, 40%);">+  foo-hidden [expert-mode]</span><br><span style="color: hsl(120, 100%, 40%);">+  foo-immediate</span><br><span style="color: hsl(120, 100%, 40%);">+  foo-node-exit</span><br><span style="color: hsl(120, 100%, 40%);">+  app-unbelievable</span><br><span style="color: hsl(120, 100%, 40%);">+  app-magnificent</span><br><span style="color: hsl(120, 100%, 40%);">+  app-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+  app-unbelievable-magnificent</span><br><span style="color: hsl(120, 100%, 40%);">+  app-unbelievable-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+  app-hidden-unbelievable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# list with-flags</span><br><span style="color: hsl(120, 100%, 40%);">+... !foo-deprected</span><br><span style="color: hsl(120, 100%, 40%);">+  ^ ...  foo-hidden [expert-mode]</span><br><span style="color: hsl(120, 100%, 40%);">+  ! ...  foo-immediate</span><br><span style="color: hsl(120, 100%, 40%);">+  @ ...  foo-node-exit</span><br><span style="color: hsl(120, 100%, 40%);">+  . u..  app-unbelievable</span><br><span style="color: hsl(120, 100%, 40%);">+  . .m.  app-magnificent</span><br><span style="color: hsl(120, 100%, 40%);">+  . ..w  app-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+  . um.  app-unbelievable-magnificent</span><br><span style="color: hsl(120, 100%, 40%);">+  . u.w  app-unbelievable-wonderful</span><br><span style="color: hsl(120, 100%, 40%);">+  ^ u..  app-hidden-unbelievable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# foo-deprecated?</span><br><span style="color: hsl(120, 100%, 40%);">+% There is no matched command.</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# foo-hidden?</span><br><span style="color: hsl(120, 100%, 40%);">+  foo-hidden  This command is hidden</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# foo-hidden ?</span><br><span style="color: hsl(120, 100%, 40%);">+  [expert-mode]  But can be seen in the expert mode</span><br><span style="color: hsl(120, 100%, 40%);">+vty_transcript_test(config-attr-test)# app-hidden-unbelievable?</span><br><span style="color: hsl(120, 100%, 40%);">+  app-hidden-unbelievable  Hidden, but still unbelievable help message</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/20815">change 20815</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/+/20815"/><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: Ie69c2a19b22fb31d7bd7f6412f0aeac86ea5048f </div>
<div style="display:none"> Gerrit-Change-Number: 20815 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>