blob: bbbf51758200ee6e2b508cc80f0d96181d0fbf95 [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 Freytherab56ce12011-02-28 00:56:17 +0100119 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
120 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200121 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100122 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800123 if (g_cfg->transcoder_ip)
124 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100125
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800126 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
127 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
128 else
129 vty_out(vty, " rtp transcoder-range %u %u%s",
130 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb30b3aa2014-07-04 20:23:56 +0200131 if (g_cfg->bts_force_ptime > 0)
132 vty_out(vty, " rtp force-ptime %d%s", g_cfg->bts_force_ptime, VTY_NEWLINE);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800133 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100134 vty_out(vty, " osmux %s%s",
135 g_cfg->osmux == 1 ? "on" : "off", VTY_NEWLINE);
Pablo Neira Ayusob84aea32014-08-29 15:24:00 +0200136 if (g_cfg->osmux) {
137 vty_out(vty, " osmux batch-factor %d%s",
138 g_cfg->osmux_batch, VTY_NEWLINE);
139 vty_out(vty, " osmux batch-size %u%s",
140 g_cfg->osmux_batch_size, VTY_NEWLINE);
141 vty_out(vty, " osmux port %u%s",
142 g_cfg->osmux_port, VTY_NEWLINE);
143 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100144 return CMD_SUCCESS;
145}
146
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200147static void dump_rtp_end(const char *end_name, struct vty *vty,
148 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
149{
150 vty_out(vty,
151 " %s%s"
152 " Timestamp Errs: %d->%d%s"
153 " Dropped Packets: %d%s"
154 " Payload Type: %d Rate: %u Channels: %d %s"
155 " Frame Duration: %u Frame Denominator: %u%s"
156 " FPP: %d Packet Duration: %u%s"
157 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
158 " Output-Enabled: %d Force-PTIME: %d%s",
159 end_name, VTY_NEWLINE,
160 state->in_stream.err_ts_counter,
161 state->out_stream.err_ts_counter, VTY_NEWLINE,
162 end->dropped_packets, VTY_NEWLINE,
163 end->payload_type, end->rate, end->channels, VTY_NEWLINE,
164 end->frame_duration_num, end->frame_duration_den, VTY_NEWLINE,
165 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
166 end->fmtp_extra, end->audio_name, end->subtype_name, VTY_NEWLINE,
167 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
168}
169
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100170static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100171{
172 int i;
173
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100174 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
175 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
176 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
177
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100178 if (!cfg->endpoints) {
179 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
180 return;
181 }
182
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100183 for (i = 1; i < cfg->number_endpoints; ++i) {
184 struct mgcp_endpoint *endp = &cfg->endpoints[i];
185 vty_out(vty,
186 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200187 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100188 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-08-05 01:34:51 +0800189 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
190 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
191 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200192 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100193 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200194 VTY_NEWLINE);
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100195
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200196 if (verbose && endp->allocated) {
197 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
198 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck8c1f4b02013-12-19 12:13:32 +0100199 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100200 }
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100201}
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100202
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100203DEFUN(show_mcgp, show_mgcp_cmd,
204 "show mgcp [stats]",
205 SHOW_STR
206 "Display information about the MGCP Media Gateway\n"
207 "Include Statistics\n")
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100208{
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100209 struct mgcp_trunk_config *trunk;
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100210 int show_stats = argc >= 1;
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100211
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100212 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100213
214 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100215 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100216
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100217 return CMD_SUCCESS;
218}
219
220DEFUN(cfg_mgcp,
221 cfg_mgcp_cmd,
222 "mgcp",
223 "Configure the MGCP")
224{
225 vty->node = MGCP_NODE;
226 return CMD_SUCCESS;
227}
228
229DEFUN(cfg_mgcp_local_ip,
230 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800231 "local ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100232 "Local options for the SDP record\n"
233 IP_STR
234 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100235{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200236 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100237 return CMD_SUCCESS;
238}
239
240DEFUN(cfg_mgcp_bts_ip,
241 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800242 "bts ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100243 "BTS Audio source/destination options\n"
244 IP_STR
245 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100246{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200247 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100248 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
249 return CMD_SUCCESS;
250}
251
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100252#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100253DEFUN(cfg_mgcp_bind_ip,
254 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800255 "bind ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100256 BIND_STR
257 IP_STR
258 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100259{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200260 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100261 return CMD_SUCCESS;
262}
263
264DEFUN(cfg_mgcp_bind_port,
265 cfg_mgcp_bind_port_cmd,
266 "bind port <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100267 BIND_STR
268 "Port information\n"
269 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100270{
271 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100272 g_cfg->source_port = port;
273 return CMD_SUCCESS;
274}
275
276DEFUN(cfg_mgcp_bind_early,
277 cfg_mgcp_bind_early_cmd,
278 "bind early (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100279 BIND_STR
280 "Bind local ports on start up\n"
281 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100282{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800283 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
284 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100285}
286
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800287static void parse_base(struct mgcp_port_range *range, const char **argv)
288{
289 unsigned int port = atoi(argv[0]);
290 range->mode = PORT_ALLOC_STATIC;
291 range->base_port = port;
292}
293
294static void parse_range(struct mgcp_port_range *range, const char **argv)
295{
296 range->mode = PORT_ALLOC_DYNAMIC;
297 range->range_start = atoi(argv[0]);
298 range->range_end = atoi(argv[1]);
299 range->last_port = g_cfg->bts_ports.range_start;
300}
301
302
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100303#define RTP_STR "RTP configuration\n"
304#define BTS_START_STR "First UDP port allocated for the BTS side\n"
305#define NET_START_STR "First UDP port allocated for the NET side\n"
306#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800307DEFUN(cfg_mgcp_rtp_bts_base_port,
308 cfg_mgcp_rtp_bts_base_port_cmd,
309 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100310 RTP_STR
311 BTS_START_STR
312 UDP_PORT_STR)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100313{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800314 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100315 return CMD_SUCCESS;
316}
317
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100318#define RANGE_START_STR "Start of the range of ports\n"
319#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800320DEFUN(cfg_mgcp_rtp_bts_range,
321 cfg_mgcp_rtp_bts_range_cmd,
322 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100323 RTP_STR "Range of ports to use for the BTS side\n"
324 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800325{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800326 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800327 return CMD_SUCCESS;
328}
329
330DEFUN(cfg_mgcp_rtp_net_range,
331 cfg_mgcp_rtp_net_range_cmd,
332 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100333 RTP_STR "Range of ports to use for the NET side\n"
334 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800335{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800336 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800337 return CMD_SUCCESS;
338}
339
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800340DEFUN(cfg_mgcp_rtp_net_base_port,
341 cfg_mgcp_rtp_net_base_port_cmd,
342 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100343 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800344{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800345 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800346 return CMD_SUCCESS;
347}
348
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800349ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100350 "rtp base <0-65534>",
351 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800352
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800353DEFUN(cfg_mgcp_rtp_transcoder_range,
354 cfg_mgcp_rtp_transcoder_range_cmd,
355 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100356 RTP_STR "Range of ports to use for the Transcoder\n"
357 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800358{
359 parse_range(&g_cfg->transcoder_ports, argv);
360 return CMD_SUCCESS;
361}
362
363DEFUN(cfg_mgcp_rtp_transcoder_base,
364 cfg_mgcp_rtp_transcoder_base_cmd,
365 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100366 RTP_STR "First UDP port allocated for the Transcoder side\n"
367 UDP_PORT_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800368{
369 parse_base(&g_cfg->transcoder_ports, argv);
370 return CMD_SUCCESS;
371}
372
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800373DEFUN(cfg_mgcp_rtp_ip_dscp,
374 cfg_mgcp_rtp_ip_dscp_cmd,
375 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100376 RTP_STR
377 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800378{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800379 int dscp = atoi(argv[0]);
380 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800381 return CMD_SUCCESS;
382}
383
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800384ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
385 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100386 RTP_STR
387 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800388
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200389#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
390DEFUN(cfg_mgcp_rtp_force_ptime,
391 cfg_mgcp_rtp_force_ptime_cmd,
392 "rtp force-ptime (10|20|40)",
393 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther7a4464e2014-07-04 20:11:11 +0200394 "The required ptime (packet duration) in ms\n"
395 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200396{
397 g_cfg->bts_force_ptime = atoi(argv[0]);
398 return CMD_SUCCESS;
399}
400
401DEFUN(cfg_mgcp_no_rtp_force_ptime,
402 cfg_mgcp_no_rtp_force_ptime_cmd,
403 "no rtp force-ptime",
404 NO_STR RTP_STR FORCE_PTIME_STR)
405{
406 g_cfg->bts_force_ptime = 0;
407 return CMD_SUCCESS;
408}
409
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200410DEFUN(cfg_mgcp_sdp_fmtp_extra,
411 cfg_mgcp_sdp_fmtp_extra_cmd,
412 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100413 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
414 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200415{
416 char *txt = argv_concat(argv, argc, 0);
417 if (!txt)
418 return CMD_WARNING;
419
420 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
421 talloc_free(txt);
422 return CMD_SUCCESS;
423}
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800424
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100425#define SDP_STR "SDP File related options\n"
426#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100427DEFUN(cfg_mgcp_sdp_payload_number,
428 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100429 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100430 SDP_STR AUDIO_STR
431 "Number\n" "Payload number\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100432{
433 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100434 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100435 return CMD_SUCCESS;
436}
437
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100438ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100439 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100440 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
441
442
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100443DEFUN(cfg_mgcp_sdp_payload_name,
444 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100445 "sdp audio-payload name NAME",
446 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100447{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100448 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100449 return CMD_SUCCESS;
450}
451
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100452ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
453 "sdp audio payload name NAME",
454 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
455
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100456DEFUN(cfg_mgcp_sdp_payload_send_ptime,
457 cfg_mgcp_sdp_payload_send_ptime_cmd,
458 "sdp audio-payload send-ptime",
459 SDP_STR AUDIO_STR
460 "Send SDP ptime (packet duration) attribute\n")
461{
462 g_cfg->trunk.audio_send_ptime = 1;
463 return CMD_SUCCESS;
464}
465
466DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
467 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
468 "no sdp audio-payload send-ptime",
469 NO_STR SDP_STR AUDIO_STR
470 "Send SDP ptime (packet duration) attribute\n")
471{
472 g_cfg->trunk.audio_send_ptime = 0;
473 return CMD_SUCCESS;
474}
475
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100476DEFUN(cfg_mgcp_loop,
477 cfg_mgcp_loop_cmd,
478 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100479 "Loop audio for all endpoints on main trunk\n"
480 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100481{
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100482 if (g_cfg->osmux) {
483 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
484 return CMD_WARNING;
485 }
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100486 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100487 return CMD_SUCCESS;
488}
489
490DEFUN(cfg_mgcp_number_endp,
491 cfg_mgcp_number_endp_cmd,
492 "number endpoints <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100493 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100494{
495 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100496 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100497 return CMD_SUCCESS;
498}
499
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200500DEFUN(cfg_mgcp_omit_rtcp,
501 cfg_mgcp_omit_rtcp_cmd,
502 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200503 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200504{
505 g_cfg->trunk.omit_rtcp = 1;
506 return CMD_SUCCESS;
507}
508
509DEFUN(cfg_mgcp_no_omit_rtcp,
510 cfg_mgcp_no_omit_rtcp_cmd,
511 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200512 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200513{
514 g_cfg->trunk.omit_rtcp = 0;
515 return CMD_SUCCESS;
516}
517
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100518DEFUN(cfg_mgcp_patch_rtp_ssrc,
519 cfg_mgcp_patch_rtp_ssrc_cmd,
520 "rtp-patch ssrc",
521 RTP_PATCH_STR
522 "Force a fixed SSRC\n"
523 )
524{
525 g_cfg->trunk.force_constant_ssrc = 1;
526 return CMD_SUCCESS;
527}
528
529DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
530 cfg_mgcp_no_patch_rtp_ssrc_cmd,
531 "no rtp-patch ssrc",
532 NO_STR RTP_PATCH_STR
533 "Force a fixed SSRC\n"
534 )
535{
536 g_cfg->trunk.force_constant_ssrc = 0;
537 return CMD_SUCCESS;
538}
539
540DEFUN(cfg_mgcp_patch_rtp_ts,
541 cfg_mgcp_patch_rtp_ts_cmd,
542 "rtp-patch timestamp",
543 RTP_PATCH_STR
544 "Adjust RTP timestamp\n"
545 )
546{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100547 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100548 return CMD_SUCCESS;
549}
550
551DEFUN(cfg_mgcp_no_patch_rtp_ts,
552 cfg_mgcp_no_patch_rtp_ts_cmd,
553 "no rtp-patch timestamp",
554 NO_STR RTP_PATCH_STR
555 "Adjust RTP timestamp\n"
556 )
557{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100558 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100559 return CMD_SUCCESS;
560}
561
562DEFUN(cfg_mgcp_no_patch_rtp,
563 cfg_mgcp_no_patch_rtp_cmd,
564 "no rtp-patch",
565 NO_STR RTP_PATCH_STR)
566{
567 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100568 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100569 return CMD_SUCCESS;
570}
571
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100572DEFUN(cfg_mgcp_rtp_keepalive,
573 cfg_mgcp_rtp_keepalive_cmd,
574 "rtp keep-alive <1-120>",
575 RTP_STR RTP_KEEPALIVE_STR
576 "Keep alive interval in secs\n"
577 )
578{
579 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
580 return CMD_SUCCESS;
581}
582
583DEFUN(cfg_mgcp_rtp_keepalive_once,
584 cfg_mgcp_rtp_keepalive_once_cmd,
585 "rtp keep-alive once",
586 RTP_STR RTP_KEEPALIVE_STR
587 "Send dummy packet only once after CRCX/MDCX\n"
588 )
589{
590 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
591 return CMD_SUCCESS;
592}
593
594DEFUN(cfg_mgcp_no_rtp_keepalive,
595 cfg_mgcp_no_rtp_keepalive_cmd,
596 "no rtp keep-alive",
597 NO_STR RTP_STR RTP_KEEPALIVE_STR
598 )
599{
600 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
601 return CMD_SUCCESS;
602}
603
604
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100605
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100606#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200607DEFUN(cfg_mgcp_agent_addr,
608 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100609 "call-agent ip A.B.C.D",
610 CALL_AGENT_STR IP_STR
611 "IPv4 Address of the callagent\n")
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200612{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200613 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200614 return CMD_SUCCESS;
615}
616
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100617ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
618 "call agent ip A.B.C.D",
619 CALL_AGENT_STR CALL_AGENT_STR IP_STR
620 "IPv4 Address of the callagent\n")
621
622
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800623DEFUN(cfg_mgcp_transcoder,
624 cfg_mgcp_transcoder_cmd,
625 "transcoder-mgw A.B.C.D",
626 "Use a MGW to detranscoder RTP\n"
627 "The IP address of the MGW")
628{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200629 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800630 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
631
632 return CMD_SUCCESS;
633}
634
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100635DEFUN(cfg_mgcp_no_transcoder,
636 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100637 "no transcoder-mgw",
638 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100639{
640 if (g_cfg->transcoder_ip) {
641 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
642 talloc_free(g_cfg->transcoder_ip);
643 g_cfg->transcoder_ip = NULL;
644 }
645
646 return CMD_SUCCESS;
647}
648
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800649DEFUN(cfg_mgcp_transcoder_remote_base,
650 cfg_mgcp_transcoder_remote_base_cmd,
651 "transcoder-remote-base <0-65534>",
652 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
653{
654 g_cfg->transcoder_remote_base = atoi(argv[0]);
655 return CMD_SUCCESS;
656}
657
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100658DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
659 "trunk <1-64>",
660 "Configure a SS7 trunk\n" "Trunk Nr\n")
661{
662 struct mgcp_trunk_config *trunk;
663 int index = atoi(argv[0]);
664
665 trunk = mgcp_trunk_num(g_cfg, index);
666 if (!trunk)
667 trunk = mgcp_trunk_alloc(g_cfg, index);
668
669 if (!trunk) {
670 vty_out(vty, "%%Unable to allocate trunk %u.%s",
671 index, VTY_NEWLINE);
672 return CMD_WARNING;
673 }
674
675 vty->node = TRUNK_NODE;
676 vty->index = trunk;
677 return CMD_SUCCESS;
678}
679
680static int config_write_trunk(struct vty *vty)
681{
682 struct mgcp_trunk_config *trunk;
683
684 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
685 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100686 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100687 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100688 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100689 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100690 vty_out(vty, " %ssdp audio-payload send-ptime%s",
691 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100692
693 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
694 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
695 else if (trunk->keepalive_interval)
696 vty_out(vty, " rtp keep-alive %d%s",
697 trunk->keepalive_interval, VTY_NEWLINE);
698 else
699 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
700
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100701 vty_out(vty, " loop %d%s",
702 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200703 if (trunk->omit_rtcp)
704 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
705 else
706 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100707 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100708 vty_out(vty, " %srtp-patch ssrc%s",
709 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
710 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100711 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100712 } else
713 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200714 if (trunk->audio_fmtp_extra)
715 vty_out(vty, " sdp audio fmtp-extra %s%s",
716 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100717 }
718
719 return CMD_SUCCESS;
720}
721
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200722DEFUN(cfg_trunk_sdp_fmtp_extra,
723 cfg_trunk_sdp_fmtp_extra_cmd,
724 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100725 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
726 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200727{
728 struct mgcp_trunk_config *trunk = vty->index;
729 char *txt = argv_concat(argv, argc, 0);
730 if (!txt)
731 return CMD_WARNING;
732
733 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
734 talloc_free(txt);
735 return CMD_SUCCESS;
736}
737
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100738DEFUN(cfg_trunk_payload_number,
739 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100740 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100741 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100742{
743 struct mgcp_trunk_config *trunk = vty->index;
744 unsigned int payload = atoi(argv[0]);
745
746 trunk->audio_payload = payload;
747 return CMD_SUCCESS;
748}
749
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100750ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100751 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100752 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
753
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100754DEFUN(cfg_trunk_payload_name,
755 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100756 "sdp audio-payload name NAME",
757 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100758{
759 struct mgcp_trunk_config *trunk = vty->index;
760
761 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
762 return CMD_SUCCESS;
763}
764
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100765ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
766 "sdp audio payload name NAME",
767 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
768
769
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100770DEFUN(cfg_trunk_loop,
771 cfg_trunk_loop_cmd,
772 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100773 "Loop audio for all endpoints on this trunk\n"
774 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100775{
776 struct mgcp_trunk_config *trunk = vty->index;
777
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100778 if (g_cfg->osmux) {
779 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
780 return CMD_WARNING;
781 }
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100782 trunk->audio_loop = atoi(argv[0]);
783 return CMD_SUCCESS;
784}
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800785
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100786DEFUN(cfg_trunk_sdp_payload_send_ptime,
787 cfg_trunk_sdp_payload_send_ptime_cmd,
788 "sdp audio-payload send-ptime",
789 SDP_STR AUDIO_STR
790 "Send SDP ptime (packet duration) attribute\n")
791{
792 struct mgcp_trunk_config *trunk = vty->index;
793 trunk->audio_send_ptime = 1;
794 return CMD_SUCCESS;
795}
796
797DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
798 cfg_trunk_no_sdp_payload_send_ptime_cmd,
799 "no sdp audio-payload send-ptime",
800 NO_STR SDP_STR AUDIO_STR
801 "Send SDP ptime (packet duration) attribute\n")
802{
803 struct mgcp_trunk_config *trunk = vty->index;
804 trunk->audio_send_ptime = 0;
805 return CMD_SUCCESS;
806}
807
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200808DEFUN(cfg_trunk_omit_rtcp,
809 cfg_trunk_omit_rtcp_cmd,
810 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200811 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200812{
813 struct mgcp_trunk_config *trunk = vty->index;
814 trunk->omit_rtcp = 1;
815 return CMD_SUCCESS;
816}
817
818DEFUN(cfg_trunk_no_omit_rtcp,
819 cfg_trunk_no_omit_rtcp_cmd,
820 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200821 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200822{
823 struct mgcp_trunk_config *trunk = vty->index;
824 trunk->omit_rtcp = 0;
825 return CMD_SUCCESS;
826}
827
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100828DEFUN(cfg_trunk_patch_rtp_ssrc,
829 cfg_trunk_patch_rtp_ssrc_cmd,
830 "rtp-patch ssrc",
831 RTP_PATCH_STR
832 "Force a fixed SSRC\n"
833 )
834{
835 struct mgcp_trunk_config *trunk = vty->index;
836 trunk->force_constant_ssrc = 1;
837 return CMD_SUCCESS;
838}
839
840DEFUN(cfg_trunk_no_patch_rtp_ssrc,
841 cfg_trunk_no_patch_rtp_ssrc_cmd,
842 "no rtp-patch ssrc",
843 NO_STR RTP_PATCH_STR
844 "Force a fixed SSRC\n"
845 )
846{
847 struct mgcp_trunk_config *trunk = vty->index;
848 trunk->force_constant_ssrc = 0;
849 return CMD_SUCCESS;
850}
851
852DEFUN(cfg_trunk_patch_rtp_ts,
853 cfg_trunk_patch_rtp_ts_cmd,
854 "rtp-patch timestamp",
855 RTP_PATCH_STR
856 "Adjust RTP timestamp\n"
857 )
858{
859 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100860 trunk->force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100861 return CMD_SUCCESS;
862}
863
864DEFUN(cfg_trunk_no_patch_rtp_ts,
865 cfg_trunk_no_patch_rtp_ts_cmd,
866 "no rtp-patch timestamp",
867 NO_STR RTP_PATCH_STR
868 "Adjust RTP timestamp\n"
869 )
870{
871 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100872 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100873 return CMD_SUCCESS;
874}
875
876DEFUN(cfg_trunk_no_patch_rtp,
877 cfg_trunk_no_patch_rtp_cmd,
878 "no rtp-patch",
879 NO_STR RTP_PATCH_STR)
880{
881 struct mgcp_trunk_config *trunk = vty->index;
882 trunk->force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100883 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100884 return CMD_SUCCESS;
885}
886
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100887DEFUN(cfg_trunk_rtp_keepalive,
888 cfg_trunk_rtp_keepalive_cmd,
889 "rtp keep-alive <1-120>",
890 RTP_STR RTP_KEEPALIVE_STR
891 "Keep-alive interval in secs\n"
892 )
893{
894 struct mgcp_trunk_config *trunk = vty->index;
895 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
896 return CMD_SUCCESS;
897}
898
899DEFUN(cfg_trunk_rtp_keepalive_once,
900 cfg_trunk_rtp_keepalive_once_cmd,
901 "rtp keep-alive once",
902 RTP_STR RTP_KEEPALIVE_STR
903 "Send dummy packet only once after CRCX/MDCX\n"
904 )
905{
906 struct mgcp_trunk_config *trunk = vty->index;
907 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
908 return CMD_SUCCESS;
909}
910
911DEFUN(cfg_trunk_no_rtp_keepalive,
912 cfg_trunk_no_rtp_keepalive_cmd,
913 "no rtp keep-alive",
914 NO_STR RTP_STR RTP_KEEPALIVE_STR
915 )
916{
917 struct mgcp_trunk_config *trunk = vty->index;
918 mgcp_trunk_set_keepalive(trunk, 0);
919 return CMD_SUCCESS;
920}
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100921
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800922DEFUN(loop_endp,
923 loop_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100924 "loop-endpoint <0-64> NAME (0|1)",
925 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +0800926 "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 +0800927{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100928 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800929 struct mgcp_endpoint *endp;
930
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100931 trunk = find_trunk(g_cfg, atoi(argv[0]));
932 if (!trunk) {
933 vty_out(vty, "%%Trunk %d not found in the config.%s",
934 atoi(argv[0]), VTY_NEWLINE);
935 return CMD_WARNING;
936 }
937
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100938 if (!trunk->endpoints) {
939 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
940 trunk->trunk_nr, VTY_NEWLINE);
941 return CMD_WARNING;
942 }
943
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100944 int endp_no = strtoul(argv[1], NULL, 16);
945 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800946 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100947 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800948 return CMD_WARNING;
949 }
950
951
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100952 endp = &trunk->endpoints[endp_no];
953 int loop = atoi(argv[2]);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800954
955 if (loop)
956 endp->conn_mode = MGCP_CONN_LOOPBACK;
957 else
958 endp->conn_mode = endp->orig_mode;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100959
960 /* Handle it like a MDCX, switch on SSRC patching if enabled */
961 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
962 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800963
964 return CMD_SUCCESS;
965}
966
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800967DEFUN(tap_call,
968 tap_call_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100969 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
970 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800971 "The endpoint in hex\n"
972 "Forward the data coming from the bts\n"
973 "Forward the data coming from the bts leaving to the network\n"
974 "Forward the data coming from the net\n"
975 "Forward the data coming from the net leaving to the bts\n"
976 "destination IP of the data\n" "destination port\n")
977{
978 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100979 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800980 struct mgcp_endpoint *endp;
981 int port = 0;
982
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100983 trunk = find_trunk(g_cfg, atoi(argv[0]));
984 if (!trunk) {
985 vty_out(vty, "%%Trunk %d not found in the config.%s",
986 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800987 return CMD_WARNING;
988 }
989
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100990 if (!trunk->endpoints) {
991 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
992 trunk->trunk_nr, VTY_NEWLINE);
993 return CMD_WARNING;
994 }
995
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100996 int endp_no = strtoul(argv[1], NULL, 16);
997 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
998 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
999 argv[1], endp_no, VTY_NEWLINE);
1000 return CMD_WARNING;
1001 }
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001002
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001003 endp = &trunk->endpoints[endp_no];
1004
1005 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001006 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001007 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001008 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001009 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001010 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001011 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001012 port = MGCP_TAP_NET_OUT;
1013 } else {
1014 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1015 return CMD_WARNING;
1016 }
1017
1018 tap = &endp->taps[port];
1019 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001020 inet_aton(argv[3], &tap->forward.sin_addr);
1021 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +08001022 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001023 return CMD_SUCCESS;
1024}
1025
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001026DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001027 "free-endpoint <0-64> NUMBER",
1028 "Free the given endpoint\n" "Trunk number\n"
1029 "Endpoint number in hex.\n")
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001030{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001031 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001032 struct mgcp_endpoint *endp;
1033
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001034 trunk = find_trunk(g_cfg, atoi(argv[0]));
1035 if (!trunk) {
1036 vty_out(vty, "%%Trunk %d not found in the config.%s",
1037 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001038 return CMD_WARNING;
1039 }
1040
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001041 if (!trunk->endpoints) {
1042 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1043 trunk->trunk_nr, VTY_NEWLINE);
1044 return CMD_WARNING;
1045 }
1046
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001047 int endp_no = strtoul(argv[1], NULL, 16);
1048 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1049 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1050 argv[1], endp_no, VTY_NEWLINE);
1051 return CMD_WARNING;
1052 }
1053
1054 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freytherbb8627a2014-07-22 15:00:52 +02001055 mgcp_release_endp(endp);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001056 return CMD_SUCCESS;
1057}
1058
Harald Welteba4f8b22012-01-27 00:41:39 +01001059DEFUN(reset_endp, reset_endp_cmd,
1060 "reset-endpoint <0-64> NUMBER",
1061 "Reset the given endpoint\n" "Trunk number\n"
1062 "Endpoint number in hex.\n")
1063{
1064 struct mgcp_trunk_config *trunk;
1065 struct mgcp_endpoint *endp;
1066 int endp_no, rc;
1067
1068 trunk = find_trunk(g_cfg, atoi(argv[0]));
1069 if (!trunk) {
1070 vty_out(vty, "%%Trunk %d not found in the config.%s",
1071 atoi(argv[0]), VTY_NEWLINE);
1072 return CMD_WARNING;
1073 }
1074
1075 if (!trunk->endpoints) {
1076 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1077 trunk->trunk_nr, VTY_NEWLINE);
1078 return CMD_WARNING;
1079 }
1080
1081 endp_no = strtoul(argv[1], NULL, 16);
1082 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1083 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1084 argv[1], endp_no, VTY_NEWLINE);
1085 return CMD_WARNING;
1086 }
1087
1088 endp = &trunk->endpoints[endp_no];
1089 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1090 if (rc < 0) {
1091 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1092 return CMD_WARNING;
1093 }
1094 return CMD_SUCCESS;
1095}
1096
1097DEFUN(reset_all_endp, reset_all_endp_cmd,
1098 "reset-all-endpoints",
1099 "Reset all endpoints\n")
1100{
1101 int rc;
1102
1103 rc = mgcp_send_reset_all(g_cfg);
1104 if (rc < 0) {
1105 vty_out(vty, "Error %d during endpoint reset.%s",
1106 rc, VTY_NEWLINE);
1107 return CMD_WARNING;
1108 }
1109 return CMD_SUCCESS;
1110}
1111
Holger Hans Peter Freytherea285e42014-06-03 13:36:42 +02001112#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001113DEFUN(cfg_mgcp_osmux,
1114 cfg_mgcp_osmux_cmd,
1115 "osmux (on|off)",
1116 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1117{
1118 if (strcmp(argv[0], "on") == 0) {
1119 g_cfg->osmux = 1;
1120 if (g_cfg->trunk.audio_loop) {
1121 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1122 VTY_NEWLINE);
1123 return CMD_WARNING;
1124 }
1125 } else if (strcmp(argv[0], "off") == 0)
1126 g_cfg->osmux = 0;
1127
1128 return CMD_SUCCESS;
1129}
1130
1131DEFUN(cfg_mgcp_osmux_batch_factor,
1132 cfg_mgcp_osmux_batch_factor_cmd,
Holger Hans Peter Freytherbacf7eb2014-06-16 14:12:02 +02001133 "osmux batch-factor <1-16>",
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001134 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1135{
1136 g_cfg->osmux_batch = atoi(argv[0]);
1137 return CMD_SUCCESS;
1138}
Harald Welteba4f8b22012-01-27 00:41:39 +01001139
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001140DEFUN(cfg_mgcp_osmux_batch_size,
1141 cfg_mgcp_osmux_batch_size_cmd,
1142 "osmux batch-size <1-65535>",
1143 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1144{
1145 g_cfg->osmux_batch_size = atoi(argv[0]);
1146 return CMD_SUCCESS;
1147}
1148
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001149DEFUN(cfg_mgcp_osmux_port,
1150 cfg_mgcp_osmux_port_cmd,
1151 "osmux port <1-65535>",
1152 OSMUX_STR "port\n" "UDP port\n")
1153{
1154 g_cfg->osmux_port = atoi(argv[0]);
1155 return CMD_SUCCESS;
1156}
1157
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001158int mgcp_vty_init(void)
1159{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +08001160 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001161 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001162 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001163 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welteba4f8b22012-01-27 00:41:39 +01001164 install_element(ENABLE_NODE, &reset_endp_cmd);
1165 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001166
1167 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1168 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001169
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001170 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001171 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1172 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1173 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1174 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1175 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1176 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +08001177 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +08001178 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +08001179 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1180 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +08001181 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1182 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +08001183 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +08001184 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck16491a92014-04-14 10:31:47 +02001185 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1186 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001187 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1188 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1189 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +02001190 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001191 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +08001192 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +01001193 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +08001194 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001195 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1196 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001197 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1198 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001199 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1200 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001201 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1202 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001203 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1204 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1205 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1206 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1207 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001208 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001209 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1210 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001211 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1212 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001213 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001214 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001215
1216 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1217 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001218 vty_install_default(TRUNK_NODE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001219 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1220 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1221 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001222 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1223 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001224 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1225 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001226 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001227 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1228 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001229 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1230 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1231 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1232 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1233 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001234 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001235 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1236 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001237
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001238 return 0;
1239}
1240
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001241static int allocate_trunk(struct mgcp_trunk_config *trunk)
1242{
1243 int i;
1244 struct mgcp_config *cfg = trunk->cfg;
1245
1246 if (mgcp_endpoints_allocate(trunk) != 0) {
1247 LOGP(DMGCP, LOGL_ERROR,
1248 "Failed to allocate %d endpoints on trunk %d.\n",
1249 trunk->number_endpoints, trunk->trunk_nr);
1250 return -1;
1251 }
1252
1253 /* early bind */
1254 for (i = 1; i < trunk->number_endpoints; ++i) {
1255 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001256
1257 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001258 cfg->last_bts_port += 2;
1259 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1260 LOGP(DMGCP, LOGL_FATAL,
1261 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001262 return -1;
1263 }
1264 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1265 }
1266
1267 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001268 cfg->last_net_port += 2;
1269 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1270 LOGP(DMGCP, LOGL_FATAL,
1271 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001272 return -1;
1273 }
1274 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1275 }
1276
Holger Hans Peter Freyther1b8eaf42011-02-28 14:51:48 +01001277 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1278 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001279 int rtp_port;
1280
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001281 /* network side */
1282 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1283 cfg->transcoder_ports.base_port);
1284 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1285 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1286 return -1;
1287 }
1288 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1289
1290 /* bts side */
1291 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1292 cfg->transcoder_ports.base_port);
1293 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1294 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1295 return -1;
1296 }
1297 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1298 }
1299 }
1300
1301 return 0;
1302}
1303
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001304int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1305 enum mgcp_role role)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001306{
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001307 int rc;
1308 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001309
Pablo Neira Ayusofa422c52014-08-29 12:20:17 +02001310 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001311 cfg->osmux_batch = 4;
Pablo Neira Ayusoefb34f62014-08-29 15:31:55 +02001312 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001313
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001314 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +02001315 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001316 if (rc < 0) {
1317 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1318 return rc;
1319 }
1320
1321
1322 if (!g_cfg->bts_ip)
1323 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1324
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +02001325 if (!g_cfg->source_addr) {
1326 fprintf(stderr, "You need to specify a bind address.\n");
1327 return -1;
1328 }
1329
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001330 /* initialize the last ports */
1331 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1332 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1333
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001334 if (allocate_trunk(&g_cfg->trunk) != 0) {
1335 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001336 return -1;
1337 }
1338
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001339 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1340 if (allocate_trunk(trunk) != 0) {
1341 LOGP(DMGCP, LOGL_ERROR,
1342 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1343 return -1;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +08001344 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001345 }
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001346 cfg->role = role;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001347
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +08001348 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001349}
1350