diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h index 34c3d973a..3bccb39df 100644 --- a/openbsc/include/openbsc/mgcp_internal.h +++ b/openbsc/include/openbsc/mgcp_internal.h @@ -190,6 +190,11 @@ struct mgcp_endpoint { struct osmux_in_handle *in; /* handle to unbatch messages */ struct osmux_out_handle out; + /* statistics */ + struct { + uint32_t chunks; + uint32_t octets; + } stats; } osmux; }; diff --git a/openbsc/src/libmgcp/mgcp_osmux.c b/openbsc/src/libmgcp/mgcp_osmux.c index 0fa7b4501..d5e671d06 100644 --- a/openbsc/src/libmgcp/mgcp_osmux.c +++ b/openbsc/src/libmgcp/mgcp_osmux.c @@ -261,6 +261,8 @@ static struct msgb *osmux_recv(struct osmo_fd *ofd, struct sockaddr_in *addr) return msg; } +#define osmux_chunk_length(msg, rem) (rem - msg->len); + int osmux_read_from_bsc_nat_cb(struct osmo_fd *ofd, unsigned int what) { struct msgb *msg; @@ -268,6 +270,7 @@ int osmux_read_from_bsc_nat_cb(struct osmo_fd *ofd, unsigned int what) struct llist_head list; struct sockaddr_in addr; struct mgcp_config *cfg = ofd->data; + uint32_t rem; msg = osmux_recv(ofd, &addr); if (!msg) @@ -277,6 +280,7 @@ int osmux_read_from_bsc_nat_cb(struct osmo_fd *ofd, unsigned int what) if (msg->data[0] == MGCP_DUMMY_LOAD) goto out; + rem = msg->len; while((osmuxh = osmux_xfrm_output_pull(msg)) != NULL) { struct mgcp_endpoint *endp; @@ -289,6 +293,10 @@ int osmux_read_from_bsc_nat_cb(struct osmo_fd *ofd, unsigned int what) osmuxh->circuit_id); goto out; } + endp->osmux.stats.octets += osmux_chunk_length(msg, rem); + endp->osmux.stats.chunks++; + rem = msg->len; + osmux_xfrm_output(osmuxh, &endp->osmux.out, &list); osmux_tx_sched(&list, scheduled_tx_bts_cb, endp); } @@ -355,6 +363,7 @@ int osmux_read_from_bsc_cb(struct osmo_fd *ofd, unsigned int what) struct llist_head list; struct sockaddr_in addr; struct mgcp_config *cfg = ofd->data; + uint32_t rem; msg = osmux_recv(ofd, &addr); if (!msg) @@ -364,6 +373,7 @@ int osmux_read_from_bsc_cb(struct osmo_fd *ofd, unsigned int what) if (msg->data[0] == MGCP_DUMMY_LOAD) return osmux_handle_dummy(cfg, &addr, msg); + rem = msg->len; while((osmuxh = osmux_xfrm_output_pull(msg)) != NULL) { struct mgcp_endpoint *endp; @@ -376,6 +386,10 @@ int osmux_read_from_bsc_cb(struct osmo_fd *ofd, unsigned int what) osmuxh->circuit_id); goto out; } + endp->osmux.stats.octets += osmux_chunk_length(msg, rem); + endp->osmux.stats.chunks++; + rem = msg->len; + osmux_xfrm_output(osmuxh, &endp->osmux.out, &list); osmux_tx_sched(&list, scheduled_tx_net_cb, endp); } diff --git a/openbsc/src/libmgcp/mgcp_protocol.c b/openbsc/src/libmgcp/mgcp_protocol.c index a728b67c4..79422fea4 100644 --- a/openbsc/src/libmgcp/mgcp_protocol.c +++ b/openbsc/src/libmgcp/mgcp_protocol.c @@ -1745,12 +1745,24 @@ void mgcp_format_stats(struct mgcp_endpoint *endp, char *msg, size_t size) size -= nchars; /* Error Counter */ - snprintf(msg, size, - "\r\nX-Osmo-CP: EC TIS=%u, TOS=%u, TIR=%u, TOR=%u", - endp->net_state.in_stream.err_ts_counter, - endp->net_state.out_stream.err_ts_counter, - endp->bts_state.in_stream.err_ts_counter, - endp->bts_state.out_stream.err_ts_counter); + nchars = snprintf(msg, size, + "\r\nX-Osmo-CP: EC TIS=%u, TOS=%u, TIR=%u, TOR=%u", + endp->net_state.in_stream.err_ts_counter, + endp->net_state.out_stream.err_ts_counter, + endp->bts_state.in_stream.err_ts_counter, + endp->bts_state.out_stream.err_ts_counter); + if (nchars < 0 || nchars >= size) + goto truncate; + + msg += nchars; + size -= nchars; + + if (endp->osmux.state == OSMUX_STATE_ENABLED) { + snprintf(msg, size, + "\r\nX-Osmux-ST: CR=%u, BR=%u", + endp->osmux.stats.chunks, + endp->osmux.stats.octets); + } truncate: msg[size - 1] = '\0'; }