blob: 787dad282e47d10c667345bb3ec8a132c780a365 [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 Freyther6f38c062010-02-20 21:21:02 +010033static struct mgcp_config *g_cfg = NULL;
34
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010035static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010036{
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010037 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010038
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010039 if (nr == 0)
40 trunk = &cfg->trunk;
41 else
42 trunk = mgcp_trunk_num(cfg, nr);
43
44 return trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010045}
46
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010047/*
48 * vty code for mgcp below
49 */
50struct cmd_node mgcp_node = {
51 MGCP_NODE,
52 "%s(mgcp)#",
53 1,
54};
55
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010056struct cmd_node trunk_node = {
57 TRUNK_NODE,
58 "%s(trunk)#",
59 1,
60};
61
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010062static int config_write_mgcp(struct vty *vty)
63{
64 vty_out(vty, "mgcp%s", VTY_NEWLINE);
65 if (g_cfg->local_ip)
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020066 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
67 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010068 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
69 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
70 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080071
72 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
73 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 +080074 else
75 vty_out(vty, " rtp bts-range %u %u%s",
76 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
77
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080078 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
79 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 +080080 else
81 vty_out(vty, " rtp net-range %u %u%s",
82 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
83
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +080084 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +020085 if (g_cfg->trunk.omit_rtcp)
86 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
87 else
88 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +010089 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +010090 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +010091 g_cfg->trunk.audio_payload, VTY_NEWLINE);
92 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +010093 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +010094 g_cfg->trunk.audio_name, VTY_NEWLINE);
95 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
96 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +020097 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +010098 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +080099 if (g_cfg->transcoder_ip)
100 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100101
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800102 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
103 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
104 else
105 vty_out(vty, " rtp transcoder-range %u %u%s",
106 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800107 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800108
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100109 return CMD_SUCCESS;
110}
111
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100112static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100113{
114 int i;
115
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100116 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
117 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
118 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
119
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100120 if (!cfg->endpoints) {
121 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
122 return;
123 }
124
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100125 for (i = 1; i < cfg->number_endpoints; ++i) {
126 struct mgcp_endpoint *endp = &cfg->endpoints[i];
127 vty_out(vty,
128 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
129 "traffic received bts: %u/%u remote: %u/%u transcoder: %u/%u%s",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100130 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-08-05 01:34:51 +0800131 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
132 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
133 inet_ntoa(endp->bts_end.addr),
134 endp->bts_end.packets, endp->bts_state.lost_no,
135 endp->net_end.packets, endp->net_state.lost_no,
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100136 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200137 VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100138 }
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100139}
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100140
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100141DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
142 SHOW_STR "Display information about the MGCP Media Gateway")
143{
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100144 struct mgcp_trunk_config *trunk;
145
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100146 dump_trunk(vty, &g_cfg->trunk);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100147
148 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
149 dump_trunk(vty, trunk);
150
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100151 return CMD_SUCCESS;
152}
153
154DEFUN(cfg_mgcp,
155 cfg_mgcp_cmd,
156 "mgcp",
157 "Configure the MGCP")
158{
159 vty->node = MGCP_NODE;
160 return CMD_SUCCESS;
161}
162
163DEFUN(cfg_mgcp_local_ip,
164 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800165 "local ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100166 "Local options for the SDP record\n"
167 IP_STR
168 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100169{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200170 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100171 return CMD_SUCCESS;
172}
173
174DEFUN(cfg_mgcp_bts_ip,
175 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800176 "bts ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100177 "BTS Audio source/destination options\n"
178 IP_STR
179 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100180{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200181 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100182 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
183 return CMD_SUCCESS;
184}
185
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100186#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100187DEFUN(cfg_mgcp_bind_ip,
188 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800189 "bind ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100190 BIND_STR
191 IP_STR
192 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100193{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200194 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100195 return CMD_SUCCESS;
196}
197
198DEFUN(cfg_mgcp_bind_port,
199 cfg_mgcp_bind_port_cmd,
200 "bind port <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100201 BIND_STR
202 "Port information\n"
203 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100204{
205 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100206 g_cfg->source_port = port;
207 return CMD_SUCCESS;
208}
209
210DEFUN(cfg_mgcp_bind_early,
211 cfg_mgcp_bind_early_cmd,
212 "bind early (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100213 BIND_STR
214 "Bind local ports on start up\n"
215 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100216{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800217 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
218 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100219}
220
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800221static void parse_base(struct mgcp_port_range *range, const char **argv)
222{
223 unsigned int port = atoi(argv[0]);
224 range->mode = PORT_ALLOC_STATIC;
225 range->base_port = port;
226}
227
228static void parse_range(struct mgcp_port_range *range, const char **argv)
229{
230 range->mode = PORT_ALLOC_DYNAMIC;
231 range->range_start = atoi(argv[0]);
232 range->range_end = atoi(argv[1]);
233 range->last_port = g_cfg->bts_ports.range_start;
234}
235
236
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100237#define RTP_STR "RTP configuration\n"
238#define BTS_START_STR "First UDP port allocated for the BTS side\n"
239#define NET_START_STR "First UDP port allocated for the NET side\n"
240#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800241DEFUN(cfg_mgcp_rtp_bts_base_port,
242 cfg_mgcp_rtp_bts_base_port_cmd,
243 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100244 RTP_STR
245 BTS_START_STR
246 UDP_PORT_STR)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100247{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800248 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100249 return CMD_SUCCESS;
250}
251
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100252#define RANGE_START_STR "Start of the range of ports\n"
253#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800254DEFUN(cfg_mgcp_rtp_bts_range,
255 cfg_mgcp_rtp_bts_range_cmd,
256 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100257 RTP_STR "Range of ports to use for the BTS side\n"
258 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800259{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800260 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800261 return CMD_SUCCESS;
262}
263
264DEFUN(cfg_mgcp_rtp_net_range,
265 cfg_mgcp_rtp_net_range_cmd,
266 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100267 RTP_STR "Range of ports to use for the NET side\n"
268 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800269{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800270 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800271 return CMD_SUCCESS;
272}
273
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800274DEFUN(cfg_mgcp_rtp_net_base_port,
275 cfg_mgcp_rtp_net_base_port_cmd,
276 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100277 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800278{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800279 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800280 return CMD_SUCCESS;
281}
282
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800283ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100284 "rtp base <0-65534>",
285 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800286
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800287DEFUN(cfg_mgcp_rtp_transcoder_range,
288 cfg_mgcp_rtp_transcoder_range_cmd,
289 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100290 RTP_STR "Range of ports to use for the Transcoder\n"
291 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800292{
293 parse_range(&g_cfg->transcoder_ports, argv);
294 return CMD_SUCCESS;
295}
296
297DEFUN(cfg_mgcp_rtp_transcoder_base,
298 cfg_mgcp_rtp_transcoder_base_cmd,
299 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100300 RTP_STR "First UDP port allocated for the Transcoder side\n"
301 UDP_PORT_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800302{
303 parse_base(&g_cfg->transcoder_ports, argv);
304 return CMD_SUCCESS;
305}
306
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800307DEFUN(cfg_mgcp_rtp_ip_dscp,
308 cfg_mgcp_rtp_ip_dscp_cmd,
309 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100310 RTP_STR
311 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800312{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800313 int dscp = atoi(argv[0]);
314 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800315 return CMD_SUCCESS;
316}
317
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800318ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
319 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100320 RTP_STR
321 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800322
323
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100324#define SDP_STR "SDP File related options\n"
325#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100326DEFUN(cfg_mgcp_sdp_payload_number,
327 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100328 "sdp audio-payload number <1-255>",
329 SDP_STR AUDIO_STR
330 "Number\n" "Payload number\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100331{
332 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100333 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100334 return CMD_SUCCESS;
335}
336
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100337ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
338 "sdp audio payload number <1-255>",
339 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
340
341
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100342DEFUN(cfg_mgcp_sdp_payload_name,
343 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100344 "sdp audio-payload name NAME",
345 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100346{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100347 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100348 return CMD_SUCCESS;
349}
350
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100351ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
352 "sdp audio payload name NAME",
353 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
354
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100355DEFUN(cfg_mgcp_loop,
356 cfg_mgcp_loop_cmd,
357 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100358 "Loop audio for all endpoints on main trunk\n"
359 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100360{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100361 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100362 return CMD_SUCCESS;
363}
364
365DEFUN(cfg_mgcp_number_endp,
366 cfg_mgcp_number_endp_cmd,
367 "number endpoints <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100368 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100369{
370 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100371 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100372 return CMD_SUCCESS;
373}
374
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200375DEFUN(cfg_mgcp_omit_rtcp,
376 cfg_mgcp_omit_rtcp_cmd,
377 "rtcp-omit",
378 "Drop RTCP packets in both directions")
379{
380 g_cfg->trunk.omit_rtcp = 1;
381 return CMD_SUCCESS;
382}
383
384DEFUN(cfg_mgcp_no_omit_rtcp,
385 cfg_mgcp_no_omit_rtcp_cmd,
386 "no rtcp-omit",
387 NO_STR "Drop RTCP packets in both directions")
388{
389 g_cfg->trunk.omit_rtcp = 0;
390 return CMD_SUCCESS;
391}
392
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100393#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200394DEFUN(cfg_mgcp_agent_addr,
395 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100396 "call-agent ip A.B.C.D",
397 CALL_AGENT_STR IP_STR
398 "IPv4 Address of the callagent\n")
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200399{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200400 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200401 return CMD_SUCCESS;
402}
403
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100404ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
405 "call agent ip A.B.C.D",
406 CALL_AGENT_STR CALL_AGENT_STR IP_STR
407 "IPv4 Address of the callagent\n")
408
409
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800410DEFUN(cfg_mgcp_transcoder,
411 cfg_mgcp_transcoder_cmd,
412 "transcoder-mgw A.B.C.D",
413 "Use a MGW to detranscoder RTP\n"
414 "The IP address of the MGW")
415{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200416 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800417 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
418
419 return CMD_SUCCESS;
420}
421
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100422DEFUN(cfg_mgcp_no_transcoder,
423 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100424 "no transcoder-mgw",
425 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100426{
427 if (g_cfg->transcoder_ip) {
428 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
429 talloc_free(g_cfg->transcoder_ip);
430 g_cfg->transcoder_ip = NULL;
431 }
432
433 return CMD_SUCCESS;
434}
435
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800436DEFUN(cfg_mgcp_transcoder_remote_base,
437 cfg_mgcp_transcoder_remote_base_cmd,
438 "transcoder-remote-base <0-65534>",
439 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
440{
441 g_cfg->transcoder_remote_base = atoi(argv[0]);
442 return CMD_SUCCESS;
443}
444
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100445DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
446 "trunk <1-64>",
447 "Configure a SS7 trunk\n" "Trunk Nr\n")
448{
449 struct mgcp_trunk_config *trunk;
450 int index = atoi(argv[0]);
451
452 trunk = mgcp_trunk_num(g_cfg, index);
453 if (!trunk)
454 trunk = mgcp_trunk_alloc(g_cfg, index);
455
456 if (!trunk) {
457 vty_out(vty, "%%Unable to allocate trunk %u.%s",
458 index, VTY_NEWLINE);
459 return CMD_WARNING;
460 }
461
462 vty->node = TRUNK_NODE;
463 vty->index = trunk;
464 return CMD_SUCCESS;
465}
466
467static int config_write_trunk(struct vty *vty)
468{
469 struct mgcp_trunk_config *trunk;
470
471 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
472 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100473 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100474 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100475 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100476 trunk->audio_name, VTY_NEWLINE);
477 vty_out(vty, " loop %d%s",
478 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200479 if (trunk->omit_rtcp)
480 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
481 else
482 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100483 }
484
485 return CMD_SUCCESS;
486}
487
488DEFUN(cfg_trunk_payload_number,
489 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100490 "sdp audio-payload number <1-255>",
491 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100492{
493 struct mgcp_trunk_config *trunk = vty->index;
494 unsigned int payload = atoi(argv[0]);
495
496 trunk->audio_payload = payload;
497 return CMD_SUCCESS;
498}
499
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100500ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
501 "sdp audio payload number <1-255>",
502 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
503
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100504DEFUN(cfg_trunk_payload_name,
505 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100506 "sdp audio-payload name NAME",
507 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100508{
509 struct mgcp_trunk_config *trunk = vty->index;
510
511 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
512 return CMD_SUCCESS;
513}
514
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100515ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
516 "sdp audio payload name NAME",
517 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
518
519
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100520DEFUN(cfg_trunk_loop,
521 cfg_trunk_loop_cmd,
522 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100523 "Loop audio for all endpoints on this trunk\n"
524 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100525{
526 struct mgcp_trunk_config *trunk = vty->index;
527
528 trunk->audio_loop = atoi(argv[0]);
529 return CMD_SUCCESS;
530}
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800531
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200532DEFUN(cfg_trunk_omit_rtcp,
533 cfg_trunk_omit_rtcp_cmd,
534 "rtcp-omit",
535 "Drop RTCP packets in both directions")
536{
537 struct mgcp_trunk_config *trunk = vty->index;
538 trunk->omit_rtcp = 1;
539 return CMD_SUCCESS;
540}
541
542DEFUN(cfg_trunk_no_omit_rtcp,
543 cfg_trunk_no_omit_rtcp_cmd,
544 "no rtcp-omit",
545 "Drop RTCP packets in both directions")
546{
547 struct mgcp_trunk_config *trunk = vty->index;
548 trunk->omit_rtcp = 0;
549 return CMD_SUCCESS;
550}
551
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800552DEFUN(loop_endp,
553 loop_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100554 "loop-endpoint <0-64> NAME (0|1)",
555 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +0800556 "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 +0800557{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100558 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800559 struct mgcp_endpoint *endp;
560
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100561 trunk = find_trunk(g_cfg, atoi(argv[0]));
562 if (!trunk) {
563 vty_out(vty, "%%Trunk %d not found in the config.%s",
564 atoi(argv[0]), VTY_NEWLINE);
565 return CMD_WARNING;
566 }
567
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100568 if (!trunk->endpoints) {
569 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
570 trunk->trunk_nr, VTY_NEWLINE);
571 return CMD_WARNING;
572 }
573
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100574 int endp_no = strtoul(argv[1], NULL, 16);
575 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800576 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100577 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800578 return CMD_WARNING;
579 }
580
581
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100582 endp = &trunk->endpoints[endp_no];
583 int loop = atoi(argv[2]);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800584
585 if (loop)
586 endp->conn_mode = MGCP_CONN_LOOPBACK;
587 else
588 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther73aa5142010-08-05 12:07:00 +0000589 endp->allow_patch = 1;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800590
591 return CMD_SUCCESS;
592}
593
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800594DEFUN(tap_call,
595 tap_call_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100596 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
597 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800598 "The endpoint in hex\n"
599 "Forward the data coming from the bts\n"
600 "Forward the data coming from the bts leaving to the network\n"
601 "Forward the data coming from the net\n"
602 "Forward the data coming from the net leaving to the bts\n"
603 "destination IP of the data\n" "destination port\n")
604{
605 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100606 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800607 struct mgcp_endpoint *endp;
608 int port = 0;
609
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100610 trunk = find_trunk(g_cfg, atoi(argv[0]));
611 if (!trunk) {
612 vty_out(vty, "%%Trunk %d not found in the config.%s",
613 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800614 return CMD_WARNING;
615 }
616
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100617 if (!trunk->endpoints) {
618 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
619 trunk->trunk_nr, VTY_NEWLINE);
620 return CMD_WARNING;
621 }
622
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100623 int endp_no = strtoul(argv[1], NULL, 16);
624 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
625 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
626 argv[1], endp_no, VTY_NEWLINE);
627 return CMD_WARNING;
628 }
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800629
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100630 endp = &trunk->endpoints[endp_no];
631
632 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800633 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100634 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800635 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100636 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800637 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100638 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800639 port = MGCP_TAP_NET_OUT;
640 } else {
641 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
642 return CMD_WARNING;
643 }
644
645 tap = &endp->taps[port];
646 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100647 inet_aton(argv[3], &tap->forward.sin_addr);
648 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +0800649 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800650 return CMD_SUCCESS;
651}
652
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800653DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100654 "free-endpoint <0-64> NUMBER",
655 "Free the given endpoint\n" "Trunk number\n"
656 "Endpoint number in hex.\n")
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800657{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100658 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800659 struct mgcp_endpoint *endp;
660
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100661 trunk = find_trunk(g_cfg, atoi(argv[0]));
662 if (!trunk) {
663 vty_out(vty, "%%Trunk %d not found in the config.%s",
664 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800665 return CMD_WARNING;
666 }
667
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100668 if (!trunk->endpoints) {
669 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
670 trunk->trunk_nr, VTY_NEWLINE);
671 return CMD_WARNING;
672 }
673
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100674 int endp_no = strtoul(argv[1], NULL, 16);
675 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
676 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
677 argv[1], endp_no, VTY_NEWLINE);
678 return CMD_WARNING;
679 }
680
681 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800682 mgcp_free_endp(endp);
683 return CMD_SUCCESS;
684}
685
Harald Welteba4f8b22012-01-27 00:41:39 +0100686DEFUN(reset_endp, reset_endp_cmd,
687 "reset-endpoint <0-64> NUMBER",
688 "Reset the given endpoint\n" "Trunk number\n"
689 "Endpoint number in hex.\n")
690{
691 struct mgcp_trunk_config *trunk;
692 struct mgcp_endpoint *endp;
693 int endp_no, rc;
694
695 trunk = find_trunk(g_cfg, atoi(argv[0]));
696 if (!trunk) {
697 vty_out(vty, "%%Trunk %d not found in the config.%s",
698 atoi(argv[0]), VTY_NEWLINE);
699 return CMD_WARNING;
700 }
701
702 if (!trunk->endpoints) {
703 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
704 trunk->trunk_nr, VTY_NEWLINE);
705 return CMD_WARNING;
706 }
707
708 endp_no = strtoul(argv[1], NULL, 16);
709 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
710 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
711 argv[1], endp_no, VTY_NEWLINE);
712 return CMD_WARNING;
713 }
714
715 endp = &trunk->endpoints[endp_no];
716 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
717 if (rc < 0) {
718 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
719 return CMD_WARNING;
720 }
721 return CMD_SUCCESS;
722}
723
724DEFUN(reset_all_endp, reset_all_endp_cmd,
725 "reset-all-endpoints",
726 "Reset all endpoints\n")
727{
728 int rc;
729
730 rc = mgcp_send_reset_all(g_cfg);
731 if (rc < 0) {
732 vty_out(vty, "Error %d during endpoint reset.%s",
733 rc, VTY_NEWLINE);
734 return CMD_WARNING;
735 }
736 return CMD_SUCCESS;
737}
738
739
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100740int mgcp_vty_init(void)
741{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +0800742 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800743 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800744 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800745 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welteba4f8b22012-01-27 00:41:39 +0100746 install_element(ENABLE_NODE, &reset_endp_cmd);
747 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100748
749 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
750 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800751
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100752 install_default(MGCP_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +0200753 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +0200754 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100755 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
756 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
757 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
758 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
759 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
760 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800761 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800762 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800763 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
764 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800765 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
766 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800767 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800768 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200769 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100770 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800771 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100772 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800773 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100774 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
775 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100776 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
777 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100778 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
779 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200780 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
781 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100782
783 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
784 install_node(&trunk_node, config_write_trunk);
785 install_default(TRUNK_NODE);
786 install_element(TRUNK_NODE, &ournode_exit_cmd);
787 install_element(TRUNK_NODE, &ournode_end_cmd);
788 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
789 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100790 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
791 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100792 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200793 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
794 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100795
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100796 return 0;
797}
798
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100799static int allocate_trunk(struct mgcp_trunk_config *trunk)
800{
801 int i;
802 struct mgcp_config *cfg = trunk->cfg;
803
804 if (mgcp_endpoints_allocate(trunk) != 0) {
805 LOGP(DMGCP, LOGL_ERROR,
806 "Failed to allocate %d endpoints on trunk %d.\n",
807 trunk->number_endpoints, trunk->trunk_nr);
808 return -1;
809 }
810
811 /* early bind */
812 for (i = 1; i < trunk->number_endpoints; ++i) {
813 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100814
815 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +0100816 cfg->last_bts_port += 2;
817 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
818 LOGP(DMGCP, LOGL_FATAL,
819 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100820 return -1;
821 }
822 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
823 }
824
825 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +0100826 cfg->last_net_port += 2;
827 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
828 LOGP(DMGCP, LOGL_FATAL,
829 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100830 return -1;
831 }
832 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
833 }
834
Holger Hans Peter Freyther1b8eaf42011-02-28 14:51:48 +0100835 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
836 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +0100837 int rtp_port;
838
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100839 /* network side */
840 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
841 cfg->transcoder_ports.base_port);
842 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
843 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
844 return -1;
845 }
846 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
847
848 /* bts side */
849 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
850 cfg->transcoder_ports.base_port);
851 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
852 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
853 return -1;
854 }
855 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
856 }
857 }
858
859 return 0;
860}
861
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100862int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
863{
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100864 int rc;
865 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100866
867 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +0200868 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100869 if (rc < 0) {
870 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
871 return rc;
872 }
873
874
875 if (!g_cfg->bts_ip)
876 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
877
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +0200878 if (!g_cfg->source_addr) {
879 fprintf(stderr, "You need to specify a bind address.\n");
880 return -1;
881 }
882
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +0100883 /* initialize the last ports */
884 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
885 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
886
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100887 if (allocate_trunk(&g_cfg->trunk) != 0) {
888 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100889 return -1;
890 }
891
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +0100892 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
893 if (allocate_trunk(trunk) != 0) {
894 LOGP(DMGCP, LOGL_ERROR,
895 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
896 return -1;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +0800897 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100898 }
899
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +0800900 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100901}
902