<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/26234">View Change</a></p><div style="white-space:pre-wrap">Approvals:
laforge: Looks good to me, approved
Jenkins Builder: Verified
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">stp: Add basic RX/TX rate counters on AS and ASP level<br><br>This adds some very basic rx/px rate counters to the SS7 AS and ASP<br><br>OsmoSTP> show rate-counters<br>SIGTRAN Application Server 0 (as-rkm-1):<br> rx:msu:total: 86078 (1888/s 86078/m 0/h 0/d)<br> tx:msu:total: 0 (0/s 0/m 0/h 0/d)<br>SIGTRAN Application Server Process 0 (asp-dyn-0):<br> rx:packets:total: 86081 (1888/s 86081/m 0/h 0/d)<br> tx:packets:total: 5 (0/s 5/m 0/h 0/d)<br><br>Change-Id: Idb811ca81adfe47152d484f6b981e661dc569e15<br>---<br>M include/osmocom/sigtran/osmo_ss7.h<br>M src/ipa.c<br>M src/m3ua.c<br>M src/osmo_ss7.c<br>M src/osmo_ss7_hmrt.c<br>M src/ss7_internal.h<br>M src/sua.c<br>M stp/stp_main.c<br>8 files changed, 83 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>index 3d13b6a..1755859 100644</span><br><span>--- a/include/osmocom/sigtran/osmo_ss7.h</span><br><span>+++ b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>@@ -9,6 +9,7 @@</span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/core/prim.h></span><br><span> #include <osmocom/core/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span> </span><br><span> extern struct llist_head osmo_ss7_instances;</span><br><span> </span><br><span>@@ -310,6 +311,9 @@</span><br><span> /*! Were we allocated by "simple client" support? */</span><br><span> bool simple_client_allocated;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /*! Rate Counter Group */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct rate_ctr_group *ctrg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct {</span><br><span> char *name;</span><br><span> char *description;</span><br><span>@@ -412,6 +416,9 @@</span><br><span> /*! Were we allocated by "simple client" support? */</span><br><span> bool simple_client_allocated;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /*! Rate Counter Group */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct rate_ctr_group *ctrg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Pending message for non-blocking IPA read */</span><br><span> struct msgb *pending_msg;</span><br><span> </span><br><span>diff --git a/src/ipa.c b/src/ipa.c</span><br><span>index 93edef8..5b1eb54 100644</span><br><span>--- a/src/ipa.c</span><br><span>+++ b/src/ipa.c</span><br><span>@@ -47,6 +47,7 @@</span><br><span> #include <osmocom/sigtran/protocol/mtp.h></span><br><span> </span><br><span> #include "xua_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "ss7_internal.h"</span><br><span> #include "xua_asp_fsm.h"</span><br><span> </span><br><span> </span><br><span>@@ -224,6 +225,8 @@</span><br><span> return -1;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc2(as->ctrg, SS7_AS_CTR_RX_MSU_TOTAL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* pull the IPA header */</span><br><span> msgb_pull_to_l2(msg);</span><br><span> </span><br><span>diff --git a/src/m3ua.c b/src/m3ua.c</span><br><span>index 607813f..26acc1b 100644</span><br><span>--- a/src/m3ua.c</span><br><span>+++ b/src/m3ua.c</span><br><span>@@ -44,6 +44,7 @@</span><br><span> #include "xua_as_fsm.h"</span><br><span> #include "xua_asp_fsm.h"</span><br><span> #include "xua_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "ss7_internal.h"</span><br><span> </span><br><span> #define M3UA_MSGB_SIZE 1500</span><br><span> </span><br><span>@@ -553,6 +554,8 @@</span><br><span> if (rc)</span><br><span> return rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc2(as->ctrg, SS7_AS_CTR_RX_MSU_TOTAL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* FIXME: check for AS state == ACTIVE */</span><br><span> </span><br><span> /* store the MTP-level information in the xua_msg for use by</span><br><span>diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c</span><br><span>index 38206fb..5dd4a26 100644</span><br><span>--- a/src/osmo_ss7.c</span><br><span>+++ b/src/osmo_ss7.c</span><br><span>@@ -48,6 +48,7 @@</span><br><span> </span><br><span> #include "sccp_internal.h"</span><br><span> #include "xua_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "ss7_internal.h"</span><br><span> #include "xua_asp_fsm.h"</span><br><span> #include "xua_as_fsm.h"</span><br><span> </span><br><span>@@ -895,6 +896,19 @@</span><br><span> * SS7 Application Server</span><br><span> ***********************************************************************/</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static const struct rate_ctr_desc ss7_as_rcd[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [SS7_AS_CTR_RX_MSU_TOTAL] = { "rx.msu.total", "Total number of MSU received" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [SS7_AS_CTR_TX_MSU_TOTAL] = { "tx.msu.total", "Total number of MSU transmitted" },</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 ss7_as_rcgd = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .group_name_prefix = "sigtran.as",</span><br><span style="color: hsl(120, 100%, 40%);">+ .group_description = "SIGTRAN Application Server",</span><br><span style="color: hsl(120, 100%, 40%);">+ .num_ctr = ARRAY_SIZE(ss7_as_rcd),</span><br><span style="color: hsl(120, 100%, 40%);">+ .ctr_desc = ss7_as_rcd,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static unsigned int g_ss7_as_rcg_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! \brief Find Application Server by given name</span><br><span> * \param[in] inst SS7 Instance on which we operate</span><br><span> * \param[in] name Name of AS</span><br><span>@@ -1002,6 +1016,12 @@</span><br><span> as = talloc_zero(inst, struct osmo_ss7_as);</span><br><span> if (!as)</span><br><span> return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ as->ctrg = rate_ctr_group_alloc(as, &ss7_as_rcgd, g_ss7_as_rcg_idx++);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!as->ctrg) {</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(as);</span><br><span style="color: hsl(120, 100%, 40%);">+ return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_group_set_name(as->ctrg, name);</span><br><span> as->inst = inst;</span><br><span> as->cfg.name = talloc_strdup(as, name);</span><br><span> as->cfg.proto = proto;</span><br><span>@@ -1125,6 +1145,26 @@</span><br><span> * SS7 Application Server Process</span><br><span> ***********************************************************************/</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum ss7_asp_ctr {</span><br><span style="color: hsl(120, 100%, 40%);">+ SS7_ASP_CTR_PKT_RX_TOTAL,</span><br><span style="color: hsl(120, 100%, 40%);">+ SS7_ASP_CTR_PKT_RX_UNKNOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+ SS7_ASP_CTR_PKT_TX_TOTAL,</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 ss7_asp_rcd[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [SS7_ASP_CTR_PKT_RX_TOTAL] = { "rx.packets.total", "Total number of packets received" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [SS7_ASP_CTR_PKT_RX_UNKNOWN] = { "rx.packets.unknown", "Number of packets received for unknown PPID" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [SS7_ASP_CTR_PKT_TX_TOTAL] = { "tx.packets.total", "Total number of packets transmitted" },</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 ss7_asp_rcgd = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .group_name_prefix = "sigtran.asp",</span><br><span style="color: hsl(120, 100%, 40%);">+ .group_description = "SIGTRAN Application Server Process",</span><br><span style="color: hsl(120, 100%, 40%);">+ .num_ctr = ARRAY_SIZE(ss7_asp_rcd),</span><br><span style="color: hsl(120, 100%, 40%);">+ .ctr_desc = ss7_asp_rcd,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+static unsigned int g_ss7_asp_rcg_idx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int osmo_ss7_asp_peer_snprintf(char* buf, size_t buf_len, struct osmo_ss7_asp_peer *peer)</span><br><span> {</span><br><span> int len = 0, offset = 0, rem = buf_len;</span><br><span>@@ -1485,6 +1525,12 @@</span><br><span> if (!asp) {</span><br><span> /* FIXME: check if local port has SCTP? */</span><br><span> asp = talloc_zero(inst, struct osmo_ss7_asp);</span><br><span style="color: hsl(120, 100%, 40%);">+ asp->ctrg = rate_ctr_group_alloc(asp, &ss7_asp_rcgd, g_ss7_asp_rcg_idx++);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!asp->ctrg) {</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(asp);</span><br><span style="color: hsl(120, 100%, 40%);">+ return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_group_set_name(asp->ctrg, name);</span><br><span> asp->inst = inst;</span><br><span> asp->cfg.remote.port = remote_port;</span><br><span> asp->cfg.local.port = local_port;</span><br><span>@@ -1781,6 +1827,8 @@</span><br><span> msgb_sctp_stream(msg) = sinfo.sinfo_stream;</span><br><span> msg->dst = asp;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc2(asp->ctrg, SS7_ASP_CTR_PKT_RX_TOTAL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (ppid == SUA_PPID && asp->cfg.proto == OSMO_SS7_ASP_PROT_SUA)</span><br><span> rc = sua_rx_msg(asp, msg);</span><br><span> else if (ppid == M3UA_PPID && asp->cfg.proto == OSMO_SS7_ASP_PROT_M3UA)</span><br><span>@@ -1860,6 +1908,7 @@</span><br><span> return -1;</span><br><span> }</span><br><span> msg->dst = asp;</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc2(asp->ctrg, SS7_ASP_CTR_PKT_RX_TOTAL);</span><br><span> return ipa_rx_msg(asp, msg);</span><br><span> }</span><br><span> </span><br><span>@@ -1918,6 +1967,8 @@</span><br><span> msgb_sctp_stream(msg) = sinfo.sinfo_stream;</span><br><span> msg->dst = asp;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc2(asp->ctrg, SS7_ASP_CTR_PKT_RX_TOTAL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (ppid == SUA_PPID && asp->cfg.proto == OSMO_SS7_ASP_PROT_SUA)</span><br><span> rc = sua_rx_msg(asp, msg);</span><br><span> else if (ppid == M3UA_PPID && asp->cfg.proto == OSMO_SS7_ASP_PROT_M3UA)</span><br><span>@@ -2086,6 +2137,8 @@</span><br><span> OSMO_ASSERT(0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc2(asp->ctrg, SS7_ASP_CTR_PKT_TX_TOTAL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (asp->cfg.is_server) {</span><br><span> if (!asp->server) {</span><br><span> LOGPASP(asp, DLSS7, LOGL_ERROR, "Cannot transmit, no asp->server\n");</span><br><span>@@ -2361,6 +2414,8 @@</span><br><span> </span><br><span> int ss7_asp_rx_unknown(struct osmo_ss7_asp *asp, int ppid_mux, struct msgb *msg)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc2(asp->ctrg, SS7_ASP_CTR_PKT_RX_UNKNOWN);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (g_osmo_ss7_asp_rx_unknown_cb)</span><br><span> return (*g_osmo_ss7_asp_rx_unknown_cb)(asp, ppid_mux, msg);</span><br><span> </span><br><span>diff --git a/src/osmo_ss7_hmrt.c b/src/osmo_ss7_hmrt.c</span><br><span>index 882d85d..f5fcd64 100644</span><br><span>--- a/src/osmo_ss7_hmrt.c</span><br><span>+++ b/src/osmo_ss7_hmrt.c</span><br><span>@@ -35,6 +35,7 @@</span><br><span> #include <osmocom/sigtran/protocol/m3ua.h></span><br><span> </span><br><span> #include "xua_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "ss7_internal.h"</span><br><span> </span><br><span> /* convert from M3UA message to MTP-TRANSFER.ind osmo_mtp_prim */</span><br><span> struct osmo_mtp_prim *m3ua_to_xfer_ind(struct xua_msg *xua)</span><br><span>@@ -227,6 +228,8 @@</span><br><span> dpc, osmo_ss7_pointcode_print(inst, dpc), rt_name);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc2(as->ctrg, SS7_AS_CTR_TX_MSU_TOTAL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> switch (as->cfg.proto) {</span><br><span> case OSMO_SS7_ASP_PROT_M3UA:</span><br><span> DEBUGP(DLSS7, "rt->dest.as proto is M3UA for dpc=%u=%s\n",</span><br><span>diff --git a/src/ss7_internal.h b/src/ss7_internal.h</span><br><span>index 28e239c..712a6ed 100644</span><br><span>--- a/src/ss7_internal.h</span><br><span>+++ b/src/ss7_internal.h</span><br><span>@@ -7,3 +7,8 @@</span><br><span> </span><br><span> bool osmo_ss7_asp_set_default_peer_hosts(struct osmo_ss7_asp *asp);</span><br><span> bool osmo_ss7_xua_server_set_default_local_hosts(struct osmo_xua_server *oxs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum ss7_as_ctr {</span><br><span style="color: hsl(120, 100%, 40%);">+ SS7_AS_CTR_RX_MSU_TOTAL,</span><br><span style="color: hsl(120, 100%, 40%);">+ SS7_AS_CTR_TX_MSU_TOTAL,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/src/sua.c b/src/sua.c</span><br><span>index 8415fa3..000f064 100644</span><br><span>--- a/src/sua.c</span><br><span>+++ b/src/sua.c</span><br><span>@@ -46,6 +46,7 @@</span><br><span> #include "xua_asp_fsm.h"</span><br><span> #include "xua_internal.h"</span><br><span> #include "sccp_internal.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "ss7_internal.h"</span><br><span> </span><br><span> /* Appendix C.4 of Q.714 (all in milliseconds) */</span><br><span> #define CONNECTION_TIMER ( 1 * 60 * 100)</span><br><span>@@ -521,6 +522,8 @@</span><br><span> if (rc)</span><br><span> return rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc2(as->ctrg, SS7_AS_CTR_RX_MSU_TOTAL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> switch (xua->hdr.msg_type) {</span><br><span> case 0: /* Reserved, permitted by ETSI TS 101 592 5.2.3.2 */</span><br><span> case SUA_CL_CLDT:</span><br><span>@@ -549,6 +552,8 @@</span><br><span> if (rc)</span><br><span> return rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc2(as->ctrg, SS7_AS_CTR_RX_MSU_TOTAL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> switch (xua->hdr.msg_type) {</span><br><span> case 0: /* Reserved, permitted by ETSI TS 101 592 5.2.3.2 */</span><br><span> case SUA_CO_CORE:</span><br><span>diff --git a/stp/stp_main.c b/stp/stp_main.c</span><br><span>index 1e83615..569cf8e 100644</span><br><span>--- a/stp/stp_main.c</span><br><span>+++ b/stp/stp_main.c</span><br><span>@@ -32,6 +32,7 @@</span><br><span> #include <osmocom/core/utils.h></span><br><span> #include <osmocom/core/logging.h></span><br><span> #include <osmocom/core/application.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span> #include <osmocom/core/fsm.h></span><br><span> #include <osmocom/vty/vty.h></span><br><span> #include <osmocom/vty/stats.h></span><br><span>@@ -254,6 +255,7 @@</span><br><span> signal(SIGUSR1, &signal_handler);</span><br><span> signal(SIGUSR2, &signal_handler);</span><br><span> osmo_init_ignore_signals();</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_init(tall_stp_ctx);</span><br><span> </span><br><span> if (cmdline_config.daemonize) {</span><br><span> rc = osmo_daemonize();</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/26234">change 26234</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/libosmo-sccp/+/26234"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: libosmo-sccp </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Idb811ca81adfe47152d484f6b981e661dc569e15 </div>
<div style="display:none"> Gerrit-Change-Number: 26234 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </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: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>