blob: b222f65ded0d48aa3b2a3485dd3b3580516ebdc7 [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
84 return CMD_SUCCESS;
85}
86
87DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
88 SHOW_STR "Display information about the MGCP Media Gateway")
89{
90 int i;
91
92 vty_out(vty, "MGCP is up and running with %u endpoints:%s", g_cfg->number_endpoints - 1, VTY_NEWLINE);
93 for (i = 1; i < g_cfg->number_endpoints; ++i) {
94 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
Holger Hans Peter Freyther1aa42462010-07-29 02:43:14 +080095 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 +010096 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +080097 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
98 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
99 inet_ntoa(endp->bts_end.addr),
100 endp->bts_end.packets, endp->bts_state.lost_no,
101 endp->net_end.packets, endp->net_state.lost_no,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200102 VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100103 }
104
105 return CMD_SUCCESS;
106}
107
108DEFUN(cfg_mgcp,
109 cfg_mgcp_cmd,
110 "mgcp",
111 "Configure the MGCP")
112{
113 vty->node = MGCP_NODE;
114 return CMD_SUCCESS;
115}
116
117DEFUN(cfg_mgcp_local_ip,
118 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800119 "local ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100120 "Set the IP to be used in SDP records")
121{
122 if (g_cfg->local_ip)
123 talloc_free(g_cfg->local_ip);
124 g_cfg->local_ip = talloc_strdup(g_cfg, argv[0]);
125 return CMD_SUCCESS;
126}
127
128DEFUN(cfg_mgcp_bts_ip,
129 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800130 "bts ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100131 "Set the IP of the BTS for RTP forwarding")
132{
133 if (g_cfg->bts_ip)
134 talloc_free(g_cfg->bts_ip);
135 g_cfg->bts_ip = talloc_strdup(g_cfg, argv[0]);
136 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
137 return CMD_SUCCESS;
138}
139
140DEFUN(cfg_mgcp_bind_ip,
141 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800142 "bind ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100143 "Bind the MGCP to this local addr")
144{
145 if (g_cfg->source_addr)
146 talloc_free(g_cfg->source_addr);
147 g_cfg->source_addr = talloc_strdup(g_cfg, argv[0]);
148 return CMD_SUCCESS;
149}
150
151DEFUN(cfg_mgcp_bind_port,
152 cfg_mgcp_bind_port_cmd,
153 "bind port <0-65534>",
154 "Bind the MGCP to this port")
155{
156 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100157 g_cfg->source_port = port;
158 return CMD_SUCCESS;
159}
160
161DEFUN(cfg_mgcp_bind_early,
162 cfg_mgcp_bind_early_cmd,
163 "bind early (0|1)",
164 "Bind all RTP ports early")
165{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800166 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
167 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100168}
169
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800170static void parse_base(struct mgcp_port_range *range, const char **argv)
171{
172 unsigned int port = atoi(argv[0]);
173 range->mode = PORT_ALLOC_STATIC;
174 range->base_port = port;
175}
176
177static void parse_range(struct mgcp_port_range *range, const char **argv)
178{
179 range->mode = PORT_ALLOC_DYNAMIC;
180 range->range_start = atoi(argv[0]);
181 range->range_end = atoi(argv[1]);
182 range->last_port = g_cfg->bts_ports.range_start;
183}
184
185
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800186DEFUN(cfg_mgcp_rtp_bts_base_port,
187 cfg_mgcp_rtp_bts_base_port_cmd,
188 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100189 "Base port to use")
190{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800191 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100192 return CMD_SUCCESS;
193}
194
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800195DEFUN(cfg_mgcp_rtp_bts_range,
196 cfg_mgcp_rtp_bts_range_cmd,
197 "rtp bts-range <0-65534> <0-65534>",
198 "Range of ports to allocate for endpoints\n"
199 "Start of the range of ports\n" "End of the range of ports\n")
200{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800201 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800202 return CMD_SUCCESS;
203}
204
205DEFUN(cfg_mgcp_rtp_net_range,
206 cfg_mgcp_rtp_net_range_cmd,
207 "rtp net-range <0-65534> <0-65534>",
208 "Range of ports to allocate for endpoints\n"
209 "Start of the range of ports\n" "End of the range of ports\n")
210{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800211 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800212 return CMD_SUCCESS;
213}
214
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800215DEFUN(cfg_mgcp_rtp_net_base_port,
216 cfg_mgcp_rtp_net_base_port_cmd,
217 "rtp net-base <0-65534>",
218 "Base port to use for network port\n" "Port\n")
219{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800220 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800221 return CMD_SUCCESS;
222}
223
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800224ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
225 "rtp base <0-65534>", "Base port to use")
226
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800227DEFUN(cfg_mgcp_rtp_ip_dscp,
228 cfg_mgcp_rtp_ip_dscp_cmd,
229 "rtp ip-dscp <0-255>",
230 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800231{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800232 int dscp = atoi(argv[0]);
233 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800234 return CMD_SUCCESS;
235}
236
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800237ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
238 "rtp ip-tos <0-255>",
239 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
240
241
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100242DEFUN(cfg_mgcp_sdp_payload_number,
243 cfg_mgcp_sdp_payload_number_cmd,
244 "sdp audio payload number <1-255>",
245 "Set the audio codec to use")
246{
247 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100248 g_cfg->audio_payload = payload;
249 return CMD_SUCCESS;
250}
251
252DEFUN(cfg_mgcp_sdp_payload_name,
253 cfg_mgcp_sdp_payload_name_cmd,
254 "sdp audio payload name NAME",
255 "Set the audio name to use")
256{
257 if (g_cfg->audio_name)
258 talloc_free(g_cfg->audio_name);
259 g_cfg->audio_name = talloc_strdup(g_cfg, argv[0]);
260 return CMD_SUCCESS;
261}
262
263DEFUN(cfg_mgcp_loop,
264 cfg_mgcp_loop_cmd,
265 "loop (0|1)",
266 "Loop the audio")
267{
268 g_cfg->audio_loop = atoi(argv[0]);
269 return CMD_SUCCESS;
270}
271
272DEFUN(cfg_mgcp_number_endp,
273 cfg_mgcp_number_endp_cmd,
274 "number endpoints <0-65534>",
275 "The number of endpoints to allocate. This is not dynamic.")
276{
277 /* + 1 as we start counting at one */
278 g_cfg->number_endpoints = atoi(argv[0]) + 1;
279 return CMD_SUCCESS;
280}
281
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200282DEFUN(cfg_mgcp_agent_addr,
283 cfg_mgcp_agent_addr_cmd,
284 "call agent ip IP",
285 "Set the address of the call agent.")
286{
287 if (g_cfg->call_agent_addr)
288 talloc_free(g_cfg->call_agent_addr);
289 g_cfg->call_agent_addr = talloc_strdup(g_cfg, argv[0]);
290 return CMD_SUCCESS;
291}
292
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800293DEFUN(cfg_mgcp_transcoder,
294 cfg_mgcp_transcoder_cmd,
295 "transcoder-mgw A.B.C.D",
296 "Use a MGW to detranscoder RTP\n"
297 "The IP address of the MGW")
298{
299 if (g_cfg->transcoder_ip)
300 talloc_free(g_cfg->transcoder_ip);
301 g_cfg->transcoder_ip = talloc_strdup(g_cfg, argv[0]);
302 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
303
304 return CMD_SUCCESS;
305}
306
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800307DEFUN(loop_endp,
308 loop_endp_cmd,
309 "loop-endpoint NAME (0|1)",
310 "Loop a given endpoint\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800311 "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 +0800312{
313 struct mgcp_endpoint *endp;
314
315 int endp_no = strtoul(argv[0], NULL, 16);
316 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
317 vty_out(vty, "Loopback number %s/%d is invalid.%s",
318 argv[0], endp_no, VTY_NEWLINE);
319 return CMD_WARNING;
320 }
321
322
323 endp = &g_cfg->endpoints[endp_no];
324 int loop = atoi(argv[1]);
325
326 if (loop)
327 endp->conn_mode = MGCP_CONN_LOOPBACK;
328 else
329 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000330 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800331
332 return CMD_SUCCESS;
333}
334
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800335DEFUN(tap_call,
336 tap_call_cmd,
337 "tap-call ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
338 "Forward data on endpoint to a different system\n"
339 "The endpoint in hex\n"
340 "Forward the data coming from the bts\n"
341 "Forward the data coming from the bts leaving to the network\n"
342 "Forward the data coming from the net\n"
343 "Forward the data coming from the net leaving to the bts\n"
344 "destination IP of the data\n" "destination port\n")
345{
346 struct mgcp_rtp_tap *tap;
347 struct mgcp_endpoint *endp;
348 int port = 0;
349
350 int endp_no = strtoul(argv[0], NULL, 16);
351 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
352 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
353 argv[0], endp_no, VTY_NEWLINE);
354 return CMD_WARNING;
355 }
356
357 endp = &g_cfg->endpoints[endp_no];
358
359 if (strcmp(argv[1], "bts-in") == 0) {
360 port = MGCP_TAP_BTS_IN;
361 } else if (strcmp(argv[1], "bts-out") == 0) {
362 port = MGCP_TAP_BTS_OUT;
363 } else if (strcmp(argv[1], "net-in") == 0) {
364 port = MGCP_TAP_NET_IN;
365 } else if (strcmp(argv[1], "net-out") == 0) {
366 port = MGCP_TAP_NET_OUT;
367 } else {
368 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
369 return CMD_WARNING;
370 }
371
372 tap = &endp->taps[port];
373 memset(&tap->forward, 0, sizeof(tap->forward));
374 inet_aton(argv[2], &tap->forward.sin_addr);
375 tap->forward.sin_port = htons(atoi(argv[3]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800376 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800377 return CMD_SUCCESS;
378}
379
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800380DEFUN(free_endp, free_endp_cmd,
381 "free-endpoint NUMBER",
382 "Free the given endpoint\n" "Endpoint number in hex.\n")
383{
384 struct mgcp_endpoint *endp;
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 mgcp_free_endp(endp);
395 return CMD_SUCCESS;
396}
397
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100398int mgcp_vty_init(void)
399{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800400 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800401 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800402 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800403 install_element(ENABLE_NODE, &free_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100404
405 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
406 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800407
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100408 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200409 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200410 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100411 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
412 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
413 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
414 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
415 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
416 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800417 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800418 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800419 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
420 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800421 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800422 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100423 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
424 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
425 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
426 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200427 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800428 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100429 return 0;
430}
431
432int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
433{
434 int i, rc;
435
436 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200437 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100438 if (rc < 0) {
439 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
440 return rc;
441 }
442
443
444 if (!g_cfg->bts_ip)
445 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
446
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200447 if (!g_cfg->source_addr) {
448 fprintf(stderr, "You need to specify a bind address.\n");
449 return -1;
450 }
451
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100452 if (mgcp_endpoints_allocate(g_cfg) != 0) {
453 fprintf(stderr, "Failed to allocate endpoints: %d. Quitting.\n", g_cfg->number_endpoints);
454 return -1;
455 }
456
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100457 /* early bind */
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800458 for (i = 1; i < g_cfg->number_endpoints; ++i) {
459 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
460 int rtp_port;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100461
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800462 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
463 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
464 g_cfg->bts_ports.base_port);
465 if (mgcp_bind_bts_rtp_port(endp, rtp_port) != 0) {
466 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
467 return -1;
468 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800469 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100470 }
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800471
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800472 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC) {
473 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
474 g_cfg->net_ports.base_port);
475 if (mgcp_bind_net_rtp_port(endp, rtp_port) != 0) {
476 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
477 return -1;
478 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800479 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800480 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100481 }
482
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800483 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100484}
485