blob: b603570963611b7060bc73f29e84de4b73d0267f [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);
89
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010090 return CMD_SUCCESS;
91}
92
93DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
94 SHOW_STR "Display information about the MGCP Media Gateway")
95{
96 int i;
97
98 vty_out(vty, "MGCP is up and running with %u endpoints:%s", g_cfg->number_endpoints - 1, VTY_NEWLINE);
99 for (i = 1; i < g_cfg->number_endpoints; ++i) {
100 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
Holger Hans Peter Freyther1aa42462010-07-29 02:43:14 +0800101 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 +0100102 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800103 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
104 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
105 inet_ntoa(endp->bts_end.addr),
106 endp->bts_end.packets, endp->bts_state.lost_no,
107 endp->net_end.packets, endp->net_state.lost_no,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200108 VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100109 }
110
111 return CMD_SUCCESS;
112}
113
114DEFUN(cfg_mgcp,
115 cfg_mgcp_cmd,
116 "mgcp",
117 "Configure the MGCP")
118{
119 vty->node = MGCP_NODE;
120 return CMD_SUCCESS;
121}
122
123DEFUN(cfg_mgcp_local_ip,
124 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800125 "local ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100126 "Set the IP to be used in SDP records")
127{
128 if (g_cfg->local_ip)
129 talloc_free(g_cfg->local_ip);
130 g_cfg->local_ip = talloc_strdup(g_cfg, argv[0]);
131 return CMD_SUCCESS;
132}
133
134DEFUN(cfg_mgcp_bts_ip,
135 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800136 "bts ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100137 "Set the IP of the BTS for RTP forwarding")
138{
139 if (g_cfg->bts_ip)
140 talloc_free(g_cfg->bts_ip);
141 g_cfg->bts_ip = talloc_strdup(g_cfg, argv[0]);
142 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
143 return CMD_SUCCESS;
144}
145
146DEFUN(cfg_mgcp_bind_ip,
147 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800148 "bind ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100149 "Bind the MGCP to this local addr")
150{
151 if (g_cfg->source_addr)
152 talloc_free(g_cfg->source_addr);
153 g_cfg->source_addr = talloc_strdup(g_cfg, argv[0]);
154 return CMD_SUCCESS;
155}
156
157DEFUN(cfg_mgcp_bind_port,
158 cfg_mgcp_bind_port_cmd,
159 "bind port <0-65534>",
160 "Bind the MGCP to this port")
161{
162 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100163 g_cfg->source_port = port;
164 return CMD_SUCCESS;
165}
166
167DEFUN(cfg_mgcp_bind_early,
168 cfg_mgcp_bind_early_cmd,
169 "bind early (0|1)",
170 "Bind all RTP ports early")
171{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800172 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
173 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100174}
175
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800176static void parse_base(struct mgcp_port_range *range, const char **argv)
177{
178 unsigned int port = atoi(argv[0]);
179 range->mode = PORT_ALLOC_STATIC;
180 range->base_port = port;
181}
182
183static void parse_range(struct mgcp_port_range *range, const char **argv)
184{
185 range->mode = PORT_ALLOC_DYNAMIC;
186 range->range_start = atoi(argv[0]);
187 range->range_end = atoi(argv[1]);
188 range->last_port = g_cfg->bts_ports.range_start;
189}
190
191
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800192DEFUN(cfg_mgcp_rtp_bts_base_port,
193 cfg_mgcp_rtp_bts_base_port_cmd,
194 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100195 "Base port to use")
196{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800197 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100198 return CMD_SUCCESS;
199}
200
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800201DEFUN(cfg_mgcp_rtp_bts_range,
202 cfg_mgcp_rtp_bts_range_cmd,
203 "rtp bts-range <0-65534> <0-65534>",
204 "Range of ports to allocate for endpoints\n"
205 "Start of the range of ports\n" "End of the range of ports\n")
206{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800207 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800208 return CMD_SUCCESS;
209}
210
211DEFUN(cfg_mgcp_rtp_net_range,
212 cfg_mgcp_rtp_net_range_cmd,
213 "rtp net-range <0-65534> <0-65534>",
214 "Range of ports to allocate for endpoints\n"
215 "Start of the range of ports\n" "End of the range of ports\n")
216{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800217 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800218 return CMD_SUCCESS;
219}
220
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800221DEFUN(cfg_mgcp_rtp_net_base_port,
222 cfg_mgcp_rtp_net_base_port_cmd,
223 "rtp net-base <0-65534>",
224 "Base port to use for network port\n" "Port\n")
225{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800226 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800227 return CMD_SUCCESS;
228}
229
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800230ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
231 "rtp base <0-65534>", "Base port to use")
232
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800233DEFUN(cfg_mgcp_rtp_transcoder_range,
234 cfg_mgcp_rtp_transcoder_range_cmd,
235 "rtp transcoder-range <0-65534> <0-65534>",
236 "Range of ports to allocate for the transcoder\n"
237 "Start of the range of ports\n" "End of the range of ports\n")
238{
239 parse_range(&g_cfg->transcoder_ports, argv);
240 return CMD_SUCCESS;
241}
242
243DEFUN(cfg_mgcp_rtp_transcoder_base,
244 cfg_mgcp_rtp_transcoder_base_cmd,
245 "rtp transcoder-base <0-65534>",
246 "Base port for the transcoder range\n" "Port\n")
247{
248 parse_base(&g_cfg->transcoder_ports, argv);
249 return CMD_SUCCESS;
250}
251
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800252DEFUN(cfg_mgcp_rtp_ip_dscp,
253 cfg_mgcp_rtp_ip_dscp_cmd,
254 "rtp ip-dscp <0-255>",
255 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800256{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800257 int dscp = atoi(argv[0]);
258 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800259 return CMD_SUCCESS;
260}
261
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800262ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
263 "rtp ip-tos <0-255>",
264 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
265
266
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100267DEFUN(cfg_mgcp_sdp_payload_number,
268 cfg_mgcp_sdp_payload_number_cmd,
269 "sdp audio payload number <1-255>",
270 "Set the audio codec to use")
271{
272 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100273 g_cfg->audio_payload = payload;
274 return CMD_SUCCESS;
275}
276
277DEFUN(cfg_mgcp_sdp_payload_name,
278 cfg_mgcp_sdp_payload_name_cmd,
279 "sdp audio payload name NAME",
280 "Set the audio name to use")
281{
282 if (g_cfg->audio_name)
283 talloc_free(g_cfg->audio_name);
284 g_cfg->audio_name = talloc_strdup(g_cfg, argv[0]);
285 return CMD_SUCCESS;
286}
287
288DEFUN(cfg_mgcp_loop,
289 cfg_mgcp_loop_cmd,
290 "loop (0|1)",
291 "Loop the audio")
292{
293 g_cfg->audio_loop = atoi(argv[0]);
294 return CMD_SUCCESS;
295}
296
297DEFUN(cfg_mgcp_number_endp,
298 cfg_mgcp_number_endp_cmd,
299 "number endpoints <0-65534>",
300 "The number of endpoints to allocate. This is not dynamic.")
301{
302 /* + 1 as we start counting at one */
303 g_cfg->number_endpoints = atoi(argv[0]) + 1;
304 return CMD_SUCCESS;
305}
306
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200307DEFUN(cfg_mgcp_agent_addr,
308 cfg_mgcp_agent_addr_cmd,
309 "call agent ip IP",
310 "Set the address of the call agent.")
311{
312 if (g_cfg->call_agent_addr)
313 talloc_free(g_cfg->call_agent_addr);
314 g_cfg->call_agent_addr = talloc_strdup(g_cfg, argv[0]);
315 return CMD_SUCCESS;
316}
317
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800318DEFUN(cfg_mgcp_transcoder,
319 cfg_mgcp_transcoder_cmd,
320 "transcoder-mgw A.B.C.D",
321 "Use a MGW to detranscoder RTP\n"
322 "The IP address of the MGW")
323{
324 if (g_cfg->transcoder_ip)
325 talloc_free(g_cfg->transcoder_ip);
326 g_cfg->transcoder_ip = talloc_strdup(g_cfg, argv[0]);
327 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
328
329 return CMD_SUCCESS;
330}
331
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800332DEFUN(loop_endp,
333 loop_endp_cmd,
334 "loop-endpoint NAME (0|1)",
335 "Loop a given endpoint\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800336 "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 +0800337{
338 struct mgcp_endpoint *endp;
339
340 int endp_no = strtoul(argv[0], NULL, 16);
341 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
342 vty_out(vty, "Loopback number %s/%d is invalid.%s",
343 argv[0], endp_no, VTY_NEWLINE);
344 return CMD_WARNING;
345 }
346
347
348 endp = &g_cfg->endpoints[endp_no];
349 int loop = atoi(argv[1]);
350
351 if (loop)
352 endp->conn_mode = MGCP_CONN_LOOPBACK;
353 else
354 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000355 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800356
357 return CMD_SUCCESS;
358}
359
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800360DEFUN(tap_call,
361 tap_call_cmd,
362 "tap-call ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
363 "Forward data on endpoint to a different system\n"
364 "The endpoint in hex\n"
365 "Forward the data coming from the bts\n"
366 "Forward the data coming from the bts leaving to the network\n"
367 "Forward the data coming from the net\n"
368 "Forward the data coming from the net leaving to the bts\n"
369 "destination IP of the data\n" "destination port\n")
370{
371 struct mgcp_rtp_tap *tap;
372 struct mgcp_endpoint *endp;
373 int port = 0;
374
375 int endp_no = strtoul(argv[0], NULL, 16);
376 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
377 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
378 argv[0], endp_no, VTY_NEWLINE);
379 return CMD_WARNING;
380 }
381
382 endp = &g_cfg->endpoints[endp_no];
383
384 if (strcmp(argv[1], "bts-in") == 0) {
385 port = MGCP_TAP_BTS_IN;
386 } else if (strcmp(argv[1], "bts-out") == 0) {
387 port = MGCP_TAP_BTS_OUT;
388 } else if (strcmp(argv[1], "net-in") == 0) {
389 port = MGCP_TAP_NET_IN;
390 } else if (strcmp(argv[1], "net-out") == 0) {
391 port = MGCP_TAP_NET_OUT;
392 } else {
393 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
394 return CMD_WARNING;
395 }
396
397 tap = &endp->taps[port];
398 memset(&tap->forward, 0, sizeof(tap->forward));
399 inet_aton(argv[2], &tap->forward.sin_addr);
400 tap->forward.sin_port = htons(atoi(argv[3]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800401 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800402 return CMD_SUCCESS;
403}
404
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800405DEFUN(free_endp, free_endp_cmd,
406 "free-endpoint NUMBER",
407 "Free the given endpoint\n" "Endpoint number in hex.\n")
408{
409 struct mgcp_endpoint *endp;
410
411 int endp_no = strtoul(argv[0], NULL, 16);
412 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
413 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
414 argv[0], endp_no, VTY_NEWLINE);
415 return CMD_WARNING;
416 }
417
418 endp = &g_cfg->endpoints[endp_no];
419 mgcp_free_endp(endp);
420 return CMD_SUCCESS;
421}
422
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100423int mgcp_vty_init(void)
424{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800425 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800426 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800427 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800428 install_element(ENABLE_NODE, &free_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100429
430 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
431 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800432
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100433 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200434 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200435 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100436 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
437 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
438 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
439 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
440 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
441 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800442 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800443 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800444 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
445 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800446 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
447 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800448 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800449 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100450 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
451 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
452 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
453 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200454 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800455 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100456 return 0;
457}
458
459int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
460{
461 int i, rc;
462
463 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200464 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100465 if (rc < 0) {
466 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
467 return rc;
468 }
469
470
471 if (!g_cfg->bts_ip)
472 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
473
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200474 if (!g_cfg->source_addr) {
475 fprintf(stderr, "You need to specify a bind address.\n");
476 return -1;
477 }
478
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100479 if (mgcp_endpoints_allocate(g_cfg) != 0) {
480 fprintf(stderr, "Failed to allocate endpoints: %d. Quitting.\n", g_cfg->number_endpoints);
481 return -1;
482 }
483
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100484 /* early bind */
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800485 for (i = 1; i < g_cfg->number_endpoints; ++i) {
486 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
487 int rtp_port;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100488
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800489 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
490 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
491 g_cfg->bts_ports.base_port);
492 if (mgcp_bind_bts_rtp_port(endp, rtp_port) != 0) {
493 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
494 return -1;
495 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800496 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100497 }
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800498
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800499 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC) {
500 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
501 g_cfg->net_ports.base_port);
502 if (mgcp_bind_net_rtp_port(endp, rtp_port) != 0) {
503 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
504 return -1;
505 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800506 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800507 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100508 }
509
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800510 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100511}
512