blob: e48b0503ee4e305a1e7c2b2c56d4d432b34a4ecc [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 Freytherab56ce12011-02-28 00:56:17 +01005 * (C) 2009-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
6 * (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"
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +020035
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010036static struct mgcp_config *g_cfg = NULL;
37
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010038static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010039{
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010040 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010041
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010042 if (nr == 0)
43 trunk = &cfg->trunk;
44 else
45 trunk = mgcp_trunk_num(cfg, nr);
46
47 return trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010048}
49
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010050/*
51 * vty code for mgcp below
52 */
53struct cmd_node mgcp_node = {
54 MGCP_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020055 "%s(config-mgcp)# ",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010056 1,
57};
58
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010059struct cmd_node trunk_node = {
60 TRUNK_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020061 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010062 1,
63};
64
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010065static int config_write_mgcp(struct vty *vty)
66{
67 vty_out(vty, "mgcp%s", VTY_NEWLINE);
68 if (g_cfg->local_ip)
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020069 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
70 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010071 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
72 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
73 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080074
75 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
76 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 +080077 else
78 vty_out(vty, " rtp bts-range %u %u%s",
79 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
80
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080081 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
82 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 +080083 else
84 vty_out(vty, " rtp net-range %u %u%s",
85 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
86
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +080087 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +020088 if (g_cfg->trunk.omit_rtcp)
89 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
90 else
91 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +010092 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_constant_timing) {
93 vty_out(vty, " %srtp-patch ssrc%s",
94 g_cfg->trunk.force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
95 vty_out(vty, " %srtp-patch timestamp%s",
96 g_cfg->trunk.force_constant_timing ? "" : "no ", VTY_NEWLINE);
97 } else
98 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +010099 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100100 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100101 g_cfg->trunk.audio_payload, VTY_NEWLINE);
102 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100103 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100104 g_cfg->trunk.audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200105 if (g_cfg->trunk.audio_fmtp_extra)
106 vty_out(vty, " sdp audio fmtp-extra %s%s",
107 g_cfg->trunk.audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100108 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
109 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200110 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100111 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800112 if (g_cfg->transcoder_ip)
113 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100114
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800115 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
116 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
117 else
118 vty_out(vty, " rtp transcoder-range %u %u%s",
119 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800120 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800121
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100122 return CMD_SUCCESS;
123}
124
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100125static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100126{
127 int i;
128
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100129 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
130 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
131 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
132
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100133 if (!cfg->endpoints) {
134 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
135 return;
136 }
137
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100138 for (i = 1; i < cfg->number_endpoints; ++i) {
139 struct mgcp_endpoint *endp = &cfg->endpoints[i];
140 vty_out(vty,
141 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200142 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100143 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-08-05 01:34:51 +0800144 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
145 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
146 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200147 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100148 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200149 VTY_NEWLINE);
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100150
151 if (verbose)
152 vty_out(vty,
153 " Timestamp Errs: BTS %d->%d, Net %d->%d%s",
154 endp->bts_state.in_stream.err_ts_counter,
155 endp->bts_state.out_stream.err_ts_counter,
156 endp->net_state.in_stream.err_ts_counter,
157 endp->net_state.out_stream.err_ts_counter,
158 VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100159 }
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100160}
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100161
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100162DEFUN(show_mcgp, show_mgcp_cmd,
163 "show mgcp [stats]",
164 SHOW_STR
165 "Display information about the MGCP Media Gateway\n"
166 "Include Statistics\n")
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100167{
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100168 struct mgcp_trunk_config *trunk;
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100169 int show_stats = argc >= 1;
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100170
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100171 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100172
173 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100174 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100175
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100176 return CMD_SUCCESS;
177}
178
179DEFUN(cfg_mgcp,
180 cfg_mgcp_cmd,
181 "mgcp",
182 "Configure the MGCP")
183{
184 vty->node = MGCP_NODE;
185 return CMD_SUCCESS;
186}
187
188DEFUN(cfg_mgcp_local_ip,
189 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800190 "local ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100191 "Local options for the SDP record\n"
192 IP_STR
193 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100194{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200195 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100196 return CMD_SUCCESS;
197}
198
199DEFUN(cfg_mgcp_bts_ip,
200 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800201 "bts ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100202 "BTS Audio source/destination options\n"
203 IP_STR
204 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100205{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200206 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100207 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
208 return CMD_SUCCESS;
209}
210
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100211#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100212DEFUN(cfg_mgcp_bind_ip,
213 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800214 "bind ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100215 BIND_STR
216 IP_STR
217 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100218{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200219 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100220 return CMD_SUCCESS;
221}
222
223DEFUN(cfg_mgcp_bind_port,
224 cfg_mgcp_bind_port_cmd,
225 "bind port <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100226 BIND_STR
227 "Port information\n"
228 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100229{
230 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100231 g_cfg->source_port = port;
232 return CMD_SUCCESS;
233}
234
235DEFUN(cfg_mgcp_bind_early,
236 cfg_mgcp_bind_early_cmd,
237 "bind early (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100238 BIND_STR
239 "Bind local ports on start up\n"
240 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100241{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800242 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
243 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100244}
245
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800246static void parse_base(struct mgcp_port_range *range, const char **argv)
247{
248 unsigned int port = atoi(argv[0]);
249 range->mode = PORT_ALLOC_STATIC;
250 range->base_port = port;
251}
252
253static void parse_range(struct mgcp_port_range *range, const char **argv)
254{
255 range->mode = PORT_ALLOC_DYNAMIC;
256 range->range_start = atoi(argv[0]);
257 range->range_end = atoi(argv[1]);
258 range->last_port = g_cfg->bts_ports.range_start;
259}
260
261
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100262#define RTP_STR "RTP configuration\n"
263#define BTS_START_STR "First UDP port allocated for the BTS side\n"
264#define NET_START_STR "First UDP port allocated for the NET side\n"
265#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800266DEFUN(cfg_mgcp_rtp_bts_base_port,
267 cfg_mgcp_rtp_bts_base_port_cmd,
268 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100269 RTP_STR
270 BTS_START_STR
271 UDP_PORT_STR)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100272{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800273 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100274 return CMD_SUCCESS;
275}
276
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100277#define RANGE_START_STR "Start of the range of ports\n"
278#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800279DEFUN(cfg_mgcp_rtp_bts_range,
280 cfg_mgcp_rtp_bts_range_cmd,
281 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100282 RTP_STR "Range of ports to use for the BTS side\n"
283 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800284{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800285 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800286 return CMD_SUCCESS;
287}
288
289DEFUN(cfg_mgcp_rtp_net_range,
290 cfg_mgcp_rtp_net_range_cmd,
291 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100292 RTP_STR "Range of ports to use for the NET side\n"
293 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800294{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800295 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800296 return CMD_SUCCESS;
297}
298
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800299DEFUN(cfg_mgcp_rtp_net_base_port,
300 cfg_mgcp_rtp_net_base_port_cmd,
301 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100302 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800303{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800304 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800305 return CMD_SUCCESS;
306}
307
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800308ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100309 "rtp base <0-65534>",
310 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800311
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800312DEFUN(cfg_mgcp_rtp_transcoder_range,
313 cfg_mgcp_rtp_transcoder_range_cmd,
314 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100315 RTP_STR "Range of ports to use for the Transcoder\n"
316 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800317{
318 parse_range(&g_cfg->transcoder_ports, argv);
319 return CMD_SUCCESS;
320}
321
322DEFUN(cfg_mgcp_rtp_transcoder_base,
323 cfg_mgcp_rtp_transcoder_base_cmd,
324 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100325 RTP_STR "First UDP port allocated for the Transcoder side\n"
326 UDP_PORT_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800327{
328 parse_base(&g_cfg->transcoder_ports, argv);
329 return CMD_SUCCESS;
330}
331
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800332DEFUN(cfg_mgcp_rtp_ip_dscp,
333 cfg_mgcp_rtp_ip_dscp_cmd,
334 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100335 RTP_STR
336 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800337{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800338 int dscp = atoi(argv[0]);
339 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800340 return CMD_SUCCESS;
341}
342
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800343ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
344 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100345 RTP_STR
346 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800347
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200348DEFUN(cfg_mgcp_sdp_fmtp_extra,
349 cfg_mgcp_sdp_fmtp_extra_cmd,
350 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100351 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
352 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200353{
354 char *txt = argv_concat(argv, argc, 0);
355 if (!txt)
356 return CMD_WARNING;
357
358 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
359 talloc_free(txt);
360 return CMD_SUCCESS;
361}
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800362
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100363#define SDP_STR "SDP File related options\n"
364#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100365DEFUN(cfg_mgcp_sdp_payload_number,
366 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100367 "sdp audio-payload number <1-255>",
368 SDP_STR AUDIO_STR
369 "Number\n" "Payload number\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100370{
371 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100372 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100373 return CMD_SUCCESS;
374}
375
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100376ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
377 "sdp audio payload number <1-255>",
378 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
379
380
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100381DEFUN(cfg_mgcp_sdp_payload_name,
382 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100383 "sdp audio-payload name NAME",
384 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100385{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100386 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100387 return CMD_SUCCESS;
388}
389
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100390ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
391 "sdp audio payload name NAME",
392 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
393
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100394DEFUN(cfg_mgcp_loop,
395 cfg_mgcp_loop_cmd,
396 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100397 "Loop audio for all endpoints on main trunk\n"
398 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100399{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100400 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100401 return CMD_SUCCESS;
402}
403
404DEFUN(cfg_mgcp_number_endp,
405 cfg_mgcp_number_endp_cmd,
406 "number endpoints <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100407 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100408{
409 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100410 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100411 return CMD_SUCCESS;
412}
413
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200414DEFUN(cfg_mgcp_omit_rtcp,
415 cfg_mgcp_omit_rtcp_cmd,
416 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200417 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200418{
419 g_cfg->trunk.omit_rtcp = 1;
420 return CMD_SUCCESS;
421}
422
423DEFUN(cfg_mgcp_no_omit_rtcp,
424 cfg_mgcp_no_omit_rtcp_cmd,
425 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200426 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200427{
428 g_cfg->trunk.omit_rtcp = 0;
429 return CMD_SUCCESS;
430}
431
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100432DEFUN(cfg_mgcp_patch_rtp_ssrc,
433 cfg_mgcp_patch_rtp_ssrc_cmd,
434 "rtp-patch ssrc",
435 RTP_PATCH_STR
436 "Force a fixed SSRC\n"
437 )
438{
439 g_cfg->trunk.force_constant_ssrc = 1;
440 return CMD_SUCCESS;
441}
442
443DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
444 cfg_mgcp_no_patch_rtp_ssrc_cmd,
445 "no rtp-patch ssrc",
446 NO_STR RTP_PATCH_STR
447 "Force a fixed SSRC\n"
448 )
449{
450 g_cfg->trunk.force_constant_ssrc = 0;
451 return CMD_SUCCESS;
452}
453
454DEFUN(cfg_mgcp_patch_rtp_ts,
455 cfg_mgcp_patch_rtp_ts_cmd,
456 "rtp-patch timestamp",
457 RTP_PATCH_STR
458 "Adjust RTP timestamp\n"
459 )
460{
461 g_cfg->trunk.force_constant_timing = 1;
462 return CMD_SUCCESS;
463}
464
465DEFUN(cfg_mgcp_no_patch_rtp_ts,
466 cfg_mgcp_no_patch_rtp_ts_cmd,
467 "no rtp-patch timestamp",
468 NO_STR RTP_PATCH_STR
469 "Adjust RTP timestamp\n"
470 )
471{
472 g_cfg->trunk.force_constant_timing = 0;
473 return CMD_SUCCESS;
474}
475
476DEFUN(cfg_mgcp_no_patch_rtp,
477 cfg_mgcp_no_patch_rtp_cmd,
478 "no rtp-patch",
479 NO_STR RTP_PATCH_STR)
480{
481 g_cfg->trunk.force_constant_ssrc = 0;
482 g_cfg->trunk.force_constant_timing = 0;
483 return CMD_SUCCESS;
484}
485
486
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100487#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200488DEFUN(cfg_mgcp_agent_addr,
489 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100490 "call-agent ip A.B.C.D",
491 CALL_AGENT_STR IP_STR
492 "IPv4 Address of the callagent\n")
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200493{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200494 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200495 return CMD_SUCCESS;
496}
497
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100498ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
499 "call agent ip A.B.C.D",
500 CALL_AGENT_STR CALL_AGENT_STR IP_STR
501 "IPv4 Address of the callagent\n")
502
503
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800504DEFUN(cfg_mgcp_transcoder,
505 cfg_mgcp_transcoder_cmd,
506 "transcoder-mgw A.B.C.D",
507 "Use a MGW to detranscoder RTP\n"
508 "The IP address of the MGW")
509{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200510 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800511 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
512
513 return CMD_SUCCESS;
514}
515
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100516DEFUN(cfg_mgcp_no_transcoder,
517 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100518 "no transcoder-mgw",
519 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100520{
521 if (g_cfg->transcoder_ip) {
522 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
523 talloc_free(g_cfg->transcoder_ip);
524 g_cfg->transcoder_ip = NULL;
525 }
526
527 return CMD_SUCCESS;
528}
529
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800530DEFUN(cfg_mgcp_transcoder_remote_base,
531 cfg_mgcp_transcoder_remote_base_cmd,
532 "transcoder-remote-base <0-65534>",
533 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
534{
535 g_cfg->transcoder_remote_base = atoi(argv[0]);
536 return CMD_SUCCESS;
537}
538
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100539DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
540 "trunk <1-64>",
541 "Configure a SS7 trunk\n" "Trunk Nr\n")
542{
543 struct mgcp_trunk_config *trunk;
544 int index = atoi(argv[0]);
545
546 trunk = mgcp_trunk_num(g_cfg, index);
547 if (!trunk)
548 trunk = mgcp_trunk_alloc(g_cfg, index);
549
550 if (!trunk) {
551 vty_out(vty, "%%Unable to allocate trunk %u.%s",
552 index, VTY_NEWLINE);
553 return CMD_WARNING;
554 }
555
556 vty->node = TRUNK_NODE;
557 vty->index = trunk;
558 return CMD_SUCCESS;
559}
560
561static int config_write_trunk(struct vty *vty)
562{
563 struct mgcp_trunk_config *trunk;
564
565 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
566 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100567 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100568 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100569 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100570 trunk->audio_name, VTY_NEWLINE);
571 vty_out(vty, " loop %d%s",
572 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200573 if (trunk->omit_rtcp)
574 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
575 else
576 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100577 if (trunk->force_constant_ssrc || trunk->force_constant_timing) {
578 vty_out(vty, " %srtp-patch ssrc%s",
579 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
580 vty_out(vty, " %srtp-patch timestamp%s",
581 trunk->force_constant_timing ? "" : "no ", VTY_NEWLINE);
582 } else
583 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200584 if (trunk->audio_fmtp_extra)
585 vty_out(vty, " sdp audio fmtp-extra %s%s",
586 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100587 }
588
589 return CMD_SUCCESS;
590}
591
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200592DEFUN(cfg_trunk_sdp_fmtp_extra,
593 cfg_trunk_sdp_fmtp_extra_cmd,
594 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100595 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
596 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200597{
598 struct mgcp_trunk_config *trunk = vty->index;
599 char *txt = argv_concat(argv, argc, 0);
600 if (!txt)
601 return CMD_WARNING;
602
603 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
604 talloc_free(txt);
605 return CMD_SUCCESS;
606}
607
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100608DEFUN(cfg_trunk_payload_number,
609 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100610 "sdp audio-payload number <1-255>",
611 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100612{
613 struct mgcp_trunk_config *trunk = vty->index;
614 unsigned int payload = atoi(argv[0]);
615
616 trunk->audio_payload = payload;
617 return CMD_SUCCESS;
618}
619
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100620ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
621 "sdp audio payload number <1-255>",
622 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
623
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100624DEFUN(cfg_trunk_payload_name,
625 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100626 "sdp audio-payload name NAME",
627 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100628{
629 struct mgcp_trunk_config *trunk = vty->index;
630
631 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
632 return CMD_SUCCESS;
633}
634
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100635ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
636 "sdp audio payload name NAME",
637 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
638
639
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100640DEFUN(cfg_trunk_loop,
641 cfg_trunk_loop_cmd,
642 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100643 "Loop audio for all endpoints on this trunk\n"
644 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100645{
646 struct mgcp_trunk_config *trunk = vty->index;
647
648 trunk->audio_loop = atoi(argv[0]);
649 return CMD_SUCCESS;
650}
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800651
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200652DEFUN(cfg_trunk_omit_rtcp,
653 cfg_trunk_omit_rtcp_cmd,
654 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200655 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200656{
657 struct mgcp_trunk_config *trunk = vty->index;
658 trunk->omit_rtcp = 1;
659 return CMD_SUCCESS;
660}
661
662DEFUN(cfg_trunk_no_omit_rtcp,
663 cfg_trunk_no_omit_rtcp_cmd,
664 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200665 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200666{
667 struct mgcp_trunk_config *trunk = vty->index;
668 trunk->omit_rtcp = 0;
669 return CMD_SUCCESS;
670}
671
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100672DEFUN(cfg_trunk_patch_rtp_ssrc,
673 cfg_trunk_patch_rtp_ssrc_cmd,
674 "rtp-patch ssrc",
675 RTP_PATCH_STR
676 "Force a fixed SSRC\n"
677 )
678{
679 struct mgcp_trunk_config *trunk = vty->index;
680 trunk->force_constant_ssrc = 1;
681 return CMD_SUCCESS;
682}
683
684DEFUN(cfg_trunk_no_patch_rtp_ssrc,
685 cfg_trunk_no_patch_rtp_ssrc_cmd,
686 "no rtp-patch ssrc",
687 NO_STR RTP_PATCH_STR
688 "Force a fixed SSRC\n"
689 )
690{
691 struct mgcp_trunk_config *trunk = vty->index;
692 trunk->force_constant_ssrc = 0;
693 return CMD_SUCCESS;
694}
695
696DEFUN(cfg_trunk_patch_rtp_ts,
697 cfg_trunk_patch_rtp_ts_cmd,
698 "rtp-patch timestamp",
699 RTP_PATCH_STR
700 "Adjust RTP timestamp\n"
701 )
702{
703 struct mgcp_trunk_config *trunk = vty->index;
704 trunk->force_constant_timing = 1;
705 return CMD_SUCCESS;
706}
707
708DEFUN(cfg_trunk_no_patch_rtp_ts,
709 cfg_trunk_no_patch_rtp_ts_cmd,
710 "no rtp-patch timestamp",
711 NO_STR RTP_PATCH_STR
712 "Adjust RTP timestamp\n"
713 )
714{
715 struct mgcp_trunk_config *trunk = vty->index;
716 trunk->force_constant_timing = 0;
717 return CMD_SUCCESS;
718}
719
720DEFUN(cfg_trunk_no_patch_rtp,
721 cfg_trunk_no_patch_rtp_cmd,
722 "no rtp-patch",
723 NO_STR RTP_PATCH_STR)
724{
725 struct mgcp_trunk_config *trunk = vty->index;
726 trunk->force_constant_ssrc = 0;
727 trunk->force_constant_timing = 0;
728 return CMD_SUCCESS;
729}
730
731
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800732DEFUN(loop_endp,
733 loop_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100734 "loop-endpoint <0-64> NAME (0|1)",
735 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +0800736 "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 +0800737{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100738 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800739 struct mgcp_endpoint *endp;
740
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100741 trunk = find_trunk(g_cfg, atoi(argv[0]));
742 if (!trunk) {
743 vty_out(vty, "%%Trunk %d not found in the config.%s",
744 atoi(argv[0]), VTY_NEWLINE);
745 return CMD_WARNING;
746 }
747
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100748 if (!trunk->endpoints) {
749 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
750 trunk->trunk_nr, VTY_NEWLINE);
751 return CMD_WARNING;
752 }
753
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100754 int endp_no = strtoul(argv[1], NULL, 16);
755 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800756 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100757 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800758 return CMD_WARNING;
759 }
760
761
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100762 endp = &trunk->endpoints[endp_no];
763 int loop = atoi(argv[2]);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800764
765 if (loop)
766 endp->conn_mode = MGCP_CONN_LOOPBACK;
767 else
768 endp->conn_mode = endp->orig_mode;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100769
770 /* Handle it like a MDCX, switch on SSRC patching if enabled */
771 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
772 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800773
774 return CMD_SUCCESS;
775}
776
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800777DEFUN(tap_call,
778 tap_call_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100779 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
780 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800781 "The endpoint in hex\n"
782 "Forward the data coming from the bts\n"
783 "Forward the data coming from the bts leaving to the network\n"
784 "Forward the data coming from the net\n"
785 "Forward the data coming from the net leaving to the bts\n"
786 "destination IP of the data\n" "destination port\n")
787{
788 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100789 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800790 struct mgcp_endpoint *endp;
791 int port = 0;
792
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100793 trunk = find_trunk(g_cfg, atoi(argv[0]));
794 if (!trunk) {
795 vty_out(vty, "%%Trunk %d not found in the config.%s",
796 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800797 return CMD_WARNING;
798 }
799
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100800 if (!trunk->endpoints) {
801 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
802 trunk->trunk_nr, VTY_NEWLINE);
803 return CMD_WARNING;
804 }
805
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100806 int endp_no = strtoul(argv[1], NULL, 16);
807 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
808 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
809 argv[1], endp_no, VTY_NEWLINE);
810 return CMD_WARNING;
811 }
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800812
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100813 endp = &trunk->endpoints[endp_no];
814
815 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800816 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100817 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800818 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100819 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800820 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100821 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800822 port = MGCP_TAP_NET_OUT;
823 } else {
824 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
825 return CMD_WARNING;
826 }
827
828 tap = &endp->taps[port];
829 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100830 inet_aton(argv[3], &tap->forward.sin_addr);
831 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +0800832 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800833 return CMD_SUCCESS;
834}
835
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800836DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100837 "free-endpoint <0-64> NUMBER",
838 "Free the given endpoint\n" "Trunk number\n"
839 "Endpoint number in hex.\n")
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800840{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100841 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800842 struct mgcp_endpoint *endp;
843
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100844 trunk = find_trunk(g_cfg, atoi(argv[0]));
845 if (!trunk) {
846 vty_out(vty, "%%Trunk %d not found in the config.%s",
847 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800848 return CMD_WARNING;
849 }
850
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100851 if (!trunk->endpoints) {
852 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
853 trunk->trunk_nr, VTY_NEWLINE);
854 return CMD_WARNING;
855 }
856
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100857 int endp_no = strtoul(argv[1], NULL, 16);
858 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
859 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
860 argv[1], endp_no, VTY_NEWLINE);
861 return CMD_WARNING;
862 }
863
864 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800865 mgcp_free_endp(endp);
866 return CMD_SUCCESS;
867}
868
Harald Welteba4f8b22012-01-27 00:41:39 +0100869DEFUN(reset_endp, reset_endp_cmd,
870 "reset-endpoint <0-64> NUMBER",
871 "Reset the given endpoint\n" "Trunk number\n"
872 "Endpoint number in hex.\n")
873{
874 struct mgcp_trunk_config *trunk;
875 struct mgcp_endpoint *endp;
876 int endp_no, rc;
877
878 trunk = find_trunk(g_cfg, atoi(argv[0]));
879 if (!trunk) {
880 vty_out(vty, "%%Trunk %d not found in the config.%s",
881 atoi(argv[0]), VTY_NEWLINE);
882 return CMD_WARNING;
883 }
884
885 if (!trunk->endpoints) {
886 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
887 trunk->trunk_nr, VTY_NEWLINE);
888 return CMD_WARNING;
889 }
890
891 endp_no = strtoul(argv[1], NULL, 16);
892 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
893 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
894 argv[1], endp_no, VTY_NEWLINE);
895 return CMD_WARNING;
896 }
897
898 endp = &trunk->endpoints[endp_no];
899 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
900 if (rc < 0) {
901 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
902 return CMD_WARNING;
903 }
904 return CMD_SUCCESS;
905}
906
907DEFUN(reset_all_endp, reset_all_endp_cmd,
908 "reset-all-endpoints",
909 "Reset all endpoints\n")
910{
911 int rc;
912
913 rc = mgcp_send_reset_all(g_cfg);
914 if (rc < 0) {
915 vty_out(vty, "Error %d during endpoint reset.%s",
916 rc, VTY_NEWLINE);
917 return CMD_WARNING;
918 }
919 return CMD_SUCCESS;
920}
921
922
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100923int mgcp_vty_init(void)
924{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +0800925 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800926 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800927 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800928 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welteba4f8b22012-01-27 00:41:39 +0100929 install_element(ENABLE_NODE, &reset_endp_cmd);
930 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100931
932 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
933 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800934
Jacob Erlbeckf414e852013-10-29 09:30:30 +0100935 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100936 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
937 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
938 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
939 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
940 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
941 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800942 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800943 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800944 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
945 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800946 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
947 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800948 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800949 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200950 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100951 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800952 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100953 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800954 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100955 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
956 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100957 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
958 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100959 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
960 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200961 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
962 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100963 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
964 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
965 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
966 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
967 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200968 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100969
970 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
971 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeckf414e852013-10-29 09:30:30 +0100972 vty_install_default(TRUNK_NODE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100973 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
974 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100975 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
976 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100977 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200978 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
979 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100980 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
981 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
982 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
983 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
984 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200985 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100986
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100987 return 0;
988}
989
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100990static int allocate_trunk(struct mgcp_trunk_config *trunk)
991{
992 int i;
993 struct mgcp_config *cfg = trunk->cfg;
994
995 if (mgcp_endpoints_allocate(trunk) != 0) {
996 LOGP(DMGCP, LOGL_ERROR,
997 "Failed to allocate %d endpoints on trunk %d.\n",
998 trunk->number_endpoints, trunk->trunk_nr);
999 return -1;
1000 }
1001
1002 /* early bind */
1003 for (i = 1; i < trunk->number_endpoints; ++i) {
1004 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001005
1006 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001007 cfg->last_bts_port += 2;
1008 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1009 LOGP(DMGCP, LOGL_FATAL,
1010 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001011 return -1;
1012 }
1013 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1014 }
1015
1016 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001017 cfg->last_net_port += 2;
1018 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1019 LOGP(DMGCP, LOGL_FATAL,
1020 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001021 return -1;
1022 }
1023 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1024 }
1025
Holger Hans Peter Freyther1b8eaf42011-02-28 14:51:48 +01001026 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1027 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001028 int rtp_port;
1029
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001030 /* network side */
1031 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1032 cfg->transcoder_ports.base_port);
1033 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1034 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1035 return -1;
1036 }
1037 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1038
1039 /* bts side */
1040 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1041 cfg->transcoder_ports.base_port);
1042 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1043 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1044 return -1;
1045 }
1046 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1047 }
1048 }
1049
1050 return 0;
1051}
1052
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001053int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1054 enum mgcp_role role)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001055{
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001056 int rc;
1057 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001058
1059 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +02001060 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001061 if (rc < 0) {
1062 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1063 return rc;
1064 }
1065
1066
1067 if (!g_cfg->bts_ip)
1068 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1069
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +02001070 if (!g_cfg->source_addr) {
1071 fprintf(stderr, "You need to specify a bind address.\n");
1072 return -1;
1073 }
1074
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001075 /* initialize the last ports */
1076 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1077 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1078
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001079 if (allocate_trunk(&g_cfg->trunk) != 0) {
1080 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001081 return -1;
1082 }
1083
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001084 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1085 if (allocate_trunk(trunk) != 0) {
1086 LOGP(DMGCP, LOGL_ERROR,
1087 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1088 return -1;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +08001089 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001090 }
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001091 cfg->role = role;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001092
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +08001093 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001094}
1095