Change in osmo-mgw[master]: legacy-mgcp: Add jitter buffer on the uplink receiver

2018-05-19 Thread Pau Espin Pedrol
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

2018-05-19 Thread Pau Espin Pedrol
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 Pedrol 
Gerrit-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

2018-05-17 Thread Harald Welte
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 Pedrol 
Gerrit-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

2018-05-17 Thread Pau Espin Pedrol
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,
+