blob: dd21a153761a8a4c7107004bc024762c26a30b5d [file] [log] [blame]
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
2/* The protocol implementation */
3
4/*
Holger Hans Peter Freyther8d998a72014-07-04 20:23:56 +02005 * (C) 2009-2014 by Holger Hans Peter Freyther <zecke@selfish.org>
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +01006 * (C) 2009-2011 by On-Waves
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01007 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-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 Freyther7bdc6372010-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 Welte9af6ddf2011-01-01 15:25:50 +010017 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010018 *
Harald Welte9af6ddf2011-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 Freyther7bdc6372010-02-20 21:21:02 +010021 *
22 */
23
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010024
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010025#include <osmocom/core/talloc.h>
Holger Hans Peter Freyther1ebad742010-02-26 20:16:37 +010026
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010027#include <openbsc/mgcp.h>
28#include <openbsc/mgcp_internal.h>
Harald Welte62ab20c2010-05-14 18:59:17 +020029#include <openbsc/vty.h>
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010030
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020031#include <string.h>
32
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +020033#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +010034#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +010035#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +020036
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010037static struct mgcp_config *g_cfg = NULL;
38
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010039static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010040{
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010041 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010042
Holger Hans Peter Freyther6ea7e772011-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 Freytherab3bb9d2011-02-28 01:29:02 +010049}
50
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010051/*
52 * vty code for mgcp below
53 */
54struct cmd_node mgcp_node = {
55 MGCP_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020056 "%s(config-mgcp)# ",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010057 1,
58};
59
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010060struct cmd_node trunk_node = {
61 TRUNK_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020062 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010063 1,
64};
65
Holger Hans Peter Freyther7bdc6372010-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 Freyther8d9833e2010-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 Freyther7bdc6372010-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 Freyther15e73892010-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 Freyther1be9f2f2010-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 Freyther15e73892010-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 Freyther1be9f2f2010-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 Freytherd0c32292010-07-27 20:34:45 +080088 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-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 Freythera8090d52012-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 Erlbeck4bbddc62013-12-18 12:54:51 +0100101 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_aligned_timing) {
Jacob Erlbeckdb2d4312013-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 Erlbeck4bbddc62013-12-18 12:54:51 +0100105 g_cfg->trunk.force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100106 } else
107 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100108 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100109 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100110 g_cfg->trunk.audio_payload, VTY_NEWLINE);
111 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100112 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100113 g_cfg->trunk.audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-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 Erlbeck0a1bc562013-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 Freyther619b0142014-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 Freyther88ad7722011-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 Freythercb43a9a2015-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 Freytherb79994c2010-03-31 11:46:41 +0200125 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100126 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-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 Freyther7bdc6372010-02-20 21:21:02 +0100129
Holger Hans Peter Freyther54aaa0f2010-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 Freyther8d998a72014-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 Freytherb98ba722010-09-19 04:21:39 +0800137 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100138 vty_out(vty, " osmux %s%s",
139 g_cfg->osmux == 1 ? "on" : "off", VTY_NEWLINE);
Pablo Neira Ayusofcec6d82014-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);
147 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100148 return CMD_SUCCESS;
149}
150
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200151static void dump_rtp_end(const char *end_name, struct vty *vty,
152 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
153{
Holger Hans Peter Freythercac24382014-09-01 10:35:55 +0200154 struct mgcp_rtp_codec *codec = &end->codec;
155
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200156 vty_out(vty,
157 " %s%s"
158 " Timestamp Errs: %d->%d%s"
159 " Dropped Packets: %d%s"
160 " Payload Type: %d Rate: %u Channels: %d %s"
161 " Frame Duration: %u Frame Denominator: %u%s"
162 " FPP: %d Packet Duration: %u%s"
163 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
164 " Output-Enabled: %d Force-PTIME: %d%s",
165 end_name, VTY_NEWLINE,
166 state->in_stream.err_ts_counter,
167 state->out_stream.err_ts_counter, VTY_NEWLINE,
168 end->dropped_packets, VTY_NEWLINE,
Holger Hans Peter Freythercac24382014-09-01 10:35:55 +0200169 codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
170 codec->frame_duration_num, codec->frame_duration_den, VTY_NEWLINE,
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200171 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
Holger Hans Peter Freythercac24382014-09-01 10:35:55 +0200172 end->fmtp_extra, codec->audio_name, codec->subtype_name, VTY_NEWLINE,
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200173 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
174}
175
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100176static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100177{
178 int i;
179
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100180 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
181 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
182 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
183
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100184 if (!cfg->endpoints) {
185 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
186 return;
187 }
188
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100189 for (i = 1; i < cfg->number_endpoints; ++i) {
190 struct mgcp_endpoint *endp = &cfg->endpoints[i];
191 vty_out(vty,
192 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200193 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100194 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800195 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
196 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
197 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200198 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100199 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200200 VTY_NEWLINE);
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100201
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200202 if (verbose && endp->allocated) {
203 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
204 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100205 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100206 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100207}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100208
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100209DEFUN(show_mcgp, show_mgcp_cmd,
210 "show mgcp [stats]",
211 SHOW_STR
212 "Display information about the MGCP Media Gateway\n"
213 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100214{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100215 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100216 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100217
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100218 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100219
220 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100221 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100222
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100223 return CMD_SUCCESS;
224}
225
226DEFUN(cfg_mgcp,
227 cfg_mgcp_cmd,
228 "mgcp",
229 "Configure the MGCP")
230{
231 vty->node = MGCP_NODE;
232 return CMD_SUCCESS;
233}
234
235DEFUN(cfg_mgcp_local_ip,
236 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800237 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100238 "Local options for the SDP record\n"
239 IP_STR
240 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100241{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200242 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100243 return CMD_SUCCESS;
244}
245
246DEFUN(cfg_mgcp_bts_ip,
247 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800248 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100249 "BTS Audio source/destination options\n"
250 IP_STR
251 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100252{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200253 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100254 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
255 return CMD_SUCCESS;
256}
257
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100258#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100259DEFUN(cfg_mgcp_bind_ip,
260 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800261 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100262 BIND_STR
263 IP_STR
264 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100265{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200266 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100267 return CMD_SUCCESS;
268}
269
270DEFUN(cfg_mgcp_bind_port,
271 cfg_mgcp_bind_port_cmd,
272 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100273 BIND_STR
274 "Port information\n"
275 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100276{
277 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100278 g_cfg->source_port = port;
279 return CMD_SUCCESS;
280}
281
282DEFUN(cfg_mgcp_bind_early,
283 cfg_mgcp_bind_early_cmd,
284 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100285 BIND_STR
286 "Bind local ports on start up\n"
287 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100288{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800289 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
290 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100291}
292
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800293static void parse_base(struct mgcp_port_range *range, const char **argv)
294{
295 unsigned int port = atoi(argv[0]);
296 range->mode = PORT_ALLOC_STATIC;
297 range->base_port = port;
298}
299
300static void parse_range(struct mgcp_port_range *range, const char **argv)
301{
302 range->mode = PORT_ALLOC_DYNAMIC;
303 range->range_start = atoi(argv[0]);
304 range->range_end = atoi(argv[1]);
305 range->last_port = g_cfg->bts_ports.range_start;
306}
307
308
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100309#define RTP_STR "RTP configuration\n"
310#define BTS_START_STR "First UDP port allocated for the BTS side\n"
311#define NET_START_STR "First UDP port allocated for the NET side\n"
312#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800313DEFUN(cfg_mgcp_rtp_bts_base_port,
314 cfg_mgcp_rtp_bts_base_port_cmd,
315 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100316 RTP_STR
317 BTS_START_STR
318 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100319{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800320 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100321 return CMD_SUCCESS;
322}
323
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100324#define RANGE_START_STR "Start of the range of ports\n"
325#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800326DEFUN(cfg_mgcp_rtp_bts_range,
327 cfg_mgcp_rtp_bts_range_cmd,
328 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100329 RTP_STR "Range of ports to use for the BTS side\n"
330 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800331{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800332 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800333 return CMD_SUCCESS;
334}
335
336DEFUN(cfg_mgcp_rtp_net_range,
337 cfg_mgcp_rtp_net_range_cmd,
338 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100339 RTP_STR "Range of ports to use for the NET side\n"
340 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800341{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800342 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800343 return CMD_SUCCESS;
344}
345
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800346DEFUN(cfg_mgcp_rtp_net_base_port,
347 cfg_mgcp_rtp_net_base_port_cmd,
348 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100349 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800350{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800351 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800352 return CMD_SUCCESS;
353}
354
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800355ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100356 "rtp base <0-65534>",
357 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800358
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800359DEFUN(cfg_mgcp_rtp_transcoder_range,
360 cfg_mgcp_rtp_transcoder_range_cmd,
361 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100362 RTP_STR "Range of ports to use for the Transcoder\n"
363 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800364{
365 parse_range(&g_cfg->transcoder_ports, argv);
366 return CMD_SUCCESS;
367}
368
369DEFUN(cfg_mgcp_rtp_transcoder_base,
370 cfg_mgcp_rtp_transcoder_base_cmd,
371 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100372 RTP_STR "First UDP port allocated for the Transcoder side\n"
373 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800374{
375 parse_base(&g_cfg->transcoder_ports, argv);
376 return CMD_SUCCESS;
377}
378
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800379DEFUN(cfg_mgcp_rtp_ip_dscp,
380 cfg_mgcp_rtp_ip_dscp_cmd,
381 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100382 RTP_STR
Holger Hans Peter Freyther9be675e2015-01-21 11:39:47 +0100383 "Apply IP_TOS to the audio stream (including Osmux)\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800384{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800385 int dscp = atoi(argv[0]);
386 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800387 return CMD_SUCCESS;
388}
389
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800390ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
391 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100392 RTP_STR
393 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800394
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200395#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
396DEFUN(cfg_mgcp_rtp_force_ptime,
397 cfg_mgcp_rtp_force_ptime_cmd,
398 "rtp force-ptime (10|20|40)",
399 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther29474112014-07-04 20:11:11 +0200400 "The required ptime (packet duration) in ms\n"
401 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200402{
403 g_cfg->bts_force_ptime = atoi(argv[0]);
404 return CMD_SUCCESS;
405}
406
407DEFUN(cfg_mgcp_no_rtp_force_ptime,
408 cfg_mgcp_no_rtp_force_ptime_cmd,
409 "no rtp force-ptime",
410 NO_STR RTP_STR FORCE_PTIME_STR)
411{
412 g_cfg->bts_force_ptime = 0;
413 return CMD_SUCCESS;
414}
415
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200416DEFUN(cfg_mgcp_sdp_fmtp_extra,
417 cfg_mgcp_sdp_fmtp_extra_cmd,
418 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100419 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
420 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200421{
422 char *txt = argv_concat(argv, argc, 0);
423 if (!txt)
424 return CMD_WARNING;
425
426 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
427 talloc_free(txt);
428 return CMD_SUCCESS;
429}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800430
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -0400431DEFUN(cfg_mgcp_allow_transcoding,
432 cfg_mgcp_allow_transcoding_cmd,
433 "allow-transcoding",
434 "Allow transcoding\n")
435{
436 g_cfg->trunk.no_audio_transcoding = 0;
437 return CMD_SUCCESS;
438}
439
440DEFUN(cfg_mgcp_no_allow_transcoding,
441 cfg_mgcp_no_allow_transcoding_cmd,
442 "no allow-transcoding",
443 NO_STR "Allow transcoding\n")
444{
445 g_cfg->trunk.no_audio_transcoding = 1;
446 return CMD_SUCCESS;
447}
448
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100449#define SDP_STR "SDP File related options\n"
450#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100451DEFUN(cfg_mgcp_sdp_payload_number,
452 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100453 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100454 SDP_STR AUDIO_STR
455 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100456{
457 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100458 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100459 return CMD_SUCCESS;
460}
461
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100462ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100463 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100464 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
465
466
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100467DEFUN(cfg_mgcp_sdp_payload_name,
468 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100469 "sdp audio-payload name NAME",
470 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100471{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100472 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100473 return CMD_SUCCESS;
474}
475
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100476ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
477 "sdp audio payload name NAME",
478 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
479
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100480DEFUN(cfg_mgcp_sdp_payload_send_ptime,
481 cfg_mgcp_sdp_payload_send_ptime_cmd,
482 "sdp audio-payload send-ptime",
483 SDP_STR AUDIO_STR
484 "Send SDP ptime (packet duration) attribute\n")
485{
486 g_cfg->trunk.audio_send_ptime = 1;
487 return CMD_SUCCESS;
488}
489
490DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
491 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
492 "no sdp audio-payload send-ptime",
493 NO_STR SDP_STR AUDIO_STR
494 "Send SDP ptime (packet duration) attribute\n")
495{
496 g_cfg->trunk.audio_send_ptime = 0;
497 return CMD_SUCCESS;
498}
499
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100500DEFUN(cfg_mgcp_sdp_payload_send_name,
501 cfg_mgcp_sdp_payload_send_name_cmd,
502 "sdp audio-payload send-name",
503 SDP_STR AUDIO_STR
504 "Send SDP rtpmap with the audio name\n")
505{
506 g_cfg->trunk.audio_send_name = 1;
507 return CMD_SUCCESS;
508}
509
510DEFUN(cfg_mgcp_no_sdp_payload_send_name,
511 cfg_mgcp_no_sdp_payload_send_name_cmd,
512 "no sdp audio-payload send-name",
513 NO_STR SDP_STR AUDIO_STR
514 "Send SDP rtpmap with the audio name\n")
515{
516 g_cfg->trunk.audio_send_name = 0;
517 return CMD_SUCCESS;
518}
519
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100520DEFUN(cfg_mgcp_loop,
521 cfg_mgcp_loop_cmd,
522 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100523 "Loop audio for all endpoints on main trunk\n"
524 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100525{
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100526 if (g_cfg->osmux) {
527 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
528 return CMD_WARNING;
529 }
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100530 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100531 return CMD_SUCCESS;
532}
533
534DEFUN(cfg_mgcp_number_endp,
535 cfg_mgcp_number_endp_cmd,
536 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100537 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100538{
539 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100540 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100541 return CMD_SUCCESS;
542}
543
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200544DEFUN(cfg_mgcp_omit_rtcp,
545 cfg_mgcp_omit_rtcp_cmd,
546 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200547 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200548{
549 g_cfg->trunk.omit_rtcp = 1;
550 return CMD_SUCCESS;
551}
552
553DEFUN(cfg_mgcp_no_omit_rtcp,
554 cfg_mgcp_no_omit_rtcp_cmd,
555 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200556 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200557{
558 g_cfg->trunk.omit_rtcp = 0;
559 return CMD_SUCCESS;
560}
561
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100562DEFUN(cfg_mgcp_patch_rtp_ssrc,
563 cfg_mgcp_patch_rtp_ssrc_cmd,
564 "rtp-patch ssrc",
565 RTP_PATCH_STR
566 "Force a fixed SSRC\n"
567 )
568{
569 g_cfg->trunk.force_constant_ssrc = 1;
570 return CMD_SUCCESS;
571}
572
573DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
574 cfg_mgcp_no_patch_rtp_ssrc_cmd,
575 "no rtp-patch ssrc",
576 NO_STR RTP_PATCH_STR
577 "Force a fixed SSRC\n"
578 )
579{
580 g_cfg->trunk.force_constant_ssrc = 0;
581 return CMD_SUCCESS;
582}
583
584DEFUN(cfg_mgcp_patch_rtp_ts,
585 cfg_mgcp_patch_rtp_ts_cmd,
586 "rtp-patch timestamp",
587 RTP_PATCH_STR
588 "Adjust RTP timestamp\n"
589 )
590{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100591 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100592 return CMD_SUCCESS;
593}
594
595DEFUN(cfg_mgcp_no_patch_rtp_ts,
596 cfg_mgcp_no_patch_rtp_ts_cmd,
597 "no rtp-patch timestamp",
598 NO_STR RTP_PATCH_STR
599 "Adjust RTP timestamp\n"
600 )
601{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100602 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100603 return CMD_SUCCESS;
604}
605
606DEFUN(cfg_mgcp_no_patch_rtp,
607 cfg_mgcp_no_patch_rtp_cmd,
608 "no rtp-patch",
609 NO_STR RTP_PATCH_STR)
610{
611 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100612 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100613 return CMD_SUCCESS;
614}
615
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100616DEFUN(cfg_mgcp_rtp_keepalive,
617 cfg_mgcp_rtp_keepalive_cmd,
618 "rtp keep-alive <1-120>",
619 RTP_STR RTP_KEEPALIVE_STR
620 "Keep alive interval in secs\n"
621 )
622{
623 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
624 return CMD_SUCCESS;
625}
626
627DEFUN(cfg_mgcp_rtp_keepalive_once,
628 cfg_mgcp_rtp_keepalive_once_cmd,
629 "rtp keep-alive once",
630 RTP_STR RTP_KEEPALIVE_STR
631 "Send dummy packet only once after CRCX/MDCX\n"
632 )
633{
634 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
635 return CMD_SUCCESS;
636}
637
638DEFUN(cfg_mgcp_no_rtp_keepalive,
639 cfg_mgcp_no_rtp_keepalive_cmd,
640 "no rtp keep-alive",
641 NO_STR RTP_STR RTP_KEEPALIVE_STR
642 )
643{
644 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
645 return CMD_SUCCESS;
646}
647
648
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100649
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100650#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200651DEFUN(cfg_mgcp_agent_addr,
652 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100653 "call-agent ip A.B.C.D",
654 CALL_AGENT_STR IP_STR
655 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200656{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200657 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200658 return CMD_SUCCESS;
659}
660
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100661ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
662 "call agent ip A.B.C.D",
663 CALL_AGENT_STR CALL_AGENT_STR IP_STR
664 "IPv4 Address of the callagent\n")
665
666
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800667DEFUN(cfg_mgcp_transcoder,
668 cfg_mgcp_transcoder_cmd,
669 "transcoder-mgw A.B.C.D",
670 "Use a MGW to detranscoder RTP\n"
671 "The IP address of the MGW")
672{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200673 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800674 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
675
676 return CMD_SUCCESS;
677}
678
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100679DEFUN(cfg_mgcp_no_transcoder,
680 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100681 "no transcoder-mgw",
682 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100683{
684 if (g_cfg->transcoder_ip) {
685 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
686 talloc_free(g_cfg->transcoder_ip);
687 g_cfg->transcoder_ip = NULL;
688 }
689
690 return CMD_SUCCESS;
691}
692
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800693DEFUN(cfg_mgcp_transcoder_remote_base,
694 cfg_mgcp_transcoder_remote_base_cmd,
695 "transcoder-remote-base <0-65534>",
696 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
697{
698 g_cfg->transcoder_remote_base = atoi(argv[0]);
699 return CMD_SUCCESS;
700}
701
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100702DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
703 "trunk <1-64>",
704 "Configure a SS7 trunk\n" "Trunk Nr\n")
705{
706 struct mgcp_trunk_config *trunk;
707 int index = atoi(argv[0]);
708
709 trunk = mgcp_trunk_num(g_cfg, index);
710 if (!trunk)
711 trunk = mgcp_trunk_alloc(g_cfg, index);
712
713 if (!trunk) {
714 vty_out(vty, "%%Unable to allocate trunk %u.%s",
715 index, VTY_NEWLINE);
716 return CMD_WARNING;
717 }
718
719 vty->node = TRUNK_NODE;
720 vty->index = trunk;
721 return CMD_SUCCESS;
722}
723
724static int config_write_trunk(struct vty *vty)
725{
726 struct mgcp_trunk_config *trunk;
727
728 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
729 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100730 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100731 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100732 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100733 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100734 vty_out(vty, " %ssdp audio-payload send-ptime%s",
735 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100736 vty_out(vty, " %ssdp audio-payload send-name%s",
737 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100738
739 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
740 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
741 else if (trunk->keepalive_interval)
742 vty_out(vty, " rtp keep-alive %d%s",
743 trunk->keepalive_interval, VTY_NEWLINE);
744 else
745 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
746
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100747 vty_out(vty, " loop %d%s",
748 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200749 if (trunk->omit_rtcp)
750 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
751 else
752 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100753 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100754 vty_out(vty, " %srtp-patch ssrc%s",
755 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
756 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100757 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100758 } else
759 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200760 if (trunk->audio_fmtp_extra)
761 vty_out(vty, " sdp audio fmtp-extra %s%s",
762 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -0400763 vty_out(vty, " %sallow-transcoding%s",
764 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100765 }
766
767 return CMD_SUCCESS;
768}
769
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200770DEFUN(cfg_trunk_sdp_fmtp_extra,
771 cfg_trunk_sdp_fmtp_extra_cmd,
772 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100773 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
774 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200775{
776 struct mgcp_trunk_config *trunk = vty->index;
777 char *txt = argv_concat(argv, argc, 0);
778 if (!txt)
779 return CMD_WARNING;
780
781 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
782 talloc_free(txt);
783 return CMD_SUCCESS;
784}
785
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100786DEFUN(cfg_trunk_payload_number,
787 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100788 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100789 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100790{
791 struct mgcp_trunk_config *trunk = vty->index;
792 unsigned int payload = atoi(argv[0]);
793
794 trunk->audio_payload = payload;
795 return CMD_SUCCESS;
796}
797
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100798ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100799 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100800 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
801
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100802DEFUN(cfg_trunk_payload_name,
803 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100804 "sdp audio-payload name NAME",
805 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100806{
807 struct mgcp_trunk_config *trunk = vty->index;
808
809 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
810 return CMD_SUCCESS;
811}
812
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100813ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
814 "sdp audio payload name NAME",
815 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
816
817
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100818DEFUN(cfg_trunk_loop,
819 cfg_trunk_loop_cmd,
820 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100821 "Loop audio for all endpoints on this trunk\n"
822 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100823{
824 struct mgcp_trunk_config *trunk = vty->index;
825
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100826 if (g_cfg->osmux) {
827 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
828 return CMD_WARNING;
829 }
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100830 trunk->audio_loop = atoi(argv[0]);
831 return CMD_SUCCESS;
832}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800833
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100834DEFUN(cfg_trunk_sdp_payload_send_ptime,
835 cfg_trunk_sdp_payload_send_ptime_cmd,
836 "sdp audio-payload send-ptime",
837 SDP_STR AUDIO_STR
838 "Send SDP ptime (packet duration) attribute\n")
839{
840 struct mgcp_trunk_config *trunk = vty->index;
841 trunk->audio_send_ptime = 1;
842 return CMD_SUCCESS;
843}
844
845DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
846 cfg_trunk_no_sdp_payload_send_ptime_cmd,
847 "no sdp audio-payload send-ptime",
848 NO_STR SDP_STR AUDIO_STR
849 "Send SDP ptime (packet duration) attribute\n")
850{
851 struct mgcp_trunk_config *trunk = vty->index;
852 trunk->audio_send_ptime = 0;
853 return CMD_SUCCESS;
854}
855
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100856DEFUN(cfg_trunk_sdp_payload_send_name,
857 cfg_trunk_sdp_payload_send_name_cmd,
858 "sdp audio-payload send-name",
859 SDP_STR AUDIO_STR
860 "Send SDP rtpmap with the audio name\n")
861{
862 struct mgcp_trunk_config *trunk = vty->index;
863 trunk->audio_send_name = 1;
864 return CMD_SUCCESS;
865}
866
867DEFUN(cfg_trunk_no_sdp_payload_send_name,
868 cfg_trunk_no_sdp_payload_send_name_cmd,
869 "no sdp audio-payload send-name",
870 NO_STR SDP_STR AUDIO_STR
871 "Send SDP rtpmap with the audio name\n")
872{
873 struct mgcp_trunk_config *trunk = vty->index;
874 trunk->audio_send_name = 0;
875 return CMD_SUCCESS;
876}
877
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200878DEFUN(cfg_trunk_omit_rtcp,
879 cfg_trunk_omit_rtcp_cmd,
880 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200881 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200882{
883 struct mgcp_trunk_config *trunk = vty->index;
884 trunk->omit_rtcp = 1;
885 return CMD_SUCCESS;
886}
887
888DEFUN(cfg_trunk_no_omit_rtcp,
889 cfg_trunk_no_omit_rtcp_cmd,
890 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200891 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200892{
893 struct mgcp_trunk_config *trunk = vty->index;
894 trunk->omit_rtcp = 0;
895 return CMD_SUCCESS;
896}
897
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100898DEFUN(cfg_trunk_patch_rtp_ssrc,
899 cfg_trunk_patch_rtp_ssrc_cmd,
900 "rtp-patch ssrc",
901 RTP_PATCH_STR
902 "Force a fixed SSRC\n"
903 )
904{
905 struct mgcp_trunk_config *trunk = vty->index;
906 trunk->force_constant_ssrc = 1;
907 return CMD_SUCCESS;
908}
909
910DEFUN(cfg_trunk_no_patch_rtp_ssrc,
911 cfg_trunk_no_patch_rtp_ssrc_cmd,
912 "no rtp-patch ssrc",
913 NO_STR RTP_PATCH_STR
914 "Force a fixed SSRC\n"
915 )
916{
917 struct mgcp_trunk_config *trunk = vty->index;
918 trunk->force_constant_ssrc = 0;
919 return CMD_SUCCESS;
920}
921
922DEFUN(cfg_trunk_patch_rtp_ts,
923 cfg_trunk_patch_rtp_ts_cmd,
924 "rtp-patch timestamp",
925 RTP_PATCH_STR
926 "Adjust RTP timestamp\n"
927 )
928{
929 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100930 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100931 return CMD_SUCCESS;
932}
933
934DEFUN(cfg_trunk_no_patch_rtp_ts,
935 cfg_trunk_no_patch_rtp_ts_cmd,
936 "no rtp-patch timestamp",
937 NO_STR RTP_PATCH_STR
938 "Adjust RTP timestamp\n"
939 )
940{
941 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100942 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100943 return CMD_SUCCESS;
944}
945
946DEFUN(cfg_trunk_no_patch_rtp,
947 cfg_trunk_no_patch_rtp_cmd,
948 "no rtp-patch",
949 NO_STR RTP_PATCH_STR)
950{
951 struct mgcp_trunk_config *trunk = vty->index;
952 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100953 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100954 return CMD_SUCCESS;
955}
956
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100957DEFUN(cfg_trunk_rtp_keepalive,
958 cfg_trunk_rtp_keepalive_cmd,
959 "rtp keep-alive <1-120>",
960 RTP_STR RTP_KEEPALIVE_STR
961 "Keep-alive interval in secs\n"
962 )
963{
964 struct mgcp_trunk_config *trunk = vty->index;
965 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
966 return CMD_SUCCESS;
967}
968
969DEFUN(cfg_trunk_rtp_keepalive_once,
970 cfg_trunk_rtp_keepalive_once_cmd,
971 "rtp keep-alive once",
972 RTP_STR RTP_KEEPALIVE_STR
973 "Send dummy packet only once after CRCX/MDCX\n"
974 )
975{
976 struct mgcp_trunk_config *trunk = vty->index;
977 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
978 return CMD_SUCCESS;
979}
980
981DEFUN(cfg_trunk_no_rtp_keepalive,
982 cfg_trunk_no_rtp_keepalive_cmd,
983 "no rtp keep-alive",
984 NO_STR RTP_STR RTP_KEEPALIVE_STR
985 )
986{
987 struct mgcp_trunk_config *trunk = vty->index;
988 mgcp_trunk_set_keepalive(trunk, 0);
989 return CMD_SUCCESS;
990}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100991
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -0400992DEFUN(cfg_trunk_allow_transcoding,
993 cfg_trunk_allow_transcoding_cmd,
994 "allow-transcoding",
995 "Allow transcoding\n")
996{
997 struct mgcp_trunk_config *trunk = vty->index;
998 trunk->no_audio_transcoding = 0;
999 return CMD_SUCCESS;
1000}
1001
1002DEFUN(cfg_trunk_no_allow_transcoding,
1003 cfg_trunk_no_allow_transcoding_cmd,
1004 "no allow-transcoding",
1005 NO_STR "Allow transcoding\n")
1006{
1007 struct mgcp_trunk_config *trunk = vty->index;
1008 trunk->no_audio_transcoding = 1;
1009 return CMD_SUCCESS;
1010}
1011
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001012DEFUN(loop_endp,
1013 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001014 "loop-endpoint <0-64> NAME (0|1)",
1015 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +08001016 "The name in hex of the endpoint\n" "Disable the loop\n" "Enable the loop\n")
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001017{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001018 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001019 struct mgcp_endpoint *endp;
1020
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001021 trunk = find_trunk(g_cfg, atoi(argv[0]));
1022 if (!trunk) {
1023 vty_out(vty, "%%Trunk %d not found in the config.%s",
1024 atoi(argv[0]), VTY_NEWLINE);
1025 return CMD_WARNING;
1026 }
1027
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001028 if (!trunk->endpoints) {
1029 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1030 trunk->trunk_nr, VTY_NEWLINE);
1031 return CMD_WARNING;
1032 }
1033
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001034 int endp_no = strtoul(argv[1], NULL, 16);
1035 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001036 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001037 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001038 return CMD_WARNING;
1039 }
1040
1041
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001042 endp = &trunk->endpoints[endp_no];
1043 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001044
1045 if (loop)
1046 endp->conn_mode = MGCP_CONN_LOOPBACK;
1047 else
1048 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001049
1050 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1051 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
1052 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001053
1054 return CMD_SUCCESS;
1055}
1056
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001057DEFUN(tap_call,
1058 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001059 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
1060 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001061 "The endpoint in hex\n"
1062 "Forward the data coming from the bts\n"
1063 "Forward the data coming from the bts leaving to the network\n"
1064 "Forward the data coming from the net\n"
1065 "Forward the data coming from the net leaving to the bts\n"
1066 "destination IP of the data\n" "destination port\n")
1067{
1068 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001069 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001070 struct mgcp_endpoint *endp;
1071 int port = 0;
1072
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001073 trunk = find_trunk(g_cfg, atoi(argv[0]));
1074 if (!trunk) {
1075 vty_out(vty, "%%Trunk %d not found in the config.%s",
1076 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001077 return CMD_WARNING;
1078 }
1079
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001080 if (!trunk->endpoints) {
1081 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1082 trunk->trunk_nr, VTY_NEWLINE);
1083 return CMD_WARNING;
1084 }
1085
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001086 int endp_no = strtoul(argv[1], NULL, 16);
1087 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1088 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1089 argv[1], endp_no, VTY_NEWLINE);
1090 return CMD_WARNING;
1091 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001092
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001093 endp = &trunk->endpoints[endp_no];
1094
1095 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001096 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001097 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001098 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001099 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001100 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001101 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001102 port = MGCP_TAP_NET_OUT;
1103 } else {
1104 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1105 return CMD_WARNING;
1106 }
1107
1108 tap = &endp->taps[port];
1109 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001110 inet_aton(argv[3], &tap->forward.sin_addr);
1111 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +08001112 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001113 return CMD_SUCCESS;
1114}
1115
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001116DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001117 "free-endpoint <0-64> NUMBER",
1118 "Free the given endpoint\n" "Trunk number\n"
1119 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001120{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001121 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001122 struct mgcp_endpoint *endp;
1123
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001124 trunk = find_trunk(g_cfg, atoi(argv[0]));
1125 if (!trunk) {
1126 vty_out(vty, "%%Trunk %d not found in the config.%s",
1127 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001128 return CMD_WARNING;
1129 }
1130
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001131 if (!trunk->endpoints) {
1132 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1133 trunk->trunk_nr, VTY_NEWLINE);
1134 return CMD_WARNING;
1135 }
1136
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001137 int endp_no = strtoul(argv[1], NULL, 16);
1138 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1139 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1140 argv[1], endp_no, VTY_NEWLINE);
1141 return CMD_WARNING;
1142 }
1143
1144 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freythercb6ad702014-07-22 15:00:52 +02001145 mgcp_release_endp(endp);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001146 return CMD_SUCCESS;
1147}
1148
Harald Welte6a857052012-01-27 00:41:39 +01001149DEFUN(reset_endp, reset_endp_cmd,
1150 "reset-endpoint <0-64> NUMBER",
1151 "Reset the given endpoint\n" "Trunk number\n"
1152 "Endpoint number in hex.\n")
1153{
1154 struct mgcp_trunk_config *trunk;
1155 struct mgcp_endpoint *endp;
1156 int endp_no, rc;
1157
1158 trunk = find_trunk(g_cfg, atoi(argv[0]));
1159 if (!trunk) {
1160 vty_out(vty, "%%Trunk %d not found in the config.%s",
1161 atoi(argv[0]), VTY_NEWLINE);
1162 return CMD_WARNING;
1163 }
1164
1165 if (!trunk->endpoints) {
1166 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1167 trunk->trunk_nr, VTY_NEWLINE);
1168 return CMD_WARNING;
1169 }
1170
1171 endp_no = strtoul(argv[1], NULL, 16);
1172 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1173 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1174 argv[1], endp_no, VTY_NEWLINE);
1175 return CMD_WARNING;
1176 }
1177
1178 endp = &trunk->endpoints[endp_no];
1179 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1180 if (rc < 0) {
1181 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1182 return CMD_WARNING;
1183 }
1184 return CMD_SUCCESS;
1185}
1186
1187DEFUN(reset_all_endp, reset_all_endp_cmd,
1188 "reset-all-endpoints",
1189 "Reset all endpoints\n")
1190{
1191 int rc;
1192
1193 rc = mgcp_send_reset_all(g_cfg);
1194 if (rc < 0) {
1195 vty_out(vty, "Error %d during endpoint reset.%s",
1196 rc, VTY_NEWLINE);
1197 return CMD_WARNING;
1198 }
1199 return CMD_SUCCESS;
1200}
1201
Holger Hans Peter Freythercc84c952014-06-03 13:36:42 +02001202#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001203DEFUN(cfg_mgcp_osmux,
1204 cfg_mgcp_osmux_cmd,
1205 "osmux (on|off)",
1206 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1207{
1208 if (strcmp(argv[0], "on") == 0) {
1209 g_cfg->osmux = 1;
1210 if (g_cfg->trunk.audio_loop) {
1211 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1212 VTY_NEWLINE);
1213 return CMD_WARNING;
1214 }
1215 } else if (strcmp(argv[0], "off") == 0)
1216 g_cfg->osmux = 0;
1217
1218 return CMD_SUCCESS;
1219}
1220
1221DEFUN(cfg_mgcp_osmux_batch_factor,
1222 cfg_mgcp_osmux_batch_factor_cmd,
Pablo Neira Ayusoc20a6612014-08-29 16:08:45 +02001223 "osmux batch-factor <1-8>",
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001224 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1225{
1226 g_cfg->osmux_batch = atoi(argv[0]);
1227 return CMD_SUCCESS;
1228}
Harald Welte6a857052012-01-27 00:41:39 +01001229
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +02001230DEFUN(cfg_mgcp_osmux_batch_size,
1231 cfg_mgcp_osmux_batch_size_cmd,
1232 "osmux batch-size <1-65535>",
1233 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1234{
1235 g_cfg->osmux_batch_size = atoi(argv[0]);
1236 return CMD_SUCCESS;
1237}
1238
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001239DEFUN(cfg_mgcp_osmux_port,
1240 cfg_mgcp_osmux_port_cmd,
1241 "osmux port <1-65535>",
1242 OSMUX_STR "port\n" "UDP port\n")
1243{
1244 g_cfg->osmux_port = atoi(argv[0]);
1245 return CMD_SUCCESS;
1246}
1247
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001248int mgcp_vty_init(void)
1249{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001250 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001251 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001252 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001253 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001254 install_element(ENABLE_NODE, &reset_endp_cmd);
1255 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001256
1257 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1258 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001259
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001260 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001261 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1262 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1263 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1264 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1265 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1266 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001267 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001268 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001269 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1270 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001271 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1272 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001273 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001274 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck42a833e2014-04-14 10:31:47 +02001275 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1276 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001277 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1278 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1279 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001280 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001281 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001282 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001283 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001284 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001285 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1286 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001287 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1288 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001289 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1290 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001291 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1292 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001293 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1294 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1295 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1296 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1297 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001298 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001299 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1300 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +01001301 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1302 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001303 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1304 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +02001305 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001306 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001307 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1308 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
1309
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001310
1311 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1312 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001313 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001314 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1315 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1316 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001317 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1318 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001319 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1320 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001321 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001322 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1323 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001324 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1325 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1326 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1327 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1328 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001329 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001330 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1331 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +01001332 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1333 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001334 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1335 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001336
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001337 return 0;
1338}
1339
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001340static int allocate_trunk(struct mgcp_trunk_config *trunk)
1341{
1342 int i;
1343 struct mgcp_config *cfg = trunk->cfg;
1344
1345 if (mgcp_endpoints_allocate(trunk) != 0) {
1346 LOGP(DMGCP, LOGL_ERROR,
1347 "Failed to allocate %d endpoints on trunk %d.\n",
1348 trunk->number_endpoints, trunk->trunk_nr);
1349 return -1;
1350 }
1351
1352 /* early bind */
1353 for (i = 1; i < trunk->number_endpoints; ++i) {
1354 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001355
1356 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001357 cfg->last_bts_port += 2;
1358 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1359 LOGP(DMGCP, LOGL_FATAL,
1360 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001361 return -1;
1362 }
1363 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1364 }
1365
1366 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001367 cfg->last_net_port += 2;
1368 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1369 LOGP(DMGCP, LOGL_FATAL,
1370 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001371 return -1;
1372 }
1373 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1374 }
1375
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001376 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1377 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001378 int rtp_port;
1379
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001380 /* network side */
1381 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1382 cfg->transcoder_ports.base_port);
1383 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1384 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1385 return -1;
1386 }
1387 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1388
1389 /* bts side */
1390 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1391 cfg->transcoder_ports.base_port);
1392 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1393 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1394 return -1;
1395 }
1396 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1397 }
1398 }
1399
1400 return 0;
1401}
1402
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001403int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1404 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001405{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001406 int rc;
1407 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001408
Pablo Neira Ayuso308d5f82014-08-29 12:20:17 +02001409 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001410 cfg->osmux_batch = 4;
Pablo Neira Ayuso08726e22014-08-29 15:31:55 +02001411 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001412
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001413 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001414 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001415 if (rc < 0) {
1416 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1417 return rc;
1418 }
1419
1420
1421 if (!g_cfg->bts_ip)
1422 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1423
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001424 if (!g_cfg->source_addr) {
1425 fprintf(stderr, "You need to specify a bind address.\n");
1426 return -1;
1427 }
1428
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001429 /* initialize the last ports */
1430 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1431 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1432
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001433 if (allocate_trunk(&g_cfg->trunk) != 0) {
1434 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001435 return -1;
1436 }
1437
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001438 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1439 if (allocate_trunk(trunk) != 0) {
1440 LOGP(DMGCP, LOGL_ERROR,
1441 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1442 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001443 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001444 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001445 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001446
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001447 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001448}
1449