blob: 122fa84373e774313b56d2dcf28a876c354b6213 [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/*
Holger Hans Peter Freyther88ad7722011-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 Freyther7bdc6372010-02-20 21:21:02 +01007 * 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
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010024
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010025#include <osmocom/core/talloc.h>
Holger Hans Peter Freyther1ebad742010-02-26 20:16:37 +010026
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010027#include <openbsc/mgcp.h>
28#include <openbsc/mgcp_internal.h>
Harald Welte62ab20c2010-05-14 18:59:17 +020029#include <openbsc/vty.h>
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010030
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020031#include <string.h>
32
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +020033#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
34
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010035static struct mgcp_config *g_cfg = NULL;
36
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010037static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010038{
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010039 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010040
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010041 if (nr == 0)
42 trunk = &cfg->trunk;
43 else
44 trunk = mgcp_trunk_num(cfg, nr);
45
46 return trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010047}
48
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010049/*
50 * vty code for mgcp below
51 */
52struct cmd_node mgcp_node = {
53 MGCP_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020054 "%s(config-mgcp)# ",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010055 1,
56};
57
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010058struct cmd_node trunk_node = {
59 TRUNK_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020060 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010061 1,
62};
63
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010064static int config_write_mgcp(struct vty *vty)
65{
66 vty_out(vty, "mgcp%s", VTY_NEWLINE);
67 if (g_cfg->local_ip)
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020068 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
69 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010070 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
71 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
72 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080073
74 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
75 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 +080076 else
77 vty_out(vty, " rtp bts-range %u %u%s",
78 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
79
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080080 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
81 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 +080082 else
83 vty_out(vty, " rtp net-range %u %u%s",
84 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
85
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +080086 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +020087 if (g_cfg->trunk.omit_rtcp)
88 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
89 else
90 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010091 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +010092 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010093 g_cfg->trunk.audio_payload, VTY_NEWLINE);
94 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +010095 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010096 g_cfg->trunk.audio_name, VTY_NEWLINE);
97 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
98 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +020099 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100100 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800101 if (g_cfg->transcoder_ip)
102 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100103
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800104 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
105 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
106 else
107 vty_out(vty, " rtp transcoder-range %u %u%s",
108 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800109 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800110
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100111 return CMD_SUCCESS;
112}
113
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100114static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100115{
116 int i;
117
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100118 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
119 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
120 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
121
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100122 if (!cfg->endpoints) {
123 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
124 return;
125 }
126
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100127 for (i = 1; i < cfg->number_endpoints; ++i) {
128 struct mgcp_endpoint *endp = &cfg->endpoints[i];
129 vty_out(vty,
130 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200131 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100132 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800133 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
134 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
135 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200136 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100137 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200138 VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100139 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100140}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100141
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100142DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
143 SHOW_STR "Display information about the MGCP Media Gateway")
144{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100145 struct mgcp_trunk_config *trunk;
146
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100147 dump_trunk(vty, &g_cfg->trunk);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100148
149 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
150 dump_trunk(vty, trunk);
151
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100152 return CMD_SUCCESS;
153}
154
155DEFUN(cfg_mgcp,
156 cfg_mgcp_cmd,
157 "mgcp",
158 "Configure the MGCP")
159{
160 vty->node = MGCP_NODE;
161 return CMD_SUCCESS;
162}
163
164DEFUN(cfg_mgcp_local_ip,
165 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800166 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100167 "Local options for the SDP record\n"
168 IP_STR
169 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100170{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200171 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100172 return CMD_SUCCESS;
173}
174
175DEFUN(cfg_mgcp_bts_ip,
176 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800177 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100178 "BTS Audio source/destination options\n"
179 IP_STR
180 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100181{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200182 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100183 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
184 return CMD_SUCCESS;
185}
186
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100187#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100188DEFUN(cfg_mgcp_bind_ip,
189 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800190 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100191 BIND_STR
192 IP_STR
193 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100194{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200195 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100196 return CMD_SUCCESS;
197}
198
199DEFUN(cfg_mgcp_bind_port,
200 cfg_mgcp_bind_port_cmd,
201 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100202 BIND_STR
203 "Port information\n"
204 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100205{
206 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100207 g_cfg->source_port = port;
208 return CMD_SUCCESS;
209}
210
211DEFUN(cfg_mgcp_bind_early,
212 cfg_mgcp_bind_early_cmd,
213 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100214 BIND_STR
215 "Bind local ports on start up\n"
216 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100217{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800218 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
219 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100220}
221
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800222static void parse_base(struct mgcp_port_range *range, const char **argv)
223{
224 unsigned int port = atoi(argv[0]);
225 range->mode = PORT_ALLOC_STATIC;
226 range->base_port = port;
227}
228
229static void parse_range(struct mgcp_port_range *range, const char **argv)
230{
231 range->mode = PORT_ALLOC_DYNAMIC;
232 range->range_start = atoi(argv[0]);
233 range->range_end = atoi(argv[1]);
234 range->last_port = g_cfg->bts_ports.range_start;
235}
236
237
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100238#define RTP_STR "RTP configuration\n"
239#define BTS_START_STR "First UDP port allocated for the BTS side\n"
240#define NET_START_STR "First UDP port allocated for the NET side\n"
241#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800242DEFUN(cfg_mgcp_rtp_bts_base_port,
243 cfg_mgcp_rtp_bts_base_port_cmd,
244 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100245 RTP_STR
246 BTS_START_STR
247 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100248{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800249 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100250 return CMD_SUCCESS;
251}
252
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100253#define RANGE_START_STR "Start of the range of ports\n"
254#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800255DEFUN(cfg_mgcp_rtp_bts_range,
256 cfg_mgcp_rtp_bts_range_cmd,
257 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100258 RTP_STR "Range of ports to use for the BTS side\n"
259 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800260{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800261 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800262 return CMD_SUCCESS;
263}
264
265DEFUN(cfg_mgcp_rtp_net_range,
266 cfg_mgcp_rtp_net_range_cmd,
267 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100268 RTP_STR "Range of ports to use for the NET side\n"
269 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800270{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800271 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800272 return CMD_SUCCESS;
273}
274
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800275DEFUN(cfg_mgcp_rtp_net_base_port,
276 cfg_mgcp_rtp_net_base_port_cmd,
277 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100278 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800279{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800280 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800281 return CMD_SUCCESS;
282}
283
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800284ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100285 "rtp base <0-65534>",
286 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800287
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800288DEFUN(cfg_mgcp_rtp_transcoder_range,
289 cfg_mgcp_rtp_transcoder_range_cmd,
290 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100291 RTP_STR "Range of ports to use for the Transcoder\n"
292 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800293{
294 parse_range(&g_cfg->transcoder_ports, argv);
295 return CMD_SUCCESS;
296}
297
298DEFUN(cfg_mgcp_rtp_transcoder_base,
299 cfg_mgcp_rtp_transcoder_base_cmd,
300 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100301 RTP_STR "First UDP port allocated for the Transcoder side\n"
302 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800303{
304 parse_base(&g_cfg->transcoder_ports, argv);
305 return CMD_SUCCESS;
306}
307
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800308DEFUN(cfg_mgcp_rtp_ip_dscp,
309 cfg_mgcp_rtp_ip_dscp_cmd,
310 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100311 RTP_STR
312 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800313{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800314 int dscp = atoi(argv[0]);
315 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800316 return CMD_SUCCESS;
317}
318
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800319ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
320 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100321 RTP_STR
322 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800323
324
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100325#define SDP_STR "SDP File related options\n"
326#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100327DEFUN(cfg_mgcp_sdp_payload_number,
328 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100329 "sdp audio-payload number <1-255>",
330 SDP_STR AUDIO_STR
331 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100332{
333 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100334 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100335 return CMD_SUCCESS;
336}
337
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100338ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
339 "sdp audio payload number <1-255>",
340 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
341
342
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100343DEFUN(cfg_mgcp_sdp_payload_name,
344 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100345 "sdp audio-payload name NAME",
346 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100347{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100348 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100349 return CMD_SUCCESS;
350}
351
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100352ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
353 "sdp audio payload name NAME",
354 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
355
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100356DEFUN(cfg_mgcp_loop,
357 cfg_mgcp_loop_cmd,
358 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100359 "Loop audio for all endpoints on main trunk\n"
360 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100361{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100362 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100363 return CMD_SUCCESS;
364}
365
366DEFUN(cfg_mgcp_number_endp,
367 cfg_mgcp_number_endp_cmd,
368 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100369 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100370{
371 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100372 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100373 return CMD_SUCCESS;
374}
375
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200376DEFUN(cfg_mgcp_omit_rtcp,
377 cfg_mgcp_omit_rtcp_cmd,
378 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200379 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200380{
381 g_cfg->trunk.omit_rtcp = 1;
382 return CMD_SUCCESS;
383}
384
385DEFUN(cfg_mgcp_no_omit_rtcp,
386 cfg_mgcp_no_omit_rtcp_cmd,
387 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200388 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200389{
390 g_cfg->trunk.omit_rtcp = 0;
391 return CMD_SUCCESS;
392}
393
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100394#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200395DEFUN(cfg_mgcp_agent_addr,
396 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100397 "call-agent ip A.B.C.D",
398 CALL_AGENT_STR IP_STR
399 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200400{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200401 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200402 return CMD_SUCCESS;
403}
404
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100405ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
406 "call agent ip A.B.C.D",
407 CALL_AGENT_STR CALL_AGENT_STR IP_STR
408 "IPv4 Address of the callagent\n")
409
410
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800411DEFUN(cfg_mgcp_transcoder,
412 cfg_mgcp_transcoder_cmd,
413 "transcoder-mgw A.B.C.D",
414 "Use a MGW to detranscoder RTP\n"
415 "The IP address of the MGW")
416{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200417 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800418 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
419
420 return CMD_SUCCESS;
421}
422
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100423DEFUN(cfg_mgcp_no_transcoder,
424 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100425 "no transcoder-mgw",
426 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100427{
428 if (g_cfg->transcoder_ip) {
429 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
430 talloc_free(g_cfg->transcoder_ip);
431 g_cfg->transcoder_ip = NULL;
432 }
433
434 return CMD_SUCCESS;
435}
436
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800437DEFUN(cfg_mgcp_transcoder_remote_base,
438 cfg_mgcp_transcoder_remote_base_cmd,
439 "transcoder-remote-base <0-65534>",
440 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
441{
442 g_cfg->transcoder_remote_base = atoi(argv[0]);
443 return CMD_SUCCESS;
444}
445
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100446DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
447 "trunk <1-64>",
448 "Configure a SS7 trunk\n" "Trunk Nr\n")
449{
450 struct mgcp_trunk_config *trunk;
451 int index = atoi(argv[0]);
452
453 trunk = mgcp_trunk_num(g_cfg, index);
454 if (!trunk)
455 trunk = mgcp_trunk_alloc(g_cfg, index);
456
457 if (!trunk) {
458 vty_out(vty, "%%Unable to allocate trunk %u.%s",
459 index, VTY_NEWLINE);
460 return CMD_WARNING;
461 }
462
463 vty->node = TRUNK_NODE;
464 vty->index = trunk;
465 return CMD_SUCCESS;
466}
467
468static int config_write_trunk(struct vty *vty)
469{
470 struct mgcp_trunk_config *trunk;
471
472 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
473 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100474 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100475 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100476 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100477 trunk->audio_name, VTY_NEWLINE);
478 vty_out(vty, " loop %d%s",
479 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200480 if (trunk->omit_rtcp)
481 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
482 else
483 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100484 }
485
486 return CMD_SUCCESS;
487}
488
489DEFUN(cfg_trunk_payload_number,
490 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100491 "sdp audio-payload number <1-255>",
492 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100493{
494 struct mgcp_trunk_config *trunk = vty->index;
495 unsigned int payload = atoi(argv[0]);
496
497 trunk->audio_payload = payload;
498 return CMD_SUCCESS;
499}
500
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100501ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
502 "sdp audio payload number <1-255>",
503 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
504
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100505DEFUN(cfg_trunk_payload_name,
506 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100507 "sdp audio-payload name NAME",
508 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100509{
510 struct mgcp_trunk_config *trunk = vty->index;
511
512 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
513 return CMD_SUCCESS;
514}
515
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100516ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
517 "sdp audio payload name NAME",
518 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
519
520
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100521DEFUN(cfg_trunk_loop,
522 cfg_trunk_loop_cmd,
523 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100524 "Loop audio for all endpoints on this trunk\n"
525 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100526{
527 struct mgcp_trunk_config *trunk = vty->index;
528
529 trunk->audio_loop = atoi(argv[0]);
530 return CMD_SUCCESS;
531}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800532
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200533DEFUN(cfg_trunk_omit_rtcp,
534 cfg_trunk_omit_rtcp_cmd,
535 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200536 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200537{
538 struct mgcp_trunk_config *trunk = vty->index;
539 trunk->omit_rtcp = 1;
540 return CMD_SUCCESS;
541}
542
543DEFUN(cfg_trunk_no_omit_rtcp,
544 cfg_trunk_no_omit_rtcp_cmd,
545 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200546 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200547{
548 struct mgcp_trunk_config *trunk = vty->index;
549 trunk->omit_rtcp = 0;
550 return CMD_SUCCESS;
551}
552
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800553DEFUN(loop_endp,
554 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100555 "loop-endpoint <0-64> NAME (0|1)",
556 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800557 "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 +0800558{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100559 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800560 struct mgcp_endpoint *endp;
561
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100562 trunk = find_trunk(g_cfg, atoi(argv[0]));
563 if (!trunk) {
564 vty_out(vty, "%%Trunk %d not found in the config.%s",
565 atoi(argv[0]), VTY_NEWLINE);
566 return CMD_WARNING;
567 }
568
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100569 if (!trunk->endpoints) {
570 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
571 trunk->trunk_nr, VTY_NEWLINE);
572 return CMD_WARNING;
573 }
574
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100575 int endp_no = strtoul(argv[1], NULL, 16);
576 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800577 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100578 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800579 return CMD_WARNING;
580 }
581
582
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100583 endp = &trunk->endpoints[endp_no];
584 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800585
586 if (loop)
587 endp->conn_mode = MGCP_CONN_LOOPBACK;
588 else
589 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000590 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800591
592 return CMD_SUCCESS;
593}
594
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800595DEFUN(tap_call,
596 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100597 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
598 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800599 "The endpoint in hex\n"
600 "Forward the data coming from the bts\n"
601 "Forward the data coming from the bts leaving to the network\n"
602 "Forward the data coming from the net\n"
603 "Forward the data coming from the net leaving to the bts\n"
604 "destination IP of the data\n" "destination port\n")
605{
606 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100607 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800608 struct mgcp_endpoint *endp;
609 int port = 0;
610
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100611 trunk = find_trunk(g_cfg, atoi(argv[0]));
612 if (!trunk) {
613 vty_out(vty, "%%Trunk %d not found in the config.%s",
614 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800615 return CMD_WARNING;
616 }
617
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100618 if (!trunk->endpoints) {
619 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
620 trunk->trunk_nr, VTY_NEWLINE);
621 return CMD_WARNING;
622 }
623
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100624 int endp_no = strtoul(argv[1], NULL, 16);
625 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
626 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
627 argv[1], endp_no, VTY_NEWLINE);
628 return CMD_WARNING;
629 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800630
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100631 endp = &trunk->endpoints[endp_no];
632
633 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800634 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100635 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800636 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100637 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800638 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100639 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800640 port = MGCP_TAP_NET_OUT;
641 } else {
642 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
643 return CMD_WARNING;
644 }
645
646 tap = &endp->taps[port];
647 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100648 inet_aton(argv[3], &tap->forward.sin_addr);
649 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800650 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800651 return CMD_SUCCESS;
652}
653
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800654DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100655 "free-endpoint <0-64> NUMBER",
656 "Free the given endpoint\n" "Trunk number\n"
657 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800658{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100659 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800660 struct mgcp_endpoint *endp;
661
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100662 trunk = find_trunk(g_cfg, atoi(argv[0]));
663 if (!trunk) {
664 vty_out(vty, "%%Trunk %d not found in the config.%s",
665 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800666 return CMD_WARNING;
667 }
668
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100669 if (!trunk->endpoints) {
670 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
671 trunk->trunk_nr, VTY_NEWLINE);
672 return CMD_WARNING;
673 }
674
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100675 int endp_no = strtoul(argv[1], NULL, 16);
676 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
677 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
678 argv[1], endp_no, VTY_NEWLINE);
679 return CMD_WARNING;
680 }
681
682 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800683 mgcp_free_endp(endp);
684 return CMD_SUCCESS;
685}
686
Harald Welte6a857052012-01-27 00:41:39 +0100687DEFUN(reset_endp, reset_endp_cmd,
688 "reset-endpoint <0-64> NUMBER",
689 "Reset the given endpoint\n" "Trunk number\n"
690 "Endpoint number in hex.\n")
691{
692 struct mgcp_trunk_config *trunk;
693 struct mgcp_endpoint *endp;
694 int endp_no, rc;
695
696 trunk = find_trunk(g_cfg, atoi(argv[0]));
697 if (!trunk) {
698 vty_out(vty, "%%Trunk %d not found in the config.%s",
699 atoi(argv[0]), VTY_NEWLINE);
700 return CMD_WARNING;
701 }
702
703 if (!trunk->endpoints) {
704 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
705 trunk->trunk_nr, VTY_NEWLINE);
706 return CMD_WARNING;
707 }
708
709 endp_no = strtoul(argv[1], NULL, 16);
710 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
711 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
712 argv[1], endp_no, VTY_NEWLINE);
713 return CMD_WARNING;
714 }
715
716 endp = &trunk->endpoints[endp_no];
717 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
718 if (rc < 0) {
719 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
720 return CMD_WARNING;
721 }
722 return CMD_SUCCESS;
723}
724
725DEFUN(reset_all_endp, reset_all_endp_cmd,
726 "reset-all-endpoints",
727 "Reset all endpoints\n")
728{
729 int rc;
730
731 rc = mgcp_send_reset_all(g_cfg);
732 if (rc < 0) {
733 vty_out(vty, "Error %d during endpoint reset.%s",
734 rc, VTY_NEWLINE);
735 return CMD_WARNING;
736 }
737 return CMD_SUCCESS;
738}
739
740
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100741int mgcp_vty_init(void)
742{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800743 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800744 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800745 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800746 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +0100747 install_element(ENABLE_NODE, &reset_endp_cmd);
748 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100749
750 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
751 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800752
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100753 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200754 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200755 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100756 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
757 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
758 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
759 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
760 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
761 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800762 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800763 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800764 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
765 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800766 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
767 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800768 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800769 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200770 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100771 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800772 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100773 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800774 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100775 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
776 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100777 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
778 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100779 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
780 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200781 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
782 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100783
784 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
785 install_node(&trunk_node, config_write_trunk);
786 install_default(TRUNK_NODE);
787 install_element(TRUNK_NODE, &ournode_exit_cmd);
788 install_element(TRUNK_NODE, &ournode_end_cmd);
789 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
790 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100791 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
792 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100793 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200794 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
795 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100796
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100797 return 0;
798}
799
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100800static int allocate_trunk(struct mgcp_trunk_config *trunk)
801{
802 int i;
803 struct mgcp_config *cfg = trunk->cfg;
804
805 if (mgcp_endpoints_allocate(trunk) != 0) {
806 LOGP(DMGCP, LOGL_ERROR,
807 "Failed to allocate %d endpoints on trunk %d.\n",
808 trunk->number_endpoints, trunk->trunk_nr);
809 return -1;
810 }
811
812 /* early bind */
813 for (i = 1; i < trunk->number_endpoints; ++i) {
814 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100815
816 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100817 cfg->last_bts_port += 2;
818 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
819 LOGP(DMGCP, LOGL_FATAL,
820 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100821 return -1;
822 }
823 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
824 }
825
826 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100827 cfg->last_net_port += 2;
828 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
829 LOGP(DMGCP, LOGL_FATAL,
830 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100831 return -1;
832 }
833 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
834 }
835
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +0100836 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
837 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100838 int rtp_port;
839
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100840 /* network side */
841 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
842 cfg->transcoder_ports.base_port);
843 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
844 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
845 return -1;
846 }
847 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
848
849 /* bts side */
850 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
851 cfg->transcoder_ports.base_port);
852 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
853 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
854 return -1;
855 }
856 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
857 }
858 }
859
860 return 0;
861}
862
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100863int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
864{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100865 int rc;
866 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100867
868 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200869 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100870 if (rc < 0) {
871 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
872 return rc;
873 }
874
875
876 if (!g_cfg->bts_ip)
877 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
878
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200879 if (!g_cfg->source_addr) {
880 fprintf(stderr, "You need to specify a bind address.\n");
881 return -1;
882 }
883
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100884 /* initialize the last ports */
885 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
886 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
887
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100888 if (allocate_trunk(&g_cfg->trunk) != 0) {
889 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100890 return -1;
891 }
892
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100893 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
894 if (allocate_trunk(trunk) != 0) {
895 LOGP(DMGCP, LOGL_ERROR,
896 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
897 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800898 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100899 }
900
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800901 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100902}
903