blob: 833908a21c3e43acbb06069be46e0fbbb1efe141 [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);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +020097 if (g_cfg->trunk.audio_fmtp_extra)
98 vty_out(vty, " sdp audio fmtp-extra %s%s",
99 g_cfg->trunk.audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100100 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
101 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200102 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100103 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800104 if (g_cfg->transcoder_ip)
105 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100106
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800107 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
108 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
109 else
110 vty_out(vty, " rtp transcoder-range %u %u%s",
111 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800112 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800113
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100114 return CMD_SUCCESS;
115}
116
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100117static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100118{
119 int i;
120
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100121 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
122 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
123 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
124
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100125 if (!cfg->endpoints) {
126 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
127 return;
128 }
129
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100130 for (i = 1; i < cfg->number_endpoints; ++i) {
131 struct mgcp_endpoint *endp = &cfg->endpoints[i];
132 vty_out(vty,
133 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200134 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100135 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800136 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
137 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
138 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200139 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100140 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200141 VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100142 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100143}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100144
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100145DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
146 SHOW_STR "Display information about the MGCP Media Gateway")
147{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100148 struct mgcp_trunk_config *trunk;
149
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100150 dump_trunk(vty, &g_cfg->trunk);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100151
152 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
153 dump_trunk(vty, trunk);
154
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100155 return CMD_SUCCESS;
156}
157
158DEFUN(cfg_mgcp,
159 cfg_mgcp_cmd,
160 "mgcp",
161 "Configure the MGCP")
162{
163 vty->node = MGCP_NODE;
164 return CMD_SUCCESS;
165}
166
167DEFUN(cfg_mgcp_local_ip,
168 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800169 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100170 "Local options for the SDP record\n"
171 IP_STR
172 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100173{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200174 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100175 return CMD_SUCCESS;
176}
177
178DEFUN(cfg_mgcp_bts_ip,
179 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800180 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100181 "BTS Audio source/destination options\n"
182 IP_STR
183 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100184{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200185 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100186 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
187 return CMD_SUCCESS;
188}
189
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100190#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100191DEFUN(cfg_mgcp_bind_ip,
192 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800193 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100194 BIND_STR
195 IP_STR
196 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100197{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200198 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100199 return CMD_SUCCESS;
200}
201
202DEFUN(cfg_mgcp_bind_port,
203 cfg_mgcp_bind_port_cmd,
204 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100205 BIND_STR
206 "Port information\n"
207 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100208{
209 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100210 g_cfg->source_port = port;
211 return CMD_SUCCESS;
212}
213
214DEFUN(cfg_mgcp_bind_early,
215 cfg_mgcp_bind_early_cmd,
216 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100217 BIND_STR
218 "Bind local ports on start up\n"
219 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100220{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800221 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
222 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100223}
224
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800225static void parse_base(struct mgcp_port_range *range, const char **argv)
226{
227 unsigned int port = atoi(argv[0]);
228 range->mode = PORT_ALLOC_STATIC;
229 range->base_port = port;
230}
231
232static void parse_range(struct mgcp_port_range *range, const char **argv)
233{
234 range->mode = PORT_ALLOC_DYNAMIC;
235 range->range_start = atoi(argv[0]);
236 range->range_end = atoi(argv[1]);
237 range->last_port = g_cfg->bts_ports.range_start;
238}
239
240
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100241#define RTP_STR "RTP configuration\n"
242#define BTS_START_STR "First UDP port allocated for the BTS side\n"
243#define NET_START_STR "First UDP port allocated for the NET side\n"
244#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800245DEFUN(cfg_mgcp_rtp_bts_base_port,
246 cfg_mgcp_rtp_bts_base_port_cmd,
247 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100248 RTP_STR
249 BTS_START_STR
250 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100251{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800252 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100253 return CMD_SUCCESS;
254}
255
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100256#define RANGE_START_STR "Start of the range of ports\n"
257#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800258DEFUN(cfg_mgcp_rtp_bts_range,
259 cfg_mgcp_rtp_bts_range_cmd,
260 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100261 RTP_STR "Range of ports to use for the BTS side\n"
262 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800263{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800264 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800265 return CMD_SUCCESS;
266}
267
268DEFUN(cfg_mgcp_rtp_net_range,
269 cfg_mgcp_rtp_net_range_cmd,
270 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100271 RTP_STR "Range of ports to use for the NET side\n"
272 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800273{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800274 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800275 return CMD_SUCCESS;
276}
277
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800278DEFUN(cfg_mgcp_rtp_net_base_port,
279 cfg_mgcp_rtp_net_base_port_cmd,
280 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100281 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800282{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800283 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800284 return CMD_SUCCESS;
285}
286
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800287ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100288 "rtp base <0-65534>",
289 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800290
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800291DEFUN(cfg_mgcp_rtp_transcoder_range,
292 cfg_mgcp_rtp_transcoder_range_cmd,
293 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100294 RTP_STR "Range of ports to use for the Transcoder\n"
295 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800296{
297 parse_range(&g_cfg->transcoder_ports, argv);
298 return CMD_SUCCESS;
299}
300
301DEFUN(cfg_mgcp_rtp_transcoder_base,
302 cfg_mgcp_rtp_transcoder_base_cmd,
303 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100304 RTP_STR "First UDP port allocated for the Transcoder side\n"
305 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800306{
307 parse_base(&g_cfg->transcoder_ports, argv);
308 return CMD_SUCCESS;
309}
310
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800311DEFUN(cfg_mgcp_rtp_ip_dscp,
312 cfg_mgcp_rtp_ip_dscp_cmd,
313 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100314 RTP_STR
315 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800316{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800317 int dscp = atoi(argv[0]);
318 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800319 return CMD_SUCCESS;
320}
321
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800322ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
323 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100324 RTP_STR
325 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800326
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200327DEFUN(cfg_mgcp_sdp_fmtp_extra,
328 cfg_mgcp_sdp_fmtp_extra_cmd,
329 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100330 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
331 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200332{
333 char *txt = argv_concat(argv, argc, 0);
334 if (!txt)
335 return CMD_WARNING;
336
337 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
338 talloc_free(txt);
339 return CMD_SUCCESS;
340}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800341
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100342#define SDP_STR "SDP File related options\n"
343#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100344DEFUN(cfg_mgcp_sdp_payload_number,
345 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100346 "sdp audio-payload number <1-255>",
347 SDP_STR AUDIO_STR
348 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100349{
350 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100351 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100352 return CMD_SUCCESS;
353}
354
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100355ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
356 "sdp audio payload number <1-255>",
357 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
358
359
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100360DEFUN(cfg_mgcp_sdp_payload_name,
361 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100362 "sdp audio-payload name NAME",
363 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100364{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100365 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100366 return CMD_SUCCESS;
367}
368
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100369ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
370 "sdp audio payload name NAME",
371 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
372
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100373DEFUN(cfg_mgcp_loop,
374 cfg_mgcp_loop_cmd,
375 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100376 "Loop audio for all endpoints on main trunk\n"
377 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100378{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100379 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100380 return CMD_SUCCESS;
381}
382
383DEFUN(cfg_mgcp_number_endp,
384 cfg_mgcp_number_endp_cmd,
385 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100386 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100387{
388 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100389 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100390 return CMD_SUCCESS;
391}
392
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200393DEFUN(cfg_mgcp_omit_rtcp,
394 cfg_mgcp_omit_rtcp_cmd,
395 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200396 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200397{
398 g_cfg->trunk.omit_rtcp = 1;
399 return CMD_SUCCESS;
400}
401
402DEFUN(cfg_mgcp_no_omit_rtcp,
403 cfg_mgcp_no_omit_rtcp_cmd,
404 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200405 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200406{
407 g_cfg->trunk.omit_rtcp = 0;
408 return CMD_SUCCESS;
409}
410
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100411#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200412DEFUN(cfg_mgcp_agent_addr,
413 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100414 "call-agent ip A.B.C.D",
415 CALL_AGENT_STR IP_STR
416 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200417{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200418 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200419 return CMD_SUCCESS;
420}
421
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100422ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
423 "call agent ip A.B.C.D",
424 CALL_AGENT_STR CALL_AGENT_STR IP_STR
425 "IPv4 Address of the callagent\n")
426
427
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800428DEFUN(cfg_mgcp_transcoder,
429 cfg_mgcp_transcoder_cmd,
430 "transcoder-mgw A.B.C.D",
431 "Use a MGW to detranscoder RTP\n"
432 "The IP address of the MGW")
433{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200434 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800435 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
436
437 return CMD_SUCCESS;
438}
439
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100440DEFUN(cfg_mgcp_no_transcoder,
441 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100442 "no transcoder-mgw",
443 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100444{
445 if (g_cfg->transcoder_ip) {
446 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
447 talloc_free(g_cfg->transcoder_ip);
448 g_cfg->transcoder_ip = NULL;
449 }
450
451 return CMD_SUCCESS;
452}
453
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800454DEFUN(cfg_mgcp_transcoder_remote_base,
455 cfg_mgcp_transcoder_remote_base_cmd,
456 "transcoder-remote-base <0-65534>",
457 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
458{
459 g_cfg->transcoder_remote_base = atoi(argv[0]);
460 return CMD_SUCCESS;
461}
462
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100463DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
464 "trunk <1-64>",
465 "Configure a SS7 trunk\n" "Trunk Nr\n")
466{
467 struct mgcp_trunk_config *trunk;
468 int index = atoi(argv[0]);
469
470 trunk = mgcp_trunk_num(g_cfg, index);
471 if (!trunk)
472 trunk = mgcp_trunk_alloc(g_cfg, index);
473
474 if (!trunk) {
475 vty_out(vty, "%%Unable to allocate trunk %u.%s",
476 index, VTY_NEWLINE);
477 return CMD_WARNING;
478 }
479
480 vty->node = TRUNK_NODE;
481 vty->index = trunk;
482 return CMD_SUCCESS;
483}
484
485static int config_write_trunk(struct vty *vty)
486{
487 struct mgcp_trunk_config *trunk;
488
489 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
490 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100491 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100492 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100493 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100494 trunk->audio_name, VTY_NEWLINE);
495 vty_out(vty, " loop %d%s",
496 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200497 if (trunk->omit_rtcp)
498 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
499 else
500 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200501 if (trunk->audio_fmtp_extra)
502 vty_out(vty, " sdp audio fmtp-extra %s%s",
503 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100504 }
505
506 return CMD_SUCCESS;
507}
508
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200509DEFUN(cfg_trunk_sdp_fmtp_extra,
510 cfg_trunk_sdp_fmtp_extra_cmd,
511 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100512 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
513 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200514{
515 struct mgcp_trunk_config *trunk = vty->index;
516 char *txt = argv_concat(argv, argc, 0);
517 if (!txt)
518 return CMD_WARNING;
519
520 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
521 talloc_free(txt);
522 return CMD_SUCCESS;
523}
524
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100525DEFUN(cfg_trunk_payload_number,
526 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100527 "sdp audio-payload number <1-255>",
528 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100529{
530 struct mgcp_trunk_config *trunk = vty->index;
531 unsigned int payload = atoi(argv[0]);
532
533 trunk->audio_payload = payload;
534 return CMD_SUCCESS;
535}
536
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100537ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
538 "sdp audio payload number <1-255>",
539 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
540
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100541DEFUN(cfg_trunk_payload_name,
542 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100543 "sdp audio-payload name NAME",
544 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100545{
546 struct mgcp_trunk_config *trunk = vty->index;
547
548 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
549 return CMD_SUCCESS;
550}
551
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100552ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
553 "sdp audio payload name NAME",
554 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
555
556
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100557DEFUN(cfg_trunk_loop,
558 cfg_trunk_loop_cmd,
559 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100560 "Loop audio for all endpoints on this trunk\n"
561 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100562{
563 struct mgcp_trunk_config *trunk = vty->index;
564
565 trunk->audio_loop = atoi(argv[0]);
566 return CMD_SUCCESS;
567}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800568
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200569DEFUN(cfg_trunk_omit_rtcp,
570 cfg_trunk_omit_rtcp_cmd,
571 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200572 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200573{
574 struct mgcp_trunk_config *trunk = vty->index;
575 trunk->omit_rtcp = 1;
576 return CMD_SUCCESS;
577}
578
579DEFUN(cfg_trunk_no_omit_rtcp,
580 cfg_trunk_no_omit_rtcp_cmd,
581 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200582 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200583{
584 struct mgcp_trunk_config *trunk = vty->index;
585 trunk->omit_rtcp = 0;
586 return CMD_SUCCESS;
587}
588
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800589DEFUN(loop_endp,
590 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100591 "loop-endpoint <0-64> NAME (0|1)",
592 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800593 "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 +0800594{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100595 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800596 struct mgcp_endpoint *endp;
597
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100598 trunk = find_trunk(g_cfg, atoi(argv[0]));
599 if (!trunk) {
600 vty_out(vty, "%%Trunk %d not found in the config.%s",
601 atoi(argv[0]), VTY_NEWLINE);
602 return CMD_WARNING;
603 }
604
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100605 if (!trunk->endpoints) {
606 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
607 trunk->trunk_nr, VTY_NEWLINE);
608 return CMD_WARNING;
609 }
610
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100611 int endp_no = strtoul(argv[1], NULL, 16);
612 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800613 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100614 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800615 return CMD_WARNING;
616 }
617
618
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100619 endp = &trunk->endpoints[endp_no];
620 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800621
622 if (loop)
623 endp->conn_mode = MGCP_CONN_LOOPBACK;
624 else
625 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000626 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800627
628 return CMD_SUCCESS;
629}
630
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800631DEFUN(tap_call,
632 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100633 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
634 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800635 "The endpoint in hex\n"
636 "Forward the data coming from the bts\n"
637 "Forward the data coming from the bts leaving to the network\n"
638 "Forward the data coming from the net\n"
639 "Forward the data coming from the net leaving to the bts\n"
640 "destination IP of the data\n" "destination port\n")
641{
642 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100643 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800644 struct mgcp_endpoint *endp;
645 int port = 0;
646
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100647 trunk = find_trunk(g_cfg, atoi(argv[0]));
648 if (!trunk) {
649 vty_out(vty, "%%Trunk %d not found in the config.%s",
650 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800651 return CMD_WARNING;
652 }
653
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100654 if (!trunk->endpoints) {
655 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
656 trunk->trunk_nr, VTY_NEWLINE);
657 return CMD_WARNING;
658 }
659
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100660 int endp_no = strtoul(argv[1], NULL, 16);
661 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
662 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
663 argv[1], endp_no, VTY_NEWLINE);
664 return CMD_WARNING;
665 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800666
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100667 endp = &trunk->endpoints[endp_no];
668
669 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800670 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100671 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800672 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100673 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800674 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100675 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800676 port = MGCP_TAP_NET_OUT;
677 } else {
678 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
679 return CMD_WARNING;
680 }
681
682 tap = &endp->taps[port];
683 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100684 inet_aton(argv[3], &tap->forward.sin_addr);
685 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800686 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800687 return CMD_SUCCESS;
688}
689
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800690DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100691 "free-endpoint <0-64> NUMBER",
692 "Free the given endpoint\n" "Trunk number\n"
693 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800694{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100695 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800696 struct mgcp_endpoint *endp;
697
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100698 trunk = find_trunk(g_cfg, atoi(argv[0]));
699 if (!trunk) {
700 vty_out(vty, "%%Trunk %d not found in the config.%s",
701 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800702 return CMD_WARNING;
703 }
704
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100705 if (!trunk->endpoints) {
706 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
707 trunk->trunk_nr, VTY_NEWLINE);
708 return CMD_WARNING;
709 }
710
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100711 int endp_no = strtoul(argv[1], NULL, 16);
712 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
713 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
714 argv[1], endp_no, VTY_NEWLINE);
715 return CMD_WARNING;
716 }
717
718 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800719 mgcp_free_endp(endp);
720 return CMD_SUCCESS;
721}
722
Harald Welte6a857052012-01-27 00:41:39 +0100723DEFUN(reset_endp, reset_endp_cmd,
724 "reset-endpoint <0-64> NUMBER",
725 "Reset the given endpoint\n" "Trunk number\n"
726 "Endpoint number in hex.\n")
727{
728 struct mgcp_trunk_config *trunk;
729 struct mgcp_endpoint *endp;
730 int endp_no, rc;
731
732 trunk = find_trunk(g_cfg, atoi(argv[0]));
733 if (!trunk) {
734 vty_out(vty, "%%Trunk %d not found in the config.%s",
735 atoi(argv[0]), VTY_NEWLINE);
736 return CMD_WARNING;
737 }
738
739 if (!trunk->endpoints) {
740 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
741 trunk->trunk_nr, VTY_NEWLINE);
742 return CMD_WARNING;
743 }
744
745 endp_no = strtoul(argv[1], NULL, 16);
746 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
747 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
748 argv[1], endp_no, VTY_NEWLINE);
749 return CMD_WARNING;
750 }
751
752 endp = &trunk->endpoints[endp_no];
753 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
754 if (rc < 0) {
755 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
756 return CMD_WARNING;
757 }
758 return CMD_SUCCESS;
759}
760
761DEFUN(reset_all_endp, reset_all_endp_cmd,
762 "reset-all-endpoints",
763 "Reset all endpoints\n")
764{
765 int rc;
766
767 rc = mgcp_send_reset_all(g_cfg);
768 if (rc < 0) {
769 vty_out(vty, "Error %d during endpoint reset.%s",
770 rc, VTY_NEWLINE);
771 return CMD_WARNING;
772 }
773 return CMD_SUCCESS;
774}
775
776
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100777int mgcp_vty_init(void)
778{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800779 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800780 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800781 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800782 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +0100783 install_element(ENABLE_NODE, &reset_endp_cmd);
784 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100785
786 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
787 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800788
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100789 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200790 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200791 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100792 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
793 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
794 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
795 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
796 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
797 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800798 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800799 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800800 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
801 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800802 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
803 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800804 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800805 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200806 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100807 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800808 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100809 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800810 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100811 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
812 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100813 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
814 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100815 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
816 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200817 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
818 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200819 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100820
821 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
822 install_node(&trunk_node, config_write_trunk);
823 install_default(TRUNK_NODE);
824 install_element(TRUNK_NODE, &ournode_exit_cmd);
825 install_element(TRUNK_NODE, &ournode_end_cmd);
826 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
827 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100828 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
829 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100830 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200831 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
832 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200833 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100834
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100835 return 0;
836}
837
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100838static int allocate_trunk(struct mgcp_trunk_config *trunk)
839{
840 int i;
841 struct mgcp_config *cfg = trunk->cfg;
842
843 if (mgcp_endpoints_allocate(trunk) != 0) {
844 LOGP(DMGCP, LOGL_ERROR,
845 "Failed to allocate %d endpoints on trunk %d.\n",
846 trunk->number_endpoints, trunk->trunk_nr);
847 return -1;
848 }
849
850 /* early bind */
851 for (i = 1; i < trunk->number_endpoints; ++i) {
852 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100853
854 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100855 cfg->last_bts_port += 2;
856 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
857 LOGP(DMGCP, LOGL_FATAL,
858 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100859 return -1;
860 }
861 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
862 }
863
864 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100865 cfg->last_net_port += 2;
866 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
867 LOGP(DMGCP, LOGL_FATAL,
868 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100869 return -1;
870 }
871 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
872 }
873
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +0100874 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
875 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100876 int rtp_port;
877
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100878 /* network side */
879 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
880 cfg->transcoder_ports.base_port);
881 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
882 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
883 return -1;
884 }
885 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
886
887 /* bts side */
888 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
889 cfg->transcoder_ports.base_port);
890 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
891 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
892 return -1;
893 }
894 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
895 }
896 }
897
898 return 0;
899}
900
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +0200901int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
902 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100903{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100904 int rc;
905 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100906
907 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200908 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100909 if (rc < 0) {
910 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
911 return rc;
912 }
913
914
915 if (!g_cfg->bts_ip)
916 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
917
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200918 if (!g_cfg->source_addr) {
919 fprintf(stderr, "You need to specify a bind address.\n");
920 return -1;
921 }
922
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100923 /* initialize the last ports */
924 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
925 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
926
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100927 if (allocate_trunk(&g_cfg->trunk) != 0) {
928 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100929 return -1;
930 }
931
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100932 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
933 if (allocate_trunk(trunk) != 0) {
934 LOGP(DMGCP, LOGL_ERROR,
935 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
936 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800937 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100938 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +0200939 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100940
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800941 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100942}
943