blob: d7c649e5bb274651732b60d21a6dfb9a2b9a971d [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 Freyther1aa42462010-07-29 02:43:14 +0800102 vty_out(vty, " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s traffic received bts: %u/%u remote: %u/%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 Freytherb4b135e2010-04-07 09:37:17 +0200109 VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100110 }
111
112 return CMD_SUCCESS;
113}
114
115DEFUN(cfg_mgcp,
116 cfg_mgcp_cmd,
117 "mgcp",
118 "Configure the MGCP")
119{
120 vty->node = MGCP_NODE;
121 return CMD_SUCCESS;
122}
123
124DEFUN(cfg_mgcp_local_ip,
125 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800126 "local ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100127 "Set the IP to be used in SDP records")
128{
129 if (g_cfg->local_ip)
130 talloc_free(g_cfg->local_ip);
131 g_cfg->local_ip = talloc_strdup(g_cfg, argv[0]);
132 return CMD_SUCCESS;
133}
134
135DEFUN(cfg_mgcp_bts_ip,
136 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800137 "bts ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100138 "Set the IP of the BTS for RTP forwarding")
139{
140 if (g_cfg->bts_ip)
141 talloc_free(g_cfg->bts_ip);
142 g_cfg->bts_ip = talloc_strdup(g_cfg, argv[0]);
143 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
144 return CMD_SUCCESS;
145}
146
147DEFUN(cfg_mgcp_bind_ip,
148 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800149 "bind ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100150 "Bind the MGCP to this local addr")
151{
152 if (g_cfg->source_addr)
153 talloc_free(g_cfg->source_addr);
154 g_cfg->source_addr = talloc_strdup(g_cfg, argv[0]);
155 return CMD_SUCCESS;
156}
157
158DEFUN(cfg_mgcp_bind_port,
159 cfg_mgcp_bind_port_cmd,
160 "bind port <0-65534>",
161 "Bind the MGCP to this port")
162{
163 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100164 g_cfg->source_port = port;
165 return CMD_SUCCESS;
166}
167
168DEFUN(cfg_mgcp_bind_early,
169 cfg_mgcp_bind_early_cmd,
170 "bind early (0|1)",
171 "Bind all RTP ports early")
172{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800173 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
174 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100175}
176
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800177static void parse_base(struct mgcp_port_range *range, const char **argv)
178{
179 unsigned int port = atoi(argv[0]);
180 range->mode = PORT_ALLOC_STATIC;
181 range->base_port = port;
182}
183
184static void parse_range(struct mgcp_port_range *range, const char **argv)
185{
186 range->mode = PORT_ALLOC_DYNAMIC;
187 range->range_start = atoi(argv[0]);
188 range->range_end = atoi(argv[1]);
189 range->last_port = g_cfg->bts_ports.range_start;
190}
191
192
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800193DEFUN(cfg_mgcp_rtp_bts_base_port,
194 cfg_mgcp_rtp_bts_base_port_cmd,
195 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100196 "Base port to use")
197{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800198 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100199 return CMD_SUCCESS;
200}
201
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800202DEFUN(cfg_mgcp_rtp_bts_range,
203 cfg_mgcp_rtp_bts_range_cmd,
204 "rtp bts-range <0-65534> <0-65534>",
205 "Range of ports to allocate for endpoints\n"
206 "Start of the range of ports\n" "End of the range of ports\n")
207{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800208 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800209 return CMD_SUCCESS;
210}
211
212DEFUN(cfg_mgcp_rtp_net_range,
213 cfg_mgcp_rtp_net_range_cmd,
214 "rtp net-range <0-65534> <0-65534>",
215 "Range of ports to allocate for endpoints\n"
216 "Start of the range of ports\n" "End of the range of ports\n")
217{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800218 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800219 return CMD_SUCCESS;
220}
221
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800222DEFUN(cfg_mgcp_rtp_net_base_port,
223 cfg_mgcp_rtp_net_base_port_cmd,
224 "rtp net-base <0-65534>",
225 "Base port to use for network port\n" "Port\n")
226{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800227 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800228 return CMD_SUCCESS;
229}
230
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800231ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
232 "rtp base <0-65534>", "Base port to use")
233
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800234DEFUN(cfg_mgcp_rtp_transcoder_range,
235 cfg_mgcp_rtp_transcoder_range_cmd,
236 "rtp transcoder-range <0-65534> <0-65534>",
237 "Range of ports to allocate for the transcoder\n"
238 "Start of the range of ports\n" "End of the range of ports\n")
239{
240 parse_range(&g_cfg->transcoder_ports, argv);
241 return CMD_SUCCESS;
242}
243
244DEFUN(cfg_mgcp_rtp_transcoder_base,
245 cfg_mgcp_rtp_transcoder_base_cmd,
246 "rtp transcoder-base <0-65534>",
247 "Base port for the transcoder range\n" "Port\n")
248{
249 parse_base(&g_cfg->transcoder_ports, argv);
250 return CMD_SUCCESS;
251}
252
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800253DEFUN(cfg_mgcp_rtp_ip_dscp,
254 cfg_mgcp_rtp_ip_dscp_cmd,
255 "rtp ip-dscp <0-255>",
256 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800257{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800258 int dscp = atoi(argv[0]);
259 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800260 return CMD_SUCCESS;
261}
262
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800263ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
264 "rtp ip-tos <0-255>",
265 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
266
267
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100268DEFUN(cfg_mgcp_sdp_payload_number,
269 cfg_mgcp_sdp_payload_number_cmd,
270 "sdp audio payload number <1-255>",
271 "Set the audio codec to use")
272{
273 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100274 g_cfg->audio_payload = payload;
275 return CMD_SUCCESS;
276}
277
278DEFUN(cfg_mgcp_sdp_payload_name,
279 cfg_mgcp_sdp_payload_name_cmd,
280 "sdp audio payload name NAME",
281 "Set the audio name to use")
282{
283 if (g_cfg->audio_name)
284 talloc_free(g_cfg->audio_name);
285 g_cfg->audio_name = talloc_strdup(g_cfg, argv[0]);
286 return CMD_SUCCESS;
287}
288
289DEFUN(cfg_mgcp_loop,
290 cfg_mgcp_loop_cmd,
291 "loop (0|1)",
292 "Loop the audio")
293{
294 g_cfg->audio_loop = atoi(argv[0]);
295 return CMD_SUCCESS;
296}
297
298DEFUN(cfg_mgcp_number_endp,
299 cfg_mgcp_number_endp_cmd,
300 "number endpoints <0-65534>",
301 "The number of endpoints to allocate. This is not dynamic.")
302{
303 /* + 1 as we start counting at one */
304 g_cfg->number_endpoints = atoi(argv[0]) + 1;
305 return CMD_SUCCESS;
306}
307
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200308DEFUN(cfg_mgcp_agent_addr,
309 cfg_mgcp_agent_addr_cmd,
310 "call agent ip IP",
311 "Set the address of the call agent.")
312{
313 if (g_cfg->call_agent_addr)
314 talloc_free(g_cfg->call_agent_addr);
315 g_cfg->call_agent_addr = talloc_strdup(g_cfg, argv[0]);
316 return CMD_SUCCESS;
317}
318
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800319DEFUN(cfg_mgcp_transcoder,
320 cfg_mgcp_transcoder_cmd,
321 "transcoder-mgw A.B.C.D",
322 "Use a MGW to detranscoder RTP\n"
323 "The IP address of the MGW")
324{
325 if (g_cfg->transcoder_ip)
326 talloc_free(g_cfg->transcoder_ip);
327 g_cfg->transcoder_ip = talloc_strdup(g_cfg, argv[0]);
328 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
329
330 return CMD_SUCCESS;
331}
332
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800333DEFUN(cfg_mgcp_transcoder_remote_base,
334 cfg_mgcp_transcoder_remote_base_cmd,
335 "transcoder-remote-base <0-65534>",
336 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
337{
338 g_cfg->transcoder_remote_base = atoi(argv[0]);
339 return CMD_SUCCESS;
340}
341
342
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800343DEFUN(loop_endp,
344 loop_endp_cmd,
345 "loop-endpoint NAME (0|1)",
346 "Loop a given endpoint\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800347 "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 +0800348{
349 struct mgcp_endpoint *endp;
350
351 int endp_no = strtoul(argv[0], NULL, 16);
352 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
353 vty_out(vty, "Loopback number %s/%d is invalid.%s",
354 argv[0], endp_no, VTY_NEWLINE);
355 return CMD_WARNING;
356 }
357
358
359 endp = &g_cfg->endpoints[endp_no];
360 int loop = atoi(argv[1]);
361
362 if (loop)
363 endp->conn_mode = MGCP_CONN_LOOPBACK;
364 else
365 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000366 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800367
368 return CMD_SUCCESS;
369}
370
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800371DEFUN(tap_call,
372 tap_call_cmd,
373 "tap-call ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
374 "Forward data on endpoint to a different system\n"
375 "The endpoint in hex\n"
376 "Forward the data coming from the bts\n"
377 "Forward the data coming from the bts leaving to the network\n"
378 "Forward the data coming from the net\n"
379 "Forward the data coming from the net leaving to the bts\n"
380 "destination IP of the data\n" "destination port\n")
381{
382 struct mgcp_rtp_tap *tap;
383 struct mgcp_endpoint *endp;
384 int port = 0;
385
386 int endp_no = strtoul(argv[0], NULL, 16);
387 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
388 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
389 argv[0], endp_no, VTY_NEWLINE);
390 return CMD_WARNING;
391 }
392
393 endp = &g_cfg->endpoints[endp_no];
394
395 if (strcmp(argv[1], "bts-in") == 0) {
396 port = MGCP_TAP_BTS_IN;
397 } else if (strcmp(argv[1], "bts-out") == 0) {
398 port = MGCP_TAP_BTS_OUT;
399 } else if (strcmp(argv[1], "net-in") == 0) {
400 port = MGCP_TAP_NET_IN;
401 } else if (strcmp(argv[1], "net-out") == 0) {
402 port = MGCP_TAP_NET_OUT;
403 } else {
404 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
405 return CMD_WARNING;
406 }
407
408 tap = &endp->taps[port];
409 memset(&tap->forward, 0, sizeof(tap->forward));
410 inet_aton(argv[2], &tap->forward.sin_addr);
411 tap->forward.sin_port = htons(atoi(argv[3]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800412 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800413 return CMD_SUCCESS;
414}
415
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800416DEFUN(free_endp, free_endp_cmd,
417 "free-endpoint NUMBER",
418 "Free the given endpoint\n" "Endpoint number in hex.\n")
419{
420 struct mgcp_endpoint *endp;
421
422 int endp_no = strtoul(argv[0], NULL, 16);
423 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
424 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
425 argv[0], endp_no, VTY_NEWLINE);
426 return CMD_WARNING;
427 }
428
429 endp = &g_cfg->endpoints[endp_no];
430 mgcp_free_endp(endp);
431 return CMD_SUCCESS;
432}
433
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100434int mgcp_vty_init(void)
435{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800436 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800437 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800438 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800439 install_element(ENABLE_NODE, &free_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100440
441 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
442 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800443
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100444 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200445 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200446 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100447 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
448 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
449 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
450 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
451 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
452 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800453 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800454 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800455 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
456 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800457 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
458 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800459 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800460 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100461 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
462 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
463 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
464 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200465 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800466 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800467 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100468 return 0;
469}
470
471int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
472{
473 int i, rc;
474
475 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200476 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100477 if (rc < 0) {
478 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
479 return rc;
480 }
481
482
483 if (!g_cfg->bts_ip)
484 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
485
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200486 if (!g_cfg->source_addr) {
487 fprintf(stderr, "You need to specify a bind address.\n");
488 return -1;
489 }
490
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100491 if (mgcp_endpoints_allocate(g_cfg) != 0) {
492 fprintf(stderr, "Failed to allocate endpoints: %d. Quitting.\n", g_cfg->number_endpoints);
493 return -1;
494 }
495
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100496 /* early bind */
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800497 for (i = 1; i < g_cfg->number_endpoints; ++i) {
498 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
499 int rtp_port;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100500
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800501 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
502 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
503 g_cfg->bts_ports.base_port);
504 if (mgcp_bind_bts_rtp_port(endp, rtp_port) != 0) {
505 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
506 return -1;
507 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800508 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100509 }
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800510
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800511 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC) {
512 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
513 g_cfg->net_ports.base_port);
514 if (mgcp_bind_net_rtp_port(endp, rtp_port) != 0) {
515 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
516 return -1;
517 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800518 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800519 }
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800520
521 if (g_cfg->transcoder_ip && g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
522 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
523 g_cfg->transcoder_ports.base_port);
524 if (mgcp_bind_transcoder_rtp_port(endp, rtp_port) != 0) {
525 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
526 return -1;
527 }
528 endp->transcoder_end.local_alloc = PORT_ALLOC_STATIC;
529 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100530 }
531
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800532 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100533}
534