<p>neels <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/25224">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  neels: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  laforge: Looks good to me, but someone else must approve

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">CTRL: expose stat_item groups on CTRL<br><br>Expose all stat items as RO variables of the form<br><br>  stat_item.last.group_name.N.item_name<br>  stat_item.last.group_name.by_name.idx_name.item_name<br><br>For (possibly contrived) example:<br><br>  stat_item.last.trunk.0.endpoints:used<br>  stat_item.last.trunk.by_name.virtual-0.endpoints:used<br><br>Include the 'last' token to ease future extension, like 'max'.<br>Put this token in the beginning, similarly to rate_ctr variables, which<br>begin with 'per_sec', 'per_hour', ...<br><br>Related: SYS#5542<br>Related: I178dcf4516606aa561d47b06061b8a416d3c40cf (osmo-ttcn3-hacks)<br>Related: Ic1b35b7406547f92818afe399a2383d154576409 (osmo-ttcn3-hacks)<br>Change-Id: Idace66b37492fe96b2f2e133a69cac7960ca279c<br>---<br>M src/ctrl/control_if.c<br>1 file changed, 99 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/ctrl/control_if.c b/src/ctrl/control_if.c</span><br><span>index 0a893ba..5fda28f 100644</span><br><span>--- a/src/ctrl/control_if.c</span><br><span>+++ b/src/ctrl/control_if.c</span><br><span>@@ -35,6 +35,7 @@</span><br><span> #include <string.h></span><br><span> #include <time.h></span><br><span> #include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <limits.h></span><br><span> </span><br><span> #include <arpa/inet.h></span><br><span> </span><br><span>@@ -53,6 +54,7 @@</span><br><span> </span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stat_item.h></span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/counter.h></span><br><span> #include <osmocom/core/talloc.h></span><br><span>@@ -729,6 +731,100 @@</span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Expose all stat_item groups on CTRL, as read-only variables of the form:</span><br><span style="color: hsl(120, 100%, 40%);">+ * stat_item.(last|...).group_name.N.item_name</span><br><span style="color: hsl(120, 100%, 40%);">+ * stat_item.(last|...).group_name.by_name.group_idx_name.item_name</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+CTRL_CMD_DEFINE_RO(stat_item, "stat_item *");</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_stat_item(struct ctrl_cmd *cmd, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     char *dup;</span><br><span style="color: hsl(120, 100%, 40%);">+    char *saveptr;</span><br><span style="color: hsl(120, 100%, 40%);">+        char *value_type;</span><br><span style="color: hsl(120, 100%, 40%);">+     char *group_name;</span><br><span style="color: hsl(120, 100%, 40%);">+     char *group_idx_str;</span><br><span style="color: hsl(120, 100%, 40%);">+  char *item_name;</span><br><span style="color: hsl(120, 100%, 40%);">+      char *tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+    int32_t val;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_stat_item_group *statg;</span><br><span style="color: hsl(120, 100%, 40%);">+   const struct osmo_stat_item *stat_item;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* cmd will be freed in control_if.c after handling here, so no need to free the dup string. */</span><br><span style="color: hsl(120, 100%, 40%);">+       dup = talloc_strdup(cmd, cmd->variable);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!dup) {</span><br><span style="color: hsl(120, 100%, 40%);">+           cmd->reply = "OOM";</span><br><span style="color: hsl(120, 100%, 40%);">+              return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Split off the first "stat_item." part */</span><br><span style="color: hsl(120, 100%, 40%);">+ tmp = strtok_r(dup, ".", &saveptr);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!tmp || strcmp(tmp, "stat_item") != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          goto format_error;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Split off the "last." part (validated further below) */</span><br><span style="color: hsl(120, 100%, 40%);">+  value_type = strtok_r(NULL, ".", &saveptr);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!value_type)</span><br><span style="color: hsl(120, 100%, 40%);">+              goto format_error;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Split off the "group_name." part */</span><br><span style="color: hsl(120, 100%, 40%);">+      group_name = strtok_r(NULL, ".", &saveptr);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!group_name)</span><br><span style="color: hsl(120, 100%, 40%);">+              goto format_error;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Split off the "N." part */</span><br><span style="color: hsl(120, 100%, 40%);">+       group_idx_str = strtok_r(NULL, ".", &saveptr);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!group_idx_str)</span><br><span style="color: hsl(120, 100%, 40%);">+           goto format_error;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (strcmp(group_idx_str, "by_name") == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* The index is not given by "N" but by "by_name.foo". Get the "foo" idx-name */</span><br><span style="color: hsl(120, 100%, 40%);">+                group_idx_str = strtok_r(NULL, ".", &saveptr);</span><br><span style="color: hsl(120, 100%, 40%);">+          statg = osmo_stat_item_get_group_by_name_idxname(group_name, group_idx_str);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              int idx;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (osmo_str_to_int(&idx, group_idx_str, 10, 0, INT_MAX))</span><br><span style="color: hsl(120, 100%, 40%);">+                 goto format_error;</span><br><span style="color: hsl(120, 100%, 40%);">+            statg = osmo_stat_item_get_group_by_name_idx(group_name, idx);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!statg) {</span><br><span style="color: hsl(120, 100%, 40%);">+         cmd->reply = "Stat group with given name and index not found";</span><br><span style="color: hsl(120, 100%, 40%);">+           return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Split off the "item_name" part */</span><br><span style="color: hsl(120, 100%, 40%);">+        item_name = strtok_r(NULL, ".", &saveptr);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!item_name)</span><br><span style="color: hsl(120, 100%, 40%);">+               goto format_error;</span><br><span style="color: hsl(120, 100%, 40%);">+    stat_item = osmo_stat_item_get_by_name(statg, item_name);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!stat_item) {</span><br><span style="color: hsl(120, 100%, 40%);">+             cmd->reply = "No such stat item found";</span><br><span style="color: hsl(120, 100%, 40%);">+          return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   tmp = strtok_r(NULL, "", &saveptr);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (tmp) {</span><br><span style="color: hsl(120, 100%, 40%);">+            cmd->reply = "Garbage after stat item name";</span><br><span style="color: hsl(120, 100%, 40%);">+             return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!strcmp(value_type, "last"))</span><br><span style="color: hsl(120, 100%, 40%);">+            val = osmo_stat_item_get_last(stat_item);</span><br><span style="color: hsl(120, 100%, 40%);">+     else</span><br><span style="color: hsl(120, 100%, 40%);">+          goto format_error;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  cmd->reply = talloc_asprintf(cmd, "%"PRIu32, val);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (!cmd->reply) {</span><br><span style="color: hsl(120, 100%, 40%);">+         cmd->reply = "OOM";</span><br><span style="color: hsl(120, 100%, 40%);">+              return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return CTRL_CMD_REPLY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+format_error:</span><br><span style="color: hsl(120, 100%, 40%);">+       cmd->reply = "Stat item must be of form stat_item.type.group_name.N.item_name,"</span><br><span style="color: hsl(120, 100%, 40%);">+          " e.g. 'stat_item.last.bsc.0.msc_num:connected'";</span><br><span style="color: hsl(120, 100%, 40%);">+   return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* counter */</span><br><span> CTRL_CMD_DEFINE(counter, "counter *");</span><br><span> static int get_counter(struct ctrl_cmd *cmd, void *data)</span><br><span>@@ -816,6 +912,9 @@</span><br><span>   ret = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_rate_ctr);</span><br><span>   if (ret)</span><br><span>             goto err_vec;</span><br><span style="color: hsl(120, 100%, 40%);">+ ret = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_stat_item);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ret)</span><br><span style="color: hsl(120, 100%, 40%);">+              goto err_vec;</span><br><span>        ret = ctrl_cmd_install(CTRL_NODE_ROOT, &cmd_counter);</span><br><span>    if (ret)</span><br><span>             goto err_vec;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/25224">change 25224</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/+/25224"/><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: Idace66b37492fe96b2f2e133a69cac7960ca279c </div>
<div style="display:none"> Gerrit-Change-Number: 25224 </div>
<div style="display:none"> Gerrit-PatchSet: 10 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>