<p>osmith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/11199">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Add rate counters for call handling<br><br>This creates rate counters for:<br>* Initiated calls<br>* Failed calls<br>* Connected calls<br>* Released calls<br><br>Related: OS#1697<br>Change-Id: I6d7963266a93be631a4e0e03a39916d07a88fe01<br>---<br>A src/ctr.h<br>M src/main.c<br>M src/sip.c<br>M src/sip.h<br>4 files changed, 61 insertions(+), 11 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sip-connector refs/changes/99/11199/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/ctr.h b/src/ctr.h</span><br><span>new file mode 100644</span><br><span>index 0000000..b3460de</span><br><span>--- /dev/null</span><br><span>+++ b/src/ctr.h</span><br><span>@@ -0,0 +1,25 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stats.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%);">+      SIP_CTR_CALL_INITIATED,</span><br><span style="color: hsl(120, 100%, 40%);">+       SIP_CTR_CALL_FAILED,</span><br><span style="color: hsl(120, 100%, 40%);">+  SIP_CTR_CALL_CONNECTED,</span><br><span style="color: hsl(120, 100%, 40%);">+       SIP_CTR_CALL_RELEASED,</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 const struct rate_ctr_desc sip_ctr_description[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+     [SIP_CTR_CALL_INITIATED] = {"call:initiated", "Call(s) initiated."},</span><br><span style="color: hsl(120, 100%, 40%);">+      [SIP_CTR_CALL_FAILED] = {"call:failed", "Call(s) failed."},</span><br><span style="color: hsl(120, 100%, 40%);">+       [SIP_CTR_CALL_CONNECTED] = {"call:connected", "Call(s) connected."},</span><br><span style="color: hsl(120, 100%, 40%);">+      [SIP_CTR_CALL_RELEASED] = {"call:released", "Call(s) released."},</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 const struct rate_ctr_group_desc sip_ctrg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+        "sip-connector",</span><br><span style="color: hsl(120, 100%, 40%);">+    "SIP connector",</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(120, 100%, 40%);">+      ARRAY_SIZE(sip_ctr_description),</span><br><span style="color: hsl(120, 100%, 40%);">+      sip_ctr_description</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/src/main.c b/src/main.c</span><br><span>index 560995e..d07f51b 100644</span><br><span>--- a/src/main.c</span><br><span>+++ b/src/main.c</span><br><span>@@ -26,6 +26,7 @@</span><br><span> #include "mncc.h"</span><br><span> #include "app.h"</span><br><span> #include "call.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "ctr.h"</span><br><span> </span><br><span> #include <osmocom/core/application.h></span><br><span> #include <osmocom/core/utils.h></span><br><span>@@ -113,6 +114,7 @@</span><br><span> {</span><br><span>      int rc;</span><br><span>      GMainLoop *loop;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct rate_ctr_group *ctrg;</span><br><span> </span><br><span>     /* initialize osmocom */</span><br><span>     tall_mncc_ctx = talloc_named_const(NULL, 0, "MNCC CTX");</span><br><span>@@ -120,6 +122,14 @@</span><br><span>    osmo_init_logging2(tall_mncc_ctx, &mncc_sip_info);</span><br><span>       osmo_stats_init(tall_mncc_ctx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* init statistics */</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_init(tall_mncc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ ctrg = rate_ctr_group_alloc(tall_mncc_ctx, &sip_ctrg_desc, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!ctrg) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DAPP, LOGL_ERROR, "Cannot allocate global counter group!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  mncc_sip_vty_init();</span><br><span>         logging_vty_add_cmds(&mncc_sip_info);</span><br><span>    osmo_stats_vty_add_cmds(&mncc_sip_info);</span><br><span>@@ -144,7 +154,7 @@</span><br><span>   mncc_connection_start(&g_app.mncc.conn);</span><br><span> </span><br><span>     /* sofia sip */</span><br><span style="color: hsl(0, 100%, 40%);">- sip_agent_init(&g_app.sip.agent, &g_app);</span><br><span style="color: hsl(120, 100%, 40%);">+     sip_agent_init(&g_app.sip.agent, &g_app, ctrg);</span><br><span>      rc = sip_agent_start(&g_app.sip.agent);</span><br><span>  if (rc < 0)</span><br><span>               LOGP(DSIP, LOGL_ERROR,</span><br><span>diff --git a/src/sip.c b/src/sip.c</span><br><span>index adf20d8..e7eeed6 100644</span><br><span>--- a/src/sip.c</span><br><span>+++ b/src/sip.c</span><br><span>@@ -21,6 +21,7 @@</span><br><span> #include "sip.h"</span><br><span> #include "app.h"</span><br><span> #include "call.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "ctr.h"</span><br><span> #include "logging.h"</span><br><span> #include "sdp.h"</span><br><span> </span><br><span>@@ -77,6 +78,15 @@</span><br><span>  leg->state = SIP_CC_CONNECTED;</span><br><span>    other->connect_call(other);</span><br><span>       nua_ack(leg->nua_handle, TAG_END());</span><br><span style="color: hsl(120, 100%, 40%);">+       // rate_ctr_inc2(argent->ctrg, SIP_CTR_CALL_CONNECTED);</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 new_call_failure(struct sip_agent *agent, nua_handle_t *nh,</span><br><span style="color: hsl(120, 100%, 40%);">+      int status, char const* phrase)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    nua_respond(nh, status, phrase, TAG_END());</span><br><span style="color: hsl(120, 100%, 40%);">+   nua_handle_destroy(nh);</span><br><span style="color: hsl(120, 100%, 40%);">+       rate_ctr_inc2(agent->ctrg, SIP_CTR_CALL_FAILED);</span><br><span> }</span><br><span> </span><br><span> static void new_call(struct sip_agent *agent, nua_handle_t *nh,</span><br><span>@@ -90,16 +100,14 @@</span><br><span> </span><br><span>   if (!sdp_screen_sdp(sip)) {</span><br><span>          LOGP(DSIP, LOGL_ERROR, "No supported codec.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              nua_respond(nh, SIP_406_NOT_ACCEPTABLE, TAG_END());</span><br><span style="color: hsl(0, 100%, 40%);">-             nua_handle_destroy(nh);</span><br><span style="color: hsl(120, 100%, 40%);">+               new_call_failure(agent, nh, SIP_406_NOT_ACCEPTABLE);</span><br><span>                 return;</span><br><span>      }</span><br><span> </span><br><span>        call = call_sip_create();</span><br><span>    if (!call) {</span><br><span>                 LOGP(DSIP, LOGL_ERROR, "No supported codec.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              nua_respond(nh, SIP_500_INTERNAL_SERVER_ERROR, TAG_END());</span><br><span style="color: hsl(0, 100%, 40%);">-              nua_handle_destroy(nh);</span><br><span style="color: hsl(120, 100%, 40%);">+               new_call_failure(agent, nh, SIP_500_INTERNAL_SERVER_ERROR);</span><br><span>          return;</span><br><span>      }</span><br><span> </span><br><span>@@ -110,8 +118,7 @@</span><br><span> </span><br><span>      if (!to || !from) {</span><br><span>          LOGP(DSIP, LOGL_ERROR, "Unknown from/to for invite.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-              nua_respond(nh, SIP_406_NOT_ACCEPTABLE, TAG_END());</span><br><span style="color: hsl(0, 100%, 40%);">-             nua_handle_destroy(nh);</span><br><span style="color: hsl(120, 100%, 40%);">+               new_call_failure(agent, nh, SIP_406_NOT_ACCEPTABLE);</span><br><span>                 return;</span><br><span>      }</span><br><span> </span><br><span>@@ -128,8 +135,7 @@</span><br><span>   */</span><br><span>  if (!sdp_extract_sdp(leg, sip, true)) {</span><br><span>              LOGP(DSIP, LOGL_ERROR, "leg(%p) no audio, releasing\n", leg);</span><br><span style="color: hsl(0, 100%, 40%);">-         nua_respond(nh, SIP_406_NOT_ACCEPTABLE, TAG_END());</span><br><span style="color: hsl(0, 100%, 40%);">-             nua_handle_destroy(nh);</span><br><span style="color: hsl(120, 100%, 40%);">+               new_call_failure(agent, nh, SIP_406_NOT_ACCEPTABLE);</span><br><span>                 call_leg_release(&leg->base);</span><br><span>                 return;</span><br><span>      }</span><br><span>@@ -354,6 +360,8 @@</span><br><span>              nua_bye(leg->nua_handle, TAG_END());</span><br><span>              break;</span><br><span>       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   // rate_ctr_inc2(argent->ctrg, SIP_CTR_CALL_RELEASED);</span><br><span> }</span><br><span> </span><br><span> static void sip_ring_call(struct call_leg *_leg)</span><br><span>@@ -364,6 +372,7 @@</span><br><span>         leg = (struct sip_call_leg *) _leg;</span><br><span> </span><br><span>      nua_respond(leg->nua_handle, SIP_180_RINGING, TAG_END());</span><br><span style="color: hsl(120, 100%, 40%);">+  // rate_ctr_inc2(argent->ctrg, SIP_CTR_CALL_INITIATED);</span><br><span> }</span><br><span> </span><br><span> static void sip_connect_call(struct call_leg *_leg)</span><br><span>@@ -495,9 +504,11 @@</span><br><span>    osmo_vlogp(DSIP, LOGL_NOTICE, "", 0, 0, fmt, ap);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void sip_agent_init(struct sip_agent *agent, struct app_config *app)</span><br><span style="color: hsl(120, 100%, 40%);">+void sip_agent_init(struct sip_agent *agent, struct app_config *app,</span><br><span style="color: hsl(120, 100%, 40%);">+        struct rate_ctr_group *ctrg)</span><br><span> {</span><br><span>    agent->app = app;</span><br><span style="color: hsl(120, 100%, 40%);">+  agent->ctrg = ctrg;</span><br><span> </span><br><span>   su_init();</span><br><span>   su_home_init(&agent->home);</span><br><span>diff --git a/src/sip.h b/src/sip.h</span><br><span>index d25c0b1..e6b9b72 100644</span><br><span>--- a/src/sip.h</span><br><span>+++ b/src/sip.h</span><br><span>@@ -6,6 +6,7 @@</span><br><span> #include <sofia-sip/nua_tag.h></span><br><span> #include <sofia-sip/su_glib.h></span><br><span> #include <sofia-sip/nua.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span> </span><br><span> struct app_config;</span><br><span> struct call;</span><br><span>@@ -16,9 +17,12 @@</span><br><span>   su_root_t               *root;</span><br><span> </span><br><span>   nua_t                   *nua;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       struct rate_ctr_group   *ctrg;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void sip_agent_init(struct sip_agent *agent, struct app_config *app);</span><br><span style="color: hsl(120, 100%, 40%);">+void sip_agent_init(struct sip_agent *agent, struct app_config *app,</span><br><span style="color: hsl(120, 100%, 40%);">+   struct rate_ctr_group *ctrg);</span><br><span> int sip_agent_start(struct sip_agent *agent);</span><br><span> </span><br><span> int sip_create_remote_leg(struct sip_agent *agent, struct call *call);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11199">change 11199</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/11199"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sip-connector </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I6d7963266a93be631a4e0e03a39916d07a88fe01 </div>
<div style="display:none"> Gerrit-Change-Number: 11199 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>