Initially implement the new osmo-mgw and libosmo-mgcp

Leave the old osmo-bsc_mgcp and libosmo-legacy-mgcp as it is; on a copy thereof
(added by a previous commit), apply changes to initially implement the new
osmo-mgw.

Adjust build system and debian packaging to accomodate the new libosmo-mgcp and
osmo-mgw.

The main differences:

*) use a list to manage rtp connections.

Aggregate all rtp related information inside a single struct.

Use a linked list to manage the both connections (net and bts).
The idea behind using a list is that we might support conference
calls at some later point.

Store the linked list in struct mgcp_endpoint, have a private linked
list for each endpoint. The list contains connection items which are
implemented in struct mgcp_conn. A connection is allocated and freed
using the functions in mgcp_conn.c. A connection is allocated on the
reception of a CRCX command and freed with the reception of a DLCX
command.

*) remove external transcoder feature

Fortunatelly the external transcoder feature is not needed
anymore. This patch removes the related code.

*) vty: get rid of CONN_BTS and CONN_NET

Since the new connection model does not make a difference
between BTS and NET connections the VTY should not use
the fixed CONN_BTS and CONN_NET constants.

- Handle the conns list inside the endpoint directly
- introduce function to dump basic rtp connection info
- introduce human readable names for connections

Parts of the code adjusted to use generalized connections instead of explicit
BTS/NET ones:

- teach mgcp_send_dummy() to send dummy packets to any RTP connection
- network: generalize mgcp_bind_net/bts_rtp_port()
- network: generalize mgcp_send()
- tap: generalize call tapping feature
- stat: generalize statistics
- Replace rtp_data_net() and rtp_data_bts() with generalized rtp_data_rx()

*) mgcp_protocol.c fixes:

- check ci string before it is converted:
  In case of missing ci, a nullpointer is delivered to strtoul().
  Add a function that takes ci, checks it and converts it to an
  uint32_t. Use the return code to react on missing ci.
- output error message on missing CI.
- when parsing the mode, print log message when mode is missing.
- use mode_orig when mode is missing.
- fix ptime formatstring to use %u rather than %d.
- cosmetic: log when connection is deleted on DLCX.
- change loglevels of CRCX, MDCX, DLCX events from DEBUG to NOTICE.

*) mgcp_test

- apply rename of strline_r() to mgcp_strline().
- MGCP command macros:
  - Add 'I: 1' parameters.
  - Use proper port numbers:
    from m=audio 0 RTP/AVP 126
    to   m=audio 16002 RTP/AVP 128
  - Change ptime to 'a=ptime:40' because this is what the MGW currently
    returns.  CRCX generally feed a ptime:40 and this is expected to be
    returned.
- struct mgcp_test: Use only one ptype, there are no explicit BTS and NET
  endpoints anymore.
  Hence remove one column from tests[].
- test_messages():
  - Enable: remove '#if 0'
  - Remove concept of BTS and NET endpoints: test only one conn, as they are
    now interchangeable anyway.
  - remove endpoint init, now done internally.
  - add false asserts in error cases.
- test_retransmission():
  - remove endpoint init, now done internally.
  - add false asserts in error cases.
- test_packet_error_detection():
  - Remove concept of BTS and NET endpoints: test only one conn, as they are
    now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
  - remove endpoint init, now done internally.
  - add false assert in error case.
  - Assert that a conn really vanishes on DLCX, previously the conn would
    remain and just be unused, now it is actually discarded.
- test_no_cycle()
  - Remove concept of BTS and NET endpoints: test only one conn, as they are
    now interchangeable anyway. Use arbitrary conn ids (e.g. 4711).
- test_no_name()
  - Enable: remove '#if 0'.
  - remove endpoint init, now done internally.
  - add false assert in error case.
- mgcp_test.ok: adjust expected results to status quo:
  - We now see two dummy packets instead of one, now sent to both sides because
    we don't know of BTS or NET side. (maybe drop dummy packets later...)
  - packet duration, conn mode: now sane defaults show instead of unset.
- various whitespace and formatting changes from lindent.

Change-Id: Ie008599136c7ed8a0dfbb0cf803188975a499fc5
diff --git a/src/libosmo-mgcp/mgcp_vty.c b/src/libosmo-mgcp/mgcp_vty.c
index a48e205..aaa0429 100644
--- a/src/libosmo-mgcp/mgcp_vty.c
+++ b/src/libosmo-mgcp/mgcp_vty.c
@@ -21,12 +21,11 @@
  *
  */
 
-
 #include <osmocom/core/talloc.h>
-
-#include <osmocom/legacy_mgcp/mgcp.h>
-#include <osmocom/legacy_mgcp/mgcp_internal.h>
-#include <osmocom/legacy_mgcp/vty.h>
+#include <osmocom/mgcp/mgcp.h>
+#include <osmocom/mgcp/mgcp_internal.h>
+#include <osmocom/mgcp/vty.h>
+#include <osmocom/mgcp/mgcp_conn.h>
 
 #include <string.h>
 
@@ -48,9 +47,6 @@
 	return trunk;
 }
 
