blob: e86ce7d7d5da6d13ea00a14dcfe7863665f74225 [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 Freyther7bdc6372010-02-20 21:21:02 +010081
82 return CMD_SUCCESS;
83}
84
85DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
86 SHOW_STR "Display information about the MGCP Media Gateway")
87{
88 int i;
89
90 vty_out(vty, "MGCP is up and running with %u endpoints:%s", g_cfg->number_endpoints - 1, VTY_NEWLINE);
91 for (i = 1; i < g_cfg->number_endpoints; ++i) {
92 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
Holger Hans Peter Freyther1aa42462010-07-29 02:43:14 +080093 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 +010094 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +080095 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
96 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
97 inet_ntoa(endp->bts_end.addr),
98 endp->bts_end.packets, endp->bts_state.lost_no,
99 endp->net_end.packets, endp->net_state.lost_no,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200100 VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100101 }
102
103 return CMD_SUCCESS;
104}
105
106DEFUN(cfg_mgcp,
107 cfg_mgcp_cmd,
108 "mgcp",
109 "Configure the MGCP")
110{
111 vty->node = MGCP_NODE;
112 return CMD_SUCCESS;
113}
114
115DEFUN(cfg_mgcp_local_ip,
116 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800117 "local ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100118 "Set the IP to be used in SDP records")
119{
120 if (g_cfg->local_ip)
121 talloc_free(g_cfg->local_ip);
122 g_cfg->local_ip = talloc_strdup(g_cfg, argv[0]);
123 return CMD_SUCCESS;
124}
125
126DEFUN(cfg_mgcp_bts_ip,
127 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800128 "bts ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100129 "Set the IP of the BTS for RTP forwarding")
130{
131 if (g_cfg->bts_ip)
132 talloc_free(g_cfg->bts_ip);
133 g_cfg->bts_ip = talloc_strdup(g_cfg, argv[0]);
134 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
135 return CMD_SUCCESS;
136}
137
138DEFUN(cfg_mgcp_bind_ip,
139 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800140 "bind ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100141 "Bind the MGCP to this local addr")
142{
143 if (g_cfg->source_addr)
144 talloc_free(g_cfg->source_addr);
145 g_cfg->source_addr = talloc_strdup(g_cfg, argv[0]);
146 return CMD_SUCCESS;
147}
148
149DEFUN(cfg_mgcp_bind_port,
150 cfg_mgcp_bind_port_cmd,
151 "bind port <0-65534>",
152 "Bind the MGCP to this port")
153{
154 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100155 g_cfg->source_port = port;
156 return CMD_SUCCESS;
157}
158
159DEFUN(cfg_mgcp_bind_early,
160 cfg_mgcp_bind_early_cmd,
161 "bind early (0|1)",
162 "Bind all RTP ports early")
163{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800164 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
165 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100166}
167
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800168DEFUN(cfg_mgcp_rtp_bts_base_port,
169 cfg_mgcp_rtp_bts_base_port_cmd,
170 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100171 "Base port to use")
172{
173 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +0800174 g_cfg->bts_ports.mode = PORT_ALLOC_STATIC;
175 g_cfg->bts_ports.base_port = port;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100176 return CMD_SUCCESS;
177}
178
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800179DEFUN(cfg_mgcp_rtp_bts_range,
180 cfg_mgcp_rtp_bts_range_cmd,
181 "rtp bts-range <0-65534> <0-65534>",
182 "Range of ports to allocate for endpoints\n"
183 "Start of the range of ports\n" "End of the range of ports\n")
184{
185 g_cfg->bts_ports.mode = PORT_ALLOC_DYNAMIC;
186 g_cfg->bts_ports.range_start = atoi(argv[0]);
187 g_cfg->bts_ports.range_end = atoi(argv[1]);
188 g_cfg->bts_ports.last_port = g_cfg->bts_ports.range_start;
189 return CMD_SUCCESS;
190}
191
192DEFUN(cfg_mgcp_rtp_net_range,
193 cfg_mgcp_rtp_net_range_cmd,
194 "rtp net-range <0-65534> <0-65534>",
195 "Range of ports to allocate for endpoints\n"
196 "Start of the range of ports\n" "End of the range of ports\n")
197{
198 g_cfg->net_ports.mode = PORT_ALLOC_DYNAMIC;
199 g_cfg->net_ports.range_start = atoi(argv[0]);
200 g_cfg->net_ports.range_end = atoi(argv[1]);
201 g_cfg->net_ports.last_port = g_cfg->net_ports.range_start;
202 return CMD_SUCCESS;
203}
204
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800205DEFUN(cfg_mgcp_rtp_net_base_port,
206 cfg_mgcp_rtp_net_base_port_cmd,
207 "rtp net-base <0-65534>",
208 "Base port to use for network port\n" "Port\n")
209{
210 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +0800211 g_cfg->net_ports.mode = PORT_ALLOC_STATIC;
212 g_cfg->net_ports.base_port = port;
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800213 return CMD_SUCCESS;
214}
215
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800216ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
217 "rtp base <0-65534>", "Base port to use")
218
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800219DEFUN(cfg_mgcp_rtp_ip_dscp,
220 cfg_mgcp_rtp_ip_dscp_cmd,
221 "rtp ip-dscp <0-255>",
222 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800223{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800224 int dscp = atoi(argv[0]);
225 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800226 return CMD_SUCCESS;
227}
228
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800229ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
230 "rtp ip-tos <0-255>",
231 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
232
233
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100234DEFUN(cfg_mgcp_sdp_payload_number,
235 cfg_mgcp_sdp_payload_number_cmd,
236 "sdp audio payload number <1-255>",
237 "Set the audio codec to use")
238{
239 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100240 g_cfg->audio_payload = payload;
241 return CMD_SUCCESS;
242}
243
244DEFUN(cfg_mgcp_sdp_payload_name,
245 cfg_mgcp_sdp_payload_name_cmd,
246 "sdp audio payload name NAME",
247 "Set the audio name to use")
248{
249 if (g_cfg->audio_name)
250 talloc_free(g_cfg->audio_name);
251 g_cfg->audio_name = talloc_strdup(g_cfg, argv[0]);
252 return CMD_SUCCESS;
253}
254
255DEFUN(cfg_mgcp_loop,
256 cfg_mgcp_loop_cmd,
257 "loop (0|1)",
258 "Loop the audio")
259{
260 g_cfg->audio_loop = atoi(argv[0]);
261 return CMD_SUCCESS;
262}
263
264DEFUN(cfg_mgcp_number_endp,
265 cfg_mgcp_number_endp_cmd,
266 "number endpoints <0-65534>",
267 "The number of endpoints to allocate. This is not dynamic.")
268{
269 /* + 1 as we start counting at one */
270 g_cfg->number_endpoints = atoi(argv[0]) + 1;
271 return CMD_SUCCESS;
272}
273
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200274DEFUN(cfg_mgcp_agent_addr,
275 cfg_mgcp_agent_addr_cmd,
276 "call agent ip IP",
277 "Set the address of the call agent.")
278{
279 if (g_cfg->call_agent_addr)
280 talloc_free(g_cfg->call_agent_addr);
281 g_cfg->call_agent_addr = talloc_strdup(g_cfg, argv[0]);
282 return CMD_SUCCESS;
283}
284
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800285DEFUN(loop_endp,
286 loop_endp_cmd,
287 "loop-endpoint NAME (0|1)",
288 "Loop a given endpoint\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800289 "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 +0800290{
291 struct mgcp_endpoint *endp;
292
293 int endp_no = strtoul(argv[0], NULL, 16);
294 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
295 vty_out(vty, "Loopback number %s/%d is invalid.%s",
296 argv[0], endp_no, VTY_NEWLINE);
297 return CMD_WARNING;
298 }
299
300
301 endp = &g_cfg->endpoints[endp_no];
302 int loop = atoi(argv[1]);
303
304 if (loop)
305 endp->conn_mode = MGCP_CONN_LOOPBACK;
306 else
307 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000308 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800309
310 return CMD_SUCCESS;
311}
312
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800313DEFUN(tap_call,
314 tap_call_cmd,
315 "tap-call ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
316 "Forward data on endpoint to a different system\n"
317 "The endpoint in hex\n"
318 "Forward the data coming from the bts\n"
319 "Forward the data coming from the bts leaving to the network\n"
320 "Forward the data coming from the net\n"
321 "Forward the data coming from the net leaving to the bts\n"
322 "destination IP of the data\n" "destination port\n")
323{
324 struct mgcp_rtp_tap *tap;
325 struct mgcp_endpoint *endp;
326 int port = 0;
327
328 int endp_no = strtoul(argv[0], NULL, 16);
329 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
330 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
331 argv[0], endp_no, VTY_NEWLINE);
332 return CMD_WARNING;
333 }
334
335 endp = &g_cfg->endpoints[endp_no];
336
337 if (strcmp(argv[1], "bts-in") == 0) {
338 port = MGCP_TAP_BTS_IN;
339 } else if (strcmp(argv[1], "bts-out") == 0) {
340 port = MGCP_TAP_BTS_OUT;
341 } else if (strcmp(argv[1], "net-in") == 0) {
342 port = MGCP_TAP_NET_IN;
343 } else if (strcmp(argv[1], "net-out") == 0) {
344 port = MGCP_TAP_NET_OUT;
345 } else {
346 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
347 return CMD_WARNING;
348 }
349
350 tap = &endp->taps[port];
351 memset(&tap->forward, 0, sizeof(tap->forward));
352 inet_aton(argv[2], &tap->forward.sin_addr);
353 tap->forward.sin_port = htons(atoi(argv[3]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800354 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800355 return CMD_SUCCESS;
356}
357
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800358DEFUN(free_endp, free_endp_cmd,
359 "free-endpoint NUMBER",
360 "Free the given endpoint\n" "Endpoint number in hex.\n")
361{
362 struct mgcp_endpoint *endp;
363
364 int endp_no = strtoul(argv[0], NULL, 16);
365 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
366 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
367 argv[0], endp_no, VTY_NEWLINE);
368 return CMD_WARNING;
369 }
370
371 endp = &g_cfg->endpoints[endp_no];
372 mgcp_free_endp(endp);
373 return CMD_SUCCESS;
374}
375
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100376int mgcp_vty_init(void)
377{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800378 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800379 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800380 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800381 install_element(ENABLE_NODE, &free_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100382
383 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
384 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800385
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100386 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200387 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200388 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100389 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
390 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
391 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
392 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
393 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
394 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800395 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800396 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800397 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
398 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800399 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800400 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100401 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
402 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
403 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
404 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200405 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100406 return 0;
407}
408
409int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
410{
411 int i, rc;
412
413 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200414 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100415 if (rc < 0) {
416 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
417 return rc;
418 }
419
420
421 if (!g_cfg->bts_ip)
422 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
423
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200424 if (!g_cfg->source_addr) {
425 fprintf(stderr, "You need to specify a bind address.\n");
426 return -1;
427 }
428
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100429 if (mgcp_endpoints_allocate(g_cfg) != 0) {
430 fprintf(stderr, "Failed to allocate endpoints: %d. Quitting.\n", g_cfg->number_endpoints);
431 return -1;
432 }
433
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100434 /* early bind */
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800435 for (i = 1; i < g_cfg->number_endpoints; ++i) {
436 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
437 int rtp_port;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100438
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800439 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
440 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
441 g_cfg->bts_ports.base_port);
442 if (mgcp_bind_bts_rtp_port(endp, rtp_port) != 0) {
443 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
444 return -1;
445 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800446 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100447 }
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800448
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800449 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC) {
450 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
451 g_cfg->net_ports.base_port);
452 if (mgcp_bind_net_rtp_port(endp, rtp_port) != 0) {
453 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
454 return -1;
455 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800456 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800457 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100458 }
459
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800460 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100461}
462