aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmgcp
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc/src/libmgcp')
-rw-r--r--openbsc/src/libmgcp/mgcp_osmux.c14
-rw-r--r--openbsc/src/libmgcp/mgcp_protocol.c24
2 files changed, 32 insertions, 6 deletions
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';
}