blob: e42c691ada50b6dc83584fa86a43e8e4044e5158 [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);
136 vty_out(vty, " osmux batch-factor %d%s",
137 g_cfg->osmux_batch, VTY_NEWLINE);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800138
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100139 return CMD_SUCCESS;
140}
141
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100142static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100143{
144 int i;
145
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100146 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
147 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
148 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
149
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100150 if (!cfg->endpoints) {
151 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
152 return;
153 }
154
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100155 for (i = 1; i < cfg->number_endpoints; ++i) {
156 struct mgcp_endpoint *endp = &cfg->endpoints[i];
157 vty_out(vty,
158 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200159 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100160 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-08-05 01:34:51 +0800161 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
162 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
163 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200164 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100165 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200166 VTY_NEWLINE);
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100167
Jacob Erlbeck8c1f4b02013-12-19 12:13:32 +0100168 if (verbose) {
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100169 vty_out(vty,
170 " Timestamp Errs: BTS %d->%d, Net %d->%d%s",
171 endp->bts_state.in_stream.err_ts_counter,
172 endp->bts_state.out_stream.err_ts_counter,
173 endp->net_state.in_stream.err_ts_counter,
174 endp->net_state.out_stream.err_ts_counter,
175 VTY_NEWLINE);
Jacob Erlbeck8c1f4b02013-12-19 12:13:32 +0100176 vty_out(vty,
177 " Dropped Packets: Net->BTS %d, BTS->Net %d%s",
178 endp->bts_end.dropped_packets,
179 endp->net_end.dropped_packets,
180 VTY_NEWLINE);
181 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100182 }
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100183}
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100184
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100185DEFUN(show_mcgp, show_mgcp_cmd,
186 "show mgcp [stats]",
187 SHOW_STR
188 "Display information about the MGCP Media Gateway\n"
189 "Include Statistics\n")
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100190{
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100191 struct mgcp_trunk_config *trunk;
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100192 int show_stats = argc >= 1;
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100193
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100194 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100195
196 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100197 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100198
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100199 return CMD_SUCCESS;
200}
201
202DEFUN(cfg_mgcp,
203 cfg_mgcp_cmd,
204 "mgcp",
205 "Configure the MGCP")
206{
207 vty->node = MGCP_NODE;
208 return CMD_SUCCESS;
209}
210
211DEFUN(cfg_mgcp_local_ip,
212 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800213 "local ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100214 "Local options for the SDP record\n"
215 IP_STR
216 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100217{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200218 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100219 return CMD_SUCCESS;
220}
221
222DEFUN(cfg_mgcp_bts_ip,
223 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800224 "bts ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100225 "BTS Audio source/destination options\n"
226 IP_STR
227 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100228{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200229 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100230 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
231 return CMD_SUCCESS;
232}
233
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100234#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100235DEFUN(cfg_mgcp_bind_ip,
236 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800237 "bind ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100238 BIND_STR
239 IP_STR
240 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100241{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200242 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100243 return CMD_SUCCESS;
244}
245
246DEFUN(cfg_mgcp_bind_port,
247 cfg_mgcp_bind_port_cmd,
248 "bind port <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100249 BIND_STR
250 "Port information\n"
251 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100252{
253 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100254 g_cfg->source_port = port;
255 return CMD_SUCCESS;
256}
257
258DEFUN(cfg_mgcp_bind_early,
259 cfg_mgcp_bind_early_cmd,
260 "bind early (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100261 BIND_STR
262 "Bind local ports on start up\n"
263 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100264{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800265 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
266 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100267}
268
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800269static void parse_base(struct mgcp_port_range *range, const char **argv)
270{
271 unsigned int port = atoi(argv[0]);
272 range->mode = PORT_ALLOC_STATIC;
273 range->base_port = port;
274}
275
276static void parse_range(struct mgcp_port_range *range, const char **argv)
277{
278 range->mode = PORT_ALLOC_DYNAMIC;
279 range->range_start = atoi(argv[0]);
280 range->range_end = atoi(argv[1]);
281 range->last_port = g_cfg->bts_ports.range_start;
282}
283
284
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100285#define RTP_STR "RTP configuration\n"
286#define BTS_START_STR "First UDP port allocated for the BTS side\n"
287#define NET_START_STR "First UDP port allocated for the NET side\n"
288#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800289DEFUN(cfg_mgcp_rtp_bts_base_port,
290 cfg_mgcp_rtp_bts_base_port_cmd,
291 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100292 RTP_STR
293 BTS_START_STR
294 UDP_PORT_STR)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100295{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800296 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100297 return CMD_SUCCESS;
298}
299
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100300#define RANGE_START_STR "Start of the range of ports\n"
301#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800302DEFUN(cfg_mgcp_rtp_bts_range,
303 cfg_mgcp_rtp_bts_range_cmd,
304 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100305 RTP_STR "Range of ports to use for the BTS side\n"
306 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800307{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800308 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800309 return CMD_SUCCESS;
310}
311
312DEFUN(cfg_mgcp_rtp_net_range,
313 cfg_mgcp_rtp_net_range_cmd,
314 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100315 RTP_STR "Range of ports to use for the NET side\n"
316 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800317{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800318 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800319 return CMD_SUCCESS;
320}
321
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800322DEFUN(cfg_mgcp_rtp_net_base_port,
323 cfg_mgcp_rtp_net_base_port_cmd,
324 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100325 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800326{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800327 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800328 return CMD_SUCCESS;
329}
330
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800331ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100332 "rtp base <0-65534>",
333 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800334
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800335DEFUN(cfg_mgcp_rtp_transcoder_range,
336 cfg_mgcp_rtp_transcoder_range_cmd,
337 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100338 RTP_STR "Range of ports to use for the Transcoder\n"
339 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800340{
341 parse_range(&g_cfg->transcoder_ports, argv);
342 return CMD_SUCCESS;
343}
344
345DEFUN(cfg_mgcp_rtp_transcoder_base,
346 cfg_mgcp_rtp_transcoder_base_cmd,
347 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100348 RTP_STR "First UDP port allocated for the Transcoder side\n"
349 UDP_PORT_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800350{
351 parse_base(&g_cfg->transcoder_ports, argv);
352 return CMD_SUCCESS;
353}
354
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800355DEFUN(cfg_mgcp_rtp_ip_dscp,
356 cfg_mgcp_rtp_ip_dscp_cmd,
357 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100358 RTP_STR
359 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800360{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800361 int dscp = atoi(argv[0]);
362 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800363 return CMD_SUCCESS;
364}
365
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800366ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
367 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100368 RTP_STR
369 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800370
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200371#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
372DEFUN(cfg_mgcp_rtp_force_ptime,
373 cfg_mgcp_rtp_force_ptime_cmd,
374 "rtp force-ptime (10|20|40)",
375 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther7a4464e2014-07-04 20:11:11 +0200376 "The required ptime (packet duration) in ms\n"
377 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200378{
379 g_cfg->bts_force_ptime = atoi(argv[0]);
380 return CMD_SUCCESS;
381}
382
383DEFUN(cfg_mgcp_no_rtp_force_ptime,
384 cfg_mgcp_no_rtp_force_ptime_cmd,
385 "no rtp force-ptime",
386 NO_STR RTP_STR FORCE_PTIME_STR)
387{
388 g_cfg->bts_force_ptime = 0;
389 return CMD_SUCCESS;
390}
391
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200392DEFUN(cfg_mgcp_sdp_fmtp_extra,
393 cfg_mgcp_sdp_fmtp_extra_cmd,
394 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100395 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
396 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200397{
398 char *txt = argv_concat(argv, argc, 0);
399 if (!txt)
400 return CMD_WARNING;
401
402 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
403 talloc_free(txt);
404 return CMD_SUCCESS;
405}
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800406
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100407#define SDP_STR "SDP File related options\n"
408#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100409DEFUN(cfg_mgcp_sdp_payload_number,
410 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100411 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100412 SDP_STR AUDIO_STR
413 "Number\n" "Payload number\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100414{
415 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100416 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100417 return CMD_SUCCESS;
418}
419
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100420ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100421 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100422 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
423
424
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100425DEFUN(cfg_mgcp_sdp_payload_name,
426 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100427 "sdp audio-payload name NAME",
428 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100429{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100430 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100431 return CMD_SUCCESS;
432}
433
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100434ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
435 "sdp audio payload name NAME",
436 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
437
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100438DEFUN(cfg_mgcp_sdp_payload_send_ptime,
439 cfg_mgcp_sdp_payload_send_ptime_cmd,
440 "sdp audio-payload send-ptime",
441 SDP_STR AUDIO_STR
442 "Send SDP ptime (packet duration) attribute\n")
443{
444 g_cfg->trunk.audio_send_ptime = 1;
445 return CMD_SUCCESS;
446}
447
448DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
449 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
450 "no sdp audio-payload send-ptime",
451 NO_STR SDP_STR AUDIO_STR
452 "Send SDP ptime (packet duration) attribute\n")
453{
454 g_cfg->trunk.audio_send_ptime = 0;
455 return CMD_SUCCESS;
456}
457
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100458DEFUN(cfg_mgcp_loop,
459 cfg_mgcp_loop_cmd,
460 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100461 "Loop audio for all endpoints on main trunk\n"
462 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100463{
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100464 if (g_cfg->osmux) {
465 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
466 return CMD_WARNING;
467 }
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100468 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100469 return CMD_SUCCESS;
470}
471
472DEFUN(cfg_mgcp_number_endp,
473 cfg_mgcp_number_endp_cmd,
474 "number endpoints <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100475 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100476{
477 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100478 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100479 return CMD_SUCCESS;
480}
481
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200482DEFUN(cfg_mgcp_omit_rtcp,
483 cfg_mgcp_omit_rtcp_cmd,
484 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200485 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200486{
487 g_cfg->trunk.omit_rtcp = 1;
488 return CMD_SUCCESS;
489}
490
491DEFUN(cfg_mgcp_no_omit_rtcp,
492 cfg_mgcp_no_omit_rtcp_cmd,
493 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200494 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200495{
496 g_cfg->trunk.omit_rtcp = 0;
497 return CMD_SUCCESS;
498}
499
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100500DEFUN(cfg_mgcp_patch_rtp_ssrc,
501 cfg_mgcp_patch_rtp_ssrc_cmd,
502 "rtp-patch ssrc",
503 RTP_PATCH_STR
504 "Force a fixed SSRC\n"
505 )
506{
507 g_cfg->trunk.force_constant_ssrc = 1;
508 return CMD_SUCCESS;
509}
510
511DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
512 cfg_mgcp_no_patch_rtp_ssrc_cmd,
513 "no rtp-patch ssrc",
514 NO_STR RTP_PATCH_STR
515 "Force a fixed SSRC\n"
516 )
517{
518 g_cfg->trunk.force_constant_ssrc = 0;
519 return CMD_SUCCESS;
520}
521
522DEFUN(cfg_mgcp_patch_rtp_ts,
523 cfg_mgcp_patch_rtp_ts_cmd,
524 "rtp-patch timestamp",
525 RTP_PATCH_STR
526 "Adjust RTP timestamp\n"
527 )
528{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100529 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100530 return CMD_SUCCESS;
531}
532
533DEFUN(cfg_mgcp_no_patch_rtp_ts,
534 cfg_mgcp_no_patch_rtp_ts_cmd,
535 "no rtp-patch timestamp",
536 NO_STR RTP_PATCH_STR
537 "Adjust RTP timestamp\n"
538 )
539{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100540 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100541 return CMD_SUCCESS;
542}
543
544DEFUN(cfg_mgcp_no_patch_rtp,
545 cfg_mgcp_no_patch_rtp_cmd,
546 "no rtp-patch",
547 NO_STR RTP_PATCH_STR)
548{
549 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100550 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100551 return CMD_SUCCESS;
552}
553
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100554DEFUN(cfg_mgcp_rtp_keepalive,
555 cfg_mgcp_rtp_keepalive_cmd,
556 "rtp keep-alive <1-120>",
557 RTP_STR RTP_KEEPALIVE_STR
558 "Keep alive interval in secs\n"
559 )
560{
561 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
562 return CMD_SUCCESS;
563}
564
565DEFUN(cfg_mgcp_rtp_keepalive_once,
566 cfg_mgcp_rtp_keepalive_once_cmd,
567 "rtp keep-alive once",
568 RTP_STR RTP_KEEPALIVE_STR
569 "Send dummy packet only once after CRCX/MDCX\n"
570 )
571{
572 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
573 return CMD_SUCCESS;
574}
575
576DEFUN(cfg_mgcp_no_rtp_keepalive,
577 cfg_mgcp_no_rtp_keepalive_cmd,
578 "no rtp keep-alive",
579 NO_STR RTP_STR RTP_KEEPALIVE_STR
580 )
581{
582 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
583 return CMD_SUCCESS;
584}
585
586
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100587
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100588#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200589DEFUN(cfg_mgcp_agent_addr,
590 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100591 "call-agent ip A.B.C.D",
592 CALL_AGENT_STR IP_STR
593 "IPv4 Address of the callagent\n")
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200594{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200595 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200596 return CMD_SUCCESS;
597}
598
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100599ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
600 "call agent ip A.B.C.D",
601 CALL_AGENT_STR CALL_AGENT_STR IP_STR
602 "IPv4 Address of the callagent\n")
603
604
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800605DEFUN(cfg_mgcp_transcoder,
606 cfg_mgcp_transcoder_cmd,
607 "transcoder-mgw A.B.C.D",
608 "Use a MGW to detranscoder RTP\n"
609 "The IP address of the MGW")
610{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200611 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800612 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
613
614 return CMD_SUCCESS;
615}
616
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100617DEFUN(cfg_mgcp_no_transcoder,
618 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100619 "no transcoder-mgw",
620 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100621{
622 if (g_cfg->transcoder_ip) {
623 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
624 talloc_free(g_cfg->transcoder_ip);
625 g_cfg->transcoder_ip = NULL;
626 }
627
628 return CMD_SUCCESS;
629}
630
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800631DEFUN(cfg_mgcp_transcoder_remote_base,
632 cfg_mgcp_transcoder_remote_base_cmd,
633 "transcoder-remote-base <0-65534>",
634 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
635{
636 g_cfg->transcoder_remote_base = atoi(argv[0]);
637 return CMD_SUCCESS;
638}
639
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100640DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
641 "trunk <1-64>",
642 "Configure a SS7 trunk\n" "Trunk Nr\n")
643{
644 struct mgcp_trunk_config *trunk;
645 int index = atoi(argv[0]);
646
647 trunk = mgcp_trunk_num(g_cfg, index);
648 if (!trunk)
649 trunk = mgcp_trunk_alloc(g_cfg, index);
650
651 if (!trunk) {
652 vty_out(vty, "%%Unable to allocate trunk %u.%s",
653 index, VTY_NEWLINE);
654 return CMD_WARNING;
655 }
656
657 vty->node = TRUNK_NODE;
658 vty->index = trunk;
659 return CMD_SUCCESS;
660}
661
662static int config_write_trunk(struct vty *vty)
663{
664 struct mgcp_trunk_config *trunk;
665
666 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
667 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100668 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100669 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100670 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100671 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100672 vty_out(vty, " %ssdp audio-payload send-ptime%s",
673 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100674
675 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
676 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
677 else if (trunk->keepalive_interval)
678 vty_out(vty, " rtp keep-alive %d%s",
679 trunk->keepalive_interval, VTY_NEWLINE);
680 else
681 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
682
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100683 vty_out(vty, " loop %d%s",
684 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200685 if (trunk->omit_rtcp)
686 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
687 else
688 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100689 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100690 vty_out(vty, " %srtp-patch ssrc%s",
691 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
692 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100693 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100694 } else
695 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200696 if (trunk->audio_fmtp_extra)
697 vty_out(vty, " sdp audio fmtp-extra %s%s",
698 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100699 }
700
701 return CMD_SUCCESS;
702}
703
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200704DEFUN(cfg_trunk_sdp_fmtp_extra,
705 cfg_trunk_sdp_fmtp_extra_cmd,
706 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100707 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
708 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200709{
710 struct mgcp_trunk_config *trunk = vty->index;
711 char *txt = argv_concat(argv, argc, 0);
712 if (!txt)
713 return CMD_WARNING;
714
715 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
716 talloc_free(txt);
717 return CMD_SUCCESS;
718}
719
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100720DEFUN(cfg_trunk_payload_number,
721 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100722 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100723 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100724{
725 struct mgcp_trunk_config *trunk = vty->index;
726 unsigned int payload = atoi(argv[0]);
727
728 trunk->audio_payload = payload;
729 return CMD_SUCCESS;
730}
731
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100732ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100733 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100734 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
735
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100736DEFUN(cfg_trunk_payload_name,
737 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100738 "sdp audio-payload name NAME",
739 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100740{
741 struct mgcp_trunk_config *trunk = vty->index;
742
743 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
744 return CMD_SUCCESS;
745}
746
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100747ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
748 "sdp audio payload name NAME",
749 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
750
751
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100752DEFUN(cfg_trunk_loop,
753 cfg_trunk_loop_cmd,
754 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100755 "Loop audio for all endpoints on this trunk\n"
756 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100757{
758 struct mgcp_trunk_config *trunk = vty->index;
759
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100760 if (g_cfg->osmux) {
761 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
762 return CMD_WARNING;
763 }
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100764 trunk->audio_loop = atoi(argv[0]);
765 return CMD_SUCCESS;
766}
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800767
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100768DEFUN(cfg_trunk_sdp_payload_send_ptime,
769 cfg_trunk_sdp_payload_send_ptime_cmd,
770 "sdp audio-payload send-ptime",
771 SDP_STR AUDIO_STR
772 "Send SDP ptime (packet duration) attribute\n")
773{
774 struct mgcp_trunk_config *trunk = vty->index;
775 trunk->audio_send_ptime = 1;
776 return CMD_SUCCESS;
777}
778
779DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
780 cfg_trunk_no_sdp_payload_send_ptime_cmd,
781 "no sdp audio-payload send-ptime",
782 NO_STR SDP_STR AUDIO_STR
783 "Send SDP ptime (packet duration) attribute\n")
784{
785 struct mgcp_trunk_config *trunk = vty->index;
786 trunk->audio_send_ptime = 0;
787 return CMD_SUCCESS;
788}
789
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200790DEFUN(cfg_trunk_omit_rtcp,
791 cfg_trunk_omit_rtcp_cmd,
792 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200793 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200794{
795 struct mgcp_trunk_config *trunk = vty->index;
796 trunk->omit_rtcp = 1;
797 return CMD_SUCCESS;
798}
799
800DEFUN(cfg_trunk_no_omit_rtcp,
801 cfg_trunk_no_omit_rtcp_cmd,
802 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200803 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200804{
805 struct mgcp_trunk_config *trunk = vty->index;
806 trunk->omit_rtcp = 0;
807 return CMD_SUCCESS;
808}
809
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100810DEFUN(cfg_trunk_patch_rtp_ssrc,
811 cfg_trunk_patch_rtp_ssrc_cmd,
812 "rtp-patch ssrc",
813 RTP_PATCH_STR
814 "Force a fixed SSRC\n"
815 )
816{
817 struct mgcp_trunk_config *trunk = vty->index;
818 trunk->force_constant_ssrc = 1;
819 return CMD_SUCCESS;
820}
821
822DEFUN(cfg_trunk_no_patch_rtp_ssrc,
823 cfg_trunk_no_patch_rtp_ssrc_cmd,
824 "no rtp-patch ssrc",
825 NO_STR RTP_PATCH_STR
826 "Force a fixed SSRC\n"
827 )
828{
829 struct mgcp_trunk_config *trunk = vty->index;
830 trunk->force_constant_ssrc = 0;
831 return CMD_SUCCESS;
832}
833
834DEFUN(cfg_trunk_patch_rtp_ts,
835 cfg_trunk_patch_rtp_ts_cmd,
836 "rtp-patch timestamp",
837 RTP_PATCH_STR
838 "Adjust RTP timestamp\n"
839 )
840{
841 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100842 trunk->force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100843 return CMD_SUCCESS;
844}
845
846DEFUN(cfg_trunk_no_patch_rtp_ts,
847 cfg_trunk_no_patch_rtp_ts_cmd,
848 "no rtp-patch timestamp",
849 NO_STR RTP_PATCH_STR
850 "Adjust RTP timestamp\n"
851 )
852{
853 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100854 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100855 return CMD_SUCCESS;
856}
857
858DEFUN(cfg_trunk_no_patch_rtp,
859 cfg_trunk_no_patch_rtp_cmd,
860 "no rtp-patch",
861 NO_STR RTP_PATCH_STR)
862{
863 struct mgcp_trunk_config *trunk = vty->index;
864 trunk->force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100865 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100866 return CMD_SUCCESS;
867}
868
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100869DEFUN(cfg_trunk_rtp_keepalive,
870 cfg_trunk_rtp_keepalive_cmd,
871 "rtp keep-alive <1-120>",
872 RTP_STR RTP_KEEPALIVE_STR
873 "Keep-alive interval in secs\n"
874 )
875{
876 struct mgcp_trunk_config *trunk = vty->index;
877 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
878 return CMD_SUCCESS;
879}
880
881DEFUN(cfg_trunk_rtp_keepalive_once,
882 cfg_trunk_rtp_keepalive_once_cmd,
883 "rtp keep-alive once",
884 RTP_STR RTP_KEEPALIVE_STR
885 "Send dummy packet only once after CRCX/MDCX\n"
886 )
887{
888 struct mgcp_trunk_config *trunk = vty->index;
889 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
890 return CMD_SUCCESS;
891}
892
893DEFUN(cfg_trunk_no_rtp_keepalive,
894 cfg_trunk_no_rtp_keepalive_cmd,
895 "no rtp keep-alive",
896 NO_STR RTP_STR RTP_KEEPALIVE_STR
897 )
898{
899 struct mgcp_trunk_config *trunk = vty->index;
900 mgcp_trunk_set_keepalive(trunk, 0);
901 return CMD_SUCCESS;
902}
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100903
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800904DEFUN(loop_endp,
905 loop_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100906 "loop-endpoint <0-64> NAME (0|1)",
907 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +0800908 "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 +0800909{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100910 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800911 struct mgcp_endpoint *endp;
912
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100913 trunk = find_trunk(g_cfg, atoi(argv[0]));
914 if (!trunk) {
915 vty_out(vty, "%%Trunk %d not found in the config.%s",
916 atoi(argv[0]), VTY_NEWLINE);
917 return CMD_WARNING;
918 }
919
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100920 if (!trunk->endpoints) {
921 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
922 trunk->trunk_nr, VTY_NEWLINE);
923 return CMD_WARNING;
924 }
925
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100926 int endp_no = strtoul(argv[1], NULL, 16);
927 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800928 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100929 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800930 return CMD_WARNING;
931 }
932
933
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100934 endp = &trunk->endpoints[endp_no];
935 int loop = atoi(argv[2]);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800936
937 if (loop)
938 endp->conn_mode = MGCP_CONN_LOOPBACK;
939 else
940 endp->conn_mode = endp->orig_mode;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100941
942 /* Handle it like a MDCX, switch on SSRC patching if enabled */
943 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
944 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800945
946 return CMD_SUCCESS;
947}
948
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800949DEFUN(tap_call,
950 tap_call_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100951 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
952 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800953 "The endpoint in hex\n"
954 "Forward the data coming from the bts\n"
955 "Forward the data coming from the bts leaving to the network\n"
956 "Forward the data coming from the net\n"
957 "Forward the data coming from the net leaving to the bts\n"
958 "destination IP of the data\n" "destination port\n")
959{
960 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100961 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800962 struct mgcp_endpoint *endp;
963 int port = 0;
964
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100965 trunk = find_trunk(g_cfg, atoi(argv[0]));
966 if (!trunk) {
967 vty_out(vty, "%%Trunk %d not found in the config.%s",
968 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800969 return CMD_WARNING;
970 }
971
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100972 if (!trunk->endpoints) {
973 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
974 trunk->trunk_nr, VTY_NEWLINE);
975 return CMD_WARNING;
976 }
977
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100978 int endp_no = strtoul(argv[1], NULL, 16);
979 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
980 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
981 argv[1], endp_no, VTY_NEWLINE);
982 return CMD_WARNING;
983 }
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800984
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100985 endp = &trunk->endpoints[endp_no];
986
987 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800988 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100989 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800990 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100991 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800992 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100993 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800994 port = MGCP_TAP_NET_OUT;
995 } else {
996 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
997 return CMD_WARNING;
998 }
999
1000 tap = &endp->taps[port];
1001 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001002 inet_aton(argv[3], &tap->forward.sin_addr);
1003 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +08001004 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001005 return CMD_SUCCESS;
1006}
1007
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001008DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001009 "free-endpoint <0-64> NUMBER",
1010 "Free the given endpoint\n" "Trunk number\n"
1011 "Endpoint number in hex.\n")
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001012{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001013 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001014 struct mgcp_endpoint *endp;
1015
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001016 trunk = find_trunk(g_cfg, atoi(argv[0]));
1017 if (!trunk) {
1018 vty_out(vty, "%%Trunk %d not found in the config.%s",
1019 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001020 return CMD_WARNING;
1021 }
1022
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001023 if (!trunk->endpoints) {
1024 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1025 trunk->trunk_nr, VTY_NEWLINE);
1026 return CMD_WARNING;
1027 }
1028
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001029 int endp_no = strtoul(argv[1], NULL, 16);
1030 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1031 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1032 argv[1], endp_no, VTY_NEWLINE);
1033 return CMD_WARNING;
1034 }
1035
1036 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001037 mgcp_free_endp(endp);
1038 return CMD_SUCCESS;
1039}
1040
Harald Welteba4f8b22012-01-27 00:41:39 +01001041DEFUN(reset_endp, reset_endp_cmd,
1042 "reset-endpoint <0-64> NUMBER",
1043 "Reset the given endpoint\n" "Trunk number\n"
1044 "Endpoint number in hex.\n")
1045{
1046 struct mgcp_trunk_config *trunk;
1047 struct mgcp_endpoint *endp;
1048 int endp_no, rc;
1049
1050 trunk = find_trunk(g_cfg, atoi(argv[0]));
1051 if (!trunk) {
1052 vty_out(vty, "%%Trunk %d not found in the config.%s",
1053 atoi(argv[0]), VTY_NEWLINE);
1054 return CMD_WARNING;
1055 }
1056
1057 if (!trunk->endpoints) {
1058 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1059 trunk->trunk_nr, VTY_NEWLINE);
1060 return CMD_WARNING;
1061 }
1062
1063 endp_no = strtoul(argv[1], NULL, 16);
1064 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1065 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1066 argv[1], endp_no, VTY_NEWLINE);
1067 return CMD_WARNING;
1068 }
1069
1070 endp = &trunk->endpoints[endp_no];
1071 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1072 if (rc < 0) {
1073 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1074 return CMD_WARNING;
1075 }
1076 return CMD_SUCCESS;
1077}
1078
1079DEFUN(reset_all_endp, reset_all_endp_cmd,
1080 "reset-all-endpoints",
1081 "Reset all endpoints\n")
1082{
1083 int rc;
1084
1085 rc = mgcp_send_reset_all(g_cfg);
1086 if (rc < 0) {
1087 vty_out(vty, "Error %d during endpoint reset.%s",
1088 rc, VTY_NEWLINE);
1089 return CMD_WARNING;
1090 }
1091 return CMD_SUCCESS;
1092}
1093
Holger Hans Peter Freytherea285e42014-06-03 13:36:42 +02001094#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001095DEFUN(cfg_mgcp_osmux,
1096 cfg_mgcp_osmux_cmd,
1097 "osmux (on|off)",
1098 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1099{
1100 if (strcmp(argv[0], "on") == 0) {
1101 g_cfg->osmux = 1;
1102 if (g_cfg->trunk.audio_loop) {
1103 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1104 VTY_NEWLINE);
1105 return CMD_WARNING;
1106 }
1107 } else if (strcmp(argv[0], "off") == 0)
1108 g_cfg->osmux = 0;
1109
1110 return CMD_SUCCESS;
1111}
1112
1113DEFUN(cfg_mgcp_osmux_batch_factor,
1114 cfg_mgcp_osmux_batch_factor_cmd,
Holger Hans Peter Freytherbacf7eb2014-06-16 14:12:02 +02001115 "osmux batch-factor <1-16>",
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001116 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1117{
1118 g_cfg->osmux_batch = atoi(argv[0]);
1119 return CMD_SUCCESS;
1120}
Harald Welteba4f8b22012-01-27 00:41:39 +01001121
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001122int mgcp_vty_init(void)
1123{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +08001124 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001125 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001126 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001127 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welteba4f8b22012-01-27 00:41:39 +01001128 install_element(ENABLE_NODE, &reset_endp_cmd);
1129 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001130
1131 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1132 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001133
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001134 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001135 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1136 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1137 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1138 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1139 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1140 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +08001141 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +08001142 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +08001143 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1144 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +08001145 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1146 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +08001147 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +08001148 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck16491a92014-04-14 10:31:47 +02001149 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1150 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001151 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1152 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1153 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +02001154 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001155 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +08001156 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +01001157 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +08001158 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001159 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1160 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001161 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1162 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001163 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1164 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001165 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1166 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001167 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1168 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1169 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1170 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1171 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001172 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001173 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1174 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001175 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1176 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001177
1178 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1179 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001180 vty_install_default(TRUNK_NODE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001181 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1182 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1183 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001184 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1185 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001186 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1187 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001188 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001189 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1190 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001191 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1192 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1193 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1194 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1195 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001196 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001197 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1198 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001199
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001200 return 0;
1201}
1202
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001203static int allocate_trunk(struct mgcp_trunk_config *trunk)
1204{
1205 int i;
1206 struct mgcp_config *cfg = trunk->cfg;
1207
1208 if (mgcp_endpoints_allocate(trunk) != 0) {
1209 LOGP(DMGCP, LOGL_ERROR,
1210 "Failed to allocate %d endpoints on trunk %d.\n",
1211 trunk->number_endpoints, trunk->trunk_nr);
1212 return -1;
1213 }
1214
1215 /* early bind */
1216 for (i = 1; i < trunk->number_endpoints; ++i) {
1217 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001218
1219 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001220 cfg->last_bts_port += 2;
1221 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1222 LOGP(DMGCP, LOGL_FATAL,
1223 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001224 return -1;
1225 }
1226 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1227 }
1228
1229 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001230 cfg->last_net_port += 2;
1231 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1232 LOGP(DMGCP, LOGL_FATAL,
1233 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001234 return -1;
1235 }
1236 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1237 }
1238
Holger Hans Peter Freyther1b8eaf42011-02-28 14:51:48 +01001239 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1240 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001241 int rtp_port;
1242
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001243 /* network side */
1244 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1245 cfg->transcoder_ports.base_port);
1246 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1247 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1248 return -1;
1249 }
1250 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1251
1252 /* bts side */
1253 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1254 cfg->transcoder_ports.base_port);
1255 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1256 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1257 return -1;
1258 }
1259 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1260 }
1261 }
1262
1263 return 0;
1264}
1265
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001266int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1267 enum mgcp_role role)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001268{
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001269 int rc;
1270 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001271
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001272 /* Default to 4 messages */
1273 cfg->osmux_batch = 4;
1274
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001275 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +02001276 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001277 if (rc < 0) {
1278 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1279 return rc;
1280 }
1281
1282
1283 if (!g_cfg->bts_ip)
1284 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1285
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +02001286 if (!g_cfg->source_addr) {
1287 fprintf(stderr, "You need to specify a bind address.\n");
1288 return -1;
1289 }
1290
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001291 /* initialize the last ports */
1292 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1293 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1294
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001295 if (allocate_trunk(&g_cfg->trunk) != 0) {
1296 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001297 return -1;
1298 }
1299
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001300 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1301 if (allocate_trunk(trunk) != 0) {
1302 LOGP(DMGCP, LOGL_ERROR,
1303 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1304 return -1;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +08001305 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001306 }
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001307 cfg->role = role;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001308
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +08001309 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001310}
1311