blob: 5aeb3930e3b6919dfd7ddb7395661ed93397b26b [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
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100117static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
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);
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100142
143 if (verbose)
144 vty_out(vty,
145 " Timestamp Errs: BTS %d->%d, Net %d->%d%s",
146 endp->bts_state.in_stream.err_ts_counter,
147 endp->bts_state.out_stream.err_ts_counter,
148 endp->net_state.in_stream.err_ts_counter,
149 endp->net_state.out_stream.err_ts_counter,
150 VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100151 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100152}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100153
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100154DEFUN(show_mcgp, show_mgcp_cmd,
155 "show mgcp [stats]",
156 SHOW_STR
157 "Display information about the MGCP Media Gateway\n"
158 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100159{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100160 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100161 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100162
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100163 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100164
165 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100166 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100167
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100168 return CMD_SUCCESS;
169}
170
171DEFUN(cfg_mgcp,
172 cfg_mgcp_cmd,
173 "mgcp",
174 "Configure the MGCP")
175{
176 vty->node = MGCP_NODE;
177 return CMD_SUCCESS;
178}
179
180DEFUN(cfg_mgcp_local_ip,
181 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800182 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100183 "Local options for the SDP record\n"
184 IP_STR
185 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100186{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200187 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100188 return CMD_SUCCESS;
189}
190
191DEFUN(cfg_mgcp_bts_ip,
192 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800193 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100194 "BTS Audio source/destination options\n"
195 IP_STR
196 "IPv4 Address of the BTS\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->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100199 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
200 return CMD_SUCCESS;
201}
202
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100203#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100204DEFUN(cfg_mgcp_bind_ip,
205 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800206 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100207 BIND_STR
208 IP_STR
209 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100210{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200211 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100212 return CMD_SUCCESS;
213}
214
215DEFUN(cfg_mgcp_bind_port,
216 cfg_mgcp_bind_port_cmd,
217 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100218 BIND_STR
219 "Port information\n"
220 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100221{
222 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100223 g_cfg->source_port = port;
224 return CMD_SUCCESS;
225}
226
227DEFUN(cfg_mgcp_bind_early,
228 cfg_mgcp_bind_early_cmd,
229 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100230 BIND_STR
231 "Bind local ports on start up\n"
232 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100233{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800234 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
235 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100236}
237
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800238static void parse_base(struct mgcp_port_range *range, const char **argv)
239{
240 unsigned int port = atoi(argv[0]);
241 range->mode = PORT_ALLOC_STATIC;
242 range->base_port = port;
243}
244
245static void parse_range(struct mgcp_port_range *range, const char **argv)
246{
247 range->mode = PORT_ALLOC_DYNAMIC;
248 range->range_start = atoi(argv[0]);
249 range->range_end = atoi(argv[1]);
250 range->last_port = g_cfg->bts_ports.range_start;
251}
252
253
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100254#define RTP_STR "RTP configuration\n"
255#define BTS_START_STR "First UDP port allocated for the BTS side\n"
256#define NET_START_STR "First UDP port allocated for the NET side\n"
257#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800258DEFUN(cfg_mgcp_rtp_bts_base_port,
259 cfg_mgcp_rtp_bts_base_port_cmd,
260 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100261 RTP_STR
262 BTS_START_STR
263 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100264{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800265 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100266 return CMD_SUCCESS;
267}
268
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100269#define RANGE_START_STR "Start of the range of ports\n"
270#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800271DEFUN(cfg_mgcp_rtp_bts_range,
272 cfg_mgcp_rtp_bts_range_cmd,
273 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100274 RTP_STR "Range of ports to use for the BTS side\n"
275 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800276{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800277 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800278 return CMD_SUCCESS;
279}
280
281DEFUN(cfg_mgcp_rtp_net_range,
282 cfg_mgcp_rtp_net_range_cmd,
283 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100284 RTP_STR "Range of ports to use for the NET side\n"
285 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800286{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800287 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800288 return CMD_SUCCESS;
289}
290
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800291DEFUN(cfg_mgcp_rtp_net_base_port,
292 cfg_mgcp_rtp_net_base_port_cmd,
293 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100294 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800295{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800296 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800297 return CMD_SUCCESS;
298}
299
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800300ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100301 "rtp base <0-65534>",
302 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800303
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800304DEFUN(cfg_mgcp_rtp_transcoder_range,
305 cfg_mgcp_rtp_transcoder_range_cmd,
306 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100307 RTP_STR "Range of ports to use for the Transcoder\n"
308 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800309{
310 parse_range(&g_cfg->transcoder_ports, argv);
311 return CMD_SUCCESS;
312}
313
314DEFUN(cfg_mgcp_rtp_transcoder_base,
315 cfg_mgcp_rtp_transcoder_base_cmd,
316 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100317 RTP_STR "First UDP port allocated for the Transcoder side\n"
318 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800319{
320 parse_base(&g_cfg->transcoder_ports, argv);
321 return CMD_SUCCESS;
322}
323
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800324DEFUN(cfg_mgcp_rtp_ip_dscp,
325 cfg_mgcp_rtp_ip_dscp_cmd,
326 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100327 RTP_STR
328 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800329{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800330 int dscp = atoi(argv[0]);
331 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800332 return CMD_SUCCESS;
333}
334
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800335ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
336 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100337 RTP_STR
338 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800339
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200340DEFUN(cfg_mgcp_sdp_fmtp_extra,
341 cfg_mgcp_sdp_fmtp_extra_cmd,
342 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100343 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
344 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200345{
346 char *txt = argv_concat(argv, argc, 0);
347 if (!txt)
348 return CMD_WARNING;
349
350 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
351 talloc_free(txt);
352 return CMD_SUCCESS;
353}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800354
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100355#define SDP_STR "SDP File related options\n"
356#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100357DEFUN(cfg_mgcp_sdp_payload_number,
358 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100359 "sdp audio-payload number <1-255>",
360 SDP_STR AUDIO_STR
361 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100362{
363 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100364 g_cfg->trunk.audio_payload = payload;
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_number, cfg_mgcp_sdp_payload_number_cmd_old,
369 "sdp audio payload number <1-255>",
370 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
371
372
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100373DEFUN(cfg_mgcp_sdp_payload_name,
374 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100375 "sdp audio-payload name NAME",
376 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100377{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100378 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100379 return CMD_SUCCESS;
380}
381
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100382ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
383 "sdp audio payload name NAME",
384 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
385
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100386DEFUN(cfg_mgcp_loop,
387 cfg_mgcp_loop_cmd,
388 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100389 "Loop audio for all endpoints on main trunk\n"
390 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100391{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100392 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100393 return CMD_SUCCESS;
394}
395
396DEFUN(cfg_mgcp_number_endp,
397 cfg_mgcp_number_endp_cmd,
398 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100399 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100400{
401 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100402 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100403 return CMD_SUCCESS;
404}
405
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200406DEFUN(cfg_mgcp_omit_rtcp,
407 cfg_mgcp_omit_rtcp_cmd,
408 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200409 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200410{
411 g_cfg->trunk.omit_rtcp = 1;
412 return CMD_SUCCESS;
413}
414
415DEFUN(cfg_mgcp_no_omit_rtcp,
416 cfg_mgcp_no_omit_rtcp_cmd,
417 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200418 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200419{
420 g_cfg->trunk.omit_rtcp = 0;
421 return CMD_SUCCESS;
422}
423
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100424#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200425DEFUN(cfg_mgcp_agent_addr,
426 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100427 "call-agent ip A.B.C.D",
428 CALL_AGENT_STR IP_STR
429 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200430{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200431 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200432 return CMD_SUCCESS;
433}
434
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100435ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
436 "call agent ip A.B.C.D",
437 CALL_AGENT_STR CALL_AGENT_STR IP_STR
438 "IPv4 Address of the callagent\n")
439
440
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800441DEFUN(cfg_mgcp_transcoder,
442 cfg_mgcp_transcoder_cmd,
443 "transcoder-mgw A.B.C.D",
444 "Use a MGW to detranscoder RTP\n"
445 "The IP address of the MGW")
446{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200447 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800448 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
449
450 return CMD_SUCCESS;
451}
452
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100453DEFUN(cfg_mgcp_no_transcoder,
454 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100455 "no transcoder-mgw",
456 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100457{
458 if (g_cfg->transcoder_ip) {
459 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
460 talloc_free(g_cfg->transcoder_ip);
461 g_cfg->transcoder_ip = NULL;
462 }
463
464 return CMD_SUCCESS;
465}
466
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800467DEFUN(cfg_mgcp_transcoder_remote_base,
468 cfg_mgcp_transcoder_remote_base_cmd,
469 "transcoder-remote-base <0-65534>",
470 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
471{
472 g_cfg->transcoder_remote_base = atoi(argv[0]);
473 return CMD_SUCCESS;
474}
475
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100476DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
477 "trunk <1-64>",
478 "Configure a SS7 trunk\n" "Trunk Nr\n")
479{
480 struct mgcp_trunk_config *trunk;
481 int index = atoi(argv[0]);
482
483 trunk = mgcp_trunk_num(g_cfg, index);
484 if (!trunk)
485 trunk = mgcp_trunk_alloc(g_cfg, index);
486
487 if (!trunk) {
488 vty_out(vty, "%%Unable to allocate trunk %u.%s",
489 index, VTY_NEWLINE);
490 return CMD_WARNING;
491 }
492
493 vty->node = TRUNK_NODE;
494 vty->index = trunk;
495 return CMD_SUCCESS;
496}
497
498static int config_write_trunk(struct vty *vty)
499{
500 struct mgcp_trunk_config *trunk;
501
502 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
503 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100504 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100505 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100506 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100507 trunk->audio_name, VTY_NEWLINE);
508 vty_out(vty, " loop %d%s",
509 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200510 if (trunk->omit_rtcp)
511 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
512 else
513 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200514 if (trunk->audio_fmtp_extra)
515 vty_out(vty, " sdp audio fmtp-extra %s%s",
516 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100517 }
518
519 return CMD_SUCCESS;
520}
521
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200522DEFUN(cfg_trunk_sdp_fmtp_extra,
523 cfg_trunk_sdp_fmtp_extra_cmd,
524 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100525 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
526 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200527{
528 struct mgcp_trunk_config *trunk = vty->index;
529 char *txt = argv_concat(argv, argc, 0);
530 if (!txt)
531 return CMD_WARNING;
532
533 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
534 talloc_free(txt);
535 return CMD_SUCCESS;
536}
537
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100538DEFUN(cfg_trunk_payload_number,
539 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100540 "sdp audio-payload number <1-255>",
541 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100542{
543 struct mgcp_trunk_config *trunk = vty->index;
544 unsigned int payload = atoi(argv[0]);
545
546 trunk->audio_payload = payload;
547 return CMD_SUCCESS;
548}
549
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100550ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
551 "sdp audio payload number <1-255>",
552 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
553
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100554DEFUN(cfg_trunk_payload_name,
555 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100556 "sdp audio-payload name NAME",
557 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100558{
559 struct mgcp_trunk_config *trunk = vty->index;
560
561 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
562 return CMD_SUCCESS;
563}
564
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100565ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
566 "sdp audio payload name NAME",
567 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
568
569
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100570DEFUN(cfg_trunk_loop,
571 cfg_trunk_loop_cmd,
572 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100573 "Loop audio for all endpoints on this trunk\n"
574 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100575{
576 struct mgcp_trunk_config *trunk = vty->index;
577
578 trunk->audio_loop = atoi(argv[0]);
579 return CMD_SUCCESS;
580}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800581
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200582DEFUN(cfg_trunk_omit_rtcp,
583 cfg_trunk_omit_rtcp_cmd,
584 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200585 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200586{
587 struct mgcp_trunk_config *trunk = vty->index;
588 trunk->omit_rtcp = 1;
589 return CMD_SUCCESS;
590}
591
592DEFUN(cfg_trunk_no_omit_rtcp,
593 cfg_trunk_no_omit_rtcp_cmd,
594 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200595 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200596{
597 struct mgcp_trunk_config *trunk = vty->index;
598 trunk->omit_rtcp = 0;
599 return CMD_SUCCESS;
600}
601
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800602DEFUN(loop_endp,
603 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100604 "loop-endpoint <0-64> NAME (0|1)",
605 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800606 "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 +0800607{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100608 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800609 struct mgcp_endpoint *endp;
610
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100611 trunk = find_trunk(g_cfg, atoi(argv[0]));
612 if (!trunk) {
613 vty_out(vty, "%%Trunk %d not found in the config.%s",
614 atoi(argv[0]), VTY_NEWLINE);
615 return CMD_WARNING;
616 }
617
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100618 if (!trunk->endpoints) {
619 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
620 trunk->trunk_nr, VTY_NEWLINE);
621 return CMD_WARNING;
622 }
623
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100624 int endp_no = strtoul(argv[1], NULL, 16);
625 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800626 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100627 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800628 return CMD_WARNING;
629 }
630
631
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100632 endp = &trunk->endpoints[endp_no];
633 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800634
635 if (loop)
636 endp->conn_mode = MGCP_CONN_LOOPBACK;
637 else
638 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000639 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800640
641 return CMD_SUCCESS;
642}
643
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800644DEFUN(tap_call,
645 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100646 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
647 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800648 "The endpoint in hex\n"
649 "Forward the data coming from the bts\n"
650 "Forward the data coming from the bts leaving to the network\n"
651 "Forward the data coming from the net\n"
652 "Forward the data coming from the net leaving to the bts\n"
653 "destination IP of the data\n" "destination port\n")
654{
655 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100656 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800657 struct mgcp_endpoint *endp;
658 int port = 0;
659
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100660 trunk = find_trunk(g_cfg, atoi(argv[0]));
661 if (!trunk) {
662 vty_out(vty, "%%Trunk %d not found in the config.%s",
663 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800664 return CMD_WARNING;
665 }
666
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100667 if (!trunk->endpoints) {
668 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
669 trunk->trunk_nr, VTY_NEWLINE);
670 return CMD_WARNING;
671 }
672
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100673 int endp_no = strtoul(argv[1], NULL, 16);
674 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
675 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
676 argv[1], endp_no, VTY_NEWLINE);
677 return CMD_WARNING;
678 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800679
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100680 endp = &trunk->endpoints[endp_no];
681
682 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800683 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100684 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800685 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100686 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800687 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100688 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800689 port = MGCP_TAP_NET_OUT;
690 } else {
691 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
692 return CMD_WARNING;
693 }
694
695 tap = &endp->taps[port];
696 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100697 inet_aton(argv[3], &tap->forward.sin_addr);
698 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800699 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800700 return CMD_SUCCESS;
701}
702
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800703DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100704 "free-endpoint <0-64> NUMBER",
705 "Free the given endpoint\n" "Trunk number\n"
706 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800707{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100708 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800709 struct mgcp_endpoint *endp;
710
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100711 trunk = find_trunk(g_cfg, atoi(argv[0]));
712 if (!trunk) {
713 vty_out(vty, "%%Trunk %d not found in the config.%s",
714 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800715 return CMD_WARNING;
716 }
717
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100718 if (!trunk->endpoints) {
719 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
720 trunk->trunk_nr, VTY_NEWLINE);
721 return CMD_WARNING;
722 }
723
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100724 int endp_no = strtoul(argv[1], NULL, 16);
725 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
726 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
727 argv[1], endp_no, VTY_NEWLINE);
728 return CMD_WARNING;
729 }
730
731 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800732 mgcp_free_endp(endp);
733 return CMD_SUCCESS;
734}
735
Harald Welte6a857052012-01-27 00:41:39 +0100736DEFUN(reset_endp, reset_endp_cmd,
737 "reset-endpoint <0-64> NUMBER",
738 "Reset the given endpoint\n" "Trunk number\n"
739 "Endpoint number in hex.\n")
740{
741 struct mgcp_trunk_config *trunk;
742 struct mgcp_endpoint *endp;
743 int endp_no, rc;
744
745 trunk = find_trunk(g_cfg, atoi(argv[0]));
746 if (!trunk) {
747 vty_out(vty, "%%Trunk %d not found in the config.%s",
748 atoi(argv[0]), VTY_NEWLINE);
749 return CMD_WARNING;
750 }
751
752 if (!trunk->endpoints) {
753 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
754 trunk->trunk_nr, VTY_NEWLINE);
755 return CMD_WARNING;
756 }
757
758 endp_no = strtoul(argv[1], NULL, 16);
759 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
760 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
761 argv[1], endp_no, VTY_NEWLINE);
762 return CMD_WARNING;
763 }
764
765 endp = &trunk->endpoints[endp_no];
766 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
767 if (rc < 0) {
768 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
769 return CMD_WARNING;
770 }
771 return CMD_SUCCESS;
772}
773
774DEFUN(reset_all_endp, reset_all_endp_cmd,
775 "reset-all-endpoints",
776 "Reset all endpoints\n")
777{
778 int rc;
779
780 rc = mgcp_send_reset_all(g_cfg);
781 if (rc < 0) {
782 vty_out(vty, "Error %d during endpoint reset.%s",
783 rc, VTY_NEWLINE);
784 return CMD_WARNING;
785 }
786 return CMD_SUCCESS;
787}
788
789
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100790int mgcp_vty_init(void)
791{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800792 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800793 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800794 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800795 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +0100796 install_element(ENABLE_NODE, &reset_endp_cmd);
797 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100798
799 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
800 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800801
Jacob Erlbeck36722e12013-10-29 09:30:30 +0100802 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100803 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
804 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
805 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
806 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
807 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
808 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800809 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800810 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800811 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
812 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800813 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
814 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800815 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800816 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200817 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100818 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800819 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100820 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800821 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100822 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
823 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100824 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
825 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100826 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
827 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200828 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
829 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200830 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100831
832 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
833 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +0100834 vty_install_default(TRUNK_NODE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100835 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
836 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100837 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
838 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100839 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200840 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
841 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200842 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100843
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100844 return 0;
845}
846
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100847static int allocate_trunk(struct mgcp_trunk_config *trunk)
848{
849 int i;
850 struct mgcp_config *cfg = trunk->cfg;
851
852 if (mgcp_endpoints_allocate(trunk) != 0) {
853 LOGP(DMGCP, LOGL_ERROR,
854 "Failed to allocate %d endpoints on trunk %d.\n",
855 trunk->number_endpoints, trunk->trunk_nr);
856 return -1;
857 }
858
859 /* early bind */
860 for (i = 1; i < trunk->number_endpoints; ++i) {
861 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100862
863 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100864 cfg->last_bts_port += 2;
865 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
866 LOGP(DMGCP, LOGL_FATAL,
867 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100868 return -1;
869 }
870 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
871 }
872
873 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100874 cfg->last_net_port += 2;
875 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
876 LOGP(DMGCP, LOGL_FATAL,
877 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100878 return -1;
879 }
880 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
881 }
882
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +0100883 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
884 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100885 int rtp_port;
886
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100887 /* network side */
888 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
889 cfg->transcoder_ports.base_port);
890 if (mgcp_bind_trans_net_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_net.local_alloc = PORT_ALLOC_STATIC;
895
896 /* bts side */
897 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
898 cfg->transcoder_ports.base_port);
899 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
900 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
901 return -1;
902 }
903 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
904 }
905 }
906
907 return 0;
908}
909
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +0200910int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
911 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100912{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100913 int rc;
914 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100915
916 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200917 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100918 if (rc < 0) {
919 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
920 return rc;
921 }
922
923
924 if (!g_cfg->bts_ip)
925 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
926
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200927 if (!g_cfg->source_addr) {
928 fprintf(stderr, "You need to specify a bind address.\n");
929 return -1;
930 }
931
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100932 /* initialize the last ports */
933 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
934 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
935
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100936 if (allocate_trunk(&g_cfg->trunk) != 0) {
937 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100938 return -1;
939 }
940
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100941 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
942 if (allocate_trunk(trunk) != 0) {
943 LOGP(DMGCP, LOGL_ERROR,
944 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
945 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800946 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100947 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +0200948 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100949
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800950 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100951}
952