This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.orgHarald Welte has submitted this change and it was merged. ( https://gerrit.osmocom.org/9837 ) Change subject: stats: replace packet statistic counters with libosmocore rate counters ...................................................................... stats: replace packet statistic counters with libosmocore rate counters In struct mgcp_rtp_end one finds unsigned int counters. Those should be replaced with libosmocore rate counters - replace packets_rx, octets_rx, packets_tx, octets_tx and dropped_packets with libosmocore rate counters. Change-Id: I47c5c9006df5044e59ddebb895e62adb849d72d5 Related: OS#2517 --- M include/osmocom/mgcp/mgcp_conn.h M include/osmocom/mgcp/mgcp_internal.h M include/osmocom/mgcp/mgcp_stat.h M src/libosmo-mgcp/mgcp_conn.c M src/libosmo-mgcp/mgcp_network.c M src/libosmo-mgcp/mgcp_osmux.c M src/libosmo-mgcp/mgcp_stat.c M src/libosmo-mgcp/mgcp_vty.c M tests/mgcp/mgcp_test.c 9 files changed, 86 insertions(+), 55 deletions(-) Approvals: Jenkins Builder: Verified Harald Welte: Looks good to me, approved diff --git a/include/osmocom/mgcp/mgcp_conn.h b/include/osmocom/mgcp/mgcp_conn.h index e2a423f..3da7334 100644 --- a/include/osmocom/mgcp/mgcp_conn.h +++ b/include/osmocom/mgcp/mgcp_conn.h @@ -27,6 +27,17 @@ #include <osmocom/core/linuxlist.h> #include <inttypes.h> +/* RTP connection related counters */ +enum { + IN_STREAM_ERR_TSTMP_CTR, + OUT_STREAM_ERR_TSTMP_CTR, + RTP_PACKETS_RX_CTR, + RTP_OCTETS_RX_CTR, + RTP_PACKETS_TX_CTR, + RTP_OCTETS_TX_CTR, + RTP_DROPPED_PACKETS_CTR +}; + struct mgcp_conn *mgcp_conn_alloc(void *ctx, struct mgcp_endpoint *endp, enum mgcp_conn_type type, char *name); struct mgcp_conn *mgcp_conn_get(struct mgcp_endpoint *endp, const char *id); diff --git a/include/osmocom/mgcp/mgcp_internal.h b/include/osmocom/mgcp/mgcp_internal.h index 1b9749d..38b687c 100644 --- a/include/osmocom/mgcp/mgcp_internal.h +++ b/include/osmocom/mgcp/mgcp_internal.h @@ -99,15 +99,6 @@ /* 'mgcp_rtp_end': basically a wrapper around the RTP+RTCP ports */ struct mgcp_rtp_end { - /* statistics */ - struct { - unsigned int packets_rx; - unsigned int octets_rx; - unsigned int packets_tx; - unsigned int octets_tx; - unsigned int dropped_packets; - } stats; - /* local IP address of the RTP socket */ struct in_addr addr; diff --git a/include/osmocom/mgcp/mgcp_stat.h b/include/osmocom/mgcp/mgcp_stat.h index b6c73fa..0bde8cf 100644 --- a/include/osmocom/mgcp/mgcp_stat.h +++ b/include/osmocom/mgcp/mgcp_stat.h @@ -30,8 +30,7 @@ void mgcp_format_stats(char *str, size_t str_len, struct mgcp_conn *conn); /* Exposed for test purposes only, do not use actively */ -void calc_loss(struct mgcp_rtp_state *s, struct mgcp_rtp_end *, - uint32_t *expected, int *loss); +void calc_loss(struct mgcp_conn_rtp *conn, uint32_t *expected, int *loss); /* Exposed for test purposes only, do not use actively */ uint32_t calc_jitter(struct mgcp_rtp_state *); diff --git a/src/libosmo-mgcp/mgcp_conn.c b/src/libosmo-mgcp/mgcp_conn.c index e49559c..3a5db0f 100644 --- a/src/libosmo-mgcp/mgcp_conn.c +++ b/src/libosmo-mgcp/mgcp_conn.c @@ -31,22 +31,21 @@ #include <osmocom/core/rate_ctr.h> #include <ctype.h> -enum { - IN_STREAM_ERR_TSTMP_CTR, - OUT_STREAM_ERR_TSTMP_CTR, -}; - static const struct rate_ctr_desc rate_ctr_desc[] = { [IN_STREAM_ERR_TSTMP_CTR] = {"stream_err_tstmp:in", "Inbound rtp-stream timestamp errors."}, [OUT_STREAM_ERR_TSTMP_CTR] = {"stream_err_tstmp:out", "Outbound rtp-stream timestamp errors."}, + [RTP_PACKETS_RX_CTR] = {"rtp:packets_rx", "Inbound rtp packets."}, + [RTP_OCTETS_RX_CTR] = {"rtp:octets_rx", "Inbound rtp octets."}, + [RTP_PACKETS_TX_CTR] = {"rtp:packets_tx", "Outbound rtp packets."}, + [RTP_OCTETS_TX_CTR] = {"rtp:octets_rx", "Outbound rtp octets."}, + [RTP_DROPPED_PACKETS_CTR] = {"rtp:dropped", "dropped rtp packets."} }; - const static struct rate_ctr_group_desc rate_ctr_group_desc = { .group_name_prefix = "conn_rtp", .group_description = "rtp connection statistics", .class_id = 1, - .num_ctr = 2, + .num_ctr = ARRAY_SIZE(rate_ctr_desc), .ctr_desc = rate_ctr_desc }; @@ -107,7 +106,6 @@ end->rtp.fd = -1; end->rtcp.fd = -1; - memset(&end->stats, 0, sizeof(end->stats)); end->rtp_port = end->rtcp_port = 0; talloc_free(end->fmtp_extra); end->fmtp_extra = NULL; diff --git a/src/libosmo-mgcp/mgcp_network.c b/src/libosmo-mgcp/mgcp_network.c index b47b76c..494156d 100644 --- a/src/libosmo-mgcp/mgcp_network.c +++ b/src/libosmo-mgcp/mgcp_network.c @@ -694,7 +694,7 @@ dest_name = conn_dst->conn->name; if (!rtp_end->output_enabled) { - rtp_end->stats.dropped_packets += 1; + rate_ctr_inc(&conn_dst->rate_ctr_group->ctr[RTP_DROPPED_PACKETS_CTR]); LOGP(DRTP, LOGL_DEBUG, "endpoint:0x%x output disabled, drop to %s %s " "rtp_port:%u rtcp_port:%u\n", @@ -749,8 +749,8 @@ if (len <= 0) return len; - conn_dst->end.stats.packets_tx += 1; - conn_dst->end.stats.octets_tx += len; + rate_ctr_inc(&conn_dst->rate_ctr_group->ctr[RTP_PACKETS_TX_CTR]); + rate_ctr_add(&conn_dst->rate_ctr_group->ctr[RTP_OCTETS_TX_CTR], len); nbytes += len; buflen = cont; @@ -769,8 +769,8 @@ &rtp_end->addr, rtp_end->rtcp_port, buf, len); - conn_dst->end.stats.packets_tx += 1; - conn_dst->end.stats.octets_tx += len; + rate_ctr_inc(&conn_dst->rate_ctr_group->ctr[RTP_PACKETS_TX_CTR]); + rate_ctr_add(&conn_dst->rate_ctr_group->ctr[RTP_OCTETS_TX_CTR], len); return len; } @@ -939,8 +939,8 @@ } /* Increment RX statistics */ - conn->end.stats.packets_rx += 1; - conn->end.stats.octets_rx += rc; + rate_ctr_inc(&conn->rate_ctr_group->ctr[RTP_PACKETS_RX_CTR]); + rate_ctr_add(&conn->rate_ctr_group->ctr[RTP_OCTETS_RX_CTR], rc); /* Forward a copy of the RTP data to a debug ip/port */ forward_data(fd->fd, &conn->tap_in, buf, rc); diff --git a/src/libosmo-mgcp/mgcp_osmux.c b/src/libosmo-mgcp/mgcp_osmux.c index 281595c..26817c8 100644 --- a/src/libosmo-mgcp/mgcp_osmux.c +++ b/src/libosmo-mgcp/mgcp_osmux.c @@ -256,8 +256,8 @@ .sin_port = conn_net->end.rtp_port, }; - conn_bts->end.stats.octets_tx += msg->len; - conn_bts->end.stats.packets_tx++; + rate_ctr_inc(&conn_bts->rate_ctr_group->ctr[RTP_PACKETS_TX_CTR]); + rate_ctr_add(&conn_bts->rate_ctr_group->ctr[RTP_OCTETS_TX_CTR], msg->len); /* Send RTP data to NET */ /* FIXME: Get rid of conn_bts and conn_net! */ @@ -283,8 +283,8 @@ .sin_port = conn_bts->end.rtp_port, }; - conn_net->end.stats.octets_tx += msg->len; - conn_net->end.stats.packets_tx++; + rate_ctr_inc(&conn_net->rate_ctr_group->ctr[RTP_PACKETS_TX_CTR]); + rate_ctr_add(&conn_net->rate_ctr_group->ctr[RTP_OCTETS_TX_CTR], msg->len); /* Send RTP data to BTS */ /* FIXME: Get rid of conn_bts and conn_net! */ diff --git a/src/libosmo-mgcp/mgcp_stat.c b/src/libosmo-mgcp/mgcp_stat.c index cc723bb..4072ac0 100644 --- a/src/libosmo-mgcp/mgcp_stat.c +++ b/src/libosmo-mgcp/mgcp_stat.c @@ -27,10 +27,11 @@ #include <limits.h> /* Helper function for mgcp_format_stats_rtp() to calculate packet loss */ -void calc_loss(struct mgcp_rtp_state *state, - struct mgcp_rtp_end *end, uint32_t *expected, - int *loss) +void calc_loss(struct mgcp_conn_rtp *conn, uint32_t *expected, int *loss) { + struct mgcp_rtp_state *state = &conn->state; + struct rate_ctr *packets_rx = &conn->rate_ctr_group->ctr[RTP_PACKETS_RX_CTR]; + *expected = state->stats.cycles + state->stats.max_seq; *expected = *expected - state->stats.base_seq + 1; @@ -44,8 +45,8 @@ * Make sure the sign is correct and use the biggest * positive/negative number that fits. */ - *loss = *expected - end->stats.packets_rx; - if (*expected < end->stats.packets_rx) { + *loss = *expected - packets_rx->current; + if (*expected < packets_rx->current) { if (*loss > 0) *loss = INT_MIN; } else { @@ -70,13 +71,18 @@ int ploss; int nchars; - calc_loss(&conn->state, &conn->end, &expected, &ploss); + struct rate_ctr *packets_rx = &conn->rate_ctr_group->ctr[RTP_PACKETS_RX_CTR]; + struct rate_ctr *octets_rx = &conn->rate_ctr_group->ctr[RTP_OCTETS_RX_CTR]; + struct rate_ctr *packets_tx = &conn->rate_ctr_group->ctr[RTP_PACKETS_TX_CTR]; + struct rate_ctr *octets_tx = &conn->rate_ctr_group->ctr[RTP_OCTETS_TX_CTR]; + + calc_loss(conn, &expected, &ploss); jitter = calc_jitter(&conn->state); nchars = snprintf(str, str_len, - "\r\nP: PS=%u, OS=%u, PR=%u, OR=%u, PL=%d, JI=%u", - conn->end.stats.packets_tx, conn->end.stats.octets_tx, - conn->end.stats.packets_rx, conn->end.stats.octets_rx, + "\r\nP: PS=%lu, OS=%lu, PR=%lu, OR=%lu, PL=%d, JI=%u", + packets_tx->current, octets_tx->current, + packets_rx->current, octets_rx->current, ploss, jitter); if (nchars < 0 || nchars >= str_len) goto truncate; diff --git a/src/libosmo-mgcp/mgcp_vty.c b/src/libosmo-mgcp/mgcp_vty.c index a7a1feb..b586ff6 100644 --- a/src/libosmo-mgcp/mgcp_vty.c +++ b/src/libosmo-mgcp/mgcp_vty.c @@ -154,14 +154,18 @@ return CMD_SUCCESS; } -static void dump_rtp_end(struct vty *vty, struct mgcp_rtp_state *state, - struct mgcp_rtp_end *end) +static void dump_rtp_end(struct vty *vty, struct mgcp_conn_rtp *conn) { + struct mgcp_rtp_state *state = &conn->state; + struct mgcp_rtp_end *end = &conn->end; struct mgcp_rtp_codec *codec = end->codec; + struct rate_ctr *dropped_packets; + + dropped_packets = &conn->rate_ctr_group->ctr[RTP_DROPPED_PACKETS_CTR]; vty_out(vty, " Timestamp Errs: %lu->%lu%s" - " Dropped Packets: %d%s" + " Dropped Packets: %lu%s" " Payload Type: %d Rate: %u Channels: %d %s" " Frame Duration: %u Frame Denominator: %u%s" " FPP: %d Packet Duration: %u%s" @@ -170,7 +174,7 @@ state->in_stream.err_ts_ctr->current, state->out_stream.err_ts_ctr->current, VTY_NEWLINE, - end->stats.dropped_packets, VTY_NEWLINE, + dropped_packets->current, VTY_NEWLINE, codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE, codec->frame_duration_num, codec->frame_duration_den, VTY_NEWLINE, end->frames_per_packet, end->packet_duration_ms, @@ -208,8 +212,7 @@ * connection types (E1) as soon as * the implementation is available */ if (conn->type == MGCP_CONN_TYPE_RTP) { - dump_rtp_end(vty, &conn->u.rtp.state, - &conn->u.rtp.end); + dump_rtp_end(vty, &conn->u.rtp); } } } diff --git a/tests/mgcp/mgcp_test.c b/tests/mgcp/mgcp_test.c index 1d2cf4a..56d0cee 100644 --- a/tests/mgcp/mgcp_test.c +++ b/tests/mgcp/mgcp_test.c @@ -937,23 +937,43 @@ static void test_packet_loss_calc(void) { int i; + struct mgcp_endpoint endp; + struct mgcp_trunk_config trunk; + printf("Testing packet loss calculation.\n"); + memset(&endp, 0, sizeof(endp)); + memset(&trunk, 0, sizeof(trunk)); + + endp.type = &ep_typeset.rtp; + trunk.vty_number_endpoints = 1; + trunk.endpoints = &endp; + endp.tcfg = &trunk; + INIT_LLIST_HEAD(&endp.conns); + for (i = 0; i < ARRAY_SIZE(pl_test_dat); ++i) { uint32_t expected; int loss; - struct mgcp_rtp_state state; - struct mgcp_rtp_end rtp; - memset(&state, 0, sizeof(state)); - memset(&rtp, 0, sizeof(rtp)); - state.stats.initialized = 1; - state.stats.base_seq = pl_test_dat[i].base_seq; - state.stats.max_seq = pl_test_dat[i].max_seq; - state.stats.cycles = pl_test_dat[i].cycles; + struct mgcp_conn_rtp *conn = NULL; + struct mgcp_conn *_conn = NULL; + struct mgcp_rtp_state *state; + struct rate_ctr *packets_rx; - rtp.stats.packets_rx = pl_test_dat[i].packets; - calc_loss(&state, &rtp, &expected, &loss); + _conn = + mgcp_conn_alloc(NULL, &endp, MGCP_CONN_TYPE_RTP, + "test-connection"); + conn = mgcp_conn_get_rtp(&endp, _conn->id); + state = &conn->state; + packets_rx = &conn->rate_ctr_group->ctr[RTP_PACKETS_RX_CTR]; + + state->stats.initialized = 1; + state->stats.base_seq = pl_test_dat[i].base_seq; + state->stats.max_seq = pl_test_dat[i].max_seq; + state->stats.cycles = pl_test_dat[i].cycles; + + packets_rx->current = pl_test_dat[i].packets; + calc_loss(conn, &expected, &loss); if (loss != pl_test_dat[i].loss || expected != pl_test_dat[i].expected) { @@ -962,7 +982,10 @@ i, loss, pl_test_dat[i].loss, expected, pl_test_dat[i].expected); } + + mgcp_conn_free_all(&endp); } + } int mgcp_parse_stats(struct msgb *msg, uint32_t *ps, uint32_t *os, -- To view, visit https://gerrit.osmocom.org/9837 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-mgw Gerrit-Branch: master Gerrit-MessageType: merged Gerrit-Change-Id: I47c5c9006df5044e59ddebb895e62adb849d72d5 Gerrit-Change-Number: 9837 Gerrit-PatchSet: 3 Gerrit-Owner: dexter <pmaier at sysmocom.de> Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: Stefan Sperling <ssperling at sysmocom.de> -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20180705/0bf2225b/attachment.htm>