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
diff --git a/src/libosmo-legacy-mgcp/mgcp_protocol.c b/src/libosmo-legacy-mgcp/mgcp_protocol.c
index 4e82233..854b4ba 100644
--- a/src/libosmo-legacy-mgcp/mgcp_protocol.c
+++ b/src/libosmo-legacy-mgcp/mgcp_protocol.c
@@ -863,6 +863,11 @@
 		goto error2;
 	}
 
+	/* Apply Jiter buffer settings for this endpoint, they can be overriden by CRCX policy later */
+	endp->bts_use_jibuf = endp->cfg->bts_use_jibuf;
+	endp->bts_jitter_delay_min = endp->cfg->bts_jitter_delay_min;
+	endp->bts_jitter_delay_max = endp->cfg->bts_jitter_delay_max;
+
 	endp->allocated = 1;
 
 	/* set up RTP media parameters */
@@ -898,6 +903,13 @@
 		case MGCP_POLICY_DEFER:
 			/* stop processing */
 			create_transcoder(endp);
+			/* Set up jitter buffer if required after policy has updated jibuf endp values */
+			if (endp->bts_use_jibuf) {
+				endp->bts_jb = osmo_jibuf_alloc(tcfg->endpoints);
+				osmo_jibuf_set_min_delay(endp->bts_jb, endp->bts_jitter_delay_min);
+				osmo_jibuf_set_max_delay(endp->bts_jb, endp->bts_jitter_delay_max);
+				osmo_jibuf_set_dequeue_cb(endp->bts_jb, mgcp_dejitter_udp_send, &endp->net_end);
+			}
 			return NULL;
 			break;
 		case MGCP_POLICY_CONT:
@@ -906,6 +918,14 @@
 		}
 	}
 
+	/* Set up jitter buffer if required after policy has updated jibuf endp values */
+	if (endp->bts_use_jibuf) {
+		endp->bts_jb = osmo_jibuf_alloc(tcfg->endpoints);
+		osmo_jibuf_set_min_delay(endp->bts_jb, endp->bts_jitter_delay_min);
+		osmo_jibuf_set_max_delay(endp->bts_jb, endp->bts_jitter_delay_max);
+		osmo_jibuf_set_dequeue_cb(endp->bts_jb, mgcp_dejitter_udp_send, &endp->net_end);
+	}
+
 	LOGP(DLMGCP, LOGL_DEBUG, "Creating endpoint on: 0x%x CI: %u port: %u/%u\n",
 		ENDPOINT_NUMBER(endp), endp->ci,
 		endp->net_end.local_port, endp->bts_end.local_port);
@@ -1373,6 +1393,9 @@
 void mgcp_release_endp(struct mgcp_endpoint *endp)
 {
 	LOGP(DLMGCP, LOGL_DEBUG, "Releasing endpoint on: 0x%x\n", ENDPOINT_NUMBER(endp));
+	if (endp->bts_jb)
+		osmo_jibuf_delete(endp->bts_jb);
+	endp->bts_jb = NULL;
 	endp->ci = CI_UNUSED;
 	endp->allocated = 0;