blob: 88d793f1ade5c6b900a37dc8e2646d3481f3cdbf [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",
330 "Add extra fmtp for the SDP file\n")
331{
332 char *txt = argv_concat(argv, argc, 0);
333 if (!txt)
334 return CMD_WARNING;
335
336 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
337 talloc_free(txt);
338 return CMD_SUCCESS;
339}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800340
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100341#define SDP_STR "SDP File related options\n"
342#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100343DEFUN(cfg_mgcp_sdp_payload_number,
344 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100345 "sdp audio-payload number <1-255>",
346 SDP_STR AUDIO_STR
347 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100348{
349 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100350 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100351 return CMD_SUCCESS;
352}
353
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100354ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
355 "sdp audio payload number <1-255>",
356 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
357
358
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100359DEFUN(cfg_mgcp_sdp_payload_name,
360 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100361 "sdp audio-payload name NAME",
362 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100363{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100364 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100365 return CMD_SUCCESS;
366}
367
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100368ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
369 "sdp audio payload name NAME",
370 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
371
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100372DEFUN(cfg_mgcp_loop,
373 cfg_mgcp_loop_cmd,
374 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100375 "Loop audio for all endpoints on main trunk\n"
376 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100377{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100378 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100379 return CMD_SUCCESS;
380}
381
382DEFUN(cfg_mgcp_number_endp,
383 cfg_mgcp_number_endp_cmd,
384 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100385 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100386{
387 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100388 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100389 return CMD_SUCCESS;
390}
391
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200392DEFUN(cfg_mgcp_omit_rtcp,
393 cfg_mgcp_omit_rtcp_cmd,
394 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200395 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200396{
397 g_cfg->trunk.omit_rtcp = 1;
398 return CMD_SUCCESS;
399}
400
401DEFUN(cfg_mgcp_no_omit_rtcp,
402 cfg_mgcp_no_omit_rtcp_cmd,
403 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200404 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200405{
406 g_cfg->trunk.omit_rtcp = 0;
407 return CMD_SUCCESS;
408}
409
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100410#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200411DEFUN(cfg_mgcp_agent_addr,
412 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100413 "call-agent ip A.B.C.D",
414 CALL_AGENT_STR IP_STR
415 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200416{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200417 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200418 return CMD_SUCCESS;
419}
420
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100421ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
422 "call agent ip A.B.C.D",
423 CALL_AGENT_STR CALL_AGENT_STR IP_STR
424 "IPv4 Address of the callagent\n")
425
426
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800427DEFUN(cfg_mgcp_transcoder,
428 cfg_mgcp_transcoder_cmd,
429 "transcoder-mgw A.B.C.D",
430 "Use a MGW to detranscoder RTP\n"
431 "The IP address of the MGW")
432{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200433 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800434 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
435
436 return CMD_SUCCESS;
437}
438
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100439DEFUN(cfg_mgcp_no_transcoder,
440 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100441 "no transcoder-mgw",
442 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100443{
444 if (g_cfg->transcoder_ip) {
445 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
446 talloc_free(g_cfg->transcoder_ip);
447 g_cfg->transcoder_ip = NULL;
448 }
449
450 return CMD_SUCCESS;
451}
452
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800453DEFUN(cfg_mgcp_transcoder_remote_base,
454 cfg_mgcp_transcoder_remote_base_cmd,
455 "transcoder-remote-base <0-65534>",
456 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
457{
458 g_cfg->transcoder_remote_base = atoi(argv[0]);
459 return CMD_SUCCESS;
460}
461
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100462DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
463 "trunk <1-64>",
464 "Configure a SS7 trunk\n" "Trunk Nr\n")
465{
466 struct mgcp_trunk_config *trunk;
467 int index = atoi(argv[0]);
468
469 trunk = mgcp_trunk_num(g_cfg, index);
470 if (!trunk)
471 trunk = mgcp_trunk_alloc(g_cfg, index);
472
473 if (!trunk) {
474 vty_out(vty, "%%Unable to allocate trunk %u.%s",
475 index, VTY_NEWLINE);
476 return CMD_WARNING;
477 }
478
479 vty->node = TRUNK_NODE;
480 vty->index = trunk;
481 return CMD_SUCCESS;
482}
483
484static int config_write_trunk(struct vty *vty)
485{
486 struct mgcp_trunk_config *trunk;
487
488 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
489 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100490 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100491 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100492 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100493 trunk->audio_name, VTY_NEWLINE);
494 vty_out(vty, " loop %d%s",
495 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200496 if (trunk->omit_rtcp)
497 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
498 else
499 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200500 if (trunk->audio_fmtp_extra)
501 vty_out(vty, " sdp audio fmtp-extra %s%s",
502 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100503 }
504
505 return CMD_SUCCESS;
506}
507
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200508DEFUN(cfg_trunk_sdp_fmtp_extra,
509 cfg_trunk_sdp_fmtp_extra_cmd,
510 "sdp audio fmtp-extra .NAME",
511 "Add extra fmtp for the SDP file\n")
512{
513 struct mgcp_trunk_config *trunk = vty->index;
514 char *txt = argv_concat(argv, argc, 0);
515 if (!txt)
516 return CMD_WARNING;
517
518 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
519 talloc_free(txt);
520 return CMD_SUCCESS;
521}
522
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100523DEFUN(cfg_trunk_payload_number,
524 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100525 "sdp audio-payload number <1-255>",
526 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100527{
528 struct mgcp_trunk_config *trunk = vty->index;
529 unsigned int payload = atoi(argv[0]);
530
531 trunk->audio_payload = payload;
532 return CMD_SUCCESS;
533}
534
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100535ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
536 "sdp audio payload number <1-255>",
537 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
538
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100539DEFUN(cfg_trunk_payload_name,
540 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100541 "sdp audio-payload name NAME",
542 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100543{
544 struct mgcp_trunk_config *trunk = vty->index;
545
546 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
547 return CMD_SUCCESS;
548}
549
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100550ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
551 "sdp audio payload name NAME",
552 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
553
554
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100555DEFUN(cfg_trunk_loop,
556 cfg_trunk_loop_cmd,
557 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100558 "Loop audio for all endpoints on this trunk\n"
559 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100560{
561 struct mgcp_trunk_config *trunk = vty->index;
562
563 trunk->audio_loop = atoi(argv[0]);
564 return CMD_SUCCESS;
565}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800566
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200567DEFUN(cfg_trunk_omit_rtcp,
568 cfg_trunk_omit_rtcp_cmd,
569 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200570 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200571{
572 struct mgcp_trunk_config *trunk = vty->index;
573 trunk->omit_rtcp = 1;
574 return CMD_SUCCESS;
575}
576
577DEFUN(cfg_trunk_no_omit_rtcp,
578 cfg_trunk_no_omit_rtcp_cmd,
579 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200580 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200581{
582 struct mgcp_trunk_config *trunk = vty->index;
583 trunk->omit_rtcp = 0;
584 return CMD_SUCCESS;
585}
586
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800587DEFUN(loop_endp,
588 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100589 "loop-endpoint <0-64> NAME (0|1)",
590 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800591 "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 +0800592{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100593 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800594 struct mgcp_endpoint *endp;
595
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100596 trunk = find_trunk(g_cfg, atoi(argv[0]));
597 if (!trunk) {
598 vty_out(vty, "%%Trunk %d not found in the config.%s",
599 atoi(argv[0]), VTY_NEWLINE);
600 return CMD_WARNING;
601 }
602
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100603 if (!trunk->endpoints) {
604 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
605 trunk->trunk_nr, VTY_NEWLINE);
606 return CMD_WARNING;
607 }
608
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100609 int endp_no = strtoul(argv[1], NULL, 16);
610 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800611 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100612 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800613 return CMD_WARNING;
614 }
615
616
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100617 endp = &trunk->endpoints[endp_no];
618 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800619
620 if (loop)
621 endp->conn_mode = MGCP_CONN_LOOPBACK;
622 else
623 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000624 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800625
626 return CMD_SUCCESS;
627}
628
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800629DEFUN(tap_call,
630 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100631 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
632 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800633 "The endpoint in hex\n"
634 "Forward the data coming from the bts\n"
635 "Forward the data coming from the bts leaving to the network\n"
636 "Forward the data coming from the net\n"
637 "Forward the data coming from the net leaving to the bts\n"
638 "destination IP of the data\n" "destination port\n")
639{
640 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100641 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800642 struct mgcp_endpoint *endp;
643 int port = 0;
644
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100645 trunk = find_trunk(g_cfg, atoi(argv[0]));
646 if (!trunk) {
647 vty_out(vty, "%%Trunk %d not found in the config.%s",
648 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800649 return CMD_WARNING;
650 }
651
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100652 if (!trunk->endpoints) {
653 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
654 trunk->trunk_nr, VTY_NEWLINE);
655 return CMD_WARNING;
656 }
657
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100658 int endp_no = strtoul(argv[1], NULL, 16);
659 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
660 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
661 argv[1], endp_no, VTY_NEWLINE);
662 return CMD_WARNING;
663 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800664
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100665 endp = &trunk->endpoints[endp_no];
666
667 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800668 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100669 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800670 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100671 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800672 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100673 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800674 port = MGCP_TAP_NET_OUT;
675 } else {
676 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
677 return CMD_WARNING;
678 }
679
680 tap = &endp->taps[port];
681 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100682 inet_aton(argv[3], &tap->forward.sin_addr);
683 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800684 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800685 return CMD_SUCCESS;
686}
687
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800688DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100689 "free-endpoint <0-64> NUMBER",
690 "Free the given endpoint\n" "Trunk number\n"
691 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800692{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100693 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800694 struct mgcp_endpoint *endp;
695
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100696 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);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800700 return CMD_WARNING;
701 }
702
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100703 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
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100709 int 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];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800717 mgcp_free_endp(endp);
718 return CMD_SUCCESS;
719}
720
Harald Welte6a857052012-01-27 00:41:39 +0100721DEFUN(reset_endp, reset_endp_cmd,
722 "reset-endpoint <0-64> NUMBER",
723 "Reset the given endpoint\n" "Trunk number\n"
724 "Endpoint number in hex.\n")
725{
726 struct mgcp_trunk_config *trunk;
727 struct mgcp_endpoint *endp;
728 int endp_no, rc;
729
730 trunk = find_trunk(g_cfg, atoi(argv[0]));
731 if (!trunk) {
732 vty_out(vty, "%%Trunk %d not found in the config.%s",
733 atoi(argv[0]), VTY_NEWLINE);
734 return CMD_WARNING;
735 }
736
737 if (!trunk->endpoints) {
738 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
739 trunk->trunk_nr, VTY_NEWLINE);
740 return CMD_WARNING;
741 }
742
743 endp_no = strtoul(argv[1], NULL, 16);
744 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
745 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
746 argv[1], endp_no, VTY_NEWLINE);
747 return CMD_WARNING;
748 }
749
750 endp = &trunk->endpoints[endp_no];
751 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
752 if (rc < 0) {
753 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
754 return CMD_WARNING;
755 }
756 return CMD_SUCCESS;
757}
758
759DEFUN(reset_all_endp, reset_all_endp_cmd,
760 "reset-all-endpoints",
761 "Reset all endpoints\n")
762{
763 int rc;
764
765 rc = mgcp_send_reset_all(g_cfg);
766 if (rc < 0) {
767 vty_out(vty, "Error %d during endpoint reset.%s",
768 rc, VTY_NEWLINE);
769 return CMD_WARNING;
770 }
771 return CMD_SUCCESS;
772}
773
774
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100775int mgcp_vty_init(void)
776{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800777 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800778 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800779 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800780 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +0100781 install_element(ENABLE_NODE, &reset_endp_cmd);
782 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100783
784 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
785 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800786
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100787 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200788 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200789 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100790 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
791 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
792 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
793 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
794 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
795 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800796 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800797 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800798 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
799 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800800 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
801 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800802 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800803 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200804 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100805 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800806 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100807 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800808 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100809 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
810 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100811 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
812 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100813 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
814 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200815 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
816 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200817 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100818
819 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
820 install_node(&trunk_node, config_write_trunk);
821 install_default(TRUNK_NODE);
822 install_element(TRUNK_NODE, &ournode_exit_cmd);
823 install_element(TRUNK_NODE, &ournode_end_cmd);
824 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
825 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100826 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
827 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100828 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200829 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
830 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200831 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100832
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100833 return 0;
834}
835
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100836static int allocate_trunk(struct mgcp_trunk_config *trunk)
837{
838 int i;
839 struct mgcp_config *cfg = trunk->cfg;
840
841 if (mgcp_endpoints_allocate(trunk) != 0) {
842 LOGP(DMGCP, LOGL_ERROR,
843 "Failed to allocate %d endpoints on trunk %d.\n",
844 trunk->number_endpoints, trunk->trunk_nr);
845 return -1;
846 }
847
848 /* early bind */
849 for (i = 1; i < trunk->number_endpoints; ++i) {
850 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100851
852 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100853 cfg->last_bts_port += 2;
854 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
855 LOGP(DMGCP, LOGL_FATAL,
856 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100857 return -1;
858 }
859 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
860 }
861
862 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100863 cfg->last_net_port += 2;
864 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
865 LOGP(DMGCP, LOGL_FATAL,
866 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100867 return -1;
868 }
869 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
870 }
871
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +0100872 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
873 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100874 int rtp_port;
875
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100876 /* network side */
877 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
878 cfg->transcoder_ports.base_port);
879 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
880 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
881 return -1;
882 }
883 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
884
885 /* bts side */
886 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
887 cfg->transcoder_ports.base_port);
888 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
889 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
890 return -1;
891 }
892 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
893 }
894 }
895
896 return 0;
897}
898
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100899int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
900{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100901 int rc;
902 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100903
904 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200905 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100906 if (rc < 0) {
907 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
908 return rc;
909 }
910
911
912 if (!g_cfg->bts_ip)
913 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
914
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200915 if (!g_cfg->source_addr) {
916 fprintf(stderr, "You need to specify a bind address.\n");
917 return -1;
918 }
919
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100920 /* initialize the last ports */
921 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
922 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
923
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100924 if (allocate_trunk(&g_cfg->trunk) != 0) {
925 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100926 return -1;
927 }
928
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100929 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
930 if (allocate_trunk(trunk) != 0) {
931 LOGP(DMGCP, LOGL_ERROR,
932 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
933 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800934 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100935 }
936
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800937 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100938}
939