blob: b6301d8d95c43f99cfd9bd51eb0df43fe44b9c62 [file] [log] [blame]
Holger Hans Peter Freyther6f38c062010-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 Welte0e3e88e2011-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 Freyther6f38c062010-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 Welte0e3e88e2011-01-01 15:25:50 +010017 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010018 *
Harald Welte0e3e88e2011-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 Freyther6f38c062010-02-20 21:21:02 +010021 *
22 */
23
24#include <sys/types.h>
25
Holger Hans Peter Freytherf41fb1f2010-02-26 20:16:37 +010026#include <osmocore/talloc.h>
27
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010028#include <openbsc/debug.h>
29#include <openbsc/mgcp.h>
30#include <openbsc/mgcp_internal.h>
Harald Welte58ed1cb2010-05-14 18:59:17 +020031#include <openbsc/vty.h>
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010032
Harald Weltebd9591f2010-05-19 19:45:32 +020033#include <osmocom/vty/command.h>
34#include <osmocom/vty/vty.h>
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010035
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020036#include <string.h>
37
Holger Hans Peter Freyther6f38c062010-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 Freythere8d13712010-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 Freyther6f38c062010-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 Freyther2ea91182010-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 Freytherf3307292010-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 Freyther2ea91182010-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 Freytherf3307292010-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 Freyther3140c4f2010-07-27 20:34:45 +080071 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Holger Hans Peter Freytherf89a9882010-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 Freyther6f38c062010-02-20 21:21:02 +010076 vty_out(vty, " loop %u%s", !!g_cfg->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020077 vty_out(vty, " number endpoints %u%s", g_cfg->number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +020078 if (g_cfg->call_agent_addr)
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020079 vty_out(vty, " call agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythercab38342010-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 Freyther6f38c062010-02-20 21:21:02 +010082
Holger Hans Peter Freyther39f2f6d2010-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 Freytherd582b202010-09-19 04:21:39 +080088 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +080089
Holger Hans Peter Freyther6f38c062010-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 Freytherc983f832010-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 Freyther6f38c062010-02-20 21:21:02 +0100102 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-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 Freytherc983f832010-11-01 21:04:54 +0100108 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200109 VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-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 Freyther5c9a6452010-05-14 02:27:50 +0800126 "local ip A.B.C.D",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100127 "Set the IP to be used in SDP records")
128{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200129 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-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 Freyther5c9a6452010-05-14 02:27:50 +0800135 "bts ip A.B.C.D",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100136 "Set the IP of the BTS for RTP forwarding")
137{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200138 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-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 Freyther5c9a6452010-05-14 02:27:50 +0800145 "bind ip A.B.C.D",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100146 "Bind the MGCP to this local addr")
147{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200148 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-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 Freyther6f38c062010-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 Freyther7140dae2010-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 Freyther6f38c062010-02-20 21:21:02 +0100169}
170
Holger Hans Peter Freytherd3b7d772010-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 Freytheree4657c2010-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 Freyther6f38c062010-02-20 21:21:02 +0100190 "Base port to use")
191{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800192 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100193 return CMD_SUCCESS;
194}
195
Holger Hans Peter Freytherf3307292010-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 Freytherd3b7d772010-09-17 23:34:36 +0800202 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-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 Freytherd3b7d772010-09-17 23:34:36 +0800212 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800213 return CMD_SUCCESS;
214}
215
Holger Hans Peter Freyther81938e92010-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 Freytherd3b7d772010-09-17 23:34:36 +0800221 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800222 return CMD_SUCCESS;
223}
224
Holger Hans Peter Freytheree4657c2010-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 Freyther39f2f6d2010-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 Freyther3140c4f2010-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 Freyther489d0a62010-05-31 10:22:00 +0800251{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800252 int dscp = atoi(argv[0]);
253 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800254 return CMD_SUCCESS;
255}
256
Holger Hans Peter Freyther3140c4f2010-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 Freyther6f38c062010-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 Freyther6f38c062010-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 Freyther7c831f62010-10-12 23:21:54 +0200277 bsc_replace_string(g_cfg, &g_cfg->audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-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 Freyther19ff6792010-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 Freyther7c831f62010-10-12 23:21:54 +0200305 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200306 return CMD_SUCCESS;
307}
308
Holger Hans Peter Freythercab38342010-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 Freyther7c831f62010-10-12 23:21:54 +0200315 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-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 Freythered1a5a52010-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 Freytherd582b202010-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 Freytherb33ded12010-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 Freyther84d88992010-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 Freytherb33ded12010-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 Freyther73aa5142010-08-05 12:07:00 +0000368 endp->allow_patch = 1;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800369
370 return CMD_SUCCESS;
371}
372
Holger Hans Peter Freyther8fdb95e2010-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 Freyther079f0332010-08-06 02:05:15 +0800414 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800415 return CMD_SUCCESS;
416}
417
Holger Hans Peter Freyther175b9a12010-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 Freyther6f38c062010-02-20 21:21:02 +0100436int mgcp_vty_init(void)
437{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +0800438 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800439 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800440 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800441 install_element(ENABLE_NODE, &free_endp_cmd);
Holger Hans Peter Freyther6f38c062010-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 Freytherb33ded12010-08-03 02:57:02 +0800445
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100446 install_default(MGCP_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +0200447 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +0200448 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther6f38c062010-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 Freytheree4657c2010-08-05 03:46:07 +0800455 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800456 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-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 Freyther39f2f6d2010-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 Freyther3140c4f2010-07-27 20:34:45 +0800461 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800462 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther6f38c062010-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 Freyther19ff6792010-03-31 11:46:41 +0200467 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800468 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100469 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800470 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther6f38c062010-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 Welte40152872010-05-16 20:52:23 +0200479 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-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 Freytherbdd3cc32010-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 Freyther6f38c062010-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 Freyther6f38c062010-02-20 21:21:02 +0100499 /* early bind */
Holger Hans Peter Freyther7140dae2010-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 Freyther6f38c062010-02-20 21:21:02 +0100503
Holger Hans Peter Freytherf3307292010-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 Freyther05d8f5f2010-08-05 08:08:17 +0800511 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100512 }
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800513
Holger Hans Peter Freytherf3307292010-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 Freyther05d8f5f2010-08-05 08:08:17 +0800521 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800522 }
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +0800523
524 if (g_cfg->transcoder_ip && g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100525 /* network side */
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +0800526 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
527 g_cfg->transcoder_ports.base_port);
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100528 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +0800529 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
530 return -1;
531 }
Holger Hans Peter Freytherb6345ab2010-11-01 20:53:31 +0100532 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freytherc983f832010-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 Freyther56ac2692010-09-18 02:30:02 +0800542 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100543 }
544
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +0800545 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100546}
547