blob: 122fa84373e774313b56d2dcf28a876c354b6213 [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"
34
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010035static struct mgcp_config *g_cfg = NULL;
36
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010037static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010038{
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010039 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010040
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010041 if (nr == 0)
42 trunk = &cfg->trunk;
43 else
44 trunk = mgcp_trunk_num(cfg, nr);
45
46 return trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010047}
48
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010049/*
50 * vty code for mgcp below
51 */
52struct cmd_node mgcp_node = {
53 MGCP_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020054 "%s(config-mgcp)# ",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010055 1,
56};
57
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010058struct cmd_node trunk_node = {
59 TRUNK_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020060 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010061 1,
62};
63
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010064static int config_write_mgcp(struct vty *vty)
65{
66 vty_out(vty, "mgcp%s", VTY_NEWLINE);
67 if (g_cfg->local_ip)
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020068 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
69 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010070 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
71 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
72 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080073
74 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
75 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 +080076 else
77 vty_out(vty, " rtp bts-range %u %u%s",
78 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
79
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080080 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
81 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 +080082 else
83 vty_out(vty, " rtp net-range %u %u%s",
84 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
85
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +080086 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +020087 if (g_cfg->trunk.omit_rtcp)
88 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
89 else
90 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +010091 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +010092 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +010093 g_cfg->trunk.audio_payload, VTY_NEWLINE);
94 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +010095 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +010096 g_cfg->trunk.audio_name, VTY_NEWLINE);
97 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
98 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +020099 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100100 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800101 if (g_cfg->transcoder_ip)
102 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100103
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800104 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
105 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
106 else
107 vty_out(vty, " rtp transcoder-range %u %u%s",
108 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800109 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800110
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100111 return CMD_SUCCESS;
112}
113
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100114static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100115{
116 int i;
117
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100118 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
119 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
120 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
121
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100122 if (!cfg->endpoints) {
123 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
124 return;
125 }
126
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100127 for (i = 1; i < cfg->number_endpoints; ++i) {
128 struct mgcp_endpoint *endp = &cfg->endpoints[i];
129 vty_out(vty,
130 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200131 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100132 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-08-05 01:34:51 +0800133 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
134 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
135 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200136 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100137 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200138 VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100139 }
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100140}
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100141
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100142DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
143 SHOW_STR "Display information about the MGCP Media Gateway")
144{
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100145 struct mgcp_trunk_config *trunk;
146
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100147 dump_trunk(vty, &g_cfg->trunk);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100148
149 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
150 dump_trunk(vty, trunk);
151
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100152 return CMD_SUCCESS;
153}
154
155DEFUN(cfg_mgcp,
156 cfg_mgcp_cmd,
157 "mgcp",
158 "Configure the MGCP")
159{
160 vty->node = MGCP_NODE;
161 return CMD_SUCCESS;
162}
163
164DEFUN(cfg_mgcp_local_ip,
165 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800166 "local ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100167 "Local options for the SDP record\n"
168 IP_STR
169 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100170{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200171 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100172 return CMD_SUCCESS;
173}
174
175DEFUN(cfg_mgcp_bts_ip,
176 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800177 "bts ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100178 "BTS Audio source/destination options\n"
179 IP_STR
180 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100181{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200182 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100183 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
184 return CMD_SUCCESS;
185}
186
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100187#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100188DEFUN(cfg_mgcp_bind_ip,
189 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800190 "bind ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100191 BIND_STR
192 IP_STR
193 "IPv4 Address to bind to\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->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100196 return CMD_SUCCESS;
197}
198
199DEFUN(cfg_mgcp_bind_port,
200 cfg_mgcp_bind_port_cmd,
201 "bind port <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100202 BIND_STR
203 "Port information\n"
204 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100205{
206 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100207 g_cfg->source_port = port;
208 return CMD_SUCCESS;
209}
210
211DEFUN(cfg_mgcp_bind_early,
212 cfg_mgcp_bind_early_cmd,
213 "bind early (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100214 BIND_STR
215 "Bind local ports on start up\n"
216 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100217{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800218 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
219 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100220}
221
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800222static void parse_base(struct mgcp_port_range *range, const char **argv)
223{
224 unsigned int port = atoi(argv[0]);
225 range->mode = PORT_ALLOC_STATIC;
226 range->base_port = port;
227}
228
229static void parse_range(struct mgcp_port_range *range, const char **argv)
230{
231 range->mode = PORT_ALLOC_DYNAMIC;
232 range->range_start = atoi(argv[0]);
233 range->range_end = atoi(argv[1]);
234 range->last_port = g_cfg->bts_ports.range_start;
235}
236
237
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100238#define RTP_STR "RTP configuration\n"
239#define BTS_START_STR "First UDP port allocated for the BTS side\n"
240#define NET_START_STR "First UDP port allocated for the NET side\n"
241#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800242DEFUN(cfg_mgcp_rtp_bts_base_port,
243 cfg_mgcp_rtp_bts_base_port_cmd,
244 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100245 RTP_STR
246 BTS_START_STR
247 UDP_PORT_STR)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100248{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800249 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100250 return CMD_SUCCESS;
251}
252
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100253#define RANGE_START_STR "Start of the range of ports\n"
254#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800255DEFUN(cfg_mgcp_rtp_bts_range,
256 cfg_mgcp_rtp_bts_range_cmd,
257 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100258 RTP_STR "Range of ports to use for the BTS side\n"
259 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800260{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800261 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800262 return CMD_SUCCESS;
263}
264
265DEFUN(cfg_mgcp_rtp_net_range,
266 cfg_mgcp_rtp_net_range_cmd,
267 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100268 RTP_STR "Range of ports to use for the NET side\n"
269 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800270{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800271 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800272 return CMD_SUCCESS;
273}
274
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800275DEFUN(cfg_mgcp_rtp_net_base_port,
276 cfg_mgcp_rtp_net_base_port_cmd,
277 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100278 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800279{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800280 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800281 return CMD_SUCCESS;
282}
283
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800284ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100285 "rtp base <0-65534>",
286 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800287
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800288DEFUN(cfg_mgcp_rtp_transcoder_range,
289 cfg_mgcp_rtp_transcoder_range_cmd,
290 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100291 RTP_STR "Range of ports to use for the Transcoder\n"
292 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800293{
294 parse_range(&g_cfg->transcoder_ports, argv);
295 return CMD_SUCCESS;
296}
297
298DEFUN(cfg_mgcp_rtp_transcoder_base,
299 cfg_mgcp_rtp_transcoder_base_cmd,
300 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100301 RTP_STR "First UDP port allocated for the Transcoder side\n"
302 UDP_PORT_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800303{
304 parse_base(&g_cfg->transcoder_ports, argv);
305 return CMD_SUCCESS;
306}
307
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800308DEFUN(cfg_mgcp_rtp_ip_dscp,
309 cfg_mgcp_rtp_ip_dscp_cmd,
310 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100311 RTP_STR
312 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800313{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800314 int dscp = atoi(argv[0]);
315 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800316 return CMD_SUCCESS;
317}
318
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800319ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
320 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100321 RTP_STR
322 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800323
324
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100325#define SDP_STR "SDP File related options\n"
326#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100327DEFUN(cfg_mgcp_sdp_payload_number,
328 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100329 "sdp audio-payload number <1-255>",
330 SDP_STR AUDIO_STR
331 "Number\n" "Payload number\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100332{
333 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100334 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100335 return CMD_SUCCESS;
336}
337
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100338ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
339 "sdp audio payload number <1-255>",
340 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
341
342
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100343DEFUN(cfg_mgcp_sdp_payload_name,
344 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100345 "sdp audio-payload name NAME",
346 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100347{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100348 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100349 return CMD_SUCCESS;
350}
351
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100352ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
353 "sdp audio payload name NAME",
354 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
355
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100356DEFUN(cfg_mgcp_loop,
357 cfg_mgcp_loop_cmd,
358 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100359 "Loop audio for all endpoints on main trunk\n"
360 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100361{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100362 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100363 return CMD_SUCCESS;
364}
365
366DEFUN(cfg_mgcp_number_endp,
367 cfg_mgcp_number_endp_cmd,
368 "number endpoints <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100369 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100370{
371 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100372 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100373 return CMD_SUCCESS;
374}
375
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200376DEFUN(cfg_mgcp_omit_rtcp,
377 cfg_mgcp_omit_rtcp_cmd,
378 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200379 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200380{
381 g_cfg->trunk.omit_rtcp = 1;
382 return CMD_SUCCESS;
383}
384
385DEFUN(cfg_mgcp_no_omit_rtcp,
386 cfg_mgcp_no_omit_rtcp_cmd,
387 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200388 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200389{
390 g_cfg->trunk.omit_rtcp = 0;
391 return CMD_SUCCESS;
392}
393
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100394#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200395DEFUN(cfg_mgcp_agent_addr,
396 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100397 "call-agent ip A.B.C.D",
398 CALL_AGENT_STR IP_STR
399 "IPv4 Address of the callagent\n")
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200400{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200401 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200402 return CMD_SUCCESS;
403}
404
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100405ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
406 "call agent ip A.B.C.D",
407 CALL_AGENT_STR CALL_AGENT_STR IP_STR
408 "IPv4 Address of the callagent\n")
409
410
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800411DEFUN(cfg_mgcp_transcoder,
412 cfg_mgcp_transcoder_cmd,
413 "transcoder-mgw A.B.C.D",
414 "Use a MGW to detranscoder RTP\n"
415 "The IP address of the MGW")
416{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200417 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800418 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
419
420 return CMD_SUCCESS;
421}
422
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100423DEFUN(cfg_mgcp_no_transcoder,
424 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100425 "no transcoder-mgw",
426 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100427{
428 if (g_cfg->transcoder_ip) {
429 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
430 talloc_free(g_cfg->transcoder_ip);
431 g_cfg->transcoder_ip = NULL;
432 }
433
434 return CMD_SUCCESS;
435}
436
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800437DEFUN(cfg_mgcp_transcoder_remote_base,
438 cfg_mgcp_transcoder_remote_base_cmd,
439 "transcoder-remote-base <0-65534>",
440 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
441{
442 g_cfg->transcoder_remote_base = atoi(argv[0]);
443 return CMD_SUCCESS;
444}
445
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100446DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
447 "trunk <1-64>",
448 "Configure a SS7 trunk\n" "Trunk Nr\n")
449{
450 struct mgcp_trunk_config *trunk;
451 int index = atoi(argv[0]);
452
453 trunk = mgcp_trunk_num(g_cfg, index);
454 if (!trunk)
455 trunk = mgcp_trunk_alloc(g_cfg, index);
456
457 if (!trunk) {
458 vty_out(vty, "%%Unable to allocate trunk %u.%s",
459 index, VTY_NEWLINE);
460 return CMD_WARNING;
461 }
462
463 vty->node = TRUNK_NODE;
464 vty->index = trunk;
465 return CMD_SUCCESS;
466}
467
468static int config_write_trunk(struct vty *vty)
469{
470 struct mgcp_trunk_config *trunk;
471
472 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
473 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100474 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100475 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100476 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100477 trunk->audio_name, VTY_NEWLINE);
478 vty_out(vty, " loop %d%s",
479 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200480 if (trunk->omit_rtcp)
481 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
482 else
483 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100484 }
485
486 return CMD_SUCCESS;
487}
488
489DEFUN(cfg_trunk_payload_number,
490 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100491 "sdp audio-payload number <1-255>",
492 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100493{
494 struct mgcp_trunk_config *trunk = vty->index;
495 unsigned int payload = atoi(argv[0]);
496
497 trunk->audio_payload = payload;
498 return CMD_SUCCESS;
499}
500
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100501ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
502 "sdp audio payload number <1-255>",
503 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
504
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100505DEFUN(cfg_trunk_payload_name,
506 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100507 "sdp audio-payload name NAME",
508 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100509{
510 struct mgcp_trunk_config *trunk = vty->index;
511
512 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
513 return CMD_SUCCESS;
514}
515
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100516ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
517 "sdp audio payload name NAME",
518 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
519
520
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100521DEFUN(cfg_trunk_loop,
522 cfg_trunk_loop_cmd,
523 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100524 "Loop audio for all endpoints on this trunk\n"
525 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100526{
527 struct mgcp_trunk_config *trunk = vty->index;
528
529 trunk->audio_loop = atoi(argv[0]);
530 return CMD_SUCCESS;
531}
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800532
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200533DEFUN(cfg_trunk_omit_rtcp,
534 cfg_trunk_omit_rtcp_cmd,
535 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200536 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200537{
538 struct mgcp_trunk_config *trunk = vty->index;
539 trunk->omit_rtcp = 1;
540 return CMD_SUCCESS;
541}
542
543DEFUN(cfg_trunk_no_omit_rtcp,
544 cfg_trunk_no_omit_rtcp_cmd,
545 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200546 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200547{
548 struct mgcp_trunk_config *trunk = vty->index;
549 trunk->omit_rtcp = 0;
550 return CMD_SUCCESS;
551}
552
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800553DEFUN(loop_endp,
554 loop_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100555 "loop-endpoint <0-64> NAME (0|1)",
556 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +0800557 "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 +0800558{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100559 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800560 struct mgcp_endpoint *endp;
561
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100562 trunk = find_trunk(g_cfg, atoi(argv[0]));
563 if (!trunk) {
564 vty_out(vty, "%%Trunk %d not found in the config.%s",
565 atoi(argv[0]), VTY_NEWLINE);
566 return CMD_WARNING;
567 }
568
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100569 if (!trunk->endpoints) {
570 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
571 trunk->trunk_nr, VTY_NEWLINE);
572 return CMD_WARNING;
573 }
574
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100575 int endp_no = strtoul(argv[1], NULL, 16);
576 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800577 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100578 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800579 return CMD_WARNING;
580 }
581
582
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100583 endp = &trunk->endpoints[endp_no];
584 int loop = atoi(argv[2]);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800585
586 if (loop)
587 endp->conn_mode = MGCP_CONN_LOOPBACK;
588 else
589 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther73aa5142010-08-05 12:07:00 +0000590 endp->allow_patch = 1;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800591
592 return CMD_SUCCESS;
593}
594
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800595DEFUN(tap_call,
596 tap_call_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100597 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
598 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800599 "The endpoint in hex\n"
600 "Forward the data coming from the bts\n"
601 "Forward the data coming from the bts leaving to the network\n"
602 "Forward the data coming from the net\n"
603 "Forward the data coming from the net leaving to the bts\n"
604 "destination IP of the data\n" "destination port\n")
605{
606 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100607 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800608 struct mgcp_endpoint *endp;
609 int port = 0;
610
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100611 trunk = find_trunk(g_cfg, atoi(argv[0]));
612 if (!trunk) {
613 vty_out(vty, "%%Trunk %d not found in the config.%s",
614 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800615 return CMD_WARNING;
616 }
617
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100618 if (!trunk->endpoints) {
619 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
620 trunk->trunk_nr, VTY_NEWLINE);
621 return CMD_WARNING;
622 }
623
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100624 int endp_no = strtoul(argv[1], NULL, 16);
625 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
626 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
627 argv[1], endp_no, VTY_NEWLINE);
628 return CMD_WARNING;
629 }
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800630
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100631 endp = &trunk->endpoints[endp_no];
632
633 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800634 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100635 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800636 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100637 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800638 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100639 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800640 port = MGCP_TAP_NET_OUT;
641 } else {
642 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
643 return CMD_WARNING;
644 }
645
646 tap = &endp->taps[port];
647 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100648 inet_aton(argv[3], &tap->forward.sin_addr);
649 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +0800650 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800651 return CMD_SUCCESS;
652}
653
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800654DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100655 "free-endpoint <0-64> NUMBER",
656 "Free the given endpoint\n" "Trunk number\n"
657 "Endpoint number in hex.\n")
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800658{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100659 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800660 struct mgcp_endpoint *endp;
661
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100662 trunk = find_trunk(g_cfg, atoi(argv[0]));
663 if (!trunk) {
664 vty_out(vty, "%%Trunk %d not found in the config.%s",
665 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800666 return CMD_WARNING;
667 }
668
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100669 if (!trunk->endpoints) {
670 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
671 trunk->trunk_nr, VTY_NEWLINE);
672 return CMD_WARNING;
673 }
674
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100675 int endp_no = strtoul(argv[1], NULL, 16);
676 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
677 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
678 argv[1], endp_no, VTY_NEWLINE);
679 return CMD_WARNING;
680 }
681
682 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800683 mgcp_free_endp(endp);
684 return CMD_SUCCESS;
685}
686
Harald Welteba4f8b22012-01-27 00:41:39 +0100687DEFUN(reset_endp, reset_endp_cmd,
688 "reset-endpoint <0-64> NUMBER",
689 "Reset the given endpoint\n" "Trunk number\n"
690 "Endpoint number in hex.\n")
691{
692 struct mgcp_trunk_config *trunk;
693 struct mgcp_endpoint *endp;
694 int endp_no, rc;
695
696 trunk = find_trunk(g_cfg, atoi(argv[0]));
697 if (!trunk) {
698 vty_out(vty, "%%Trunk %d not found in the config.%s",
699 atoi(argv[0]), VTY_NEWLINE);
700 return CMD_WARNING;
701 }
702
703 if (!trunk->endpoints) {
704 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
705 trunk->trunk_nr, VTY_NEWLINE);
706 return CMD_WARNING;
707 }
708
709 endp_no = strtoul(argv[1], NULL, 16);
710 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
711 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
712 argv[1], endp_no, VTY_NEWLINE);
713 return CMD_WARNING;
714 }
715
716 endp = &trunk->endpoints[endp_no];
717 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
718 if (rc < 0) {
719 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
720 return CMD_WARNING;
721 }
722 return CMD_SUCCESS;
723}
724
725DEFUN(reset_all_endp, reset_all_endp_cmd,
726 "reset-all-endpoints",
727 "Reset all endpoints\n")
728{
729 int rc;
730
731 rc = mgcp_send_reset_all(g_cfg);
732 if (rc < 0) {
733 vty_out(vty, "Error %d during endpoint reset.%s",
734 rc, VTY_NEWLINE);
735 return CMD_WARNING;
736 }
737 return CMD_SUCCESS;
738}
739
740
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100741int mgcp_vty_init(void)
742{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +0800743 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800744 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800745 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800746 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welteba4f8b22012-01-27 00:41:39 +0100747 install_element(ENABLE_NODE, &reset_endp_cmd);
748 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100749
750 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
751 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800752
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100753 install_default(MGCP_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +0200754 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +0200755 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100756 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
757 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
758 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
759 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
760 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
761 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800762 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800763 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800764 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
765 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800766 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
767 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800768 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800769 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200770 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100771 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800772 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100773 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800774 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100775 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
776 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100777 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
778 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100779 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
780 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200781 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
782 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100783
784 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
785 install_node(&trunk_node, config_write_trunk);
786 install_default(TRUNK_NODE);
787 install_element(TRUNK_NODE, &ournode_exit_cmd);
788 install_element(TRUNK_NODE, &ournode_end_cmd);
789 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
790 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100791 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
792 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100793 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200794 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
795 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100796
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100797 return 0;
798}
799
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100800static int allocate_trunk(struct mgcp_trunk_config *trunk)
801{
802 int i;
803 struct mgcp_config *cfg = trunk->cfg;
804
805 if (mgcp_endpoints_allocate(trunk) != 0) {
806 LOGP(DMGCP, LOGL_ERROR,
807 "Failed to allocate %d endpoints on trunk %d.\n",
808 trunk->number_endpoints, trunk->trunk_nr);
809 return -1;
810 }
811
812 /* early bind */
813 for (i = 1; i < trunk->number_endpoints; ++i) {
814 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100815
816 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +0100817 cfg->last_bts_port += 2;
818 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
819 LOGP(DMGCP, LOGL_FATAL,
820 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100821 return -1;
822 }
823 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
824 }
825
826 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +0100827 cfg->last_net_port += 2;
828 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
829 LOGP(DMGCP, LOGL_FATAL,
830 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100831 return -1;
832 }
833 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
834 }
835
Holger Hans Peter Freyther1b8eaf42011-02-28 14:51:48 +0100836 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
837 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +0100838 int rtp_port;
839
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100840 /* network side */
841 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
842 cfg->transcoder_ports.base_port);
843 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
844 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
845 return -1;
846 }
847 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
848
849 /* bts side */
850 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
851 cfg->transcoder_ports.base_port);
852 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
853 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
854 return -1;
855 }
856 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
857 }
858 }
859
860 return 0;
861}
862
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100863int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
864{
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100865 int rc;
866 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100867
868 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +0200869 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100870 if (rc < 0) {
871 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
872 return rc;
873 }
874
875
876 if (!g_cfg->bts_ip)
877 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
878
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +0200879 if (!g_cfg->source_addr) {
880 fprintf(stderr, "You need to specify a bind address.\n");
881 return -1;
882 }
883
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +0100884 /* initialize the last ports */
885 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
886 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
887
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100888 if (allocate_trunk(&g_cfg->trunk) != 0) {
889 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100890 return -1;
891 }
892
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100893 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
894 if (allocate_trunk(trunk) != 0) {
895 LOGP(DMGCP, LOGL_ERROR,
896 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
897 return -1;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +0800898 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100899 }
900
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +0800901 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100902}
903