<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/25224">View Change</a></p><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><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>Change-Id: Idace66b37492fe96b2f2e133a69cac7960ca279c<br>---<br>M src/ctrl/control_if.c<br>1 file changed, 100 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/24/25224/1</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..782f369 100644</span><br><span>--- a/src/ctrl/control_if.c</span><br><span>+++ b/src/ctrl/control_if.c</span><br><span>@@ -53,6 +53,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 +730,102 @@</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%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+CTRL_CMD_DEFINE(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%);">+  int idx;</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%);">+     group_idx_str = strtok_r(NULL, ".", &saveptr);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!group_name || !group_idx_str)</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%);">+       idx = atoi(group_idx_str);</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%);">+        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%);">+</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 style="color: hsl(120, 100%, 40%);">+static int set_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%);">+    cmd->reply = "Stat items are read-only";</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%);">+static int verify_stat_item(struct ctrl_cmd *cmd, const char *value, void *data)</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 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 +913,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: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>