blob: b9e20e785647158e3a8a16f99601dcd8cd6060e0 [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/*
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +01005 * (C) 2009-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
6 * (C) 2009-2011 by On-Waves
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01007 * 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 Freytherab56ce12011-02-28 00:56:17 +010072 if (g_cfg->trunk.audio_payload != -1)
73 vty_out(vty, " sdp audio payload number %d%s",
74 g_cfg->trunk.audio_payload, VTY_NEWLINE);
75 if (g_cfg->trunk.audio_name)
76 vty_out(vty, " sdp audio payload name %s%s",
77 g_cfg->trunk.audio_name, VTY_NEWLINE);
78 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
79 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +020080 if (g_cfg->call_agent_addr)
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020081 vty_out(vty, " call agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +080082 if (g_cfg->transcoder_ip)
83 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010084
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +080085 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
86 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
87 else
88 vty_out(vty, " rtp transcoder-range %u %u%s",
89 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +080090 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +080091
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010092 return CMD_SUCCESS;
93}
94
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +010095static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010096{
97 int i;
98
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +010099 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
100 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
101 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
102
103 for (i = 1; i < cfg->number_endpoints; ++i) {
104 struct mgcp_endpoint *endp = &cfg->endpoints[i];
105 vty_out(vty,
106 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
107 "traffic received bts: %u/%u remote: %u/%u transcoder: %u/%u%s",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100108 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-08-05 01:34:51 +0800109 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
110 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
111 inet_ntoa(endp->bts_end.addr),
112 endp->bts_end.packets, endp->bts_state.lost_no,
113 endp->net_end.packets, endp->net_state.lost_no,
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100114 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200115 VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100116 }
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100117}
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100118
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100119DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
120 SHOW_STR "Display information about the MGCP Media Gateway")
121{
122 dump_trunk(vty, &g_cfg->trunk);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100123 return CMD_SUCCESS;
124}
125
126DEFUN(cfg_mgcp,
127 cfg_mgcp_cmd,
128 "mgcp",
129 "Configure the MGCP")
130{
131 vty->node = MGCP_NODE;
132 return CMD_SUCCESS;
133}
134
135DEFUN(cfg_mgcp_local_ip,
136 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800137 "local ip A.B.C.D",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100138 "Set the IP to be used in SDP records")
139{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200140 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100141 return CMD_SUCCESS;
142}
143
144DEFUN(cfg_mgcp_bts_ip,
145 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800146 "bts ip A.B.C.D",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100147 "Set the IP of the BTS for RTP forwarding")
148{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200149 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100150 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
151 return CMD_SUCCESS;
152}
153
154DEFUN(cfg_mgcp_bind_ip,
155 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800156 "bind ip A.B.C.D",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100157 "Bind the MGCP to this local addr")
158{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200159 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100160 return CMD_SUCCESS;
161}
162
163DEFUN(cfg_mgcp_bind_port,
164 cfg_mgcp_bind_port_cmd,
165 "bind port <0-65534>",
166 "Bind the MGCP to this port")
167{
168 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100169 g_cfg->source_port = port;
170 return CMD_SUCCESS;
171}
172
173DEFUN(cfg_mgcp_bind_early,
174 cfg_mgcp_bind_early_cmd,
175 "bind early (0|1)",
176 "Bind all RTP ports early")
177{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800178 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
179 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100180}
181
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800182static void parse_base(struct mgcp_port_range *range, const char **argv)
183{
184 unsigned int port = atoi(argv[0]);
185 range->mode = PORT_ALLOC_STATIC;
186 range->base_port = port;
187}
188
189static void parse_range(struct mgcp_port_range *range, const char **argv)
190{
191 range->mode = PORT_ALLOC_DYNAMIC;
192 range->range_start = atoi(argv[0]);
193 range->range_end = atoi(argv[1]);
194 range->last_port = g_cfg->bts_ports.range_start;
195}
196
197
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800198DEFUN(cfg_mgcp_rtp_bts_base_port,
199 cfg_mgcp_rtp_bts_base_port_cmd,
200 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100201 "Base port to use")
202{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800203 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100204 return CMD_SUCCESS;
205}
206
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800207DEFUN(cfg_mgcp_rtp_bts_range,
208 cfg_mgcp_rtp_bts_range_cmd,
209 "rtp bts-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 Freytherd3b7d772010-09-17 23:34:36 +0800213 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800214 return CMD_SUCCESS;
215}
216
217DEFUN(cfg_mgcp_rtp_net_range,
218 cfg_mgcp_rtp_net_range_cmd,
219 "rtp net-range <0-65534> <0-65534>",
220 "Range of ports to allocate for endpoints\n"
221 "Start of the range of ports\n" "End of the range of ports\n")
222{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800223 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800224 return CMD_SUCCESS;
225}
226
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800227DEFUN(cfg_mgcp_rtp_net_base_port,
228 cfg_mgcp_rtp_net_base_port_cmd,
229 "rtp net-base <0-65534>",
230 "Base port to use for network port\n" "Port\n")
231{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800232 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800233 return CMD_SUCCESS;
234}
235
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800236ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
237 "rtp base <0-65534>", "Base port to use")
238
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800239DEFUN(cfg_mgcp_rtp_transcoder_range,
240 cfg_mgcp_rtp_transcoder_range_cmd,
241 "rtp transcoder-range <0-65534> <0-65534>",
242 "Range of ports to allocate for the transcoder\n"
243 "Start of the range of ports\n" "End of the range of ports\n")
244{
245 parse_range(&g_cfg->transcoder_ports, argv);
246 return CMD_SUCCESS;
247}
248
249DEFUN(cfg_mgcp_rtp_transcoder_base,
250 cfg_mgcp_rtp_transcoder_base_cmd,
251 "rtp transcoder-base <0-65534>",
252 "Base port for the transcoder range\n" "Port\n")
253{
254 parse_base(&g_cfg->transcoder_ports, argv);
255 return CMD_SUCCESS;
256}
257
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800258DEFUN(cfg_mgcp_rtp_ip_dscp,
259 cfg_mgcp_rtp_ip_dscp_cmd,
260 "rtp ip-dscp <0-255>",
261 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800262{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800263 int dscp = atoi(argv[0]);
264 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800265 return CMD_SUCCESS;
266}
267
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800268ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
269 "rtp ip-tos <0-255>",
270 "Set the IP_TOS socket attribute on the RTP/RTCP sockets.\n" "The DSCP value.")
271
272
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100273DEFUN(cfg_mgcp_sdp_payload_number,
274 cfg_mgcp_sdp_payload_number_cmd,
275 "sdp audio payload number <1-255>",
276 "Set the audio codec to use")
277{
278 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100279 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100280 return CMD_SUCCESS;
281}
282
283DEFUN(cfg_mgcp_sdp_payload_name,
284 cfg_mgcp_sdp_payload_name_cmd,
285 "sdp audio payload name NAME",
286 "Set the audio name to use")
287{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100288 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100289 return CMD_SUCCESS;
290}
291
292DEFUN(cfg_mgcp_loop,
293 cfg_mgcp_loop_cmd,
294 "loop (0|1)",
295 "Loop the audio")
296{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100297 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100298 return CMD_SUCCESS;
299}
300
301DEFUN(cfg_mgcp_number_endp,
302 cfg_mgcp_number_endp_cmd,
303 "number endpoints <0-65534>",
304 "The number of endpoints to allocate. This is not dynamic.")
305{
306 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100307 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100308 return CMD_SUCCESS;
309}
310
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200311DEFUN(cfg_mgcp_agent_addr,
312 cfg_mgcp_agent_addr_cmd,
313 "call agent ip IP",
314 "Set the address of the call agent.")
315{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200316 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200317 return CMD_SUCCESS;
318}
319
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800320DEFUN(cfg_mgcp_transcoder,
321 cfg_mgcp_transcoder_cmd,
322 "transcoder-mgw A.B.C.D",
323 "Use a MGW to detranscoder RTP\n"
324 "The IP address of the MGW")
325{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200326 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800327 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
328
329 return CMD_SUCCESS;
330}
331
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100332DEFUN(cfg_mgcp_no_transcoder,
333 cfg_mgcp_no_transcoder_cmd,
334 NO_STR "transcoder-mgw",
335 "Disable the transcoding\n")
336{
337 if (g_cfg->transcoder_ip) {
338 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
339 talloc_free(g_cfg->transcoder_ip);
340 g_cfg->transcoder_ip = NULL;
341 }
342
343 return CMD_SUCCESS;
344}
345
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800346DEFUN(cfg_mgcp_transcoder_remote_base,
347 cfg_mgcp_transcoder_remote_base_cmd,
348 "transcoder-remote-base <0-65534>",
349 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
350{
351 g_cfg->transcoder_remote_base = atoi(argv[0]);
352 return CMD_SUCCESS;
353}
354
355
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800356DEFUN(loop_endp,
357 loop_endp_cmd,
358 "loop-endpoint NAME (0|1)",
359 "Loop a given endpoint\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +0800360 "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 +0800361{
362 struct mgcp_endpoint *endp;
363
364 int endp_no = strtoul(argv[0], NULL, 16);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100365 if (endp_no < 1 || endp_no >= g_cfg->trunk.number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800366 vty_out(vty, "Loopback number %s/%d is invalid.%s",
367 argv[0], endp_no, VTY_NEWLINE);
368 return CMD_WARNING;
369 }
370
371
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100372 endp = &g_cfg->trunk.endpoints[endp_no];
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800373 int loop = atoi(argv[1]);
374
375 if (loop)
376 endp->conn_mode = MGCP_CONN_LOOPBACK;
377 else
378 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther73aa5142010-08-05 12:07:00 +0000379 endp->allow_patch = 1;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800380
381 return CMD_SUCCESS;
382}
383
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800384DEFUN(tap_call,
385 tap_call_cmd,
386 "tap-call ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
387 "Forward data on endpoint to a different system\n"
388 "The endpoint in hex\n"
389 "Forward the data coming from the bts\n"
390 "Forward the data coming from the bts leaving to the network\n"
391 "Forward the data coming from the net\n"
392 "Forward the data coming from the net leaving to the bts\n"
393 "destination IP of the data\n" "destination port\n")
394{
395 struct mgcp_rtp_tap *tap;
396 struct mgcp_endpoint *endp;
397 int port = 0;
398
399 int endp_no = strtoul(argv[0], NULL, 16);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100400 if (endp_no < 1 || endp_no >= g_cfg->trunk.number_endpoints) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800401 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
402 argv[0], endp_no, VTY_NEWLINE);
403 return CMD_WARNING;
404 }
405
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100406 endp = &g_cfg->trunk.endpoints[endp_no];
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800407
408 if (strcmp(argv[1], "bts-in") == 0) {
409 port = MGCP_TAP_BTS_IN;
410 } else if (strcmp(argv[1], "bts-out") == 0) {
411 port = MGCP_TAP_BTS_OUT;
412 } else if (strcmp(argv[1], "net-in") == 0) {
413 port = MGCP_TAP_NET_IN;
414 } else if (strcmp(argv[1], "net-out") == 0) {
415 port = MGCP_TAP_NET_OUT;
416 } else {
417 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
418 return CMD_WARNING;
419 }
420
421 tap = &endp->taps[port];
422 memset(&tap->forward, 0, sizeof(tap->forward));
423 inet_aton(argv[2], &tap->forward.sin_addr);
424 tap->forward.sin_port = htons(atoi(argv[3]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +0800425 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800426 return CMD_SUCCESS;
427}
428
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800429DEFUN(free_endp, free_endp_cmd,
430 "free-endpoint NUMBER",
431 "Free the given endpoint\n" "Endpoint number in hex.\n")
432{
433 struct mgcp_endpoint *endp;
434
435 int endp_no = strtoul(argv[0], NULL, 16);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100436 if (endp_no < 1 || endp_no >= g_cfg->trunk.number_endpoints) {
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800437 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
438 argv[0], endp_no, VTY_NEWLINE);
439 return CMD_WARNING;
440 }
441
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100442 endp = &g_cfg->trunk.endpoints[endp_no];
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800443 mgcp_free_endp(endp);
444 return CMD_SUCCESS;
445}
446
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100447int mgcp_vty_init(void)
448{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +0800449 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800450 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800451 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +0800452 install_element(ENABLE_NODE, &free_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100453
454 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
455 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800456
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100457 install_default(MGCP_NODE);
Harald Welte58ed1cb2010-05-14 18:59:17 +0200458 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Weltedc82b9b2010-05-14 19:11:04 +0200459 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100460 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
461 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
462 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
463 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
464 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
465 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800466 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800467 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800468 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
469 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800470 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
471 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800472 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800473 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100474 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
475 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
476 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
477 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200478 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800479 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100480 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800481 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100482 return 0;
483}
484
485int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
486{
487 int i, rc;
488
489 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +0200490 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100491 if (rc < 0) {
492 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
493 return rc;
494 }
495
496
497 if (!g_cfg->bts_ip)
498 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
499
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +0200500 if (!g_cfg->source_addr) {
501 fprintf(stderr, "You need to specify a bind address.\n");
502 return -1;
503 }
504
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100505 if (mgcp_endpoints_allocate(g_cfg) != 0) {
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100506 fprintf(stderr, "Failed to allocate endpoints: %d. Quitting.\n",
507 g_cfg->trunk.number_endpoints);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100508 return -1;
509 }
510
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100511 /* early bind */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100512 for (i = 1; i < g_cfg->trunk.number_endpoints; ++i) {
513 struct mgcp_endpoint *endp = &g_cfg->trunk.endpoints[i];
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800514 int rtp_port;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100515
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800516 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
517 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
518 g_cfg->bts_ports.base_port);
519 if (mgcp_bind_bts_rtp_port(endp, rtp_port) != 0) {
520 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
521 return -1;
522 }
Holger Hans Peter Freyther05d8f5f2010-08-05 08:08:17 +0800523 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100524 }
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800525
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800526 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC) {
527 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
528 g_cfg->net_ports.base_port);
529 if (mgcp_bind_net_rtp_port(endp, rtp_port) != 0) {
530 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
531 return -1;
532 }
Holger Hans Peter Freyther05d8f5f2010-08-05 08:08:17 +0800533 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800534 }
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +0800535
536 if (g_cfg->transcoder_ip && g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100537 /* network side */
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +0800538 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
539 g_cfg->transcoder_ports.base_port);
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100540 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +0800541 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
542 return -1;
543 }
Holger Hans Peter Freytherb6345ab2010-11-01 20:53:31 +0100544 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100545
546 /* bts side */
547 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
548 g_cfg->transcoder_ports.base_port);
549 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
550 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
551 return -1;
552 }
553 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +0800554 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100555 }
556
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +0800557 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100558}
559