Remove libosmo-legacy-mgcp and osmo-bsc-mgcp

They are only used by openbsc.git programs and belong there.

Change-Id: Id31bef052d3f9b8aada1824d6f7f995ebd39bbfd
diff --git a/Makefile.am b/Makefile.am
index 8fb6e6c..3270e4f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -18,7 +18,6 @@
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = \
-	libosmo-legacy-mgcp.pc \
 	libosmo-mgcp-client.pc \
 	$(NULL)
 
diff --git a/README b/README
index 7f55fe6..29883b8 100644
--- a/README
+++ b/README
@@ -19,10 +19,6 @@
 The libosmo-mgcp-client library exposes utilities used by e.g. OsmoMSC (found
 in osmo-msc.git) to instruct OsmoMGW via its MGCP service.
 
-The libosmo-mgcp library exposes MGCP server utilities used by e.g. OsmoBSC-NAT
-(found in osmo-bsc.git) to navigate RTP streams through a NAT.
-(At time of writing, this is still called libosmo-legacy-mgcp.)
-
 Find OsmoMGW issue tracker and wiki online at
 https://osmocom.org/projects/osmo-mgw
 https://osmocom.org/projects/osmo-mgw/wiki
diff --git a/configure.ac b/configure.ac
index b0b0d21..9f021df 100644
--- a/configure.ac
+++ b/configure.ac
@@ -74,29 +74,6 @@
 	CPPFLAGS="$CPPFLAGS $WERROR_FLAGS"
 fi
 
-# Enable/disable transcoding within osmo-bsc_mgcp?
-AC_ARG_ENABLE([mgcp-transcoding], [AS_HELP_STRING([--enable-mgcp-transcoding], [Build the MGCP gateway with internal transcoding enabled.])],
-    [osmo_ac_mgcp_transcoding="$enableval"],[osmo_ac_mgcp_transcoding="no"])
-AC_ARG_WITH([g729], [AS_HELP_STRING([--with-g729], [Enable G.729 encoding/decoding.])], [osmo_ac_with_g729="$withval"],[osmo_ac_with_g729="no"])
-
-if test "$osmo_ac_mgcp_transcoding" = "yes" ; then
-    AC_CHECK_HEADERS([gsm.h gsm/gsm.h], [osmo_ac_found_gsm_headers=yes])
-    if test "$osmo_ac_found_gsm_headers" != "yes" ; then
-	AC_MSG_ERROR([Unable to find the libgsm headers])
-    fi
-    AC_SUBST(HAVE_GSM_H)
-    AC_SUBST(HAVE_GSM_GSM_H)
-
-    AC_SEARCH_LIBS([gsm_create], [gsm], [LIBRARY_GSM="$LIBS";LIBS=""], [AC_MSG_ERROR([--enable-mgcp-transcoding: cannot find usable libgsm])])
-    AC_SUBST(LIBRARY_GSM)
-    if test "$osmo_ac_with_g729" = "yes" ; then
-	PKG_CHECK_MODULES(LIBBCG729, libbcg729 >= 0.1, [AC_DEFINE([HAVE_BCG729], [1], [Use bgc729 decoder/encoder])])
-    fi
-    AC_DEFINE(BUILD_MGCP_TRANSCODING, 1, [Define if we want to build the MGCP gateway with transcoding support])
-fi
-AM_CONDITIONAL(BUILD_MGCP_TRANSCODING, test "x$osmo_ac_mgcp_transcoding" = "xyes")
-AC_SUBST(osmo_ac_mgcp_transcoding)
-
 dnl Checks for typedefs, structures and compiler characteristics
 
 # The following test is taken from WebKit's webkit.m4
@@ -158,22 +135,17 @@
 AM_CONFIG_HEADER(bscconfig.h)
 
 AC_OUTPUT(
-    libosmo-legacy-mgcp.pc
     libosmo-mgcp-client.pc
     include/Makefile
     include/osmocom/Makefile
-    include/osmocom/legacy_mgcp/Makefile
     include/osmocom/mgcp_client/Makefile
     include/osmocom/mgcp/Makefile
     src/Makefile
-    src/libosmo-legacy-mgcp/Makefile
     src/libosmo-mgcp-client/Makefile
     src/libosmo-mgcp/Makefile
-    src/osmo-bsc_mgcp/Makefile
     src/osmo-mgw/Makefile
     tests/Makefile
     tests/atlocal
-    tests/legacy_mgcp/Makefile
     tests/mgcp_client/Makefile
     tests/mgcp/Makefile
     doc/Makefile
diff --git a/contrib/systemd/osmo-bsc-mgcp.service b/contrib/systemd/osmo-bsc-mgcp.service
deleted file mode 100644
index c040e60..0000000
--- a/contrib/systemd/osmo-bsc-mgcp.service
+++ /dev/null
@@ -1,11 +0,0 @@
-[Unit]
-Description=OpenBSC MGCP
-
-[Service]
-Type=simple
-Restart=always
-ExecStart=/usr/bin/osmo-bsc_mgcp -s -c /etc/osmocom/osmo-bsc-mgcp.cfg
-RestartSec=2
-
-[Install]
-WantedBy=multi-user.target
diff --git a/debian/control b/debian/control
index 0fe098e..d51f463 100644
--- a/debian/control
+++ b/debian/control
@@ -33,24 +33,3 @@
 Multi-Arch: same
 Depends: libosmo-mgcp-client3 (= ${binary:Version}), ${misc:Depends}
 Description: libosmo-mgcp-client: Osmocom's Media Gateway Control Protocol client utilities
-
-Package: osmo-bsc-mgcp
-Architecture: any
-Multi-Arch: foreign
-Depends: libosmo-legacy-mgcp0, ${misc:Depends}, ${shlibs:Depends}
-Description: OsmoBSC-MGCP: Osmocom's Legacy Media Gateway; use osmo-mgw instead.
-
-Package: libosmo-legacy-mgcp0
-Section: libs
-Architecture: any
-Multi-Arch: same
-Pre-Depends: ${misc:Pre-Depends}
-Depends: ${misc:Depends}, ${shlibs:Depends}
-Description: libosmo-legacy-mgcp: Osmocom's Legacy Media Gateway server library; use libosmo-mgcp instead.
-
-Package: libosmo-legacy-mgcp-dev
-Section: libdevel
-Architecture: any
-Multi-Arch: same
-Depends: libosmo-legacy-mgcp0 (= ${binary:Version}), ${misc:Depends}
-Description: libosmo-legacy-mgcp: Osmocom's Legacy Media Gateway server library; use libosmo-mgcp instead.
diff --git a/debian/copyright b/debian/copyright
index 467435f..eb4b478 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -40,30 +40,6 @@
  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-Files:     src/libosmo-legacy-mgcp/g711common.h
-Copyright: 2000 Abramo Bagnara <abramo@alsa-project.org>
-License:   GPL-2.0+
- Wrapper for linphone Codec class by Simon Morlat <simon.morlat@linphone.org>
- .
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
- .
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU General Public License for more details.
- .
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- .
- The FSF address in the above text is the old one.
- .
- On Debian systems, the complete text of the GNU General Public License
- Version 2 can be found in `/usr/share/common-licenses/GPL-2'.
-
 Files:     tests/vty_test_runner.py
 Copyright: 2013 Holger Hans Peter Freyther
            2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
@@ -87,15 +63,3 @@
 Files:     osmoappdesc.py
 Copyright: 2013 Katerina Barone-Adesi <kat.obsc@gmail.com>
 License:   GPL-3.0+
-
-Files:     src/libosmo-legacy-mgcp/mgcp_osmux.c
-Copyright: 2012-2013 On Waves ehf <http://www.on-waves.com>
-           2012-2013 Pablo Neira Ayuso <pablo@gnumonks.org>
-License:   AGPL-3.0+
- All rights not specifically granted under this license are reserved.
- .
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU Affero General Public License as published by the
- Free Software Foundation; either version 3 of the License, or (at your
- option) any later version.
-
diff --git a/debian/libosmo-legacy-mgcp-dev.install b/debian/libosmo-legacy-mgcp-dev.install
deleted file mode 100644
index a57cb50..0000000
--- a/debian/libosmo-legacy-mgcp-dev.install
+++ /dev/null
@@ -1,4 +0,0 @@
-usr/include/osmocom/legacy_mgcp
-usr/lib/*/libosmo-legacy-mgcp.so
-usr/lib/*/libosmo-legacy-mgcp.a
-usr/lib/*/pkgconfig/libosmo-legacy-mgcp.pc
diff --git a/debian/libosmo-legacy-mgcp0.install b/debian/libosmo-legacy-mgcp0.install
deleted file mode 100644
index 90ca89d..0000000
--- a/debian/libosmo-legacy-mgcp0.install
+++ /dev/null
@@ -1 +0,0 @@
-usr/lib/*/libosmo-legacy-mgcp.so.*
diff --git a/debian/osmo-bsc-mgcp.install b/debian/osmo-bsc-mgcp.install
deleted file mode 100644
index bed2f47..0000000
--- a/debian/osmo-bsc-mgcp.install
+++ /dev/null
@@ -1,2 +0,0 @@
-usr/bin/osmo-bsc_mgcp
-usr/share/doc/osmo-mgw/examples/osmo-bsc_mgcp/mgcp.cfg
diff --git a/doc/examples/osmo-bsc_mgcp/mgcp.cfg b/doc/examples/osmo-bsc_mgcp/mgcp.cfg
deleted file mode 100644
index 442162f..0000000
--- a/doc/examples/osmo-bsc_mgcp/mgcp.cfg
+++ /dev/null
@@ -1,14 +0,0 @@
-!
-! MGCP configuration example
-!
-mgcp
- !local ip 10.23.24.2
- !bts ip 10.24.24.1
- !bind ip 10.23.24.1
- bind port 2427
- rtp base 4000
- rtp force-ptime 20
- sdp audio payload number 98
- sdp audio payload name AMR/8000
- number endpoints 31
- no rtcp-omit
diff --git a/include/Makefile.am b/include/Makefile.am
index e8fc211..c34553a 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -3,9 +3,6 @@
 	$(NULL)
 
 nobase_include_HEADERS = \
-	osmocom/legacy_mgcp/mgcp.h \
-	osmocom/legacy_mgcp/mgcp_internal.h \
-	osmocom/legacy_mgcp/osmux.h \
 	osmocom/mgcp_client/mgcp_client.h \
 	osmocom/mgcp_client/mgcp_client_fsm.h \
 	osmocom/mgcp_client/mgcp_common.h \
diff --git a/include/osmocom/Makefile.am b/include/osmocom/Makefile.am
index c752c40..9e78249 100644
--- a/include/osmocom/Makefile.am
+++ b/include/osmocom/Makefile.am
@@ -1,5 +1,4 @@
 SUBDIRS = \
-	legacy_mgcp \
 	mgcp_client \
 	mgcp \
 	$(NULL)
diff --git a/include/osmocom/legacy_mgcp/Makefile.am b/include/osmocom/legacy_mgcp/Makefile.am
deleted file mode 100644
index 4a9550c..0000000
--- a/include/osmocom/legacy_mgcp/Makefile.am
+++ /dev/null
@@ -1,4 +0,0 @@
-noinst_HEADERS = \
-	mgcp_transcode.h \
-	vty.h \
-	$(NULL)
diff --git a/include/osmocom/legacy_mgcp/mgcp.h b/include/osmocom/legacy_mgcp/mgcp.h
deleted file mode 100644
index 7490e37..0000000
--- a/include/osmocom/legacy_mgcp/mgcp.h
+++ /dev/null
@@ -1,298 +0,0 @@
-/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
-
-/*
- * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
- * (C) 2009-2012 by On-Waves
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef OPENBSC_MGCP_H
-#define OPENBSC_MGCP_H
-
-#include <osmocom/core/msgb.h>
-#include <osmocom/core/write_queue.h>
-#include <osmocom/core/timer.h>
-#include <osmocom/core/logging.h>
-
-#include <arpa/inet.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-
-#define RTP_PORT_DEFAULT 4000
-#define RTP_PORT_NET_DEFAULT 16000
-
-/**
- * Calculate the RTP audio port for the given multiplex
- * and the direction. This allows a semi static endpoint
- * to port calculation removing the need for the BSC
- * and the MediaGateway to communicate.
- *
- * Port usage explained:
- *       base + (multiplex * 2) + 0 == local port to wait for network packets
- *       base + (multiplex * 2) + 1 == local port for rtcp
- *
- * The above port will receive packets from the BTS that need
- * to be patched and forwarded to the network.
- * The above port will receive packets from the network that
- * need to be patched and forwarded to the BTS.
- *
- * We assume to have a static BTS IP address so we can differentiate
- * network and BTS.
- *
- */
-static inline int rtp_calculate_port(int multiplex, int base)
-{
-	return base + (multiplex * 2);
-}
-
-
-/*
- * Handling of MGCP Endpoints and the MGCP Config
- */
-struct mgcp_endpoint;
-struct mgcp_config;
-struct mgcp_trunk_config;
-struct mgcp_rtp_end;
-
-#define MGCP_ENDP_CRCX 1
-#define MGCP_ENDP_DLCX 2
-#define MGCP_ENDP_MDCX 3
-
-/*
- * what to do with the msg?
- *	- continue as usual?
- *	- reject and send a failure code?
- *	- defer? do not send anything
- */
-#define MGCP_POLICY_CONT	4
-#define MGCP_POLICY_REJECT	5
-#define MGCP_POLICY_DEFER	6
-
-typedef int (*mgcp_realloc)(struct mgcp_trunk_config *cfg, int endpoint);
-typedef int (*mgcp_change)(struct mgcp_trunk_config *cfg, int endpoint, int state);
-typedef int (*mgcp_policy)(struct mgcp_trunk_config *cfg, int endpoint, int state, const char *transactio_id);
-typedef int (*mgcp_reset)(struct mgcp_trunk_config *cfg);
-typedef int (*mgcp_rqnt)(struct mgcp_endpoint *endp, char tone);
-
-/**
- * Return:
- *   <  0 in case no audio was processed
- *   >= 0 in case audio was processed. The remaining payload
- *   length will be returned.
- */
-typedef int (*mgcp_processing)(struct mgcp_endpoint *endp,
-			       struct mgcp_rtp_end *dst_end,
-			       char *data, int *len, int buf_size);
-typedef int (*mgcp_processing_setup)(struct mgcp_endpoint *endp,
-				     struct mgcp_rtp_end *dst_end,
-				     struct mgcp_rtp_end *src_end);
-
-typedef void (*mgcp_get_format)(struct mgcp_endpoint *endp,
-				int *payload_type,
-				const char**subtype_name,
-				const char**fmtp_extra);
-
-#define PORT_ALLOC_STATIC	0
-#define PORT_ALLOC_DYNAMIC	1
-
-/**
- * This holds information on how to allocate ports
- */
-struct mgcp_port_range {
-	int mode;
-
-	/* addr or NULL to fall-back to default */
-	char *bind_addr;
-
-	/* pre-allocated from a base? */
-	int base_port;
-
-	/* dynamically allocated */
-	int range_start;
-	int range_end;
-	int last_port;
-};
-
-#define MGCP_KEEPALIVE_ONCE (-1)
-
-struct mgcp_trunk_config {
-	struct llist_head entry;
-
-	struct mgcp_config *cfg;
-
-	int trunk_nr;
-	int trunk_type;
-
-	char *audio_fmtp_extra;
-	char *audio_name;
-	int audio_payload;
-	int audio_send_ptime;
-	int audio_send_name;
-	int audio_loop;
-
-	int no_audio_transcoding;
-
-	int omit_rtcp;
-	int keepalive_interval;
-
-	/* RTP patching */
-	int force_constant_ssrc; /* 0: don't, 1: once */
-	int force_aligned_timing;
-
-	/* spec handling */
-	int force_realloc;
-
-	/* timer */
-	struct osmo_timer_list keepalive_timer;
-
-	unsigned int number_endpoints;
-	struct mgcp_endpoint *endpoints;
-};
-
-enum mgcp_role {
-	MGCP_BSC = 0,
-	MGCP_BSC_NAT,
-};
-
-enum mgcp_connection_mode {
-	MGCP_CONN_NONE = 0,
-	MGCP_CONN_RECV_ONLY = 1,
-	MGCP_CONN_SEND_ONLY = 2,
-	MGCP_CONN_RECV_SEND = MGCP_CONN_RECV_ONLY | MGCP_CONN_SEND_ONLY,
-	MGCP_CONN_LOOPBACK  = 4 | MGCP_CONN_RECV_SEND,
-};
-
-struct mgcp_config {
-	int source_port;
-	char *local_ip;
-	char *source_addr;
-	char *bts_ip;
-	char *call_agent_addr;
-
-	struct in_addr bts_in;
-
-	/* transcoder handling */
-	char *transcoder_ip;
-	struct in_addr transcoder_in;
-	int transcoder_remote_base;
-
-	/* RTP processing */
-	mgcp_processing rtp_processing_cb;
-	mgcp_processing_setup setup_rtp_processing_cb;
-
-	mgcp_get_format get_net_downlink_format_cb;
-
-	struct osmo_wqueue gw_fd;
-
-	struct mgcp_port_range bts_ports;
-	struct mgcp_port_range net_ports;
-	struct mgcp_port_range transcoder_ports;
-	int endp_dscp;
-
-	int bts_force_ptime;
-
-	mgcp_change change_cb;
-	mgcp_policy policy_cb;
-	mgcp_reset reset_cb;
-	mgcp_realloc realloc_cb;
-	mgcp_rqnt rqnt_cb;
-	void *data;
-
-	uint32_t last_call_id;
-
-	/* trunk handling */
-	struct mgcp_trunk_config trunk;
-	struct llist_head trunks;
-
-	/* only used for start with a static configuration */
-	int last_net_port;
-	int last_bts_port;
-
-	enum mgcp_role role;
-
-	/* osmux translator: 0 means disabled, 1 means enabled */
-	int osmux;
-	/* addr to bind the server to */
-	char *osmux_addr;
-	/* The BSC-NAT may ask for enabling osmux on demand. This tells us if
-	 * the osmux socket is already initialized.
-	 */
-	int osmux_init;
-	/* osmux batch factor: from 1 to 4 maximum */
-	int osmux_batch;
-	/* osmux batch size (in bytes) */
-	int osmux_batch_size;
-	/* osmux port */
-	uint16_t osmux_port;
-	/* Pad circuit with dummy messages until we see the first voice
-	 * 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 */
-struct mgcp_config *mgcp_config_alloc(void);
-int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
-		      enum mgcp_role role);
-int mgcp_vty_init(void);
-int mgcp_endpoints_allocate(struct mgcp_trunk_config *cfg);
-void mgcp_release_endp(struct mgcp_endpoint *endp);
-void mgcp_initialize_endp(struct mgcp_endpoint *endp);
-int mgcp_reset_transcoder(struct mgcp_config *cfg);
-void mgcp_format_stats(struct mgcp_endpoint *endp, char *stats, size_t size);
-int mgcp_parse_stats(struct msgb *msg, uint32_t *ps, uint32_t *os, uint32_t *pr, uint32_t *_or, int *loss, uint32_t *jitter);
-
-void mgcp_trunk_set_keepalive(struct mgcp_trunk_config *tcfg, int interval);
-
-/*
- * format helper functions
- */
-struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg);
-
-/* adc helper */
-static inline int mgcp_timeslot_to_endpoint(int multiplex, int timeslot)
-{
-	if (timeslot == 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "Timeslot should not be 0\n");
-		timeslot = 255;
-	}
-
-	return timeslot + (32 * multiplex);
-}
-
-static inline void mgcp_endpoint_to_timeslot(int endpoint, int *multiplex, int *timeslot)
-{
-	*multiplex = endpoint / 32;
-	*timeslot = endpoint % 32;
-}
-
-int mgcp_send_reset_ep(struct mgcp_endpoint *endp, int endpoint);
-int mgcp_send_reset_all(struct mgcp_config *cfg);
-
-
-int mgcp_create_bind(const char *source_addr, struct osmo_fd *fd, int port);
-int mgcp_send(struct mgcp_endpoint *endp, int dest, int is_rtp, struct sockaddr_in *addr, char *buf, int rc);
-int mgcp_udp_send(int fd, struct in_addr *addr, int port, char *buf, int len);
-
-#endif
diff --git a/include/osmocom/legacy_mgcp/mgcp_internal.h b/include/osmocom/legacy_mgcp/mgcp_internal.h
deleted file mode 100644
index 956bee0..0000000
--- a/include/osmocom/legacy_mgcp/mgcp_internal.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/* MGCP Private Data */
-
-/*
- * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
- * (C) 2009-2012 by On-Waves
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#pragma once
-
-#include <string.h>
-
-#include <osmocom/core/select.h>
-#include <osmocom/netif/jibuf.h>
-
-#define CI_UNUSED 0
-
-enum mgcp_trunk_type {
-	MGCP_TRUNK_VIRTUAL,
-	MGCP_TRUNK_E1,
-};
-
-struct mgcp_rtp_stream_state {
-	uint32_t ssrc;
-	uint16_t last_seq;
-	uint32_t last_timestamp;
-	uint32_t err_ts_counter;
-	int32_t last_tsdelta;
-	uint32_t last_arrival_time;
-};
-
-struct mgcp_rtp_state {
-	int initialized;
-	int patch_ssrc;
-
-	uint32_t orig_ssrc;
-
-	int seq_offset;
-
-	int32_t  timestamp_offset;
-	uint32_t packet_duration;
-
-	struct mgcp_rtp_stream_state in_stream;
-	struct mgcp_rtp_stream_state out_stream;
-
-	/* jitter and packet loss calculation */
-	int stats_initialized;
-	uint16_t stats_base_seq;
-	uint16_t stats_max_seq;
-	uint32_t stats_ssrc;
-	uint32_t stats_jitter;
-	int32_t stats_transit;
-	int stats_cycles;
-	bool patched_first_rtp_payload; /* FIXME: drop this, see OS#2459 */
-};
-
-struct mgcp_rtp_codec {
-	uint32_t rate;
-	int channels;
-	uint32_t frame_duration_num;
-	uint32_t frame_duration_den;
-
-	int payload_type;
-	char *audio_name;
-	char *subtype_name;
-};
-
-struct mgcp_rtp_end {
-	/* statistics */
-	unsigned int packets;
-	unsigned int octets;
-	unsigned int dropped_packets;
-	struct in_addr addr;
-
-	/* in network byte order */
-	int rtp_port, rtcp_port;
-
-	/* audio codec information */
-	struct mgcp_rtp_codec codec;
-	struct mgcp_rtp_codec alt_codec; /* TODO/XXX: make it generic */
-
-	/* per endpoint data */
-	int  frames_per_packet;
-	uint32_t packet_duration_ms;
-	char *fmtp_extra;
-	int output_enabled;
-	int force_output_ptime;
-
-	/* RTP patching */
-	int force_constant_ssrc; /* -1: always, 0: don't, 1: once */
-	int force_aligned_timing;
-	void *rtp_process_data;
-
-	/*
-	 * Each end has a socket...
-	 */
-	struct osmo_fd rtp;
-	struct osmo_fd rtcp;
-
-	int local_port;
-	int local_alloc;
-};
-
-enum {
-	MGCP_TAP_BTS_IN,
-	MGCP_TAP_BTS_OUT,
-	MGCP_TAP_NET_IN,
-	MGCP_TAP_NET_OUT,
-
-	/* last element */
-	MGCP_TAP_COUNT
-};
-
-struct mgcp_rtp_tap {
-	int enabled;
-	struct sockaddr_in forward;
-};
-
-struct mgcp_lco {
-	char *string;
-	char *codec;
-	int pkt_period_min; /* time in ms */
-	int pkt_period_max; /* time in ms */
-};
-
-enum mgcp_type {
-	MGCP_RTP_DEFAULT	= 0,
-	MGCP_RTP_TRANSCODED,
-	MGCP_OSMUX_BSC,
-	MGCP_OSMUX_BSC_NAT,
-};
-
-#include <osmocom/legacy_mgcp/osmux.h>
-
-struct mgcp_endpoint {
-	int allocated;
-	uint32_t ci;
-	char *callid;
-	struct mgcp_lco local_options;
-	int conn_mode;
-	int orig_mode;
-
-	/* backpointer */
-	struct mgcp_config *cfg;
-	struct mgcp_trunk_config *tcfg;
-
-	/* port status for bts/net */
-	struct mgcp_rtp_end bts_end;
-	struct mgcp_rtp_end net_end;
-
-	/*
-	 * For transcoding we will send from the local_port
-	 * of trans_bts and it will arrive at trans_net from
-	 * where we will forward it to the network.
-	 */
-	struct mgcp_rtp_end trans_bts;
-	struct mgcp_rtp_end trans_net;
-	enum mgcp_type type;
-
-	/* sequence bits */
-	struct mgcp_rtp_state net_state;
-	struct mgcp_rtp_state bts_state;
-
-	/* fields for re-transmission */
-	char *last_trans;
-	char *last_response;
-
-	/* tap for the endpoint */
-	struct mgcp_rtp_tap taps[MGCP_TAP_COUNT];
-
-	struct {
-		/* Osmux state: disabled, activating, active */
-		enum osmux_state state;
-		/* Allocated Osmux circuit ID for this endpoint */
-		int allocated_cid;
-		/* Used Osmux circuit ID for this endpoint */
-		uint8_t cid;
-		/* handle to batch messages */
-		struct osmux_in_handle *in;
-		/* handle to unbatch messages */
-		struct osmux_out_handle out;
-		/* statistics */
-		struct {
-			uint32_t chunks;
-			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)			\
-	for (line = strline_r(NULL, &save); line;\
-	     line = strline_r(NULL, &save))
-
-static inline char *strline_r(char *str, char **saveptr)
-{
-	char *result;
-
-	if (str)
-		*saveptr = str;
-
-	result = *saveptr;
-
-	if (*saveptr != NULL) {
-		*saveptr = strpbrk(*saveptr, "\r\n");
-
-		if (*saveptr != NULL) {
-			char *eos = *saveptr;
-
-			if ((*saveptr)[0] == '\r' && (*saveptr)[1] == '\n')
-				(*saveptr)++;
-			(*saveptr)++;
-			if ((*saveptr)[0] == '\0')
-				*saveptr = NULL;
-
-			*eos = '\0';
-		}
-	}
-
-	return result;
-}
-
-
-
-#define ENDPOINT_NUMBER(endp) abs((int)(endp - endp->tcfg->endpoints))
-
-/**
- * Internal structure while parsing a request
- */
-struct mgcp_parse_data {
-	struct mgcp_config *cfg;
-	struct mgcp_endpoint *endp;
-	char *trans;
-	char *save;
-	int found;
-};
-
-int mgcp_send_dummy(struct mgcp_endpoint *endp);
-int mgcp_bind_bts_rtp_port(struct mgcp_endpoint *endp, int rtp_port);
-int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port);
-int mgcp_bind_trans_bts_rtp_port(struct mgcp_endpoint *enp, int rtp_port);
-int mgcp_bind_trans_net_rtp_port(struct mgcp_endpoint *enp, int rtp_port);
-int mgcp_free_rtp_port(struct mgcp_rtp_end *end);
-
-/* For transcoding we need to manage an in and an output that are connected */
-static inline int endp_back_channel(int endpoint)
-{
-	return endpoint + 60;
-}
-
-struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int index);
-struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index);
-
-void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change,
-			 struct mgcp_rtp_end *rtp);
-uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp,
-				  struct mgcp_rtp_end *rtp);
-
-void mgcp_state_calc_loss(struct mgcp_rtp_state *s, struct mgcp_rtp_end *,
-			uint32_t *expected, int *loss);
-uint32_t mgcp_state_calc_jitter(struct mgcp_rtp_state *);
-
-/* payload processing default functions */
-int mgcp_rtp_processing_default(struct mgcp_endpoint *endp, struct mgcp_rtp_end *dst_end,
-				char *data, int *len, int buf_size);
-
-int mgcp_setup_rtp_processing_default(struct mgcp_endpoint *endp,
-				      struct mgcp_rtp_end *dst_end,
-				      struct mgcp_rtp_end *src_end);
-
-void mgcp_get_net_downlink_format_default(struct mgcp_endpoint *endp,
-					  int *payload_type,
-					  const char**subtype_name,
-					  const char**fmtp_extra);
-
-/* internal RTP Annex A counting */
-void mgcp_rtp_annex_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
-			const uint16_t seq, const int32_t transit,
-			const uint32_t ssrc);
-
-int mgcp_set_ip_tos(int fd, int tos);
-
-enum {
-	MGCP_DEST_NET = 0,
-	MGCP_DEST_BTS,
-};
-
-
-#define MGCP_DUMMY_LOAD 0x23
-
-
-/**
- * SDP related information
- */
-/* Assume audio frame length of 20ms */
-#define DEFAULT_RTP_AUDIO_FRAME_DUR_NUM 20
-#define DEFAULT_RTP_AUDIO_FRAME_DUR_DEN 1000
-#define DEFAULT_RTP_AUDIO_PACKET_DURATION_MS 20
-#define DEFAULT_RTP_AUDIO_DEFAULT_RATE  8000
-#define DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS 1
-
-#define PTYPE_UNDEFINED (-1)
-int mgcp_parse_sdp_data(struct mgcp_endpoint *endp, struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p);
-int mgcp_set_audio_info(void *ctx, struct mgcp_rtp_codec *codec,
-			int payload_type, const char *audio_name);
-
-
-/**
- * Internal network related
- */
-static inline const char *mgcp_net_src_addr(struct mgcp_endpoint *endp)
-{
-	if (endp->cfg->net_ports.bind_addr)
-		return endp->cfg->net_ports.bind_addr;
-	return endp->cfg->source_addr;
-}
-
-static inline const char *mgcp_bts_src_addr(struct mgcp_endpoint *endp)
-{
-	if (endp->cfg->bts_ports.bind_addr)
-		return endp->cfg->bts_ports.bind_addr;
-	return endp->cfg->source_addr;
-}
-
-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/include/osmocom/legacy_mgcp/mgcp_transcode.h b/include/osmocom/legacy_mgcp/mgcp_transcode.h
deleted file mode 100644
index 6892deb..0000000
--- a/include/osmocom/legacy_mgcp/mgcp_transcode.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * (C) 2014 by On-Waves
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-#ifndef OPENBSC_MGCP_TRANSCODE_H
-#define OPENBSC_MGCP_TRANSCODE_H
-
-#include "bscconfig.h"
-
-#if HAVE_GSM_H
-#include <gsm.h>
-#elif HAVE_GSM_GSM_H
-#include <gsm/gsm.h>
-#endif
-#ifdef HAVE_BCG729
-#include <bcg729/decoder.h>
-#include <bcg729/encoder.h>
-#endif
-
-enum audio_format {
-	AF_INVALID,
-	AF_S16,
-	AF_L16,
-	AF_GSM,
-	AF_G729,
-	AF_PCMA,
-	AF_PCMU
-};
-
-
-struct mgcp_process_rtp_state {
-	/* decoding */
-	enum audio_format src_fmt;
-	union {
-		gsm gsm_handle;
-#ifdef HAVE_BCG729
-		bcg729DecoderChannelContextStruct *g729_dec;
-#endif
-	} src;
-	size_t src_frame_size;
-	size_t src_samples_per_frame;
-
-	/* processing */
-
-	/* encoding */
-	enum audio_format dst_fmt;
-	union {
-		gsm gsm_handle;
-#ifdef HAVE_BCG729
-		bcg729EncoderChannelContextStruct *g729_enc;
-#endif
-	} dst;
-	size_t dst_frame_size;
-	size_t dst_samples_per_frame;
-	int dst_packet_duration;
-
-	int is_running;
-	uint16_t next_seq;
-	uint32_t next_time;
-	int16_t samples[10*160];
-	size_t sample_cnt;
-	size_t sample_offs;
-};
-
-
-int mgcp_transcoding_setup(struct mgcp_endpoint *endp,
-			   struct mgcp_rtp_end *dst_end,
-			   struct mgcp_rtp_end *src_end);
-
-void mgcp_transcoding_net_downlink_format(struct mgcp_endpoint *endp,
-					  int *payload_type,
-					  const char**audio_name,
-					  const char**fmtp_extra);
-
-int mgcp_transcoding_process_rtp(struct mgcp_endpoint *endp,
-				 struct mgcp_rtp_end *dst_end,
-				 char *data, int *len, int buf_size);
-
-int mgcp_transcoding_get_frame_size(void *state_, int nsamples, int dst);
-#endif /* OPENBSC_MGCP_TRANSCODE_H */
diff --git a/include/osmocom/legacy_mgcp/osmux.h b/include/osmocom/legacy_mgcp/osmux.h
deleted file mode 100644
index f3ea72a..0000000
--- a/include/osmocom/legacy_mgcp/osmux.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef _OPENBSC_OSMUX_H_
-#define _OPENBSC_OSMUX_H_
-
-#include <osmocom/netif/osmux.h>
-
-#define OSMUX_PORT	1984
-
-enum {
-	OSMUX_ROLE_BSC = 0,
-	OSMUX_ROLE_BSC_NAT,
-};
-
-int osmux_init(int role, struct mgcp_config *cfg);
-int osmux_enable_endpoint(struct mgcp_endpoint *endp, struct in_addr *addr, uint16_t port);
-void osmux_disable_endpoint(struct mgcp_endpoint *endp);
-void osmux_allocate_cid(struct mgcp_endpoint *endp);
-void osmux_release_cid(struct mgcp_endpoint *endp);
-
-int osmux_xfrm_to_rtp(struct mgcp_endpoint *endp, int type, char *buf, int rc);
-int osmux_xfrm_to_osmux(int type, char *buf, int rc, struct mgcp_endpoint *endp);
-
-int osmux_send_dummy(struct mgcp_endpoint *endp);
-
-int osmux_get_cid(void);
-void osmux_put_cid(uint8_t osmux_cid);
-int osmux_used_cid(void);
-
-enum osmux_state {
-	OSMUX_STATE_DISABLED = 0,
-	OSMUX_STATE_NEGOTIATING,
-	OSMUX_STATE_ACTIVATING,
-	OSMUX_STATE_ENABLED,
-};
-
-enum osmux_usage {
-	OSMUX_USAGE_OFF = 0,
-	OSMUX_USAGE_ON = 1,
-	OSMUX_USAGE_ONLY = 2,
-};
-
-#endif
diff --git a/include/osmocom/legacy_mgcp/vty.h b/include/osmocom/legacy_mgcp/vty.h
deleted file mode 100644
index bf6b7a8..0000000
--- a/include/osmocom/legacy_mgcp/vty.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#pragma once
-
-#include <osmocom/vty/command.h>
-
-enum mgcp_vty_node {
-	MGCP_NODE = _LAST_OSMOVTY_NODE + 1,
-	TRUNK_NODE,
-};
diff --git a/libosmo-legacy-mgcp.pc.in b/libosmo-legacy-mgcp.pc.in
deleted file mode 100644
index 62d9edc..0000000
--- a/libosmo-legacy-mgcp.pc.in
+++ /dev/null
@@ -1,10 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: Osmocom legacy Media Gateway Control Protocol library
-Description: C Utility Library
-Version: @VERSION@
-Libs: -L${libdir} -losmo-legacy-mgcp
-Cflags: -I${includedir}/
diff --git a/osmoappdesc.py b/osmoappdesc.py
index c9ebf03..cee5a24 100644
--- a/osmoappdesc.py
+++ b/osmoappdesc.py
@@ -17,11 +17,9 @@
 
 app_configs = {
     "osmo-mgw": ["doc/examples/osmo-mgw/osmo-mgw.cfg"],
-    "osmo-bsc_mgcp": ["doc/examples/osmo-bsc_mgcp/mgcp.cfg"],
 }
 
 apps = [(4243, "src/osmo-mgw/osmo-mgw", "OsmoMGW", "osmo-mgw"),
-        (4243, "src/osmo-bsc_mgcp/osmo-bsc_mgcp", "OpenBSC MGCP", "osmo-bsc_mgcp"),
         ]
 
 vty_command = ["./src/osmo-mgw/osmo-mgw", "-c",
diff --git a/src/Makefile.am b/src/Makefile.am
index fab1bf0..f994f57 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -21,13 +21,11 @@
 
 # Libraries
 SUBDIRS = \
-	libosmo-legacy-mgcp \
 	libosmo-mgcp-client \
 	libosmo-mgcp \
 	$(NULL)
 
 # Programs
 SUBDIRS += \
-	osmo-bsc_mgcp \
 	osmo-mgw \
 	$(NULL)
diff --git a/src/libosmo-legacy-mgcp/Makefile.am b/src/libosmo-legacy-mgcp/Makefile.am
deleted file mode 100644
index 2d6b6dd..0000000
--- a/src/libosmo-legacy-mgcp/Makefile.am
+++ /dev/null
@@ -1,51 +0,0 @@
-AM_CPPFLAGS = \
-	$(all_includes) \
-	-I$(top_srcdir)/include \
-	-I$(top_builddir) \
-	$(NULL)
-
-AM_CFLAGS = \
-	-Wall \
-	$(LIBOSMOCORE_CFLAGS) \
-	$(LIBOSMOVTY_CFLAGS) \
-	$(LIBOSMONETIF_CFLAGS) \
-	$(COVERAGE_CFLAGS) \
-	$(LIBBCG729_CFLAGS) \
-	$(NULL)
-
-AM_LDFLAGS = \
-	$(LIBOSMOCORE_LIBS) \
-	$(LIBOSMOVTY_LIBS) \
-	$(LIBOSMONETIF_LIBS) \
-	$(COVERAGE_LDFLAGS) \
-	$(LIBBCG729_LIBS) \
-	$(LIBRARY_GSM) \
-	$(NULL)
-
-# This is not at all related to the release version, but a range of supported
-# API versions. Read TODO_RELEASE in the source tree's root!
-LEGACY_MGCP_LIBVERSION=1:0:1
-
-lib_LTLIBRARIES = \
-	libosmo-legacy-mgcp.la \
-	$(NULL)
-
-noinst_HEADERS = \
-	g711common.h \
-	$(NULL)
-
-libosmo_legacy_mgcp_la_SOURCES = \
-	mgcp_common.c \
-	mgcp_protocol.c \
-	mgcp_network.c \
-	mgcp_vty.c \
-	mgcp_osmux.c \
-	mgcp_sdp.c \
-	$(NULL)
-if BUILD_MGCP_TRANSCODING
-libosmo_legacy_mgcp_la_SOURCES += \
-	mgcp_transcode.c \
-	$(NULL)
-endif
-
-libosmo_legacy_mgcp_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LEGACY_MGCP_LIBVERSION)
diff --git a/src/libosmo-legacy-mgcp/g711common.h b/src/libosmo-legacy-mgcp/g711common.h
deleted file mode 100644
index cb35fc6..0000000
--- a/src/libosmo-legacy-mgcp/g711common.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *  PCM - A-Law conversion
- *  Copyright (c) 2000 by Abramo Bagnara <abramo@alsa-project.org>
- *
- *  Wrapper for linphone Codec class by Simon Morlat <simon.morlat@linphone.org>
- *
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-static inline int val_seg(int val)
-{
-	int r = 0;
-	val >>= 7; /*7 = 4 + 3*/
-	if (val & 0xf0) {
-		val >>= 4;
-		r += 4;
-	}
-	if (val & 0x0c) {
-		val >>= 2;
-		r += 2;
-	}
-	if (val & 0x02)
-		r += 1;
-	return r;
-}
-
-/*
- * s16_to_alaw() - Convert a 16-bit linear PCM value to 8-bit A-law
- *
- * s16_to_alaw() accepts an 16-bit integer and encodes it as A-law data.
- *
- *		Linear Input Code	Compressed Code
- *	------------------------	---------------
- *	0000000wxyza			000wxyz
- *	0000001wxyza			001wxyz
- *	000001wxyzab			010wxyz
- *	00001wxyzabc			011wxyz
- *	0001wxyzabcd			100wxyz
- *	001wxyzabcde			101wxyz
- *	01wxyzabcdef			110wxyz
- *	1wxyzabcdefg			111wxyz
- *
- * For further information see John C. Bellamy's Digital Telephony, 1982,
- * John Wiley & Sons, pps 98-111 and 472-476.
- * G711 is designed for 13 bits input signal, this function add extra shifting to take this into account.
- */
-
-static inline unsigned char s16_to_alaw(int pcm_val)
-{
-	int		mask;
-	int		seg;
-	unsigned char	aval;
-
-	if (pcm_val >= 0) {
-		mask = 0xD5;
-	} else {
-		mask = 0x55;
-		pcm_val = -pcm_val;
-		if (pcm_val > 0x7fff)
-			pcm_val = 0x7fff;
-	}
-
-	if (pcm_val < 256) /*256 = 32 << 3*/
-		aval = pcm_val >> 4; /*4 = 1 + 3*/
-	else {
-		/* Convert the scaled magnitude to segment number. */
-		seg = val_seg(pcm_val);
-		aval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0x0f);
-	}
-	return aval ^ mask;
-}
-
-/*
- * alaw_to_s16() - Convert an A-law value to 16-bit linear PCM
- *
- */
-static inline int alaw_to_s16(unsigned char a_val)
-{
-	int		t;
-	int		seg;
-
-	a_val ^= 0x55;
-	t = a_val & 0x7f;
-	if (t < 16)
-		t = (t << 4) + 8;
-	else {
-		seg = (t >> 4) & 0x07;
-		t = ((t & 0x0f) << 4) + 0x108;
-		t <<= seg -1;
-	}
-	return ((a_val & 0x80) ? t : -t);
-}
-/*
- * s16_to_ulaw() - Convert a linear PCM value to u-law
- *
- * In order to simplify the encoding process, the original linear magnitude
- * is biased by adding 33 which shifts the encoding range from (0 - 8158) to
- * (33 - 8191). The result can be seen in the following encoding table:
- *
- *	Biased Linear Input Code	Compressed Code
- *	------------------------	---------------
- *	00000001wxyza			000wxyz
- *	0000001wxyzab			001wxyz
- *	000001wxyzabc			010wxyz
- *	00001wxyzabcd			011wxyz
- *	0001wxyzabcde			100wxyz
- *	001wxyzabcdef			101wxyz
- *	01wxyzabcdefg			110wxyz
- *	1wxyzabcdefgh			111wxyz
- *
- * Each biased linear code has a leading 1 which identifies the segment
- * number. The value of the segment number is equal to 7 minus the number
- * of leading 0's. The quantization interval is directly available as the
- * four bits wxyz.  * The trailing bits (a - h) are ignored.
- *
- * Ordinarily the complement of the resulting code word is used for
- * transmission, and so the code word is complemented before it is returned.
- *
- * For further information see John C. Bellamy's Digital Telephony, 1982,
- * John Wiley & Sons, pps 98-111 and 472-476.
- */
-
-static inline unsigned char s16_to_ulaw(int pcm_val)	/* 2's complement (16-bit range) */
-{
-	int mask;
-	int seg;
-	unsigned char uval;
-
-	if (pcm_val < 0) {
-		pcm_val = 0x84 - pcm_val;
-		mask = 0x7f;
-	} else {
-		pcm_val += 0x84;
-		mask = 0xff;
-	}
-	if (pcm_val > 0x7fff)
-		pcm_val = 0x7fff;
-
-	/* Convert the scaled magnitude to segment number. */
-	seg = val_seg(pcm_val);
-
-	/*
-	 * Combine the sign, segment, quantization bits;
-	 * and complement the code word.
-	 */
-	uval = (seg << 4) | ((pcm_val >> (seg + 3)) & 0x0f);
-	return uval ^ mask;
-}
-
-/*
- * ulaw_to_s16() - Convert a u-law value to 16-bit linear PCM
- *
- * First, a biased linear code is derived from the code word. An unbiased
- * output can then be obtained by subtracting 33 from the biased code.
- *
- * Note that this function expects to be passed the complement of the
- * original code word. This is in keeping with ISDN conventions.
- */
-static inline int ulaw_to_s16(unsigned char u_val)
-{
-	int t;
-
-	/* Complement to obtain normal u-law value. */
-	u_val = ~u_val;
-
-	/*
-	 * Extract and bias the quantization bits. Then
-	 * shift up by the segment number and subtract out the bias.
-	 */
-	t = ((u_val & 0x0f) << 3) + 0x84;
-	t <<= (u_val & 0x70) >> 4;
-
-	return ((u_val & 0x80) ? (0x84 - t) : (t - 0x84));
-}
diff --git a/src/libosmo-legacy-mgcp/mgcp_common.c b/src/libosmo-legacy-mgcp/mgcp_common.c
deleted file mode 100644
index 444a060..0000000
--- a/src/libosmo-legacy-mgcp/mgcp_common.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* Media Gateway Control Protocol Media Gateway: RFC 3435 */
-/* Implementations useful both for the MGCP GW as well as MGCP GW clients */
-
-/*
- * (C) 2016 by sysmocom s.m.f.c. GmbH <info@sysmocom.de>
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <errno.h>
-
-#include <osmocom/core/utils.h>
-#include <osmocom/legacy_mgcp/mgcp.h>
-
-const struct value_string mgcp_connection_mode_strs[] = {
-	{ MGCP_CONN_NONE, "none" },
-	{ MGCP_CONN_RECV_SEND, "sendrecv" },
-	{ MGCP_CONN_SEND_ONLY, "sendonly" },
-	{ MGCP_CONN_RECV_ONLY, "recvonly" },
-	{ MGCP_CONN_LOOPBACK, "loopback" },
-	{ 0, NULL }
-};
-
-/* Ensure that the msg->l2h is NUL terminated. */
-int mgcp_msg_terminate_nul(struct msgb *msg)
-{
-	unsigned char *tail = msg->l2h + msgb_l2len(msg); /* char after l2 data */
-	if (tail[-1] == '\0')
-		/* nothing to do */;
-	else if (msgb_tailroom(msg) > 0)
-		tail[0] = '\0';
-	else if (tail[-1] == '\r' || tail[-1] == '\n')
-		tail[-1] = '\0';
-	else {
-		LOGP(DLMGCP, LOGL_ERROR, "Cannot NUL terminate MGCP message: "
-		     "Length: %d, Buffer size: %d\n",
-		     msgb_l2len(msg), msg->data_len);
-		return -ENOTSUP;
-	}
-	return 0;
-}
diff --git a/src/libosmo-legacy-mgcp/mgcp_network.c b/src/libosmo-legacy-mgcp/mgcp_network.c
deleted file mode 100644
index 7b161d2..0000000
--- a/src/libosmo-legacy-mgcp/mgcp_network.c
+++ /dev/null
@@ -1,1202 +0,0 @@
-/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
-/* The protocol implementation */
-
-/*
- * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
- * (C) 2009-2012 by On-Waves
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <errno.h>
-#include <time.h>
-#include <limits.h>
-
-#include <sys/socket.h>
-#include <arpa/inet.h>
-
-#include <osmocom/core/msgb.h>
-#include <osmocom/core/select.h>
-
-#include <osmocom/netif/rtp.h>
-
-#include <osmocom/legacy_mgcp/mgcp.h>
-#include <osmocom/legacy_mgcp/mgcp_internal.h>
-
-#include <osmocom/legacy_mgcp/osmux.h>
-
-#warning "Make use of the rtp proxy code"
-
-
-#define RTP_SEQ_MOD		(1 << 16)
-#define RTP_MAX_DROPOUT		3000
-#define RTP_MAX_MISORDER	100
-#define RTP_BUF_SIZE		4096
-
-enum {
-	MGCP_PROTO_RTP,
-	MGCP_PROTO_RTCP,
-};
-
-/**
- * This does not need to be a precision timestamp and
- * is allowed to wrap quite fast. The returned value is
- * 1/unit seconds.
- */
-static uint32_t get_current_ts(unsigned unit)
-{
-	struct timespec tp;
-	uint64_t ret;
-
-	if (!unit)
-		return 0;
-
-	memset(&tp, 0, sizeof(tp));
-	if (clock_gettime(CLOCK_MONOTONIC, &tp) != 0)
-		LOGP(DLMGCP, LOGL_NOTICE,
-			"Getting the clock failed.\n");
-
-	/* convert it to 1/unit seconds */
-	ret = tp.tv_sec;
-	ret *= unit;
-	ret += (int64_t)tp.tv_nsec * unit / 1000 / 1000 / 1000;
-
-	return ret;
-}
-
-int mgcp_udp_send(int fd, struct in_addr *addr, int port, char *buf, int len)
-{
-	struct sockaddr_in out;
-	out.sin_family = AF_INET;
-	out.sin_port = port;
-	memcpy(&out.sin_addr, addr, sizeof(*addr));
-
-	return sendto(fd, buf, len, 0, (struct sockaddr *)&out, sizeof(out));
-}
-
-int mgcp_send_dummy(struct mgcp_endpoint *endp)
-{
-	static char buf[] = { MGCP_DUMMY_LOAD };
-	int rc;
-	int was_rtcp = 0;
-
-	rc = mgcp_udp_send(endp->net_end.rtp.fd, &endp->net_end.addr,
-			   endp->net_end.rtp_port, buf, 1);
-
-	if (rc == -1)
-		goto failed;
-
-	if (endp->tcfg->omit_rtcp)
-		return rc;
-
-	was_rtcp = 1;
-	rc = mgcp_udp_send(endp->net_end.rtcp.fd, &endp->net_end.addr,
-			   endp->net_end.rtcp_port, buf, 1);
-
-	if (rc >= 0)
-		return rc;
-
-failed:
-	LOGP(DLMGCP, LOGL_ERROR,
-		"Failed to send dummy %s packet: %s on: 0x%x to %s:%d\n",
-		was_rtcp ? "RTCP" : "RTP",
-		strerror(errno), ENDPOINT_NUMBER(endp), inet_ntoa(endp->net_end.addr),
-		was_rtcp ? endp->net_end.rtcp_port : endp->net_end.rtp_port);
-
-	return -1;
-}
-
-static int32_t compute_timestamp_aligment_error(struct mgcp_rtp_stream_state *sstate,
-						int ptime, uint32_t timestamp)
-{
-	int32_t timestamp_delta;
-
-	if (ptime == 0)
-		return 0;
-
-	/* Align according to: T - Tlast = k * Tptime */
-	timestamp_delta = timestamp - sstate->last_timestamp;
-
-	return timestamp_delta % ptime;
-}
-
-static int check_rtp_timestamp(struct mgcp_endpoint *endp,
-			       struct mgcp_rtp_state *state,
-			       struct mgcp_rtp_stream_state *sstate,
-			       struct mgcp_rtp_end *rtp_end,
-			       struct sockaddr_in *addr,
-			       uint16_t seq, uint32_t timestamp,
-			       const char *text, int32_t *tsdelta_out)
-{
-	int32_t tsdelta;
-	int32_t timestamp_error;
-
-	/* Not fully intialized, skip */
-	if (sstate->last_tsdelta == 0 && timestamp == sstate->last_timestamp)
-		return 0;
-
-	if (seq == sstate->last_seq) {
-		if (timestamp != sstate->last_timestamp) {
-			sstate->err_ts_counter += 1;
-			LOGP(DLMGCP, LOGL_ERROR,
-			     "The %s timestamp delta is != 0 but the sequence "
-			     "number %d is the same, "
-			     "TS offset: %d, SeqNo offset: %d "
-			     "on 0x%x SSRC: %u timestamp: %u "
-			     "from %s:%d in %d\n",
-			     text, seq,
-			     state->timestamp_offset, state->seq_offset,
-			     ENDPOINT_NUMBER(endp), sstate->ssrc, timestamp,
-			     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-			     endp->conn_mode);
-		}
-		return 0;
-	}
-
-	tsdelta =
-		(int32_t)(timestamp - sstate->last_timestamp) /
-		(int16_t)(seq - sstate->last_seq);
-
-	if (tsdelta == 0) {
-		/* Don't update *tsdelta_out */
-		LOGP(DLMGCP, LOGL_NOTICE,
-		     "The %s timestamp delta is %d "
-		     "on 0x%x SSRC: %u timestamp: %u "
-		     "from %s:%d in %d\n",
-		     text, tsdelta,
-		     ENDPOINT_NUMBER(endp), sstate->ssrc, timestamp,
-		     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-		     endp->conn_mode);
-
-		return 0;
-	}
-
-	if (sstate->last_tsdelta != tsdelta) {
-		if (sstate->last_tsdelta) {
-			LOGP(DLMGCP, LOGL_INFO,
-			     "The %s timestamp delta changes from %d to %d "
-			     "on 0x%x SSRC: %u timestamp: %u from %s:%d in %d\n",
-			     text, sstate->last_tsdelta, tsdelta,
-			     ENDPOINT_NUMBER(endp), sstate->ssrc, timestamp,
-			     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-			     endp->conn_mode);
-		}
-	}
-
-	if (tsdelta_out)
-		*tsdelta_out = tsdelta;
-
-	timestamp_error =
-		compute_timestamp_aligment_error(sstate, state->packet_duration,
-						 timestamp);
-
-	if (timestamp_error) {
-		sstate->err_ts_counter += 1;
-		LOGP(DLMGCP, LOGL_NOTICE,
-		     "The %s timestamp has an alignment error of %d "
-		     "on 0x%x SSRC: %u "
-		     "SeqNo delta: %d, TS delta: %d, dTS/dSeq: %d "
-		     "from %s:%d in mode %d. ptime: %d\n",
-		     text, timestamp_error,
-		     ENDPOINT_NUMBER(endp), sstate->ssrc,
-		     (int16_t)(seq - sstate->last_seq),
-		     (int32_t)(timestamp - sstate->last_timestamp),
-		     tsdelta,
-		     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-		     endp->conn_mode, state->packet_duration);
-	}
-	return 1;
-}
-
-/* Set the timestamp offset according to the packet duration. */
-static int adjust_rtp_timestamp_offset(struct mgcp_endpoint *endp,
-				       struct mgcp_rtp_state *state,
-				       struct mgcp_rtp_end *rtp_end,
-				       struct sockaddr_in *addr,
-				       int16_t delta_seq, uint32_t in_timestamp)
-{
-	int32_t tsdelta = state->packet_duration;
-	int timestamp_offset;
-	uint32_t out_timestamp;
-
-	if (tsdelta == 0) {
-		tsdelta = state->out_stream.last_tsdelta;
-		if (tsdelta != 0) {
-			LOGP(DLMGCP, LOGL_NOTICE,
-			     "A fixed packet duration is not available on 0x%x, "
-			     "using last output timestamp delta instead: %d "
-			     "from %s:%d in %d\n",
-			     ENDPOINT_NUMBER(endp), tsdelta,
-			     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-			     endp->conn_mode);
-		} else {
-			tsdelta = rtp_end->codec.rate * 20 / 1000;
-			LOGP(DLMGCP, LOGL_NOTICE,
-			     "Fixed packet duration and last timestamp delta "
-			     "are not available on 0x%x, "
-			     "using fixed 20ms instead: %d "
-			     "from %s:%d in %d\n",
-			     ENDPOINT_NUMBER(endp), tsdelta,
-			     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-			     endp->conn_mode);
-		}
-	}
-
-	out_timestamp = state->out_stream.last_timestamp + delta_seq * tsdelta;
-	timestamp_offset = out_timestamp - in_timestamp;
-
-	if (state->timestamp_offset != timestamp_offset) {
-		state->timestamp_offset = timestamp_offset;
-
-		LOGP(DLMGCP, LOGL_NOTICE,
-		     "Timestamp offset change on 0x%x SSRC: %u "
-		     "SeqNo delta: %d, TS offset: %d, "
-		     "from %s:%d in %d\n",
-		     ENDPOINT_NUMBER(endp), state->in_stream.ssrc,
-		     delta_seq, state->timestamp_offset,
-		     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-		     endp->conn_mode);
-	}
-
-	return timestamp_offset;
-}
-
-/* Set the timestamp offset according to the packet duration. */
-static int align_rtp_timestamp_offset(struct mgcp_endpoint *endp,
-				      struct mgcp_rtp_state *state,
-				      struct mgcp_rtp_end *rtp_end,
-				      struct sockaddr_in *addr,
-				      uint32_t timestamp)
-{
-	int timestamp_error = 0;
-	int ptime = state->packet_duration;
-
-	/* Align according to: T + Toffs - Tlast = k * Tptime */
-
-	timestamp_error = compute_timestamp_aligment_error(
-		&state->out_stream, ptime,
-		timestamp + state->timestamp_offset);
-
-	if (timestamp_error) {
-		state->timestamp_offset += ptime - timestamp_error;
-
-		LOGP(DLMGCP, LOGL_NOTICE,
-		     "Corrected timestamp alignment error of %d on 0x%x SSRC: %u "
-		     "new TS offset: %d, "
-		     "from %s:%d in %d\n",
-		     timestamp_error,
-		     ENDPOINT_NUMBER(endp), state->in_stream.ssrc,
-		     state->timestamp_offset, inet_ntoa(addr->sin_addr),
-		     ntohs(addr->sin_port), endp->conn_mode);
-	}
-
-	OSMO_ASSERT(compute_timestamp_aligment_error(&state->out_stream, ptime,
-						     timestamp + state->timestamp_offset) == 0);
-
-	return timestamp_error;
-}
-
-int mgcp_rtp_processing_default(struct mgcp_endpoint *endp, struct mgcp_rtp_end *dst_end,
-				char *data, int *len, int buf_size)
-{
-	return 0;
-}
-
-int mgcp_setup_rtp_processing_default(struct mgcp_endpoint *endp,
-				      struct mgcp_rtp_end *dst_end,
-				      struct mgcp_rtp_end *src_end)
-{
-	return 0;
-}
-
-void mgcp_get_net_downlink_format_default(struct mgcp_endpoint *endp,
-					  int *payload_type,
-					  const char**audio_name,
-					  const char**fmtp_extra)
-{
-	/* Use the BTS side parameters when passing the SDP data (for
-	 * downlink) to the net peer.
-	 */
-	*payload_type = endp->bts_end.codec.payload_type;
-	*audio_name = endp->bts_end.codec.audio_name;
-	*fmtp_extra = endp->bts_end.fmtp_extra;
-}
-
-
-void mgcp_rtp_annex_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
-			const uint16_t seq, const int32_t transit,
-			const uint32_t ssrc)
-{
-	int32_t d;
-
-	/* initialize or re-initialize */
-	if (!state->stats_initialized || state->stats_ssrc != ssrc) {
-		state->stats_initialized = 1;
-		state->stats_base_seq = seq;
-		state->stats_max_seq = seq - 1;
-		state->stats_ssrc = ssrc;
-		state->stats_jitter = 0;
-		state->stats_transit = transit;
-		state->stats_cycles = 0;
-	} else {
-		uint16_t udelta;
-
-		/*
-		 * The below takes the shape of the validation of
-		 * Appendix A. Check if there is something weird with
-		 * the sequence number, otherwise check for a wrap
-		 * around in the sequence number.
-		 * It can't wrap during the initialization so let's
-		 * skip it here. The Appendix A probably doesn't have
-		 * this issue because of the probation.
-		 */
-		udelta = seq - state->stats_max_seq;
-		if (udelta < RTP_MAX_DROPOUT) {
-			if (seq < state->stats_max_seq)
-				state->stats_cycles += RTP_SEQ_MOD;
-		} else if (udelta <= RTP_SEQ_MOD - RTP_MAX_MISORDER) {
-			LOGP(DLMGCP, LOGL_NOTICE,
-				"RTP seqno made a very large jump on 0x%x delta: %u\n",
-				ENDPOINT_NUMBER(endp), udelta);
-		}
-	}
-
-	/*
-	 * Calculate the jitter between the two packages. The TS should be
-	 * taken closer to the read function. This was taken from the
-	 * Appendix A of RFC 3550. Timestamp and arrival_time have a 1/rate
-	 * resolution.
-	 */
-	d = transit - state->stats_transit;
-	state->stats_transit = transit;
-	if (d < 0)
-		d = -d;
-	state->stats_jitter += d - ((state->stats_jitter + 8) >> 4);
-	state->stats_max_seq = seq;
-}
-
-
-
-/**
- * The RFC 3550 Appendix A assumes there are multiple sources but
- * some of the supported endpoints (e.g. the nanoBTS) can only handle
- * one source and this code will patch RTP header to appear as if there
- * is only one source.
- * There is also no probation period for new sources. Every RTP header
- * we receive will be seen as a switch in streams.
- */
-void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
-			  struct mgcp_rtp_end *rtp_end, struct sockaddr_in *addr,
-			  char *data, int len)
-{
-	uint32_t arrival_time;
-	int32_t transit;
-	uint16_t seq;
-	uint32_t timestamp, ssrc;
-	struct rtp_hdr *rtp_hdr;
-	int payload = rtp_end->codec.payload_type;
-
-	if (len < sizeof(*rtp_hdr))
-		return;
-
-	rtp_hdr = (struct rtp_hdr *) data;
-	seq = ntohs(rtp_hdr->sequence);
-	timestamp = ntohl(rtp_hdr->timestamp);
-	arrival_time = get_current_ts(rtp_end->codec.rate);
-	ssrc = ntohl(rtp_hdr->ssrc);
-	transit = arrival_time - timestamp;
-
-	mgcp_rtp_annex_count(endp, state, seq, transit, ssrc);
-
-	if (!state->initialized) {
-		state->initialized = 1;
-		state->in_stream.last_seq = seq - 1;
-		state->in_stream.ssrc = state->orig_ssrc = ssrc;
-		state->in_stream.last_tsdelta = 0;
-		state->packet_duration = mgcp_rtp_packet_duration(endp, rtp_end);
-		state->out_stream = state->in_stream;
-		state->out_stream.last_timestamp = timestamp;
-		state->out_stream.ssrc = ssrc - 1; /* force output SSRC change */
-		LOGP(DLMGCP, LOGL_INFO,
-			"Initializing stream on 0x%x SSRC: %u timestamp: %u "
-			"pkt-duration: %d, from %s:%d in %d\n",
-			ENDPOINT_NUMBER(endp), state->in_stream.ssrc,
-			state->seq_offset, state->packet_duration,
-			inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-			endp->conn_mode);
-		if (state->packet_duration == 0) {
-			state->packet_duration = rtp_end->codec.rate * 20 / 1000;
-			LOGP(DLMGCP, LOGL_NOTICE,
-			     "Fixed packet duration is not available on 0x%x, "
-			     "using fixed 20ms instead: %d from %s:%d in %d\n",
-			     ENDPOINT_NUMBER(endp), state->packet_duration,
-			     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-			     endp->conn_mode);
-		}
-	} else if (state->in_stream.ssrc != ssrc) {
-		LOGP(DLMGCP, LOGL_NOTICE,
-			"The SSRC changed on 0x%x: %u -> %u  "
-			"from %s:%d in %d\n",
-			ENDPOINT_NUMBER(endp),
-			state->in_stream.ssrc, rtp_hdr->ssrc,
-			inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-			endp->conn_mode);
-
-		state->in_stream.ssrc = ssrc;
-		if (rtp_end->force_constant_ssrc) {
-			int16_t delta_seq;
-
-			/* Always increment seqno by 1 */
-			state->seq_offset =
-				(state->out_stream.last_seq + 1) - seq;
-
-			/* Estimate number of packets that would have been sent */
-			delta_seq =
-				(arrival_time - state->in_stream.last_arrival_time
-				 + state->packet_duration/2) /
-				state->packet_duration;
-
-			adjust_rtp_timestamp_offset(endp, state, rtp_end, addr,
-						    delta_seq, timestamp);
-
-			state->patch_ssrc = 1;
-			ssrc = state->orig_ssrc;
-			if (rtp_end->force_constant_ssrc != -1)
-				rtp_end->force_constant_ssrc -= 1;
-
-			LOGP(DLMGCP, LOGL_NOTICE,
-			     "SSRC patching enabled on 0x%x SSRC: %u "
-			     "SeqNo offset: %d, TS offset: %d "
-			     "from %s:%d in %d\n",
-			     ENDPOINT_NUMBER(endp), state->in_stream.ssrc,
-			     state->seq_offset, state->timestamp_offset,
-			     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
-			     endp->conn_mode);
-		}
-
-		state->in_stream.last_tsdelta = 0;
-	} else {
-		/* Compute current per-packet timestamp delta */
-		check_rtp_timestamp(endp, state, &state->in_stream, rtp_end, addr,
-				    seq, timestamp, "input",
-				    &state->in_stream.last_tsdelta);
-
-		if (state->patch_ssrc)
-			ssrc = state->orig_ssrc;
-	}
-
-	/* Save before patching */
-	state->in_stream.last_timestamp = timestamp;
-	state->in_stream.last_seq = seq;
-	state->in_stream.last_arrival_time = arrival_time;
-
-	if (rtp_end->force_aligned_timing &&
-	    state->out_stream.ssrc == ssrc && state->packet_duration)
-		/* Align the timestamp offset */
-		align_rtp_timestamp_offset(endp, state, rtp_end, addr, timestamp);
-
-	/* Store the updated SSRC back to the packet */
-	if (state->patch_ssrc)
-		rtp_hdr->ssrc = htonl(ssrc);
-
-	/* Apply the offset and store it back to the packet.
-	 * This won't change anything if the offset is 0, so the conditional is
-	 * omitted. */
-	seq += state->seq_offset;
-	rtp_hdr->sequence = htons(seq);
-	timestamp += state->timestamp_offset;
-	rtp_hdr->timestamp = htonl(timestamp);
-
-	/* Check again, whether the timestamps are still valid */
-	if (state->out_stream.ssrc == ssrc)
-		check_rtp_timestamp(endp, state, &state->out_stream, rtp_end,
-				    addr, seq, timestamp, "output",
-				    &state->out_stream.last_tsdelta);
-
-	/* Save output values */
-	state->out_stream.last_seq = seq;
-	state->out_stream.last_timestamp = timestamp;
-	state->out_stream.ssrc = ssrc;
-
-	if (payload < 0)
-		return;
-
-#if 0
-	DEBUGP(DLMGCP, "Payload hdr payload %u -> endp payload %u\n",
-	       rtp_hdr->payload_type, payload);
-	rtp_hdr->payload_type = payload;
-#endif
-}
-
-/*
- * The below code is for dispatching. We have a dedicated port for
- * the data coming from the net and one to discover the BTS.
- */
-static int forward_data(int fd, struct mgcp_rtp_tap *tap, const char *buf, int len)
-{
-	if (!tap->enabled)
-		return 0;
-
-	return sendto(fd, buf, len, 0,
-		      (struct sockaddr *)&tap->forward, sizeof(tap->forward));
-}
-
-static int mgcp_send_transcoder(struct mgcp_rtp_end *end,
-				struct mgcp_config *cfg, int is_rtp,
-				const char *buf, int len)
-{
-	int rc;
-	int port;
-	struct sockaddr_in addr;
-
-	port = is_rtp ? end->rtp_port : end->rtcp_port;
-
-	addr.sin_family = AF_INET;
-	addr.sin_addr = cfg->transcoder_in;
-	addr.sin_port = port;
-
-	rc = sendto(is_rtp ?
-		end->rtp.fd :
-		end->rtcp.fd, buf, len, 0,
-		(struct sockaddr *) &addr, sizeof(addr));
-
-	if (rc != len)
-		LOGP(DLMGCP, LOGL_ERROR,
-			"Failed to send data to the transcoder: %s\n",
-			strerror(errno));
-
-	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, &rtp_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)
-{
-	struct mgcp_trunk_config *tcfg = endp->tcfg;
-	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",
-	     ENDPOINT_NUMBER(endp),
-	     dest == MGCP_DEST_NET? "net" : "bts",
-	     tcfg->audio_loop,
-	     endp->conn_mode,
-	     endp->conn_mode == MGCP_CONN_LOOPBACK);
-
-	/* For loop toggle the destination and then dispatch. */
-	if (tcfg->audio_loop)
-		dest = !dest;
-
-	/* Loop based on the conn_mode, maybe undoing the above */
-	if (endp->conn_mode == MGCP_CONN_LOOPBACK)
-		dest = !dest;
-
-	if (dest == MGCP_DEST_NET) {
-		rtp_end = &endp->net_end;
-		rtp_state = &endp->bts_state;
-		tap_idx = MGCP_TAP_NET_OUT;
-		jb = endp->bts_jb;
-	} else {
-		rtp_end = &endp->bts_end;
-		rtp_state = &endp->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",
-	     ENDPOINT_NUMBER(endp),
-	     dest == MGCP_DEST_NET? "net" : "bts",
-
-	     inet_ntoa(endp->net_end.addr),
-	     ntohs(endp->net_end.rtp_port),
-	     ntohs(endp->net_end.rtcp_port),
-
-	     inet_ntoa(endp->bts_end.addr),
-	     ntohs(endp->bts_end.rtp_port),
-	     ntohs(endp->bts_end.rtcp_port),
-
-	     inet_ntoa(rtp_end->addr),
-	     ntohs(rtp_end->rtp_port),
-	     ntohs(rtp_end->rtcp_port)
-	    );
-
-	if (!rtp_end->output_enabled) {
-		rtp_end->dropped_packets += 1;
-		LOGP(DLMGCP, LOGL_DEBUG,
-		     "endpoint %x output disabled, drop to %s %s %d %d\n",
-		     ENDPOINT_NUMBER(endp),
-		     dest == MGCP_DEST_NET? "net" : "bts",
-		     inet_ntoa(rtp_end->addr),
-		     ntohs(rtp_end->rtp_port),
-		     ntohs(rtp_end->rtcp_port)
-		    );
-	} else if (is_rtp) {
-		int cont;
-		int nbytes = 0;
-		int len = rc;
-		do {
-			cont = endp->cfg->rtp_processing_cb(endp, rtp_end,
-							buf, &len, RTP_BUF_SIZE);
-			if (cont < 0)
-				break;
-
-			mgcp_patch_and_count(endp, rtp_state, rtp_end, addr, buf, len);
-		LOGP(DLMGCP, LOGL_DEBUG,
-		     "endpoint %x process/send to %s %s %d %d\n",
-		     ENDPOINT_NUMBER(endp),
-		     (dest == MGCP_DEST_NET)? "net" : "bts",
-		     inet_ntoa(rtp_end->addr),
-		     ntohs(rtp_end->rtp_port),
-		     ntohs(rtp_end->rtcp_port)
-		    );
-			forward_data(rtp_end->rtp.fd, &endp->taps[tap_idx],
-				     buf, len);
-
-			/* FIXME: HACK HACK HACK. See OS#2459.
-			 * The ip.access nano3G needs the first RTP payload's first two bytes to read hex
-			 * 'e400', or it will reject the RAB assignment. It seems to not harm other femto
-			 * cells (as long as we patch only the first RTP payload in each stream).
-			 */
-			if (tap_idx == MGCP_TAP_BTS_OUT
-			    && !rtp_state->patched_first_rtp_payload) {
-				uint8_t *data = (uint8_t*)&buf[12];
-				data[0] = 0xe4;
-				data[1] = 0x00;
-				rtp_state->patched_first_rtp_payload = true;
-			}
-
-			if (jb)
-				rc = enqueue_dejitter(jb, rtp_end, buf, len);
-			else
-				rc = mgcp_udp_send(rtp_end->rtp.fd,
-						   &rtp_end->addr,
-						   rtp_end->rtp_port, buf, len);
-
-			if (rc <= 0)
-				return rc;
-			nbytes += rc;
-			len = cont;
-		} while (len > 0);
-		return nbytes;
-	} else if (!tcfg->omit_rtcp) {
-		LOGP(DLMGCP, LOGL_DEBUG,
-		     "endpoint %x send to %s %s %d %d\n",
-		     ENDPOINT_NUMBER(endp),
-		     dest == MGCP_DEST_NET? "net" : "bts",
-		     inet_ntoa(rtp_end->addr),
-		     ntohs(rtp_end->rtp_port),
-		     ntohs(rtp_end->rtcp_port)
-		    );
-
-		return mgcp_udp_send(rtp_end->rtcp.fd,
-				     &rtp_end->addr,
-				     rtp_end->rtcp_port, buf, rc);
-	}
-
-	return 0;
-}
-
-static int receive_from(struct mgcp_endpoint *endp, int fd, struct sockaddr_in *addr,
-			char *buf, int bufsize)
-{
-	int rc;
-	socklen_t slen = sizeof(*addr);
-
-	rc = recvfrom(fd, buf, bufsize, 0,
-			    (struct sockaddr *) addr, &slen);
-	if (rc < 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to receive message on: 0x%x errno: %d/%s\n",
-			ENDPOINT_NUMBER(endp), errno, strerror(errno));
-		return -1;
-	}
-
-	/* do not forward aynthing... maybe there is a packet from the bts */
-	if (!endp->allocated)
-		return -1;
-
-	#warning "Slight spec violation. With connection mode recvonly we should attempt to forward."
-
-	return rc;
-}
-
-static int rtp_data_net(struct osmo_fd *fd, unsigned int what)
-{
-	char buf[RTP_BUF_SIZE];
-	struct sockaddr_in addr;
-	struct mgcp_endpoint *endp;
-	int rc, proto;
-
-	endp = (struct mgcp_endpoint *) fd->data;
-
-	rc = receive_from(endp, fd->fd, &addr, buf, sizeof(buf));
-	if (rc <= 0)
-		return -1;
-
-	LOGP(DLMGCP, LOGL_DEBUG,
-	     "endpoint %x",
-	     ENDPOINT_NUMBER(endp));
-	LOGPC(DLMGCP, LOGL_DEBUG,
-	      " from net %s %d",
-	      inet_ntoa(addr.sin_addr),
-	      ntohs(addr.sin_port));
-	LOGPC(DLMGCP, LOGL_DEBUG,
-	      " net_end %s %d %d",
-	      inet_ntoa(endp->net_end.addr),
-	      ntohs(endp->net_end.rtp_port),
-	      ntohs(endp->net_end.rtcp_port));
-	LOGPC(DLMGCP, LOGL_DEBUG,
-	      " bts_end %s %d %d\n",
-	      inet_ntoa(endp->bts_end.addr),
-	      ntohs(endp->bts_end.rtp_port),
-	      ntohs(endp->bts_end.rtcp_port)
-	     );
-
-	if (memcmp(&addr.sin_addr, &endp->net_end.addr, sizeof(addr.sin_addr)) != 0) {
-		LOGP(DLMGCP, LOGL_ERROR,
-			"rtp_data_net: Endpoint 0x%x data from wrong address %s vs. ",
-			ENDPOINT_NUMBER(endp), inet_ntoa(addr.sin_addr));
-		LOGPC(DLMGCP, LOGL_ERROR,
-			"%s\n", inet_ntoa(endp->net_end.addr));
-		return -1;
-	}
-
-	switch(endp->type) {
-	case MGCP_RTP_DEFAULT:
-	case MGCP_RTP_TRANSCODED:
-		if (endp->net_end.rtp_port != addr.sin_port &&
-		    endp->net_end.rtcp_port != addr.sin_port) {
-			LOGP(DLMGCP, LOGL_ERROR,
-				"rtp_data_net: Data from wrong source port %d on 0x%x\n",
-				ntohs(addr.sin_port), ENDPOINT_NUMBER(endp));
-			return -1;
-		}
-		break;
-	case MGCP_OSMUX_BSC:
-	case MGCP_OSMUX_BSC_NAT:
-		break;
-	}
-
-	LOGP(DLMGCP, LOGL_DEBUG,
-	     "rtp_data_net: Endpoint %x data from %s %d\n",
-	     ENDPOINT_NUMBER(endp),
-	     inet_ntoa(addr.sin_addr),
-	     ntohs(addr.sin_port));
-
-	/* throw away the dummy message */
-	if (rc == 1 && buf[0] == MGCP_DUMMY_LOAD) {
-		LOGP(DLMGCP, LOGL_NOTICE, "Filtered dummy from network on 0x%x\n",
-			ENDPOINT_NUMBER(endp));
-		return 0;
-	}
-
-	proto = fd == &endp->net_end.rtp ? MGCP_PROTO_RTP : MGCP_PROTO_RTCP;
-	endp->net_end.packets += 1;
-	endp->net_end.octets += rc;
-
-	forward_data(fd->fd, &endp->taps[MGCP_TAP_NET_IN], buf, rc);
-
-	switch (endp->type) {
-	case MGCP_RTP_DEFAULT:
-		return mgcp_send(endp, MGCP_DEST_BTS, proto == MGCP_PROTO_RTP,
-				 &addr, buf, rc);
-	case MGCP_RTP_TRANSCODED:
-		return mgcp_send_transcoder(&endp->trans_net, endp->cfg,
-					    proto == MGCP_PROTO_RTP, buf, rc);
-	case MGCP_OSMUX_BSC_NAT:
-		return osmux_xfrm_to_osmux(MGCP_DEST_BTS, buf, rc, endp);
-	case MGCP_OSMUX_BSC:	/* Should not happen */
-		break;
-	}
-
-	LOGP(DLMGCP, LOGL_ERROR, "Bad MGCP type %u on endpoint %u\n",
-	     endp->type, ENDPOINT_NUMBER(endp));
-	return 0;
-}
-
-static void discover_bts(struct mgcp_endpoint *endp, int proto, struct sockaddr_in *addr)
-{
-	struct mgcp_config *cfg = endp->cfg;
-
-	if (proto == MGCP_PROTO_RTP && endp->bts_end.rtp_port == 0) {
-		if (!cfg->bts_ip ||
-		    memcmp(&addr->sin_addr,
-			   &cfg->bts_in, sizeof(cfg->bts_in)) == 0 ||
-		    memcmp(&addr->sin_addr,
-			   &endp->bts_end.addr, sizeof(endp->bts_end.addr)) == 0) {
-
-			endp->bts_end.rtp_port = addr->sin_port;
-			endp->bts_end.addr = addr->sin_addr;
-
-			LOGP(DLMGCP, LOGL_NOTICE,
-				"Found BTS for endpoint: 0x%x on port: %d/%d of %s\n",
-				ENDPOINT_NUMBER(endp), ntohs(endp->bts_end.rtp_port),
-				ntohs(endp->bts_end.rtcp_port), inet_ntoa(addr->sin_addr));
-		}
-	} else if (proto == MGCP_PROTO_RTCP && endp->bts_end.rtcp_port == 0) {
-		if (memcmp(&endp->bts_end.addr, &addr->sin_addr,
-				sizeof(endp->bts_end.addr)) == 0) {
-			endp->bts_end.rtcp_port = addr->sin_port;
-		}
-	}
-}
-
-static int rtp_data_bts(struct osmo_fd *fd, unsigned int what)
-{
-	char buf[RTP_BUF_SIZE];
-	struct sockaddr_in addr;
-	struct mgcp_endpoint *endp;
-	int rc, proto;
-
-	endp = (struct mgcp_endpoint *) fd->data;
-
-	rc = receive_from(endp, fd->fd, &addr, buf, sizeof(buf));
-	if (rc <= 0)
-		return -1;
-
-	proto = fd == &endp->bts_end.rtp ? MGCP_PROTO_RTP : MGCP_PROTO_RTCP;
-
-	/* We have no idea who called us, maybe it is the BTS. */
-	/* it was the BTS... */
-	discover_bts(endp, proto, &addr);
-
-	if (memcmp(&endp->bts_end.addr, &addr.sin_addr, sizeof(addr.sin_addr)) != 0) {
-		LOGP(DLMGCP, LOGL_ERROR,
-			"rtp_data_bts: Data from wrong bts %s on 0x%x\n",
-			inet_ntoa(addr.sin_addr), ENDPOINT_NUMBER(endp));
-		return -1;
-	}
-
-	if (endp->bts_end.rtp_port != addr.sin_port &&
-	    endp->bts_end.rtcp_port != addr.sin_port) {
-		LOGP(DLMGCP, LOGL_ERROR,
-			"rtp_data_bts: ata from wrong bts source port %d on 0x%x\n",
-			ntohs(addr.sin_port), ENDPOINT_NUMBER(endp));
-		return -1;
-	}
-
-	LOGP(DLMGCP, LOGL_DEBUG,
-	     "rtp_data_bts: Endpoint %x data from %s %d\n",
-	     ENDPOINT_NUMBER(endp),
-	     inet_ntoa(addr.sin_addr),
-	     ntohs(addr.sin_port));
-
-	/* throw away the dummy message */
-	if (rc == 1 && buf[0] == MGCP_DUMMY_LOAD) {
-		LOGP(DLMGCP, LOGL_NOTICE, "Filtered dummy from bts on 0x%x\n",
-			ENDPOINT_NUMBER(endp));
-		return 0;
-	}
-
-	/* do this before the loop handling */
-	endp->bts_end.packets += 1;
-	endp->bts_end.octets += rc;
-
-	forward_data(fd->fd, &endp->taps[MGCP_TAP_BTS_IN], buf, rc);
-
-	switch (endp->type) {
-	case MGCP_RTP_DEFAULT:
-		LOGP(DLMGCP, LOGL_DEBUG,
-		     "rtp_data_bts: Endpoint %x MGCP_RTP_DEFAULT\n",
-		     ENDPOINT_NUMBER(endp));
-		return mgcp_send(endp, MGCP_DEST_NET, proto == MGCP_PROTO_RTP,
-				 &addr, buf, rc);
-	case MGCP_RTP_TRANSCODED:
-		return mgcp_send_transcoder(&endp->trans_bts, endp->cfg,
-					    proto == MGCP_PROTO_RTP, buf, rc);
-	case MGCP_OSMUX_BSC:
-		/* OSMUX translation: BTS -> BSC */
-		return osmux_xfrm_to_osmux(MGCP_DEST_NET, buf, rc, endp);
-	case MGCP_OSMUX_BSC_NAT:
-		break;	/* Should not happen */
-	}
-
-	LOGP(DLMGCP, LOGL_ERROR, "Bad MGCP type %u on endpoint %u\n",
-	     endp->type, ENDPOINT_NUMBER(endp));
-	return 0;
-}
-
-static int rtp_data_transcoder(struct mgcp_rtp_end *end, struct mgcp_endpoint *_endp,
-			      int dest, struct osmo_fd *fd)
-{
-	char buf[RTP_BUF_SIZE];
-	struct sockaddr_in addr;
-	struct mgcp_config *cfg;
-	int rc, proto;
-
-	cfg = _endp->cfg;
-	rc = receive_from(_endp, fd->fd, &addr, buf, sizeof(buf));
-	if (rc <= 0)
-		return -1;
-
-	proto = fd == &end->rtp ? MGCP_PROTO_RTP : MGCP_PROTO_RTCP;
-
-	if (memcmp(&addr.sin_addr, &cfg->transcoder_in, sizeof(addr.sin_addr)) != 0) {
-		LOGP(DLMGCP, LOGL_ERROR,
-			"Data not coming from transcoder dest: %d %s on 0x%x\n",
-			dest, inet_ntoa(addr.sin_addr), ENDPOINT_NUMBER(_endp));
-		return -1;
-	}
-
-	if (end->rtp_port != addr.sin_port &&
-	    end->rtcp_port != addr.sin_port) {
-		LOGP(DLMGCP, LOGL_ERROR,
-			"Data from wrong transcoder dest %d source port %d on 0x%x\n",
-			dest, ntohs(addr.sin_port), ENDPOINT_NUMBER(_endp));
-		return -1;
-	}
-
-	/* throw away the dummy message */
-	if (rc == 1 && buf[0] == MGCP_DUMMY_LOAD) {
-		LOGP(DLMGCP, LOGL_NOTICE, "Filtered dummy from transcoder dest %d on 0x%x\n",
-			dest, ENDPOINT_NUMBER(_endp));
-		return 0;
-	}
-
-	end->packets += 1;
-	return mgcp_send(_endp, dest, proto == MGCP_PROTO_RTP, &addr, buf, rc);
-}
-
-static int rtp_data_trans_net(struct osmo_fd *fd, unsigned int what)
-{
-	struct mgcp_endpoint *endp;
-	endp = (struct mgcp_endpoint *) fd->data;
-
-	return rtp_data_transcoder(&endp->trans_net, endp, MGCP_DEST_NET, fd);
-}
-
-static int rtp_data_trans_bts(struct osmo_fd *fd, unsigned int what)
-{
-	struct mgcp_endpoint *endp;
-	endp = (struct mgcp_endpoint *) fd->data;
-
-	return rtp_data_transcoder(&endp->trans_bts, endp, MGCP_DEST_BTS, fd);
-}
-
-int mgcp_create_bind(const char *source_addr, struct osmo_fd *fd, int port)
-{
-	struct sockaddr_in addr;
-	int on = 1;
-
-	fd->fd = socket(AF_INET, SOCK_DGRAM, 0);
-	if (fd->fd < 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to create UDP port.\n");
-		return -1;
-	}
-
-	setsockopt(fd->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
-	memset(&addr, 0, sizeof(addr));
-	addr.sin_family = AF_INET;
-	addr.sin_port = htons(port);
-	inet_aton(source_addr, &addr.sin_addr);
-
-	if (bind(fd->fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
-		close(fd->fd);
-		fd->fd = -1;
-		return -1;
-	}
-
-	return 0;
-}
-
-int mgcp_set_ip_tos(int fd, int tos)
-{
-	int ret;
-	ret = setsockopt(fd, IPPROTO_IP, IP_TOS,
-			 &tos, sizeof(tos));
-	return ret != 0;
-}
-
-static int bind_rtp(struct mgcp_config *cfg, const char *source_addr,
-			struct mgcp_rtp_end *rtp_end, int endpno)
-{
-	if (mgcp_create_bind(source_addr, &rtp_end->rtp,
-			     rtp_end->local_port) != 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to create RTP port: %s:%d on 0x%x\n",
-		       source_addr, rtp_end->local_port, endpno);
-		goto cleanup0;
-	}
-
-	if (mgcp_create_bind(source_addr, &rtp_end->rtcp,
-			     rtp_end->local_port + 1) != 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to create RTCP port: %s:%d on 0x%x\n",
-		       source_addr, rtp_end->local_port + 1, endpno);
-		goto cleanup1;
-	}
-
-	mgcp_set_ip_tos(rtp_end->rtp.fd, cfg->endp_dscp);
-	mgcp_set_ip_tos(rtp_end->rtcp.fd, cfg->endp_dscp);
-
-	rtp_end->rtp.when = BSC_FD_READ;
-	if (osmo_fd_register(&rtp_end->rtp) != 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to register RTP port %d on 0x%x\n",
-			rtp_end->local_port, endpno);
-		goto cleanup2;
-	}
-
-	rtp_end->rtcp.when = BSC_FD_READ;
-	if (osmo_fd_register(&rtp_end->rtcp) != 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to register RTCP port %d on 0x%x\n",
-			rtp_end->local_port + 1, endpno);
-		goto cleanup3;
-	}
-
-	return 0;
-
-cleanup3:
-	osmo_fd_unregister(&rtp_end->rtp);
-cleanup2:
-	close(rtp_end->rtcp.fd);
-	rtp_end->rtcp.fd = -1;
-cleanup1:
-	close(rtp_end->rtp.fd);
-	rtp_end->rtp.fd = -1;
-cleanup0:
-	return -1;
-}
-
-static int int_bind(const char *port,
-		    struct mgcp_rtp_end *end, int (*cb)(struct osmo_fd *, unsigned),
-		    struct mgcp_endpoint *_endp,
-		    const char *source_addr, int rtp_port)
-{
-	if (end->rtp.fd != -1 || end->rtcp.fd != -1) {
-		LOGP(DLMGCP, LOGL_ERROR, "Previous %s was still bound on %d\n",
-			port, ENDPOINT_NUMBER(_endp));
-		mgcp_free_rtp_port(end);
-	}
-
-	end->local_port = rtp_port;
-	end->rtp.cb = cb;
-	end->rtp.data = _endp;
-	end->rtcp.data = _endp;
-	end->rtcp.cb = cb;
-	return bind_rtp(_endp->cfg, source_addr, end, ENDPOINT_NUMBER(_endp));
-}
-
-int mgcp_bind_bts_rtp_port(struct mgcp_endpoint *endp, int rtp_port)
-{
-	return int_bind("bts-port", &endp->bts_end,
-			rtp_data_bts, endp,
-			mgcp_bts_src_addr(endp), rtp_port);
-}
-
-int mgcp_bind_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port)
-{
-	return int_bind("net-port", &endp->net_end,
-			rtp_data_net, endp,
-			mgcp_net_src_addr(endp), rtp_port);
-}
-
-int mgcp_bind_trans_net_rtp_port(struct mgcp_endpoint *endp, int rtp_port)
-{
-	return int_bind("trans-net", &endp->trans_net,
-			rtp_data_trans_net, endp,
-			endp->cfg->source_addr, rtp_port);
-}
-
-int mgcp_bind_trans_bts_rtp_port(struct mgcp_endpoint *endp, int rtp_port)
-{
-	return int_bind("trans-bts", &endp->trans_bts,
-			rtp_data_trans_bts, endp,
-			endp->cfg->source_addr, rtp_port);
-}
-
-int mgcp_free_rtp_port(struct mgcp_rtp_end *end)
-{
-	if (end->rtp.fd != -1) {
-		close(end->rtp.fd);
-		end->rtp.fd = -1;
-		osmo_fd_unregister(&end->rtp);
-	}
-
-	if (end->rtcp.fd != -1) {
-		close(end->rtcp.fd);
-		end->rtcp.fd = -1;
-		osmo_fd_unregister(&end->rtcp);
-	}
-
-	return 0;
-}
-
-
-void mgcp_state_calc_loss(struct mgcp_rtp_state *state,
-			struct mgcp_rtp_end *end, uint32_t *expected,
-			int *loss)
-{
-	*expected = state->stats_cycles + state->stats_max_seq;
-	*expected = *expected - state->stats_base_seq + 1;
-
-	if (!state->stats_initialized) {
-		*expected = 0;
-		*loss = 0;
-		return;
-	}
-
-	/*
-	 * Make sure the sign is correct and use the biggest
-	 * positive/negative number that fits.
-	 */
-	*loss = *expected - end->packets;
-	if (*expected < end->packets) {
-		if (*loss > 0)
-			*loss = INT_MIN;
-	} else {
-		if (*loss < 0)
-			*loss = INT_MAX;
-	}
-}
-
-uint32_t mgcp_state_calc_jitter(struct mgcp_rtp_state *state)
-{
-	if (!state->stats_initialized)
-		return 0;
-	return state->stats_jitter >> 4;
-}
diff --git a/src/libosmo-legacy-mgcp/mgcp_osmux.c b/src/libosmo-legacy-mgcp/mgcp_osmux.c
deleted file mode 100644
index b53e2b5..0000000
--- a/src/libosmo-legacy-mgcp/mgcp_osmux.c
+++ /dev/null
@@ -1,588 +0,0 @@
-/*
- * (C) 2012-2013 by Pablo Neira Ayuso <pablo@gnumonks.org>
- * (C) 2012-2013 by On Waves ehf <http://www.on-waves.com>
- * All rights not specifically granted under this license are reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Affero General Public License as published by the
- * Free Software Foundation; either version 3 of the License, or (at your
- * option) any later version.
- */
-
-#include <stdio.h> /* for printf */
-#include <string.h> /* for memcpy */
-#include <stdlib.h> /* for abs */
-#include <inttypes.h> /* for PRIu64 */
-#include <netinet/in.h>
-#include <osmocom/core/msgb.h>
-#include <osmocom/core/talloc.h>
-
-#include <osmocom/netif/osmux.h>
-#include <osmocom/netif/rtp.h>
-
-#include <osmocom/legacy_mgcp/mgcp.h>
-#include <osmocom/legacy_mgcp/mgcp_internal.h>
-#include <osmocom/legacy_mgcp/osmux.h>
-
-static struct osmo_fd osmux_fd;
-
-static LLIST_HEAD(osmux_handle_list);
-
-struct osmux_handle {
-	struct llist_head head;
-	struct osmux_in_handle *in;
-	struct in_addr rem_addr;
-	int rem_port;
-	int refcnt;
-};
-
-static void *osmux;
-
-static void osmux_deliver(struct msgb *batch_msg, void *data)
-{
-	struct osmux_handle *handle = data;
-	struct sockaddr_in out = {
-		.sin_family = AF_INET,
-		.sin_port = handle->rem_port,
-	};
-
-	memcpy(&out.sin_addr, &handle->rem_addr, sizeof(handle->rem_addr));
-	sendto(osmux_fd.fd, batch_msg->data, batch_msg->len, 0,
-		(struct sockaddr *)&out, sizeof(out));
-	msgb_free(batch_msg);
-}
-
-static struct osmux_handle *
-osmux_handle_find_get(struct in_addr *addr, int rem_port)
-{
-	struct osmux_handle *h;
-
-	/* Lookup for existing OSMUX handle for this destination address. */
-	llist_for_each_entry(h, &osmux_handle_list, head) {
-		if (memcmp(&h->rem_addr, addr, sizeof(struct in_addr)) == 0 &&
-		    h->rem_port == rem_port) {
-			LOGP(DLMGCP, LOGL_DEBUG, "using existing OSMUX handle "
-						"for addr=%s:%d\n",
-				inet_ntoa(*addr), ntohs(rem_port));
-			h->refcnt++;
-			return h;
-		}
-	}
-
-	return NULL;
-}
-
-static void osmux_handle_put(struct osmux_in_handle *in)
-{
-	struct osmux_handle *h;
-
-	/* Lookup for existing OSMUX handle for this destination address. */
-	llist_for_each_entry(h, &osmux_handle_list, head) {
-		if (h->in == in) {
-			if (--h->refcnt == 0) {
-				LOGP(DLMGCP, LOGL_INFO,
-				     "Releasing unused osmux handle for %s:%d\n",
-				     inet_ntoa(h->rem_addr),
-				     ntohs(h->rem_port));
-				LOGP(DLMGCP, LOGL_INFO, "Stats: "
-				     "input RTP msgs: %u bytes: %"PRIu64" "
-				     "output osmux msgs: %u bytes: %"PRIu64"\n",
-				     in->stats.input_rtp_msgs,
-				     in->stats.input_rtp_bytes,
-				     in->stats.output_osmux_msgs,
-				     in->stats.output_osmux_bytes);
-				llist_del(&h->head);
-				osmux_xfrm_input_fini(h->in);
-				talloc_free(h);
-			}
-			return;
-		}
-	}
-	LOGP(DLMGCP, LOGL_ERROR, "cannot find Osmux input handle %p\n", in);
-}
-
-static struct osmux_handle *
-osmux_handle_alloc(struct mgcp_config *cfg, struct in_addr *addr, int rem_port)
-{
-	struct osmux_handle *h;
-
-	h = talloc_zero(osmux, struct osmux_handle);
-	if (!h)
-		return NULL;
-	h->rem_addr = *addr;
-	h->rem_port = rem_port;
-	h->refcnt++;
-
-	h->in = talloc_zero(h, struct osmux_in_handle);
-	if (!h->in) {
-		talloc_free(h);
-		return NULL;
-	}
-
-	h->in->osmux_seq = 0; /* sequence number to start OSmux message from */
-	h->in->batch_factor = cfg->osmux_batch;
-	/* If batch size is zero, the library defaults to 1470 bytes. */
-	h->in->batch_size = cfg->osmux_batch_size;
-	h->in->deliver = osmux_deliver;
-	osmux_xfrm_input_init(h->in);
-	h->in->data = h;
-
-	llist_add(&h->head, &osmux_handle_list);
-
-	LOGP(DLMGCP, LOGL_DEBUG, "created new OSMUX handle for addr=%s:%d\n",
-		inet_ntoa(*addr), ntohs(rem_port));
-
-	return h;
-}
-
-static struct osmux_in_handle *
-osmux_handle_lookup(struct mgcp_config *cfg, struct in_addr *addr, int rem_port)
-{
-	struct osmux_handle *h;
-
-	h = osmux_handle_find_get(addr, rem_port);
-	if (h != NULL)
-		return h->in;
-
-	h = osmux_handle_alloc(cfg, addr, rem_port);
-	if (h == NULL)
-		return NULL;
-
-	return h->in;
-}
-
-int osmux_xfrm_to_osmux(int type, char *buf, int rc, struct mgcp_endpoint *endp)
-{
-	int ret;
-	struct msgb *msg;
-
-	msg = msgb_alloc(4096, "RTP");
-	if (!msg)
-		return 0;
-
-	memcpy(msg->data, buf, rc);
-	msgb_put(msg, rc);
-
-	while ((ret = osmux_xfrm_input(endp->osmux.in, msg, endp->osmux.cid)) > 0) {
-		/* batch full, build and deliver it */
-		osmux_xfrm_input_deliver(endp->osmux.in);
-	}
-	return 0;
-}
-
-static struct mgcp_endpoint *
-endpoint_lookup(struct mgcp_config *cfg, int cid,
-		struct in_addr *from_addr, int type)
-{
-	struct mgcp_endpoint *tmp = NULL;
-	int i;
-
-	/* Lookup for the endpoint that corresponds to this port */
-	for (i=0; i<cfg->trunk.number_endpoints; i++) {
-		struct in_addr *this;
-
-		tmp = &cfg->trunk.endpoints[i];
-
-		if (!tmp->allocated)
-			continue;
-
-		switch(type) {
-		case MGCP_DEST_NET:
-			this = &tmp->net_end.addr;
-			break;
-		case MGCP_DEST_BTS:
-			this = &tmp->bts_end.addr;
-			break;
-		default:
-			/* Should not ever happen */
-			LOGP(DLMGCP, LOGL_ERROR, "Bad type %d. Fix your code.\n", type);
-			return NULL;
-		}
-
-		if (tmp->osmux.cid == cid && this->s_addr == from_addr->s_addr)
-			return tmp;
-	}
-
-	LOGP(DLMGCP, LOGL_ERROR, "Cannot find endpoint with cid=%d\n", cid);
-
-	return NULL;
-}
-
-static void scheduled_tx_net_cb(struct msgb *msg, void *data)
-{
-	struct mgcp_endpoint *endp = data;
-	struct sockaddr_in addr = {
-		.sin_addr = endp->net_end.addr,
-		.sin_port = endp->net_end.rtp_port,
-	};
-
-	endp->bts_end.octets += msg->len;
-	endp->bts_end.packets++;
-
-	mgcp_send(endp, MGCP_DEST_NET, 1, &addr, (char *)msg->data, msg->len);
-	msgb_free(msg);
-}
-
-static void scheduled_tx_bts_cb(struct msgb *msg, void *data)
-{
-	struct mgcp_endpoint *endp = data;
-	struct sockaddr_in addr = {
-		.sin_addr = endp->bts_end.addr,
-		.sin_port = endp->bts_end.rtp_port,
-	};
-
-	endp->net_end.octets += msg->len;
-	endp->net_end.packets++;
-
-	mgcp_send(endp, MGCP_DEST_BTS, 1, &addr, (char *)msg->data, msg->len);
-	msgb_free(msg);
-}
-
-static struct msgb *osmux_recv(struct osmo_fd *ofd, struct sockaddr_in *addr)
-{
-	struct msgb *msg;
-	socklen_t slen = sizeof(*addr);
-	int ret;
-
-	msg = msgb_alloc(4096, "OSMUX");
-	if (!msg) {
-		LOGP(DLMGCP, LOGL_ERROR, "cannot allocate message\n");
-		return NULL;
-	}
-	ret = recvfrom(ofd->fd, msg->data, msg->data_len, 0,
-			(struct sockaddr *)addr, &slen);
-	if (ret <= 0) {
-		msgb_free(msg);
-		LOGP(DLMGCP, LOGL_ERROR, "cannot receive message\n");
-		return NULL;
-	}
-	msgb_put(msg, ret);
-
-	return msg;
-}
-
-#define osmux_chunk_length(msg, rem) (rem - msg->len);
-
-int osmux_read_from_bsc_nat_cb(struct osmo_fd *ofd, unsigned int what)
-{
-	struct msgb *msg;
-	struct osmux_hdr *osmuxh;
-	struct sockaddr_in addr;
-	struct mgcp_config *cfg = ofd->data;
-	uint32_t rem;
-
-	msg = osmux_recv(ofd, &addr);
-	if (!msg)
-		return -1;
-
-	/* not any further processing dummy messages */
-	if (msg->data[0] == MGCP_DUMMY_LOAD)
-		goto out;
-
-	rem = msg->len;
-	while((osmuxh = osmux_xfrm_output_pull(msg)) != NULL) {
-		struct mgcp_endpoint *endp;
-
-		/* Yes, we use MGCP_DEST_NET to locate the origin */
-		endp = endpoint_lookup(cfg, osmuxh->circuit_id,
-				       &addr.sin_addr, MGCP_DEST_NET);
-		if (!endp) {
-			LOGP(DLMGCP, LOGL_ERROR,
-			     "Cannot find an endpoint for circuit_id=%d\n",
-			     osmuxh->circuit_id);
-			goto out;
-		}
-		endp->osmux.stats.octets += osmux_chunk_length(msg, rem);
-		endp->osmux.stats.chunks++;
-		rem = msg->len;
-
-		osmux_xfrm_output_sched(&endp->osmux.out, osmuxh);
-	}
-out:
-	msgb_free(msg);
-	return 0;
-}
-
-/* This is called from the bsc-nat */
-static int osmux_handle_dummy(struct mgcp_config *cfg, struct sockaddr_in *addr,
-			      struct msgb *msg)
-{
-	struct mgcp_endpoint *endp;
-	uint8_t osmux_cid;
-
-	if (msg->len < 1 + sizeof(osmux_cid)) {
-		LOGP(DLMGCP, LOGL_ERROR,
-		     "Discarding truncated Osmux dummy load\n");
-		goto out;
-	}
-
-	LOGP(DLMGCP, LOGL_DEBUG, "Received Osmux dummy load from %s\n",
-	     inet_ntoa(addr->sin_addr));
-
-	if (!cfg->osmux) {
-		LOGP(DLMGCP, LOGL_ERROR,
-		     "bsc wants to use Osmux but bsc-nat did not request it\n");
-		goto out;
-	}
-
-	/* extract the osmux CID from the dummy message */
-	memcpy(&osmux_cid, &msg->data[1], sizeof(osmux_cid));
-
-	endp = endpoint_lookup(cfg, osmux_cid, &addr->sin_addr, MGCP_DEST_BTS);
-	if (!endp) {
-		LOGP(DLMGCP, LOGL_ERROR,
-		     "Cannot find endpoint for Osmux CID %d\n", osmux_cid);
-		goto out;
-	}
-
-	if (endp->osmux.state == OSMUX_STATE_ENABLED)
-		goto out;
-
-	if (osmux_enable_endpoint(endp, &addr->sin_addr, addr->sin_port) < 0 ) {
-		LOGP(DLMGCP, LOGL_ERROR,
-		     "Could not enable osmux in endpoint %d\n",
-		     ENDPOINT_NUMBER(endp));
-		goto out;
-	}
-
-	LOGP(DLMGCP, LOGL_INFO, "Enabling osmux in endpoint %d for %s:%u\n",
-	     ENDPOINT_NUMBER(endp), inet_ntoa(addr->sin_addr),
-	     ntohs(addr->sin_port));
-out:
-	msgb_free(msg);
-	return 0;
-}
-
-int osmux_read_from_bsc_cb(struct osmo_fd *ofd, unsigned int what)
-{
-	struct msgb *msg;
-	struct osmux_hdr *osmuxh;
-	struct sockaddr_in addr;
-	struct mgcp_config *cfg = ofd->data;
-	uint32_t rem;
-
-	msg = osmux_recv(ofd, &addr);
-	if (!msg)
-		return -1;
-
-	/* not any further processing dummy messages */
-	if (msg->data[0] == MGCP_DUMMY_LOAD)
-		return osmux_handle_dummy(cfg, &addr, msg);
-
-	rem = msg->len;
-	while((osmuxh = osmux_xfrm_output_pull(msg)) != NULL) {
-		struct mgcp_endpoint *endp;
-
-		/* Yes, we use MGCP_DEST_BTS to locate the origin */
-		endp = endpoint_lookup(cfg, osmuxh->circuit_id,
-				       &addr.sin_addr, MGCP_DEST_BTS);
-		if (!endp) {
-			LOGP(DLMGCP, LOGL_ERROR,
-			     "Cannot find an endpoint for circuit_id=%d\n",
-			     osmuxh->circuit_id);
-			goto out;
-		}
-		endp->osmux.stats.octets += osmux_chunk_length(msg, rem);
-		endp->osmux.stats.chunks++;
-		rem = msg->len;
-
-		osmux_xfrm_output_sched(&endp->osmux.out, osmuxh);
-	}
-out:
-	msgb_free(msg);
-	return 0;
-}
-
-int osmux_init(int role, struct mgcp_config *cfg)
-{
-	int ret;
-
-	switch(role) {
-	case OSMUX_ROLE_BSC:
-		osmux_fd.cb = osmux_read_from_bsc_nat_cb;
-		break;
-	case OSMUX_ROLE_BSC_NAT:
-		osmux_fd.cb = osmux_read_from_bsc_cb;
-		break;
-	default:
-		LOGP(DLMGCP, LOGL_ERROR, "wrong role for OSMUX\n");
-		return -1;
-	}
-	osmux_fd.data = cfg;
-
-	ret = mgcp_create_bind(cfg->osmux_addr, &osmux_fd, cfg->osmux_port);
-	if (ret < 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "cannot bind OSMUX socket\n");
-		return ret;
-	}
-	mgcp_set_ip_tos(osmux_fd.fd, cfg->endp_dscp);
-	osmux_fd.when |= BSC_FD_READ;
-
-	ret = osmo_fd_register(&osmux_fd);
-	if (ret < 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "cannot register OSMUX socket\n");
-		return ret;
-	}
-	cfg->osmux_init = 1;
-
-	return 0;
-}
-
-int osmux_enable_endpoint(struct mgcp_endpoint *endp, struct in_addr *addr, uint16_t port)
-{
-	/* If osmux is enabled, initialize the output handler. This handler is
-	 * used to reconstruct the RTP flow from osmux. The RTP SSRC is
-	 * allocated based on the circuit ID (endp->osmux.cid), which is unique
-	 * in the local scope to the BSC/BSC-NAT. We use it to divide the RTP
-	 * SSRC space (2^32) by the 256 possible circuit IDs, then randomly
-	 * select one value from that window. Thus, we have no chance to have
-	 * overlapping RTP SSRC traveling to the BTSes behind the BSC,
-	 * similarly, for flows traveling to the MSC.
-	 */
-	static const uint32_t rtp_ssrc_winlen = UINT32_MAX / 256;
-
-	if (endp->osmux.state == OSMUX_STATE_DISABLED) {
-		LOGP(DLMGCP, LOGL_ERROR, "Endpoint %u didn't request Osmux\n",
-		     ENDPOINT_NUMBER(endp));
-		return -1;
-	}
-
-	osmux_xfrm_output_init(&endp->osmux.out,
-			       (endp->osmux.cid * rtp_ssrc_winlen) +
-			       (random() % rtp_ssrc_winlen));
-
-	endp->osmux.in = osmux_handle_lookup(endp->cfg, addr, port);
-	if (!endp->osmux.in) {
-		LOGP(DLMGCP, LOGL_ERROR, "Cannot allocate input osmux handle\n");
-		return -1;
-	}
-	if (!osmux_xfrm_input_open_circuit(endp->osmux.in, endp->osmux.cid,
-					   endp->cfg->osmux_dummy)) {
-		LOGP(DLMGCP, LOGL_ERROR, "Cannot open osmux circuit %u\n",
-		     endp->osmux.cid);
-		return -1;
-	}
-
-	switch (endp->cfg->role) {
-		case MGCP_BSC_NAT:
-			endp->type = MGCP_OSMUX_BSC_NAT;
-			osmux_xfrm_output_set_tx_cb(&endp->osmux.out,
-							scheduled_tx_net_cb, endp);
-			break;
-		case MGCP_BSC:
-			endp->type = MGCP_OSMUX_BSC;
-			osmux_xfrm_output_set_tx_cb(&endp->osmux.out,
-							scheduled_tx_bts_cb, endp);
-			break;
-	}
-	endp->osmux.state = OSMUX_STATE_ENABLED;
-
-	return 0;
-}
-
-void osmux_disable_endpoint(struct mgcp_endpoint *endp)
-{
-	LOGP(DLMGCP, LOGL_INFO, "Releasing endpoint %u using Osmux CID %u\n",
-	     ENDPOINT_NUMBER(endp), endp->osmux.cid);
-
-	/* We are closing, we don't need pending RTP packets to be transmitted */
-	osmux_xfrm_output_set_tx_cb(&endp->osmux.out, NULL, NULL);
-	osmux_xfrm_output_flush(&endp->osmux.out);
-
-	osmux_xfrm_input_close_circuit(endp->osmux.in, endp->osmux.cid);
-	endp->osmux.state = OSMUX_STATE_DISABLED;
-	endp->osmux.cid = -1;
-	osmux_handle_put(endp->osmux.in);
-}
-
-void osmux_release_cid(struct mgcp_endpoint *endp)
-{
-	if (endp->osmux.allocated_cid >= 0)
-		osmux_put_cid(endp->osmux.allocated_cid);
-	endp->osmux.allocated_cid = -1;
-}
-
-void osmux_allocate_cid(struct mgcp_endpoint *endp)
-{
-	osmux_release_cid(endp);
-	endp->osmux.allocated_cid = osmux_get_cid();
-}
-
-/* We don't need to send the dummy load for osmux so often as another endpoint
- * may have already punched the hole in the firewall. This approach is simple
- * though.
- */
-int osmux_send_dummy(struct mgcp_endpoint *endp)
-{
-	char buf[1 + sizeof(uint8_t)];
-	struct in_addr addr_unset = {};
-
-	buf[0] = MGCP_DUMMY_LOAD;
-	memcpy(&buf[1], &endp->osmux.cid, sizeof(endp->osmux.cid));
-
-	/* Wait until we have the connection information from MDCX */
-	if (memcmp(&endp->net_end.addr, &addr_unset, sizeof(addr_unset)) == 0)
-		return 0;
-
-	if (endp->osmux.state == OSMUX_STATE_ACTIVATING) {
-		if (osmux_enable_endpoint(endp, &endp->net_end.addr,
-					  htons(endp->cfg->osmux_port)) < 0) {
-			LOGP(DLMGCP, LOGL_ERROR,
-			     "Could not activate osmux in endpoint %d\n",
-			     ENDPOINT_NUMBER(endp));
-		}
-		LOGP(DLMGCP, LOGL_ERROR,
-		     "Osmux CID %u for %s:%u is now enabled\n",
-		     endp->osmux.cid, inet_ntoa(endp->net_end.addr),
-		     endp->cfg->osmux_port);
-	}
-	LOGP(DLMGCP, LOGL_DEBUG,
-	     "sending OSMUX dummy load to %s CID %u\n",
-	     inet_ntoa(endp->net_end.addr), endp->osmux.cid);
-
-	return mgcp_udp_send(osmux_fd.fd, &endp->net_end.addr,
-			     htons(endp->cfg->osmux_port), buf, sizeof(buf));
-}
-
-/* bsc-nat allocates/releases the Osmux circuit ID */
-static uint8_t osmux_cid_bitmap[(OSMUX_CID_MAX + 1) / 8];
-
-int osmux_used_cid(void)
-{
-	int i, j, used = 0;
-
-	for (i = 0; i < sizeof(osmux_cid_bitmap); i++) {
-		for (j = 0; j < 8; j++) {
-			if (osmux_cid_bitmap[i] & (1 << j))
-				used += 1;
-		}
-	}
-
-	return used;
-}
-
-int osmux_get_cid(void)
-{
-	int i, j;
-
-	for (i = 0; i < sizeof(osmux_cid_bitmap); i++) {
-		for (j = 0; j < 8; j++) {
-			if (osmux_cid_bitmap[i] & (1 << j))
-				continue;
-
-			osmux_cid_bitmap[i] |= (1 << j);
-			LOGP(DLMGCP, LOGL_DEBUG,
-			     "Allocating Osmux CID %u from pool\n", (i * 8) + j);
-			return (i * 8) + j;
-		}
-	}
-
-	LOGP(DLMGCP, LOGL_ERROR, "All Osmux circuits are in use!\n");
-	return -1;
-}
-
-void osmux_put_cid(uint8_t osmux_cid)
-{
-	LOGP(DLMGCP, LOGL_DEBUG, "Osmux CID %u is back to the pool\n", osmux_cid);
-	osmux_cid_bitmap[osmux_cid / 8] &= ~(1 << (osmux_cid % 8));
-}
diff --git a/src/libosmo-legacy-mgcp/mgcp_protocol.c b/src/libosmo-legacy-mgcp/mgcp_protocol.c
deleted file mode 100644
index 854b4ba..0000000
--- a/src/libosmo-legacy-mgcp/mgcp_protocol.c
+++ /dev/null
@@ -1,1665 +0,0 @@
-/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
-/* The protocol implementation */
-
-/*
- * (C) 2009-2012 by Holger Hans Peter Freyther <zecke@selfish.org>
- * (C) 2009-2012 by On-Waves
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <limits.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include <osmocom/core/msgb.h>
-#include <osmocom/core/talloc.h>
-#include <osmocom/core/select.h>
-
-#include <osmocom/legacy_mgcp/mgcp.h>
-#include <osmocom/legacy_mgcp/mgcp_internal.h>
-
-#define for_each_non_empty_line(line, save)			\
-	for (line = strtok_r(NULL, "\r\n", &save); line;\
-	     line = strtok_r(NULL, "\r\n", &save))
-
-
-static void mgcp_rtp_end_reset(struct mgcp_rtp_end *end);
-
-struct mgcp_request {
-	char *name;
-	struct msgb *(*handle_request) (struct mgcp_parse_data *data);
-	char *debug_name;
-};
-
-#define MGCP_REQUEST(NAME, REQ, DEBUG_NAME) \
-	{ .name = NAME, .handle_request = REQ, .debug_name = DEBUG_NAME },
-
-static struct msgb *handle_audit_endpoint(struct mgcp_parse_data *data);
-static struct msgb *handle_create_con(struct mgcp_parse_data *data);
-static struct msgb *handle_delete_con(struct mgcp_parse_data *data);
-static struct msgb *handle_modify_con(struct mgcp_parse_data *data);
-static struct msgb *handle_rsip(struct mgcp_parse_data *data);
-static struct msgb *handle_noti_req(struct mgcp_parse_data *data);
-
-static void create_transcoder(struct mgcp_endpoint *endp);
-static void delete_transcoder(struct mgcp_endpoint *endp);
-
-static int setup_rtp_processing(struct mgcp_endpoint *endp);
-
-static int mgcp_analyze_header(struct mgcp_parse_data *parse, char *data);
-
-/* Display an mgcp message on the log output */
-void display_mgcp_message(unsigned char *message, unsigned int len,
-			  char *preamble)
-{
-	unsigned char line[80];
-	unsigned char *ptr;
-	unsigned int consumed = 0;
-	unsigned int consumed_line = 0;
-	unsigned int line_count = 0;
-
-	if (!log_check_level(DLMGCP, LOGL_DEBUG))
-		return;
-
-	while (1) {
-		memset(line, 0, sizeof(line));
-		ptr = line;
-		consumed_line = 0;
-		do {
-			if (*message != '\n' && *message != '\r') {
-				*ptr = *message;
-				ptr++;
-			}
-			message++;
-			consumed++;
-			consumed_line++;
-		} while (*message != '\n' && consumed < len
-			 && consumed_line < sizeof(line));
-
-		if (strlen((const char *)line)) {
-			LOGP(DLMGCP, LOGL_DEBUG, "%s: line #%02u: %s\n",
-			     preamble, line_count, line);
-			line_count++;
-		}
-
-		if (consumed >= len)
-			return;
-	}
-}
-
-static int mgcp_check_param(const struct mgcp_endpoint *endp, const char *line)
-{
-	const size_t line_len = strlen(line);
-	if (line[0] != '\0' && line_len < 2) {
-		LOGP(DLMGCP, LOGL_ERROR,
-			"Wrong MGCP option format: '%s' on 0x%x\n",
-			line, ENDPOINT_NUMBER(endp));
-		return 0;
-	}
-
-	return 1;
-}
-
-static uint32_t generate_call_id(struct mgcp_config *cfg)
-{
-	int i;
-
-	/* use the call id */
-	++cfg->last_call_id;
-
-	/* handle wrap around */
-	if (cfg->last_call_id == CI_UNUSED)
-		++cfg->last_call_id;
-
-	/* callstack can only be of size number_of_endpoints */
-	/* verify that the call id is free, e.g. in case of overrun */
-	for (i = 1; i < cfg->trunk.number_endpoints; ++i)
-		if (cfg->trunk.endpoints[i].ci == cfg->last_call_id)
-			return generate_call_id(cfg);
-
-	return cfg->last_call_id;
-}
-
-/*
- * array of function pointers for handling various
- * messages. In the future this might be binary sorted
- * for performance reasons.
- */
-static const struct mgcp_request mgcp_requests [] = {
-	MGCP_REQUEST("AUEP", handle_audit_endpoint, "AuditEndpoint")
-	MGCP_REQUEST("CRCX", handle_create_con, "CreateConnection")
-	MGCP_REQUEST("DLCX", handle_delete_con, "DeleteConnection")
-	MGCP_REQUEST("MDCX", handle_modify_con, "ModifiyConnection")
-	MGCP_REQUEST("RQNT", handle_noti_req, "NotificationRequest")
-
-	/* SPEC extension */
-	MGCP_REQUEST("RSIP", handle_rsip, "ReSetInProgress")
-};
-
-static struct msgb *mgcp_msgb_alloc(void)
-{
-	struct msgb *msg;
-	msg = msgb_alloc_headroom(4096, 128, "MGCP msg");
-	if (!msg)
-	    LOGP(DLMGCP, LOGL_ERROR, "Failed to msgb for MGCP data.\n");
-
-	return msg;
-}
-
-static struct msgb *do_retransmission(const struct mgcp_endpoint *endp)
-{
-	struct msgb *msg = mgcp_msgb_alloc();
-	if (!msg)
-		return NULL;
-
-	msg->l2h = msgb_put(msg, strlen(endp->last_response));
-	memcpy(msg->l2h, endp->last_response, msgb_l2len(msg));
-	display_mgcp_message(msg->l2h, msgb_l2len(msg), "Retransmitted response");
-	return msg;
-}
-
-static struct msgb *create_resp(struct mgcp_endpoint *endp, int code,
-				const char *txt, const char *msg,
-				const char *trans, const char *param,
-				const char *sdp)
-{
-	int len;
-	struct msgb *res;
-
-	res = mgcp_msgb_alloc();
-	if (!res)
-		return NULL;
-
-	len = snprintf((char *) res->data, 2048, "%d %s%s%s\r\n%s",
-			code, trans, txt, param ? param : "", sdp ? sdp : "");
-	if (len < 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to sprintf MGCP response.\n");
-		msgb_free(res);
-		return NULL;
-	}
-
-	res->l2h = msgb_put(res, len);
-	LOGP(DLMGCP, LOGL_DEBUG, "Generated response: code=%d\n", code);
-	display_mgcp_message(res->l2h, msgb_l2len(res), "Generated response");
-
-	/*
-	 * Remember the last transmission per endpoint.
-	 */
-	if (endp) {
-		struct mgcp_trunk_config *tcfg = endp->tcfg;
-		talloc_free(endp->last_response);
-		talloc_free(endp->last_trans);
-		endp->last_trans = talloc_strdup(tcfg->endpoints, trans);
-		endp->last_response = talloc_strndup(tcfg->endpoints,
-						(const char *) res->l2h,
-						msgb_l2len(res));
-	}
-
-	return res;
-}
-
-static struct msgb *create_ok_resp_with_param(struct mgcp_endpoint *endp,
-					int code, const char *msg,
-					const char *trans, const char *param)
-{
-	return create_resp(endp, code, " OK", msg, trans, param, NULL);
-}
-
-static struct msgb *create_ok_response(struct mgcp_endpoint *endp,
-					int code, const char *msg, const char *trans)
-{
-	return create_ok_resp_with_param(endp, code, msg, trans, NULL);
-}
-
-static struct msgb *create_err_response(struct mgcp_endpoint *endp,
-					int code, const char *msg, const char *trans)
-{
-	return create_resp(endp, code, " FAIL", msg, trans, NULL, NULL);
-}
-
-static int write_response_sdp(struct mgcp_endpoint *endp,
-			      char *sdp_record, size_t size, const char *addr)
-{
-	const char *fmtp_extra;
-	const char *audio_name;
-	int payload_type;
-	int len;
-	int nchars;
-
-	endp->cfg->get_net_downlink_format_cb(endp, &payload_type,
-					      &audio_name, &fmtp_extra);
-
-	len = snprintf(sdp_record, size,
-			"v=0\r\n"
-			"o=- %u 23 IN IP4 %s\r\n"
-			"s=-\r\n"
-			"c=IN IP4 %s\r\n"
-			"t=0 0\r\n",
-			endp->ci, addr, addr);
-
-	if (len < 0 || len >= size)
-		goto buffer_too_small;
-
-	if (payload_type >= 0) {
-		nchars = snprintf(sdp_record + len, size - len,
-				  "m=audio %d RTP/AVP %d\r\n",
-				  endp->net_end.local_port, payload_type);
-		if (nchars < 0 || nchars >= size - len)
-			goto buffer_too_small;
-
-		len += nchars;
-
-		if (audio_name && endp->tcfg->audio_send_name) {
-			nchars = snprintf(sdp_record + len, size - len,
-					  "a=rtpmap:%d %s\r\n",
-					  payload_type, audio_name);
-
-			if (nchars < 0 || nchars >= size - len)
-				goto buffer_too_small;
-
-			len += nchars;
-		}
-
-		if (fmtp_extra) {
-			nchars = snprintf(sdp_record + len, size - len,
-					  "%s\r\n", fmtp_extra);
-
-			if (nchars < 0 || nchars >= size - len)
-				goto buffer_too_small;
-
-			len += nchars;
-		}
-	}
-	if (endp->bts_end.packet_duration_ms > 0 && endp->tcfg->audio_send_ptime) {
-		nchars = snprintf(sdp_record + len, size - len,
-				  "a=ptime:%d\r\n",
-				  endp->bts_end.packet_duration_ms);
-		if (nchars < 0 || nchars >= size - len)
-			goto buffer_too_small;
-
-		len += nchars;
-	}
-
-	return len;
-
-buffer_too_small:
-	LOGP(DLMGCP, LOGL_ERROR, "SDP buffer too small: %zu (needed %d)\n",
-	     size, len);
-	return -1;
-}
-
-static struct msgb *create_response_with_sdp(struct mgcp_endpoint *endp,
-					     const char *msg, const char *trans_id)
-{
-	const char *addr = endp->cfg->local_ip;
-	char sdp_record[4096];
-	int len;
-	int nchars;
-	char osmux_extension[strlen("\nX-Osmux: 255") + 1];
-
-	if (!addr)
-		addr = mgcp_net_src_addr(endp);
-
-	if (endp->osmux.state == OSMUX_STATE_NEGOTIATING) {
-		sprintf(osmux_extension, "\nX-Osmux: %u", endp->osmux.cid);
-		endp->osmux.state = OSMUX_STATE_ACTIVATING;
-	} else {
-		osmux_extension[0] = '\0';
-	}
-
-	len = snprintf(sdp_record, sizeof(sdp_record),
-		       "I: %u%s\n\n", endp->ci, osmux_extension);
-	if (len < 0)
-		return NULL;
-
-	nchars = write_response_sdp(endp, sdp_record + len,
-				    sizeof(sdp_record) - len - 1, addr);
-	if (nchars < 0)
-		return NULL;
-
-	len += nchars;
-
-	sdp_record[sizeof(sdp_record) - 1] = '\0';
-
-	return create_resp(endp, 200, " OK", msg, trans_id, NULL, sdp_record);
-}
-
-static void send_dummy(struct mgcp_endpoint *endp)
-{
-	if (endp->osmux.state != OSMUX_STATE_DISABLED)
-		osmux_send_dummy(endp);
-	else
-		mgcp_send_dummy(endp);
-}
-
-/*
- * handle incoming messages:
- *   - this can be a command (four letters, space, transaction id)
- *   - or a response (three numbers, space, transaction id)
- */
-struct msgb *mgcp_handle_message(struct mgcp_config *cfg, struct msgb *msg)
-{
-	struct mgcp_parse_data pdata;
-	int i, code, handled = 0;
-	struct msgb *resp = NULL;
-	char *data;
-
-	if (msgb_l2len(msg) < 4) {
-		LOGP(DLMGCP, LOGL_ERROR, "msg too short: %d\n", msg->len);
-		return NULL;
-	}
-
-	if (mgcp_msg_terminate_nul(msg))
-		return NULL;
-
-	display_mgcp_message(msg->l2h, msgb_l2len(msg), "Received message");
-
-	/* attempt to treat it as a response */
-	if (sscanf((const char *)&msg->l2h[0], "%3d %*s", &code) == 1) {
-		LOGP(DLMGCP, LOGL_DEBUG, "Response: Code: %d\n", code);
-		return NULL;
-	}
-
-	msg->l3h = &msg->l2h[4];
-
-
-	/*
-	 * Check for a duplicate message and respond.
-	 */
-	memset(&pdata, 0, sizeof(pdata));
-	pdata.cfg = cfg;
-	data = strline_r((char *) msg->l3h, &pdata.save);
-	pdata.found = mgcp_analyze_header(&pdata, data);
-	if (pdata.endp && pdata.trans
-			&& pdata.endp->last_trans
-			&& strcmp(pdata.endp->last_trans, pdata.trans) == 0) {
-		return do_retransmission(pdata.endp);
-	}
-
-	for (i = 0; i < ARRAY_SIZE(mgcp_requests); ++i) {
-		if (strncmp(mgcp_requests[i].name, (const char *) &msg->l2h[0], 4) == 0) {
-			handled = 1;
-			resp = mgcp_requests[i].handle_request(&pdata);
-			break;
-		}
-	}
-
-	if (!handled)
-		LOGP(DLMGCP, LOGL_NOTICE, "MSG with type: '%.4s' not handled\n", &msg->l2h[0]);
-
-	return resp;
-}
-
-/**
- * We have a null terminated string with the endpoint name here. We only
- * support two kinds. Simple ones as seen on the BSC level and the ones
- * seen on the trunk side.
- */
-static struct mgcp_endpoint *find_e1_endpoint(struct mgcp_config *cfg,
-					     const char *mgcp)
-{
-	char *rest = NULL;
-	struct mgcp_trunk_config *tcfg;
-	int trunk, endp;
-
-	trunk = strtoul(mgcp + 6, &rest, 10);
-	if (rest == NULL || rest[0] != '/' || trunk < 1) {
-		LOGP(DLMGCP, LOGL_ERROR, "Wrong trunk name '%s'\n", mgcp);
-		return NULL;
-	}
-
-	endp = strtoul(rest + 1, &rest, 10);
-	if (rest == NULL || rest[0] != '@') {
-		LOGP(DLMGCP, LOGL_ERROR, "Wrong endpoint name '%s'\n", mgcp);
-		return NULL;
-	}
-
-	/* signalling is on timeslot 1 */
-	if (endp == 1)
-		return NULL;
-
-	tcfg = mgcp_trunk_num(cfg, trunk);
-	if (!tcfg) {
-		LOGP(DLMGCP, LOGL_ERROR, "The trunk %d is not declared.\n", trunk);
-		return NULL;
-	}
-
-	if (!tcfg->endpoints) {
-		LOGP(DLMGCP, LOGL_ERROR, "Endpoints of trunk %d not allocated.\n", trunk);
-		return NULL;
-	}
-
-	if (endp < 1 || endp >= tcfg->number_endpoints) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to find endpoint '%s'\n", mgcp);
-		return NULL;
-	}
-
-	return &tcfg->endpoints[endp];
-}
-
-static struct mgcp_endpoint *find_endpoint(struct mgcp_config *cfg, const char *mgcp)
-{
-	char *endptr = NULL;
-	unsigned int gw = INT_MAX;
-
-	if (strncmp(mgcp, "ds/e1", 5) == 0)
-		return find_e1_endpoint(cfg, mgcp);
-
-	gw = strtoul(mgcp, &endptr, 16);
-	if (gw > 0 && gw < cfg->trunk.number_endpoints && endptr[0] == '@')
-		return &cfg->trunk.endpoints[gw];
-
-	LOGP(DLMGCP, LOGL_ERROR, "Not able to find the endpoint: '%s'\n", mgcp);
-	return NULL;
-}
-
-/**
- * @returns 0 when the status line was complete and transaction_id and
- * endp out parameters are set.
- */
-static int mgcp_analyze_header(struct mgcp_parse_data *pdata, char *data)
-{
-	int i = 0;
-	char *elem, *save = NULL;
-
-	OSMO_ASSERT(data);
-	pdata->trans = "000000";
-
-	for (elem = strtok_r(data, " ", &save); elem;
-	     elem = strtok_r(NULL, " ", &save)) {
-		switch (i) {
-		case 0:
-			pdata->trans = elem;
-			break;
-		case 1:
-			pdata->endp = find_endpoint(pdata->cfg, elem);
-			if (!pdata->endp) {
-				LOGP(DLMGCP, LOGL_ERROR,
-				     "Unable to find Endpoint `%s'\n", elem);
-				return -1;
-			}
-			break;
-		case 2:
-			if (strcmp("MGCP", elem)) {
-				LOGP(DLMGCP, LOGL_ERROR,
-				     "MGCP header parsing error\n");
-				return -1;
-			}
-			break;
-		case 3:
-			if (strcmp("1.0", elem)) {
-				LOGP(DLMGCP, LOGL_ERROR, "MGCP version `%s' "
-					"not supported\n", elem);
-				return -1;
-			}
-			break;
-		}
-		i++;
-	}
-
-	if (i != 4) {
-		LOGP(DLMGCP, LOGL_ERROR, "MGCP status line too short.\n");
-		pdata->trans = "000000";
-		pdata->endp = NULL;
-		return -1;
-	}
-
-	return 0;
-}
-
-static int verify_call_id(const struct mgcp_endpoint *endp,
-			  const char *callid)
-{
-	if (strcmp(endp->callid, callid) != 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "CallIDs does not match on 0x%x. '%s' != '%s'\n",
-			ENDPOINT_NUMBER(endp), endp->callid, callid);
-		return -1;
-	}
-
-	return 0;
-}
-
-static int verify_ci(const struct mgcp_endpoint *endp,
-		     const char *_ci)
-{
-	uint32_t ci = strtoul(_ci, NULL, 10);
-
-	if (ci != endp->ci) {
-		LOGP(DLMGCP, LOGL_ERROR, "ConnectionIdentifiers do not match on 0x%x. %u != %s\n",
-			ENDPOINT_NUMBER(endp), endp->ci, _ci);
-		return -1;
-	}
-
-	return 0;
-}
-
-static struct msgb *handle_audit_endpoint(struct mgcp_parse_data *p)
-{
-	if (p->found != 0)
-		return create_err_response(NULL, 500, "AUEP", p->trans);
-	else
-		return create_ok_response(p->endp, 200, "AUEP", p->trans);
-}
-
-static int parse_conn_mode(const char *msg, struct mgcp_endpoint *endp)
-{
-	int ret = 0;
-	if (strcmp(msg, "recvonly") == 0)
-		endp->conn_mode = MGCP_CONN_RECV_ONLY;
-	else if (strcmp(msg, "sendrecv") == 0)
-		endp->conn_mode = MGCP_CONN_RECV_SEND;
-	else if (strcmp(msg, "sendonly") == 0)
-		endp->conn_mode = MGCP_CONN_SEND_ONLY;
-	else if (strcmp(msg, "loopback") == 0)
-		endp->conn_mode = MGCP_CONN_LOOPBACK;
-	else {
-		LOGP(DLMGCP, LOGL_ERROR, "Unknown connection mode: '%s'\n", msg);
-		ret = -1;
-	}
-
-	endp->net_end.output_enabled =
-		endp->conn_mode & MGCP_CONN_SEND_ONLY ? 1 : 0;
-	endp->bts_end.output_enabled =
-		endp->conn_mode & MGCP_CONN_RECV_ONLY ? 1 : 0;
-
-	LOGP(DLMGCP, LOGL_DEBUG, "endpoint %x connection mode '%s' %d output_enabled net %d bts %d\n",
-	     ENDPOINT_NUMBER(endp),
-	     msg, endp->conn_mode, endp->net_end.output_enabled,
-	     endp->bts_end.output_enabled);
-
-	return ret;
-}
-
-static int allocate_port(struct mgcp_endpoint *endp, struct mgcp_rtp_end *end,
-			 struct mgcp_port_range *range,
-			 int (*alloc)(struct mgcp_endpoint *endp, int port))
-{
-	int i;
-
-	if (range->mode == PORT_ALLOC_STATIC) {
-		end->local_alloc = PORT_ALLOC_STATIC;
-		return 0;
-	}
-
-	/* attempt to find a port */
-	for (i = 0; i < 200; ++i) {
-		int rc;
-
-		if (range->last_port >= range->range_end)
-			range->last_port = range->range_start;
-
-		rc = alloc(endp, range->last_port);
-
-		range->last_port += 2;
-		if (rc == 0) {
-			end->local_alloc = PORT_ALLOC_DYNAMIC;
-			return 0;
-		}
-
-	}
-
-	LOGP(DLMGCP, LOGL_ERROR, "Allocating a RTP/RTCP port failed 200 times 0x%x.\n",
-	     ENDPOINT_NUMBER(endp));
-	return -1;
-}
-
-static int allocate_ports(struct mgcp_endpoint *endp)
-{
-	if (allocate_port(endp, &endp->net_end, &endp->cfg->net_ports,
-			  mgcp_bind_net_rtp_port) != 0)
-		return -1;
-
-	if (allocate_port(endp, &endp->bts_end, &endp->cfg->bts_ports,
-			  mgcp_bind_bts_rtp_port) != 0) {
-		mgcp_rtp_end_reset(&endp->net_end);
-		return -1;
-	}
-
-	if (endp->cfg->transcoder_ip && endp->tcfg->trunk_type == MGCP_TRUNK_VIRTUAL) {
-		if (allocate_port(endp, &endp->trans_net,
-				  &endp->cfg->transcoder_ports,
-				  mgcp_bind_trans_net_rtp_port) != 0) {
-			mgcp_rtp_end_reset(&endp->net_end);
-			mgcp_rtp_end_reset(&endp->bts_end);
-			return -1;
-		}
-
-		if (allocate_port(endp, &endp->trans_bts,
-				  &endp->cfg->transcoder_ports,
-				  mgcp_bind_trans_bts_rtp_port) != 0) {
-			mgcp_rtp_end_reset(&endp->net_end);
-			mgcp_rtp_end_reset(&endp->bts_end);
-			mgcp_rtp_end_reset(&endp->trans_net);
-			return -1;
-		}
-
-		/* remember that we have set up transcoding */
-		endp->type = MGCP_RTP_TRANSCODED;
-	}
-
-	return 0;
-}
-
-/* Set the LCO from a string (see RFC 3435).
- * The string is stored in the 'string' field. A NULL string is handled excatly
- * like an empty string, the 'string' field is never NULL after this function
- * has been called. */
-static void set_local_cx_options(void *ctx, struct mgcp_lco *lco,
-				 const char *options)
-{
-	char *p_opt, *a_opt;
-	char codec[9];
-
-	talloc_free(lco->string);
-	talloc_free(lco->codec);
-	lco->codec = NULL;
-	lco->pkt_period_min = lco->pkt_period_max = 0;
-	lco->string = talloc_strdup(ctx, options ? options : "");
-
-	p_opt = strstr(lco->string, "p:");
-	if (p_opt && sscanf(p_opt, "p:%d-%d",
-			    &lco->pkt_period_min, &lco->pkt_period_max) == 1)
-		lco->pkt_period_max = lco->pkt_period_min;
-
-	a_opt = strstr(lco->string, "a:");
-	if (a_opt && sscanf(a_opt, "a:%8[^,]", codec) == 1)
-		lco->codec = talloc_strdup(ctx, codec);
-}
-
-void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change,
-			 struct mgcp_rtp_end *rtp)
-{
-	struct mgcp_trunk_config *tcfg = endp->tcfg;
-
-	int patch_ssrc = expect_ssrc_change && tcfg->force_constant_ssrc;
-
-	rtp->force_aligned_timing = tcfg->force_aligned_timing;
-	rtp->force_constant_ssrc = patch_ssrc ? 1 : 0;
-
-	LOGP(DLMGCP, LOGL_DEBUG,
-	     "Configuring RTP endpoint: local port %d%s%s\n",
-	     ntohs(rtp->rtp_port),
-	     rtp->force_aligned_timing ? ", force constant timing" : "",
-	     rtp->force_constant_ssrc ? ", force constant ssrc" : "");
-}
-
-uint32_t mgcp_rtp_packet_duration(struct mgcp_endpoint *endp,
-				  struct mgcp_rtp_end *rtp)
-{
-	int f = 0;
-
-	/* Get the number of frames per channel and packet */
-	if (rtp->frames_per_packet)
-		f = rtp->frames_per_packet;
-	else if (rtp->packet_duration_ms && rtp->codec.frame_duration_num) {
-		int den = 1000 * rtp->codec.frame_duration_num;
-		f = (rtp->packet_duration_ms * rtp->codec.frame_duration_den + den/2)
-			/ den;
-	}
-
-	return rtp->codec.rate * f * rtp->codec.frame_duration_num / rtp->codec.frame_duration_den;
-}
-
-static int mgcp_parse_osmux_cid(const char *line)
-{
-	int osmux_cid;
-
-	if (sscanf(line + 2, "Osmux: %u", &osmux_cid) != 1)
-		return -1;
-
-	if (osmux_cid > OSMUX_CID_MAX) {
-		LOGP(DLMGCP, LOGL_ERROR, "Osmux ID too large: %u > %u\n",
-		     osmux_cid, OSMUX_CID_MAX);
-		return -1;
-	}
-	LOGP(DLMGCP, LOGL_DEBUG, "bsc-nat offered Osmux CID %u\n", osmux_cid);
-
-	return osmux_cid;
-}
-
-static int mgcp_osmux_setup(struct mgcp_endpoint *endp, const char *line)
-{
-	if (!endp->cfg->osmux_init) {
-		if (osmux_init(OSMUX_ROLE_BSC, endp->cfg) < 0) {
-			LOGP(DLMGCP, LOGL_ERROR, "Cannot init OSMUX\n");
-			return -1;
-		}
-		LOGP(DLMGCP, LOGL_NOTICE, "OSMUX socket has been set up\n");
-	}
-
-	return mgcp_parse_osmux_cid(line);
-}
-
-static struct msgb *handle_create_con(struct mgcp_parse_data *p)
-{
-	struct mgcp_trunk_config *tcfg;
-	struct mgcp_endpoint *endp = p->endp;
-	int error_code = 400;
-
-	const char *local_options = NULL;
-	const char *callid = NULL;
-	const char *mode = NULL;
-	char *line;
-	int have_sdp = 0, osmux_cid = -1;
-
-	if (p->found != 0)
-		return create_err_response(NULL, 510, "CRCX", p->trans);
-
-	/* parse CallID C: and LocalParameters L: */
-	for_each_line(line, p->save) {
-		if (!mgcp_check_param(endp, line))
-			continue;
-
-		switch (line[0]) {
-		case 'L':
-			local_options = (const char *) line + 3;
-			break;
-		case 'C':
-			callid = (const char *) line + 3;
-			break;
-		case 'M':
-			mode = (const char *) line + 3;
-			break;
-		case 'X':
-			/* Osmux is not enabled in this bsc, ignore it so the
-			 * bsc-nat knows that we don't want to use Osmux.
-			 */
-			if (!p->endp->cfg->osmux)
-				break;
-
-			if (strncmp("Osmux: ", line + 2, strlen("Osmux: ")) == 0)
-				osmux_cid = mgcp_osmux_setup(endp, line);
-			break;
-		case '\0':
-			have_sdp = 1;
-			goto mgcp_header_done;
-		default:
-			LOGP(DLMGCP, LOGL_NOTICE, "Unhandled option: '%c'/%d on 0x%x\n",
-				*line, *line, ENDPOINT_NUMBER(endp));
-			break;
-		}
-	}
-
-mgcp_header_done:
-	tcfg = p->endp->tcfg;
-
-	/* Check required data */
-	if (!callid || !mode) {
-		LOGP(DLMGCP, LOGL_ERROR, "Missing callid and mode in CRCX on 0x%x\n",
-		     ENDPOINT_NUMBER(endp));
-		return create_err_response(endp, 400, "CRCX", p->trans);
-	}
-
-	if (endp->allocated) {
-		if (tcfg->force_realloc) {
-			LOGP(DLMGCP, LOGL_NOTICE, "Endpoint 0x%x already allocated. Forcing realloc.\n",
-			    ENDPOINT_NUMBER(endp));
-			mgcp_release_endp(endp);
-			if (p->cfg->realloc_cb)
-				p->cfg->realloc_cb(tcfg, ENDPOINT_NUMBER(endp));
-		} else {
-			LOGP(DLMGCP, LOGL_ERROR, "Endpoint is already used. 0x%x\n",
-			     ENDPOINT_NUMBER(endp));
-			return create_err_response(endp, 400, "CRCX", p->trans);
-		}
-	}
-
-	/* copy some parameters */
-	endp->callid = talloc_strdup(tcfg->endpoints, callid);
-
-	set_local_cx_options(endp->tcfg->endpoints, &endp->local_options,
-			     local_options);
-
-	if (parse_conn_mode(mode, endp) != 0) {
-		    error_code = 517;
-		    goto error2;
-	}
-
-	/* initialize */
-	endp->net_end.rtp_port = endp->net_end.rtcp_port = endp->bts_end.rtp_port = endp->bts_end.rtcp_port = 0;
-	mgcp_rtp_end_config(endp, 0, &endp->net_end);
-	mgcp_rtp_end_config(endp, 0, &endp->bts_end);
-
-	/* set to zero until we get the info */
-	memset(&endp->net_end.addr, 0, sizeof(endp->net_end.addr));
-
-	/* bind to the port now */
-	if (allocate_ports(endp) != 0)
-		goto error2;
-
-	/* assign a local call identifier or fail */
-	endp->ci = generate_call_id(p->cfg);
-	if (endp->ci == CI_UNUSED)
-		goto error2;
-
-	/* Annotate Osmux circuit ID and set it to negotiating state until this
-	 * is fully set up from the dummy load.
-	 */
-	endp->osmux.state = OSMUX_STATE_DISABLED;
-	if (osmux_cid >= 0) {
-		endp->osmux.cid = osmux_cid;
-		endp->osmux.state = OSMUX_STATE_NEGOTIATING;
-	} else if (endp->cfg->osmux == OSMUX_USAGE_ONLY) {
-		LOGP(DLMGCP, LOGL_ERROR,
-			"Osmux only and no osmux offered on 0x%x\n", ENDPOINT_NUMBER(endp));
-		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 */
-	mgcp_set_audio_info(p->cfg, &endp->bts_end.codec, tcfg->audio_payload, tcfg->audio_name);
-	endp->bts_end.fmtp_extra = talloc_strdup(tcfg->endpoints,
-						tcfg->audio_fmtp_extra);
-	if (have_sdp)
-		mgcp_parse_sdp_data(endp, &endp->net_end, p);
-	else if (endp->local_options.codec)
-		mgcp_set_audio_info(p->cfg, &endp->net_end.codec,
-			       PTYPE_UNDEFINED, endp->local_options.codec);
-
-	if (p->cfg->bts_force_ptime) {
-		endp->bts_end.packet_duration_ms = p->cfg->bts_force_ptime;
-		endp->bts_end.force_output_ptime = 1;
-	}
-
-	if (setup_rtp_processing(endp) != 0)
-		goto error2;
-
-	/* policy CB */
-	if (p->cfg->policy_cb) {
-		int rc;
-		rc = p->cfg->policy_cb(tcfg, ENDPOINT_NUMBER(endp),
-				MGCP_ENDP_CRCX, p->trans);
-		switch (rc) {
-		case MGCP_POLICY_REJECT:
-			LOGP(DLMGCP, LOGL_NOTICE, "CRCX rejected by policy on 0x%x\n",
-			     ENDPOINT_NUMBER(endp));
-			mgcp_release_endp(endp);
-			return create_err_response(endp, 400, "CRCX", p->trans);
-			break;
-		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:
-			/* just continue */
-			break;
-		}
-	}
-
-	/* 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);
-	if (p->cfg->change_cb)
-		p->cfg->change_cb(tcfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_CRCX);
-
-	if (endp->conn_mode & MGCP_CONN_RECV_ONLY && tcfg->keepalive_interval != 0) {
-		send_dummy(endp);
-	}
-
-	create_transcoder(endp);
-	return create_response_with_sdp(endp, "CRCX", p->trans);
-error2:
-	mgcp_release_endp(endp);
-	LOGP(DLMGCP, LOGL_NOTICE, "Resource error on 0x%x\n", ENDPOINT_NUMBER(endp));
-	return create_err_response(endp, error_code, "CRCX", p->trans);
-}
-
-static struct msgb *handle_modify_con(struct mgcp_parse_data *p)
-{
-	struct mgcp_endpoint *endp = p->endp;
-	int error_code = 500;
-	int silent = 0;
-	int have_sdp = 0;
-	char *line;
-	const char *local_options = NULL;
-
-	if (p->found != 0)
-		return create_err_response(NULL, 510, "MDCX", p->trans);
-
-	if (endp->ci == CI_UNUSED) {
-		LOGP(DLMGCP, LOGL_ERROR, "Endpoint is not "
-			"holding a connection. 0x%x\n", ENDPOINT_NUMBER(endp));
-		return create_err_response(endp, 400, "MDCX", p->trans);
-	}
-
-	for_each_line(line, p->save) {
-		if (!mgcp_check_param(endp, line))
-			continue;
-
-		switch (line[0]) {
-		case 'C': {
-			if (verify_call_id(endp, line + 3) != 0)
-				goto error3;
-			break;
-		}
-		case 'I': {
-			if (verify_ci(endp, line + 3) != 0)
-				goto error3;
-			break;
-		}
-		case 'L':
-			local_options = (const char *) line + 3;
-			break;
-		case 'M':
-			if (parse_conn_mode(line + 3, endp) != 0) {
-			    error_code = 517;
-			    goto error3;
-			}
-			endp->orig_mode = endp->conn_mode;
-			break;
-		case 'Z':
-			silent = strcmp("noanswer", line + 3) == 0;
-			break;
-		case '\0':
-			/* SDP file begins */
-			have_sdp = 1;
-			mgcp_parse_sdp_data(endp, &endp->net_end, p);
-			/* This will exhaust p->save, so the loop will
-			 * terminate next time.
-			 */
-			break;
-		default:
-			LOGP(DLMGCP, LOGL_NOTICE, "Unhandled MGCP option: '%c'/%d on 0x%x\n",
-				line[0], line[0], ENDPOINT_NUMBER(endp));
-			break;
-		}
-	}
-
-	set_local_cx_options(endp->tcfg->endpoints, &endp->local_options,
-			     local_options);
-
-	if (!have_sdp && endp->local_options.codec)
-		mgcp_set_audio_info(p->cfg, &endp->net_end.codec,
-			       PTYPE_UNDEFINED, endp->local_options.codec);
-
-	if (setup_rtp_processing(endp) != 0)
-		goto error3;
-
-	/* policy CB */
-	if (p->cfg->policy_cb) {
-		int rc;
-		rc = p->cfg->policy_cb(endp->tcfg, ENDPOINT_NUMBER(endp),
-						MGCP_ENDP_MDCX, p->trans);
-		switch (rc) {
-		case MGCP_POLICY_REJECT:
-			LOGP(DLMGCP, LOGL_NOTICE, "MDCX rejected by policy on 0x%x\n",
-			     ENDPOINT_NUMBER(endp));
-			if (silent)
-				goto out_silent;
-			return create_err_response(endp, 400, "MDCX", p->trans);
-			break;
-		case MGCP_POLICY_DEFER:
-			/* stop processing */
-			LOGP(DLMGCP, LOGL_DEBUG, "endp %x MDCX defer\n",
-			     ENDPOINT_NUMBER(endp));
-			return NULL;
-			break;
-		case MGCP_POLICY_CONT:
-			/* just continue */
-			break;
-		}
-	}
-
-	mgcp_rtp_end_config(endp, 1, &endp->net_end);
-	mgcp_rtp_end_config(endp, 1, &endp->bts_end);
-
-	/* modify */
-	LOGP(DLMGCP, LOGL_DEBUG, "Modified endpoint on: 0x%x Server: %s:%u\n",
-		ENDPOINT_NUMBER(endp), inet_ntoa(endp->net_end.addr), ntohs(endp->net_end.rtp_port));
-	if (p->cfg->change_cb)
-		p->cfg->change_cb(endp->tcfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_MDCX);
-
-	if (endp->conn_mode & MGCP_CONN_RECV_ONLY &&
-	    endp->tcfg->keepalive_interval != 0)
-		send_dummy(endp);
-
-	if (silent)
-		goto out_silent;
-
-	return create_response_with_sdp(endp, "MDCX", p->trans);
-
-error3:
-	return create_err_response(endp, error_code, "MDCX", p->trans);
-
-
-out_silent:
-	LOGP(DLMGCP, LOGL_DEBUG, "endp %x Modify endpoint: silent exit\n",
-	     ENDPOINT_NUMBER(endp));
-	return NULL;
-}
-
-static struct msgb *handle_delete_con(struct mgcp_parse_data *p)
-{
-	struct mgcp_endpoint *endp = p->endp;
-	int error_code = 400;
-	int silent = 0;
-	char *line;
-	char stats[1048];
-
-	if (p->found != 0)
-		return create_err_response(NULL, error_code, "DLCX", p->trans);
-
-	if (!p->endp->allocated) {
-		LOGP(DLMGCP, LOGL_ERROR, "Endpoint is not used. 0x%x\n",
-			ENDPOINT_NUMBER(endp));
-		return create_err_response(endp, 400, "DLCX", p->trans);
-	}
-
-	for_each_line(line, p->save) {
-		if (!mgcp_check_param(endp, line))
-			continue;
-
-		switch (line[0]) {
-		case 'C':
-			if (verify_call_id(endp, line + 3) != 0)
-				goto error3;
-			break;
-		case 'I':
-			if (verify_ci(endp, line + 3) != 0)
-				goto error3;
-			break;
-		case 'Z':
-			silent = strcmp("noanswer", line + 3) == 0;
-			break;
-		default:
-			LOGP(DLMGCP, LOGL_NOTICE, "Unhandled option: '%c'/%d on 0x%x\n",
-				line[0], line[0], ENDPOINT_NUMBER(endp));
-			break;
-		}
-	}
-
-	/* policy CB */
-	if (p->cfg->policy_cb) {
-		int rc;
-		rc = p->cfg->policy_cb(endp->tcfg, ENDPOINT_NUMBER(endp),
-						MGCP_ENDP_DLCX, p->trans);
-		switch (rc) {
-		case MGCP_POLICY_REJECT:
-			LOGP(DLMGCP, LOGL_NOTICE, "DLCX rejected by policy on 0x%x\n",
-			     ENDPOINT_NUMBER(endp));
-			if (silent)
-				goto out_silent;
-			return create_err_response(endp, 400, "DLCX", p->trans);
-			break;
-		case MGCP_POLICY_DEFER:
-			/* stop processing */
-			delete_transcoder(endp);
-			return NULL;
-			break;
-		case MGCP_POLICY_CONT:
-			/* just continue */
-			break;
-		}
-	}
-
-	/* free the connection */
-	LOGP(DLMGCP, LOGL_DEBUG, "Deleted endpoint on: 0x%x Server: %s:%u\n",
-		ENDPOINT_NUMBER(endp), inet_ntoa(endp->net_end.addr), ntohs(endp->net_end.rtp_port));
-
-	/* save the statistics of the current call */
-	mgcp_format_stats(endp, stats, sizeof(stats));
-
-	delete_transcoder(endp);
-	mgcp_release_endp(endp);
-	if (p->cfg->change_cb)
-		p->cfg->change_cb(endp->tcfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_DLCX);
-
-	if (silent)
-		goto out_silent;
-	return create_ok_resp_with_param(endp, 250, "DLCX", p->trans, stats);
-
-error3:
-	return create_err_response(endp, error_code, "DLCX", p->trans);
-
-out_silent:
-	return NULL;
-}
-
-static struct msgb *handle_rsip(struct mgcp_parse_data *p)
-{
-	if (p->found != 0) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to find the endpoint.\n");
-		return NULL;
-	}
-
-	if (p->cfg->reset_cb)
-		p->cfg->reset_cb(p->endp->tcfg);
-	return NULL;
-}
-
-static char extract_tone(const char *line)
-{
-	const char *str = strstr(line, "D/");
-	if (!str)
-		return CHAR_MAX;
-
-	return str[2];
-}
-
-/*
- * This can request like DTMF detection and forward, fax detection... it
- * can also request when the notification should be send and such. We don't
- * do this right now.
- */
-static struct msgb *handle_noti_req(struct mgcp_parse_data *p)
-{
-	int res = 0;
-	char *line;
-	char tone = CHAR_MAX;
-
-	if (p->found != 0)
-		return create_err_response(NULL, 400, "RQNT", p->trans);
-
-	for_each_line(line, p->save) {
-		switch (line[0]) {
-		case 'S':
-			tone = extract_tone(line);
-			break;
-		}
-	}
-
-	/* we didn't see a signal request with a tone */
-	if (tone == CHAR_MAX)
-		return create_ok_response(p->endp, 200, "RQNT", p->trans);
-
-	if (p->cfg->rqnt_cb)
-		res = p->cfg->rqnt_cb(p->endp, tone);
-
-	return res == 0 ?
-		create_ok_response(p->endp, 200, "RQNT", p->trans) :
-		create_err_response(p->endp, res, "RQNT", p->trans);
-}
-
-static void mgcp_keepalive_timer_cb(void *_tcfg)
-{
-	struct mgcp_trunk_config *tcfg = _tcfg;
-	int i;
-	LOGP(DLMGCP, LOGL_DEBUG, "Triggered trunk %d keepalive timer.\n",
-	     tcfg->trunk_nr);
-
-	if (tcfg->keepalive_interval <= 0)
-		return;
-
-	for (i = 1; i < tcfg->number_endpoints; ++i) {
-		struct mgcp_endpoint *endp = &tcfg->endpoints[i];
-		if (endp->conn_mode == MGCP_CONN_RECV_ONLY)
-			send_dummy(endp);
-	}
-
-	LOGP(DLMGCP, LOGL_DEBUG, "Rescheduling trunk %d keepalive timer.\n",
-	     tcfg->trunk_nr);
-	osmo_timer_schedule(&tcfg->keepalive_timer, tcfg->keepalive_interval, 0);
-}
-
-void mgcp_trunk_set_keepalive(struct mgcp_trunk_config *tcfg, int interval)
-{
-	tcfg->keepalive_interval = interval;
-	osmo_timer_setup(&tcfg->keepalive_timer, mgcp_keepalive_timer_cb, tcfg);
-
-	if (interval <= 0)
-		osmo_timer_del(&tcfg->keepalive_timer);
-	else
-		osmo_timer_schedule(&tcfg->keepalive_timer,
-				    tcfg->keepalive_interval, 0);
-}
-
-struct mgcp_config *mgcp_config_alloc(void)
-{
-	struct mgcp_config *cfg;
-
-	cfg = talloc_zero(NULL, struct mgcp_config);
-	if (!cfg) {
-		LOGP(DLMGCP, LOGL_FATAL, "Failed to allocate config.\n");
-		return NULL;
-	}
-
-	cfg->source_port = 2427;
-	cfg->source_addr = talloc_strdup(cfg, "0.0.0.0");
-	cfg->osmux_addr = talloc_strdup(cfg, "0.0.0.0");
-
-	cfg->transcoder_remote_base = 4000;
-
-	cfg->bts_ports.base_port = RTP_PORT_DEFAULT;
-	cfg->net_ports.base_port = RTP_PORT_NET_DEFAULT;
-
-	cfg->rtp_processing_cb = &mgcp_rtp_processing_default;
-	cfg->setup_rtp_processing_cb = &mgcp_setup_rtp_processing_default;
-
-	cfg->get_net_downlink_format_cb = &mgcp_get_net_downlink_format_default;
-
-	/* default trunk handling */
-	cfg->trunk.cfg = cfg;
-	cfg->trunk.trunk_nr = 0;
-	cfg->trunk.trunk_type = MGCP_TRUNK_VIRTUAL;
-	cfg->trunk.audio_name = talloc_strdup(cfg, "AMR/8000");
-	cfg->trunk.audio_payload = 126;
-	cfg->trunk.audio_send_ptime = 1;
-	cfg->trunk.audio_send_name = 1;
-	cfg->trunk.omit_rtcp = 0;
-	mgcp_trunk_set_keepalive(&cfg->trunk, MGCP_KEEPALIVE_ONCE);
-
-	INIT_LLIST_HEAD(&cfg->trunks);
-
-	return cfg;
-}
-
-struct mgcp_trunk_config *mgcp_trunk_alloc(struct mgcp_config *cfg, int nr)
-{
-	struct mgcp_trunk_config *trunk;
-
-	trunk = talloc_zero(cfg, struct mgcp_trunk_config);
-	if (!trunk) {
-		LOGP(DLMGCP, LOGL_ERROR, "Failed to allocate.\n");
-		return NULL;
-	}
-
-	trunk->cfg = cfg;
-	trunk->trunk_type = MGCP_TRUNK_E1;
-	trunk->trunk_nr = nr;
-	trunk->audio_name = talloc_strdup(cfg, "AMR/8000");
-	trunk->audio_payload = 126;
-	trunk->audio_send_ptime = 1;
-	trunk->audio_send_name = 1;
-	trunk->number_endpoints = 33;
-	trunk->omit_rtcp = 0;
-	mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
-	llist_add_tail(&trunk->entry, &cfg->trunks);
-	return trunk;
-}
-
-struct mgcp_trunk_config *mgcp_trunk_num(struct mgcp_config *cfg, int index)
-{
-	struct mgcp_trunk_config *trunk;
-
-	llist_for_each_entry(trunk, &cfg->trunks, entry)
-		if (trunk->trunk_nr == index)
-			return trunk;
-
-	return NULL;
-}
-
-static void mgcp_rtp_codec_reset(struct mgcp_rtp_codec *codec)
-{
-	codec->payload_type = -1;
-	talloc_free(codec->subtype_name);
-	codec->subtype_name = NULL;
-	talloc_free(codec->audio_name);
-	codec->audio_name = NULL;
-	codec->frame_duration_num = DEFAULT_RTP_AUDIO_FRAME_DUR_NUM;
-	codec->frame_duration_den = DEFAULT_RTP_AUDIO_FRAME_DUR_DEN;
-	codec->rate               = DEFAULT_RTP_AUDIO_DEFAULT_RATE;
-	codec->channels           = DEFAULT_RTP_AUDIO_DEFAULT_CHANNELS;
-}
-
-static void mgcp_rtp_end_reset(struct mgcp_rtp_end *end)
-{
-	if (end->local_alloc == PORT_ALLOC_DYNAMIC) {
-		mgcp_free_rtp_port(end);
-		end->local_port = 0;
-	}
-
-	end->packets = 0;
-	end->octets = 0;
-	end->dropped_packets = 0;
-	memset(&end->addr, 0, sizeof(end->addr));
-	end->rtp_port = end->rtcp_port = 0;
-	end->local_alloc = -1;
-	talloc_free(end->fmtp_extra);
-	end->fmtp_extra = NULL;
-	talloc_free(end->rtp_process_data);
-	end->rtp_process_data = NULL;
-
-	/* Set default values */
-	end->frames_per_packet  = 0; /* unknown */
-	end->packet_duration_ms = DEFAULT_RTP_AUDIO_PACKET_DURATION_MS;
-	end->output_enabled	= 0;
-
-	mgcp_rtp_codec_reset(&end->codec);
-	mgcp_rtp_codec_reset(&end->alt_codec);
-}
-
-static void mgcp_rtp_end_init(struct mgcp_rtp_end *end)
-{
-	mgcp_rtp_end_reset(end);
-	end->rtp.fd = -1;
-	end->rtcp.fd = -1;
-}
-
-int mgcp_endpoints_allocate(struct mgcp_trunk_config *tcfg)
-{
-	int i;
-
-	/* Initialize all endpoints */
-	tcfg->endpoints = _talloc_zero_array(tcfg->cfg,
-				       sizeof(struct mgcp_endpoint),
-				       tcfg->number_endpoints, "endpoints");
-	if (!tcfg->endpoints)
-		return -1;
-
-	for (i = 0; i < tcfg->number_endpoints; ++i) {
-		tcfg->endpoints[i].osmux.allocated_cid = -1;
-		tcfg->endpoints[i].ci = CI_UNUSED;
-		tcfg->endpoints[i].cfg = tcfg->cfg;
-		tcfg->endpoints[i].tcfg = tcfg;
-		mgcp_rtp_end_init(&tcfg->endpoints[i].net_end);
-		mgcp_rtp_end_init(&tcfg->endpoints[i].bts_end);
-		mgcp_rtp_end_init(&tcfg->endpoints[i].trans_net);
-		mgcp_rtp_end_init(&tcfg->endpoints[i].trans_bts);
-	}
-
-	return 0;
-}
-
-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;
-
-	talloc_free(endp->callid);
-	endp->callid = NULL;
-
-	talloc_free(endp->local_options.string);
-	endp->local_options.string = NULL;
-	talloc_free(endp->local_options.codec);
-	endp->local_options.codec = NULL;
-
-	mgcp_rtp_end_reset(&endp->bts_end);
-	mgcp_rtp_end_reset(&endp->net_end);
-	mgcp_rtp_end_reset(&endp->trans_net);
-	mgcp_rtp_end_reset(&endp->trans_bts);
-	endp->type = MGCP_RTP_DEFAULT;
-
-	memset(&endp->net_state, 0, sizeof(endp->net_state));
-	memset(&endp->bts_state, 0, sizeof(endp->bts_state));
-
-	endp->conn_mode = endp->orig_mode = MGCP_CONN_NONE;
-
-	if (endp->osmux.state == OSMUX_STATE_ENABLED)
-		osmux_disable_endpoint(endp);
-
-	/* release the circuit ID if it had been allocated */
-	osmux_release_cid(endp);
-
-	memset(&endp->taps, 0, sizeof(endp->taps));
-}
-
-void mgcp_initialize_endp(struct mgcp_endpoint *endp)
-{
-	return mgcp_release_endp(endp);
-}
-
-static int send_trans(struct mgcp_config *cfg, const char *buf, int len)
-{
-	struct sockaddr_in addr;
-
-	memset(&addr, 0, sizeof(addr));
-	addr.sin_family = AF_INET;
-	addr.sin_addr = cfg->transcoder_in;
-	addr.sin_port = htons(2427);
-	return sendto(cfg->gw_fd.bfd.fd, buf, len, 0,
-		      (struct sockaddr *) &addr, sizeof(addr));
-}
-
-static void send_msg(struct mgcp_endpoint *endp, int endpoint, int port,
-		     const char *msg, const char *mode)
-{
-	char buf[2096];
-	int len;
-	int nchars;
-
-	/* hardcoded to AMR right now, we do not know the real type at this point */
-	len = snprintf(buf, sizeof(buf),
-			"%s 42 %x@mgw MGCP 1.0\r\n"
-			"C: 4256\r\n"
-			"M: %s\r\n"
-			"\r\n",
-			msg, endpoint, mode);
-
-	if (len < 0)
-		return;
-
-	nchars = write_response_sdp(endp, buf + len, sizeof(buf) + len - 1, NULL);
-	if (nchars < 0)
-		return;
-
-	len += nchars;
-
-	buf[sizeof(buf) - 1] = '\0';
-
-	send_trans(endp->cfg, buf, len);
-}
-
-static void send_dlcx(struct mgcp_endpoint *endp, int endpoint)
-{
-	char buf[2096];
-	int len;
-
-	len = snprintf(buf, sizeof(buf),
-			"DLCX 43 %x@mgw MGCP 1.0\r\n"
-			"C: 4256\r\n"
-			, endpoint);
-
-	if (len < 0)
-		return;
-
-	buf[sizeof(buf) - 1] = '\0';
-
-	send_trans(endp->cfg, buf, len);
-}
-
-static int send_agent(struct mgcp_config *cfg, const char *buf, int len)
-{
-	return write(cfg->gw_fd.bfd.fd, buf, len);
-}
-
-int mgcp_send_reset_all(struct mgcp_config *cfg)
-{
-	static const char mgcp_reset[] = {
-	    "RSIP 1 *@mgw MGCP 1.0\r\n"
-	};
-
-	return send_agent(cfg, mgcp_reset, sizeof mgcp_reset -1);
-}
-
-int mgcp_send_reset_ep(struct mgcp_endpoint *endp, int endpoint)
-{
-	char buf[128];
-	int len;
-
-	len = snprintf(buf, sizeof(buf),
-			"RSIP 39 %x@mgw MGCP 1.0\r\n"
-			, endpoint);
-	if (len < 0)
-		return len;
-
-	buf[sizeof(buf) - 1] = '\0';
-
-	return send_agent(endp->cfg, buf, len);
-}
-
-static int setup_rtp_processing(struct mgcp_endpoint *endp)
-{
-	int rc = 0;
-	struct mgcp_config *cfg = endp->cfg;
-
-	if (endp->type != MGCP_RTP_DEFAULT)
-		return 0;
-
-	if (endp->conn_mode == MGCP_CONN_LOOPBACK)
-		return 0;
-
-	if (endp->conn_mode & MGCP_CONN_SEND_ONLY)
-		rc |= cfg->setup_rtp_processing_cb(endp, &endp->net_end, &endp->bts_end);
-	else
-		rc |= cfg->setup_rtp_processing_cb(endp, &endp->net_end, NULL);
-
-	if (endp->conn_mode & MGCP_CONN_RECV_ONLY)
-		rc |= cfg->setup_rtp_processing_cb(endp, &endp->bts_end, &endp->net_end);
-	else
-		rc |= cfg->setup_rtp_processing_cb(endp, &endp->bts_end, NULL);
-	return rc;
-}
-
-static void create_transcoder(struct mgcp_endpoint *endp)
-{
-	int port;
-	int in_endp = ENDPOINT_NUMBER(endp);
-	int out_endp = endp_back_channel(in_endp);
-
-	if (endp->type != MGCP_RTP_TRANSCODED)
-		return;
-
-	send_msg(endp, in_endp, endp->trans_bts.local_port, "CRCX", "sendrecv");
-	send_msg(endp, in_endp, endp->trans_bts.local_port, "MDCX", "sendrecv");
-	send_msg(endp, out_endp, endp->trans_net.local_port, "CRCX", "sendrecv");
-	send_msg(endp, out_endp, endp->trans_net.local_port, "MDCX", "sendrecv");
-
-	port = rtp_calculate_port(in_endp, endp->cfg->transcoder_remote_base);
-	endp->trans_bts.rtp_port = htons(port);
-	endp->trans_bts.rtcp_port = htons(port + 1);
-
-	port = rtp_calculate_port(out_endp, endp->cfg->transcoder_remote_base);
-	endp->trans_net.rtp_port = htons(port);
-	endp->trans_net.rtcp_port = htons(port + 1);
-}
-
-static void delete_transcoder(struct mgcp_endpoint *endp)
-{
-	int in_endp = ENDPOINT_NUMBER(endp);
-	int out_endp = endp_back_channel(in_endp);
-
-	if (endp->type != MGCP_RTP_TRANSCODED)
-		return;
-
-	send_dlcx(endp, in_endp);
-	send_dlcx(endp, out_endp);
-}
-
-int mgcp_reset_transcoder(struct mgcp_config *cfg)
-{
-	if (!cfg->transcoder_ip)
-		return 0;
-
-	static const char mgcp_reset[] = {
-	    "RSIP 1 13@mgw MGCP 1.0\r\n"
-	};
-
-	return send_trans(cfg, mgcp_reset, sizeof mgcp_reset -1);
-}
-
-void mgcp_format_stats(struct mgcp_endpoint *endp, char *msg, size_t size)
-{
-	uint32_t expected, jitter;
-	int ploss;
-	int nchars;
-	mgcp_state_calc_loss(&endp->net_state, &endp->net_end,
-				&expected, &ploss);
-	jitter = mgcp_state_calc_jitter(&endp->net_state);
-
-	nchars = snprintf(msg, size,
-			  "\r\nP: PS=%u, OS=%u, PR=%u, OR=%u, PL=%d, JI=%u",
-			  endp->bts_end.packets, endp->bts_end.octets,
-			  endp->net_end.packets, endp->net_end.octets,
-			  ploss, jitter);
-	if (nchars < 0 || nchars >= size)
-		goto truncate;
-
-	msg += nchars;
-	size -= nchars;
-
-	if (endp->cfg->osmux != OSMUX_USAGE_OFF) {
-		/* Error Counter */
-		nchars = snprintf(msg, size,
-				  "\r\nX-Osmo-CP: EC TIS=%u, TOS=%u, TIR=%u, TOR=%u",
-				  endp->net_state.in_stream.err_ts_counter,
-				  endp->net_state.out_stream.err_ts_counter,
-				  endp->bts_state.in_stream.err_ts_counter,
-				  endp->bts_state.out_stream.err_ts_counter);
-		if (nchars < 0 || nchars >= size)
-			goto truncate;
-
-		msg += nchars;
-		size -= nchars;
-
-		if (endp->osmux.state == OSMUX_STATE_ENABLED) {
-			snprintf(msg, size,
-				 "\r\nX-Osmux-ST: CR=%u, BR=%u",
-				 endp->osmux.stats.chunks,
-				 endp->osmux.stats.octets);
-		}
-	}
-truncate:
-	msg[size - 1] = '\0';
-}
-
-int mgcp_parse_stats(struct msgb *msg, uint32_t *ps, uint32_t *os,
-		uint32_t *pr, uint32_t *_or, int *loss, uint32_t *jitter)
-{
-	char *line, *save;
-	int rc;
-
-	/* initialize with bad values */
-	*ps = *os = *pr = *_or = *jitter = UINT_MAX;
-	*loss = INT_MAX;
-
-
-	line = strtok_r((char *) msg->l2h, "\r\n", &save);
-	if (!line)
-		return -1;
-
-	/* this can only parse the message that is created above... */
-	for_each_non_empty_line(line, save) {
-		switch (line[0]) {
-		case 'P':
-			rc = sscanf(line, "P: PS=%u, OS=%u, PR=%u, OR=%u, PL=%d, JI=%u",
-					ps, os, pr, _or, loss, jitter);
-			return rc == 6 ? 0 : -1;
-		}
-	}
-
-	return -1;
-}
diff --git a/src/libosmo-legacy-mgcp/mgcp_sdp.c b/src/libosmo-legacy-mgcp/mgcp_sdp.c
deleted file mode 100644
index 055e1af..0000000
--- a/src/libosmo-legacy-mgcp/mgcp_sdp.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * Some SDP file parsing...
- *
- * (C) 2009-2015 by Holger Hans Peter Freyther <zecke@selfish.org>
- * (C) 2009-2014 by On-Waves
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <osmocom/legacy_mgcp/mgcp.h>
-#include <osmocom/legacy_mgcp/mgcp_internal.h>
-
-#include <errno.h>
-
-struct sdp_rtp_map {
-	/* the type */
-	int payload_type;
-	/* null, static or later dynamic codec name */
-	char *codec_name;
-	/* A pointer to the original line for later parsing */
-	char *map_line;
-
-	int rate;
-	int channels;
-};
-
-int mgcp_set_audio_info(void *ctx, struct mgcp_rtp_codec *codec,
-			int payload_type, const char *audio_name)
-{
-	int rate = codec->rate;
-	int channels = codec->channels;
-	char audio_codec[64];
-
-	talloc_free(codec->subtype_name);
-	codec->subtype_name = NULL;
-	talloc_free(codec->audio_name);
-	codec->audio_name = NULL;
-
-	if (payload_type != PTYPE_UNDEFINED)
-		codec->payload_type = payload_type;
-
-	if (!audio_name) {
-		switch (payload_type) {
-		case 0: audio_name = "PCMU/8000/1"; break;
-		case 3: audio_name = "GSM/8000/1"; break;
-		case 8: audio_name = "PCMA/8000/1"; break;
-		case 18: audio_name = "G729/8000/1"; break;
-		default:
-			 /* Payload type is unknown, don't change rate and
-			  * channels. */
-			 /* TODO: return value? */
-			 return 0;
-		}
-	}
-
-	if (sscanf(audio_name, "%63[^/]/%d/%d",
-		   audio_codec, &rate, &channels) < 1)
-		return -EINVAL;
-
-	codec->rate = rate;
-	codec->channels = channels;
-	codec->subtype_name = talloc_strdup(ctx, audio_codec);
-	codec->audio_name = talloc_strdup(ctx, audio_name);
-
-	if (!strcmp(audio_codec, "G729")) {
-		codec->frame_duration_num = 10;
-		codec->frame_duration_den = 1000;
-	} else {
-		codec->frame_duration_num = DEFAULT_RTP_AUDIO_FRAME_DUR_NUM;
-		codec->frame_duration_den = DEFAULT_RTP_AUDIO_FRAME_DUR_DEN;
-	}
-
-	if (payload_type < 0) {
-		payload_type = 96;
-		if (rate == 8000 && channels == 1) {
-			if (!strcmp(audio_codec, "GSM"))
-				payload_type = 3;
-			else if (!strcmp(audio_codec, "PCMA"))
-				payload_type = 8;
-			else if (!strcmp(audio_codec, "PCMU"))
-				payload_type = 0;
-			else if (!strcmp(audio_codec, "G729"))
-				payload_type = 18;
-		}
-
-		codec->payload_type = payload_type;
-	}
-
-	if (channels != 1)
-		LOGP(DLMGCP, LOGL_NOTICE,
-		     "Channels != 1 in SDP: '%s'\n", audio_name);
-
-	return 0;
-}
-
-void codecs_initialize(void *ctx, struct sdp_rtp_map *codecs, int used)
-{
-	int i;
-
-	for (i = 0; i < used; ++i) {
-		switch (codecs[i].payload_type) {
-		case 0:
-			codecs[i].codec_name = "PCMU";
-			codecs[i].rate = 8000;
-			codecs[i].channels = 1;
-			break;
-		case 3:
-			codecs[i].codec_name = "GSM";
-			codecs[i].rate = 8000;
-			codecs[i].channels = 1;
-			break;
-		case 8:
-			codecs[i].codec_name = "PCMA";
-			codecs[i].rate = 8000;
-			codecs[i].channels = 1;
-			break;
-		case 18:
-			codecs[i].codec_name = "G729";
-			codecs[i].rate = 8000;
-			codecs[i].channels = 1;
-			break;
-		}
-	}
-}
-
-void codecs_update(void *ctx, struct sdp_rtp_map *codecs, int used, int payload, char *audio_name)
-{
-	int i;
-
-	for (i = 0; i < used; ++i) {
-		char audio_codec[64];
-		int rate = -1;
-		int channels = -1;
-		if (codecs[i].payload_type != payload)
-			continue;
-		if (sscanf(audio_name, "%63[^/]/%d/%d",
-				audio_codec, &rate, &channels) < 1) {
-			LOGP(DLMGCP, LOGL_ERROR, "Failed to parse '%s'\n", audio_name);
-			continue;
-		}
-
-		codecs[i].map_line = talloc_strdup(ctx, audio_name);
-		codecs[i].codec_name = talloc_strdup(ctx, audio_codec);
-		codecs[i].rate = rate;
-		codecs[i].channels = channels;
-		return;
-	}
-
-	LOGP(DLMGCP, LOGL_ERROR, "Unconfigured PT(%d) with %s\n", payload, audio_name);
-}
-
-int is_codec_compatible(struct mgcp_endpoint *endp, struct sdp_rtp_map *codec)
-{
-	char *bts_codec;
-	char audio_codec[64];
-
-	if (!codec->codec_name)
-		return 0;
-
-	/*
-	 * GSM, GSM/8000 and GSM/8000/1 should all be compatible.. let's go
-	 * by name first.
-	 */
-	bts_codec = endp->tcfg->audio_name;
-	if (sscanf(bts_codec, "%63[^/]/%*d/%*d", audio_codec) < 1)
-		return 0;
-
-	return strcasecmp(audio_codec, codec->codec_name) == 0;
-}
-
-int mgcp_parse_sdp_data(struct mgcp_endpoint *endp, struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p)
-{
-	struct sdp_rtp_map codecs[10];
-	int codecs_used = 0;
-	char *line;
-	int maxptime = -1;
-	int i;
-	int codecs_assigned = 0;
-	void *tmp_ctx = talloc_new(NULL);
-
-	memset(&codecs, 0, sizeof(codecs));
-
-	for_each_line(line, p->save) {
-		switch (line[0]) {
-		case 'o':
-		case 's':
-		case 't':
-		case 'v':
-			/* skip these SDP attributes */
-			break;
-		case 'a': {
-			int payload;
-			int ptime, ptime2 = 0;
-			char audio_name[64];
-
-
-			if (sscanf(line, "a=rtpmap:%d %63s",
-				   &payload, audio_name) == 2) {
-				codecs_update(tmp_ctx, codecs, codecs_used, payload, audio_name);
-			} else if (sscanf(line, "a=ptime:%d-%d",
-					  &ptime, &ptime2) >= 1) {
-				if (ptime2 > 0 && ptime2 != ptime)
-					rtp->packet_duration_ms = 0;
-				else
-					rtp->packet_duration_ms = ptime;
-			} else if (sscanf(line, "a=maxptime:%d", &ptime2) == 1) {
-				maxptime = ptime2;
-			}
-			break;
-		}
-		case 'm': {
-			int port, rc;
-
-			rc = sscanf(line, "m=audio %d RTP/AVP %d %d %d %d %d %d %d %d %d %d",
-					&port,
-					&codecs[0].payload_type,
-					&codecs[1].payload_type,
-					&codecs[2].payload_type,
-					&codecs[3].payload_type,
-					&codecs[4].payload_type,
-					&codecs[5].payload_type,
-					&codecs[6].payload_type,
-					&codecs[7].payload_type,
-					&codecs[8].payload_type,
-					&codecs[9].payload_type);
-			if (rc >= 2) {
-				rtp->rtp_port = htons(port);
-				rtp->rtcp_port = htons(port + 1);
-				codecs_used = rc - 1;
-				codecs_initialize(tmp_ctx, codecs, codecs_used);
-			}
-			break;
-		}
-		case 'c': {
-			char ipv4[16];
-
-			if (sscanf(line, "c=IN IP4 %15s", ipv4) == 1) {
-				inet_aton(ipv4, &rtp->addr);
-			}
-			break;
-		}
-		default:
-			if (p->endp)
-				LOGP(DLMGCP, LOGL_NOTICE,
-				     "Unhandled SDP option: '%c'/%d on 0x%x\n",
-				     line[0], line[0], ENDPOINT_NUMBER(p->endp));
-			else
-				LOGP(DLMGCP, LOGL_NOTICE,
-				     "Unhandled SDP option: '%c'/%d\n",
-				     line[0], line[0]);
-			break;
-		}
-	}
-
-	/* Now select the primary and alt_codec */
-	for (i = 0; i < codecs_used && codecs_assigned < 2; ++i) {
-		struct mgcp_rtp_codec *codec = codecs_assigned == 0 ?
-					&rtp->codec : &rtp->alt_codec;
-
-		if (endp->tcfg->no_audio_transcoding &&
-			!is_codec_compatible(endp, &codecs[i])) {
-			LOGP(DLMGCP, LOGL_NOTICE, "Skipping codec %s\n",
-				codecs[i].codec_name);
-			continue;
-		}
-
-		mgcp_set_audio_info(p->cfg, codec,
-					codecs[i].payload_type,
-					codecs[i].map_line);
-		codecs_assigned += 1;
-	}
-
-	if (codecs_assigned > 0) {
-		/* TODO/XXX: Store this per codec and derive it on use */
-		if (maxptime >= 0 && maxptime * rtp->codec.frame_duration_den >
-				rtp->codec.frame_duration_num * 1500) {
-			/* more than 1 frame */
-			rtp->packet_duration_ms = 0;
-		}
-
-		LOGP(DLMGCP, LOGL_NOTICE,
-		     "Got media info via SDP: port %d, payload %d (%s), "
-		     "duration %d, addr %s\n",
-		     ntohs(rtp->rtp_port), rtp->codec.payload_type,
-		     rtp->codec.subtype_name ? rtp->codec.subtype_name : "unknown",
-		     rtp->packet_duration_ms, inet_ntoa(rtp->addr));
-	}
-
-	talloc_free(tmp_ctx);
-	return codecs_assigned > 0;
-}
-
diff --git a/src/libosmo-legacy-mgcp/mgcp_transcode.c b/src/libosmo-legacy-mgcp/mgcp_transcode.c
deleted file mode 100644
index cbabdd1..0000000
--- a/src/libosmo-legacy-mgcp/mgcp_transcode.c
+++ /dev/null
@@ -1,611 +0,0 @@
-/*
- * (C) 2014 by On-Waves
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-
-#include "g711common.h"
-
-#include <osmocom/legacy_mgcp/mgcp.h>
-#include <osmocom/legacy_mgcp/mgcp_internal.h>
-#include <osmocom/legacy_mgcp/mgcp_transcode.h>
-
-#include <osmocom/core/talloc.h>
-#include <osmocom/netif/rtp.h>
-
-int mgcp_transcoding_get_frame_size(void *state_, int nsamples, int dst)
-{
-	struct mgcp_process_rtp_state *state = state_;
-	if (dst)
-		return (nsamples >= 0 ?
-			nsamples / state->dst_samples_per_frame :
-			1) * state->dst_frame_size;
-	else
-		return (nsamples >= 0 ?
-			nsamples / state->src_samples_per_frame :
-			1) * state->src_frame_size;
-}
-
-static enum audio_format get_audio_format(const struct mgcp_rtp_codec *codec)
-{
-	if (codec->subtype_name) {
-		if (!strcasecmp("GSM", codec->subtype_name))
-			return AF_GSM;
-		if (!strcasecmp("PCMA", codec->subtype_name))
-			return AF_PCMA;
-		if (!strcasecmp("PCMU", codec->subtype_name))
-			return AF_PCMU;
-#ifdef HAVE_BCG729
-		if (!strcasecmp("G729", codec->subtype_name))
-			return AF_G729;
-#endif
-		if (!strcasecmp("L16", codec->subtype_name))
-			return AF_L16;
-	}
-
-	switch (codec->payload_type) {
-	case 0 /* PCMU */:
-		return AF_PCMU;
-	case 3 /* GSM */:
-		return AF_GSM;
-	case 8 /* PCMA */:
-		return AF_PCMA;
-#ifdef HAVE_BCG729
-	case 18 /* G.729 */:
-		return AF_G729;
-#endif
-	case 11 /* L16 */:
-		return AF_L16;
-	default:
-		return AF_INVALID;
-	}
-}
-
-static void l16_encode(short *sample, unsigned char *buf, size_t n)
-{
-	for (; n > 0; --n, ++sample, buf += 2) {
-		buf[0] = sample[0] >> 8;
-		buf[1] = sample[0] & 0xff;
-	}
-}
-
-static void l16_decode(unsigned char *buf, short *sample, size_t n)
-{
-	for (; n > 0; --n, ++sample, buf += 2)
-		sample[0] = ((short)buf[0] << 8) | buf[1];
-}
-
-static void alaw_encode(short *sample, unsigned char *buf, size_t n)
-{
-	for (; n > 0; --n)
-		*(buf++) = s16_to_alaw(*(sample++));
-}
-
-static void alaw_decode(unsigned char *buf, short *sample, size_t n)
-{
-	for (; n > 0; --n)
-		*(sample++) = alaw_to_s16(*(buf++));
-}
-
-static void ulaw_encode(short *sample, unsigned char *buf, size_t n)
-{
-	for (; n > 0; --n)
-		*(buf++) = s16_to_ulaw(*(sample++));
-}
-
-static void ulaw_decode(unsigned char *buf, short *sample, size_t n)
-{
-	for (; n > 0; --n)
-		*(sample++) = ulaw_to_s16(*(buf++));
-}
-
-static int processing_state_destructor(struct mgcp_process_rtp_state *state)
-{
-	switch (state->src_fmt) {
-	case AF_GSM:
-		if (state->src.gsm_handle)
-			gsm_destroy(state->src.gsm_handle);
-		break;
-#ifdef HAVE_BCG729
-	case AF_G729:
-		if (state->src.g729_dec)
-			closeBcg729DecoderChannel(state->src.g729_dec);
-		break;
-#endif
-	default:
-		break;
-	}
-	switch (state->dst_fmt) {
-	case AF_GSM:
-		if (state->dst.gsm_handle)
-			gsm_destroy(state->dst.gsm_handle);
-		break;
-#ifdef HAVE_BCG729
-	case AF_G729:
-		if (state->dst.g729_enc)
-			closeBcg729EncoderChannel(state->dst.g729_enc);
-		break;
-#endif
-	default:
-		break;
-	}
-	return 0;
-}
-
-int mgcp_transcoding_setup(struct mgcp_endpoint *endp,
-			   struct mgcp_rtp_end *dst_end,
-			   struct mgcp_rtp_end *src_end)
-{
-	struct mgcp_process_rtp_state *state;
-	enum audio_format src_fmt, dst_fmt;
-	const struct mgcp_rtp_codec *dst_codec = &dst_end->codec;
-
-	/* cleanup first */
-	if (dst_end->rtp_process_data) {
-		talloc_free(dst_end->rtp_process_data);
-		dst_end->rtp_process_data = NULL;
-	}
-
-	if (!src_end)
-		return 0;
-
-	const struct mgcp_rtp_codec *src_codec = &src_end->codec;
-
-	if (endp->tcfg->no_audio_transcoding) {
-		LOGP(DLMGCP, LOGL_NOTICE,
-			"Transcoding disabled on endpoint 0x%x\n",
-			ENDPOINT_NUMBER(endp));
-		return 0;
-	}
-
-	src_fmt = get_audio_format(src_codec);
-	dst_fmt = get_audio_format(dst_codec);
-
-	LOGP(DLMGCP, LOGL_ERROR,
-	     "Checking transcoding: %s (%d) -> %s (%d)\n",
-	     src_codec->subtype_name, src_codec->payload_type,
-	     dst_codec->subtype_name, dst_codec->payload_type);
-
-	if (src_fmt == AF_INVALID || dst_fmt == AF_INVALID) {
-		if (!src_codec->subtype_name || !dst_codec->subtype_name)
-			/* Not enough info, do nothing */
-			return 0;
-
-		if (strcasecmp(src_codec->subtype_name, dst_codec->subtype_name) == 0)
-			/* Nothing to do */
-			return 0;
-
-		LOGP(DLMGCP, LOGL_ERROR,
-		     "Cannot transcode: %s codec not supported (%s -> %s).\n",
-		     src_fmt != AF_INVALID ? "destination" : "source",
-		     src_codec->audio_name, dst_codec->audio_name);
-		return -EINVAL;
-	}
-
-	if (src_codec->rate && dst_codec->rate && src_codec->rate != dst_codec->rate) {
-		LOGP(DLMGCP, LOGL_ERROR,
-		     "Cannot transcode: rate conversion (%d -> %d) not supported.\n",
-		     src_codec->rate, dst_codec->rate);
-		return -EINVAL;
-	}
-
-	state = talloc_zero(endp->tcfg->cfg, struct mgcp_process_rtp_state);
-	talloc_set_destructor(state, processing_state_destructor);
-	dst_end->rtp_process_data = state;
-
-	state->src_fmt = src_fmt;
-
-	switch (state->src_fmt) {
-	case AF_L16:
-	case AF_S16:
-		state->src_frame_size = 80 * sizeof(short);
-		state->src_samples_per_frame = 80;
-		break;
-	case AF_GSM:
-		state->src_frame_size = sizeof(gsm_frame);
-		state->src_samples_per_frame = 160;
-		state->src.gsm_handle = gsm_create();
-		if (!state->src.gsm_handle) {
-			LOGP(DLMGCP, LOGL_ERROR,
-			     "Failed to initialize GSM decoder.\n");
-			return -EINVAL;
-		}
-		break;
-#ifdef HAVE_BCG729
-	case AF_G729:
-		state->src_frame_size = 10;
-		state->src_samples_per_frame = 80;
-		state->src.g729_dec = initBcg729DecoderChannel();
-		if (!state->src.g729_dec) {
-			LOGP(DLMGCP, LOGL_ERROR,
-			     "Failed to initialize G.729 decoder.\n");
-			return -EINVAL;
-		}
-		break;
-#endif
-	case AF_PCMU:
-	case AF_PCMA:
-		state->src_frame_size = 80;
-		state->src_samples_per_frame = 80;
-		break;
-	default:
-		break;
-	}
-
-	state->dst_fmt = dst_fmt;
-
-	switch (state->dst_fmt) {
-	case AF_L16:
-	case AF_S16:
-		state->dst_frame_size = 80*sizeof(short);
-		state->dst_samples_per_frame = 80;
-		break;
-	case AF_GSM:
-		state->dst_frame_size = sizeof(gsm_frame);
-		state->dst_samples_per_frame = 160;
-		state->dst.gsm_handle = gsm_create();
-		if (!state->dst.gsm_handle) {
-			LOGP(DLMGCP, LOGL_ERROR,
-			     "Failed to initialize GSM encoder.\n");
-			return -EINVAL;
-		}
-		break;
-#ifdef HAVE_BCG729
-	case AF_G729:
-		state->dst_frame_size = 10;
-		state->dst_samples_per_frame = 80;
-		state->dst.g729_enc = initBcg729EncoderChannel();
-		if (!state->dst.g729_enc) {
-			LOGP(DLMGCP, LOGL_ERROR,
-			     "Failed to initialize G.729 decoder.\n");
-			return -EINVAL;
-		}
-		break;
-#endif
-	case AF_PCMU:
-	case AF_PCMA:
-		state->dst_frame_size = 80;
-		state->dst_samples_per_frame = 80;
-		break;
-	default:
-		break;
-	}
-
-	if (dst_end->force_output_ptime)
-		state->dst_packet_duration = mgcp_rtp_packet_duration(endp, dst_end);
-
-	LOGP(DLMGCP, LOGL_INFO,
-	     "Initialized RTP processing on: 0x%x "
-	     "conv: %d (%d, %d, %s) -> %d (%d, %d, %s)\n",
-	     ENDPOINT_NUMBER(endp),
-	     src_fmt, src_codec->payload_type, src_codec->rate, src_end->fmtp_extra,
-	     dst_fmt, dst_codec->payload_type, dst_codec->rate, dst_end->fmtp_extra);
-
-	return 0;
-}
-
-void mgcp_transcoding_net_downlink_format(struct mgcp_endpoint *endp,
-					  int *payload_type,
-					  const char**audio_name,
-					  const char**fmtp_extra)
-{
-	struct mgcp_process_rtp_state *state = endp->net_end.rtp_process_data;
-	struct mgcp_rtp_codec *net_codec = &endp->net_end.codec;
-	struct mgcp_rtp_codec *bts_codec = &endp->bts_end.codec;
-
-	if (!state || net_codec->payload_type < 0) {
-		*payload_type = bts_codec->payload_type;
-		*audio_name = bts_codec->audio_name;
-		*fmtp_extra = endp->bts_end.fmtp_extra;
-		return;
-	}
-
-	*payload_type = net_codec->payload_type;
-	*audio_name = net_codec->audio_name;
-	*fmtp_extra = endp->net_end.fmtp_extra;
-}
-
-static int decode_audio(struct mgcp_process_rtp_state *state,
-			uint8_t **src, size_t *nbytes)
-{
-	while (*nbytes >= state->src_frame_size) {
-		if (state->sample_cnt + state->src_samples_per_frame > ARRAY_SIZE(state->samples)) {
-			LOGP(DLMGCP, LOGL_ERROR,
-			     "Sample buffer too small: %zu > %zu.\n",
-			     state->sample_cnt + state->src_samples_per_frame,
-			     ARRAY_SIZE(state->samples));
-			return -ENOSPC;
-		}
-		switch (state->src_fmt) {
-		case AF_GSM:
-			if (gsm_decode(state->src.gsm_handle,
-				       (gsm_byte *)*src, state->samples + state->sample_cnt) < 0) {
-				LOGP(DLMGCP, LOGL_ERROR,
-				     "Failed to decode GSM.\n");
-				return -EINVAL;
-			}
-			break;
-#ifdef HAVE_BCG729
-		case AF_G729:
-			bcg729Decoder(state->src.g729_dec, *src, 0, state->samples + state->sample_cnt);
-			break;
-#endif
-		case AF_PCMU:
-			ulaw_decode(*src, state->samples + state->sample_cnt,
-				    state->src_samples_per_frame);
-			break;
-		case AF_PCMA:
-			alaw_decode(*src, state->samples + state->sample_cnt,
-				    state->src_samples_per_frame);
-			break;
-		case AF_S16:
-			memmove(state->samples + state->sample_cnt, *src,
-				state->src_frame_size);
-			break;
-		case AF_L16:
-			l16_decode(*src, state->samples + state->sample_cnt,
-				   state->src_samples_per_frame);
-			break;
-		default:
-			break;
-		}
-		*src        += state->src_frame_size;
-		*nbytes     -= state->src_frame_size;
-		state->sample_cnt += state->src_samples_per_frame;
-	}
-	return 0;
-}
-
-static int encode_audio(struct mgcp_process_rtp_state *state,
-			uint8_t *dst, size_t buf_size, size_t max_samples)
-{
-	int nbytes = 0;
-	size_t nsamples = 0;
-	/* Encode samples into dst */
-	while (nsamples + state->dst_samples_per_frame <= max_samples) {
-		if (nbytes + state->dst_frame_size > buf_size) {
-			if (nbytes > 0)
-				break;
-
-			/* Not even one frame fits into the buffer */
-			LOGP(DLMGCP, LOGL_INFO,
-			     "Encoding (RTP) buffer too small: %zu > %zu.\n",
-			     nbytes + state->dst_frame_size, buf_size);
-			return -ENOSPC;
-		}
-		switch (state->dst_fmt) {
-		case AF_GSM:
-			gsm_encode(state->dst.gsm_handle,
-				   state->samples + state->sample_offs, dst);
-			break;
-#ifdef HAVE_BCG729
-		case AF_G729:
-			bcg729Encoder(state->dst.g729_enc,
-				      state->samples + state->sample_offs, dst);
-			break;
-#endif
-		case AF_PCMU:
-			ulaw_encode(state->samples + state->sample_offs, dst,
-				    state->src_samples_per_frame);
-			break;
-		case AF_PCMA:
-			alaw_encode(state->samples + state->sample_offs, dst,
-				    state->src_samples_per_frame);
-			break;
-		case AF_S16:
-			memmove(dst, state->samples + state->sample_offs,
-				state->dst_frame_size);
-			break;
-		case AF_L16:
-			l16_encode(state->samples + state->sample_offs, dst,
-				   state->src_samples_per_frame);
-			break;
-		default:
-			break;
-		}
-		dst        += state->dst_frame_size;
-		nbytes     += state->dst_frame_size;
-		state->sample_offs += state->dst_samples_per_frame;
-		nsamples   += state->dst_samples_per_frame;
-	}
-	state->sample_cnt -= nsamples;
-	return nbytes;
-}
-
-static struct mgcp_rtp_end *source_for_dest(struct mgcp_endpoint *endp,
-					struct mgcp_rtp_end *dst_end)
-{
-	if (&endp->bts_end == dst_end)
-		return &endp->net_end;
-	else if (&endp->net_end == dst_end)
-		return &endp->bts_end;
-	OSMO_ASSERT(0);
-}
-
-/*
- * With some modems we get offered multiple codecs
- * and we have selected one of them. It might not
- * be the right one and we need to detect this with
- * the first audio packets. One difficulty is that
- * we patch the rtp payload type in place, so we
- * need to discuss this.
- */
-struct mgcp_process_rtp_state *check_transcode_state(
-				struct mgcp_endpoint *endp,
-				struct mgcp_rtp_end *dst_end,
-				struct rtp_hdr *rtp_hdr)
-{
-	struct mgcp_rtp_end *src_end;
-
-	/* Only deal with messages from net to bts */
-	if (&endp->bts_end != dst_end)
-		goto done;
-
-	src_end = source_for_dest(endp, dst_end);
-
-	/* Already patched */
-	if (rtp_hdr->payload_type == dst_end->codec.payload_type)
-		goto done;
-	/* The payload we expect */
-	if (rtp_hdr->payload_type == src_end->codec.payload_type)
-		goto done;
-	/* The matching alternate payload type? Then switch */
-	if (rtp_hdr->payload_type == src_end->alt_codec.payload_type) {
-		struct mgcp_config *cfg = endp->cfg;
-		struct mgcp_rtp_codec tmp_codec = src_end->alt_codec;
-		src_end->alt_codec = src_end->codec;
-		src_end->codec = tmp_codec;
-		cfg->setup_rtp_processing_cb(endp, &endp->net_end, &endp->bts_end);
-		cfg->setup_rtp_processing_cb(endp, &endp->bts_end, &endp->net_end);
-	}
-
-done:
-	return dst_end->rtp_process_data;
-}
-
-int mgcp_transcoding_process_rtp(struct mgcp_endpoint *endp,
-				struct mgcp_rtp_end *dst_end,
-			     char *data, int *len, int buf_size)
-{
-	struct mgcp_process_rtp_state *state;
-	const size_t rtp_hdr_size = sizeof(struct rtp_hdr);
-	struct rtp_hdr *rtp_hdr = (struct rtp_hdr *) data;
-	char *payload_data = (char *) &rtp_hdr->data[0];
-	int payload_len = *len - rtp_hdr_size;
-	uint8_t *src = (uint8_t *)payload_data;
-	uint8_t *dst = (uint8_t *)payload_data;
-	size_t nbytes = payload_len;
-	size_t nsamples;
-	size_t max_samples;
-	uint32_t ts_no;
-	int rc;
-
-	state = check_transcode_state(endp, dst_end, rtp_hdr);
-	if (!state)
-		return 0;
-
-	if (state->src_fmt == state->dst_fmt) {
-		if (!state->dst_packet_duration)
-			return 0;
-
-		/* TODO: repackage without transcoding */
-	}
-
-	/* If the remaining samples do not fit into a fixed ptime,
-	 * a) discard them, if the next packet is much later
-	 * b) add silence and * send it, if the current packet is not
-	 *    yet too late
-	 * c) append the sample data, if the timestamp matches exactly
-	 */
-
-	/* TODO: check payload type (-> G.711 comfort noise) */
-
-	if (payload_len > 0) {
-		ts_no = ntohl(rtp_hdr->timestamp);
-		if (!state->is_running) {
-			state->next_seq = ntohs(rtp_hdr->sequence);
-			state->next_time = ts_no;
-			state->is_running = 1;
-		}
-
-
-		if (state->sample_cnt > 0) {
-			int32_t delta = ts_no - state->next_time;
-			/* TODO: check sequence? reordering? packet loss? */
-
-			if (delta > state->sample_cnt) {
-				/* There is a time gap between the last packet
-				 * and the current one. Just discard the
-				 * partial data that is left in the buffer.
-				 * TODO: This can be improved by adding silence
-				 * instead if the delta is small enough.
-				 */
-				LOGP(DLMGCP, LOGL_NOTICE,
-					"0x%x dropping sample buffer due delta=%d sample_cnt=%zu\n",
-					ENDPOINT_NUMBER(endp), delta, state->sample_cnt);
-				state->sample_cnt = 0;
-				state->next_time = ts_no;
-			} else if (delta < 0) {
-				LOGP(DLMGCP, LOGL_NOTICE,
-				     "RTP time jumps backwards, delta = %d, "
-				     "discarding buffered samples\n",
-				     delta);
-				state->sample_cnt = 0;
-				state->sample_offs = 0;
-				return -EAGAIN;
-			}
-
-			/* Make sure the samples start without offset */
-			if (state->sample_offs && state->sample_cnt)
-				memmove(&state->samples[0],
-					&state->samples[state->sample_offs],
-					state->sample_cnt *
-					sizeof(state->samples[0]));
-		}
-
-		state->sample_offs = 0;
-
-		/* Append decoded audio to samples */
-		decode_audio(state, &src, &nbytes);
-
-		if (nbytes > 0)
-			LOGP(DLMGCP, LOGL_NOTICE,
-			     "Skipped audio frame in RTP packet: %zu octets\n",
-			     nbytes);
-	} else
-		ts_no = state->next_time;
-
-	if (state->sample_cnt < state->dst_packet_duration)
-		return -EAGAIN;
-
-	max_samples =
-		state->dst_packet_duration ?
-		state->dst_packet_duration : state->sample_cnt;
-
-	nsamples = state->sample_cnt;
-
-	rc = encode_audio(state, dst, buf_size, max_samples);
-	/*
-	 * There were no samples to encode?
-	 * TODO: how does this work for comfort noise?
-	 */
-	if (rc == 0)
-		return -ENOMSG;
-	/* Any other error during the encoding */
-	if (rc < 0)
-		return rc;
-
-	nsamples -= state->sample_cnt;
-
-	*len = rtp_hdr_size + rc;
-	rtp_hdr->sequence = htons(state->next_seq);
-	rtp_hdr->timestamp = htonl(ts_no);
-
-	state->next_seq += 1;
-	state->next_time = ts_no + nsamples;
-
-	/*
-	 * XXX: At this point we should always have consumed
-	 * samples. So doing OSMO_ASSERT(nsamples > 0) and returning
-	 * rtp_hdr_size should be fine.
-	 */
-	return nsamples ? rtp_hdr_size : 0;
-}
diff --git a/src/libosmo-legacy-mgcp/mgcp_vty.c b/src/libosmo-legacy-mgcp/mgcp_vty.c
deleted file mode 100644
index 420333d..0000000
--- a/src/libosmo-legacy-mgcp/mgcp_vty.c
+++ /dev/null
@@ -1,1627 +0,0 @@
-/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
-/* The protocol implementation */
-
-/*
- * (C) 2009-2014 by Holger Hans Peter Freyther <zecke@selfish.org>
- * (C) 2009-2011 by On-Waves
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-
-#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 <string.h>
-#include <inttypes.h>
-
-#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
-#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
-#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
-
-static struct mgcp_config *g_cfg = NULL;
-
-static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
-{
-	struct mgcp_trunk_config *trunk;
-
-	if (nr == 0)
-		trunk = &cfg->trunk;
-	else
-		trunk = mgcp_trunk_num(cfg, nr);
-
-	return trunk;
-}
-
-/*
- * vty code for mgcp below
- */
-struct cmd_node mgcp_node = {
-	MGCP_NODE,
-	"%s(config-mgcp)# ",
-	1,
-};
-
-struct cmd_node trunk_node = {
-	TRUNK_NODE,
-	"%s(config-mgcp-trunk)# ",
-	1,
-};
-
-static int config_write_mgcp(struct vty *vty)
-{
-	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);
-
-	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 ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
-	if (g_cfg->trunk.keepalive_interval == MGCP_KEEPALIVE_ONCE)
-		vty_out(vty, "  rtp keep-alive once%s", VTY_NEWLINE);
-	else if (g_cfg->trunk.keepalive_interval)
-		vty_out(vty, "  rtp keep-alive %d%s",
-			g_cfg->trunk.keepalive_interval, VTY_NEWLINE);
-	else
-		vty_out(vty, "  no rtp keep-alive%s", VTY_NEWLINE);
-
-	if (g_cfg->trunk.omit_rtcp)
-		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) {
-		vty_out(vty, "  %srtp-patch ssrc%s",
-			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);
-	} else
-		vty_out(vty, "  no rtp-patch%s", VTY_NEWLINE);
-	if (g_cfg->trunk.audio_payload != -1)
-		vty_out(vty, "  sdp audio-payload number %d%s",
-			g_cfg->trunk.audio_payload, VTY_NEWLINE);
-	if (g_cfg->trunk.audio_name)
-		vty_out(vty, "  sdp audio-payload name %s%s",
-			g_cfg->trunk.audio_name, VTY_NEWLINE);
-	if (g_cfg->trunk.audio_fmtp_extra)
-		vty_out(vty, "  sdp audio fmtp-extra %s%s",
-			g_cfg->trunk.audio_fmtp_extra, VTY_NEWLINE);
-	vty_out(vty, "  %ssdp audio-payload send-ptime%s",
-		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, "  %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);
-
-	switch (g_cfg->osmux) {
-	case OSMUX_USAGE_ON:
-		vty_out(vty, "  osmux on%s", VTY_NEWLINE);
-		break;
-	case OSMUX_USAGE_ONLY:
-		vty_out(vty, "  osmux only%s", VTY_NEWLINE);
-		break;
-	case OSMUX_USAGE_OFF:
-	default:
-		vty_out(vty, "  osmux off%s", VTY_NEWLINE);
-		break;
-	}
-	if (g_cfg->osmux) {
-		vty_out(vty, "  osmux bind-ip %s%s",
-			g_cfg->osmux_addr, VTY_NEWLINE);
-		vty_out(vty, "  osmux batch-factor %d%s",
-			g_cfg->osmux_batch, VTY_NEWLINE);
-		vty_out(vty, "  osmux batch-size %u%s",
-			g_cfg->osmux_batch_size, VTY_NEWLINE);
-		vty_out(vty, "  osmux port %u%s",
-			g_cfg->osmux_port, VTY_NEWLINE);
-		vty_out(vty, "  osmux dummy %s%s",
-			g_cfg->osmux_dummy ? "on" : "off", VTY_NEWLINE);
-	}
-	if (g_cfg->bts_use_jibuf)
-		vty_out(vty, "  bts-jitter-buffer%s", VTY_NEWLINE);
-	if (g_cfg->bts_jitter_delay_min)
-		vty_out(vty, "  bts-jitter-buffer-delay-min %"PRIu32"%s", g_cfg->bts_jitter_delay_min, VTY_NEWLINE);
-	if (g_cfg->bts_jitter_delay_max)
-		vty_out(vty, "  bts-jitter-buffer-delay-max %"PRIu32"%s", g_cfg->bts_jitter_delay_max, VTY_NEWLINE);
-
-	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)
-{
-	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"
-		"   Frame Duration: %u Frame Denominator: %u%s"
-		"   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);
-}
-
-static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
-{
-	int i;
-
-	vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
-		cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
-		cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
-
-	if (!cfg->endpoints) {
-		vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
-		return;
-	}
-
-	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);
-		}
-	}
-}
-
-DEFUN(show_mcgp, show_mgcp_cmd,
-      "show mgcp [stats]",
-      SHOW_STR
-      "Display information about the MGCP Media Gateway\n"
-      "Include Statistics\n")
-{
-	struct mgcp_trunk_config *trunk;
-	int show_stats = argc >= 1;
-
-	dump_trunk(vty, &g_cfg->trunk, show_stats);
-
-	llist_for_each_entry(trunk, &g_cfg->trunks, entry)
-		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, "Jitter Buffer by default on Uplink : %s%s",
-		g_cfg->bts_use_jibuf ? "on" : "off", VTY_NEWLINE);
-	if (g_cfg->bts_use_jibuf)
-		vty_out(vty, "Jitter Buffer delays: min=%"PRIu32" max=%"PRIu32"%s",
-		g_cfg->bts_jitter_delay_min, g_cfg->bts_jitter_delay_max, VTY_NEWLINE);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp,
-      cfg_mgcp_cmd,
-      "mgcp",
-      "Configure the MGCP")
-{
-	vty->node = MGCP_NODE;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_local_ip,
-      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")
-{
-	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")
-{
-	osmo_talloc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	unsigned int port = atoi(argv[0]);
-	g_cfg->source_port = port;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_bind_early,
-      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")
-{
-	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;
-}
-
-
-#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 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,
-      "rtp net-range <0-65534> <0-65534>",
-      RTP_STR "Range of ports to use for the NET side\n"
-      RANGE_START_STR RANGE_END_STR)
-{
-	parse_range(&g_cfg->net_ports, argv);
-	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",
-      RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
-{
-	osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr, argv[0]);
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	talloc_free(g_cfg->net_ports.bind_addr);
-	g_cfg->net_ports.bind_addr = NULL;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_rtp_ip_dscp,
-      cfg_mgcp_rtp_ip_dscp_cmd,
-      "rtp ip-dscp <0-255>",
-      RTP_STR
-      "Apply IP_TOS to the audio stream (including Osmux)\n" "The DSCP value\n")
-{
-	int dscp = atoi(argv[0]);
-	g_cfg->endp_dscp = dscp;
-	return CMD_SUCCESS;
-}
-
-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,
-      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")
-{
-	g_cfg->bts_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)
-{
-	g_cfg->bts_force_ptime = 0;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_sdp_fmtp_extra,
-      cfg_mgcp_sdp_fmtp_extra_cmd,
-      "sdp audio fmtp-extra .NAME",
-      "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
-      "Extra Information\n")
-{
-	char *txt = argv_concat(argv, argc, 0);
-	if (!txt)
-		return CMD_WARNING;
-
-	osmo_talloc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
-	talloc_free(txt);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_allow_transcoding,
-      cfg_mgcp_allow_transcoding_cmd,
-      "allow-transcoding",
-      "Allow transcoding\n")
-{
-	g_cfg->trunk.no_audio_transcoding = 0;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_no_allow_transcoding,
-      cfg_mgcp_no_allow_transcoding_cmd,
-      "no allow-transcoding",
-      NO_STR "Allow transcoding\n")
-{
-	g_cfg->trunk.no_audio_transcoding = 1;
-	return CMD_SUCCESS;
-}
-
-#define SDP_STR "SDP File related options\n"
-#define AUDIO_STR "Audio payload options\n"
-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")
-{
-	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")
-      
-
-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")
-{
-	osmo_talloc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
-	return CMD_SUCCESS;
-}
-
-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")
-
-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")
-{
-	g_cfg->trunk.audio_send_ptime = 1;
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	g_cfg->trunk.audio_send_ptime = 0;
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	g_cfg->trunk.audio_send_name = 1;
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	g_cfg->trunk.audio_send_name = 0;
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	if (g_cfg->osmux) {
-		vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-	g_cfg->trunk.audio_loop = atoi(argv[0]);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_force_realloc,
-      cfg_mgcp_force_realloc_cmd,
-      "force-realloc (0|1)",
-      "Force endpoint reallocation when the endpoint is still seized\n"
-      "Don't force reallocation\n" "force reallocation\n")
-{
-	g_cfg->trunk.force_realloc = atoi(argv[0]);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_number_endp,
-      cfg_mgcp_number_endp_cmd,
-      "number endpoints <0-65534>",
-      "Number options\n" "Endpoints available\n" "Number endpoints\n")
-{
-	/* + 1 as we start counting at one */
-	g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
-	return CMD_SUCCESS;
-}
-
-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)
-{
-	g_cfg->trunk.omit_rtcp = 0;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_patch_rtp_ssrc,
-      cfg_mgcp_patch_rtp_ssrc_cmd,
-      "rtp-patch ssrc",
-      RTP_PATCH_STR
-      "Force a fixed SSRC\n"
-      )
-{
-	g_cfg->trunk.force_constant_ssrc = 1;
-	return CMD_SUCCESS;
-}
-
-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"
-      )
-{
-	g_cfg->trunk.force_constant_ssrc = 0;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_patch_rtp_ts,
-      cfg_mgcp_patch_rtp_ts_cmd,
-      "rtp-patch timestamp",
-      RTP_PATCH_STR
-      "Adjust RTP timestamp\n"
-      )
-{
-	g_cfg->trunk.force_aligned_timing = 1;
-	return CMD_SUCCESS;
-}
-
-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"
-      )
-{
-	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)
-{
-	g_cfg->trunk.force_constant_ssrc = 0;
-	g_cfg->trunk.force_aligned_timing = 0;
-	return CMD_SUCCESS;
-}
-
-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"
-      )
-{
-	mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
-	return CMD_SUCCESS;
-}
-
-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"
-      )
-{
-	mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_no_rtp_keepalive,
-      cfg_mgcp_no_rtp_keepalive_cmd,
-      "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")
-{
-	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")
-      
-
-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")
-{
-	struct mgcp_trunk_config *trunk;
-	int index = atoi(argv[0]);
-
-	trunk = mgcp_trunk_num(g_cfg, index);
-	if (!trunk)
-		trunk = mgcp_trunk_alloc(g_cfg, index);
-
-	if (!trunk) {
-		vty_out(vty, "%%Unable to allocate trunk %u.%s",
-			index, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	vty->node = TRUNK_NODE;
-	vty->index = trunk;
-	return CMD_SUCCESS;
-}
-
-static int config_write_trunk(struct vty *vty)
-{
-	struct mgcp_trunk_config *trunk;
-
-	llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
-		vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
-		vty_out(vty, "  sdp audio-payload number %d%s",
-			trunk->audio_payload, VTY_NEWLINE);
-		vty_out(vty, "  sdp audio-payload name %s%s",
-			trunk->audio_name, VTY_NEWLINE);
-		vty_out(vty, "  %ssdp audio-payload send-ptime%s",
-			trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
-		vty_out(vty, "  %ssdp audio-payload send-name%s",
-			trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
-
-		if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
-			vty_out(vty, "  rtp keep-alive once%s", VTY_NEWLINE);
-		else if (trunk->keepalive_interval)
-			vty_out(vty, "  rtp keep-alive %d%s",
-				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, "  force-realloc %d%s",
-			trunk->force_realloc, 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);
-			vty_out(vty, "  %srtp-patch timestamp%s",
-				trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
-		} else
-			vty_out(vty, "  no rtp-patch%s", VTY_NEWLINE);
-		if (trunk->audio_fmtp_extra)
-			vty_out(vty, "   sdp audio fmtp-extra %s%s",
-				trunk->audio_fmtp_extra, VTY_NEWLINE);
-		vty_out(vty, "  %sallow-transcoding%s",
-			trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
-	}
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_trunk_sdp_fmtp_extra,
-      cfg_trunk_sdp_fmtp_extra_cmd,
-      "sdp audio fmtp-extra .NAME",
-      "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
-      "Extra Information\n")
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	char *txt = argv_concat(argv, argc, 0);
-	if (!txt)
-		return CMD_WARNING;
-
-	osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
-	talloc_free(txt);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_trunk_payload_number,
-      cfg_trunk_payload_number_cmd,
-      "sdp audio-payload number <0-255>",
-      SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	unsigned int payload = atoi(argv[0]);
-
-	trunk->audio_payload = payload;
-	return CMD_SUCCESS;
-}
-
-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")
-
-DEFUN(cfg_trunk_payload_name,
-      cfg_trunk_payload_name_cmd,
-      "sdp audio-payload name NAME",
-       SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-
-	osmo_talloc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
-	return CMD_SUCCESS;
-}
-
-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")
-
-
-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")
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-
-	if (g_cfg->osmux) {
-		vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-	trunk->audio_loop = atoi(argv[0]);
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	trunk->audio_send_ptime = 1;
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	trunk->audio_send_ptime = 0;
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	trunk->audio_send_name = 1;
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	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)
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	trunk->omit_rtcp = 1;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_trunk_no_omit_rtcp,
-      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;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_trunk_patch_rtp_ssrc,
-      cfg_trunk_patch_rtp_ssrc_cmd,
-      "rtp-patch ssrc",
-      RTP_PATCH_STR
-      "Force a fixed SSRC\n"
-      )
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	trunk->force_constant_ssrc = 1;
-	return CMD_SUCCESS;
-}
-
-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"
-      )
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	trunk->force_constant_ssrc = 0;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_trunk_patch_rtp_ts,
-      cfg_trunk_patch_rtp_ts_cmd,
-      "rtp-patch timestamp",
-      RTP_PATCH_STR
-      "Adjust RTP timestamp\n"
-      )
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	trunk->force_aligned_timing = 1;
-	return CMD_SUCCESS;
-}
-
-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"
-      )
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	trunk->force_aligned_timing = 0;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_trunk_no_patch_rtp,
-      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;
-	trunk->force_aligned_timing = 0;
-	return CMD_SUCCESS;
-}
-
-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"
-      )
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
-	return CMD_SUCCESS;
-}
-
-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"
-      )
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_trunk_no_rtp_keepalive,
-      cfg_trunk_no_rtp_keepalive_cmd,
-      "no rtp keep-alive",
-      NO_STR RTP_STR RTP_KEEPALIVE_STR
-      )
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	mgcp_trunk_set_keepalive(trunk, 0);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_trunk_allow_transcoding,
-      cfg_trunk_allow_transcoding_cmd,
-      "allow-transcoding",
-      "Allow transcoding\n")
-{
-	struct mgcp_trunk_config *trunk = vty->index;
-	trunk->no_audio_transcoding = 0;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_trunk_no_allow_transcoding,
-      cfg_trunk_no_allow_transcoding_cmd,
-      "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,
-      "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")
-{
-	struct mgcp_trunk_config *trunk;
-	struct mgcp_endpoint *endp;
-
-	trunk = find_trunk(g_cfg, atoi(argv[0]));
-	if (!trunk) {
-		vty_out(vty, "%%Trunk %d not found in the config.%s",
-			atoi(argv[0]), VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (!trunk->endpoints) {
-		vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
-			trunk->trunk_nr, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	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);
-		return CMD_WARNING;
-	}
-
-
-	endp = &trunk->endpoints[endp_no];
-	int loop = atoi(argv[2]);
-
-	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);
-
-	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>",
-      "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"
-      "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;
-
-	trunk = find_trunk(g_cfg, atoi(argv[0]));
-	if (!trunk) {
-		vty_out(vty, "%%Trunk %d not found in the config.%s",
-			atoi(argv[0]), VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (!trunk->endpoints) {
-		vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
-			trunk->trunk_nr, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	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);
-		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 {
-		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]));
-	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")
-{
-	struct mgcp_trunk_config *trunk;
-	struct mgcp_endpoint *endp;
-
-	trunk = find_trunk(g_cfg, atoi(argv[0]));
-	if (!trunk) {
-		vty_out(vty, "%%Trunk %d not found in the config.%s",
-			atoi(argv[0]), VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (!trunk->endpoints) {
-		vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
-			trunk->trunk_nr, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	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);
-		return CMD_WARNING;
-	}
-
-	endp = &trunk->endpoints[endp_no];
-	mgcp_release_endp(endp);
-	return CMD_SUCCESS;
-}
-
-DEFUN(reset_endp, reset_endp_cmd,
-      "reset-endpoint <0-64> NUMBER",
-      "Reset the given endpoint\n" "Trunk number\n"
-      "Endpoint number in hex.\n")
-{
-	struct mgcp_trunk_config *trunk;
-	struct mgcp_endpoint *endp;
-	int endp_no, rc;
-
-	trunk = find_trunk(g_cfg, atoi(argv[0]));
-	if (!trunk) {
-		vty_out(vty, "%%Trunk %d not found in the config.%s",
-			atoi(argv[0]), VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (!trunk->endpoints) {
-		vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
-			trunk->trunk_nr, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	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);
-		return CMD_WARNING;
-	}
-
-	endp = &trunk->endpoints[endp_no];
-	rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
-	if (rc < 0) {
-		vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-	return CMD_SUCCESS;
-}
-
-DEFUN(reset_all_endp, reset_all_endp_cmd,
-      "reset-all-endpoints",
-      "Reset all endpoints\n")
-{
-	int rc;
-
-	rc = mgcp_send_reset_all(g_cfg);
-	if (rc < 0) {
-		vty_out(vty, "Error %d during endpoint reset.%s",
-			rc, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-	return CMD_SUCCESS;
-}
-
-#define OSMUX_STR "RTP multiplexing\n"
-DEFUN(cfg_mgcp_osmux,
-      cfg_mgcp_osmux_cmd,
-      "osmux (on|off|only)",
-       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;
-	}
-
-	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);
-		return CMD_WARNING;
-	}
-
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	osmo_talloc_replace_string(g_cfg, &g_cfg->osmux_addr, argv[0]);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_osmux_batch_factor,
-      cfg_mgcp_osmux_batch_factor_cmd,
-      "osmux batch-factor <1-8>",
-      OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
-{
-	g_cfg->osmux_batch = atoi(argv[0]);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_osmux_batch_size,
-      cfg_mgcp_osmux_batch_size_cmd,
-      "osmux batch-size <1-65535>",
-      OSMUX_STR "batch size\n" "Batch size in bytes\n")
-{
-	g_cfg->osmux_batch_size = atoi(argv[0]);
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_osmux_port,
-      cfg_mgcp_osmux_port_cmd,
-      "osmux port <1-65535>",
-      OSMUX_STR "port\n" "UDP port\n")
-{
-	g_cfg->osmux_port = atoi(argv[0]);
-	return CMD_SUCCESS;
-}
-
-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")
-{
-	if (strcmp(argv[0], "on") == 0)
-		g_cfg->osmux_dummy = 1;
-	else if (strcmp(argv[0], "off") == 0)
-		g_cfg->osmux_dummy = 0;
-
-	return CMD_SUCCESS;
-}
-
-#define DEJITTER_STR "Uplink Jitter Buffer"
-DEFUN(cfg_mgcp_bts_use_jibuf,
-      cfg_mgcp_bts_use_jibuf_cmd,
-      "bts-jitter-buffer",
-      DEJITTER_STR "\n")
-{
-	g_cfg->bts_use_jibuf = true;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_no_bts_use_jibuf,
-      cfg_mgcp_no_bts_use_jibuf_cmd,
-      "no bts-jitter-buffer",
-      NO_STR DEJITTER_STR "\n")
-{
-	g_cfg->bts_use_jibuf = false;
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_bts_jitter_delay_min,
-      cfg_mgcp_bts_jitter_delay_min_cmd,
-      "bts-jitter-buffer-delay-min <1-65535>",
-      DEJITTER_STR " Minimum Delay in ms\n" "Minimum Delay in ms\n")
-{
-	g_cfg->bts_jitter_delay_min = atoi(argv[0]);
-	if (!g_cfg->bts_jitter_delay_min) {
-		vty_out(vty, "bts-jitter-buffer-delay-min cannot be zero.%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-	if (g_cfg->bts_jitter_delay_min && g_cfg->bts_jitter_delay_max &&
-	    g_cfg->bts_jitter_delay_min > g_cfg->bts_jitter_delay_max) {
-		vty_out(vty, "bts-jitter-buffer-delay-min cannot be bigger than " \
-			"bts-jitter-buffer-delay-max.%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_mgcp_bts_jitter_delay_max,
-      cfg_mgcp_bts_jitter_delay_max_cmd,
-      "bts-jitter-buffer-delay-max <1-65535>",
-      DEJITTER_STR " Maximum Delay in ms\n" "Maximum Delay in ms\n")
-{
-	g_cfg->bts_jitter_delay_max = atoi(argv[0]);
-	if (!g_cfg->bts_jitter_delay_max) {
-		vty_out(vty, "bts-jitter-buffer-delay-max cannot be zero.%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-	if (g_cfg->bts_jitter_delay_min && g_cfg->bts_jitter_delay_max &&
-	    g_cfg->bts_jitter_delay_min > g_cfg->bts_jitter_delay_max) {
-		vty_out(vty, "bts-jitter-buffer-delay-max cannot be smaller than " \
-			"bts-jitter-buffer-delay-min.%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-	return CMD_SUCCESS;
-}
-
-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, &free_endp_cmd);
-	install_element(ENABLE_NODE, &reset_endp_cmd);
-	install_element(ENABLE_NODE, &reset_all_endp_cmd);
-
-	install_element(CONFIG_NODE, &cfg_mgcp_cmd);
-	install_node(&mgcp_node, config_write_mgcp);
-
-	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);
-	install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
-	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_number_endp_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_osmux_ip_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
-	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_bts_use_jibuf_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_no_bts_use_jibuf_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_bts_jitter_delay_min_cmd);
-	install_element(MGCP_NODE, &cfg_mgcp_bts_jitter_delay_max_cmd);
-
-
-	install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
-	install_node(&trunk_node, config_write_trunk);
-	install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
-	install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
-	install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
-	install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
-
-	return 0;
-}
-
-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",
-		     trunk->number_endpoints, trunk->trunk_nr);
-		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;
-}
-
-int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
-		      enum mgcp_role role)
-{
-	int rc;
-	struct mgcp_trunk_config *trunk;
-
-	cfg->osmux_port = OSMUX_PORT;
-	cfg->osmux_batch = 4;
-	cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
-
-	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);
-		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");
-		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);
-			return -1;
-		}
-	}
-	cfg->role = role;
-
-	return 0;
-}
-
diff --git a/src/osmo-bsc_mgcp/Makefile.am b/src/osmo-bsc_mgcp/Makefile.am
deleted file mode 100644
index e8a6f46..0000000
--- a/src/osmo-bsc_mgcp/Makefile.am
+++ /dev/null
@@ -1,31 +0,0 @@
-AM_CPPFLAGS = \
-	$(all_includes) \
-	-I$(top_srcdir)/include \
-	-I$(top_builddir) \
-	$(NULL)
-
-AM_CFLAGS = \
-	-Wall \
-	$(LIBOSMOCORE_CFLAGS) \
-	$(LIBOSMOVTY_CFLAGS) \
-	$(LIBOSMONETIF_CFLAGS) \
-	$(LIBBCG729_CFLAGS) \
-	$(COVERAGE_CFLAGS) \
-	$(NULL)
-
-bin_PROGRAMS = \
-	osmo-bsc_mgcp \
-	$(NULL)
-
-osmo_bsc_mgcp_SOURCES = \
-	mgcp_main.c \
-	$(NULL)
-
-osmo_bsc_mgcp_LDADD = \
-	$(top_builddir)/src/libosmo-legacy-mgcp/libosmo-legacy-mgcp.la \
-	$(LIBOSMOCORE_LIBS) \
-	$(LIBOSMOVTY_LIBS) \
-	$(LIBOSMONETIF_LIBS) \
-	$(LIBBCG729_LIBS) \
-	$(LIBRARY_GSM) \
-	$(NULL)
diff --git a/src/osmo-bsc_mgcp/mgcp_main.c b/src/osmo-bsc_mgcp/mgcp_main.c
deleted file mode 100644
index edb19a6..0000000
--- a/src/osmo-bsc_mgcp/mgcp_main.c
+++ /dev/null
@@ -1,351 +0,0 @@
-/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
-/* The main method to drive it as a standalone process      */
-
-/*
- * (C) 2009-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
- * (C) 2009-2011 by On-Waves
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <limits.h>
-#include <unistd.h>
-#include <errno.h>
-
-#include <sys/socket.h>
-
-#include <osmocom/legacy_mgcp/mgcp.h>
-#include <osmocom/legacy_mgcp/mgcp_internal.h>
-#include <osmocom/legacy_mgcp/vty.h>
-
-#include <osmocom/core/application.h>
-#include <osmocom/core/msgb.h>
-#include <osmocom/core/talloc.h>
-#include <osmocom/core/select.h>
-#include <osmocom/core/stats.h>
-#include <osmocom/core/rate_ctr.h>
-#include <osmocom/core/logging.h>
-
-#include <osmocom/vty/telnet_interface.h>
-#include <osmocom/vty/logging.h>
-#include <osmocom/vty/ports.h>
-#include <osmocom/vty/command.h>
-#include <osmocom/vty/stats.h>
-
-#include "../../bscconfig.h"
-
-#ifdef BUILD_MGCP_TRANSCODING
-#include <osmocom/legacy_mgcp/mgcp_transcode.h>
-#endif
-
-#define _GNU_SOURCE
-#include <getopt.h>
-
-#warning "Make use of the rtp proxy code"
-
-static struct mgcp_config *cfg;
-static struct mgcp_trunk_config *reset_trunk;
-static int reset_endpoints = 0;
-static int daemonize = 0;
-
-const char *openbsc_copyright =
-	"Copyright (C) 2009-2010 Holger Freyther and On-Waves\r\n"
-	"Contributions by Daniel Willmann, Jan Lübbe, Stefan Schmidt\r\n"
-	"Dieter Spaar, Andreas Eversberg, Harald Welte\r\n\r\n"
-	"License AGPLv3+: GNU AGPL version 3 or later <http://gnu.org/licenses/agpl-3.0.html>\r\n"
-	"This is free software: you are free to change and redistribute it.\r\n"
-	"There is NO WARRANTY, to the extent permitted by law.\r\n";
-
-static char *config_file = "mgcp.cfg";
-
-/* used by msgb and mgcp */
-void *tall_bsc_ctx = NULL;
-
-static void print_help()
-{
-	printf("Some useful help...\n");
-	printf(" -h --help is printing this text.\n");
-	printf(" -c --config-file filename The config file to use.\n");
-	printf(" -s --disable-color\n");
-	printf(" -D --daemonize Fork the process into a background daemon\n");
-	printf(" -V --version Print the version number\n");
-}
-
-static void handle_options(int argc, char **argv)
-{
-	while (1) {
-		int option_index = 0, c;
-		static struct option long_options[] = {
-			{"help", 0, 0, 'h'},
-			{"config-file", 1, 0, 'c'},
-			{"daemonize", 0, 0, 'D'},
-			{"version", 0, 0, 'V'},
-			{"disable-color", 0, 0, 's'},
-			{0, 0, 0, 0},
-		};
-
-		c = getopt_long(argc, argv, "hc:VD", long_options, &option_index);
-
-		if (c == -1)
-			break;
-
-		switch(c) {
-		case 'h':
-			print_help();
-			exit(0);
-			break;
-		case 'c':
-			config_file = talloc_strdup(tall_bsc_ctx, optarg);
-			break;
-		case 's':
-			log_set_use_color(osmo_stderr_target, 0);
-			break;
-		case 'V':
-			print_version(1);
-			exit(0);
-			break;
-		case 'D':
-			daemonize = 1;
-			break;
-		default:
-			/* ignore */
-			break;
-		};
-	}
-}
-
-/* simply remember this */
-static int mgcp_rsip_cb(struct mgcp_trunk_config *tcfg)
-{
-	reset_endpoints = 1;
-	reset_trunk = tcfg;
-
-	return 0;
-}
-
-static int read_call_agent(struct osmo_fd *fd, unsigned int what)
-{
-	struct sockaddr_in addr;
-	socklen_t slen = sizeof(addr);
-	struct msgb *msg;
-	struct msgb *resp;
-	int i;
-
-	msg = (struct msgb *) fd->data;
-
-	/* read one less so we can use it as a \0 */
-	int rc = recvfrom(cfg->gw_fd.bfd.fd, msg->data, msg->data_len - 1, 0,
-		(struct sockaddr *) &addr, &slen);
-	if (rc < 0) {
-		perror("Gateway failed to read");
-		return -1;
-	} else if (slen > sizeof(addr)) {
-		fprintf(stderr, "Gateway received message from outerspace: %zu %zu\n",
-			(size_t) slen, sizeof(addr));
-		return -1;
-	}
-
-	/* handle message now */
-	msg->l2h = msgb_put(msg, rc);
-	resp = mgcp_handle_message(cfg, msg);
-	msgb_reset(msg);
-
-	if (resp) {
-		sendto(cfg->gw_fd.bfd.fd, resp->l2h, msgb_l2len(resp), 0, (struct sockaddr *) &addr, sizeof(addr));
-		msgb_free(resp);
-	}
-
-	if (reset_endpoints) {
-		LOGP(DLMGCP, LOGL_NOTICE,
-		     "Asked to reset endpoints: %d/%d\n",
-		     reset_trunk->trunk_nr, reset_trunk->trunk_type);
-		reset_endpoints = 0;
-
-		/* is checking in_addr.s_addr == INADDR_LOOPBACK making it more secure? */
-		for (i = 1; i < reset_trunk->number_endpoints; ++i)
-			mgcp_release_endp(&reset_trunk->endpoints[i]);
-	}
-
-	return 0;
-}
-
-int mgcp_vty_is_config_node(struct vty *vty, int node)
-{
-	switch (node) {
-	case CONFIG_NODE:
-		return 0;
-
-	default:
-		return 1;
-	}
-}
-
-int mgcp_vty_go_parent(struct vty *vty)
-{
-	switch (vty->node) {
-	case TRUNK_NODE:
-		vty->node = MGCP_NODE;
-		vty->index = NULL;
-		break;
-	case MGCP_NODE:
-	default:
-		if (mgcp_vty_is_config_node(vty, vty->node))
-			vty->node = CONFIG_NODE;
-		else
-			vty->node = ENABLE_NODE;
-
-		vty->index = NULL;
-	}
-
-	return vty->node;
-}
-
-
-static struct vty_app_info vty_info = {
-	.name 		= "OpenBSC MGCP",
-	.version	= PACKAGE_VERSION,
-	.go_parent_cb	= mgcp_vty_go_parent,
-	.is_config_node	= mgcp_vty_is_config_node,
-};
-
-static const struct log_info_cat log_categories[] = {
-	/* DLMGCP is provided by the MGCP library */
-};
-
-const struct log_info log_info = {
-	.cat = log_categories,
-	.num_cat = ARRAY_SIZE(log_categories),
-};
-
-int main(int argc, char **argv)
-{
-	struct sockaddr_in addr;
-	int on = 1, rc;
-
-	tall_bsc_ctx = talloc_named_const(NULL, 1, "mgcp-callagent");
-	msgb_talloc_ctx_init(tall_bsc_ctx, 0);
-
-	osmo_init_ignore_signals();
-	osmo_init_logging2(tall_bsc_ctx, &log_info);
-
-	cfg = mgcp_config_alloc();
-	if (!cfg)
-		return -1;
-
-#ifdef BUILD_MGCP_TRANSCODING
-	cfg->setup_rtp_processing_cb = &mgcp_transcoding_setup;
-	cfg->rtp_processing_cb = &mgcp_transcoding_process_rtp;
-	cfg->get_net_downlink_format_cb = &mgcp_transcoding_net_downlink_format;
-#endif
-
-	cfg->trunk.force_realloc = 1;
-
-	vty_info.copyright = openbsc_copyright;
-	vty_init(&vty_info);
-	logging_vty_add_cmds(NULL);
-	osmo_stats_vty_add_cmds(&log_info);
-	mgcp_vty_init();
-
-	handle_options(argc, argv);
-
-	rate_ctr_init(tall_bsc_ctx);
-	osmo_stats_init(tall_bsc_ctx);
-
-	rc = mgcp_parse_config(config_file, cfg, MGCP_BSC);
-	if (rc < 0)
-		return rc;
-
-	/* start telnet after reading config for vty_get_bind_addr() */
-	rc = telnet_init_dynif(tall_bsc_ctx, NULL,
-			       vty_get_bind_addr(), OSMO_VTY_PORT_BSC_MGCP);
-	if (rc < 0)
-		return rc;
-
-	/* set some callbacks */
-	cfg->reset_cb = mgcp_rsip_cb;
-
-	/* we need to bind a socket */
-	if (rc == 0) {
-		cfg->gw_fd.bfd.when = BSC_FD_READ;
-		cfg->gw_fd.bfd.cb = read_call_agent;
-		cfg->gw_fd.bfd.fd = socket(AF_INET, SOCK_DGRAM, 0);
-		if (cfg->gw_fd.bfd.fd < 0) {
-			perror("Gateway failed to listen");
-			return -1;
-		}
-
-		setsockopt(cfg->gw_fd.bfd.fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
-
-		memset(&addr, 0, sizeof(addr));
-		addr.sin_family = AF_INET;
-		addr.sin_port = htons(cfg->source_port);
-		inet_aton(cfg->source_addr, &addr.sin_addr);
-
-		if (bind(cfg->gw_fd.bfd.fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
-			perror("Gateway failed to bind");
-			return -1;
-		}
-
-		cfg->gw_fd.bfd.data = msgb_alloc(4096, "mgcp-msg");
-		if (!cfg->gw_fd.bfd.data) {
-			fprintf(stderr, "Gateway memory error.\n");
-			return -1;
-		}
-
-		if (cfg->call_agent_addr) {
-			addr.sin_port = htons(2727);
-			inet_aton(cfg->call_agent_addr, &addr.sin_addr);
-			if (connect(cfg->gw_fd.bfd.fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
-				LOGP(DLMGCP, LOGL_ERROR, "Failed to connect to: '%s'. errno: %d\n",
-				     cfg->call_agent_addr, errno);
-				close(cfg->gw_fd.bfd.fd);
-				cfg->gw_fd.bfd.fd = -1;
-				return -1;
-			}
-		}
-
-		if (osmo_fd_register(&cfg->gw_fd.bfd) != 0) {
-			LOGP(DLMGCP, LOGL_FATAL, "Failed to register the fd\n");
-			return -1;
-		}
-
-		LOGP(DLMGCP, LOGL_NOTICE, "Configured for MGCP.\n");
-	}
-
-	/* initialisation */
-	srand(time(NULL));
-
-	if (daemonize) {
-		rc = osmo_daemonize();
-		if (rc < 0) {
-			perror("Error during daemonize");
-			exit(1);
-		}
-	}
-
-	/* main loop */
-	while (1) {
-		osmo_select_main(0);
-	}
-
-
-	return 0;
-}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2eed271..49a659f 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,5 +1,4 @@
 SUBDIRS = \
-	legacy_mgcp \
 	mgcp_client \
 	mgcp \
 	$(NULL)
@@ -26,7 +25,6 @@
 	testsuite.at \
 	$(srcdir)/package.m4 \
 	$(TESTSUITE) \
-	vty_test_runner.py \
 	$(NULL)
 
 TESTSUITE = $(srcdir)/testsuite
@@ -39,7 +37,6 @@
 python-tests: $(BUILT_SOURCES)
 	osmotestvty.py -p $(abs_top_srcdir) -w $(abs_top_builddir) -v
 	osmotestconfig.py -p $(abs_top_srcdir) -w $(abs_top_builddir) -v
-	$(PYTHON) $(srcdir)/vty_test_runner.py -w $(abs_top_builddir) -v
 else
 python-tests: $(BUILT_SOURCES)
 	echo "Not running python-based tests (determined at configure-time)"
diff --git a/tests/atlocal.in b/tests/atlocal.in
index 362bfa9..1d2ebee 100644
--- a/tests/atlocal.in
+++ b/tests/atlocal.in
@@ -1,7 +1,6 @@
 enable_nat_test='@osmo_ac_build_nat@'
 enable_smpp_test='@osmo_ac_build_smpp@'
 enable_bsc_test='@osmo_ac_build_bsc@'
-enable_mgcp_transcoding_test='@osmo_ac_mgcp_transcoding@'
 enable_sgsn_test='@found_libgtp_and_libcares@'
 enable_oap_test='@found_libgtp_and_libcares@'
 enable_gtphub_test='@found_libgtp_and_libcares@'
diff --git a/tests/legacy_mgcp/Makefile.am b/tests/legacy_mgcp/Makefile.am
deleted file mode 100644
index f043124..0000000
--- a/tests/legacy_mgcp/Makefile.am
+++ /dev/null
@@ -1,61 +0,0 @@
-AM_CPPFLAGS = \
-	$(all_includes) \
-	-I$(top_srcdir)/include \
-	-I$(top_srcdir) \
-	$(NULL)
-
-AM_CFLAGS = \
-	-Wall \
-	-ggdb3 \
-	$(LIBOSMOCORE_CFLAGS) \
-	$(LIBOSMONETIF_CFLAGS) \
-	$(LIBBCG729_CFLAGS) \
-	$(COVERAGE_CFLAGS) \
-	$(NULL)
-
-AM_LDFLAGS = \
-	$(COVERAGE_LDFLAGS) \
-	$(NULL)
-
-EXTRA_DIST = \
-	mgcp_test.ok \
-	mgcp_transcoding_test.ok \
-	$(NULL)
-
-noinst_PROGRAMS = \
-	mgcp_test \
-	$(NULL)
-if BUILD_MGCP_TRANSCODING
-noinst_PROGRAMS += \
-	mgcp_transcoding_test \
-	$(NULL)
-endif
-
-mgcp_test_SOURCES = \
-	mgcp_test.c \
-	$(NULL)
-
-mgcp_test_LDADD = \
-	$(top_builddir)/src/libosmo-legacy-mgcp/libosmo-legacy-mgcp.la \
-	$(LIBOSMOCORE_LIBS) \
-	$(LIBOSMOVTY_LIBS) \
-	$(LIBRARY_DL) \
-	$(LIBOSMONETIF_LIBS) \
-	$(LIBRARY_GSM) \
-	-lm  \
-	$(NULL)
-
-mgcp_transcoding_test_SOURCES = \
-	mgcp_transcoding_test.c \
-	$(NULL)
-
-mgcp_transcoding_test_LDADD = \
-	$(top_builddir)/src/libosmo-legacy-mgcp/libosmo-legacy-mgcp.la \
-	$(LIBOSMOCORE_LIBS) \
-	$(LIBOSMOVTY_LIBS) \
-	$(LIBBCG729_LIBS) \
-	$(LIBRARY_DL) \
-	$(LIBOSMONETIF_LIBS) \
-	$(LIBRARY_GSM) \
-	-lm \
-	$(NULL)
diff --git a/tests/legacy_mgcp/mgcp_test.c b/tests/legacy_mgcp/mgcp_test.c
deleted file mode 100644
index 39400d4..0000000
--- a/tests/legacy_mgcp/mgcp_test.c
+++ /dev/null
@@ -1,1242 +0,0 @@
-/*
- * (C) 2011-2012,2014 by Holger Hans Peter Freyther <zecke@selfish.org>
- * (C) 2011-2012,2014 by On-Waves
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-#undef _GNU_SOURCE
-#define _GNU_SOURCE
-
-#include <osmocom/legacy_mgcp/mgcp.h>
-#include <osmocom/legacy_mgcp/vty.h>
-#include <osmocom/legacy_mgcp/mgcp_internal.h>
-
-#include <osmocom/core/application.h>
-#include <osmocom/core/talloc.h>
-#include <osmocom/core/utils.h>
-#include <string.h>
-#include <limits.h>
-#include <dlfcn.h>
-#include <time.h>
-#include <math.h>
-
-char *strline_r(char *str, char **saveptr);
-
-const char *strline_test_data =
-    "one CR\r"
-    "two CR\r"
-    "\r"
-    "one CRLF\r\n"
-    "two CRLF\r\n"
-    "\r\n"
-    "one LF\n"
-    "two LF\n"
-    "\n"
-    "mixed (4 lines)\r\r\n\n\r\n";
-
-#define EXPECTED_NUMBER_OF_LINES 13
-
-static void test_strline(void)
-{
-	char *save = NULL;
-	char *line;
-	char buf[2048];
-	int counter = 0;
-
-	osmo_strlcpy(buf, strline_test_data, sizeof(buf));
-
-	for (line = strline_r(buf, &save); line;
-	     line = strline_r(NULL, &save)) {
-		printf("line: '%s'\n", line);
-		counter++;
-	}
-
-	OSMO_ASSERT(counter == EXPECTED_NUMBER_OF_LINES);
-}
-
-#define AUEP1	"AUEP 158663169 ds/e1-1/2@172.16.6.66 MGCP 1.0\r\n"
-#define AUEP1_RET "200 158663169 OK\r\n"
-#define AUEP2	"AUEP 18983213 ds/e1-2/1@172.16.6.66 MGCP 1.0\r\n"
-#define AUEP2_RET "500 18983213 FAIL\r\n"
-#define EMPTY	"\r\n"
-#define EMPTY_RET NULL
-#define SHORT	"CRCX \r\n"
-#define SHORT_RET "510 000000 FAIL\r\n"
-
-#define MDCX_WRONG_EP "MDCX 18983213 ds/e1-3/1@172.16.6.66 MGCP 1.0\r\n"
-#define MDCX_ERR_RET "510 18983213 FAIL\r\n"
-#define MDCX_UNALLOCATED "MDCX 18983214 ds/e1-1/2@172.16.6.66 MGCP 1.0\r\n"
-#define MDCX_RET "400 18983214 FAIL\r\n"
-#define MDCX3 "MDCX 18983215 1@mgw MGCP 1.0\r\n"
-#define MDCX3_RET "200 18983215 OK\r\n"		\
-		 "I: 1\n"			\
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 1 23 IN IP4 0.0.0.0\r\n"	\
-		 "s=-\r\n"			\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 0 RTP/AVP 126\r\n"	\
-		 "a=rtpmap:126 AMR/8000\r\n"	\
-		 "a=ptime:20\r\n"
-#define MDCX3_FMTP_RET "200 18983215 OK\r\n"		\
-		 "I: 3\n"			\
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 3 23 IN IP4 0.0.0.0\r\n"	\
-		 "s=-\r\n"			\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 0 RTP/AVP 126\r\n"	\
-		 "a=rtpmap:126 AMR/8000\r\n"	\
-		 "a=fmtp:126 0/1/2\r\n"		\
-		 "a=ptime:20\r\n"
-#define MDCX4 "MDCX 18983216 1@mgw MGCP 1.0\r\n" \
-		 "M: sendrecv\r"		\
-		 "C: 2\r\n"          \
-		 "I: 1\r\n"                    \
-		 "L: p:20, a:AMR, nt:IN\r\n"    \
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 1 23 IN IP4 0.0.0.0\r\n"	\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 4441 RTP/AVP 99\r\n"	\
-		 "a=rtpmap:99 AMR/8000\r\n"	\
-		 "a=ptime:40\r\n"
-#define MDCX4_RET(Ident) "200 " Ident " OK\r\n"	\
-		 "I: 1\n"			\
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 1 23 IN IP4 0.0.0.0\r\n"	\
-		 "s=-\r\n"			\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 0 RTP/AVP 126\r\n"	\
-		 "a=rtpmap:126 AMR/8000\r\n"	\
-		 "a=ptime:20\r\n"
-
-#define MDCX4_PT1 "MDCX 18983217 1@mgw MGCP 1.0\r\n" \
-		 "M: sendrecv\r"		\
-		 "C: 2\r\n"          \
-		 "I: 1\r\n"                    \
-		 "L: p:20-40, a:AMR, nt:IN\r\n"    \
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 1 23 IN IP4 0.0.0.0\r\n"	\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 4441 RTP/AVP 99\r\n"	\
-		 "a=rtpmap:99 AMR/8000\r\n"	\
-		 "a=ptime:40\r\n"
-
-#define MDCX4_PT2 "MDCX 18983218 1@mgw MGCP 1.0\r\n" \
-		 "M: sendrecv\r"		\
-		 "C: 2\r\n"          \
-		 "I: 1\r\n"                    \
-		 "L: p:20-20, a:AMR, nt:IN\r\n"    \
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 1 23 IN IP4 0.0.0.0\r\n"	\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 4441 RTP/AVP 99\r\n"	\
-		 "a=rtpmap:99 AMR/8000\r\n"	\
-		 "a=ptime:40\r\n"
-
-#define MDCX4_PT3 "MDCX 18983219 1@mgw MGCP 1.0\r\n" \
-		 "M: sendrecv\r"		\
-		 "C: 2\r\n"          \
-		 "I: 1\r\n"                    \
-		 "L: a:AMR, nt:IN\r\n"    \
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 1 23 IN IP4 0.0.0.0\r\n"	\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 4441 RTP/AVP 99\r\n"	\
-		 "a=rtpmap:99 AMR/8000\r\n"	\
-		 "a=ptime:40\r\n"
-
-#define MDCX4_SO "MDCX 18983220 1@mgw MGCP 1.0\r\n" \
-		 "M: sendonly\r"		\
-		 "C: 2\r\n"          \
-		 "I: 1\r\n"                    \
-		 "L: p:20, a:AMR, nt:IN\r\n"    \
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 1 23 IN IP4 0.0.0.0\r\n"	\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 4441 RTP/AVP 99\r\n"	\
-		 "a=rtpmap:99 AMR/8000\r\n"	\
-		 "a=ptime:40\r\n"
-
-#define MDCX4_RO "MDCX 18983221 1@mgw MGCP 1.0\r\n" \
-		 "M: recvonly\r"		\
-		 "C: 2\r\n"          \
-		 "I: 1\r\n"                    \
-		 "L: p:20, a:AMR, nt:IN\r\n"
-
-#define SHORT2	"CRCX 1"
-#define SHORT2_RET "510 000000 FAIL\r\n"
-#define SHORT3	"CRCX 1 1@mgw"
-#define SHORT4	"CRCX 1 1@mgw MGCP"
-#define SHORT5	"CRCX 1 1@mgw MGCP 1.0"
-
-#define CRCX	 "CRCX 2 1@mgw MGCP 1.0\r\n"	\
-		 "M: recvonly\r\n"		\
-		 "C: 2\r\n"			\
-		 "X\r\n"			\
-		 "L: p:20\r\n"		\
-		 "\r\n"				\
-		 "v=0\r\n"			\
-		 "c=IN IP4 123.12.12.123\r\n"	\
-		 "m=audio 5904 RTP/AVP 97\r\n"	\
-		 "a=rtpmap:97 GSM-EFR/8000\r\n"	\
-		 "a=ptime:40\r\n"
-
-#define CRCX_RET "200 2 OK\r\n"			\
-		 "I: 1\n"			\
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 1 23 IN IP4 0.0.0.0\r\n"	\
-		 "s=-\r\n"			\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 0 RTP/AVP 126\r\n"	\
-		 "a=rtpmap:126 AMR/8000\r\n"	\
-		 "a=ptime:20\r\n"
-
-#define CRCX_RET_NO_RTPMAP "200 2 OK\r\n"	\
-		 "I: 1\n"			\
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 1 23 IN IP4 0.0.0.0\r\n"	\
-		 "s=-\r\n"			\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 0 RTP/AVP 126\r\n"	\
-		 "a=ptime:20\r\n"
-
-#define CRCX_FMTP_RET "200 2 OK\r\n"			\
-		 "I: 3\n"			\
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 3 23 IN IP4 0.0.0.0\r\n"	\
-		 "s=-\r\n"			\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 0 RTP/AVP 126\r\n"	\
-		 "a=rtpmap:126 AMR/8000\r\n"	\
-		 "a=fmtp:126 0/1/2\r\n"		\
-		 "a=ptime:20\r\n"
-
-#define CRCX_ZYN "CRCX 2 1@mgw MGCP 1.0\r"	\
-		 "M: recvonly\r"		\
-		 "C: 2\r\r"			\
-		 "v=0\r"			\
-		 "c=IN IP4 123.12.12.123\r"	\
-		 "m=audio 5904 RTP/AVP 97\r"	\
-		 "a=rtpmap:97 GSM-EFR/8000\r"
-
-#define CRCX_ZYN_RET "200 2 OK\r\n"		\
-		 "I: 2\n"			\
-		 "\n"				\
-		 "v=0\r\n"			\
-		 "o=- 2 23 IN IP4 0.0.0.0\r\n"	\
-		 "s=-\r\n"			\
-		 "c=IN IP4 0.0.0.0\r\n"		\
-		 "t=0 0\r\n"			\
-		 "m=audio 0 RTP/AVP 126\r\n"	\
-		 "a=rtpmap:126 AMR/8000\r\n"	\
-		 "a=ptime:20\r\n"
-
-#define DLCX	 "DLCX 7 1@mgw MGCP 1.0\r\n"	\
-		 "C: 2\r\n"
-
-#define DLCX_RET "250 7 OK\r\n"			\
-		 "P: PS=0, OS=0, PR=0, OR=0, PL=0, JI=0\r\n"
-
- #define DLCX_RET_OSMUX DLCX_RET                 \
-		 "X-Osmo-CP: EC TIS=0, TOS=0, TIR=0, TOR=0\r\n"
-
-#define RQNT	 "RQNT 186908780 1@mgw MGCP 1.0\r\n"	\
-		 "X: B244F267488\r\n"			\
-		 "S: D/9\r\n"
-
-#define RQNT2	 "RQNT 186908781 1@mgw MGCP 1.0\r\n"	\
-		 "X: ADD4F26746F\r\n"			\
-		 "R: D/[0-9#*](N), G/ft, fxr/t38\r\n"
-
-#define RQNT1_RET "200 186908780 OK\r\n"
-#define RQNT2_RET "200 186908781 OK\r\n"
-
-#define PTYPE_IGNORE 0 /* == default initializer */
-#define PTYPE_NONE 128
-#define PTYPE_NYI  PTYPE_NONE
-
-#define CRCX_MULT_1 "CRCX 2 1@mgw MGCP 1.0\r\n"	\
-		 "M: recvonly\r\n"		\
-		 "C: 2\r\n"			\
-		 "X\r\n"			\
-		 "L: p:20\r\n"		\
-		 "\r\n"				\
-		 "v=0\r\n"			\
-		 "c=IN IP4 123.12.12.123\r\n"	\
-		 "m=audio 5904 RTP/AVP 18 97\r\n"\
-		 "a=rtpmap:18 G729/8000\r\n"	\
-		 "a=rtpmap:97 GSM-EFR/8000\r\n"	\
-		 "a=ptime:40\r\n"
-
-#define CRCX_MULT_2 "CRCX 2 2@mgw MGCP 1.0\r\n"	\
-		 "M: recvonly\r\n"		\
-		 "C: 2\r\n"			\
-		 "X\r\n"			\
-		 "L: p:20\r\n"		\
-		 "\r\n"				\
-		 "v=0\r\n"			\
-		 "c=IN IP4 123.12.12.123\r\n"	\
-		 "m=audio 5904 RTP/AVP 18 97 101\r\n"\
-		 "a=rtpmap:18 G729/8000\r\n"	\
-		 "a=rtpmap:97 GSM-EFR/8000\r\n"	\
-		 "a=rtpmap:101 FOO/8000\r\n"	\
-		 "a=ptime:40\r\n"
-
-#define CRCX_MULT_3 "CRCX 2 3@mgw MGCP 1.0\r\n"	\
-		 "M: recvonly\r\n"		\
-		 "C: 2\r\n"			\
-		 "X\r\n"			\
-		 "L: p:20\r\n"		\
-		 "\r\n"				\
-		 "v=0\r\n"			\
-		 "c=IN IP4 123.12.12.123\r\n"	\
-		 "m=audio 5904 RTP/AVP\r\n"	\
-		 "a=rtpmap:18 G729/8000\r\n"	\
-		 "a=rtpmap:97 GSM-EFR/8000\r\n"	\
-		 "a=rtpmap:101 FOO/8000\r\n"	\
-		 "a=ptime:40\r\n"
-
-#define CRCX_MULT_4 "CRCX 2 4@mgw MGCP 1.0\r\n"	\
-		 "M: recvonly\r\n"		\
-		 "C: 2\r\n"			\
-		 "X\r\n"			\
-		 "L: p:20\r\n"		\
-		 "\r\n"				\
-		 "v=0\r\n"			\
-		 "c=IN IP4 123.12.12.123\r\n"	\
-		 "m=audio 5904 RTP/AVP 18\r\n"	\
-		 "a=rtpmap:18 G729/8000\r\n"	\
-		 "a=rtpmap:97 GSM-EFR/8000\r\n"	\
-		 "a=rtpmap:101 FOO/8000\r\n"	\
-		 "a=ptime:40\r\n"
-
-#define CRCX_MULT_GSM_EXACT \
-		"CRCX 259260421 5@mgw MGCP 1.0\r\n"	\
-		"C: 1355c6041e\r\n"			\
-		"I: 3\r\n"				\
-		"L: p:20, a:GSM, nt:IN\r\n"		\
-		"M: recvonly\r\n"			\
-		"\r\n"					\
-		"v=0\r\n"				\
-		"o=- 1439038275 1439038275 IN IP4 192.168.181.247\r\n" \
-		"s=-\r\nc=IN IP4 192.168.181.247\r\n"	\
-		"t=0 0\r\nm=audio 29084 RTP/AVP 255 0 8 3 18 4 96 97 101\r\n" \
-		"a=rtpmap:0 PCMU/8000\r\n"		\
-		"a=rtpmap:8 PCMA/8000\r\n"		\
-		"a=rtpmap:3 gsm/8000\r\n"		\
-		"a=rtpmap:18 G729/8000\r\n"		\
-		"a=fmtp:18 annexb=no\r\n"		\
-		"a=rtpmap:4 G723/8000\r\n"		\
-		"a=rtpmap:96 iLBC/8000\r\n"		\
-		"a=fmtp:96 mode=20\r\n"			\
-		"a=rtpmap:97 iLBC/8000\r\n"		\
-		"a=fmtp:97 mode=30\r\n"			\
-		"a=rtpmap:101 telephone-event/8000\r\n"	\
-		"a=fmtp:101 0-15\r\n"			\
-		"a=recvonly\r\n"
-#define MDCX_NAT_DUMMY \
-		"MDCX 23 5@mgw MGCP 1.0\r\n"		\
-		"C: 1355c6041e\r\n"			\
-		"\r\n"					\
-		"c=IN IP4 8.8.8.8\r\n"		\
-		"m=audio 16434 RTP/AVP 255\r\n"
-
-
-struct mgcp_test {
-	const char *name;
-	const char *req;
-	const char *exp_resp;
-	int exp_net_ptype;
-	int exp_bts_ptype;
-
-	const char *extra_fmtp;
-};
-
-static const struct mgcp_test tests[] = {
-	{ "AUEP1", AUEP1, AUEP1_RET },
-	{ "AUEP2", AUEP2, AUEP2_RET },
-	{ "MDCX1", MDCX_WRONG_EP, MDCX_ERR_RET },
-	{ "MDCX2", MDCX_UNALLOCATED, MDCX_RET },
-	{ "CRCX", CRCX, CRCX_RET, 97, 126 },
-	{ "MDCX3", MDCX3, MDCX3_RET, PTYPE_NONE, 126 },
-	{ "MDCX4", MDCX4, MDCX4_RET("18983216"), 99, 126 },
-	{ "MDCX4_PT1", MDCX4_PT1, MDCX4_RET("18983217"), 99, 126 },
-	{ "MDCX4_PT2", MDCX4_PT2, MDCX4_RET("18983218"), 99, 126 },
-	{ "MDCX4_PT3", MDCX4_PT3, MDCX4_RET("18983219"), 99, 126 },
-	{ "MDCX4_SO", MDCX4_SO, MDCX4_RET("18983220"), 99, 126 },
-	{ "MDCX4_RO", MDCX4_RO, MDCX4_RET("18983221"), PTYPE_IGNORE, 126 },
-	{ "DLCX", DLCX, DLCX_RET, -1, -1 },
-	{ "CRCX_ZYN", CRCX_ZYN, CRCX_ZYN_RET, 97, 126 },
-	{ "EMPTY", EMPTY, EMPTY_RET },
-	{ "SHORT1", SHORT, SHORT_RET },
-	{ "SHORT2", SHORT2, SHORT2_RET },
-	{ "SHORT3", SHORT3, SHORT2_RET },
-	{ "SHORT4", SHORT4, SHORT2_RET },
-	{ "RQNT1", RQNT, RQNT1_RET },
-	{ "RQNT2", RQNT2, RQNT2_RET },
-	{ "DLCX", DLCX, DLCX_RET, -1, -1 },
-	{ "CRCX", CRCX, CRCX_FMTP_RET, 97, 126, .extra_fmtp = "a=fmtp:126 0/1/2" },
-	{ "MDCX3", MDCX3, MDCX3_FMTP_RET, PTYPE_NONE, 126 , .extra_fmtp = "a=fmtp:126 0/1/2" },
-	{ "DLCX", DLCX, DLCX_RET, -1, -1 , .extra_fmtp = "a=fmtp:126 0/1/2" },
-};
-
-static const struct mgcp_test retransmit[] = {
-	{ "CRCX", CRCX, CRCX_RET },
-	{ "RQNT1", RQNT, RQNT1_RET },
-	{ "RQNT2", RQNT2, RQNT2_RET },
-	{ "MDCX3", MDCX3, MDCX3_RET },
-	{ "DLCX", DLCX, DLCX_RET },
-};
-
-static struct msgb *create_msg(const char *str)
-{
-	struct msgb *msg;
-
-	msg = msgb_alloc_headroom(4096, 128, "MGCP msg");
-	int len = sprintf((char *)msg->data, "%s", str);
-	msg->l2h = msgb_put(msg, len);
-	return msg;
-}
-
-static int last_endpoint = -1;
-
-static int mgcp_test_policy_cb(struct mgcp_trunk_config *cfg, int endpoint,
-			       int state, const char *transactio_id)
-{
-	fprintf(stderr, "Policy CB got state %d on endpoint %d\n",
-		state, endpoint);
-	last_endpoint = endpoint;
-	return MGCP_POLICY_CONT;
-}
-
-#define MGCP_DUMMY_LOAD 0x23
-static int dummy_packets = 0;
-/* override and forward */
-ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
-		const struct sockaddr *dest_addr, socklen_t addrlen)
-{
-	typedef ssize_t (*sendto_t)(int, const void *, size_t, int,
-			const struct sockaddr *, socklen_t);
-	static sendto_t real_sendto = NULL;
-	uint32_t dest_host = htonl(((struct sockaddr_in *)dest_addr)->sin_addr.s_addr);
-	int      dest_port = htons(((struct sockaddr_in *)dest_addr)->sin_port);
-
-	if (!real_sendto)
-		real_sendto = dlsym(RTLD_NEXT, "sendto");
-
-	if (len == 1 && ((const char *)buf)[0] == MGCP_DUMMY_LOAD ) {
-		fprintf(stderr, "Dummy packet to 0x%08x:%d, msg length %zu\n%s\n\n",
-		       dest_host, dest_port,
-		       len, osmo_hexdump(buf, len));
-		dummy_packets += 1;
-	}
-
-	return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
-}
-
-static int64_t force_monotonic_time_us = -1;
-/* override and forward */
-int clock_gettime(clockid_t clk_id, struct timespec *tp)
-{
-	typedef int (*clock_gettime_t)(clockid_t clk_id, struct timespec *tp);
-	static clock_gettime_t real_clock_gettime = NULL;
-
-	if (!real_clock_gettime)
-		real_clock_gettime = dlsym(RTLD_NEXT, "clock_gettime");
-
-	if (clk_id == CLOCK_MONOTONIC && force_monotonic_time_us >= 0) {
-		tp->tv_sec = force_monotonic_time_us / 1000000;
-		tp->tv_nsec = (force_monotonic_time_us % 1000000) * 1000;
-		return 0;
-	}
-
-	return real_clock_gettime(clk_id, tp);
-}
-
-#define CONN_UNMODIFIED (0x1000)
-
-static void test_values(void)
-{
-	/* Check that NONE disables all output */
-	OSMO_ASSERT((MGCP_CONN_NONE & MGCP_CONN_RECV_SEND) == 0);
-
-	/* Check that LOOPBACK enables all output */
-	OSMO_ASSERT((MGCP_CONN_LOOPBACK & MGCP_CONN_RECV_SEND) ==
-		    MGCP_CONN_RECV_SEND);
-}
-
-
-static void test_messages(void)
-{
-	struct mgcp_config *cfg;
-	struct mgcp_endpoint *endp;
-	int i;
-
-	cfg = mgcp_config_alloc();
-
-	cfg->trunk.number_endpoints = 64;
-	mgcp_endpoints_allocate(&cfg->trunk);
-
-	cfg->policy_cb = mgcp_test_policy_cb;
-
-	mgcp_endpoints_allocate(mgcp_trunk_alloc(cfg, 1));
-
-	/* reset endpoints */
-	for (i = 0; i < cfg->trunk.number_endpoints; i++) {
-		endp = &cfg->trunk.endpoints[i];
-		endp->net_end.codec.payload_type = PTYPE_NONE;
-		endp->net_end.packet_duration_ms = -1;
-
-		OSMO_ASSERT(endp->conn_mode == MGCP_CONN_NONE);
-		endp->conn_mode |= CONN_UNMODIFIED;
-	}
-
-	for (i = 0; i < ARRAY_SIZE(tests); i++) {
-		const struct mgcp_test *t = &tests[i];
-		struct msgb *inp;
-		struct msgb *msg;
-
-		printf("Testing %s\n", t->name);
-
-		last_endpoint = -1;
-		dummy_packets = 0;
-
-		osmo_talloc_replace_string(cfg, &cfg->trunk.audio_fmtp_extra, t->extra_fmtp);
-
-		inp = create_msg(t->req);
-		msg = mgcp_handle_message(cfg, inp);
-		msgb_free(inp);
-		if (!t->exp_resp) {
-			if (msg)
-				printf("%s failed '%s'\n", t->name, (char *) msg->data);
-		} else if (strcmp((char *) msg->data, t->exp_resp) != 0)
-			printf("%s failed.\nExpected:\n%s\nGot:\n%s\n",
-			       t->name, t->exp_resp, (char *) msg->data);
-		msgb_free(msg);
-
-		if (dummy_packets)
-			printf("Dummy packets: %d\n", dummy_packets);
-
-		if (last_endpoint != -1) {
-			endp = &cfg->trunk.endpoints[last_endpoint];
-
-			if (endp->net_end.packet_duration_ms != -1)
-				printf("Detected packet duration: %d\n",
-				       endp->net_end.packet_duration_ms);
-			else
-				printf("Packet duration not set\n");
-			if (endp->local_options.pkt_period_min ||
-			    endp->local_options.pkt_period_max)
-				printf("Requested packetetization period: "
-				       "%d-%d\n",
-				       endp->local_options.pkt_period_min,
-				       endp->local_options.pkt_period_max);
-			else
-				printf("Requested packetization period not set\n");
-
-			if ((endp->conn_mode & CONN_UNMODIFIED) == 0) {
-				printf("Connection mode: %d:%s%s%s%s\n",
-				       endp->conn_mode,
-				       !endp->conn_mode ? " NONE" : "",
-				       endp->conn_mode & MGCP_CONN_SEND_ONLY ?
-				       " SEND" : "",
-				       endp->conn_mode & MGCP_CONN_RECV_ONLY ?
-				       " RECV" : "",
-				       endp->conn_mode & MGCP_CONN_LOOPBACK &
-				       ~MGCP_CONN_RECV_SEND ?
-				       " LOOP" : "");
-				fprintf(stderr,
-					"BTS output %sabled, NET output %sabled\n",
-					endp->bts_end.output_enabled ? "en" : "dis",
-					endp->net_end.output_enabled ? "en" : "dis");
-			} else
-				printf("Connection mode not set\n");
-
-			OSMO_ASSERT(endp->net_end.output_enabled ==
-				    (endp->conn_mode & MGCP_CONN_SEND_ONLY ? 1 : 0));
-			OSMO_ASSERT(endp->bts_end.output_enabled ==
-				    (endp->conn_mode & MGCP_CONN_RECV_ONLY ? 1 : 0));
-
-			endp->net_end.packet_duration_ms = -1;
-			endp->local_options.pkt_period_min = 0;
-			endp->local_options.pkt_period_max = 0;
-			endp->conn_mode |= CONN_UNMODIFIED;
-		}
-
-
-		/* Check detected payload type */
-		if (t->exp_net_ptype != PTYPE_IGNORE ||
-		    t->exp_bts_ptype != PTYPE_IGNORE) {
-			OSMO_ASSERT(last_endpoint != -1);
-			endp = &cfg->trunk.endpoints[last_endpoint];
-
-			fprintf(stderr, "endpoint %d: "
-				"payload type BTS %d (exp %d), NET %d (exp %d)\n",
-				last_endpoint,
-				endp->bts_end.codec.payload_type, t->exp_bts_ptype,
-				endp->net_end.codec.payload_type, t->exp_net_ptype);
-
-			if (t->exp_bts_ptype != PTYPE_IGNORE)
-				OSMO_ASSERT(endp->bts_end.codec.payload_type ==
-					    t->exp_bts_ptype);
-			if (t->exp_net_ptype != PTYPE_IGNORE)
-				OSMO_ASSERT(endp->net_end.codec.payload_type ==
-					    t->exp_net_ptype);
-
-			/* Reset them again for next test */
-			endp->net_end.codec.payload_type = PTYPE_NONE;
-		}
-	}
-
-	talloc_free(cfg);
-}
-
-static void test_retransmission(void)
-{
-	struct mgcp_config *cfg;
-	int i;
-
-	cfg = mgcp_config_alloc();
-
-	cfg->trunk.number_endpoints = 64;
-	mgcp_endpoints_allocate(&cfg->trunk);
-
-	mgcp_endpoints_allocate(mgcp_trunk_alloc(cfg, 1));
-
-	/* reset endpoints */
-	for (i = 0; i < cfg->trunk.number_endpoints; i++) {
-		struct mgcp_endpoint *endp;
-		endp = &cfg->trunk.endpoints[i];
-		endp->bts_end.packet_duration_ms = 20;
-	}
-
-	for (i = 0; i < ARRAY_SIZE(retransmit); i++) {
-		const struct mgcp_test *t = &retransmit[i];
-		struct msgb *inp;
-		struct msgb *msg;
-
-		printf("Testing %s\n", t->name);
-
-		inp = create_msg(t->req);
-		msg = mgcp_handle_message(cfg, inp);
-		msgb_free(inp);
-		if (strcmp((char *) msg->data, t->exp_resp) != 0)
-			printf("%s failed '%s'\n", t->name, (char *) msg->data);
-		msgb_free(msg);
-
-		/* Retransmit... */
-		printf("Re-transmitting %s\n", t->name);
-		inp = create_msg(t->req);
-		msg = mgcp_handle_message(cfg, inp);
-		msgb_free(inp);
-		if (strcmp((char *) msg->data, t->exp_resp) != 0)
-			printf("%s failed '%s'\n", t->name, (char *) msg->data);
-		msgb_free(msg);
-	}
-
-	talloc_free(cfg);
-}
-
-static int rqnt_cb(struct mgcp_endpoint *endp, char _tone)
-{
-	ptrdiff_t tone = _tone;
-	endp->cfg->data = (void *) tone;
-	return 0;
-}
-
-static void test_rqnt_cb(void)
-{
-	struct mgcp_config *cfg;
-	struct msgb *inp, *msg;
-
-	cfg = mgcp_config_alloc();
-	cfg->rqnt_cb = rqnt_cb;
-
-	cfg->trunk.number_endpoints = 64;
-	mgcp_endpoints_allocate(&cfg->trunk);
-
-	mgcp_endpoints_allocate(mgcp_trunk_alloc(cfg, 1));
-
-	inp = create_msg(CRCX);
-	msgb_free(mgcp_handle_message(cfg, inp));
-	msgb_free(inp);
-
-	/* send the RQNT and check for the CB */
-	inp = create_msg(RQNT);
-	msg = mgcp_handle_message(cfg, inp);
-	if (strncmp((const char *) msg->l2h, "200", 3) != 0) {
-		printf("FAILED: message is not 200. '%s'\n", msg->l2h);
-		abort();
-	}
-
-	if (cfg->data != (void *) '9') {
-		printf("FAILED: callback not called: %p\n", cfg->data);
-		abort();
-	}
-
-	msgb_free(msg);
-	msgb_free(inp);
-
-	inp = create_msg(DLCX);
-	msgb_free(mgcp_handle_message(cfg, inp));
-	msgb_free(inp);
-	talloc_free(cfg);
-}
-
-struct pl_test {
-	int		cycles;
-	uint16_t	base_seq;
-	uint16_t	max_seq;
-	uint32_t	packets;
-
-	uint32_t	expected;
-	int		loss;
-};
-
-static const struct pl_test pl_test_dat[] = {
-	/* basic.. just one package */
-	{ .cycles = 0, .base_seq = 0, .max_seq = 0, .packets = 1, .expected = 1, .loss = 0},
-	/* some packages and a bit of loss */
-	{ .cycles = 0, .base_seq = 0, .max_seq = 100, .packets = 100, .expected = 101, .loss = 1},
-	/* wrap around */
-	{ .cycles = 1<<16, .base_seq = 0xffff, .max_seq = 2, .packets = 4, .expected = 4, .loss = 0},
-	/* min loss */
-	{ .cycles = 0, .base_seq = 0, .max_seq = 0, .packets = UINT_MAX, .expected = 1, .loss = INT_MIN },
-	/* max loss, with wrap around on expected max */
-	{ .cycles = INT_MAX, .base_seq = 0, .max_seq = UINT16_MAX, .packets = 0, .expected = ((uint32_t)(INT_MAX) + UINT16_MAX + 1), .loss = INT_MAX }, 
-};
-
-static void test_packet_loss_calc(void)
-{
-	int i;
-	printf("Testing packet loss calculation.\n");
-
-	for (i = 0; i < ARRAY_SIZE(pl_test_dat); ++i) {
-		uint32_t expected;
-		int loss;
-		struct mgcp_rtp_state state;
-		struct mgcp_rtp_end rtp;
-		memset(&state, 0, sizeof(state));
-		memset(&rtp, 0, sizeof(rtp));
-
-		state.stats_initialized = 1;
-		state.stats_base_seq = pl_test_dat[i].base_seq;
-		state.stats_max_seq = pl_test_dat[i].max_seq;
-		state.stats_cycles = pl_test_dat[i].cycles;
-
-		rtp.packets = pl_test_dat[i].packets;
-		mgcp_state_calc_loss(&state, &rtp, &expected, &loss);
-
-		if (loss != pl_test_dat[i].loss || expected != pl_test_dat[i].expected) {
-			printf("FAIL: Wrong exp/loss at idx(%d) Loss(%d vs. %d) Exp(%u vs. %u)\n",
-				i, loss, pl_test_dat[i].loss,
-				expected, pl_test_dat[i].expected);
-		}
-	}
-}
-
-static void test_mgcp_stats(void)
-{
-	printf("Testing stat parsing\n");
-
-	uint32_t bps, bos, pr, _or, jitter;
-	struct msgb *msg;
-	int loss;
-	int rc;
-
-	msg = create_msg(DLCX_RET);
-	rc = mgcp_parse_stats(msg, &bps, &bos, &pr, &_or, &loss, &jitter);
-	printf("Parsing result: %d\n", rc);
-	if (bps != 0 || bos != 0 || pr != 0 ||  _or != 0 || loss != 0 || jitter != 0)
-		printf("FAIL: Parsing failed1.\n");
-	msgb_free(msg);
-
-	msg = create_msg("250 7 OK\r\nP: PS=10, OS=20, PR=30, OR=40, PL=-3, JI=40\r\n");
-	rc = mgcp_parse_stats(msg, &bps, &bos, &pr, &_or, &loss, &jitter);
-	printf("Parsing result: %d\n", rc);
-	if (bps != 10 || bos != 20 || pr != 30 || _or != 40 || loss != -3 || jitter != 40)
-		printf("FAIL: Parsing failed2.\n");
-	msgb_free(msg);
-}
-
-struct rtp_packet_info {
-	float txtime;
-	int len;
-	char *data;
-};
-
-struct rtp_packet_info test_rtp_packets1[] = {
-	/* RTP: SeqNo=0, TS=0 */
-	{0.000000, 20, "\x80\x62\x00\x00\x00\x00\x00\x00\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=1, TS=160 */
-	{0.020000, 20, "\x80\x62\x00\x01\x00\x00\x00\xA0\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=2, TS=320 */
-	{0.040000, 20, "\x80\x62\x00\x02\x00\x00\x01\x40\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* Repeat RTP timestamp: */
-	/* RTP: SeqNo=3, TS=320 */
-	{0.060000, 20, "\x80\x62\x00\x03\x00\x00\x01\x40\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=4, TS=480 */
-	{0.080000, 20, "\x80\x62\x00\x04\x00\x00\x01\xE0\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=5, TS=640 */
-	{0.100000, 20, "\x80\x62\x00\x05\x00\x00\x02\x80\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* Double skip RTP timestamp (delta = 2*160): */
-	/* RTP: SeqNo=6, TS=960 */
-	{0.120000, 20, "\x80\x62\x00\x06\x00\x00\x03\xC0\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=7, TS=1120 */
-	{0.140000, 20, "\x80\x62\x00\x07\x00\x00\x04\x60\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=8, TS=1280 */
-	{0.160000, 20, "\x80\x62\x00\x08\x00\x00\x05\x00\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* Non 20ms RTP timestamp (delta = 120): */
-	/* RTP: SeqNo=9, TS=1400 */
-	{0.180000, 20, "\x80\x62\x00\x09\x00\x00\x05\x78\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=10, TS=1560 */
-	{0.200000, 20, "\x80\x62\x00\x0A\x00\x00\x06\x18\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=11, TS=1720 */
-	{0.220000, 20, "\x80\x62\x00\x0B\x00\x00\x06\xB8\x11\x22\x33\x44"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* SSRC changed to 0x10203040, RTP timestamp jump */
-	/* RTP: SeqNo=12, TS=34688 */
-	{0.240000, 20, "\x80\x62\x00\x0C\x00\x00\x87\x80\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=13, TS=34848 */
-	{0.260000, 20, "\x80\x62\x00\x0D\x00\x00\x88\x20\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=14, TS=35008 */
-	{0.280000, 20, "\x80\x62\x00\x0E\x00\x00\x88\xC0\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* Non 20ms RTP timestamp (delta = 120): */
-	/* RTP: SeqNo=15, TS=35128 */
-	{0.300000, 20, "\x80\x62\x00\x0F\x00\x00\x89\x38\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=16, TS=35288 */
-	{0.320000, 20, "\x80\x62\x00\x10\x00\x00\x89\xD8\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=17, TS=35448 */
-	{0.340000, 20, "\x80\x62\x00\x11\x00\x00\x8A\x78\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x8A\xAB\xCD\xEF"},
-	/* SeqNo increment by 2, RTP timestamp delta = 320: */
-	/* RTP: SeqNo=19, TS=35768 */
-	{0.360000, 20, "\x80\x62\x00\x13\x00\x00\x8B\xB8\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=20, TS=35928 */
-	{0.380000, 20, "\x80\x62\x00\x14\x00\x00\x8C\x58\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=21, TS=36088 */
-	{0.380000, 20, "\x80\x62\x00\x15\x00\x00\x8C\xF8\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* Repeat last packet */
-	/* RTP: SeqNo=21, TS=36088 */
-	{0.400000, 20, "\x80\x62\x00\x15\x00\x00\x8C\xF8\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=22, TS=36248 */
-	{0.420000, 20, "\x80\x62\x00\x16\x00\x00\x8D\x98\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=23, TS=36408 */
-	{0.440000, 20, "\x80\x62\x00\x17\x00\x00\x8E\x38\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* Don't increment SeqNo but increment timestamp by 160 */
-	/* RTP: SeqNo=23, TS=36568 */
-	{0.460000, 20, "\x80\x62\x00\x17\x00\x00\x8E\xD8\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=24, TS=36728 */
-	{0.480000, 20, "\x80\x62\x00\x18\x00\x00\x8F\x78\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=25, TS=36888 */
-	{0.500000, 20, "\x80\x62\x00\x19\x00\x00\x90\x18\x10\x20\x30\x40"
-		       "\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* SSRC changed to 0x50607080, RTP timestamp jump, Delay of 1.5s,
-	 * SeqNo jump */
-	/* RTP: SeqNo=1000, TS=160000 */
-	{2.000000, 20, "\x80\x62\x03\xE8\x00\x02\x71\x00\x50\x60\x70\x80"
-			"\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=1001, TS=160160 */
-	{2.020000, 20, "\x80\x62\x03\xE9\x00\x02\x71\xA0\x50\x60\x70\x80"
-			"\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-	/* RTP: SeqNo=1002, TS=160320 */
-	{2.040000, 20, "\x80\x62\x03\xEA\x00\x02\x72\x40\x50\x60\x70\x80"
-			"\x01\x23\x45\x67\x89\xAB\xCD\xEF"},
-};
-
-void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *state,
-			  struct mgcp_rtp_end *rtp_end, struct sockaddr_in *addr,
-			  char *data, int len);
-
-static void test_packet_error_detection(int patch_ssrc, int patch_ts)
-{
-	int i;
-
-	struct mgcp_trunk_config trunk;
-	struct mgcp_endpoint endp;
-	struct mgcp_rtp_state state;
-	struct mgcp_rtp_end *rtp = &endp.net_end;
-	struct sockaddr_in addr = {0};
-	char buffer[4096];
-	uint32_t last_ssrc = 0;
-	uint32_t last_timestamp = 0;
-	uint32_t last_seqno = 0;
-	int last_in_ts_err_cnt = 0;
-	int last_out_ts_err_cnt = 0;
-
-	printf("Testing packet error detection%s%s.\n",
-	       patch_ssrc ? ", patch SSRC" : "",
-	       patch_ts ? ", patch timestamps" : "");
-
-	memset(&trunk, 0, sizeof(trunk));
-	memset(&endp, 0, sizeof(endp));
-	memset(&state, 0, sizeof(state));
-
-	trunk.number_endpoints = 1;
-	trunk.endpoints = &endp;
-	trunk.force_constant_ssrc = patch_ssrc;
-	trunk.force_aligned_timing = patch_ts;
-
-	endp.tcfg = &trunk;
-
-	mgcp_initialize_endp(&endp);
-
-	rtp->codec.payload_type = 98;
-
-	for (i = 0; i < ARRAY_SIZE(test_rtp_packets1); ++i) {
-		struct rtp_packet_info *info = test_rtp_packets1 + i;
-
-		force_monotonic_time_us = round(1000000.0 * info->txtime);
-
-		OSMO_ASSERT(info->len <= sizeof(buffer));
-		OSMO_ASSERT(info->len >= 0);
-		memmove(buffer, info->data, info->len);
-
-		mgcp_rtp_end_config(&endp, 1, rtp);
-
-		mgcp_patch_and_count(&endp, &state, rtp, &addr,
-				     buffer, info->len);
-
-		if (state.out_stream.ssrc != last_ssrc) {
-			printf("Output SSRC changed to %08x\n",
-			       state.out_stream.ssrc);
-			last_ssrc = state.out_stream.ssrc;
-		}
-
-		printf("In TS: %d, dTS: %d, Seq: %d\n",
-		       state.in_stream.last_timestamp,
-		       state.in_stream.last_tsdelta,
-		       state.in_stream.last_seq);
-
-		printf("Out TS change: %d, dTS: %d, Seq change: %d, "
-		       "TS Err change: in %+d, out %+d\n",
-		       state.out_stream.last_timestamp - last_timestamp,
-		       state.out_stream.last_tsdelta,
-		       state.out_stream.last_seq - last_seqno,
-		       state.in_stream.err_ts_counter - last_in_ts_err_cnt,
-		       state.out_stream.err_ts_counter - last_out_ts_err_cnt);
-
-		printf("Stats: Jitter = %u, Transit = %d\n",
-		       mgcp_state_calc_jitter(&state), state.stats_transit);
-
-		last_in_ts_err_cnt = state.in_stream.err_ts_counter;
-		last_out_ts_err_cnt = state.out_stream.err_ts_counter;
-		last_timestamp = state.out_stream.last_timestamp;
-		last_seqno = state.out_stream.last_seq;
-	}
-
-	force_monotonic_time_us = -1;
-}
-
-static void test_multilple_codec(void)
-{
-	struct mgcp_config *cfg;
-	struct mgcp_endpoint *endp;
-	struct msgb *inp, *resp;
-	struct in_addr addr;
-
-	printf("Testing multiple payload types\n");
-
-	cfg = mgcp_config_alloc();
-	cfg->trunk.number_endpoints = 64;
-	mgcp_endpoints_allocate(&cfg->trunk);
-	cfg->policy_cb = mgcp_test_policy_cb;
-	mgcp_endpoints_allocate(mgcp_trunk_alloc(cfg, 1));
-
-	/* Allocate endpoint 1@mgw with two codecs */
-	last_endpoint = -1;
-	inp = create_msg(CRCX_MULT_1);
-	resp = mgcp_handle_message(cfg, inp);
-	msgb_free(inp);
-	msgb_free(resp);
-
-	OSMO_ASSERT(last_endpoint == 1);
-	endp = &cfg->trunk.endpoints[last_endpoint];
-	OSMO_ASSERT(endp->net_end.codec.payload_type == 18);
-	OSMO_ASSERT(endp->net_end.alt_codec.payload_type == 97);
-
-	/* Allocate 2@mgw with three codecs, last one ignored */
-	last_endpoint = -1;
-	inp = create_msg(CRCX_MULT_2);
-	resp = mgcp_handle_message(cfg, inp);
-	msgb_free(inp);
-	msgb_free(resp);
-
-	OSMO_ASSERT(last_endpoint == 2);
-	endp = &cfg->trunk.endpoints[last_endpoint];
-	OSMO_ASSERT(endp->net_end.codec.payload_type == 18);
-	OSMO_ASSERT(endp->net_end.alt_codec.payload_type == 97);
-
-	/* Allocate 3@mgw with no codecs, check for PT == -1 */
-	last_endpoint = -1;
-	inp = create_msg(CRCX_MULT_3);
-	resp = mgcp_handle_message(cfg, inp);
-	msgb_free(inp);
-	msgb_free(resp);
-
-	OSMO_ASSERT(last_endpoint == 3);
-	endp = &cfg->trunk.endpoints[last_endpoint];
-	OSMO_ASSERT(endp->net_end.codec.payload_type == -1);
-	OSMO_ASSERT(endp->net_end.alt_codec.payload_type == -1);
-
-	/* Allocate 4@mgw with a single codec */
-	last_endpoint = -1;
-	inp = create_msg(CRCX_MULT_4);
-	resp = mgcp_handle_message(cfg, inp);
-	msgb_free(inp);
-	msgb_free(resp);
-
-	OSMO_ASSERT(last_endpoint == 4);
-	endp = &cfg->trunk.endpoints[last_endpoint];
-	OSMO_ASSERT(endp->net_end.codec.payload_type == 18);
-	OSMO_ASSERT(endp->net_end.alt_codec.payload_type == -1);
-
-	/* Allocate 5@mgw at select GSM.. */
-	last_endpoint = -1;
-	inp = create_msg(CRCX_MULT_GSM_EXACT);
-	talloc_free(cfg->trunk.audio_name);
-	cfg->trunk.audio_name = "GSM/8000";
-	cfg->trunk.no_audio_transcoding = 1;
-	resp = mgcp_handle_message(cfg, inp);
-	msgb_free(inp);
-	msgb_free(resp);
-
-	OSMO_ASSERT(last_endpoint == 5);
-	endp = &cfg->trunk.endpoints[last_endpoint];
-	OSMO_ASSERT(endp->net_end.codec.payload_type == 3);
-	OSMO_ASSERT(endp->net_end.alt_codec.payload_type == -1);
-
-	inp = create_msg(MDCX_NAT_DUMMY);
-	last_endpoint = -1;
-	resp = mgcp_handle_message(cfg, inp);
-	msgb_free(inp);
-	msgb_free(resp);
-	OSMO_ASSERT(last_endpoint == 5);
-	endp = &cfg->trunk.endpoints[last_endpoint];
-	OSMO_ASSERT(endp->net_end.codec.payload_type == 3);
-	OSMO_ASSERT(endp->net_end.alt_codec.payload_type == -1);
-	OSMO_ASSERT(endp->net_end.rtp_port == htons(16434));
-	memset(&addr, 0, sizeof(addr));
-	inet_aton("8.8.8.8", &addr);
-	OSMO_ASSERT(endp->net_end.addr.s_addr == addr.s_addr);
-
-	/* Check what happens without that flag */
-
-	/* Free the previous endpoint and the data ... */
-	mgcp_release_endp(endp);
-	talloc_free(endp->last_response);
-	talloc_free(endp->last_trans);
-	endp->last_response = endp->last_trans = NULL;
-
-	last_endpoint = -1;
-	inp = create_msg(CRCX_MULT_GSM_EXACT);
-	cfg->trunk.no_audio_transcoding = 0;
-	resp = mgcp_handle_message(cfg, inp);
-	msgb_free(inp);
-	msgb_free(resp);
-
-	OSMO_ASSERT(last_endpoint == 5);
-	endp = &cfg->trunk.endpoints[last_endpoint];
-	OSMO_ASSERT(endp->net_end.codec.payload_type == 255);
-	OSMO_ASSERT(endp->net_end.alt_codec.payload_type == 0);
-
-	talloc_free(cfg);
-}
-
-static void test_no_cycle(void)
-{
-	struct mgcp_config *cfg;
-	struct mgcp_endpoint *endp;
-
-	printf("Testing no sequence flow on initial packet\n");
-
-	cfg = mgcp_config_alloc();
-	cfg->trunk.number_endpoints = 64;
-	mgcp_endpoints_allocate(&cfg->trunk);
-
-	endp = &cfg->trunk.endpoints[1];
-	OSMO_ASSERT(endp->net_state.stats_initialized == 0);
-
-	mgcp_rtp_annex_count(endp, &endp->net_state, 0, 0, 2342);
-	OSMO_ASSERT(endp->net_state.stats_initialized == 1);
-	OSMO_ASSERT(endp->net_state.stats_cycles == 0);
-	OSMO_ASSERT(endp->net_state.stats_max_seq == 0);
-
-	mgcp_rtp_annex_count(endp, &endp->net_state, 1, 0, 2342);
-	OSMO_ASSERT(endp->net_state.stats_initialized == 1);
-	OSMO_ASSERT(endp->net_state.stats_cycles == 0);
-	OSMO_ASSERT(endp->net_state.stats_max_seq == 1);
-
-	/* now jump.. */
-	mgcp_rtp_annex_count(endp, &endp->net_state, UINT16_MAX, 0, 2342);
-	OSMO_ASSERT(endp->net_state.stats_initialized == 1);
-	OSMO_ASSERT(endp->net_state.stats_cycles == 0);
-	OSMO_ASSERT(endp->net_state.stats_max_seq == UINT16_MAX);
-
-	/* and wrap */
-	mgcp_rtp_annex_count(endp, &endp->net_state, 0, 0, 2342);
-	OSMO_ASSERT(endp->net_state.stats_initialized == 1);
-	OSMO_ASSERT(endp->net_state.stats_cycles == UINT16_MAX + 1);
-	OSMO_ASSERT(endp->net_state.stats_max_seq == 0);
-
-	talloc_free(cfg);
-}
-
-static void test_no_name(void)
-{
-	struct mgcp_config *cfg;
-	struct mgcp_endpoint *endp;
-	struct msgb *inp, *msg;
-	int i;
-
-	printf("Testing no rtpmap name\n");
-	cfg = mgcp_config_alloc();
-
-	cfg->trunk.number_endpoints = 64;
-	cfg->trunk.audio_send_name = 0;
-	mgcp_endpoints_allocate(&cfg->trunk);
-
-	cfg->policy_cb = mgcp_test_policy_cb;
-
-	mgcp_endpoints_allocate(mgcp_trunk_alloc(cfg, 1));
-
-	/* reset endpoints */
-	for (i = 0; i < cfg->trunk.number_endpoints; i++) {
-		endp = &cfg->trunk.endpoints[i];
-		endp->net_end.codec.payload_type = PTYPE_NONE;
-		endp->net_end.packet_duration_ms = -1;
-
-		OSMO_ASSERT(endp->conn_mode == MGCP_CONN_NONE);
-		endp->conn_mode |= CONN_UNMODIFIED;
-	}
-
-	inp = create_msg(CRCX);
-	msg = mgcp_handle_message(cfg, inp);
-	if (strcmp((char *) msg->data, CRCX_RET_NO_RTPMAP) != 0)
-		printf("FAILED: there should not be a RTPMAP: %s\n",
-			(char *) msg->data);
-	msgb_free(inp);
-	msgb_free(msg);
-
-	mgcp_release_endp(&cfg->trunk.endpoints[1]);
-	talloc_free(cfg);
-}
-
-static void test_osmux_cid(void)
-{
-	int id, i;
-
-	OSMO_ASSERT(osmux_used_cid() == 0);
-	id = osmux_get_cid();
-	OSMO_ASSERT(id == 0);
-	OSMO_ASSERT(osmux_used_cid() == 1);
-	osmux_put_cid(id);
-	OSMO_ASSERT(osmux_used_cid() == 0);
-
-	for (i = 0; i < 256; ++i) {
-		id = osmux_get_cid();
-		OSMO_ASSERT(id == i);
-		OSMO_ASSERT(osmux_used_cid() == i + 1);
-	}
-
-	id = osmux_get_cid();
-	OSMO_ASSERT(id == -1);
-
-	for (i = 0; i < 256; ++i)
-		osmux_put_cid(i);
-	OSMO_ASSERT(osmux_used_cid() == 0);
-}
-
-static const struct log_info_cat log_categories[] = {
-};
-
-const struct log_info log_info = {
-        .cat = log_categories,
-        .num_cat = ARRAY_SIZE(log_categories),
-};
-
-int main(int argc, char **argv)
-{
-	void *ctx = talloc_named_const(NULL, 0, "mgcp_test");
-	void *msgb_ctx = msgb_talloc_ctx_init(ctx, 0);
-	osmo_init_logging2(ctx, &log_info);
-
-	test_strline();
-	test_values();
-	test_messages();
-	test_retransmission();
-	test_packet_loss_calc();
-	test_rqnt_cb();
-	test_mgcp_stats();
-	test_packet_error_detection(1, 0);
-	test_packet_error_detection(0, 0);
-	test_packet_error_detection(0, 1);
-	test_packet_error_detection(1, 1);
-	test_multilple_codec();
-	test_no_cycle();
-	test_no_name();
-	test_osmux_cid();
-
-	OSMO_ASSERT(talloc_total_size(msgb_ctx) == 0);
-	OSMO_ASSERT(talloc_total_blocks(msgb_ctx) == 1);
-	talloc_free(msgb_ctx);
-	printf("Done\n");
-	return EXIT_SUCCESS;
-}
diff --git a/tests/legacy_mgcp/mgcp_test.ok b/tests/legacy_mgcp/mgcp_test.ok
deleted file mode 100644
index 4e27282..0000000
--- a/tests/legacy_mgcp/mgcp_test.ok
+++ /dev/null
@@ -1,480 +0,0 @@
-line: 'one CR'
-line: 'two CR'
-line: ''
-line: 'one CRLF'
-line: 'two CRLF'
-line: ''
-line: 'one LF'
-line: 'two LF'
-line: ''
-line: 'mixed (4 lines)'
-line: ''
-line: ''
-line: ''
-Testing AUEP1
-Testing AUEP2
-Testing MDCX1
-Testing MDCX2
-Testing CRCX
-Dummy packets: 1
-Detected packet duration: 40
-Requested packetetization period: 20-20
-Connection mode: 1: RECV
-Testing MDCX3
-Dummy packets: 1
-Packet duration not set
-Requested packetization period not set
-Connection mode not set
-Testing MDCX4
-Dummy packets: 1
-Detected packet duration: 40
-Requested packetetization period: 20-20
-Connection mode: 3: SEND RECV
-Testing MDCX4_PT1
-Dummy packets: 1
-Detected packet duration: 40
-Requested packetetization period: 20-40
-Connection mode: 3: SEND RECV
-Testing MDCX4_PT2
-Dummy packets: 1
-Detected packet duration: 40
-Requested packetetization period: 20-20
-Connection mode: 3: SEND RECV
-Testing MDCX4_PT3
-Dummy packets: 1
-Detected packet duration: 40
-Requested packetization period not set
-Connection mode: 3: SEND RECV
-Testing MDCX4_SO
-Detected packet duration: 40
-Requested packetetization period: 20-20
-Connection mode: 2: SEND
-Testing MDCX4_RO
-Dummy packets: 1
-Packet duration not set
-Requested packetetization period: 20-20
-Connection mode: 1: RECV
-Testing DLCX
-Detected packet duration: 20
-Requested packetization period not set
-Connection mode: 0: NONE
-Testing CRCX_ZYN
-Dummy packets: 1
-Packet duration not set
-Requested packetization period not set
-Connection mode: 1: RECV
-Testing EMPTY
-Testing SHORT1
-Testing SHORT2
-Testing SHORT3
-Testing SHORT4
-Testing RQNT1
-Testing RQNT2
-Testing DLCX
-Detected packet duration: 20
-Requested packetization period not set
-Connection mode: 0: NONE
-Testing CRCX
-Dummy packets: 1
-Detected packet duration: 40
-Requested packetetization period: 20-20
-Connection mode: 1: RECV
-Testing MDCX3
-Dummy packets: 1
-Packet duration not set
-Requested packetization period not set
-Connection mode not set
-Testing DLCX
-Detected packet duration: 20
-Requested packetization period not set
-Connection mode: 0: NONE
-Testing CRCX
-Re-transmitting CRCX
-Testing RQNT1
-Re-transmitting RQNT1
-Testing RQNT2
-Re-transmitting RQNT2
-Testing MDCX3
-Re-transmitting MDCX3
-Testing DLCX
-Re-transmitting DLCX
-Testing packet loss calculation.
-Testing stat parsing
-Parsing result: 0
-Parsing result: 0
-Testing packet error detection, patch SSRC.
-Output SSRC changed to 11223344
-In TS: 0, dTS: 0, Seq: 0
-Out TS change: 0, dTS: 0, Seq change: 0, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 160, dTS: 160, Seq: 1
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 320, dTS: 160, Seq: 2
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 320, dTS: 160, Seq: 3
-Out TS change: 0, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 10, Transit = 160
-In TS: 480, dTS: 160, Seq: 4
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 9, Transit = 160
-In TS: 640, dTS: 160, Seq: 5
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 8, Transit = 160
-In TS: 960, dTS: 320, Seq: 6
-Out TS change: 320, dTS: 320, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 18, Transit = 0
-In TS: 1120, dTS: 160, Seq: 7
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 17, Transit = 0
-In TS: 1280, dTS: 160, Seq: 8
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 16, Transit = 0
-In TS: 1400, dTS: 120, Seq: 9
-Out TS change: 120, dTS: 120, Seq change: 1, TS Err change: in +1, out +1
-Stats: Jitter = 17, Transit = 40
-In TS: 1560, dTS: 160, Seq: 10
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 16, Transit = 40
-In TS: 1720, dTS: 160, Seq: 11
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 15, Transit = 40
-In TS: 34688, dTS: 0, Seq: 12
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 34848, dTS: 160, Seq: 13
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 35008, dTS: 160, Seq: 14
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 35128, dTS: 120, Seq: 15
-Out TS change: 120, dTS: 120, Seq change: 1, TS Err change: in +1, out +1
-Stats: Jitter = 2, Transit = -32728
-In TS: 35288, dTS: 160, Seq: 16
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 2, Transit = -32728
-In TS: 35448, dTS: 160, Seq: 17
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 2, Transit = -32728
-In TS: 35768, dTS: 160, Seq: 19
-Out TS change: 320, dTS: 160, Seq change: 2, TS Err change: in +0, out +0
-Stats: Jitter = 12, Transit = -32888
-In TS: 35928, dTS: 160, Seq: 20
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 11, Transit = -32888
-In TS: 36088, dTS: 160, Seq: 21
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 20, Transit = -33048
-In TS: 36088, dTS: 160, Seq: 21
-Out TS change: 0, dTS: 160, Seq change: 0, TS Err change: in +0, out +0
-Stats: Jitter = 29, Transit = -32888
-In TS: 36248, dTS: 160, Seq: 22
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 27, Transit = -32888
-In TS: 36408, dTS: 160, Seq: 23
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 25, Transit = -32888
-In TS: 36568, dTS: 160, Seq: 23
-Out TS change: 160, dTS: 160, Seq change: 0, TS Err change: in +1, out +1
-Stats: Jitter = 24, Transit = -32888
-In TS: 36728, dTS: 160, Seq: 24
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 22, Transit = -32888
-In TS: 36888, dTS: 160, Seq: 25
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 21, Transit = -32888
-In TS: 160000, dTS: 0, Seq: 1000
-Out TS change: 12000, dTS: 12000, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-In TS: 160160, dTS: 160, Seq: 1001
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-In TS: 160320, dTS: 160, Seq: 1002
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-Testing packet error detection.
-Output SSRC changed to 11223344
-In TS: 0, dTS: 0, Seq: 0
-Out TS change: 0, dTS: 0, Seq change: 0, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 160, dTS: 160, Seq: 1
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 320, dTS: 160, Seq: 2
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 320, dTS: 160, Seq: 3
-Out TS change: 0, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 10, Transit = 160
-In TS: 480, dTS: 160, Seq: 4
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 9, Transit = 160
-In TS: 640, dTS: 160, Seq: 5
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 8, Transit = 160
-In TS: 960, dTS: 320, Seq: 6
-Out TS change: 320, dTS: 320, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 18, Transit = 0
-In TS: 1120, dTS: 160, Seq: 7
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 17, Transit = 0
-In TS: 1280, dTS: 160, Seq: 8
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 16, Transit = 0
-In TS: 1400, dTS: 120, Seq: 9
-Out TS change: 120, dTS: 120, Seq change: 1, TS Err change: in +1, out +1
-Stats: Jitter = 17, Transit = 40
-In TS: 1560, dTS: 160, Seq: 10
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 16, Transit = 40
-In TS: 1720, dTS: 160, Seq: 11
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 15, Transit = 40
-Output SSRC changed to 10203040
-In TS: 34688, dTS: 0, Seq: 12
-Out TS change: 32968, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 34848, dTS: 160, Seq: 13
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 35008, dTS: 160, Seq: 14
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 35128, dTS: 120, Seq: 15
-Out TS change: 120, dTS: 120, Seq change: 1, TS Err change: in +1, out +1
-Stats: Jitter = 2, Transit = -32728
-In TS: 35288, dTS: 160, Seq: 16
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 2, Transit = -32728
-In TS: 35448, dTS: 160, Seq: 17
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 2, Transit = -32728
-In TS: 35768, dTS: 160, Seq: 19
-Out TS change: 320, dTS: 160, Seq change: 2, TS Err change: in +0, out +0
-Stats: Jitter = 12, Transit = -32888
-In TS: 35928, dTS: 160, Seq: 20
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 11, Transit = -32888
-In TS: 36088, dTS: 160, Seq: 21
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 20, Transit = -33048
-In TS: 36088, dTS: 160, Seq: 21
-Out TS change: 0, dTS: 160, Seq change: 0, TS Err change: in +0, out +0
-Stats: Jitter = 29, Transit = -32888
-In TS: 36248, dTS: 160, Seq: 22
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 27, Transit = -32888
-In TS: 36408, dTS: 160, Seq: 23
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 25, Transit = -32888
-In TS: 36568, dTS: 160, Seq: 23
-Out TS change: 160, dTS: 160, Seq change: 0, TS Err change: in +1, out +1
-Stats: Jitter = 24, Transit = -32888
-In TS: 36728, dTS: 160, Seq: 24
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 22, Transit = -32888
-In TS: 36888, dTS: 160, Seq: 25
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 21, Transit = -32888
-Output SSRC changed to 50607080
-In TS: 160000, dTS: 0, Seq: 1000
-Out TS change: 123112, dTS: 160, Seq change: 975, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-In TS: 160160, dTS: 160, Seq: 1001
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-In TS: 160320, dTS: 160, Seq: 1002
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-Testing packet error detection, patch timestamps.
-Output SSRC changed to 11223344
-In TS: 0, dTS: 0, Seq: 0
-Out TS change: 0, dTS: 0, Seq change: 0, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 160, dTS: 160, Seq: 1
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 320, dTS: 160, Seq: 2
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 320, dTS: 160, Seq: 3
-Out TS change: 0, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 10, Transit = 160
-In TS: 480, dTS: 160, Seq: 4
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 9, Transit = 160
-In TS: 640, dTS: 160, Seq: 5
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 8, Transit = 160
-In TS: 960, dTS: 320, Seq: 6
-Out TS change: 320, dTS: 320, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 18, Transit = 0
-In TS: 1120, dTS: 160, Seq: 7
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 17, Transit = 0
-In TS: 1280, dTS: 160, Seq: 8
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 16, Transit = 0
-In TS: 1400, dTS: 120, Seq: 9
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +1, out +0
-Stats: Jitter = 17, Transit = 40
-In TS: 1560, dTS: 160, Seq: 10
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 16, Transit = 40
-In TS: 1720, dTS: 160, Seq: 11
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 15, Transit = 40
-Output SSRC changed to 10203040
-In TS: 34688, dTS: 0, Seq: 12
-Out TS change: 32968, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 34848, dTS: 160, Seq: 13
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 35008, dTS: 160, Seq: 14
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 35128, dTS: 120, Seq: 15
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +1, out +0
-Stats: Jitter = 2, Transit = -32728
-In TS: 35288, dTS: 160, Seq: 16
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 2, Transit = -32728
-In TS: 35448, dTS: 160, Seq: 17
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 2, Transit = -32728
-In TS: 35768, dTS: 160, Seq: 19
-Out TS change: 320, dTS: 160, Seq change: 2, TS Err change: in +0, out +0
-Stats: Jitter = 12, Transit = -32888
-In TS: 35928, dTS: 160, Seq: 20
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 11, Transit = -32888
-In TS: 36088, dTS: 160, Seq: 21
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 20, Transit = -33048
-In TS: 36088, dTS: 160, Seq: 21
-Out TS change: 0, dTS: 160, Seq change: 0, TS Err change: in +0, out +0
-Stats: Jitter = 29, Transit = -32888
-In TS: 36248, dTS: 160, Seq: 22
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 27, Transit = -32888
-In TS: 36408, dTS: 160, Seq: 23
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 25, Transit = -32888
-In TS: 36568, dTS: 160, Seq: 23
-Out TS change: 160, dTS: 160, Seq change: 0, TS Err change: in +1, out +1
-Stats: Jitter = 24, Transit = -32888
-In TS: 36728, dTS: 160, Seq: 24
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 22, Transit = -32888
-In TS: 36888, dTS: 160, Seq: 25
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 21, Transit = -32888
-Output SSRC changed to 50607080
-In TS: 160000, dTS: 0, Seq: 1000
-Out TS change: 123112, dTS: 160, Seq change: 975, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-In TS: 160160, dTS: 160, Seq: 1001
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-In TS: 160320, dTS: 160, Seq: 1002
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-Testing packet error detection, patch SSRC, patch timestamps.
-Output SSRC changed to 11223344
-In TS: 0, dTS: 0, Seq: 0
-Out TS change: 0, dTS: 0, Seq change: 0, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 160, dTS: 160, Seq: 1
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 320, dTS: 160, Seq: 2
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = 0
-In TS: 320, dTS: 160, Seq: 3
-Out TS change: 0, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 10, Transit = 160
-In TS: 480, dTS: 160, Seq: 4
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 9, Transit = 160
-In TS: 640, dTS: 160, Seq: 5
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 8, Transit = 160
-In TS: 960, dTS: 320, Seq: 6
-Out TS change: 320, dTS: 320, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 18, Transit = 0
-In TS: 1120, dTS: 160, Seq: 7
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 17, Transit = 0
-In TS: 1280, dTS: 160, Seq: 8
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 16, Transit = 0
-In TS: 1400, dTS: 120, Seq: 9
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +1, out +0
-Stats: Jitter = 17, Transit = 40
-In TS: 1560, dTS: 160, Seq: 10
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 16, Transit = 40
-In TS: 1720, dTS: 160, Seq: 11
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 15, Transit = 40
-In TS: 34688, dTS: 0, Seq: 12
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 34848, dTS: 160, Seq: 13
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 35008, dTS: 160, Seq: 14
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -32768
-In TS: 35128, dTS: 120, Seq: 15
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +1, out +0
-Stats: Jitter = 2, Transit = -32728
-In TS: 35288, dTS: 160, Seq: 16
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 2, Transit = -32728
-In TS: 35448, dTS: 160, Seq: 17
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 2, Transit = -32728
-In TS: 35768, dTS: 160, Seq: 19
-Out TS change: 320, dTS: 160, Seq change: 2, TS Err change: in +0, out +0
-Stats: Jitter = 12, Transit = -32888
-In TS: 35928, dTS: 160, Seq: 20
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 11, Transit = -32888
-In TS: 36088, dTS: 160, Seq: 21
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 20, Transit = -33048
-In TS: 36088, dTS: 160, Seq: 21
-Out TS change: 0, dTS: 160, Seq change: 0, TS Err change: in +0, out +0
-Stats: Jitter = 29, Transit = -32888
-In TS: 36248, dTS: 160, Seq: 22
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 27, Transit = -32888
-In TS: 36408, dTS: 160, Seq: 23
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 25, Transit = -32888
-In TS: 36568, dTS: 160, Seq: 23
-Out TS change: 160, dTS: 160, Seq change: 0, TS Err change: in +1, out +1
-Stats: Jitter = 24, Transit = -32888
-In TS: 36728, dTS: 160, Seq: 24
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 22, Transit = -32888
-In TS: 36888, dTS: 160, Seq: 25
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 21, Transit = -32888
-In TS: 160000, dTS: 0, Seq: 1000
-Out TS change: 12000, dTS: 12000, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-In TS: 160160, dTS: 160, Seq: 1001
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-In TS: 160320, dTS: 160, Seq: 1002
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 0, Transit = -144000
-Testing multiple payload types
-Testing no sequence flow on initial packet
-Testing no rtpmap name
-Done
diff --git a/tests/legacy_mgcp/mgcp_transcoding_test.c b/tests/legacy_mgcp/mgcp_transcoding_test.c
deleted file mode 100644
index d3f94c7..0000000
--- a/tests/legacy_mgcp/mgcp_transcoding_test.c
+++ /dev/null
@@ -1,662 +0,0 @@
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <err.h>
-#include <stdint.h>
-#include <errno.h>
-
-#include <osmocom/core/talloc.h>
-#include <osmocom/core/application.h>
-
-#include <osmocom/netif/rtp.h>
-
-#include <osmocom/legacy_mgcp/mgcp.h>
-#include <osmocom/legacy_mgcp/mgcp_internal.h>
-
-#include "bscconfig.h"
-#ifndef BUILD_MGCP_TRANSCODING
-#error "Requires MGCP transcoding enabled (see --enable-mgcp-transcoding)"
-#endif
-
-#include <osmocom/legacy_mgcp/mgcp_transcode.h>
-
-uint8_t *audio_frame_l16[] = {
-};
-
-struct rtp_packets {
-	float t;
-	int len;
-	char *data;
-};
-
-struct rtp_packets audio_packets_l16[] = {
-	/* RTP: SeqNo=1, TS=160 */
-	{0.020000, 332,
-		"\x80\x0B\x00\x01\x00\x00\x00\xA0\x11\x22\x33\x44"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-		"\x00\x00\x40\x13\x5A\x9E\x40\x13\x00\x00\xBF\xED\xA5\x62\xBF\xED"
-	},
-};
-
-struct rtp_packets audio_packets_gsm[] = {
-	/* RTP: SeqNo=1, TS=160 */
-	{0.020000, 45,
-		"\x80\x03\x00\x01\x00\x00\x00\xA0\x11\x22\x33\x44"
-		"\xD4\x7C\xE3\xE9\x62\x50\x39\xF0\xF8\xB4\x68\xEA\x6C\x0E\x81\x1B"
-		"\x56\x2A\xD5\xBC\x69\x9C\xD1\xF0\x66\x7A\xEC\x49\x7A\x33\x3D\x0A"
-		"\xDE"
-	},
-};
-
-struct rtp_packets audio_packets_gsm_invalid_size[] = {
-	/* RTP: SeqNo=1, TS=160 */
-	{0.020000, 41,
-		"\x80\x03\x00\x01\x00\x00\x00\xA0\x11\x22\x33\x44"
-		"\xD4\x7C\xE3\xE9\x62\x50\x39\xF0\xF8\xB4\x68\xEA\x6C\x0E\x81\x1B"
-		"\x56\x2A\xD5\xBC\x69\x9C\xD1\xF0\x66\x7A\xEC\x49\x7A\x33\x3D\x0A"
-		"\xDE"
-	},
-};
-
-struct rtp_packets audio_packets_gsm_invalid_data[] = {
-	/* RTP: SeqNo=1, TS=160 */
-	{0.020000, 45,
-		"\x80\x03\x00\x01\x00\x00\x00\xA0\x11\x22\x33\x44"
-		"\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE"
-		"\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE\xEE"
-		"\xEE"
-	},
-};
-
-struct rtp_packets audio_packets_gsm_invalid_ptype[] = {
-	/* RTP: SeqNo=1, TS=160 */
-	{0.020000, 45,
-		"\x80\x08\x00\x01\x00\x00\x00\xA0\x11\x22\x33\x44"
-		"\xD4\x7C\xE3\xE9\x62\x50\x39\xF0\xF8\xB4\x68\xEA\x6C\x0E\x81\x1B"
-		"\x56\x2A\xD5\xBC\x69\x9C\xD1\xF0\x66\x7A\xEC\x49\x7A\x33\x3D\x0A"
-		"\xDE"
-	},
-};
-
-struct rtp_packets audio_packets_g729[] = {
-	/* RTP: SeqNo=1, TS=160 */
-	{0.020000, 32,
-		"\x80\x12\x00\x01\x00\x00\x00\xA0\x11\x22\x33\x44"
-		"\xAF\xC2\x81\x40\x00\xFA\xCE\xA4\x21\x7C\xC5\xC3\x4F\xA5\x98\xF5"
-		"\xB2\x95\xC4\xAD"
-	},
-};
-
-struct rtp_packets audio_packets_pcma[] = {
-	/* RTP: SeqNo=1, TS=160 */
-	{0.020000, 172,
-		"\x80\x08\x00\x01\x00\x00\x00\xA0\x11\x22\x33\x44"
-		"\xD5\xA5\xA3\xA5\xD5\x25\x23\x25\xD5\xA5\xA3\xA5\xD5\x25\x23\x25"
-		"\xD5\xA5\xA3\xA5\xD5\x25\x23\x25\xD5\xA5\xA3\xA5\xD5\x25\x23\x25"
-		"\xD5\xA5\xA3\xA5\xD5\x25\x23\x25\xD5\xA5\xA3\xA5\xD5\x25\x23\x25"
-		"\xD5\xA5\xA3\xA5\xD5\x25\x23\x25\xD5\xA5\xA3\xA5\xD5\x25\x23\x25"
-		"\xD5\xA5\xA3\xA5\xD5\x25\x23\x25\xD5\xA5\xA3\xA5\xD5\x25\x23\x25"
-		"\xD5\xA5\xA3\xA5\xD5\x25\x23\x25\xD5\xA5\xA3\xA5\xD5\x25\x23\x25"
-		"\xD5\xA5\xA3\xA5\xD5\x25\x23\x25\xD5\xA5\xA3\xA5\xD5\x25\x23\x25"
-		"\xD5\xA5\xA3\xA5\xD5\x25\x23\x25\xD5\xA5\xA3\xA5\xD5\x25\x23\x25"
-		"\xD5\xA5\xA3\xA5\xD5\x25\x23\x25\xD5\xA5\xA3\xA5\xD5\x25\x23\x25"
-		"\xD5\xA5\xA3\xA5\xD5\x25\x23\x25\xD5\xA5\xA3\xA5\xD5\x25\x23\x25"
-	},
-	/* RTP: SeqNo=26527, TS=232640 */
-	{0.020000, 92,
-		"\x80\x08\x67\x9f\x00\x03\x8c\xc0\x04\xaa\x67\x9f\xd5\xd5\xd5\xd5"
-		"\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5"
-		"\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5"
-		"\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5\xd5"
-		"\xd5\xd5\xd5\xd5\xd5\xd5\x55\x55\xd5\xd5\x55\x55\xd5\xd5\x55\x55"
-		"\xd5\xd5\xd5\x55\x55\xd5\xd5\xd5\x55\x55\xd5\xd5"
-	},
-	/* RTP: SeqNo=26528, TS=232720 */
-	{0.020000, 92,
-		"\x80\x08\x67\xa0\x00\x03\x8d\x10\x04\xaa\x67\x9f\x55\xd5\xd5\x55"
-		"\xd5\x55\xd5\xd5\xd5\x55\xd5\x55\xd5\xd5\x55\xd5\x55\xd5\x55\xd5"
-		"\x55\x55\xd5\x55\xd5\xd5\x55\x55\x55\x55\x55\xd5\xd5\x55\xd5\xd5"
-		"\xd5\x55\xd5\xd5\xd5\x55\x54\x55\xd5\xd5\x55\xd5\xd5\xd5\xd5\x55"
-		"\x54\x55\xd5\x55\xd5\x55\x55\x55\x55\x55\xd5\xd5\xd5\xd5\xd5\xd4"
-		"\xd5\x54\x55\xd5\xd4\xd5\x54\xd5\x55\xd5\xd5\xd5"
-	},
-};
-
-
-
-static int audio_name_to_type(const char *name)
-{
-	if (!strcasecmp(name, "gsm"))
-		return 3;
-#ifdef HAVE_BCG729
-	else if (!strcasecmp(name, "g729"))
-		return 18;
-#endif
-	else if (!strcasecmp(name, "pcma"))
-		return 8;
-	else if (!strcasecmp(name, "l16"))
-		return 11;
-	return -1;
-}
-
-int mgcp_get_trans_frame_size(void *state_, int nsamples, int dst);
-
-static int given_configured_endpoint(int in_samples, int out_samples,
-				const char *srcfmt, const char *dstfmt,
-				void **out_ctx, struct mgcp_endpoint **out_endp)
-{
-	int rc;
-	struct mgcp_rtp_end *dst_end;
-	struct mgcp_rtp_end *src_end;
-	struct mgcp_config *cfg;
-	struct mgcp_trunk_config *tcfg;
-	struct mgcp_endpoint *endp;
-
-	cfg = mgcp_config_alloc();
-	tcfg = talloc_zero(cfg, struct mgcp_trunk_config);
-	endp = talloc_zero(tcfg, struct mgcp_endpoint);
-
-	cfg->setup_rtp_processing_cb = mgcp_transcoding_setup;
-	cfg->rtp_processing_cb = mgcp_transcoding_process_rtp;
-	cfg->get_net_downlink_format_cb = mgcp_transcoding_net_downlink_format;
-
-	tcfg->endpoints = endp;
-	tcfg->number_endpoints = 1;
-	tcfg->cfg = cfg;
-	endp->tcfg = tcfg;
-	endp->cfg = cfg;
-	mgcp_initialize_endp(endp);
-
-	dst_end = &endp->bts_end;
-	dst_end->codec.payload_type = audio_name_to_type(dstfmt);
-
-	src_end = &endp->net_end;
-	src_end->codec.payload_type = audio_name_to_type(srcfmt);
-
-	if (out_samples) {
-		dst_end->codec.frame_duration_den = dst_end->codec.rate;
-		dst_end->codec.frame_duration_num = out_samples;
-		dst_end->frames_per_packet = 1;
-		dst_end->force_output_ptime = 1;
-	}
-
-	rc = mgcp_transcoding_setup(endp, dst_end, src_end);
-	if (rc < 0) {
-		printf("setup failed: %s", strerror(-rc));
-		abort();
-	}
-
-	*out_ctx = cfg;
-	*out_endp = endp;
-	return 0;
-}
-
-
-static int transcode_test(const char *srcfmt, const char *dstfmt,
-			  uint8_t *src_pkts, size_t src_pkt_size)
-{
-	char buf[4096] = {0x80, 0};
-	void *ctx;
-
-	struct mgcp_rtp_end *dst_end;
-	struct mgcp_process_rtp_state *state;
-	struct mgcp_endpoint *endp;
-	int in_size;
-	const int in_samples = 160;
-	int len, cont;
-
-	printf("== Transcoding test ==\n");
-	printf("converting %s -> %s\n", srcfmt, dstfmt);
-
-	given_configured_endpoint(in_samples, 0, srcfmt, dstfmt, &ctx, &endp);
-
-	dst_end = &endp->bts_end;
-	state = dst_end->rtp_process_data;
-	OSMO_ASSERT(state != NULL);
-
-	in_size = mgcp_transcoding_get_frame_size(state, in_samples, 0);
-	OSMO_ASSERT(sizeof(buf) >= in_size + 12);
-
-	memcpy(buf, src_pkts, src_pkt_size);
-
-	len = src_pkt_size;
-
-	cont = mgcp_transcoding_process_rtp(endp, dst_end,
-					    buf, &len, sizeof(buf));
-	if (cont < 0) {
-		printf("Nothing encoded due: %s\n", strerror(-cont));
-		talloc_free(ctx);
-		return -1;
-	}
-
-	if (len < 24) {
-		printf("encoded: %s\n", osmo_hexdump((unsigned char *)buf, len));
-	} else {
-		const char *str = osmo_hexdump((unsigned char *)buf, len);
-		int i = 0;
-		const int prefix = 4;
-		const int cutlen = 48;
-		int nchars = 0;
-
-		printf("encoded:\n");
-		do {
-			nchars = printf("%*s%-.*s", prefix, "", cutlen, str + i);
-			i += nchars - prefix;
-			printf("\n");
-		} while (nchars - prefix >= cutlen);
-	}
-	printf("counted: %d\n", cont);
-	talloc_free(ctx);
-	return 0;
-}
-
-static void test_rtp_seq_state(void)
-{
-	char buf[4096];
-	int len;
-	int cont;
-	void *ctx;
-	struct mgcp_endpoint *endp;
-	struct mgcp_process_rtp_state *state;
-	struct rtp_hdr *hdr;
-	uint32_t ts_no;
-	uint16_t seq_no;
-
-	given_configured_endpoint(160, 0, "pcma", "l16", &ctx, &endp);
-	state = endp->bts_end.rtp_process_data;
-	OSMO_ASSERT(!state->is_running);
-	OSMO_ASSERT(state->next_seq == 0);
-	OSMO_ASSERT(state->next_time == 0);
-
-	/* initialize packet */
-	len = audio_packets_pcma[0].len;
-	memcpy(buf, audio_packets_pcma[0].data, len);
-	cont = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, len);
-	OSMO_ASSERT(cont >= 0);
-	OSMO_ASSERT(state->is_running);
-	OSMO_ASSERT(state->next_seq == 2);
-	OSMO_ASSERT(state->next_time == 240);
-
-	/* verify that the right timestamp was written */
-	OSMO_ASSERT(len == audio_packets_pcma[0].len);
-	hdr = (struct rtp_hdr *) &buf[0];
-
-	memcpy(&ts_no, &hdr->timestamp, sizeof(ts_no));
-	OSMO_ASSERT(htonl(ts_no) == 160);
-	memcpy(&seq_no, &hdr->sequence, sizeof(seq_no));
-	OSMO_ASSERT(htons(seq_no) == 1);
-	/* Check the right sequence number is written */
-	state->next_seq = 1234;
-	len = audio_packets_pcma[0].len;
-	memcpy(buf, audio_packets_pcma[0].data, len);
-	cont = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, len);
-	OSMO_ASSERT(cont >= 0);
-	OSMO_ASSERT(len == audio_packets_pcma[0].len);
-	hdr = (struct rtp_hdr *) &buf[0];
-
-	memcpy(&seq_no, &hdr->sequence, sizeof(seq_no));
-	OSMO_ASSERT(htons(seq_no) == 1234);
-
-	talloc_free(ctx);
-}
-
-static void test_transcode_result(void)
-{
-	char buf[4096];
-	int len, res;
-	void *ctx;
-	struct mgcp_endpoint *endp;
-	struct mgcp_process_rtp_state *state;
-
-	{
-		/* from GSM to PCMA and same ptime */
-		given_configured_endpoint(160, 0, "gsm", "pcma", &ctx, &endp);
-		state = endp->bts_end.rtp_process_data;
-
-		/* result */
-		len = audio_packets_gsm[0].len;
-		memcpy(buf, audio_packets_gsm[0].data, len);
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(res == sizeof(struct rtp_hdr));
-		OSMO_ASSERT(state->sample_cnt == 0);
-
-		len = res;
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(res == -ENOMSG);
-
-		talloc_free(ctx);
-	}
-
-	{
-		/* from GSM to PCMA and same ptime */
-		given_configured_endpoint(160, 160, "gsm", "pcma", &ctx, &endp);
-		state = endp->bts_end.rtp_process_data;
-
-		/* result */
-		len = audio_packets_gsm[0].len;
-		memcpy(buf, audio_packets_gsm[0].data, len);
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(res == sizeof(struct rtp_hdr));
-		OSMO_ASSERT(state->sample_cnt == 0);
-
-		len = res;
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(res == -EAGAIN);
-
-		talloc_free(ctx);
-	}
-
-	{
-		/* from PCMA to GSM and wrong different ptime */
-		given_configured_endpoint(80, 160, "pcma", "gsm", &ctx, &endp);
-		state = endp->bts_end.rtp_process_data;
-
-		/* Add the first sample */
-		len = audio_packets_pcma[1].len;
-		memcpy(buf, audio_packets_pcma[1].data, len);
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(state->sample_cnt == 80);
-		OSMO_ASSERT(state->next_time == 232640);
-		OSMO_ASSERT(res < 0);
-
-		/* Add the second sample and it should be consumable */
-		len = audio_packets_pcma[2].len;
-		memcpy(buf, audio_packets_pcma[2].data, len);
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(state->sample_cnt == 0);
-		OSMO_ASSERT(state->next_time == 232640 + 80 + 160);
-		OSMO_ASSERT(res == sizeof(struct rtp_hdr));
-
-		talloc_free(ctx);
-	}
-
-	{
-		/* from PCMA to GSM with a big time jump */
-		struct rtp_hdr *hdr;
-		uint32_t ts;
-
-		given_configured_endpoint(80, 160, "pcma", "gsm", &ctx, &endp);
-		state = endp->bts_end.rtp_process_data;
-
-		/* Add the first sample */
-		len = audio_packets_pcma[1].len;
-		memcpy(buf, audio_packets_pcma[1].data, len);
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(state->sample_cnt == 80);
-		OSMO_ASSERT(state->next_time == 232640);
-		OSMO_ASSERT(state->next_seq == 26527);
-		OSMO_ASSERT(res < 0);
-
-		/* Add a skip to the packet to force a 'resync' */
-		len = audio_packets_pcma[2].len;
-		memcpy(buf, audio_packets_pcma[2].data, len);
-		hdr = (struct rtp_hdr *) &buf[0];
-		/* jump the time and add alignment error */
-		ts = ntohl(hdr->timestamp) + 123 * 80 + 2;
-		hdr->timestamp = htonl(ts);
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(res < 0);
-		OSMO_ASSERT(state->sample_cnt == 80);
-		OSMO_ASSERT(state->next_time == ts);
-		OSMO_ASSERT(state->next_seq == 26527);
-		/* TODO: this can create alignment errors */
-
-
-		/* Now attempt to consume 160 samples */
-		len = audio_packets_pcma[2].len;
-		memcpy(buf, audio_packets_pcma[2].data, len);
-		hdr = (struct rtp_hdr *) &buf[0];
-		ts += 80;
-		hdr->timestamp = htonl(ts);
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(res == 12);
-		OSMO_ASSERT(state->sample_cnt == 0);
-		OSMO_ASSERT(state->next_time == ts + 160);
-		OSMO_ASSERT(state->next_seq == 26528);
-
-		talloc_free(ctx);
-	}
-}
-
-static void test_transcode_change(void)
-{
-	char buf[4096] = {0x80, 0};
-	void *ctx;
-
-	struct mgcp_endpoint *endp;
-	struct mgcp_process_rtp_state *state;
-	struct rtp_hdr *hdr;
-
-	int len, res;
-
-	{
-		/* from GSM to PCMA and same ptime */
-		printf("Testing Initial L16->GSM, PCMA->GSM\n");
-		given_configured_endpoint(160, 0, "l16", "gsm", &ctx, &endp);
-		endp->net_end.alt_codec = endp->net_end.codec;
-		endp->net_end.alt_codec.payload_type = audio_name_to_type("pcma");
-		state = endp->bts_end.rtp_process_data;
-
-		/* initial transcoding work */
-		OSMO_ASSERT(state->src_fmt == AF_L16);
-		OSMO_ASSERT(state->dst_fmt == AF_GSM);
-		OSMO_ASSERT(endp->net_end.alt_codec.payload_type == 8);
-		OSMO_ASSERT(endp->net_end.codec.payload_type == 11);
-
-		/* result */
-		len = audio_packets_pcma[0].len;
-		memcpy(buf, audio_packets_pcma[0].data, len);
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		state = endp->bts_end.rtp_process_data;
-		OSMO_ASSERT(res == sizeof(struct rtp_hdr));
-		OSMO_ASSERT(state->sample_cnt == 0);
-		OSMO_ASSERT(state->src_fmt == AF_PCMA);
-		OSMO_ASSERT(state->dst_fmt == AF_GSM);
-		OSMO_ASSERT(endp->net_end.alt_codec.payload_type == 11);
-		OSMO_ASSERT(endp->net_end.codec.payload_type == 8);
-
-		len = res;
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(res == -ENOMSG);
-		OSMO_ASSERT(state == endp->bts_end.rtp_process_data);
-
-
-		/* now check that comfort noise doesn't change anything */
-		len = audio_packets_pcma[1].len;
-		memcpy(buf, audio_packets_pcma[1].data, len);
-		hdr = (struct rtp_hdr *) buf;
-		hdr->payload_type = 12;
-		res = mgcp_transcoding_process_rtp(endp, &endp->bts_end, buf, &len, ARRAY_SIZE(buf));
-		OSMO_ASSERT(state == endp->bts_end.rtp_process_data);
-		OSMO_ASSERT(state->sample_cnt == 80);
-		OSMO_ASSERT(state->src_fmt == AF_PCMA);
-		OSMO_ASSERT(state->dst_fmt == AF_GSM);
-		OSMO_ASSERT(endp->net_end.alt_codec.payload_type == 11);
-		OSMO_ASSERT(endp->net_end.codec.payload_type == 8);
-
-		talloc_free(ctx);
-	}
-}
-
-static int test_repacking(int in_samples, int out_samples, int no_transcode)
-{
-	char buf[4096] = {0x80, 0};
-	int cc;
-	struct mgcp_endpoint *endp;
-	void *ctx;
-
-	struct mgcp_process_rtp_state *state;
-	int in_cnt;
-	int out_size;
-	int in_size;
-	uint32_t ts = 0;
-	uint16_t seq = 0;
-	const char *srcfmt = "pcma";
-	const char *dstfmt = no_transcode ? "pcma" : "l16";
-
-	printf("== Transcoding test ==\n");
-	printf("converting %s -> %s\n", srcfmt, dstfmt);
-
-	given_configured_endpoint(in_samples, out_samples, srcfmt, dstfmt, &ctx, &endp);
-
-	state = endp->bts_end.rtp_process_data;
-	OSMO_ASSERT(state != NULL);
-
-	in_size = mgcp_transcoding_get_frame_size(state, in_samples, 0);
-	OSMO_ASSERT(sizeof(buf) >= in_size + 12);
-
-	out_size = mgcp_transcoding_get_frame_size(state, -1, 1);
-	OSMO_ASSERT(sizeof(buf) >= out_size + 12);
-
-	buf[1] = endp->net_end.codec.payload_type;
-	*(uint16_t*)(buf+2) = htons(1);
-	*(uint32_t*)(buf+4) = htonl(0);
-	*(uint32_t*)(buf+8) = htonl(0xaabbccdd);
-
-	for (in_cnt = 0; in_cnt < 16; in_cnt++) {
-		int cont;
-		int len;
-
-		/* fake PCMA data */
-		printf("generating %d %s input samples\n", in_samples, srcfmt);
-		for (cc = 0; cc < in_samples; cc++)
-			buf[12+cc] = cc;
-
-		*(uint16_t*)(buf+2) = htonl(seq);
-		*(uint32_t*)(buf+4) = htonl(ts);
-
-		seq += 1;
-		ts += in_samples;
-
-		cc += 12; /* include RTP header */
-
-		len = cc;
-
-		do {
-			cont = mgcp_transcoding_process_rtp(endp, &endp->bts_end,
-							    buf, &len, sizeof(buf));
-			if (cont == -EAGAIN) {
-				fprintf(stderr, "Got EAGAIN\n");
-				break;
-			}
-
-			if (cont < 0) {
-				printf("processing failed: %s", strerror(-cont));
-				abort();
-			}
-
-			len -= 12; /* ignore RTP header */
-
-			printf("got %d %s output frames (%d octets) count=%d\n",
-			       len / out_size, dstfmt, len, cont);
-
-			len = cont;
-		} while (len > 0);
-	}
-
-	talloc_free(ctx);
-	return 0;
-}
-
-static const struct log_info_cat log_categories[] = {
-};
-
-const struct log_info log_info = {
-        .cat = log_categories,
-        .num_cat = ARRAY_SIZE(log_categories),
-};
-
-int main(int argc, char **argv)
-{
-	int rc;
-	void *ctx = talloc_named_const(NULL, 0, "mgcp_transcoding_test");
-	osmo_init_logging2(ctx, &log_info);
-
-	printf("=== Transcoding Good Cases ===\n");
-
-	transcode_test("l16", "l16",
-		       (uint8_t *)audio_packets_l16[0].data,
-		       audio_packets_l16[0].len);
-	transcode_test("l16", "gsm",
-		       (uint8_t *)audio_packets_l16[0].data,
-		       audio_packets_l16[0].len);
-	transcode_test("l16", "pcma",
-		       (uint8_t *)audio_packets_l16[0].data,
-		       audio_packets_l16[0].len);
-	transcode_test("gsm", "l16",
-		       (uint8_t *)audio_packets_gsm[0].data,
-		       audio_packets_gsm[0].len);
-	transcode_test("gsm", "gsm",
-		       (uint8_t *)audio_packets_gsm[0].data,
-		       audio_packets_gsm[0].len);
-	transcode_test("gsm", "pcma",
-		       (uint8_t *)audio_packets_gsm[0].data,
-		       audio_packets_gsm[0].len);
-	transcode_test("pcma", "l16",
-		       (uint8_t *)audio_packets_pcma[0].data,
-		       audio_packets_pcma[0].len);
-	transcode_test("pcma", "gsm",
-		       (uint8_t *)audio_packets_pcma[0].data,
-		       audio_packets_pcma[0].len);
-	transcode_test("pcma", "pcma",
-		       (uint8_t *)audio_packets_pcma[0].data,
-		       audio_packets_pcma[0].len);
-
-	printf("=== Transcoding Bad Cases ===\n");
-
-	printf("Invalid size:\n");
-	rc = transcode_test("gsm", "pcma",
-		       (uint8_t *)audio_packets_gsm_invalid_size[0].data,
-		       audio_packets_gsm_invalid_size[0].len);
-	OSMO_ASSERT(rc < 0);
-
-	printf("Invalid data:\n");
-	rc = transcode_test("gsm", "pcma",
-		       (uint8_t *)audio_packets_gsm_invalid_data[0].data,
-		       audio_packets_gsm_invalid_data[0].len);
-	OSMO_ASSERT(rc < 0);
-
-	printf("Invalid payload type:\n");
-	rc = transcode_test("gsm", "pcma",
-		       (uint8_t *)audio_packets_gsm_invalid_ptype[0].data,
-		       audio_packets_gsm_invalid_ptype[0].len);
-	OSMO_ASSERT(rc == 0);
-
-	printf("=== Repacking ===\n");
-
-	test_repacking(160, 160, 0);
-	test_repacking(160, 160, 1);
-	test_repacking(160, 80, 0);
-	test_repacking(160, 80, 1);
-	test_repacking(160, 320, 0);
-	test_repacking(160, 320, 1);
-	test_repacking(160, 240, 0);
-	test_repacking(160, 240, 1);
-	test_repacking(160, 100, 0);
-	test_repacking(160, 100, 1);
-	test_rtp_seq_state();
-	test_transcode_result();
-	test_transcode_change();
-
-	return 0;
-}
-
diff --git a/tests/legacy_mgcp/mgcp_transcoding_test.ok b/tests/legacy_mgcp/mgcp_transcoding_test.ok
deleted file mode 100644
index 387cfd2..0000000
--- a/tests/legacy_mgcp/mgcp_transcoding_test.ok
+++ /dev/null
@@ -1,539 +0,0 @@
-=== Transcoding Good Cases ===
-== Transcoding test ==
-converting l16 -> l16
-encoded:
-    80 0b 00 01 00 00 00 a0 11 22 33 44 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 00 00 40 13 
-    5a 9e 40 13 00 00 bf ed a5 62 bf ed 
-counted: 0
-== Transcoding test ==
-converting l16 -> gsm
-encoded:
-    80 0b 00 01 00 00 00 a0 11 22 33 44 d4 7c e3 e9 
-    62 50 39 f0 f8 b4 68 ea 6c 0e 81 1b 56 2a d5 bc 
-    69 9c d1 f0 66 7a ec 49 7a 33 3d 0a de 
-counted: 12
-== Transcoding test ==
-converting l16 -> pcma
-encoded:
-    80 0b 00 01 00 00 00 a0 11 22 33 44 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 
-counted: 12
-== Transcoding test ==
-converting gsm -> l16
-encoded:
-    80 03 00 01 00 00 00 a0 11 22 33 44 00 00 54 00 
-    59 f0 34 20 c4 c8 b9 f8 e2 18 f1 e8 f2 28 f0 e0 
-    46 08 4f 80 2c a0 a9 c8 80 00 c0 58 3f 80 63 c0 
-    24 b8 fa b8 f6 88 0b a0 c8 70 a8 b0 c8 c0 3b a8 
-    66 a0 2e 38 d1 f8 98 98 aa 18 e8 30 26 a0 37 40 
-    37 e8 17 00 ee 50 b7 80 b1 88 de 28 18 40 45 b0 
-    4f 48 21 d8 df 78 ae 68 ab 98 d6 b8 18 18 48 90 
-    4e 70 27 40 e8 10 b5 b0 ac 80 d4 60 14 50 48 48 
-    50 10 2a 00 ec 08 ba 00 af 58 d1 c0 10 60 45 c8 
-    54 10 30 78 f1 a8 bb 18 ad 48 ce 30 0a e8 3f 30 
-    4f 10 32 18 f6 18 bf 20 ac 30 cd 80 0b d0 43 d8 
-    55 e0 34 a0 f5 78 bc 98 ad 98 cd c8 0a 80 40 58 
-    51 c0 35 40 f9 60 c1 68 ac c8 cb 38 08 00 40 98 
-    51 e0 34 d8 fa 28 c2 f0 ae 40 c7 70 02 d0 3c a8 
-    54 78 38 a0 fc 68 c2 08 ad 50 c7 78 01 60 39 c0 
-    51 38 3a e8 00 e8 c6 38 ab d8 c4 00 fe 08 39 18 
-    50 30 39 50 01 d8 ca 70 b1 80 c4 c8 fc 58 36 40 
-    51 d8 3b 08 02 80 c8 58 b0 60 c5 a8 fb d0 33 e8 
-    4e 80 3c e0 06 10 cb 90 ae 48 c2 60 f9 58 34 08 
-    4d a0 3a a8 06 48 cf 80 b4 60 c3 e8 f7 90 30 18 
-    4d a0 3b 98 07 90 cf 18 b4 68 c4 88 
-counted: 12
-== Transcoding test ==
-converting gsm -> gsm
-encoded:
-    80 03 00 01 00 00 00 a0 11 22 33 44 d4 7c e3 e9 
-    62 50 39 f0 f8 b4 68 ea 6c 0e 81 1b 56 2a d5 bc 
-    69 9c d1 f0 66 7a ec 49 7a 33 3d 0a de 
-counted: 0
-== Transcoding test ==
-converting gsm -> pcma
-encoded:
-    80 03 00 01 00 00 00 a0 11 22 33 44 d5 a0 a3 bf 
-    38 24 08 19 1e 1b a4 a6 b3 20 2a 3a ba ad b7 60 
-    17 92 3e 20 3e b8 ac b2 32 2c 20 02 b6 be be 82 
-    04 27 26 35 8d a4 a6 b5 35 21 20 31 8d a7 a6 b6 
-    02 27 21 30 81 a7 a1 b0 06 24 21 32 85 a4 a0 bd 
-    19 24 21 3d 90 ba a6 bc 16 25 21 3c 92 a5 a0 bf 
-    10 25 21 3c 90 a5 a1 bf 6f 3a 21 3f 95 a5 a1 bf 
-    62 3b 21 39 f3 bb a0 b9 79 3b 21 39 c3 b9 a1 b8 
-    db 39 20 3b 4a b9 a1 b9 c8 3f 26 38 78 be a1 b8 
-    f1 3e 26 38 65 bc a6 bb ed 3f 21 3b 6f bf a6 b8 
-    ec 3d 27 3b 15 bd a6 b8 eb 3d 27 38 
-counted: 12
-== Transcoding test ==
-converting pcma -> l16
-encoded:
-    80 08 00 01 00 00 00 a0 11 22 33 44 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 00 08 42 00 
-    5a 00 42 00 00 08 be 00 a6 00 be 00 
-counted: 12
-== Transcoding test ==
-converting pcma -> gsm
-encoded:
-    80 08 00 01 00 00 00 a0 11 22 33 44 d4 b9 f4 5d 
-    d9 50 5a e1 a0 cd 76 ea 52 0e 87 53 ad d4 ea a2 
-    0a 63 ca e9 60 79 e2 2a 25 d2 c0 f3 39 
-counted: 12
-== Transcoding test ==
-converting pcma -> pcma
-encoded:
-    80 08 00 01 00 00 00 a0 11 22 33 44 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 d5 a5 a3 a5 
-    d5 25 23 25 d5 a5 a3 a5 d5 25 23 25 
-counted: 0
-=== Transcoding Bad Cases ===
-Invalid size:
-== Transcoding test ==
-converting gsm -> pcma
-Nothing encoded due: No message of desired type
-Invalid data:
-== Transcoding test ==
-converting gsm -> pcma
-Nothing encoded due: No message of desired type
-Invalid payload type:
-== Transcoding test ==
-converting gsm -> pcma
-encoded:
-    80 08 00 01 00 00 00 a0 11 22 33 44 d5 a0 a3 bf 
-    38 24 08 19 1e 1b a4 a6 b3 20 2a 3a ba ad b7 60 
-    17 92 3e 20 3e b8 ac b2 32 2c 20 02 b6 be be 82 
-    04 27 26 35 8d a4 a6 b5 35 21 20 31 8d a7 a6 b6 
-    02 27 21 30 81 a7 a1 b0 06 24 21 32 85 a4 a0 bd 
-    19 24 21 3d 90 ba a6 bc 16 25 21 3c 92 a5 a0 bf 
-    10 25 21 3c 90 a5 a1 bf 6f 3a 21 3f 95 a5 a1 bf 
-    62 3b 21 39 f3 bb a0 b9 79 3b 21 39 c3 b9 a1 b8 
-    db 39 20 3b 4a b9 a1 b9 c8 3f 26 38 78 be a1 b8 
-    f1 3e 26 38 65 bc a6 bb ed 3f 21 3b 6f bf a6 b8 
-    ec 3d 27 3b 15 bd a6 b8 eb 3d 27 38 
-counted: 12
-=== Repacking ===
-== Transcoding test ==
-converting pcma -> l16
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-generating 160 pcma input samples
-got 2 l16 output frames (320 octets) count=12
-== Transcoding test ==
-converting pcma -> pcma
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-generating 160 pcma input samples
-got 2 pcma output frames (160 octets) count=12
-== Transcoding test ==
-converting pcma -> l16
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-== Transcoding test ==
-converting pcma -> pcma
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-== Transcoding test ==
-converting pcma -> l16
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 l16 output frames (640 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 l16 output frames (640 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 l16 output frames (640 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 l16 output frames (640 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 l16 output frames (640 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 l16 output frames (640 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 l16 output frames (640 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 l16 output frames (640 octets) count=12
-== Transcoding test ==
-converting pcma -> pcma
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 pcma output frames (320 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 pcma output frames (320 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 pcma output frames (320 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 pcma output frames (320 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 pcma output frames (320 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 pcma output frames (320 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 pcma output frames (320 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 4 pcma output frames (320 octets) count=12
-== Transcoding test ==
-converting pcma -> l16
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 l16 output frames (480 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 l16 output frames (480 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 l16 output frames (480 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 l16 output frames (480 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 l16 output frames (480 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 l16 output frames (480 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 l16 output frames (480 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 l16 output frames (480 octets) count=12
-== Transcoding test ==
-converting pcma -> pcma
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 pcma output frames (240 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 pcma output frames (240 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 pcma output frames (240 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 pcma output frames (240 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 pcma output frames (240 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 pcma output frames (240 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 pcma output frames (240 octets) count=12
-generating 160 pcma input samples
-generating 160 pcma input samples
-got 3 pcma output frames (240 octets) count=12
-== Transcoding test ==
-converting pcma -> l16
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-generating 160 pcma input samples
-got 1 l16 output frames (160 octets) count=12
-got 1 l16 output frames (160 octets) count=12
-== Transcoding test ==
-converting pcma -> pcma
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-generating 160 pcma input samples
-got 1 pcma output frames (80 octets) count=12
-got 1 pcma output frames (80 octets) count=12
-Testing Initial L16->GSM, PCMA->GSM
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 03ec4b9..3585bf0 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -1,19 +1,6 @@
 AT_INIT
 AT_BANNER([Regression tests.])
 
-AT_SETUP([legacy_mgcp])
-AT_KEYWORDS([legacy_mgcp])
-cat $abs_srcdir/legacy_mgcp/mgcp_test.ok > expout
-AT_CHECK([$abs_top_builddir/tests/legacy_mgcp/mgcp_test], [], [expout], [ignore])
-AT_CLEANUP
-
-AT_SETUP([legacy_mgcp-trans])
-AT_KEYWORDS([legacy_mgcp-trans])
-AT_CHECK([test "$enable_mgcp_transcoding_test" == yes || exit 77])
-cat $abs_srcdir/legacy_mgcp/mgcp_transcoding_test.ok > expout
-AT_CHECK([$abs_top_builddir/tests/legacy_mgcp/mgcp_transcoding_test], [], [expout], [ignore])
-AT_CLEANUP
-
 AT_SETUP([mgcp_client])
 AT_KEYWORDS([mgcp_client])
 cat $abs_srcdir/mgcp_client/mgcp_client_test.ok > expout
diff --git a/tests/vty_test_runner.py b/tests/vty_test_runner.py
deleted file mode 100644
index 05bc3bf..0000000
--- a/tests/vty_test_runner.py
+++ /dev/null
@@ -1,171 +0,0 @@
-#!/usr/bin/env python
-
-# (C) 2013 by Katerina Barone-Adesi <kat.obsc@gmail.com>
-# (C) 2013 by Holger Hans Peter Freyther
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-import os, sys
-import time
-import unittest
-import socket
-import subprocess
-
-import osmopy.obscvty as obscvty
-import osmopy.osmoutil as osmoutil
-
-# add $top_srcdir/contrib to find ipa.py
-sys.path.append(os.path.join(sys.path[0], '..', 'contrib'))
-
-from ipa import IPA
-
-# to be able to find $top_srcdir/doc/...
-confpath = os.path.join(sys.path[0], '..')
-
-class TestVTYBase(unittest.TestCase):
-
-    def checkForEndAndExit(self):
-        res = self.vty.command("list")
-        #print ('looking for "exit"\n')
-        self.assert_(res.find('  exit\r') > 0)
-        #print 'found "exit"\nlooking for "end"\n'
-        self.assert_(res.find('  end\r') > 0)
-        #print 'found "end"\n'
-
-    def vty_command(self):
-        raise Exception("Needs to be implemented by a subclass")
-
-    def vty_app(self):
-        raise Exception("Needs to be implemented by a subclass")
-
-    def setUp(self):
-        osmo_vty_cmd = self.vty_command()[:]
-        config_index = osmo_vty_cmd.index('-c')
-        if config_index:
-            cfi = config_index + 1
-            osmo_vty_cmd[cfi] = os.path.join(confpath, osmo_vty_cmd[cfi])
-
-        try:
-            self.proc = osmoutil.popen_devnull(osmo_vty_cmd)
-        except OSError:
-            print >> sys.stderr, "Current directory: %s" % os.getcwd()
-            print >> sys.stderr, "Consider setting -b"
-
-        appstring = self.vty_app()[2]
-        appport = self.vty_app()[0]
-        self.vty = obscvty.VTYInteract(appstring, "127.0.0.1", appport)
-
-    def tearDown(self):
-        if self.vty:
-            self.vty._close_socket()
-        self.vty = None
-        osmoutil.end_proc(self.proc)
-
-class TestVTYMGCP(TestVTYBase):
-    def vty_command(self):
-        return ["./src/osmo-bsc_mgcp/osmo-bsc_mgcp", "-c",
-                "doc/examples/osmo-bsc_mgcp/mgcp.cfg"]
-
-    def vty_app(self):
-        return (4243, "./src/osmo-bsc_mgcp/osmo-bsc_mgcp", "OpenBSC MGCP", "mgcp")
-
-    def testForcePtime(self):
-        self.vty.enable()
-        res = self.vty.command("show running-config")
-        self.assert_(res.find('  rtp force-ptime 20\r') > 0)
-        self.assertEquals(res.find('  no rtp force-ptime\r'), -1)
-
-        self.vty.command("configure terminal")
-        self.vty.command("mgcp")
-        self.vty.command("no rtp force-ptime")
-        res = self.vty.command("show running-config")
-        self.assertEquals(res.find('  rtp force-ptime 20\r'), -1)
-        self.assertEquals(res.find('  no rtp force-ptime\r'), -1)
-
-    def testOmitAudio(self):
-        self.vty.enable()
-        res = self.vty.command("show running-config")
-        self.assert_(res.find('  sdp audio-payload send-name\r') > 0)
-        self.assertEquals(res.find('  no sdp audio-payload send-name\r'), -1)
-
-        self.vty.command("configure terminal")
-        self.vty.command("mgcp")
-        self.vty.command("no sdp audio-payload send-name")
-        res = self.vty.command("show running-config")
-        self.assertEquals(res.find('  rtp sdp audio-payload send-name\r'), -1)
-        self.assert_(res.find('  no sdp audio-payload send-name\r') > 0)
-
-        # TODO: test it for the trunk!
-
-    def testBindAddr(self):
-        self.vty.enable()
-
-        self.vty.command("configure terminal")
-        self.vty.command("mgcp")
-
-        # enable.. disable bts-bind-ip
-        self.vty.command("rtp bts-bind-ip 254.253.252.250")
-        res = self.vty.command("show running-config")
-        self.assert_(res.find('rtp bts-bind-ip 254.253.252.250') > 0)
-        self.vty.command("no rtp bts-bind-ip")
-        res = self.vty.command("show running-config")
-        self.assertEquals(res.find('  rtp bts-bind-ip'), -1)
-
-        # enable.. disable net-bind-ip
-        self.vty.command("rtp net-bind-ip 254.253.252.250")
-        res = self.vty.command("show running-config")
-        self.assert_(res.find('rtp net-bind-ip 254.253.252.250') > 0)
-        self.vty.command("no rtp net-bind-ip")
-        res = self.vty.command("show running-config")
-        self.assertEquals(res.find('  rtp net-bind-ip'), -1)
-
-
-if __name__ == '__main__':
-    import argparse
-    import sys
-
-    workdir = '.'
-
-    parser = argparse.ArgumentParser()
-    parser.add_argument("-v", "--verbose", dest="verbose",
-                        action="store_true", help="verbose mode")
-    parser.add_argument("-p", "--pythonconfpath", dest="p",
-                        help="searchpath for config")
-    parser.add_argument("-w", "--workdir", dest="w",
-                        help="Working directory")
-    parser.add_argument("test_name", nargs="*", help="(parts of) test names to run, case-insensitive")
-    args = parser.parse_args()
-
-    verbose_level = 1
-    if args.verbose:
-        verbose_level = 2
-
-    if args.w:
-        workdir = args.w
-
-    if args.p:
-        confpath = args.p
-
-    print "confpath %s, workdir %s" % (confpath, workdir)
-    os.chdir(workdir)
-    print "Running tests for specific VTY commands"
-    suite = unittest.TestSuite()
-    suite.addTest(unittest.TestLoader().loadTestsFromTestCase(TestVTYMGCP))
-
-    if args.test_name:
-        osmoutil.pick_tests(suite, *args.test_name)
-
-    res = unittest.TextTestRunner(verbosity=verbose_level, stream=sys.stdout).run(suite)
-    sys.exit(len(res.errors) + len(res.failures))
-
-# vim: shiftwidth=4 expandtab nocin ai