blob: b6301d8d95c43f99cfd9bd51eb0df43fe44b9c62 [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
Harald Welte9af6ddf2011-01-01 15:25:50 +010010 * it under the terms of the GNU Affero General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010012 * (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
Harald Welte9af6ddf2011-01-01 15:25:50 +010017 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010018 *
Harald Welte9af6ddf2011-01-01 15:25:50 +010019 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010021 *
22 */
23
24#include <sys/types.h>
25
Holger Hans Peter Freyther1ebad742010-02-26 20:16:37 +010026#include <osmocore/talloc.h>
27
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010028#include <openbsc/debug.h>
29#include <openbsc/mgcp.h>
30#include <openbsc/mgcp_internal.h>
Harald Welte62ab20c2010-05-14 18:59:17 +020031#include <openbsc/vty.h>
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010032
Harald Welte4b037e42010-05-19 19:45:32 +020033#include <osmocom/vty/command.h>
34#include <osmocom/vty/vty.h>
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010035
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020036#include <string.h>
37
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010038static struct mgcp_config *g_cfg = NULL;
39
40/*
41 * vty code for mgcp below
42 */
43struct cmd_node mgcp_node = {
44 MGCP_NODE,
45 "%s(mgcp)#",
46 1,
47};
48
49static int config_write_mgcp(struct vty *vty)
50{
51 vty_out(vty, "mgcp%s", VTY_NEWLINE);
52 if (g_cfg->local_ip)
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020053 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
54 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010055 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
56 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
57 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080058
59 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
60 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 +080061 else
62 vty_out(vty, " rtp bts-range %u %u%s",
63 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
64
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080065 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
66 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 +080067 else
68 vty_out(vty, " rtp net-range %u %u%s",
69 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
70
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +080071 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Holger Hans Peter Freyther2d425052010-04-13 09:28:40 +020072 if (g_cfg->audio_payload != -1)
73 vty_out(vty, " sdp audio payload number %d%s", g_cfg->audio_payload, VTY_NEWLINE);
74 if (g_cfg->audio_name)
75 vty_out(vty, " sdp audio payload name %s%s", g_cfg->audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010076 vty_out(vty, " loop %u%s", !!g_cfg->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020077 vty_out(vty, " number endpoints %u%s", g_cfg->number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +020078 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020079 vty_out(vty, " call agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +080080 if (g_cfg->transcoder_ip)
81 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010082
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +080083 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
84 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
85 else
86 vty_out(vty, " rtp transcoder-range %u %u%s",
87 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +080088 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +080089
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 Freytherbd7b3c52010-11-01 21:04:54 +0100101 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 +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 Freytherbd7b3c52010-11-01 21:04:54 +0100108 endp->trans_net.packets, endp->trans_bts.packets,
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{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200129 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100130 return CMD_SUCCESS;
131}
132
133DEFUN(cfg_mgcp_bts_ip,
134 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800135 "bts ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100136 "Set the IP of the BTS for RTP forwarding")
137{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200138 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100139 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
140 return CMD_SUCCESS;
141}
142
143DEFUN(cfg_mgcp_bind_ip,
144 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800145 "bind ip A.B.C.D",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100146 "Bind the MGCP to this local addr")
147{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200148 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100149 return CMD_SUCCESS;
150}
151
152DEFUN(cfg_mgcp_bind_port,
153 cfg_mgcp_bind_port_cmd,
154 "bind port <0-65534>",
155 "Bind the MGCP to this port")
156{
157 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100158 g_cfg->source_port = port;
159 return CMD_SUCCESS;
160}
161
162DEFUN(cfg_mgcp_bind_early,
163 cfg_mgcp_bind_early_cmd,
164 "bind early (0|1)",
165 "Bind all RTP ports early")
166{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800167 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
168 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100169}
170
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800171static void parse_base(struct mgcp_port_range *range, const char **argv)
172{
173 unsigned int port = atoi(argv[0]);
174 range->mode = PORT_ALLOC_STATIC;
175 range->base_port = port;
176}
177
178static void parse_range(struct mgcp_port_range *range, const char **argv)
179{
180 range->mode = PORT_ALLOC_DYNAMIC;
181 range->range_start = atoi(argv[0]);
182 range->range_end = atoi(argv[1]);
183 range->last_port = g_cfg->bts_ports.range_start;
184}
185
186
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800187DEFUN(cfg_mgcp_rtp_bts_base_port,
188 cfg_mgcp_rtp_bts_base_port_cmd,
189 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100190 "Base port to use")
191{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800192 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100193 return CMD_SUCCESS;
194}
195
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800196DEFUN(cfg_mgcp_rtp_bts_range,
197 cfg_mgcp_rtp_bts_range_cmd,
198 "rtp bts-range <0-65534> <0-65534>",
199 "Range of ports to allocate for endpoints\n"
200 "Start of the range of ports\n" "End of the range of ports\n")
201{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800202 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800203 return CMD_SUCCESS;
204}
205
206DEFUN(cfg_mgcp_rtp_net_range,
207 cfg_mgcp_rtp_net_range_cmd,
208 "rtp net-range <0-65534> <0-65534>",
209 "Range of ports to allocate for endpoints\n"
210 "Start of the range of ports\n" "End of the range of ports\n")
211{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800212 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800213 return CMD_SUCCESS;
214}
215
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800216DEFUN(cfg_mgcp_rtp_net_base_port,
217 cfg_mgcp_rtp_net_base_port_cmd,
218 "rtp net-base <0-65534>",
219 "Base port to use for network port\n" "Port\n")
220{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800221 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800222 return CMD_SUCCESS;
223}
224
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800225ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
226 "rtp base <0-65534>", "Base port to use")
227
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800228DEFUN(cfg_mgcp_rtp_transcoder_range,
229 cfg_mgcp_rtp_transcoder_range_cmd,
230 "rtp transcoder-range <0-65534> <0-65534>",
231 "Range of ports to allocate for the transcoder\n"
232 "Start of the range of ports\n" "End of the range of ports\n")
233{
234 parse_range(&g_cfg->transcoder_ports, argv);
235 return CMD_SUCCESS;
236}
237
238DEFUN(cfg_mgcp_rtp_transcoder_base,
239 cfg_mgcp_rtp_transcoder_base_cmd,
240 "rtp transcoder-base <0-65534>",
241 "Base port for the transcoder range\n" "Port\n")
242{
243 parse_base(&g_cfg->transcoder_ports, argv);
244 return CMD_SUCCESS;
245}
246
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800247DEFUN(cfg_mgcp_rtp_ip_dscp,
248 cfg_mgcp_rtp_ip_dscp_cmd,
249 "rtp ip-dscp <0-255>",
250 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800251{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800252 int dscp = atoi(argv[0]);
253 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800254 return CMD_SUCCESS;
255}
256
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800257ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
258 "rtp ip-tos <0-255>",
259 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
260
261
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100262DEFUN(cfg_mgcp_sdp_payload_number,
263 cfg_mgcp_sdp_payload_number_cmd,
264 "sdp audio payload number <1-255>",
265 "Set the audio codec to use")
266{
267 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100268 g_cfg->audio_payload = payload;
269 return CMD_SUCCESS;
270}
271
272DEFUN(cfg_mgcp_sdp_payload_name,
273 cfg_mgcp_sdp_payload_name_cmd,
274 "sdp audio payload name NAME",
275 "Set the audio name to use")
276{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200277 bsc_replace_string(g_cfg, &g_cfg->audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100278 return CMD_SUCCESS;
279}
280
281DEFUN(cfg_mgcp_loop,
282 cfg_mgcp_loop_cmd,
283 "loop (0|1)",
284 "Loop the audio")
285{
286 g_cfg->audio_loop = atoi(argv[0]);
287 return CMD_SUCCESS;
288}
289
290DEFUN(cfg_mgcp_number_endp,
291 cfg_mgcp_number_endp_cmd,
292 "number endpoints <0-65534>",
293 "The number of endpoints to allocate. This is not dynamic.")
294{
295 /* + 1 as we start counting at one */
296 g_cfg->number_endpoints = atoi(argv[0]) + 1;
297 return CMD_SUCCESS;
298}
299
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200300DEFUN(cfg_mgcp_agent_addr,
301 cfg_mgcp_agent_addr_cmd,
302 "call agent ip IP",
303 "Set the address of the call agent.")
304{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200305 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200306 return CMD_SUCCESS;
307}
308
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800309DEFUN(cfg_mgcp_transcoder,
310 cfg_mgcp_transcoder_cmd,
311 "transcoder-mgw A.B.C.D",
312 "Use a MGW to detranscoder RTP\n"
313 "The IP address of the MGW")
314{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200315 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800316 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
317
318 return CMD_SUCCESS;
319}
320
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100321DEFUN(cfg_mgcp_no_transcoder,
322 cfg_mgcp_no_transcoder_cmd,
323 NO_STR "transcoder-mgw",
324 "Disable the transcoding\n")
325{
326 if (g_cfg->transcoder_ip) {
327 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
328 talloc_free(g_cfg->transcoder_ip);
329 g_cfg->transcoder_ip = NULL;
330 }
331
332 return CMD_SUCCESS;
333}
334
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800335DEFUN(cfg_mgcp_transcoder_remote_base,
336 cfg_mgcp_transcoder_remote_base_cmd,
337 "transcoder-remote-base <0-65534>",
338 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
339{
340 g_cfg->transcoder_remote_base = atoi(argv[0]);
341 return CMD_SUCCESS;
342}
343
344
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800345DEFUN(loop_endp,
346 loop_endp_cmd,
347 "loop-endpoint NAME (0|1)",
348 "Loop a given endpoint\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800349 "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 +0800350{
351 struct mgcp_endpoint *endp;
352
353 int endp_no = strtoul(argv[0], NULL, 16);
354 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
355 vty_out(vty, "Loopback number %s/%d is invalid.%s",
356 argv[0], endp_no, VTY_NEWLINE);
357 return CMD_WARNING;
358 }
359
360
361 endp = &g_cfg->endpoints[endp_no];
362 int loop = atoi(argv[1]);
363
364 if (loop)
365 endp->conn_mode = MGCP_CONN_LOOPBACK;
366 else
367 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000368 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800369
370 return CMD_SUCCESS;
371}
372
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800373DEFUN(tap_call,
374 tap_call_cmd,
375 "tap-call ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
376 "Forward data on endpoint to a different system\n"
377 "The endpoint in hex\n"
378 "Forward the data coming from the bts\n"
379 "Forward the data coming from the bts leaving to the network\n"
380 "Forward the data coming from the net\n"
381 "Forward the data coming from the net leaving to the bts\n"
382 "destination IP of the data\n" "destination port\n")
383{
384 struct mgcp_rtp_tap *tap;
385 struct mgcp_endpoint *endp;
386 int port = 0;
387
388 int endp_no = strtoul(argv[0], NULL, 16);
389 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
390 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
391 argv[0], endp_no, VTY_NEWLINE);
392 return CMD_WARNING;
393 }
394
395 endp = &g_cfg->endpoints[endp_no];
396
397 if (strcmp(argv[1], "bts-in") == 0) {
398 port = MGCP_TAP_BTS_IN;
399 } else if (strcmp(argv[1], "bts-out") == 0) {
400 port = MGCP_TAP_BTS_OUT;
401 } else if (strcmp(argv[1], "net-in") == 0) {
402 port = MGCP_TAP_NET_IN;
403 } else if (strcmp(argv[1], "net-out") == 0) {
404 port = MGCP_TAP_NET_OUT;
405 } else {
406 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
407 return CMD_WARNING;
408 }
409
410 tap = &endp->taps[port];
411 memset(&tap->forward, 0, sizeof(tap->forward));
412 inet_aton(argv[2], &tap->forward.sin_addr);
413 tap->forward.sin_port = htons(atoi(argv[3]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800414 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800415 return CMD_SUCCESS;
416}
417
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800418DEFUN(free_endp, free_endp_cmd,
419 "free-endpoint NUMBER",
420 "Free the given endpoint\n" "Endpoint number in hex.\n")
421{
422 struct mgcp_endpoint *endp;
423
424 int endp_no = strtoul(argv[0], NULL, 16);
425 if (endp_no < 1 || endp_no >= g_cfg->number_endpoints) {
426 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
427 argv[0], endp_no, VTY_NEWLINE);
428 return CMD_WARNING;
429 }
430
431 endp = &g_cfg->endpoints[endp_no];
432 mgcp_free_endp(endp);
433 return CMD_SUCCESS;
434}
435
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100436int mgcp_vty_init(void)
437{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800438 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800439 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800440 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800441 install_element(ENABLE_NODE, &free_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100442
443 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
444 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800445
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100446 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200447 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200448 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100449 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
450 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
451 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
452 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
453 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
454 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800455 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800456 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800457 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
458 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800459 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
460 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800461 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800462 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100463 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
464 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
465 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
466 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200467 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800468 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100469 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800470 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100471 return 0;
472}
473
474int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
475{
476 int i, rc;
477
478 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200479 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100480 if (rc < 0) {
481 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
482 return rc;
483 }
484
485
486 if (!g_cfg->bts_ip)
487 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
488
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200489 if (!g_cfg->source_addr) {
490 fprintf(stderr, "You need to specify a bind address.\n");
491 return -1;
492 }
493
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100494 if (mgcp_endpoints_allocate(g_cfg) != 0) {
495 fprintf(stderr, "Failed to allocate endpoints: %d. Quitting.\n", g_cfg->number_endpoints);
496 return -1;
497 }
498
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100499 /* early bind */
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800500 for (i = 1; i < g_cfg->number_endpoints; ++i) {
501 struct mgcp_endpoint *endp = &g_cfg->endpoints[i];
502 int rtp_port;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100503
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800504 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
505 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
506 g_cfg->bts_ports.base_port);
507 if (mgcp_bind_bts_rtp_port(endp, rtp_port) != 0) {
508 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
509 return -1;
510 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800511 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100512 }
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800513
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800514 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC) {
515 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
516 g_cfg->net_ports.base_port);
517 if (mgcp_bind_net_rtp_port(endp, rtp_port) != 0) {
518 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
519 return -1;
520 }
Holger Hans Peter Freytherf138f912010-08-05 08:08:17 +0800521 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800522 }
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800523
524 if (g_cfg->transcoder_ip && g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100525 /* network side */
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800526 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
527 g_cfg->transcoder_ports.base_port);
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100528 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800529 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
530 return -1;
531 }
Holger Hans Peter Freyther21262332010-11-01 20:53:31 +0100532 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100533
534 /* bts side */
535 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
536 g_cfg->transcoder_ports.base_port);
537 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
538 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
539 return -1;
540 }
541 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800542 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100543 }
544
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800545 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100546}
547