-/*
- * vty code for mgcp below
- */
 struct cmd_node mgcp_node = {
 	MGCP_NODE,
 	"%s(config-mgcp)# ",
@@ -68,26 +64,15 @@
 	vty_out(vty, "mgcp%s", VTY_NEWLINE);
 	if (g_cfg->local_ip)
 		vty_out(vty, "  local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
-	if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
-		vty_out(vty, "  bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
 	vty_out(vty, "  bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
 	vty_out(vty, "  bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
+	vty_out(vty, "  rtp net-range %u %u%s",
+		g_cfg->net_ports.range_start, g_cfg->net_ports.range_end,
+		VTY_NEWLINE);
 
-	if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
-		vty_out(vty, "  rtp bts-base %u%s", g_cfg->bts_ports.base_port, VTY_NEWLINE);
-	else
-		vty_out(vty, "  rtp bts-range %u %u%s",
-			g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
-	if (g_cfg->bts_ports.bind_addr)
-		vty_out(vty, "  rtp bts-bind-ip %s%s", g_cfg->bts_ports.bind_addr, VTY_NEWLINE);
-
-	if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
-		vty_out(vty, "  rtp net-base %u%s", g_cfg->net_ports.base_port, VTY_NEWLINE);
-	else
-		vty_out(vty, "  rtp net-range %u %u%s",
-			g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
 	if (g_cfg->net_ports.bind_addr)
-		vty_out(vty, "  rtp net-bind-ip %s%s", g_cfg->net_ports.bind_addr, VTY_NEWLINE);
+		vty_out(vty, "  rtp net-bind-ip %s%s",
+			g_cfg->net_ports.bind_addr, VTY_NEWLINE);
 
 	vty_out(vty, "  rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
 	if (g_cfg->trunk.keepalive_interval == MGCP_KEEPALIVE_ONCE)
@@ -102,11 +87,14 @@
 		vty_out(vty, "  rtcp-omit%s", VTY_NEWLINE);
 	else
 		vty_out(vty, "  no rtcp-omit%s", VTY_NEWLINE);
-	if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_aligned_timing) {
+	if (g_cfg->trunk.force_constant_ssrc
+	    || g_cfg->trunk.force_aligned_timing) {
 		vty_out(vty, "  %srtp-patch ssrc%s",
-			g_cfg->trunk.force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
+			g_cfg->trunk.force_constant_ssrc ? "" : "no ",
+			VTY_NEWLINE);
 		vty_out(vty, "  %srtp-patch timestamp%s",
-			g_cfg->trunk.force_aligned_timing ? "" : "no ", VTY_NEWLINE);
+			g_cfg->trunk.force_aligned_timing ? "" : "no ",
+			VTY_NEWLINE);
 	} else
 		vty_out(vty, "  no rtp-patch%s", VTY_NEWLINE);
 	if (g_cfg->trunk.audio_payload != -1)
@@ -122,23 +110,17 @@
 		g_cfg->trunk.audio_send_ptime ? "" : "no ", VTY_NEWLINE);
 	vty_out(vty, "  %ssdp audio-payload send-name%s",
 		g_cfg->trunk.audio_send_name ? "" : "no ", VTY_NEWLINE);
-	vty_out(vty, "  loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
-	vty_out(vty, "  number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
+	vty_out(vty, "  loop %u%s", ! !g_cfg->trunk.audio_loop, VTY_NEWLINE);
+	vty_out(vty, "  number endpoints %u%s",
+		g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
 	vty_out(vty, "  %sallow-transcoding%s",
 		g_cfg->trunk.no_audio_transcoding ? "no " : "", VTY_NEWLINE);
 	if (g_cfg->call_agent_addr)
-		vty_out(vty, "  call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
-	if (g_cfg->transcoder_ip)
-		vty_out(vty, "  transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
-
-	if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
-		vty_out(vty, "  rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
-	else
-		vty_out(vty, "  rtp transcoder-range %u %u%s",
-			g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
-	if (g_cfg->bts_force_ptime > 0)
-		vty_out(vty, "  rtp force-ptime %d%s", g_cfg->bts_force_ptime, VTY_NEWLINE);
-	vty_out(vty, "  transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
+		vty_out(vty, "  call-agent ip %s%s", g_cfg->call_agent_addr,
+			VTY_NEWLINE);
+	if (g_cfg->force_ptime > 0)
+		vty_out(vty, "  rtp force-ptime %d%s", g_cfg->force_ptime,
+			VTY_NEWLINE);
 
 	switch (g_cfg->osmux) {
 	case OSMUX_USAGE_ON:
@@ -167,13 +149,12 @@
 	return CMD_SUCCESS;
 }
 
-static void dump_rtp_end(const char *end_name, struct vty *vty,
-			struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
+static void dump_rtp_end(struct vty *vty, struct mgcp_rtp_state *state,
+			 struct mgcp_rtp_end *end)
 {
 	struct mgcp_rtp_codec *codec = &end->codec;
 
 	vty_out(vty,
-		"  %s%s"
 		"   Timestamp Errs: %d->%d%s"
 		"   Dropped Packets: %d%s"
 		"   Payload Type: %d Rate: %u Channels: %d %s"
@@ -181,20 +162,22 @@
 		"   FPP: %d Packet Duration: %u%s"
 		"   FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
 		"   Output-Enabled: %d Force-PTIME: %d%s",
-		end_name, VTY_NEWLINE,
 		state->in_stream.err_ts_counter,
 		state->out_stream.err_ts_counter, VTY_NEWLINE,
 		end->dropped_packets, VTY_NEWLINE,
 		codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
-		codec->frame_duration_num, codec->frame_duration_den, VTY_NEWLINE,
-		end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
-		end->fmtp_extra, codec->audio_name, codec->subtype_name, VTY_NEWLINE,
-		end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
+		codec->frame_duration_num, codec->frame_duration_den,
+		VTY_NEWLINE, end->frames_per_packet, end->packet_duration_ms,
+		VTY_NEWLINE, end->fmtp_extra, codec->audio_name,
+		codec->subtype_name, VTY_NEWLINE, end->output_enabled,
+		end->force_output_ptime, VTY_NEWLINE);
 }
 
-static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
+static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg,
+		       int verbose)
 {
 	int i;
+	struct mgcp_conn *conn;
 
 	vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
 		cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
@@ -207,20 +190,22 @@
 
 	for (i = 1; i < cfg->number_endpoints; ++i) {
 		struct mgcp_endpoint *endp = &cfg->endpoints[i];
-		vty_out(vty,
-			" Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
-			"traffic received bts: %u  remote: %u transcoder: %u/%u%s",
-			i, endp->ci,
-			ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
-			ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
-			inet_ntoa(endp->bts_end.addr),
-			endp->bts_end.packets, endp->net_end.packets,
-			endp->trans_net.packets, endp->trans_bts.packets,
-			VTY_NEWLINE);
 
-		if (verbose && endp->allocated) {
-			dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
-			dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
+		vty_out(vty, "Endpoint 0x%.2x:%s", i, VTY_NEWLINE);
+
+		llist_for_each_entry(conn, &endp->conns, entry) {
+			vty_out(vty, "   CONN: %s%s",
+				mgcp_conn_dump(conn), VTY_NEWLINE);
+
+			if (verbose) {
+				/* FIXME: Also add verbosity for other
+				 * connection types (E1) as soon as
+				 * the implementation is available */
+				if (conn->type == MGCP_CONN_TYPE_RTP) {
+					dump_rtp_end(vty, &conn->u.rtp.state,
+						     &conn->u.rtp.end);
+				}
+			}
 		}
 	}
 }
@@ -237,18 +222,16 @@
 	dump_trunk(vty, &g_cfg->trunk, show_stats);
 
 	llist_for_each_entry(trunk, &g_cfg->trunks, entry)
-		dump_trunk(vty, trunk, show_stats);
+	    dump_trunk(vty, trunk, show_stats);
 
 	if (g_cfg->osmux)
-		vty_out(vty, "Osmux used CID: %d%s", osmux_used_cid(), VTY_NEWLINE);
+		vty_out(vty, "Osmux used CID: %d%s", osmux_used_cid(),
+			VTY_NEWLINE);
 
 	return CMD_SUCCESS;
 }
 
-DEFUN(cfg_mgcp,
-      cfg_mgcp_cmd,
-      "mgcp",
-      "Configure the MGCP")
+DEFUN(cfg_mgcp, cfg_mgcp_cmd, "mgcp", "Configure the MGCP")
 {
 	vty->node = MGCP_NODE;
 	return CMD_SUCCESS;
@@ -258,32 +241,16 @@
       cfg_mgcp_local_ip_cmd,
       "local ip A.B.C.D",
       "Local options for the SDP record\n"
-      IP_STR
-      "IPv4 Address to use in SDP record\n")
+      IP_STR "IPv4 Address to use in SDP record\n")
 {
 	osmo_talloc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
 	return CMD_SUCCESS;
 }
 
-DEFUN(cfg_mgcp_bts_ip,
-      cfg_mgcp_bts_ip_cmd,
-      "bts ip A.B.C.D",
-      "BTS Audio source/destination options\n"
-      IP_STR
-      "IPv4 Address of the BTS\n")
-{
-	osmo_talloc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
-	inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
-	return CMD_SUCCESS;
-}
-
 #define BIND_STR "Listen/Bind related socket option\n"
 DEFUN(cfg_mgcp_bind_ip,
       cfg_mgcp_bind_ip_cmd,
-      "bind ip A.B.C.D",
-      BIND_STR
-      IP_STR
-      "IPv4 Address to bind to\n")
+      "bind ip A.B.C.D", BIND_STR IP_STR "IPv4 Address to bind to\n")
 {
 	osmo_talloc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
 	return CMD_SUCCESS;
@@ -292,9 +259,7 @@
 DEFUN(cfg_mgcp_bind_port,
       cfg_mgcp_bind_port_cmd,
       "bind port <0-65534>",
-      BIND_STR
-      "Port information\n"
-      "UDP port to listen for MGCP messages\n")
+      BIND_STR "Port information\n" "UDP port to listen for MGCP messages\n")
 {
 	unsigned int port = atoi(argv[0]);
 	g_cfg->source_port = port;
@@ -305,55 +270,24 @@
       cfg_mgcp_bind_early_cmd,
       "bind early (0|1)",
       BIND_STR
-      "Bind local ports on start up\n"
-      "Bind on demand\n" "Bind on startup\n")
+      "Bind local ports on start up\n" "Bind on demand\n" "Bind on startup\n")
 {
 	vty_out(vty, "bind early is deprecated, remove it from the config.\n");
 	return CMD_WARNING;
 }
 
-static void parse_base(struct mgcp_port_range *range, const char **argv)
-{
-	unsigned int port = atoi(argv[0]);
-	range->mode = PORT_ALLOC_STATIC;
-	range->base_port = port;
-}
-
 static void parse_range(struct mgcp_port_range *range, const char **argv)
 {
-	range->mode = PORT_ALLOC_DYNAMIC;
 	range->range_start = atoi(argv[0]);
 	range->range_end = atoi(argv[1]);
-	range->last_port = g_cfg->bts_ports.range_start;
+	range->last_port = g_cfg->net_ports.range_start;
 }
 
-
 #define RTP_STR "RTP configuration\n"
-#define BTS_START_STR "First UDP port allocated for the BTS side\n"
-#define NET_START_STR "First UDP port allocated for the NET side\n"
 #define UDP_PORT_STR "UDP Port number\n"
-DEFUN(cfg_mgcp_rtp_bts_base_port,
-      cfg_mgcp_rtp_bts_base_port_cmd,
-      "rtp bts-base <0-65534>",
-      RTP_STR
-      BTS_START_STR
-      UDP_PORT_STR)
-{
-	parse_base(&g_cfg->bts_ports, argv);
-	return CMD_SUCCESS;
-}
-
+#define NET_START_STR "First UDP port allocated\n"
 #define RANGE_START_STR "Start of the range of ports\n"
 #define RANGE_END_STR "End of the range of ports\n"
-DEFUN(cfg_mgcp_rtp_bts_range,
-      cfg_mgcp_rtp_bts_range_cmd,
-      "rtp bts-range <0-65534> <0-65534>",
-      RTP_STR "Range of ports to use for the BTS side\n"
-      RANGE_START_STR RANGE_END_STR)
-{
-	parse_range(&g_cfg->bts_ports, argv);
-	return CMD_SUCCESS;
-}
 
 DEFUN(cfg_mgcp_rtp_net_range,
       cfg_mgcp_rtp_net_range_cmd,
@@ -365,58 +299,6 @@
 	return CMD_SUCCESS;
 }
 
-DEFUN(cfg_mgcp_rtp_net_base_port,
-      cfg_mgcp_rtp_net_base_port_cmd,
-      "rtp net-base <0-65534>",
-      RTP_STR NET_START_STR UDP_PORT_STR)
-{
-	parse_base(&g_cfg->net_ports, argv);
-	return CMD_SUCCESS;
-}
-
-ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
-      "rtp base <0-65534>",
-      RTP_STR BTS_START_STR UDP_PORT_STR)
-
-DEFUN(cfg_mgcp_rtp_transcoder_range,
-      cfg_mgcp_rtp_transcoder_range_cmd,
-      "rtp transcoder-range <0-65534> <0-65534>",
-      RTP_STR "Range of ports to use for the Transcoder\n"
-      RANGE_START_STR RANGE_END_STR)
-{
-	parse_range(&g_cfg->transcoder_ports, argv);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_rtp_transcoder_base,
-      cfg_mgcp_rtp_transcoder_base_cmd,
-      "rtp transcoder-base <0-65534>",
-      RTP_STR "First UDP port allocated for the Transcoder side\n"
-      UDP_PORT_STR)
-{
-	parse_base(&g_cfg->transcoder_ports, argv);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_rtp_bts_bind_ip,
-      cfg_mgcp_rtp_bts_bind_ip_cmd,
-      "rtp bts-bind-ip A.B.C.D",
-      RTP_STR "Bind endpoints facing the BTS\n" "Address to bind to\n")
-{
-	osmo_talloc_replace_string(g_cfg, &g_cfg->bts_ports.bind_addr, argv[0]);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_rtp_no_bts_bind_ip,
-      cfg_mgcp_rtp_no_bts_bind_ip_cmd,
-      "no rtp bts-bind-ip",
-      NO_STR RTP_STR "Bind endpoints facing the BTS\n" "Address to bind to\n")
-{
-	talloc_free(g_cfg->bts_ports.bind_addr);
-	g_cfg->bts_ports.bind_addr = NULL;
-	return CMD_SUCCESS;
-}
-
 DEFUN(cfg_mgcp_rtp_net_bind_ip,
       cfg_mgcp_rtp_net_bind_ip_cmd,
       "rtp net-bind-ip A.B.C.D",
@@ -429,7 +311,8 @@
 DEFUN(cfg_mgcp_rtp_no_net_bind_ip,
       cfg_mgcp_rtp_no_net_bind_ip_cmd,
       "no rtp net-bind-ip",
-      NO_STR RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
+      NO_STR RTP_STR "Bind endpoints facing the Network\n"
+      "Address to bind to\n")
 {
 	talloc_free(g_cfg->net_ports.bind_addr);
 	g_cfg->net_ports.bind_addr = NULL;
@@ -448,28 +331,25 @@
 }
 
 ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
-      "rtp ip-tos <0-255>",
-      RTP_STR
-      "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
-
-#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
-DEFUN(cfg_mgcp_rtp_force_ptime,
+		 "rtp ip-tos <0-255>",
+		 RTP_STR
+		 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
+#define FORCE_PTIME_STR "Force a fixed ptime for packets sent"
+    DEFUN(cfg_mgcp_rtp_force_ptime,
       cfg_mgcp_rtp_force_ptime_cmd,
       "rtp force-ptime (10|20|40)",
       RTP_STR FORCE_PTIME_STR
-      "The required ptime (packet duration) in ms\n"
-      "10 ms\n20 ms\n40 ms\n")
+      "The required ptime (packet duration) in ms\n" "10 ms\n20 ms\n40 ms\n")
 {
-	g_cfg->bts_force_ptime = atoi(argv[0]);
+	g_cfg->force_ptime = atoi(argv[0]);
 	return CMD_SUCCESS;
 }
 
 DEFUN(cfg_mgcp_no_rtp_force_ptime,
       cfg_mgcp_no_rtp_force_ptime_cmd,
-      "no rtp force-ptime",
-      NO_STR RTP_STR FORCE_PTIME_STR)
+      "no rtp force-ptime", NO_STR RTP_STR FORCE_PTIME_STR)
 {
-	g_cfg->bts_force_ptime = 0;
+	g_cfg->force_ptime = 0;
 	return CMD_SUCCESS;
 }
 
@@ -490,8 +370,7 @@
 
 DEFUN(cfg_mgcp_allow_transcoding,
       cfg_mgcp_allow_transcoding_cmd,
-      "allow-transcoding",
-      "Allow transcoding\n")
+      "allow-transcoding", "Allow transcoding\n")
 {
 	g_cfg->trunk.no_audio_transcoding = 0;
 	return CMD_SUCCESS;
@@ -499,8 +378,7 @@
 
 DEFUN(cfg_mgcp_no_allow_transcoding,
       cfg_mgcp_no_allow_transcoding_cmd,
-      "no allow-transcoding",
-      NO_STR "Allow transcoding\n")
+      "no allow-transcoding", NO_STR "Allow transcoding\n")
 {
 	g_cfg->trunk.no_audio_transcoding = 1;
 	return CMD_SUCCESS;
@@ -511,20 +389,19 @@
 DEFUN(cfg_mgcp_sdp_payload_number,
       cfg_mgcp_sdp_payload_number_cmd,
       "sdp audio-payload number <0-255>",
-      SDP_STR AUDIO_STR
-      "Number\n" "Payload number\n")
+      SDP_STR AUDIO_STR "Number\n" "Payload number\n")
 {
 	unsigned int payload = atoi(argv[0]);
 	g_cfg->trunk.audio_payload = payload;
 	return CMD_SUCCESS;
 }
 
-ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
-      "sdp audio payload number <0-255>",
-      SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
-      
+ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number,
+		 cfg_mgcp_sdp_payload_number_cmd_old,
+		 "sdp audio payload number <0-255>",
+		 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
 
-DEFUN(cfg_mgcp_sdp_payload_name,
+    DEFUN(cfg_mgcp_sdp_payload_name,
       cfg_mgcp_sdp_payload_name_cmd,
       "sdp audio-payload name NAME",
       SDP_STR AUDIO_STR "Name\n" "Payload name\n")
@@ -534,14 +411,13 @@
 }
 
 ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
-      "sdp audio payload name NAME",
-      SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
+		 "sdp audio payload name NAME",
+		 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
 
-DEFUN(cfg_mgcp_sdp_payload_send_ptime,
+    DEFUN(cfg_mgcp_sdp_payload_send_ptime,
       cfg_mgcp_sdp_payload_send_ptime_cmd,
       "sdp audio-payload send-ptime",
-      SDP_STR AUDIO_STR
-      "Send SDP ptime (packet duration) attribute\n")
+      SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
 {
 	g_cfg->trunk.audio_send_ptime = 1;
 	return CMD_SUCCESS;
@@ -550,8 +426,7 @@
 DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
       cfg_mgcp_no_sdp_payload_send_ptime_cmd,
       "no sdp audio-payload send-ptime",
-      NO_STR SDP_STR AUDIO_STR
-      "Send SDP ptime (packet duration) attribute\n")
+      NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
 {
 	g_cfg->trunk.audio_send_ptime = 0;
 	return CMD_SUCCESS;
@@ -560,8 +435,7 @@
 DEFUN(cfg_mgcp_sdp_payload_send_name,
       cfg_mgcp_sdp_payload_send_name_cmd,
       "sdp audio-payload send-name",
-      SDP_STR AUDIO_STR
-      "Send SDP rtpmap with the audio name\n")
+      SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
 {
 	g_cfg->trunk.audio_send_name = 1;
 	return CMD_SUCCESS;
@@ -570,8 +444,7 @@
 DEFUN(cfg_mgcp_no_sdp_payload_send_name,
       cfg_mgcp_no_sdp_payload_send_name_cmd,
       "no sdp audio-payload send-name",
-      NO_STR SDP_STR AUDIO_STR
-      "Send SDP rtpmap with the audio name\n")
+      NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
 {
 	g_cfg->trunk.audio_send_name = 0;
 	return CMD_SUCCESS;
@@ -580,8 +453,7 @@
 DEFUN(cfg_mgcp_loop,
       cfg_mgcp_loop_cmd,
       "loop (0|1)",
-      "Loop audio for all endpoints on main trunk\n"
-      "Don't Loop\n" "Loop\n")
+      "Loop audio for all endpoints on main trunk\n" "Don't Loop\n" "Loop\n")
 {
 	if (g_cfg->osmux) {
 		vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
@@ -601,6 +473,16 @@
 	return CMD_SUCCESS;
 }
 
+DEFUN(cfg_mgcp_rtp_accept_all,
+      cfg_mgcp_rtp_accept_all_cmd,
+      "rtp-accept-all (0|1)",
+      "Accept all RTP packets, even when the originating IP/Port does not match\n"
+      "enable filter\n" "disable filter\n")
+{
+	g_cfg->trunk.rtp_accept_all = atoi(argv[0]);
+	return CMD_SUCCESS;
+}
+
 DEFUN(cfg_mgcp_number_endp,
       cfg_mgcp_number_endp_cmd,
       "number endpoints <0-65534>",
@@ -611,19 +493,14 @@
 	return CMD_SUCCESS;
 }
 
-DEFUN(cfg_mgcp_omit_rtcp,
-      cfg_mgcp_omit_rtcp_cmd,
-      "rtcp-omit",
-      RTCP_OMIT_STR)
+DEFUN(cfg_mgcp_omit_rtcp, cfg_mgcp_omit_rtcp_cmd, "rtcp-omit", RTCP_OMIT_STR)
 {
 	g_cfg->trunk.omit_rtcp = 1;
 	return CMD_SUCCESS;
 }
 
 DEFUN(cfg_mgcp_no_omit_rtcp,
-      cfg_mgcp_no_omit_rtcp_cmd,
-      "no rtcp-omit",
-      NO_STR RTCP_OMIT_STR)
+      cfg_mgcp_no_omit_rtcp_cmd, "no rtcp-omit", NO_STR RTCP_OMIT_STR)
 {
 	g_cfg->trunk.omit_rtcp = 0;
 	return CMD_SUCCESS;
@@ -631,10 +508,7 @@
 
 DEFUN(cfg_mgcp_patch_rtp_ssrc,
       cfg_mgcp_patch_rtp_ssrc_cmd,
-      "rtp-patch ssrc",
-      RTP_PATCH_STR
-      "Force a fixed SSRC\n"
-      )
+      "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
 {
 	g_cfg->trunk.force_constant_ssrc = 1;
 	return CMD_SUCCESS;
@@ -642,10 +516,7 @@
 
 DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
       cfg_mgcp_no_patch_rtp_ssrc_cmd,
-      "no rtp-patch ssrc",
-      NO_STR RTP_PATCH_STR
-      "Force a fixed SSRC\n"
-      )
+      "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
 {
 	g_cfg->trunk.force_constant_ssrc = 0;
 	return CMD_SUCCESS;
@@ -653,10 +524,7 @@
 
 DEFUN(cfg_mgcp_patch_rtp_ts,
       cfg_mgcp_patch_rtp_ts_cmd,
-      "rtp-patch timestamp",
-      RTP_PATCH_STR
-      "Adjust RTP timestamp\n"
-      )
+      "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
 {
 	g_cfg->trunk.force_aligned_timing = 1;
 	return CMD_SUCCESS;
@@ -664,19 +532,14 @@
 
 DEFUN(cfg_mgcp_no_patch_rtp_ts,
       cfg_mgcp_no_patch_rtp_ts_cmd,
-      "no rtp-patch timestamp",
-      NO_STR RTP_PATCH_STR
-      "Adjust RTP timestamp\n"
-      )
+      "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
 {
 	g_cfg->trunk.force_aligned_timing = 0;
 	return CMD_SUCCESS;
 }
 
 DEFUN(cfg_mgcp_no_patch_rtp,
-      cfg_mgcp_no_patch_rtp_cmd,
-      "no rtp-patch",
-      NO_STR RTP_PATCH_STR)
+      cfg_mgcp_no_patch_rtp_cmd, "no rtp-patch", NO_STR RTP_PATCH_STR)
 {
 	g_cfg->trunk.force_constant_ssrc = 0;
 	g_cfg->trunk.force_aligned_timing = 0;
@@ -686,9 +549,7 @@
 DEFUN(cfg_mgcp_rtp_keepalive,
       cfg_mgcp_rtp_keepalive_cmd,
       "rtp keep-alive <1-120>",
-      RTP_STR RTP_KEEPALIVE_STR
-      "Keep alive interval in secs\n"
-      )
+      RTP_STR RTP_KEEPALIVE_STR "Keep alive interval in secs\n")
 {
 	mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
 	return CMD_SUCCESS;
@@ -697,9 +558,7 @@
 DEFUN(cfg_mgcp_rtp_keepalive_once,
       cfg_mgcp_rtp_keepalive_once_cmd,
       "rtp keep-alive once",
-      RTP_STR RTP_KEEPALIVE_STR
-      "Send dummy packet only once after CRCX/MDCX\n"
-      )
+      RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n")
 {
 	mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
 	return CMD_SUCCESS;
@@ -707,71 +566,29 @@
 
 DEFUN(cfg_mgcp_no_rtp_keepalive,
       cfg_mgcp_no_rtp_keepalive_cmd,
-      "no rtp keep-alive",
-      NO_STR RTP_STR RTP_KEEPALIVE_STR
-      )
+      "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR)
 {
 	mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
 	return CMD_SUCCESS;
 }
 
-
-
 #define CALL_AGENT_STR "Callagent information\n"
 DEFUN(cfg_mgcp_agent_addr,
       cfg_mgcp_agent_addr_cmd,
       "call-agent ip A.B.C.D",
-      CALL_AGENT_STR IP_STR
-      "IPv4 Address of the callagent\n")
+      CALL_AGENT_STR IP_STR "IPv4 Address of the callagent\n")
 {
 	osmo_talloc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
 	return CMD_SUCCESS;
 }
 
 ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
-      "call agent ip A.B.C.D",
-      CALL_AGENT_STR CALL_AGENT_STR IP_STR
-      "IPv4 Address of the callagent\n")
-      
+		 "call agent ip A.B.C.D",
+		 CALL_AGENT_STR CALL_AGENT_STR IP_STR
+		 "IPv4 Address of the callagent\n")
 
-DEFUN(cfg_mgcp_transcoder,
-      cfg_mgcp_transcoder_cmd,
-      "transcoder-mgw A.B.C.D",
-      "Use a MGW to detranscoder RTP\n"
-      "The IP address of the MGW")
-{
-	osmo_talloc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
-	inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_no_transcoder,
-      cfg_mgcp_no_transcoder_cmd,
-      "no transcoder-mgw",
-      NO_STR "Disable the transcoding\n")
-{
-	if (g_cfg->transcoder_ip) {
-		LOGP(DLMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
-		talloc_free(g_cfg->transcoder_ip);
-		g_cfg->transcoder_ip = NULL;
-	}
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_transcoder_remote_base,
-      cfg_mgcp_transcoder_remote_base_cmd,
-      "transcoder-remote-base <0-65534>",
-      "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
-{
-	g_cfg->transcoder_remote_base = atoi(argv[0]);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
-      "trunk <1-64>",
-      "Configure a SS7 trunk\n" "Trunk Nr\n")
+    DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
+      "trunk <1-64>", "Configure a SS7 trunk\n" "Trunk Nr\n")
 {
 	struct mgcp_trunk_config *trunk;
 	int index = atoi(argv[0]);
@@ -813,19 +630,22 @@
 				trunk->keepalive_interval, VTY_NEWLINE);
 		else
 			vty_out(vty, "  no rtp keep-alive%s", VTY_NEWLINE);
-		vty_out(vty, "  loop %d%s",
-			trunk->audio_loop, VTY_NEWLINE);
+		vty_out(vty, "  loop %d%s", trunk->audio_loop, VTY_NEWLINE);
 		vty_out(vty, "  force-realloc %d%s",
 			trunk->force_realloc, VTY_NEWLINE);
+		vty_out(vty, "  rtp-accept-all %d%s",
+			trunk->rtp_accept_all, VTY_NEWLINE);
 		if (trunk->omit_rtcp)
 			vty_out(vty, "  rtcp-omit%s", VTY_NEWLINE);
 		else
 			vty_out(vty, "  no rtcp-omit%s", VTY_NEWLINE);
 		if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
 			vty_out(vty, "  %srtp-patch ssrc%s",
-				trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
+				trunk->force_constant_ssrc ? "" : "no ",
+				VTY_NEWLINE);
 			vty_out(vty, "  %srtp-patch timestamp%s",
-				trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
+				trunk->force_aligned_timing ? "" : "no ",
+				VTY_NEWLINE);
 		} else
 			vty_out(vty, "  no rtp-patch%s", VTY_NEWLINE);
 		if (trunk->audio_fmtp_extra)
@@ -867,13 +687,13 @@
 }
 
 ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
-      "sdp audio payload number <0-255>",
-      SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
+		 "sdp audio payload number <0-255>",
+		 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
 
-DEFUN(cfg_trunk_payload_name,
+    DEFUN(cfg_trunk_payload_name,
       cfg_trunk_payload_name_cmd,
       "sdp audio-payload name NAME",
-       SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
+      SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 
@@ -882,15 +702,13 @@
 }
 
 ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
-      "sdp audio payload name NAME",
-       SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
+		 "sdp audio payload name NAME",
+		 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
 
-
-DEFUN(cfg_trunk_loop,
+    DEFUN(cfg_trunk_loop,
       cfg_trunk_loop_cmd,
       "loop (0|1)",
-      "Loop audio for all endpoints on this trunk\n"
-      "Don't Loop\n" "Loop\n")
+      "Loop audio for all endpoints on this trunk\n" "Don't Loop\n" "Loop\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 
@@ -905,8 +723,7 @@
 DEFUN(cfg_trunk_sdp_payload_send_ptime,
       cfg_trunk_sdp_payload_send_ptime_cmd,
       "sdp audio-payload send-ptime",
-      SDP_STR AUDIO_STR
-      "Send SDP ptime (packet duration) attribute\n")
+      SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->audio_send_ptime = 1;
@@ -916,8 +733,7 @@
 DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
       cfg_trunk_no_sdp_payload_send_ptime_cmd,
       "no sdp audio-payload send-ptime",
-      NO_STR SDP_STR AUDIO_STR
-      "Send SDP ptime (packet duration) attribute\n")
+      NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->audio_send_ptime = 0;
@@ -927,8 +743,7 @@
 DEFUN(cfg_trunk_sdp_payload_send_name,
       cfg_trunk_sdp_payload_send_name_cmd,
       "sdp audio-payload send-name",
-      SDP_STR AUDIO_STR
-      "Send SDP rtpmap with the audio name\n")
+      SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->audio_send_name = 1;
@@ -938,18 +753,14 @@
 DEFUN(cfg_trunk_no_sdp_payload_send_name,
       cfg_trunk_no_sdp_payload_send_name_cmd,
       "no sdp audio-payload send-name",
-      NO_STR SDP_STR AUDIO_STR
-      "Send SDP rtpmap with the audio name\n")
+      NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->audio_send_name = 0;
 	return CMD_SUCCESS;
 }
 
-DEFUN(cfg_trunk_omit_rtcp,
-      cfg_trunk_omit_rtcp_cmd,
-      "rtcp-omit",
-      RTCP_OMIT_STR)
+DEFUN(cfg_trunk_omit_rtcp, cfg_trunk_omit_rtcp_cmd, "rtcp-omit", RTCP_OMIT_STR)
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->omit_rtcp = 1;
@@ -957,9 +768,7 @@
 }
 
 DEFUN(cfg_trunk_no_omit_rtcp,
-      cfg_trunk_no_omit_rtcp_cmd,
-      "no rtcp-omit",
-      NO_STR RTCP_OMIT_STR)
+      cfg_trunk_no_omit_rtcp_cmd, "no rtcp-omit", NO_STR RTCP_OMIT_STR)
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->omit_rtcp = 0;
@@ -968,10 +777,7 @@
 
 DEFUN(cfg_trunk_patch_rtp_ssrc,
       cfg_trunk_patch_rtp_ssrc_cmd,
-      "rtp-patch ssrc",
-      RTP_PATCH_STR
-      "Force a fixed SSRC\n"
-      )
+      "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->force_constant_ssrc = 1;
@@ -980,10 +786,7 @@
 
 DEFUN(cfg_trunk_no_patch_rtp_ssrc,
       cfg_trunk_no_patch_rtp_ssrc_cmd,
-      "no rtp-patch ssrc",
-      NO_STR RTP_PATCH_STR
-      "Force a fixed SSRC\n"
-      )
+      "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->force_constant_ssrc = 0;
@@ -992,10 +795,7 @@
 
 DEFUN(cfg_trunk_patch_rtp_ts,
       cfg_trunk_patch_rtp_ts_cmd,
-      "rtp-patch timestamp",
-      RTP_PATCH_STR
-      "Adjust RTP timestamp\n"
-      )
+      "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->force_aligned_timing = 1;
@@ -1004,10 +804,7 @@
 
 DEFUN(cfg_trunk_no_patch_rtp_ts,
       cfg_trunk_no_patch_rtp_ts_cmd,
-      "no rtp-patch timestamp",
-      NO_STR RTP_PATCH_STR
-      "Adjust RTP timestamp\n"
-      )
+      "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->force_aligned_timing = 0;
@@ -1015,9 +812,7 @@
 }
 
 DEFUN(cfg_trunk_no_patch_rtp,
-      cfg_trunk_no_patch_rtp_cmd,
-      "no rtp-patch",
-      NO_STR RTP_PATCH_STR)
+      cfg_trunk_no_patch_rtp_cmd, "no rtp-patch", NO_STR RTP_PATCH_STR)
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->force_constant_ssrc = 0;
@@ -1028,9 +823,7 @@
 DEFUN(cfg_trunk_rtp_keepalive,
       cfg_trunk_rtp_keepalive_cmd,
       "rtp keep-alive <1-120>",
-      RTP_STR RTP_KEEPALIVE_STR
-      "Keep-alive interval in secs\n"
-      )
+      RTP_STR RTP_KEEPALIVE_STR "Keep-alive interval in secs\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
@@ -1040,9 +833,7 @@
 DEFUN(cfg_trunk_rtp_keepalive_once,
       cfg_trunk_rtp_keepalive_once_cmd,
       "rtp keep-alive once",
-      RTP_STR RTP_KEEPALIVE_STR
-      "Send dummy packet only once after CRCX/MDCX\n"
-      )
+      RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
@@ -1051,9 +842,7 @@
 
 DEFUN(cfg_trunk_no_rtp_keepalive,
       cfg_trunk_no_rtp_keepalive_cmd,
-      "no rtp keep-alive",
-      NO_STR RTP_STR RTP_KEEPALIVE_STR
-      )
+      "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR)
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	mgcp_trunk_set_keepalive(trunk, 0);
@@ -1062,8 +851,7 @@
 
 DEFUN(cfg_trunk_allow_transcoding,
       cfg_trunk_allow_transcoding_cmd,
-      "allow-transcoding",
-      "Allow transcoding\n")
+      "allow-transcoding", "Allow transcoding\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->no_audio_transcoding = 0;
@@ -1072,22 +860,23 @@
 
 DEFUN(cfg_trunk_no_allow_transcoding,
       cfg_trunk_no_allow_transcoding_cmd,
-      "no allow-transcoding",
-      NO_STR "Allow transcoding\n")
+      "no allow-transcoding", NO_STR "Allow transcoding\n")
 {
 	struct mgcp_trunk_config *trunk = vty->index;
 	trunk->no_audio_transcoding = 1;
 	return CMD_SUCCESS;
 }
 
-DEFUN(loop_endp,
-      loop_endp_cmd,
+DEFUN(loop_conn,
+      loop_conn_cmd,
       "loop-endpoint <0-64> NAME (0|1)",
       "Loop a given endpoint\n" "Trunk number\n"
-      "The name in hex of the endpoint\n" "Disable the loop\n" "Enable the loop\n")
+      "The name in hex of the endpoint\n" "Disable the loop\n"
+      "Enable the loop\n")
 {
 	struct mgcp_trunk_config *trunk;
 	struct mgcp_endpoint *endp;
+	struct mgcp_conn *conn;
 
 	trunk = find_trunk(g_cfg, atoi(argv[0]));
 	if (!trunk) {
@@ -1105,41 +894,48 @@
 	int endp_no = strtoul(argv[1], NULL, 16);
 	if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
 		vty_out(vty, "Loopback number %s/%d is invalid.%s",
-		argv[1], endp_no, VTY_NEWLINE);
+			argv[1], endp_no, VTY_NEWLINE);
 		return CMD_WARNING;
 	}
 
-
 	endp = &trunk->endpoints[endp_no];
 	int loop = atoi(argv[2]);
+	llist_for_each_entry(conn, &endp->conns, entry) {
+		if (conn->type == MGCP_CONN_TYPE_RTP)
+			/* Handle it like a MDCX, switch on SSRC patching if enabled */
+			mgcp_rtp_end_config(endp, 1, &conn->u.rtp.end);
+		else {
+			/* FIXME: Introduce support for other connection (E1)
+			 * types when implementation is available */
+			vty_out(vty, "%%Can't enable SSRC patching,"
+				"connection %s is not an RTP connection.%s",
+				mgcp_conn_dump(conn), VTY_NEWLINE);
+		}
 
-	if (loop)
-		endp->conn_mode = MGCP_CONN_LOOPBACK;
-	else
-		endp->conn_mode = endp->orig_mode;
-
-	/* Handle it like a MDCX, switch on SSRC patching if enabled */
-	mgcp_rtp_end_config(endp, 1, &endp->bts_end);
-	mgcp_rtp_end_config(endp, 1, &endp->net_end);
+		if (loop)
+			conn->mode = MGCP_CONN_LOOPBACK;
+		else
+			conn->mode = conn->mode_orig;
+	}
 
 	return CMD_SUCCESS;
 }
 
-DEFUN(tap_call,
-      tap_call_cmd,
-      "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
+DEFUN(tap_rtp,
+      tap_rtp_cmd,
+      "tap-rtp <0-64> ENDPOINT CONN (in|out) A.B.C.D <0-65534>",
       "Forward data on endpoint to a different system\n" "Trunk number\n"
       "The endpoint in hex\n"
-      "Forward the data coming from the bts\n"
-      "Forward the data coming from the bts leaving to the network\n"
-      "Forward the data coming from the net\n"
-      "Forward the data coming from the net leaving to the bts\n"
+      "The connection id in hex\n"
+      "Forward incoming data\n"
+      "Forward leaving data\n"
       "destination IP of the data\n" "destination port\n")
 {
 	struct mgcp_rtp_tap *tap;
 	struct mgcp_trunk_config *trunk;
 	struct mgcp_endpoint *endp;
-	int port = 0;
+	struct mgcp_conn_rtp *conn;
+	uint32_t conn_id;
 
 	trunk = find_trunk(g_cfg, atoi(argv[0]));
 	if (!trunk) {
@@ -1157,37 +953,39 @@
 	int endp_no = strtoul(argv[1], NULL, 16);
 	if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
 		vty_out(vty, "Endpoint number %s/%d is invalid.%s",
-		argv[1], endp_no, VTY_NEWLINE);
+			argv[1], endp_no, VTY_NEWLINE);
 		return CMD_WARNING;
 	}
 
 	endp = &trunk->endpoints[endp_no];
 
-	if (strcmp(argv[2], "bts-in") == 0) {
-		port = MGCP_TAP_BTS_IN;
-	} else if (strcmp(argv[2], "bts-out") == 0) {
-		port = MGCP_TAP_BTS_OUT;
-	} else if (strcmp(argv[2], "net-in") == 0) {
-		port = MGCP_TAP_NET_IN;
-	} else if (strcmp(argv[2], "net-out") == 0) {
-		port = MGCP_TAP_NET_OUT;
-	} else {
+	conn_id = strtoul(argv[2], NULL, 10);
+	conn = mgcp_conn_get_rtp(endp, conn_id);
+	if (!conn) {
+		vty_out(vty, "Conn ID %s/%d is invalid.%s",
+			argv[2], conn_id, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (strcmp(argv[3], "in") == 0)
+		tap = &conn->tap_in;
+	else if (strcmp(argv[3], "out") == 0)
+		tap = &conn->tap_out;
+	else {
 		vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
 		return CMD_WARNING;
 	}
 
-	tap = &endp->taps[port];
 	memset(&tap->forward, 0, sizeof(tap->forward));
-	inet_aton(argv[3], &tap->forward.sin_addr);
-	tap->forward.sin_port = htons(atoi(argv[4]));
+	inet_aton(argv[4], &tap->forward.sin_addr);
+	tap->forward.sin_port = htons(atoi(argv[5]));
 	tap->enabled = 1;
 	return CMD_SUCCESS;
 }
 
 DEFUN(free_endp, free_endp_cmd,
       "free-endpoint <0-64> NUMBER",
-      "Free the given endpoint\n" "Trunk number\n"
-      "Endpoint number in hex.\n")
+      "Free the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
 {
 	struct mgcp_trunk_config *trunk;
 	struct mgcp_endpoint *endp;
@@ -1208,7 +1006,7 @@
 	int endp_no = strtoul(argv[1], NULL, 16);
 	if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
 		vty_out(vty, "Endpoint number %s/%d is invalid.%s",
-		argv[1], endp_no, VTY_NEWLINE);
+			argv[1], endp_no, VTY_NEWLINE);
 		return CMD_WARNING;
 	}
 
@@ -1219,8 +1017,7 @@
 
 DEFUN(reset_endp, reset_endp_cmd,
       "reset-endpoint <0-64> NUMBER",
-      "Reset the given endpoint\n" "Trunk number\n"
-      "Endpoint number in hex.\n")
+      "Reset the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
 {
 	struct mgcp_trunk_config *trunk;
 	struct mgcp_endpoint *endp;
@@ -1242,7 +1039,7 @@
 	endp_no = strtoul(argv[1], NULL, 16);
 	if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
 		vty_out(vty, "Endpoint number %s/%d is invalid.%s",
-		argv[1], endp_no, VTY_NEWLINE);
+			argv[1], endp_no, VTY_NEWLINE);
 		return CMD_WARNING;
 	}
 
@@ -1256,8 +1053,7 @@
 }
 
 DEFUN(reset_all_endp, reset_all_endp_cmd,
-      "reset-all-endpoints",
-      "Reset all endpoints\n")
+      "reset-all-endpoints", "Reset all endpoints\n")
 {
 	int rc;
 
@@ -1274,21 +1070,25 @@
 DEFUN(cfg_mgcp_osmux,
       cfg_mgcp_osmux_cmd,
       "osmux (on|off|only)",
-       OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
+      OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
 {
 	if (strcmp(argv[0], "off") == 0) {
 		g_cfg->osmux = OSMUX_USAGE_OFF;
 		return CMD_SUCCESS;
 	}
 
+	/* Since OSMUX support is not finished, we do not
+	 * allow to turn it on yet. */
+	vty_out(vty, "OSMUX currently unavailable in this software version.%s", VTY_NEWLINE);
+	return CMD_WARNING;
+
 	if (strcmp(argv[0], "on") == 0)
 		g_cfg->osmux = OSMUX_USAGE_ON;
 	else if (strcmp(argv[0], "only") == 0)
 		g_cfg->osmux = OSMUX_USAGE_ONLY;
 
 	if (g_cfg->trunk.audio_loop) {
-		vty_out(vty, "Cannot use `loop' with `osmux'.%s",
-			VTY_NEWLINE);
+		vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
 		return CMD_WARNING;
 	}
 
@@ -1297,8 +1097,7 @@
 
 DEFUN(cfg_mgcp_osmux_ip,
       cfg_mgcp_osmux_ip_cmd,
-      "osmux bind-ip A.B.C.D",
-      OSMUX_STR IP_STR "IPv4 Address to bind to\n")
+      "osmux bind-ip A.B.C.D", OSMUX_STR IP_STR "IPv4 Address to bind to\n")
 {
 	osmo_talloc_replace_string(g_cfg, &g_cfg->osmux_addr, argv[0]);
 	return CMD_SUCCESS;
@@ -1324,8 +1123,7 @@
 
 DEFUN(cfg_mgcp_osmux_port,
       cfg_mgcp_osmux_port_cmd,
-      "osmux port <1-65535>",
-      OSMUX_STR "port\n" "UDP port\n")
+      "osmux port <1-65535>", OSMUX_STR "port\n" "UDP port\n")
 {
 	g_cfg->osmux_port = atoi(argv[0]);
 	return CMD_SUCCESS;
@@ -1334,7 +1132,8 @@
 DEFUN(cfg_mgcp_osmux_dummy,
       cfg_mgcp_osmux_dummy_cmd,
       "osmux dummy (on|off)",
-      OSMUX_STR "Dummy padding\n" "Enable dummy padding\n" "Disable dummy padding\n")
+      OSMUX_STR "Dummy padding\n" "Enable dummy padding\n"
+      "Disable dummy padding\n")
 {
 	if (strcmp(argv[0], "on") == 0)
 		g_cfg->osmux_dummy = 1;
@@ -1347,8 +1146,8 @@
 int mgcp_vty_init(void)
 {
 	install_element_ve(&show_mgcp_cmd);
-	install_element(ENABLE_NODE, &loop_endp_cmd);
-	install_element(ENABLE_NODE, &tap_call_cmd);
+	install_element(ENABLE_NODE, &loop_conn_cmd);
+	install_element(ENABLE_NODE, &tap_rtp_cmd);
 	install_element(ENABLE_NODE, &free_endp_cmd);
 	install_element(ENABLE_NODE, &reset_endp_cmd);
 	install_element(ENABLE_NODE, &reset_all_endp_cmd);
@@ -1358,21 +1157,12 @@
 
 	vty_install_default(MGCP_NODE);
 	install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_bind_ip_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bts_bind_ip_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
@@ -1382,15 +1172,13 @@
 	install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
-	install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
 	install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
 	install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_force_realloc_cmd);
+	install_element(MGCP_NODE, &cfg_mgcp_rtp_accept_all_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
@@ -1413,7 +1201,6 @@
 	install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
 	install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
 
-
 	install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
 	install_node(&trunk_node, config_write_trunk);
 	vty_install_default(TRUNK_NODE);
@@ -1445,9 +1232,6 @@
 
 static int allocate_trunk(struct mgcp_trunk_config *trunk)
 {
-	int i;
-	struct mgcp_config *cfg = trunk->cfg;
-
 	if (mgcp_endpoints_allocate(trunk) != 0) {
 		LOGP(DLMGCP, LOGL_ERROR,
 		     "Failed to allocate %d endpoints on trunk %d.\n",
@@ -1455,54 +1239,6 @@
 		return -1;
 	}
 
-	/* early bind */
-	for (i = 1; i < trunk->number_endpoints; ++i) {
-		struct mgcp_endpoint *endp = &trunk->endpoints[i];
-
-		if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
-			cfg->last_bts_port += 2;
-			if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
-				LOGP(DLMGCP, LOGL_FATAL,
-				     "Failed to bind: %d\n", cfg->last_bts_port);
-				return -1;
-			}
-			endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
-		}
-
-		if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
-			cfg->last_net_port += 2;
-			if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
-				LOGP(DLMGCP, LOGL_FATAL,
-				     "Failed to bind: %d\n", cfg->last_net_port);
-				return -1;
-			}
-			endp->net_end.local_alloc = PORT_ALLOC_STATIC;
-		}
-
-		if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
-		    cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
-			int rtp_port;
-
-			/* network side */
-			rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
-						      cfg->transcoder_ports.base_port);
-			if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
-				LOGP(DLMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
-				return -1;
-			}
-			endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
-
-			/* bts side */
-			rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
-						      cfg->transcoder_ports.base_port);
-			if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
-				LOGP(DLMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
-				return -1;
-			}
-			endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
-		}
-	}
-
 	return 0;
 }
 
@@ -1519,32 +1255,27 @@
 	g_cfg = cfg;
 	rc = vty_read_config_file(config_file, NULL);
 	if (rc < 0) {
-		fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
+		fprintf(stderr, "Failed to parse the config file: '%s'\n",
+			config_file);
 		return rc;
 	}
 
-
-	if (!g_cfg->bts_ip)
-		fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
-
 	if (!g_cfg->source_addr) {
 		fprintf(stderr, "You need to specify a bind address.\n");
 		return -1;
 	}
 
-	/* initialize the last ports */
-	g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
-	g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
-
 	if (allocate_trunk(&g_cfg->trunk) != 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
+		LOGP(DLMGCP, LOGL_ERROR,
+		     "Failed to initialize the virtual trunk.\n");
 		return -1;
 	}
 
 	llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
 		if (allocate_trunk(trunk) != 0) {
 			LOGP(DLMGCP, LOGL_ERROR,
-			     "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
+			     "Failed to initialize E1 trunk %d.\n",
+			     trunk->trunk_nr);
 			return -1;
 		}
 	}
@@ -1552,4 +1283,3 @@
 
 	return 0;
 }
-