aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openbsc/include/openbsc/mgcp_internal.h6
-rw-r--r--openbsc/src/mgcp/mgcp_network.c22
-rw-r--r--openbsc/src/mgcp/mgcp_protocol.c3
3 files changed, 27 insertions, 4 deletions
diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h
index d5aec3080..918ba4b2f 100644
--- a/openbsc/include/openbsc/mgcp_internal.h
+++ b/openbsc/include/openbsc/mgcp_internal.h
@@ -61,6 +61,12 @@ struct mgcp_endpoint {
/* statistics */
unsigned int in_bts;
unsigned int in_remote;
+
+ /* sequence bits */
+ uint16_t net_seq_no;
+ uint16_t bts_seq_no;
+ int net_lost_no;
+ int bts_lost_no;
};
#define ENDPOINT_NUMBER(endp) abs(endp - endp->cfg->endpoints)
diff --git a/openbsc/src/mgcp/mgcp_network.c b/openbsc/src/mgcp/mgcp_network.c
index 723c9e3cd..d14a64e92 100644
--- a/openbsc/src/mgcp/mgcp_network.c
+++ b/openbsc/src/mgcp/mgcp_network.c
@@ -94,17 +94,29 @@ int mgcp_send_dummy(struct mgcp_endpoint *endp)
endp->net_rtp, buf, 1);
}
-static void patch_payload(int payload, char *data, int len)
+static void patch_and_count(uint16_t *last_seq, int *lost, int payload, char *data, int len)
{
+ uint16_t seq;
struct rtp_hdr *rtp_hdr;
if (len < sizeof(*rtp_hdr))
return;
+ rtp_hdr = (struct rtp_hdr *) data;
+ seq = ntohs(rtp_hdr->sequence);
+
+ /* 0 is assumed to be not set */
+ if (*last_seq == 0)
+ *last_seq = seq;
+ else if (*last_seq + 1 != seq)
+ *lost += abs(*last_seq - seq);
+
+ *last_seq = seq;
+
+
if (payload < 0)
return;
- rtp_hdr = (struct rtp_hdr *) data;
rtp_hdr->payload_type = payload;
}
@@ -196,13 +208,15 @@ static int rtp_data_cb(struct bsc_fd *fd, unsigned int what)
if (dest == DEST_NETWORK) {
if (proto == PROTO_RTP)
- patch_payload(endp->net_payload_type, buf, rc);
+ patch_and_count(&endp->bts_seq_no, &endp->bts_lost_no,
+ endp->net_payload_type, buf, rc);
return udp_send(fd->fd, &endp->remote,
proto == PROTO_RTP ? endp->net_rtp : endp->net_rtcp,
buf, rc);
} else {
if (proto == PROTO_RTP)
- patch_payload(endp->bts_payload_type, buf, rc);
+ patch_and_count(&endp->net_seq_no, &endp->net_lost_no,
+ endp->bts_payload_type, buf, rc);
return udp_send(fd->fd, &endp->bts,
proto == PROTO_RTP ? endp->bts_rtp : endp->bts_rtcp,
buf, rc);
diff --git a/openbsc/src/mgcp/mgcp_protocol.c b/openbsc/src/mgcp/mgcp_protocol.c
index f3cd3216a..a1abce1ce 100644
--- a/openbsc/src/mgcp/mgcp_protocol.c
+++ b/openbsc/src/mgcp/mgcp_protocol.c
@@ -764,4 +764,7 @@ void mgcp_free_endp(struct mgcp_endpoint *endp)
endp->in_bts = endp->in_remote = 0;
memset(&endp->remote, 0, sizeof(endp->remote));
memset(&endp->bts, 0, sizeof(endp->bts));
+
+ endp->net_seq_no = endp->bts_seq_no = 0;
+ endp->net_lost_no = endp->bts_lost_no = 0;
}