Change in osmo-mgw[master]: legacy-mgcp: Add jitter buffer on the uplink receiver
Pau Espin Pedrol has submitted this change and it was merged. ( https://gerrit.osmocom.org/9212 ) Change subject: legacy-mgcp: Add jitter buffer on the uplink receiver .. legacy-mgcp: Add jitter buffer on the uplink receiver Default usage values are defined in mgcp node, and can be per-BSC overriden on each bsc node This commit is a forward-port of openbsc.git Change-Id Ibf3932adc07442fb5e9c7a06404853f9d0a20959. Change-Id: Ie19a64ac09f9d51f2434ad0d7925610fc919a90e --- M include/osmocom/legacy_mgcp/mgcp.h M include/osmocom/legacy_mgcp/mgcp_internal.h M src/libosmo-legacy-mgcp/mgcp_network.c M src/libosmo-legacy-mgcp/mgcp_protocol.c M src/libosmo-legacy-mgcp/mgcp_vty.c 5 files changed, 156 insertions(+), 3 deletions(-) Approvals: Harald Welte: Looks good to me, but someone else must approve Pau Espin Pedrol: Looks good to me, approved Jenkins Builder: Verified diff --git a/include/osmocom/legacy_mgcp/mgcp.h b/include/osmocom/legacy_mgcp/mgcp.h index 147a0d5..7490e37 100644 --- a/include/osmocom/legacy_mgcp/mgcp.h +++ b/include/osmocom/legacy_mgcp/mgcp.h @@ -243,6 +243,12 @@ * message. */ uint16_t osmux_dummy; + + /* Use a jitterbuffer on the bts-side receiver */ + bool bts_use_jibuf; + /* Minimum and maximum buffer size for the jitter buffer, in ms */ + uint32_t bts_jitter_delay_min; + uint32_t bts_jitter_delay_max; }; /* config management */ diff --git a/include/osmocom/legacy_mgcp/mgcp_internal.h b/include/osmocom/legacy_mgcp/mgcp_internal.h index dcc75f1..956bee0 100644 --- a/include/osmocom/legacy_mgcp/mgcp_internal.h +++ b/include/osmocom/legacy_mgcp/mgcp_internal.h @@ -25,6 +25,7 @@ #include #include +#include #define CI_UNUSED 0 @@ -198,6 +199,14 @@ uint32_t octets; } stats; } osmux; + + /* Jitter buffer */ + struct osmo_jibuf* bts_jb; + /* Use a jitterbuffer on the bts-side receiver */ + bool bts_use_jibuf; + /* Minimum and maximum buffer size for the jitter buffer, in ms */ + uint32_t bts_jitter_delay_min; + uint32_t bts_jitter_delay_max; }; #define for_each_line(line, save) \ @@ -335,3 +344,8 @@ } int mgcp_msg_terminate_nul(struct msgb *msg); + +/** + * Internal jitter buffer related + */ +void mgcp_dejitter_udp_send(struct msgb *msg, void *data); diff --git a/src/libosmo-legacy-mgcp/mgcp_network.c b/src/libosmo-legacy-mgcp/mgcp_network.c index 8ccfb42..7b161d2 100644 --- a/src/libosmo-legacy-mgcp/mgcp_network.c +++ b/src/libosmo-legacy-mgcp/mgcp_network.c @@ -584,6 +584,36 @@ return rc; } +void mgcp_dejitter_udp_send(struct msgb *msg, void *data) +{ + struct mgcp_rtp_end *rtp_end = (struct mgcp_rtp_end *) data; + + int rc = mgcp_udp_send(rtp_end->rtp.fd, _end->addr, + rtp_end->rtp_port, (char*) msg->data, msg->len); + if (rc != msg->len) + LOGP(DLMGCP, LOGL_ERROR, + "Failed to send data after jitter buffer: %d\n", rc); + msgb_free(msg); +} + +static int enqueue_dejitter(struct osmo_jibuf *jb, struct mgcp_rtp_end *rtp_end, char *buf, int len) +{ + struct msgb *msg; + msg = msgb_alloc(len, "mgcp-jibuf"); + if (!msg) + return -1; + + memcpy(msg->data, buf, len); + msgb_put(msg, len); + + if (osmo_jibuf_enqueue(jb, msg) < 0) { + rtp_end->dropped_packets += 1; + msgb_free(msg); + } + + return len; +} + int mgcp_send(struct mgcp_endpoint *endp, int dest, int is_rtp, struct sockaddr_in *addr, char *buf, int rc) { @@ -591,6 +621,7 @@ struct mgcp_rtp_end *rtp_end; struct mgcp_rtp_state *rtp_state; int tap_idx; + struct osmo_jibuf *jb; LOGP(DLMGCP, LOGL_DEBUG, "endpoint %x dest %s tcfg->audio_loop %d endp->conn_mode %d (== loopback: %d)\n", @@ -612,10 +643,12 @@ rtp_end = >net_end; rtp_state = >bts_state; tap_idx = MGCP_TAP_NET_OUT; + jb = endp->bts_jb; } else { rtp_end = >bts_end; rtp_state = >net_state; tap_idx = MGCP_TAP_BTS_OUT; + jb = NULL; } LOGP(DLMGCP, LOGL_DEBUG, "endpoint %x dest %s net_end %s %d %d bts_end %s %d %d rtp_end %s %d %d\n", @@ -680,9 +713,12 @@ rtp_state->patched_first_rtp_payload = true; } - rc = mgcp_udp_send(rtp_end->rtp.fd, - _end->addr, - rtp_end->rtp_port, buf, len); + if (jb) + rc = enqueue_dejitter(jb, rtp_end, buf, len); + else + rc =
Change in osmo-mgw[master]: legacy-mgcp: Add jitter buffer on the uplink receiver
Pau Espin Pedrol has posted comments on this change. ( https://gerrit.osmocom.org/9212 ) Change subject: legacy-mgcp: Add jitter buffer on the uplink receiver .. Patch Set 1: Code-Review+2 It's a forward port and it's been +1 for several days, merging. -- To view, visit https://gerrit.osmocom.org/9212 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-mgw Gerrit-Branch: master Gerrit-MessageType: comment Gerrit-Change-Id: Ie19a64ac09f9d51f2434ad0d7925610fc919a90e Gerrit-Change-Number: 9212 Gerrit-PatchSet: 1 Gerrit-Owner: Pau Espin PedrolGerrit-Reviewer: Harald Welte Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: Pau Espin Pedrol Gerrit-Comment-Date: Sat, 19 May 2018 12:05:29 + Gerrit-HasComments: No Gerrit-HasLabels: Yes
Change in osmo-mgw[master]: legacy-mgcp: Add jitter buffer on the uplink receiver
Harald Welte has posted comments on this change. ( https://gerrit.osmocom.org/9212 ) Change subject: legacy-mgcp: Add jitter buffer on the uplink receiver .. Patch Set 1: Code-Review+1 -- To view, visit https://gerrit.osmocom.org/9212 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-mgw Gerrit-Branch: master Gerrit-MessageType: comment Gerrit-Change-Id: Ie19a64ac09f9d51f2434ad0d7925610fc919a90e Gerrit-Change-Number: 9212 Gerrit-PatchSet: 1 Gerrit-Owner: Pau Espin PedrolGerrit-Reviewer: Harald Welte Gerrit-Reviewer: Jenkins Builder Gerrit-Comment-Date: Thu, 17 May 2018 12:03:33 + Gerrit-HasComments: No Gerrit-HasLabels: Yes
Change in osmo-mgw[master]: legacy-mgcp: Add jitter buffer on the uplink receiver
Pau Espin Pedrol has uploaded this change for review. ( https://gerrit.osmocom.org/9212 Change subject: legacy-mgcp: Add jitter buffer on the uplink receiver .. legacy-mgcp: Add jitter buffer on the uplink receiver Default usage values are defined in mgcp node, and can be per-BSC overriden on each bsc node This commit is a forward-port of openbsc.git Change-Id Ibf3932adc07442fb5e9c7a06404853f9d0a20959. Change-Id: Ie19a64ac09f9d51f2434ad0d7925610fc919a90e --- M include/osmocom/legacy_mgcp/mgcp.h M include/osmocom/legacy_mgcp/mgcp_internal.h M src/libosmo-legacy-mgcp/mgcp_network.c M src/libosmo-legacy-mgcp/mgcp_protocol.c M src/libosmo-legacy-mgcp/mgcp_vty.c 5 files changed, 156 insertions(+), 3 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/12/9212/1 diff --git a/include/osmocom/legacy_mgcp/mgcp.h b/include/osmocom/legacy_mgcp/mgcp.h index 147a0d5..7490e37 100644 --- a/include/osmocom/legacy_mgcp/mgcp.h +++ b/include/osmocom/legacy_mgcp/mgcp.h @@ -243,6 +243,12 @@ * message. */ uint16_t osmux_dummy; + + /* Use a jitterbuffer on the bts-side receiver */ + bool bts_use_jibuf; + /* Minimum and maximum buffer size for the jitter buffer, in ms */ + uint32_t bts_jitter_delay_min; + uint32_t bts_jitter_delay_max; }; /* config management */ diff --git a/include/osmocom/legacy_mgcp/mgcp_internal.h b/include/osmocom/legacy_mgcp/mgcp_internal.h index dcc75f1..956bee0 100644 --- a/include/osmocom/legacy_mgcp/mgcp_internal.h +++ b/include/osmocom/legacy_mgcp/mgcp_internal.h @@ -25,6 +25,7 @@ #include #include +#include #define CI_UNUSED 0 @@ -198,6 +199,14 @@ uint32_t octets; } stats; } osmux; + + /* Jitter buffer */ + struct osmo_jibuf* bts_jb; + /* Use a jitterbuffer on the bts-side receiver */ + bool bts_use_jibuf; + /* Minimum and maximum buffer size for the jitter buffer, in ms */ + uint32_t bts_jitter_delay_min; + uint32_t bts_jitter_delay_max; }; #define for_each_line(line, save) \ @@ -335,3 +344,8 @@ } int mgcp_msg_terminate_nul(struct msgb *msg); + +/** + * Internal jitter buffer related + */ +void mgcp_dejitter_udp_send(struct msgb *msg, void *data); diff --git a/src/libosmo-legacy-mgcp/mgcp_network.c b/src/libosmo-legacy-mgcp/mgcp_network.c index 8ccfb42..7b161d2 100644 --- a/src/libosmo-legacy-mgcp/mgcp_network.c +++ b/src/libosmo-legacy-mgcp/mgcp_network.c @@ -584,6 +584,36 @@ return rc; } +void mgcp_dejitter_udp_send(struct msgb *msg, void *data) +{ + struct mgcp_rtp_end *rtp_end = (struct mgcp_rtp_end *) data; + + int rc = mgcp_udp_send(rtp_end->rtp.fd, _end->addr, + rtp_end->rtp_port, (char*) msg->data, msg->len); + if (rc != msg->len) + LOGP(DLMGCP, LOGL_ERROR, + "Failed to send data after jitter buffer: %d\n", rc); + msgb_free(msg); +} + +static int enqueue_dejitter(struct osmo_jibuf *jb, struct mgcp_rtp_end *rtp_end, char *buf, int len) +{ + struct msgb *msg; + msg = msgb_alloc(len, "mgcp-jibuf"); + if (!msg) + return -1; + + memcpy(msg->data, buf, len); + msgb_put(msg, len); + + if (osmo_jibuf_enqueue(jb, msg) < 0) { + rtp_end->dropped_packets += 1; + msgb_free(msg); + } + + return len; +} + int mgcp_send(struct mgcp_endpoint *endp, int dest, int is_rtp, struct sockaddr_in *addr, char *buf, int rc) { @@ -591,6 +621,7 @@ struct mgcp_rtp_end *rtp_end; struct mgcp_rtp_state *rtp_state; int tap_idx; + struct osmo_jibuf *jb; LOGP(DLMGCP, LOGL_DEBUG, "endpoint %x dest %s tcfg->audio_loop %d endp->conn_mode %d (== loopback: %d)\n", @@ -612,10 +643,12 @@ rtp_end = >net_end; rtp_state = >bts_state; tap_idx = MGCP_TAP_NET_OUT; + jb = endp->bts_jb; } else { rtp_end = >bts_end; rtp_state = >net_state; tap_idx = MGCP_TAP_BTS_OUT; + jb = NULL; } LOGP(DLMGCP, LOGL_DEBUG, "endpoint %x dest %s net_end %s %d %d bts_end %s %d %d rtp_end %s %d %d\n", @@ -680,9 +713,12 @@ rtp_state->patched_first_rtp_payload = true; } - rc = mgcp_udp_send(rtp_end->rtp.fd, - _end->addr, - rtp_end->rtp_port, buf, len); + if (jb) + rc = enqueue_dejitter(jb, rtp_end, buf, len); + else + rc = mgcp_udp_send(rtp_end->rtp.fd, +