blob: b47470dd0a8334a0454fe76a54dc1e79489981f1 [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 Freytherbd7b3c52010-11-01 21:04:54 +0100102 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/%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 Freytherbd7b3c52010-11-01 21:04:54 +0100109 endp->trans_net.packets, endp->trans_bts.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{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200130 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100131 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{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200139 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100140 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
141 return CMD_SUCCESS;
142}
143
144DEFUN(cfg_mgcp_bind_ip,
145 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800146 "bind ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100147 "Bind the MGCP to this local addr")
148{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200149 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100150 return CMD_SUCCESS;
151}
152
153DEFUN(cfg_mgcp_bind_port,
154 cfg_mgcp_bind_port_cmd,
155 "bind port <0-65534>",
156 "Bind the MGCP to this port")
157{
158 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100159 g_cfg->source_port = port;
160 return CMD_SUCCESS;
161}
162
163DEFUN(cfg_mgcp_bind_early,
164 cfg_mgcp_bind_early_cmd,
165 "bind early (0|1)",
166 "Bind all RTP ports early")
167{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800168 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
169 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100170}
171
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800172static void parse_base(struct mgcp_port_range *range, const char **argv)
173{
174 unsigned int port = atoi(argv[0]);
175 range->mode = PORT_ALLOC_STATIC;
176 range->base_port = port;
177}
178
179static void parse_range(struct mgcp_port_range *range, const char **argv)
180{
181 range->mode = PORT_ALLOC_DYNAMIC;
182 range->range_start = atoi(argv[0]);
183 range->range_end = atoi(argv[1]);
184 range->last_port = g_cfg->bts_ports.range_start;
185}
186
187
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800188DEFUN(cfg_mgcp_rtp_bts_base_port,
189 cfg_mgcp_rtp_bts_base_port_cmd,
190 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100191 "Base port to use")
192{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800193 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100194 return CMD_SUCCESS;
195}
196
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800197DEFUN(cfg_mgcp_rtp_bts_range,
198 cfg_mgcp_rtp_bts_range_cmd,
199 "rtp bts-range <0-65534> <0-65534>",
200 "Range of ports to allocate for endpoints\n"
201 "Start of the range of ports\n" "End of the range of ports\n")
202{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800203 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800204 return CMD_SUCCESS;
205}
206
207DEFUN(cfg_mgcp_rtp_net_range,
208 cfg_mgcp_rtp_net_range_cmd,
209 "rtp net-range <0-65534> <0-65534>",
210 "Range of ports to allocate for endpoints\n"
211 "Start of the range of ports\n" "End of the range of ports\n")
212{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800213 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800214 return CMD_SUCCESS;
215}
216
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800217DEFUN(cfg_mgcp_rtp_net_base_port,
218 cfg_mgcp_rtp_net_base_port_cmd,
219 "rtp net-base <0-65534>",
220 "Base port to use for network port\n" "Port\n")
221{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800222 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800223 return CMD_SUCCESS;
224}
225
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800226ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
227 "rtp base <0-65534>", "Base port to use")
228
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800229DEFUN(cfg_mgcp_rtp_transcoder_range,
230 cfg_mgcp_rtp_transcoder_range_cmd,
231 "rtp transcoder-range <0-65534> <0-65534>",
232 "Range of ports to allocate for the transcoder\n"
233 "Start of the range of ports\n" "End of the range of ports\n")
234{
235 parse_range(&g_cfg->transcoder_ports, argv);
236 return CMD_SUCCESS;
237}
238
239DEFUN(cfg_mgcp_rtp_transcoder_base,
240 cfg_mgcp_rtp_transcoder_base_cmd,
241 "rtp transcoder-base <0-65534>",
242 "Base port for the transcoder range\n" "Port\n")
243{
244 parse_base(&g_cfg->transcoder_ports, argv);
245 return CMD_SUCCESS;
246}
247
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800248DEFUN(cfg_mgcp_rtp_ip_dscp,
249 cfg_mgcp_rtp_ip_dscp_cmd,
250 "rtp ip-dscp <0-255>",
251 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800252{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800253 int dscp = atoi(argv[0]);
254 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800255 return CMD_SUCCESS;
256}
257
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800258ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
259 "rtp ip-tos <0-255>",
260 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
261
262
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100263DEFUN(cfg_mgcp_sdp_payload_number,
264 cfg_mgcp_sdp_payload_number_cmd,
265 "sdp audio payload number <1-255>",
266 "Set the audio codec to use")
267{
268 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100269 g_cfg->audio_payload = payload;
270 return CMD_SUCCESS;
271}
272
273DEFUN(cfg_mgcp_sdp_payload_name,
274 cfg_mgcp_sdp_payload_name_cmd,
275 "sdp audio payload name NAME",
276 "Set the audio name to use")
277{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200278 bsc_replace_string(g_cfg, &g_cfg->audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100279 return CMD_SUCCESS;
280}
281
282DEFUN(cfg_mgcp_loop,
283 cfg_mgcp_loop_cmd,
284 "loop (0|1)",
285 "Loop the audio")
286{
287 g_cfg->audio_loop = atoi(argv[0]);
288 return CMD_SUCCESS;
289}
290
291DEFUN(cfg_mgcp_number_endp,
292 cfg_mgcp_number_endp_cmd,
293 "number endpoints <0-65534>",
294 "The number of endpoints to allocate. This is not dynamic.")
295{
296 /* + 1 as we start counting at one */
297 g_cfg->number_endpoints = atoi(argv[0]) + 1;
298 return CMD_SUCCESS;
299}
300
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200301DEFUN(cfg_mgcp_agent_addr,
302 cfg_mgcp_agent_addr_cmd,
303 "call agent ip IP",
304 "Set the address of the call agent.")
305{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200306 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200307 return CMD_SUCCESS;
308}
309
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800310DEFUN(cfg_mgcp_transcoder,
311 cfg_mgcp_transcoder_cmd,
312 "transcoder-mgw A.B.C.D",
313 "Use a MGW to detranscoder RTP\n"
314 "The IP address of the MGW")
315{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200316 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800317 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
318
319 return CMD_SUCCESS;
320}
321
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100322DEFUN(cfg_mgcp_no_transcoder,
323 cfg_mgcp_no_transcoder_cmd,
324 NO_STR "transcoder-mgw",
325 "Disable the transcoding\n")
326{
327 if (g_cfg->transcoder_ip) {
328 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
329 talloc_free(g_cfg->transcoder_ip);
330 g_cfg->transcoder_ip = NULL;
331 }
332
333 return CMD_SUCCESS;
334}
335
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800336DEFUN(cfg_mgcp_transcoder_remote_base,
337 cfg_mgcp_transcoder_remote_base_cmd,
338 "transcoder-remote-base <0-65534>",
339 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
340{
341 g_cfg->transcoder_remote_base = atoi(argv[0]);
342 return CMD_SUCCESS;
343}
344
345
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800346DEFUN(loop_endp,
347 loop_endp_cmd,
348 "loop-endpoint NAME (0|1)",
349 "Loop a given endpoint\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800350 "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 +0800351{
352 struct mgcp_endpoint *endp;
353
354 int endp_no = strtoul(argv[0], NULL, 16);
355 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
356 vty_out(vty, "Loopback number %s/%d is invalid.%s",
357 argv[0], endp_no, VTY_NEWLINE);
358 return CMD_WARNING;
359 }
360
361
362 endp = &g_cfg->endpoints[endp_no];
363 int loop = atoi(argv[1]);
364
365 if (loop)
366 endp->conn_mode = MGCP_CONN_LOOPBACK;
367 else
368 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000369 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800370
371 return CMD_SUCCESS;
372}
373
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800374DEFUN(tap_call,
375 tap_call_cmd,
376 "tap-call ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
377 "Forward data on endpoint to a different system\n"
378 "The endpoint in hex\n"
379 "Forward the data coming from the bts\n"
380 "Forward the data coming from the bts leaving to the network\n"
381 "Forward the data coming from the net\n"
382 "Forward the data coming from the net leaving to the bts\n"
383 "destination IP of the data\n" "destination port\n")
384{
385 struct mgcp_rtp_tap *tap;
386 struct mgcp_endpoint *endp;
387 int port = 0;
388
389 int endp_no = strtoul(argv[0], NULL, 16);
390 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
391 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
392 argv[0], endp_no, VTY_NEWLINE);
393 return CMD_WARNING;
394 }
395
396 endp = &g_cfg->endpoints[endp_no];
397
398 if (strcmp(argv[1], "bts-in") == 0) {
399 port = MGCP_TAP_BTS_IN;
400 } else if (strcmp(argv[1], "bts-out") == 0) {
401 port = MGCP_TAP_BTS_OUT;
402 } else if (strcmp(argv[1], "net-in") == 0) {
403 port = MGCP_TAP_NET_IN;
404 } else if (strcmp(argv[1], "net-out") == 0) {
405 port = MGCP_TAP_NET_OUT;
406 } else {
407 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
408 return CMD_WARNING;
409 }
410
411 tap = &endp->taps[port];
412 memset(&tap->forward, 0, sizeof(tap->forward));
413 inet_aton(argv[2], &tap->forward.sin_addr);
414 tap->forward.sin_port = htons(atoi(argv[3]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800415 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800416 return CMD_SUCCESS;
417}
418
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800419DEFUN(free_endp, free_endp_cmd,
420 "free-endpoint NUMBER",
421 "Free the given endpoint\n" "Endpoint number in hex.\n")
422{
423 struct mgcp_endpoint *endp;
424
425 int endp_no = strtoul(argv[0], NULL, 16);
426 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
427 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
428 argv[0], endp_no, VTY_NEWLINE);
429 return CMD_WARNING;
430 }
431
432 endp = &g_cfg->endpoints[endp_no];
433 mgcp_free_endp(endp);
434 return CMD_SUCCESS;
435}
436
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100437int mgcp_vty_init(void)
438{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800439 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800440 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800441 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800442 install_element(ENABLE_NODE, &free_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100443
444 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
445 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800446
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100447 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200448 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200449 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100450 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
451 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
452 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
453 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
454 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
455 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800456 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800457 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800458 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
459 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800460 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
461 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800462 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800463 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100464 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
465 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
466 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
467 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200468 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800469 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100470 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800471 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100472 return 0;
473}
474
475int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
476{
477 int i, rc;
478
479 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200480 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100481 if (rc < 0) {
482 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
483 return rc;
484 }
485
486
487 if (!g_cfg->bts_ip)
488 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
489
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200490 if (!g_cfg->source_addr) {
491 fprintf(stderr, "You need to specify a bind address.\n");
492 return -1;
493 }
494
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100495 if (mgcp_endpoints_allocate(g_cfg) != 0) {
496 fprintf(stderr, "Failed to allocate endpoints: %d. Quitting.\n", g_cfg->number_endpoints);
497 return -1;
498 }
499
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100500 /* early bind */
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800501 for (i = 1; i < g_cfg->number_endpoints; ++i) {
502 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
503 int rtp_port;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100504
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800505 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
506 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
507 g_cfg->bts_ports.base_port);
508 if (mgcp_bind_bts_rtp_port(endp, rtp_port) != 0) {
509 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
510 return -1;
511 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800512 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100513 }
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800514
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800515 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC) {
516 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
517 g_cfg->net_ports.base_port);
518 if (mgcp_bind_net_rtp_port(endp, rtp_port) != 0) {
519 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
520 return -1;
521 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800522 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800523 }
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800524
525 if (g_cfg->transcoder_ip && g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100526 /* network side */
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800527 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
528 g_cfg->transcoder_ports.base_port);
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100529 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800530 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
531 return -1;
532 }
Holger Hans Peter Freyther21262332010-11-01 20:53:31 +0100533 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100534
535 /* bts side */
536 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
537 g_cfg->transcoder_ports.base_port);
538 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
539 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
540 return -1;
541 }
542 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800543 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100544 }
545
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800546 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100547}
548