blob: a9845a12f9349ee61c0a33f2b3812e7af18b9569 [file] [log] [blame]
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
2/* The protocol implementation */
3
4/*
5 * (C) 2009-2010 by Holger Hans Peter Freyther <zecke@selfish.org>
6 * (C) 2009-2010 by On-Waves
7 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (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
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 *
23 */
24
25#include <sys/types.h>
26
Holger Hans Peter Freyther1ebad742010-02-26 20:16:37 +010027#include <osmocore/talloc.h>
28
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010029#include <openbsc/debug.h>
30#include <openbsc/mgcp.h>
31#include <openbsc/mgcp_internal.h>
Harald Welte62ab20c2010-05-14 18:59:17 +020032#include <openbsc/vty.h>
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010033
Harald Welte4b037e42010-05-19 19:45:32 +020034#include <osmocom/vty/command.h>
35#include <osmocom/vty/vty.h>
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010036
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020037#include <string.h>
38
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010039static struct mgcp_config *g_cfg = NULL;
40
41/*
42 * vty code for mgcp below
43 */
44struct cmd_node mgcp_node = {
45 MGCP_NODE,
46 "%s(mgcp)#",
47 1,
48};
49
50static int config_write_mgcp(struct vty *vty)
51{
52 vty_out(vty, "mgcp%s", VTY_NEWLINE);
53 if (g_cfg->local_ip)
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020054 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
55 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010056 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
57 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
58 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080059
60 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
61 vty_out(vty, " rtp bts-base %u%s", g_cfg->bts_ports.base_port, VTY_NEWLINE);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +080062 else
63 vty_out(vty, " rtp bts-range %u %u%s",
64 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
65
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080066 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
67 vty_out(vty, " rtp net-base %u%s", g_cfg->net_ports.base_port, VTY_NEWLINE);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +080068 else
69 vty_out(vty, " rtp net-range %u %u%s",
70 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
71
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +080072 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Holger Hans Peter Freyther2d425052010-04-13 09:28:40 +020073 if (g_cfg->audio_payload != -1)
74 vty_out(vty, " sdp audio payload number %d%s", g_cfg->audio_payload, VTY_NEWLINE);
75 if (g_cfg->audio_name)
76 vty_out(vty, " sdp audio payload name %s%s", g_cfg->audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010077 vty_out(vty, " loop %u%s", !!g_cfg->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020078 vty_out(vty, " number endpoints %u%s", g_cfg->number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +020079 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020080 vty_out(vty, " call agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +080081 if (g_cfg->transcoder_ip)
82 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010083
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +080084 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
85 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
86 else
87 vty_out(vty, " rtp transcoder-range %u %u%s",
88 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +080089 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +080090
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010091 return CMD_SUCCESS;
92}
93
94DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
95 SHOW_STR "Display information about the MGCP Media Gateway")
96{
97 int i;
98
99 vty_out(vty, "MGCP is up and running with %u endpoints:%s", g_cfg->number_endpoints - 1, VTY_NEWLINE);
100 for (i = 1; i < g_cfg->number_endpoints; ++i) {
101 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
Holger Hans Peter Freyther9aa8a9c2010-09-19 13:50:52 +0200102 vty_out(vty, " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s traffic received bts: %u/%u remote: %u/%u transcoder: %u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100103 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800104 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
105 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
106 inet_ntoa(endp->bts_end.addr),
107 endp->bts_end.packets, endp->bts_state.lost_no,
108 endp->net_end.packets, endp->net_state.lost_no,
Holger Hans Peter Freyther9aa8a9c2010-09-19 13:50:52 +0200109 endp->transcoder_end.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200110 VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100111 }
112
113 return CMD_SUCCESS;
114}
115
116DEFUN(cfg_mgcp,
117 cfg_mgcp_cmd,
118 "mgcp",
119 "Configure the MGCP")
120{
121 vty->node = MGCP_NODE;
122 return CMD_SUCCESS;
123}
124
125DEFUN(cfg_mgcp_local_ip,
126 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800127 "local ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100128 "Set the IP to be used in SDP records")
129{
130 if (g_cfg->local_ip)
131 talloc_free(g_cfg->local_ip);
132 g_cfg->local_ip = talloc_strdup(g_cfg, argv[0]);
133 return CMD_SUCCESS;
134}
135
136DEFUN(cfg_mgcp_bts_ip,
137 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800138 "bts ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100139 "Set the IP of the BTS for RTP forwarding")
140{
141 if (g_cfg->bts_ip)
142 talloc_free(g_cfg->bts_ip);
143 g_cfg->bts_ip = talloc_strdup(g_cfg, argv[0]);
144 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
145 return CMD_SUCCESS;
146}
147
148DEFUN(cfg_mgcp_bind_ip,
149 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800150 "bind ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100151 "Bind the MGCP to this local addr")
152{
153 if (g_cfg->source_addr)
154 talloc_free(g_cfg->source_addr);
155 g_cfg->source_addr = talloc_strdup(g_cfg, argv[0]);
156 return CMD_SUCCESS;
157}
158
159DEFUN(cfg_mgcp_bind_port,
160 cfg_mgcp_bind_port_cmd,
161 "bind port <0-65534>",
162 "Bind the MGCP to this port")
163{
164 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100165 g_cfg->source_port = port;
166 return CMD_SUCCESS;
167}
168
169DEFUN(cfg_mgcp_bind_early,
170 cfg_mgcp_bind_early_cmd,
171 "bind early (0|1)",
172 "Bind all RTP ports early")
173{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800174 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
175 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100176}
177
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800178static void parse_base(struct mgcp_port_range *range, const char **argv)
179{
180 unsigned int port = atoi(argv[0]);
181 range->mode = PORT_ALLOC_STATIC;
182 range->base_port = port;
183}
184
185static void parse_range(struct mgcp_port_range *range, const char **argv)
186{
187 range->mode = PORT_ALLOC_DYNAMIC;
188 range->range_start = atoi(argv[0]);
189 range->range_end = atoi(argv[1]);
190 range->last_port = g_cfg->bts_ports.range_start;
191}
192
193
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800194DEFUN(cfg_mgcp_rtp_bts_base_port,
195 cfg_mgcp_rtp_bts_base_port_cmd,
196 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100197 "Base port to use")
198{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800199 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100200 return CMD_SUCCESS;
201}
202
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800203DEFUN(cfg_mgcp_rtp_bts_range,
204 cfg_mgcp_rtp_bts_range_cmd,
205 "rtp bts-range <0-65534> <0-65534>",
206 "Range of ports to allocate for endpoints\n"
207 "Start of the range of ports\n" "End of the range of ports\n")
208{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800209 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800210 return CMD_SUCCESS;
211}
212
213DEFUN(cfg_mgcp_rtp_net_range,
214 cfg_mgcp_rtp_net_range_cmd,
215 "rtp net-range <0-65534> <0-65534>",
216 "Range of ports to allocate for endpoints\n"
217 "Start of the range of ports\n" "End of the range of ports\n")
218{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800219 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800220 return CMD_SUCCESS;
221}
222
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800223DEFUN(cfg_mgcp_rtp_net_base_port,
224 cfg_mgcp_rtp_net_base_port_cmd,
225 "rtp net-base <0-65534>",
226 "Base port to use for network port\n" "Port\n")
227{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800228 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800229 return CMD_SUCCESS;
230}
231
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800232ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
233 "rtp base <0-65534>", "Base port to use")
234
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800235DEFUN(cfg_mgcp_rtp_transcoder_range,
236 cfg_mgcp_rtp_transcoder_range_cmd,
237 "rtp transcoder-range <0-65534> <0-65534>",
238 "Range of ports to allocate for the transcoder\n"
239 "Start of the range of ports\n" "End of the range of ports\n")
240{
241 parse_range(&g_cfg->transcoder_ports, argv);
242 return CMD_SUCCESS;
243}
244
245DEFUN(cfg_mgcp_rtp_transcoder_base,
246 cfg_mgcp_rtp_transcoder_base_cmd,
247 "rtp transcoder-base <0-65534>",
248 "Base port for the transcoder range\n" "Port\n")
249{
250 parse_base(&g_cfg->transcoder_ports, argv);
251 return CMD_SUCCESS;
252}
253
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800254DEFUN(cfg_mgcp_rtp_ip_dscp,
255 cfg_mgcp_rtp_ip_dscp_cmd,
256 "rtp ip-dscp <0-255>",
257 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800258{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800259 int dscp = atoi(argv[0]);
260 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800261 return CMD_SUCCESS;
262}
263
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800264ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
265 "rtp ip-tos <0-255>",
266 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
267
268
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100269DEFUN(cfg_mgcp_sdp_payload_number,
270 cfg_mgcp_sdp_payload_number_cmd,
271 "sdp audio payload number <1-255>",
272 "Set the audio codec to use")
273{
274 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100275 g_cfg->audio_payload = payload;
276 return CMD_SUCCESS;
277}
278
279DEFUN(cfg_mgcp_sdp_payload_name,
280 cfg_mgcp_sdp_payload_name_cmd,
281 "sdp audio payload name NAME",
282 "Set the audio name to use")
283{
284 if (g_cfg->audio_name)
285 talloc_free(g_cfg->audio_name);
286 g_cfg->audio_name = talloc_strdup(g_cfg, argv[0]);
287 return CMD_SUCCESS;
288}
289
290DEFUN(cfg_mgcp_loop,
291 cfg_mgcp_loop_cmd,
292 "loop (0|1)",
293 "Loop the audio")
294{
295 g_cfg->audio_loop = atoi(argv[0]);
296 return CMD_SUCCESS;
297}
298
299DEFUN(cfg_mgcp_number_endp,
300 cfg_mgcp_number_endp_cmd,
301 "number endpoints <0-65534>",
302 "The number of endpoints to allocate. This is not dynamic.")
303{
304 /* + 1 as we start counting at one */
305 g_cfg->number_endpoints = atoi(argv[0]) + 1;
306 return CMD_SUCCESS;
307}
308
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200309DEFUN(cfg_mgcp_agent_addr,
310 cfg_mgcp_agent_addr_cmd,
311 "call agent ip IP",
312 "Set the address of the call agent.")
313{
314 if (g_cfg->call_agent_addr)
315 talloc_free(g_cfg->call_agent_addr);
316 g_cfg->call_agent_addr = talloc_strdup(g_cfg, argv[0]);
317 return CMD_SUCCESS;
318}
319
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800320DEFUN(cfg_mgcp_transcoder,
321 cfg_mgcp_transcoder_cmd,
322 "transcoder-mgw A.B.C.D",
323 "Use a MGW to detranscoder RTP\n"
324 "The IP address of the MGW")
325{
326 if (g_cfg->transcoder_ip)
327 talloc_free(g_cfg->transcoder_ip);
328 g_cfg->transcoder_ip = talloc_strdup(g_cfg, argv[0]);
329 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
330
331 return CMD_SUCCESS;
332}
333
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800334DEFUN(cfg_mgcp_transcoder_remote_base,
335 cfg_mgcp_transcoder_remote_base_cmd,
336 "transcoder-remote-base <0-65534>",
337 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
338{
339 g_cfg->transcoder_remote_base = atoi(argv[0]);
340 return CMD_SUCCESS;
341}
342
343
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800344DEFUN(loop_endp,
345 loop_endp_cmd,
346 "loop-endpoint NAME (0|1)",
347 "Loop a given endpoint\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800348 "The name in hex of the endpoint\n" "Disable the loop\n" "Enable the loop\n")
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800349{
350 struct mgcp_endpoint *endp;
351
352 int endp_no = strtoul(argv[0], NULL, 16);
353 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
354 vty_out(vty, "Loopback number %s/%d is invalid.%s",
355 argv[0], endp_no, VTY_NEWLINE);
356 return CMD_WARNING;
357 }
358
359
360 endp = &g_cfg->endpoints[endp_no];
361 int loop = atoi(argv[1]);
362
363 if (loop)
364 endp->conn_mode = MGCP_CONN_LOOPBACK;
365 else
366 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000367 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800368
369 return CMD_SUCCESS;
370}
371
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800372DEFUN(tap_call,
373 tap_call_cmd,
374 "tap-call ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
375 "Forward data on endpoint to a different system\n"
376 "The endpoint in hex\n"
377 "Forward the data coming from the bts\n"
378 "Forward the data coming from the bts leaving to the network\n"
379 "Forward the data coming from the net\n"
380 "Forward the data coming from the net leaving to the bts\n"
381 "destination IP of the data\n" "destination port\n")
382{
383 struct mgcp_rtp_tap *tap;
384 struct mgcp_endpoint *endp;
385 int port = 0;
386
387 int endp_no = strtoul(argv[0], NULL, 16);
388 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
389 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
390 argv[0], endp_no, VTY_NEWLINE);
391 return CMD_WARNING;
392 }
393
394 endp = &g_cfg->endpoints[endp_no];
395
396 if (strcmp(argv[1], "bts-in") == 0) {
397 port = MGCP_TAP_BTS_IN;
398 } else if (strcmp(argv[1], "bts-out") == 0) {
399 port = MGCP_TAP_BTS_OUT;
400 } else if (strcmp(argv[1], "net-in") == 0) {
401 port = MGCP_TAP_NET_IN;
402 } else if (strcmp(argv[1], "net-out") == 0) {
403 port = MGCP_TAP_NET_OUT;
404 } else {
405 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
406 return CMD_WARNING;
407 }
408
409 tap = &endp->taps[port];
410 memset(&tap->forward, 0, sizeof(tap->forward));
411 inet_aton(argv[2], &tap->forward.sin_addr);
412 tap->forward.sin_port = htons(atoi(argv[3]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800413 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800414 return CMD_SUCCESS;
415}
416
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800417DEFUN(free_endp, free_endp_cmd,
418 "free-endpoint NUMBER",
419 "Free the given endpoint\n" "Endpoint number in hex.\n")
420{
421 struct mgcp_endpoint *endp;
422
423 int endp_no = strtoul(argv[0], NULL, 16);
424 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
425 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
426 argv[0], endp_no, VTY_NEWLINE);
427 return CMD_WARNING;
428 }
429
430 endp = &g_cfg->endpoints[endp_no];
431 mgcp_free_endp(endp);
432 return CMD_SUCCESS;
433}
434
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100435int mgcp_vty_init(void)
436{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800437 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800438 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800439 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800440 install_element(ENABLE_NODE, &free_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100441
442 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
443 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800444
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100445 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200446 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200447 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100448 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
449 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
450 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
451 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
452 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
453 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800454 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800455 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800456 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
457 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800458 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
459 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800460 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800461 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100462 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
463 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
464 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
465 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200466 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800467 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800468 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100469 return 0;
470}
471
472int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
473{
474 int i, rc;
475
476 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200477 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100478 if (rc < 0) {
479 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
480 return rc;
481 }
482
483
484 if (!g_cfg->bts_ip)
485 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
486
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200487 if (!g_cfg->source_addr) {
488 fprintf(stderr, "You need to specify a bind address.\n");
489 return -1;
490 }
491
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100492 if (mgcp_endpoints_allocate(g_cfg) != 0) {
493 fprintf(stderr, "Failed to allocate endpoints: %d. Quitting.\n", g_cfg->number_endpoints);
494 return -1;
495 }
496
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100497 /* early bind */
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800498 for (i = 1; i < g_cfg->number_endpoints; ++i) {
499 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
500 int rtp_port;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100501
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800502 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
503 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
504 g_cfg->bts_ports.base_port);
505 if (mgcp_bind_bts_rtp_port(endp, rtp_port) != 0) {
506 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
507 return -1;
508 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800509 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100510 }
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800511
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800512 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC) {
513 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
514 g_cfg->net_ports.base_port);
515 if (mgcp_bind_net_rtp_port(endp, rtp_port) != 0) {
516 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
517 return -1;
518 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800519 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800520 }
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800521
522 if (g_cfg->transcoder_ip && g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
523 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
524 g_cfg->transcoder_ports.base_port);
525 if (mgcp_bind_transcoder_rtp_port(endp, rtp_port) != 0) {
526 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
527 return -1;
528 }
529 endp->transcoder_end.local_alloc = PORT_ALLOC_STATIC;
530 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100531 }
532
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800533 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100534}
535