blob: 8f6b10ab41d55ce94bfc92e576e23b8bb2bdfc8c [file] [log] [blame]
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
2/* The protocol implementation */
3
4/*
Holger Hans Peter Freytherb30b3aa2014-07-04 20:23:56 +02005 * (C) 2009-2014 by Holger Hans Peter Freyther <zecke@selfish.org>
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +01006 * (C) 2009-2011 by On-Waves
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01007 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
Harald Welte0e3e88e2011-01-01 15:25:50 +010010 * it under the terms of the GNU Affero General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010012 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte0e3e88e2011-01-01 15:25:50 +010017 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010018 *
Harald Welte0e3e88e2011-01-01 15:25:50 +010019 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010021 *
22 */
23
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010024
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +010025#include <osmocom/core/talloc.h>
Holger Hans Peter Freytherf41fb1f2010-02-26 20:16:37 +010026
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010027#include <openbsc/mgcp.h>
28#include <openbsc/mgcp_internal.h>
Harald Welte58ed1cb2010-05-14 18:59:17 +020029#include <openbsc/vty.h>
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010030
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020031#include <string.h>
32
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +020033#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
Jacob Erlbecke5546cd2013-12-03 14:43:34 +010034#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
Jacob Erlbecke64bb122013-12-19 18:53:07 +010035#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +020036
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010037static struct mgcp_config *g_cfg = NULL;
38
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010039static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010040{
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010041 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010042
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010043 if (nr == 0)
44 trunk = &cfg->trunk;
45 else
46 trunk = mgcp_trunk_num(cfg, nr);
47
48 return trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010049}
50
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010051/*
52 * vty code for mgcp below
53 */
54struct cmd_node mgcp_node = {
55 MGCP_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020056 "%s(config-mgcp)# ",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010057 1,
58};
59
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010060struct cmd_node trunk_node = {
61 TRUNK_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020062 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010063 1,
64};
65
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010066static int config_write_mgcp(struct vty *vty)
67{
68 vty_out(vty, "mgcp%s", VTY_NEWLINE);
69 if (g_cfg->local_ip)
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020070 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
71 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010072 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
73 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
74 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080075
76 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
77 vty_out(vty, " rtp bts-base %u%s", g_cfg->bts_ports.base_port, VTY_NEWLINE);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +080078 else
79 vty_out(vty, " rtp bts-range %u %u%s",
80 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
81
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080082 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
83 vty_out(vty, " rtp net-base %u%s", g_cfg->net_ports.base_port, VTY_NEWLINE);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +080084 else
85 vty_out(vty, " rtp net-range %u %u%s",
86 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
87
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +080088 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +010089 if (g_cfg->trunk.keepalive_interval == MGCP_KEEPALIVE_ONCE)
90 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
91 else if (g_cfg->trunk.keepalive_interval)
92 vty_out(vty, " rtp keep-alive %d%s",
93 g_cfg->trunk.keepalive_interval, VTY_NEWLINE);
94 else
95 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
96
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +020097 if (g_cfg->trunk.omit_rtcp)
98 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
99 else
100 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100101 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_aligned_timing) {
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100102 vty_out(vty, " %srtp-patch ssrc%s",
103 g_cfg->trunk.force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
104 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100105 g_cfg->trunk.force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100106 } else
107 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100108 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100109 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100110 g_cfg->trunk.audio_payload, VTY_NEWLINE);
111 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100112 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100113 g_cfg->trunk.audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200114 if (g_cfg->trunk.audio_fmtp_extra)
115 vty_out(vty, " sdp audio fmtp-extra %s%s",
116 g_cfg->trunk.audio_fmtp_extra, VTY_NEWLINE);
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100117 vty_out(vty, " %ssdp audio-payload send-ptime%s",
118 g_cfg->trunk.audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100119 vty_out(vty, " %ssdp audio-payload send-name%s",
120 g_cfg->trunk.audio_send_name ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100121 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
122 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -0400123 vty_out(vty, " %sallow-transcoding%s",
124 g_cfg->trunk.no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200125 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100126 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800127 if (g_cfg->transcoder_ip)
128 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100129
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800130 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
131 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
132 else
133 vty_out(vty, " rtp transcoder-range %u %u%s",
134 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb30b3aa2014-07-04 20:23:56 +0200135 if (g_cfg->bts_force_ptime > 0)
136 vty_out(vty, " rtp force-ptime %d%s", g_cfg->bts_force_ptime, VTY_NEWLINE);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800137 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100138 vty_out(vty, " osmux %s%s",
139 g_cfg->osmux == 1 ? "on" : "off", VTY_NEWLINE);
Pablo Neira Ayusob84aea32014-08-29 15:24:00 +0200140 if (g_cfg->osmux) {
141 vty_out(vty, " osmux batch-factor %d%s",
142 g_cfg->osmux_batch, VTY_NEWLINE);
143 vty_out(vty, " osmux batch-size %u%s",
144 g_cfg->osmux_batch_size, VTY_NEWLINE);
145 vty_out(vty, " osmux port %u%s",
146 g_cfg->osmux_port, VTY_NEWLINE);
Pablo Neira Ayuso644fdc22015-07-17 21:56:23 +0200147 vty_out(vty, " osmux dummy %s%s",
148 g_cfg->osmux_dummy ? "on" : "off", VTY_NEWLINE);
Pablo Neira Ayusob84aea32014-08-29 15:24:00 +0200149 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100150 return CMD_SUCCESS;
151}
152
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200153static void dump_rtp_end(const char *end_name, struct vty *vty,
154 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
155{
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200156 struct mgcp_rtp_codec *codec = &end->codec;
157
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200158 vty_out(vty,
159 " %s%s"
160 " Timestamp Errs: %d->%d%s"
161 " Dropped Packets: %d%s"
162 " Payload Type: %d Rate: %u Channels: %d %s"
163 " Frame Duration: %u Frame Denominator: %u%s"
164 " FPP: %d Packet Duration: %u%s"
165 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
166 " Output-Enabled: %d Force-PTIME: %d%s",
167 end_name, VTY_NEWLINE,
168 state->in_stream.err_ts_counter,
169 state->out_stream.err_ts_counter, VTY_NEWLINE,
170 end->dropped_packets, VTY_NEWLINE,
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200171 codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
172 codec->frame_duration_num, codec->frame_duration_den, VTY_NEWLINE,
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200173 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200174 end->fmtp_extra, codec->audio_name, codec->subtype_name, VTY_NEWLINE,
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200175 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
176}
177
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100178static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100179{
180 int i;
181
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100182 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
183 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
184 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
185
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100186 if (!cfg->endpoints) {
187 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
188 return;
189 }
190
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100191 for (i = 1; i < cfg->number_endpoints; ++i) {
192 struct mgcp_endpoint *endp = &cfg->endpoints[i];
193 vty_out(vty,
194 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200195 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100196 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-08-05 01:34:51 +0800197 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
198 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
199 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200200 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100201 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200202 VTY_NEWLINE);
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100203
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200204 if (verbose && endp->allocated) {
205 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
206 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck8c1f4b02013-12-19 12:13:32 +0100207 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100208 }
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100209}
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100210
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100211DEFUN(show_mcgp, show_mgcp_cmd,
212 "show mgcp [stats]",
213 SHOW_STR
214 "Display information about the MGCP Media Gateway\n"
215 "Include Statistics\n")
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100216{
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100217 struct mgcp_trunk_config *trunk;
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100218 int show_stats = argc >= 1;
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100219
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100220 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100221
222 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100223 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100224
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100225 return CMD_SUCCESS;
226}
227
228DEFUN(cfg_mgcp,
229 cfg_mgcp_cmd,
230 "mgcp",
231 "Configure the MGCP")
232{
233 vty->node = MGCP_NODE;
234 return CMD_SUCCESS;
235}
236
237DEFUN(cfg_mgcp_local_ip,
238 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800239 "local ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100240 "Local options for the SDP record\n"
241 IP_STR
242 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100243{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200244 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100245 return CMD_SUCCESS;
246}
247
248DEFUN(cfg_mgcp_bts_ip,
249 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800250 "bts ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100251 "BTS Audio source/destination options\n"
252 IP_STR
253 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100254{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200255 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100256 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
257 return CMD_SUCCESS;
258}
259
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100260#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100261DEFUN(cfg_mgcp_bind_ip,
262 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800263 "bind ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100264 BIND_STR
265 IP_STR
266 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100267{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200268 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100269 return CMD_SUCCESS;
270}
271
272DEFUN(cfg_mgcp_bind_port,
273 cfg_mgcp_bind_port_cmd,
274 "bind port <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100275 BIND_STR
276 "Port information\n"
277 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100278{
279 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100280 g_cfg->source_port = port;
281 return CMD_SUCCESS;
282}
283
284DEFUN(cfg_mgcp_bind_early,
285 cfg_mgcp_bind_early_cmd,
286 "bind early (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100287 BIND_STR
288 "Bind local ports on start up\n"
289 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100290{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800291 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
292 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100293}
294
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800295static void parse_base(struct mgcp_port_range *range, const char **argv)
296{
297 unsigned int port = atoi(argv[0]);
298 range->mode = PORT_ALLOC_STATIC;
299 range->base_port = port;
300}
301
302static void parse_range(struct mgcp_port_range *range, const char **argv)
303{
304 range->mode = PORT_ALLOC_DYNAMIC;
305 range->range_start = atoi(argv[0]);
306 range->range_end = atoi(argv[1]);
307 range->last_port = g_cfg->bts_ports.range_start;
308}
309
310
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100311#define RTP_STR "RTP configuration\n"
312#define BTS_START_STR "First UDP port allocated for the BTS side\n"
313#define NET_START_STR "First UDP port allocated for the NET side\n"
314#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800315DEFUN(cfg_mgcp_rtp_bts_base_port,
316 cfg_mgcp_rtp_bts_base_port_cmd,
317 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100318 RTP_STR
319 BTS_START_STR
320 UDP_PORT_STR)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100321{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800322 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100323 return CMD_SUCCESS;
324}
325
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100326#define RANGE_START_STR "Start of the range of ports\n"
327#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800328DEFUN(cfg_mgcp_rtp_bts_range,
329 cfg_mgcp_rtp_bts_range_cmd,
330 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100331 RTP_STR "Range of ports to use for the BTS side\n"
332 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800333{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800334 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800335 return CMD_SUCCESS;
336}
337
338DEFUN(cfg_mgcp_rtp_net_range,
339 cfg_mgcp_rtp_net_range_cmd,
340 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100341 RTP_STR "Range of ports to use for the NET side\n"
342 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800343{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800344 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800345 return CMD_SUCCESS;
346}
347
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800348DEFUN(cfg_mgcp_rtp_net_base_port,
349 cfg_mgcp_rtp_net_base_port_cmd,
350 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100351 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800352{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800353 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800354 return CMD_SUCCESS;
355}
356
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800357ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100358 "rtp base <0-65534>",
359 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800360
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800361DEFUN(cfg_mgcp_rtp_transcoder_range,
362 cfg_mgcp_rtp_transcoder_range_cmd,
363 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100364 RTP_STR "Range of ports to use for the Transcoder\n"
365 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800366{
367 parse_range(&g_cfg->transcoder_ports, argv);
368 return CMD_SUCCESS;
369}
370
371DEFUN(cfg_mgcp_rtp_transcoder_base,
372 cfg_mgcp_rtp_transcoder_base_cmd,
373 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100374 RTP_STR "First UDP port allocated for the Transcoder side\n"
375 UDP_PORT_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800376{
377 parse_base(&g_cfg->transcoder_ports, argv);
378 return CMD_SUCCESS;
379}
380
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800381DEFUN(cfg_mgcp_rtp_ip_dscp,
382 cfg_mgcp_rtp_ip_dscp_cmd,
383 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100384 RTP_STR
Holger Hans Peter Freytherc0c9ff02015-01-21 11:39:47 +0100385 "Apply IP_TOS to the audio stream (including Osmux)\n" "The DSCP value\n")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800386{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800387 int dscp = atoi(argv[0]);
388 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800389 return CMD_SUCCESS;
390}
391
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800392ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
393 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100394 RTP_STR
395 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800396
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200397#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
398DEFUN(cfg_mgcp_rtp_force_ptime,
399 cfg_mgcp_rtp_force_ptime_cmd,
400 "rtp force-ptime (10|20|40)",
401 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther7a4464e2014-07-04 20:11:11 +0200402 "The required ptime (packet duration) in ms\n"
403 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200404{
405 g_cfg->bts_force_ptime = atoi(argv[0]);
406 return CMD_SUCCESS;
407}
408
409DEFUN(cfg_mgcp_no_rtp_force_ptime,
410 cfg_mgcp_no_rtp_force_ptime_cmd,
411 "no rtp force-ptime",
412 NO_STR RTP_STR FORCE_PTIME_STR)
413{
414 g_cfg->bts_force_ptime = 0;
415 return CMD_SUCCESS;
416}
417
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200418DEFUN(cfg_mgcp_sdp_fmtp_extra,
419 cfg_mgcp_sdp_fmtp_extra_cmd,
420 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100421 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
422 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200423{
424 char *txt = argv_concat(argv, argc, 0);
425 if (!txt)
426 return CMD_WARNING;
427
428 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
429 talloc_free(txt);
430 return CMD_SUCCESS;
431}
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800432
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -0400433DEFUN(cfg_mgcp_allow_transcoding,
434 cfg_mgcp_allow_transcoding_cmd,
435 "allow-transcoding",
436 "Allow transcoding\n")
437{
438 g_cfg->trunk.no_audio_transcoding = 0;
439 return CMD_SUCCESS;
440}
441
442DEFUN(cfg_mgcp_no_allow_transcoding,
443 cfg_mgcp_no_allow_transcoding_cmd,
444 "no allow-transcoding",
445 NO_STR "Allow transcoding\n")
446{
447 g_cfg->trunk.no_audio_transcoding = 1;
448 return CMD_SUCCESS;
449}
450
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100451#define SDP_STR "SDP File related options\n"
452#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100453DEFUN(cfg_mgcp_sdp_payload_number,
454 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100455 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100456 SDP_STR AUDIO_STR
457 "Number\n" "Payload number\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100458{
459 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100460 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100461 return CMD_SUCCESS;
462}
463
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100464ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100465 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100466 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
467
468
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100469DEFUN(cfg_mgcp_sdp_payload_name,
470 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100471 "sdp audio-payload name NAME",
472 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100473{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100474 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100475 return CMD_SUCCESS;
476}
477
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100478ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
479 "sdp audio payload name NAME",
480 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
481
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100482DEFUN(cfg_mgcp_sdp_payload_send_ptime,
483 cfg_mgcp_sdp_payload_send_ptime_cmd,
484 "sdp audio-payload send-ptime",
485 SDP_STR AUDIO_STR
486 "Send SDP ptime (packet duration) attribute\n")
487{
488 g_cfg->trunk.audio_send_ptime = 1;
489 return CMD_SUCCESS;
490}
491
492DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
493 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
494 "no sdp audio-payload send-ptime",
495 NO_STR SDP_STR AUDIO_STR
496 "Send SDP ptime (packet duration) attribute\n")
497{
498 g_cfg->trunk.audio_send_ptime = 0;
499 return CMD_SUCCESS;
500}
501
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100502DEFUN(cfg_mgcp_sdp_payload_send_name,
503 cfg_mgcp_sdp_payload_send_name_cmd,
504 "sdp audio-payload send-name",
505 SDP_STR AUDIO_STR
506 "Send SDP rtpmap with the audio name\n")
507{
508 g_cfg->trunk.audio_send_name = 1;
509 return CMD_SUCCESS;
510}
511
512DEFUN(cfg_mgcp_no_sdp_payload_send_name,
513 cfg_mgcp_no_sdp_payload_send_name_cmd,
514 "no sdp audio-payload send-name",
515 NO_STR SDP_STR AUDIO_STR
516 "Send SDP rtpmap with the audio name\n")
517{
518 g_cfg->trunk.audio_send_name = 0;
519 return CMD_SUCCESS;
520}
521
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100522DEFUN(cfg_mgcp_loop,
523 cfg_mgcp_loop_cmd,
524 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100525 "Loop audio for all endpoints on main trunk\n"
526 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100527{
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100528 if (g_cfg->osmux) {
529 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
530 return CMD_WARNING;
531 }
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100532 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100533 return CMD_SUCCESS;
534}
535
536DEFUN(cfg_mgcp_number_endp,
537 cfg_mgcp_number_endp_cmd,
538 "number endpoints <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100539 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100540{
541 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100542 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100543 return CMD_SUCCESS;
544}
545
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200546DEFUN(cfg_mgcp_omit_rtcp,
547 cfg_mgcp_omit_rtcp_cmd,
548 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200549 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200550{
551 g_cfg->trunk.omit_rtcp = 1;
552 return CMD_SUCCESS;
553}
554
555DEFUN(cfg_mgcp_no_omit_rtcp,
556 cfg_mgcp_no_omit_rtcp_cmd,
557 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200558 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200559{
560 g_cfg->trunk.omit_rtcp = 0;
561 return CMD_SUCCESS;
562}
563
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100564DEFUN(cfg_mgcp_patch_rtp_ssrc,
565 cfg_mgcp_patch_rtp_ssrc_cmd,
566 "rtp-patch ssrc",
567 RTP_PATCH_STR
568 "Force a fixed SSRC\n"
569 )
570{
571 g_cfg->trunk.force_constant_ssrc = 1;
572 return CMD_SUCCESS;
573}
574
575DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
576 cfg_mgcp_no_patch_rtp_ssrc_cmd,
577 "no rtp-patch ssrc",
578 NO_STR RTP_PATCH_STR
579 "Force a fixed SSRC\n"
580 )
581{
582 g_cfg->trunk.force_constant_ssrc = 0;
583 return CMD_SUCCESS;
584}
585
586DEFUN(cfg_mgcp_patch_rtp_ts,
587 cfg_mgcp_patch_rtp_ts_cmd,
588 "rtp-patch timestamp",
589 RTP_PATCH_STR
590 "Adjust RTP timestamp\n"
591 )
592{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100593 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100594 return CMD_SUCCESS;
595}
596
597DEFUN(cfg_mgcp_no_patch_rtp_ts,
598 cfg_mgcp_no_patch_rtp_ts_cmd,
599 "no rtp-patch timestamp",
600 NO_STR RTP_PATCH_STR
601 "Adjust RTP timestamp\n"
602 )
603{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100604 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100605 return CMD_SUCCESS;
606}
607
608DEFUN(cfg_mgcp_no_patch_rtp,
609 cfg_mgcp_no_patch_rtp_cmd,
610 "no rtp-patch",
611 NO_STR RTP_PATCH_STR)
612{
613 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100614 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100615 return CMD_SUCCESS;
616}
617
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100618DEFUN(cfg_mgcp_rtp_keepalive,
619 cfg_mgcp_rtp_keepalive_cmd,
620 "rtp keep-alive <1-120>",
621 RTP_STR RTP_KEEPALIVE_STR
622 "Keep alive interval in secs\n"
623 )
624{
625 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
626 return CMD_SUCCESS;
627}
628
629DEFUN(cfg_mgcp_rtp_keepalive_once,
630 cfg_mgcp_rtp_keepalive_once_cmd,
631 "rtp keep-alive once",
632 RTP_STR RTP_KEEPALIVE_STR
633 "Send dummy packet only once after CRCX/MDCX\n"
634 )
635{
636 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
637 return CMD_SUCCESS;
638}
639
640DEFUN(cfg_mgcp_no_rtp_keepalive,
641 cfg_mgcp_no_rtp_keepalive_cmd,
642 "no rtp keep-alive",
643 NO_STR RTP_STR RTP_KEEPALIVE_STR
644 )
645{
646 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
647 return CMD_SUCCESS;
648}
649
650
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100651
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100652#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200653DEFUN(cfg_mgcp_agent_addr,
654 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100655 "call-agent ip A.B.C.D",
656 CALL_AGENT_STR IP_STR
657 "IPv4 Address of the callagent\n")
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200658{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200659 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200660 return CMD_SUCCESS;
661}
662
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100663ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
664 "call agent ip A.B.C.D",
665 CALL_AGENT_STR CALL_AGENT_STR IP_STR
666 "IPv4 Address of the callagent\n")
667
668
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800669DEFUN(cfg_mgcp_transcoder,
670 cfg_mgcp_transcoder_cmd,
671 "transcoder-mgw A.B.C.D",
672 "Use a MGW to detranscoder RTP\n"
673 "The IP address of the MGW")
674{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200675 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800676 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
677
678 return CMD_SUCCESS;
679}
680
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100681DEFUN(cfg_mgcp_no_transcoder,
682 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100683 "no transcoder-mgw",
684 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100685{
686 if (g_cfg->transcoder_ip) {
687 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
688 talloc_free(g_cfg->transcoder_ip);
689 g_cfg->transcoder_ip = NULL;
690 }
691
692 return CMD_SUCCESS;
693}
694
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800695DEFUN(cfg_mgcp_transcoder_remote_base,
696 cfg_mgcp_transcoder_remote_base_cmd,
697 "transcoder-remote-base <0-65534>",
698 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
699{
700 g_cfg->transcoder_remote_base = atoi(argv[0]);
701 return CMD_SUCCESS;
702}
703
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100704DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
705 "trunk <1-64>",
706 "Configure a SS7 trunk\n" "Trunk Nr\n")
707{
708 struct mgcp_trunk_config *trunk;
709 int index = atoi(argv[0]);
710
711 trunk = mgcp_trunk_num(g_cfg, index);
712 if (!trunk)
713 trunk = mgcp_trunk_alloc(g_cfg, index);
714
715 if (!trunk) {
716 vty_out(vty, "%%Unable to allocate trunk %u.%s",
717 index, VTY_NEWLINE);
718 return CMD_WARNING;
719 }
720
721 vty->node = TRUNK_NODE;
722 vty->index = trunk;
723 return CMD_SUCCESS;
724}
725
726static int config_write_trunk(struct vty *vty)
727{
728 struct mgcp_trunk_config *trunk;
729
730 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
731 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100732 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100733 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100734 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100735 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100736 vty_out(vty, " %ssdp audio-payload send-ptime%s",
737 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100738 vty_out(vty, " %ssdp audio-payload send-name%s",
739 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100740
741 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
742 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
743 else if (trunk->keepalive_interval)
744 vty_out(vty, " rtp keep-alive %d%s",
745 trunk->keepalive_interval, VTY_NEWLINE);
746 else
747 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
748
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100749 vty_out(vty, " loop %d%s",
750 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200751 if (trunk->omit_rtcp)
752 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
753 else
754 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100755 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100756 vty_out(vty, " %srtp-patch ssrc%s",
757 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
758 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100759 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100760 } else
761 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200762 if (trunk->audio_fmtp_extra)
763 vty_out(vty, " sdp audio fmtp-extra %s%s",
764 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -0400765 vty_out(vty, " %sallow-transcoding%s",
766 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100767 }
768
769 return CMD_SUCCESS;
770}
771
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200772DEFUN(cfg_trunk_sdp_fmtp_extra,
773 cfg_trunk_sdp_fmtp_extra_cmd,
774 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100775 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
776 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200777{
778 struct mgcp_trunk_config *trunk = vty->index;
779 char *txt = argv_concat(argv, argc, 0);
780 if (!txt)
781 return CMD_WARNING;
782
783 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
784 talloc_free(txt);
785 return CMD_SUCCESS;
786}
787
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100788DEFUN(cfg_trunk_payload_number,
789 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100790 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100791 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100792{
793 struct mgcp_trunk_config *trunk = vty->index;
794 unsigned int payload = atoi(argv[0]);
795
796 trunk->audio_payload = payload;
797 return CMD_SUCCESS;
798}
799
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100800ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100801 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100802 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
803
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100804DEFUN(cfg_trunk_payload_name,
805 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100806 "sdp audio-payload name NAME",
807 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100808{
809 struct mgcp_trunk_config *trunk = vty->index;
810
811 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
812 return CMD_SUCCESS;
813}
814
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100815ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
816 "sdp audio payload name NAME",
817 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
818
819
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100820DEFUN(cfg_trunk_loop,
821 cfg_trunk_loop_cmd,
822 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100823 "Loop audio for all endpoints on this trunk\n"
824 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100825{
826 struct mgcp_trunk_config *trunk = vty->index;
827
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100828 if (g_cfg->osmux) {
829 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
830 return CMD_WARNING;
831 }
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100832 trunk->audio_loop = atoi(argv[0]);
833 return CMD_SUCCESS;
834}
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800835
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100836DEFUN(cfg_trunk_sdp_payload_send_ptime,
837 cfg_trunk_sdp_payload_send_ptime_cmd,
838 "sdp audio-payload send-ptime",
839 SDP_STR AUDIO_STR
840 "Send SDP ptime (packet duration) attribute\n")
841{
842 struct mgcp_trunk_config *trunk = vty->index;
843 trunk->audio_send_ptime = 1;
844 return CMD_SUCCESS;
845}
846
847DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
848 cfg_trunk_no_sdp_payload_send_ptime_cmd,
849 "no sdp audio-payload send-ptime",
850 NO_STR SDP_STR AUDIO_STR
851 "Send SDP ptime (packet duration) attribute\n")
852{
853 struct mgcp_trunk_config *trunk = vty->index;
854 trunk->audio_send_ptime = 0;
855 return CMD_SUCCESS;
856}
857
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100858DEFUN(cfg_trunk_sdp_payload_send_name,
859 cfg_trunk_sdp_payload_send_name_cmd,
860 "sdp audio-payload send-name",
861 SDP_STR AUDIO_STR
862 "Send SDP rtpmap with the audio name\n")
863{
864 struct mgcp_trunk_config *trunk = vty->index;
865 trunk->audio_send_name = 1;
866 return CMD_SUCCESS;
867}
868
869DEFUN(cfg_trunk_no_sdp_payload_send_name,
870 cfg_trunk_no_sdp_payload_send_name_cmd,
871 "no sdp audio-payload send-name",
872 NO_STR SDP_STR AUDIO_STR
873 "Send SDP rtpmap with the audio name\n")
874{
875 struct mgcp_trunk_config *trunk = vty->index;
876 trunk->audio_send_name = 0;
877 return CMD_SUCCESS;
878}
879
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200880DEFUN(cfg_trunk_omit_rtcp,
881 cfg_trunk_omit_rtcp_cmd,
882 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200883 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200884{
885 struct mgcp_trunk_config *trunk = vty->index;
886 trunk->omit_rtcp = 1;
887 return CMD_SUCCESS;
888}
889
890DEFUN(cfg_trunk_no_omit_rtcp,
891 cfg_trunk_no_omit_rtcp_cmd,
892 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200893 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200894{
895 struct mgcp_trunk_config *trunk = vty->index;
896 trunk->omit_rtcp = 0;
897 return CMD_SUCCESS;
898}
899
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100900DEFUN(cfg_trunk_patch_rtp_ssrc,
901 cfg_trunk_patch_rtp_ssrc_cmd,
902 "rtp-patch ssrc",
903 RTP_PATCH_STR
904 "Force a fixed SSRC\n"
905 )
906{
907 struct mgcp_trunk_config *trunk = vty->index;
908 trunk->force_constant_ssrc = 1;
909 return CMD_SUCCESS;
910}
911
912DEFUN(cfg_trunk_no_patch_rtp_ssrc,
913 cfg_trunk_no_patch_rtp_ssrc_cmd,
914 "no rtp-patch ssrc",
915 NO_STR RTP_PATCH_STR
916 "Force a fixed SSRC\n"
917 )
918{
919 struct mgcp_trunk_config *trunk = vty->index;
920 trunk->force_constant_ssrc = 0;
921 return CMD_SUCCESS;
922}
923
924DEFUN(cfg_trunk_patch_rtp_ts,
925 cfg_trunk_patch_rtp_ts_cmd,
926 "rtp-patch timestamp",
927 RTP_PATCH_STR
928 "Adjust RTP timestamp\n"
929 )
930{
931 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100932 trunk->force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100933 return CMD_SUCCESS;
934}
935
936DEFUN(cfg_trunk_no_patch_rtp_ts,
937 cfg_trunk_no_patch_rtp_ts_cmd,
938 "no rtp-patch timestamp",
939 NO_STR RTP_PATCH_STR
940 "Adjust RTP timestamp\n"
941 )
942{
943 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100944 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100945 return CMD_SUCCESS;
946}
947
948DEFUN(cfg_trunk_no_patch_rtp,
949 cfg_trunk_no_patch_rtp_cmd,
950 "no rtp-patch",
951 NO_STR RTP_PATCH_STR)
952{
953 struct mgcp_trunk_config *trunk = vty->index;
954 trunk->force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100955 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100956 return CMD_SUCCESS;
957}
958
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100959DEFUN(cfg_trunk_rtp_keepalive,
960 cfg_trunk_rtp_keepalive_cmd,
961 "rtp keep-alive <1-120>",
962 RTP_STR RTP_KEEPALIVE_STR
963 "Keep-alive interval in secs\n"
964 )
965{
966 struct mgcp_trunk_config *trunk = vty->index;
967 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
968 return CMD_SUCCESS;
969}
970
971DEFUN(cfg_trunk_rtp_keepalive_once,
972 cfg_trunk_rtp_keepalive_once_cmd,
973 "rtp keep-alive once",
974 RTP_STR RTP_KEEPALIVE_STR
975 "Send dummy packet only once after CRCX/MDCX\n"
976 )
977{
978 struct mgcp_trunk_config *trunk = vty->index;
979 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
980 return CMD_SUCCESS;
981}
982
983DEFUN(cfg_trunk_no_rtp_keepalive,
984 cfg_trunk_no_rtp_keepalive_cmd,
985 "no rtp keep-alive",
986 NO_STR RTP_STR RTP_KEEPALIVE_STR
987 )
988{
989 struct mgcp_trunk_config *trunk = vty->index;
990 mgcp_trunk_set_keepalive(trunk, 0);
991 return CMD_SUCCESS;
992}
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100993
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -0400994DEFUN(cfg_trunk_allow_transcoding,
995 cfg_trunk_allow_transcoding_cmd,
996 "allow-transcoding",
997 "Allow transcoding\n")
998{
999 struct mgcp_trunk_config *trunk = vty->index;
1000 trunk->no_audio_transcoding = 0;
1001 return CMD_SUCCESS;
1002}
1003
1004DEFUN(cfg_trunk_no_allow_transcoding,
1005 cfg_trunk_no_allow_transcoding_cmd,
1006 "no allow-transcoding",
1007 NO_STR "Allow transcoding\n")
1008{
1009 struct mgcp_trunk_config *trunk = vty->index;
1010 trunk->no_audio_transcoding = 1;
1011 return CMD_SUCCESS;
1012}
1013
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001014DEFUN(loop_endp,
1015 loop_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001016 "loop-endpoint <0-64> NAME (0|1)",
1017 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +08001018 "The name in hex of the endpoint\n" "Disable the loop\n" "Enable the loop\n")
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001019{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001020 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001021 struct mgcp_endpoint *endp;
1022
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001023 trunk = find_trunk(g_cfg, atoi(argv[0]));
1024 if (!trunk) {
1025 vty_out(vty, "%%Trunk %d not found in the config.%s",
1026 atoi(argv[0]), VTY_NEWLINE);
1027 return CMD_WARNING;
1028 }
1029
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001030 if (!trunk->endpoints) {
1031 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1032 trunk->trunk_nr, VTY_NEWLINE);
1033 return CMD_WARNING;
1034 }
1035
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001036 int endp_no = strtoul(argv[1], NULL, 16);
1037 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001038 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001039 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001040 return CMD_WARNING;
1041 }
1042
1043
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001044 endp = &trunk->endpoints[endp_no];
1045 int loop = atoi(argv[2]);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001046
1047 if (loop)
1048 endp->conn_mode = MGCP_CONN_LOOPBACK;
1049 else
1050 endp->conn_mode = endp->orig_mode;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001051
1052 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1053 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
1054 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001055
1056 return CMD_SUCCESS;
1057}
1058
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001059DEFUN(tap_call,
1060 tap_call_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001061 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
1062 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001063 "The endpoint in hex\n"
1064 "Forward the data coming from the bts\n"
1065 "Forward the data coming from the bts leaving to the network\n"
1066 "Forward the data coming from the net\n"
1067 "Forward the data coming from the net leaving to the bts\n"
1068 "destination IP of the data\n" "destination port\n")
1069{
1070 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001071 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001072 struct mgcp_endpoint *endp;
1073 int port = 0;
1074
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001075 trunk = find_trunk(g_cfg, atoi(argv[0]));
1076 if (!trunk) {
1077 vty_out(vty, "%%Trunk %d not found in the config.%s",
1078 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001079 return CMD_WARNING;
1080 }
1081
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001082 if (!trunk->endpoints) {
1083 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1084 trunk->trunk_nr, VTY_NEWLINE);
1085 return CMD_WARNING;
1086 }
1087
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001088 int endp_no = strtoul(argv[1], NULL, 16);
1089 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1090 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1091 argv[1], endp_no, VTY_NEWLINE);
1092 return CMD_WARNING;
1093 }
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001094
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001095 endp = &trunk->endpoints[endp_no];
1096
1097 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001098 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001099 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001100 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001101 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001102 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001103 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001104 port = MGCP_TAP_NET_OUT;
1105 } else {
1106 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1107 return CMD_WARNING;
1108 }
1109
1110 tap = &endp->taps[port];
1111 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001112 inet_aton(argv[3], &tap->forward.sin_addr);
1113 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +08001114 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001115 return CMD_SUCCESS;
1116}
1117
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001118DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001119 "free-endpoint <0-64> NUMBER",
1120 "Free the given endpoint\n" "Trunk number\n"
1121 "Endpoint number in hex.\n")
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001122{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001123 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001124 struct mgcp_endpoint *endp;
1125
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001126 trunk = find_trunk(g_cfg, atoi(argv[0]));
1127 if (!trunk) {
1128 vty_out(vty, "%%Trunk %d not found in the config.%s",
1129 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001130 return CMD_WARNING;
1131 }
1132
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001133 if (!trunk->endpoints) {
1134 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1135 trunk->trunk_nr, VTY_NEWLINE);
1136 return CMD_WARNING;
1137 }
1138
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001139 int endp_no = strtoul(argv[1], NULL, 16);
1140 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1141 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1142 argv[1], endp_no, VTY_NEWLINE);
1143 return CMD_WARNING;
1144 }
1145
1146 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freytherbb8627a2014-07-22 15:00:52 +02001147 mgcp_release_endp(endp);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001148 return CMD_SUCCESS;
1149}
1150
Harald Welteba4f8b22012-01-27 00:41:39 +01001151DEFUN(reset_endp, reset_endp_cmd,
1152 "reset-endpoint <0-64> NUMBER",
1153 "Reset the given endpoint\n" "Trunk number\n"
1154 "Endpoint number in hex.\n")
1155{
1156 struct mgcp_trunk_config *trunk;
1157 struct mgcp_endpoint *endp;
1158 int endp_no, rc;
1159
1160 trunk = find_trunk(g_cfg, atoi(argv[0]));
1161 if (!trunk) {
1162 vty_out(vty, "%%Trunk %d not found in the config.%s",
1163 atoi(argv[0]), VTY_NEWLINE);
1164 return CMD_WARNING;
1165 }
1166
1167 if (!trunk->endpoints) {
1168 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1169 trunk->trunk_nr, VTY_NEWLINE);
1170 return CMD_WARNING;
1171 }
1172
1173 endp_no = strtoul(argv[1], NULL, 16);
1174 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1175 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1176 argv[1], endp_no, VTY_NEWLINE);
1177 return CMD_WARNING;
1178 }
1179
1180 endp = &trunk->endpoints[endp_no];
1181 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1182 if (rc < 0) {
1183 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1184 return CMD_WARNING;
1185 }
1186 return CMD_SUCCESS;
1187}
1188
1189DEFUN(reset_all_endp, reset_all_endp_cmd,
1190 "reset-all-endpoints",
1191 "Reset all endpoints\n")
1192{
1193 int rc;
1194
1195 rc = mgcp_send_reset_all(g_cfg);
1196 if (rc < 0) {
1197 vty_out(vty, "Error %d during endpoint reset.%s",
1198 rc, VTY_NEWLINE);
1199 return CMD_WARNING;
1200 }
1201 return CMD_SUCCESS;
1202}
1203
Holger Hans Peter Freytherea285e42014-06-03 13:36:42 +02001204#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001205DEFUN(cfg_mgcp_osmux,
1206 cfg_mgcp_osmux_cmd,
1207 "osmux (on|off)",
1208 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1209{
1210 if (strcmp(argv[0], "on") == 0) {
1211 g_cfg->osmux = 1;
1212 if (g_cfg->trunk.audio_loop) {
1213 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1214 VTY_NEWLINE);
1215 return CMD_WARNING;
1216 }
1217 } else if (strcmp(argv[0], "off") == 0)
1218 g_cfg->osmux = 0;
1219
1220 return CMD_SUCCESS;
1221}
1222
1223DEFUN(cfg_mgcp_osmux_batch_factor,
1224 cfg_mgcp_osmux_batch_factor_cmd,
Pablo Neira Ayuso9776fd02014-08-29 16:08:45 +02001225 "osmux batch-factor <1-8>",
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001226 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1227{
1228 g_cfg->osmux_batch = atoi(argv[0]);
1229 return CMD_SUCCESS;
1230}
Harald Welteba4f8b22012-01-27 00:41:39 +01001231
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001232DEFUN(cfg_mgcp_osmux_batch_size,
1233 cfg_mgcp_osmux_batch_size_cmd,
1234 "osmux batch-size <1-65535>",
1235 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1236{
1237 g_cfg->osmux_batch_size = atoi(argv[0]);
1238 return CMD_SUCCESS;
1239}
1240
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001241DEFUN(cfg_mgcp_osmux_port,
1242 cfg_mgcp_osmux_port_cmd,
1243 "osmux port <1-65535>",
1244 OSMUX_STR "port\n" "UDP port\n")
1245{
1246 g_cfg->osmux_port = atoi(argv[0]);
1247 return CMD_SUCCESS;
1248}
1249
Pablo Neira Ayuso644fdc22015-07-17 21:56:23 +02001250DEFUN(cfg_mgcp_osmux_dummy,
1251 cfg_mgcp_osmux_dummy_cmd,
1252 "osmux dummy (on|off)",
1253 OSMUX_STR "Enable dummy padding\n" "Disable dummy padding\n")
1254{
1255 if (strcmp(argv[0], "on") == 0)
1256 g_cfg->osmux_dummy = 1;
1257 else if (strcmp(argv[0], "off") == 0)
1258 g_cfg->osmux_dummy = 0;
1259
1260 return CMD_SUCCESS;
1261}
1262
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001263int mgcp_vty_init(void)
1264{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +08001265 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001266 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001267 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001268 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welteba4f8b22012-01-27 00:41:39 +01001269 install_element(ENABLE_NODE, &reset_endp_cmd);
1270 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001271
1272 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1273 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001274
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001275 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001276 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1277 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1278 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1279 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1280 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1281 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +08001282 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +08001283 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +08001284 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1285 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +08001286 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1287 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +08001288 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +08001289 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck16491a92014-04-14 10:31:47 +02001290 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1291 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001292 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1293 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1294 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +02001295 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001296 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +08001297 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +01001298 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +08001299 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001300 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1301 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001302 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1303 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001304 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1305 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001306 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1307 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001308 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1309 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1310 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1311 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1312 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001313 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001314 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1315 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +01001316 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1317 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001318 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1319 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001320 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001321 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Pablo Neira Ayuso644fdc22015-07-17 21:56:23 +02001322 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -04001323 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1324 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
1325
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001326
1327 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1328 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001329 vty_install_default(TRUNK_NODE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001330 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1331 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1332 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001333 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1334 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001335 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1336 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001337 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001338 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1339 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001340 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1341 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1342 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1343 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1344 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001345 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001346 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1347 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +01001348 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1349 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -04001350 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1351 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001352
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001353 return 0;
1354}
1355
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001356static int allocate_trunk(struct mgcp_trunk_config *trunk)
1357{
1358 int i;
1359 struct mgcp_config *cfg = trunk->cfg;
1360
1361 if (mgcp_endpoints_allocate(trunk) != 0) {
1362 LOGP(DMGCP, LOGL_ERROR,
1363 "Failed to allocate %d endpoints on trunk %d.\n",
1364 trunk->number_endpoints, trunk->trunk_nr);
1365 return -1;
1366 }
1367
1368 /* early bind */
1369 for (i = 1; i < trunk->number_endpoints; ++i) {
1370 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001371
1372 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001373 cfg->last_bts_port += 2;
1374 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1375 LOGP(DMGCP, LOGL_FATAL,
1376 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001377 return -1;
1378 }
1379 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1380 }
1381
1382 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001383 cfg->last_net_port += 2;
1384 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1385 LOGP(DMGCP, LOGL_FATAL,
1386 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001387 return -1;
1388 }
1389 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1390 }
1391
Holger Hans Peter Freyther1b8eaf42011-02-28 14:51:48 +01001392 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1393 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001394 int rtp_port;
1395
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001396 /* network side */
1397 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1398 cfg->transcoder_ports.base_port);
1399 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1400 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1401 return -1;
1402 }
1403 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1404
1405 /* bts side */
1406 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1407 cfg->transcoder_ports.base_port);
1408 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1409 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1410 return -1;
1411 }
1412 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1413 }
1414 }
1415
1416 return 0;
1417}
1418
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001419int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1420 enum mgcp_role role)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001421{
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001422 int rc;
1423 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001424
Pablo Neira Ayusofa422c52014-08-29 12:20:17 +02001425 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001426 cfg->osmux_batch = 4;
Pablo Neira Ayusoefb34f62014-08-29 15:31:55 +02001427 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001428
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001429 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +02001430 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001431 if (rc < 0) {
1432 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1433 return rc;
1434 }
1435
1436
1437 if (!g_cfg->bts_ip)
1438 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1439
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +02001440 if (!g_cfg->source_addr) {
1441 fprintf(stderr, "You need to specify a bind address.\n");
1442 return -1;
1443 }
1444
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001445 /* initialize the last ports */
1446 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1447 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1448
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001449 if (allocate_trunk(&g_cfg->trunk) != 0) {
1450 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001451 return -1;
1452 }
1453
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001454 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1455 if (allocate_trunk(trunk) != 0) {
1456 LOGP(DMGCP, LOGL_ERROR,
1457 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1458 return -1;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +08001459 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001460 }
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001461 cfg->role = role;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001462
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +08001463 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001464}
1465