blob: e9b7d1227d7304f30d4626b89b25896bd40c3795 [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"
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +010034#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +010035#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +020036
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010037static struct mgcp_config *g_cfg = NULL;
38
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010039static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010040{
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010041 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010042
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010043 if (nr == 0)
44 trunk = &cfg->trunk;
45 else
46 trunk = mgcp_trunk_num(cfg, nr);
47
48 return trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010049}
50
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010051/*
52 * vty code for mgcp below
53 */
54struct cmd_node mgcp_node = {
55 MGCP_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020056 "%s(config-mgcp)# ",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010057 1,
58};
59
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010060struct cmd_node trunk_node = {
61 TRUNK_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020062 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010063 1,
64};
65
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010066static int config_write_mgcp(struct vty *vty)
67{
68 vty_out(vty, "mgcp%s", VTY_NEWLINE);
69 if (g_cfg->local_ip)
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020070 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
71 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010072 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
73 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
74 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080075
76 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
77 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 +080078 else
79 vty_out(vty, " rtp bts-range %u %u%s",
80 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
81
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080082 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
83 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 +080084 else
85 vty_out(vty, " rtp net-range %u %u%s",
86 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
87
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +080088 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +010089 if (g_cfg->trunk.keepalive_interval == MGCP_KEEPALIVE_ONCE)
90 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
91 else if (g_cfg->trunk.keepalive_interval)
92 vty_out(vty, " rtp keep-alive %d%s",
93 g_cfg->trunk.keepalive_interval, VTY_NEWLINE);
94 else
95 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
96
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +020097 if (g_cfg->trunk.omit_rtcp)
98 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
99 else
100 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100101 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100102 vty_out(vty, " %srtp-patch ssrc%s",
103 g_cfg->trunk.force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
104 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100105 g_cfg->trunk.force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100106 } else
107 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100108 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100109 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100110 g_cfg->trunk.audio_payload, VTY_NEWLINE);
111 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100112 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100113 g_cfg->trunk.audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200114 if (g_cfg->trunk.audio_fmtp_extra)
115 vty_out(vty, " sdp audio fmtp-extra %s%s",
116 g_cfg->trunk.audio_fmtp_extra, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100117 vty_out(vty, " %ssdp audio-payload send-ptime%s",
118 g_cfg->trunk.audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100119 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
120 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200121 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100122 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800123 if (g_cfg->transcoder_ip)
124 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100125
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800126 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
127 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
128 else
129 vty_out(vty, " rtp transcoder-range %u %u%s",
130 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800131 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100132 vty_out(vty, " osmux %s%s",
133 g_cfg->osmux == 1 ? "on" : "off", VTY_NEWLINE);
134 vty_out(vty, " osmux batch-factor %d%s",
135 g_cfg->osmux_batch, VTY_NEWLINE);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800136
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100137 return CMD_SUCCESS;
138}
139
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100140static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100141{
142 int i;
143
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100144 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
145 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
146 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
147
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100148 if (!cfg->endpoints) {
149 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
150 return;
151 }
152
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100153 for (i = 1; i < cfg->number_endpoints; ++i) {
154 struct mgcp_endpoint *endp = &cfg->endpoints[i];
155 vty_out(vty,
156 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200157 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100158 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800159 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
160 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
161 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200162 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100163 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200164 VTY_NEWLINE);
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100165
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100166 if (verbose) {
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100167 vty_out(vty,
168 " Timestamp Errs: BTS %d->%d, Net %d->%d%s",
169 endp->bts_state.in_stream.err_ts_counter,
170 endp->bts_state.out_stream.err_ts_counter,
171 endp->net_state.in_stream.err_ts_counter,
172 endp->net_state.out_stream.err_ts_counter,
173 VTY_NEWLINE);
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100174 vty_out(vty,
175 " Dropped Packets: Net->BTS %d, BTS->Net %d%s",
176 endp->bts_end.dropped_packets,
177 endp->net_end.dropped_packets,
178 VTY_NEWLINE);
179 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100180 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100181}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100182
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100183DEFUN(show_mcgp, show_mgcp_cmd,
184 "show mgcp [stats]",
185 SHOW_STR
186 "Display information about the MGCP Media Gateway\n"
187 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100188{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100189 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100190 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100191
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100192 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100193
194 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100195 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100196
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100197 return CMD_SUCCESS;
198}
199
200DEFUN(cfg_mgcp,
201 cfg_mgcp_cmd,
202 "mgcp",
203 "Configure the MGCP")
204{
205 vty->node = MGCP_NODE;
206 return CMD_SUCCESS;
207}
208
209DEFUN(cfg_mgcp_local_ip,
210 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800211 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100212 "Local options for the SDP record\n"
213 IP_STR
214 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100215{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200216 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100217 return CMD_SUCCESS;
218}
219
220DEFUN(cfg_mgcp_bts_ip,
221 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800222 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100223 "BTS Audio source/destination options\n"
224 IP_STR
225 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100226{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200227 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100228 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
229 return CMD_SUCCESS;
230}
231
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100232#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100233DEFUN(cfg_mgcp_bind_ip,
234 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800235 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100236 BIND_STR
237 IP_STR
238 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100239{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200240 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100241 return CMD_SUCCESS;
242}
243
244DEFUN(cfg_mgcp_bind_port,
245 cfg_mgcp_bind_port_cmd,
246 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100247 BIND_STR
248 "Port information\n"
249 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100250{
251 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100252 g_cfg->source_port = port;
253 return CMD_SUCCESS;
254}
255
256DEFUN(cfg_mgcp_bind_early,
257 cfg_mgcp_bind_early_cmd,
258 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100259 BIND_STR
260 "Bind local ports on start up\n"
261 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100262{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800263 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
264 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100265}
266
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800267static void parse_base(struct mgcp_port_range *range, const char **argv)
268{
269 unsigned int port = atoi(argv[0]);
270 range->mode = PORT_ALLOC_STATIC;
271 range->base_port = port;
272}
273
274static void parse_range(struct mgcp_port_range *range, const char **argv)
275{
276 range->mode = PORT_ALLOC_DYNAMIC;
277 range->range_start = atoi(argv[0]);
278 range->range_end = atoi(argv[1]);
279 range->last_port = g_cfg->bts_ports.range_start;
280}
281
282
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100283#define RTP_STR "RTP configuration\n"
284#define BTS_START_STR "First UDP port allocated for the BTS side\n"
285#define NET_START_STR "First UDP port allocated for the NET side\n"
286#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800287DEFUN(cfg_mgcp_rtp_bts_base_port,
288 cfg_mgcp_rtp_bts_base_port_cmd,
289 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100290 RTP_STR
291 BTS_START_STR
292 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100293{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800294 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100295 return CMD_SUCCESS;
296}
297
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100298#define RANGE_START_STR "Start of the range of ports\n"
299#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800300DEFUN(cfg_mgcp_rtp_bts_range,
301 cfg_mgcp_rtp_bts_range_cmd,
302 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100303 RTP_STR "Range of ports to use for the BTS side\n"
304 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800305{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800306 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800307 return CMD_SUCCESS;
308}
309
310DEFUN(cfg_mgcp_rtp_net_range,
311 cfg_mgcp_rtp_net_range_cmd,
312 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100313 RTP_STR "Range of ports to use for the NET side\n"
314 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800315{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800316 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800317 return CMD_SUCCESS;
318}
319
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800320DEFUN(cfg_mgcp_rtp_net_base_port,
321 cfg_mgcp_rtp_net_base_port_cmd,
322 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100323 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800324{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800325 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800326 return CMD_SUCCESS;
327}
328
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800329ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100330 "rtp base <0-65534>",
331 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800332
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800333DEFUN(cfg_mgcp_rtp_transcoder_range,
334 cfg_mgcp_rtp_transcoder_range_cmd,
335 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100336 RTP_STR "Range of ports to use for the Transcoder\n"
337 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800338{
339 parse_range(&g_cfg->transcoder_ports, argv);
340 return CMD_SUCCESS;
341}
342
343DEFUN(cfg_mgcp_rtp_transcoder_base,
344 cfg_mgcp_rtp_transcoder_base_cmd,
345 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100346 RTP_STR "First UDP port allocated for the Transcoder side\n"
347 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800348{
349 parse_base(&g_cfg->transcoder_ports, argv);
350 return CMD_SUCCESS;
351}
352
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800353DEFUN(cfg_mgcp_rtp_ip_dscp,
354 cfg_mgcp_rtp_ip_dscp_cmd,
355 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100356 RTP_STR
357 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800358{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800359 int dscp = atoi(argv[0]);
360 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800361 return CMD_SUCCESS;
362}
363
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800364ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
365 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100366 RTP_STR
367 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800368
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200369DEFUN(cfg_mgcp_sdp_fmtp_extra,
370 cfg_mgcp_sdp_fmtp_extra_cmd,
371 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100372 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
373 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200374{
375 char *txt = argv_concat(argv, argc, 0);
376 if (!txt)
377 return CMD_WARNING;
378
379 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
380 talloc_free(txt);
381 return CMD_SUCCESS;
382}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800383
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100384#define SDP_STR "SDP File related options\n"
385#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100386DEFUN(cfg_mgcp_sdp_payload_number,
387 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100388 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100389 SDP_STR AUDIO_STR
390 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100391{
392 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100393 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100394 return CMD_SUCCESS;
395}
396
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100397ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100398 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100399 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
400
401
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100402DEFUN(cfg_mgcp_sdp_payload_name,
403 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100404 "sdp audio-payload name NAME",
405 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100406{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100407 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100408 return CMD_SUCCESS;
409}
410
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100411ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
412 "sdp audio payload name NAME",
413 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
414
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100415DEFUN(cfg_mgcp_sdp_payload_send_ptime,
416 cfg_mgcp_sdp_payload_send_ptime_cmd,
417 "sdp audio-payload send-ptime",
418 SDP_STR AUDIO_STR
419 "Send SDP ptime (packet duration) attribute\n")
420{
421 g_cfg->trunk.audio_send_ptime = 1;
422 return CMD_SUCCESS;
423}
424
425DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
426 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
427 "no sdp audio-payload send-ptime",
428 NO_STR SDP_STR AUDIO_STR
429 "Send SDP ptime (packet duration) attribute\n")
430{
431 g_cfg->trunk.audio_send_ptime = 0;
432 return CMD_SUCCESS;
433}
434
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100435DEFUN(cfg_mgcp_loop,
436 cfg_mgcp_loop_cmd,
437 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100438 "Loop audio for all endpoints on main trunk\n"
439 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100440{
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100441 if (g_cfg->osmux) {
442 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
443 return CMD_WARNING;
444 }
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100445 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100446 return CMD_SUCCESS;
447}
448
449DEFUN(cfg_mgcp_number_endp,
450 cfg_mgcp_number_endp_cmd,
451 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100452 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100453{
454 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100455 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100456 return CMD_SUCCESS;
457}
458
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200459DEFUN(cfg_mgcp_omit_rtcp,
460 cfg_mgcp_omit_rtcp_cmd,
461 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200462 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200463{
464 g_cfg->trunk.omit_rtcp = 1;
465 return CMD_SUCCESS;
466}
467
468DEFUN(cfg_mgcp_no_omit_rtcp,
469 cfg_mgcp_no_omit_rtcp_cmd,
470 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200471 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200472{
473 g_cfg->trunk.omit_rtcp = 0;
474 return CMD_SUCCESS;
475}
476
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100477DEFUN(cfg_mgcp_patch_rtp_ssrc,
478 cfg_mgcp_patch_rtp_ssrc_cmd,
479 "rtp-patch ssrc",
480 RTP_PATCH_STR
481 "Force a fixed SSRC\n"
482 )
483{
484 g_cfg->trunk.force_constant_ssrc = 1;
485 return CMD_SUCCESS;
486}
487
488DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
489 cfg_mgcp_no_patch_rtp_ssrc_cmd,
490 "no rtp-patch ssrc",
491 NO_STR RTP_PATCH_STR
492 "Force a fixed SSRC\n"
493 )
494{
495 g_cfg->trunk.force_constant_ssrc = 0;
496 return CMD_SUCCESS;
497}
498
499DEFUN(cfg_mgcp_patch_rtp_ts,
500 cfg_mgcp_patch_rtp_ts_cmd,
501 "rtp-patch timestamp",
502 RTP_PATCH_STR
503 "Adjust RTP timestamp\n"
504 )
505{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100506 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100507 return CMD_SUCCESS;
508}
509
510DEFUN(cfg_mgcp_no_patch_rtp_ts,
511 cfg_mgcp_no_patch_rtp_ts_cmd,
512 "no rtp-patch timestamp",
513 NO_STR RTP_PATCH_STR
514 "Adjust RTP timestamp\n"
515 )
516{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100517 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100518 return CMD_SUCCESS;
519}
520
521DEFUN(cfg_mgcp_no_patch_rtp,
522 cfg_mgcp_no_patch_rtp_cmd,
523 "no rtp-patch",
524 NO_STR RTP_PATCH_STR)
525{
526 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100527 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100528 return CMD_SUCCESS;
529}
530
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100531DEFUN(cfg_mgcp_rtp_keepalive,
532 cfg_mgcp_rtp_keepalive_cmd,
533 "rtp keep-alive <1-120>",
534 RTP_STR RTP_KEEPALIVE_STR
535 "Keep alive interval in secs\n"
536 )
537{
538 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
539 return CMD_SUCCESS;
540}
541
542DEFUN(cfg_mgcp_rtp_keepalive_once,
543 cfg_mgcp_rtp_keepalive_once_cmd,
544 "rtp keep-alive once",
545 RTP_STR RTP_KEEPALIVE_STR
546 "Send dummy packet only once after CRCX/MDCX\n"
547 )
548{
549 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
550 return CMD_SUCCESS;
551}
552
553DEFUN(cfg_mgcp_no_rtp_keepalive,
554 cfg_mgcp_no_rtp_keepalive_cmd,
555 "no rtp keep-alive",
556 NO_STR RTP_STR RTP_KEEPALIVE_STR
557 )
558{
559 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
560 return CMD_SUCCESS;
561}
562
563
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100564
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100565#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200566DEFUN(cfg_mgcp_agent_addr,
567 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100568 "call-agent ip A.B.C.D",
569 CALL_AGENT_STR IP_STR
570 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200571{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200572 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200573 return CMD_SUCCESS;
574}
575
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100576ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
577 "call agent ip A.B.C.D",
578 CALL_AGENT_STR CALL_AGENT_STR IP_STR
579 "IPv4 Address of the callagent\n")
580
581
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800582DEFUN(cfg_mgcp_transcoder,
583 cfg_mgcp_transcoder_cmd,
584 "transcoder-mgw A.B.C.D",
585 "Use a MGW to detranscoder RTP\n"
586 "The IP address of the MGW")
587{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200588 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800589 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
590
591 return CMD_SUCCESS;
592}
593
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100594DEFUN(cfg_mgcp_no_transcoder,
595 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100596 "no transcoder-mgw",
597 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100598{
599 if (g_cfg->transcoder_ip) {
600 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
601 talloc_free(g_cfg->transcoder_ip);
602 g_cfg->transcoder_ip = NULL;
603 }
604
605 return CMD_SUCCESS;
606}
607
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800608DEFUN(cfg_mgcp_transcoder_remote_base,
609 cfg_mgcp_transcoder_remote_base_cmd,
610 "transcoder-remote-base <0-65534>",
611 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
612{
613 g_cfg->transcoder_remote_base = atoi(argv[0]);
614 return CMD_SUCCESS;
615}
616
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100617DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
618 "trunk <1-64>",
619 "Configure a SS7 trunk\n" "Trunk Nr\n")
620{
621 struct mgcp_trunk_config *trunk;
622 int index = atoi(argv[0]);
623
624 trunk = mgcp_trunk_num(g_cfg, index);
625 if (!trunk)
626 trunk = mgcp_trunk_alloc(g_cfg, index);
627
628 if (!trunk) {
629 vty_out(vty, "%%Unable to allocate trunk %u.%s",
630 index, VTY_NEWLINE);
631 return CMD_WARNING;
632 }
633
634 vty->node = TRUNK_NODE;
635 vty->index = trunk;
636 return CMD_SUCCESS;
637}
638
639static int config_write_trunk(struct vty *vty)
640{
641 struct mgcp_trunk_config *trunk;
642
643 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
644 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100645 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100646 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100647 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100648 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100649 vty_out(vty, " %ssdp audio-payload send-ptime%s",
650 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100651
652 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
653 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
654 else if (trunk->keepalive_interval)
655 vty_out(vty, " rtp keep-alive %d%s",
656 trunk->keepalive_interval, VTY_NEWLINE);
657 else
658 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
659
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100660 vty_out(vty, " loop %d%s",
661 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200662 if (trunk->omit_rtcp)
663 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
664 else
665 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100666 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100667 vty_out(vty, " %srtp-patch ssrc%s",
668 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
669 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100670 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100671 } else
672 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200673 if (trunk->audio_fmtp_extra)
674 vty_out(vty, " sdp audio fmtp-extra %s%s",
675 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100676 }
677
678 return CMD_SUCCESS;
679}
680
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200681DEFUN(cfg_trunk_sdp_fmtp_extra,
682 cfg_trunk_sdp_fmtp_extra_cmd,
683 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100684 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
685 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200686{
687 struct mgcp_trunk_config *trunk = vty->index;
688 char *txt = argv_concat(argv, argc, 0);
689 if (!txt)
690 return CMD_WARNING;
691
692 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
693 talloc_free(txt);
694 return CMD_SUCCESS;
695}
696
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100697DEFUN(cfg_trunk_payload_number,
698 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100699 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100700 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100701{
702 struct mgcp_trunk_config *trunk = vty->index;
703 unsigned int payload = atoi(argv[0]);
704
705 trunk->audio_payload = payload;
706 return CMD_SUCCESS;
707}
708
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100709ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100710 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100711 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
712
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100713DEFUN(cfg_trunk_payload_name,
714 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100715 "sdp audio-payload name NAME",
716 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100717{
718 struct mgcp_trunk_config *trunk = vty->index;
719
720 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
721 return CMD_SUCCESS;
722}
723
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100724ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
725 "sdp audio payload name NAME",
726 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
727
728
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100729DEFUN(cfg_trunk_loop,
730 cfg_trunk_loop_cmd,
731 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100732 "Loop audio for all endpoints on this trunk\n"
733 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100734{
735 struct mgcp_trunk_config *trunk = vty->index;
736
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100737 if (g_cfg->osmux) {
738 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
739 return CMD_WARNING;
740 }
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100741 trunk->audio_loop = atoi(argv[0]);
742 return CMD_SUCCESS;
743}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800744
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100745DEFUN(cfg_trunk_sdp_payload_send_ptime,
746 cfg_trunk_sdp_payload_send_ptime_cmd,
747 "sdp audio-payload send-ptime",
748 SDP_STR AUDIO_STR
749 "Send SDP ptime (packet duration) attribute\n")
750{
751 struct mgcp_trunk_config *trunk = vty->index;
752 trunk->audio_send_ptime = 1;
753 return CMD_SUCCESS;
754}
755
756DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
757 cfg_trunk_no_sdp_payload_send_ptime_cmd,
758 "no sdp audio-payload send-ptime",
759 NO_STR SDP_STR AUDIO_STR
760 "Send SDP ptime (packet duration) attribute\n")
761{
762 struct mgcp_trunk_config *trunk = vty->index;
763 trunk->audio_send_ptime = 0;
764 return CMD_SUCCESS;
765}
766
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200767DEFUN(cfg_trunk_omit_rtcp,
768 cfg_trunk_omit_rtcp_cmd,
769 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200770 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200771{
772 struct mgcp_trunk_config *trunk = vty->index;
773 trunk->omit_rtcp = 1;
774 return CMD_SUCCESS;
775}
776
777DEFUN(cfg_trunk_no_omit_rtcp,
778 cfg_trunk_no_omit_rtcp_cmd,
779 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200780 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200781{
782 struct mgcp_trunk_config *trunk = vty->index;
783 trunk->omit_rtcp = 0;
784 return CMD_SUCCESS;
785}
786
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100787DEFUN(cfg_trunk_patch_rtp_ssrc,
788 cfg_trunk_patch_rtp_ssrc_cmd,
789 "rtp-patch ssrc",
790 RTP_PATCH_STR
791 "Force a fixed SSRC\n"
792 )
793{
794 struct mgcp_trunk_config *trunk = vty->index;
795 trunk->force_constant_ssrc = 1;
796 return CMD_SUCCESS;
797}
798
799DEFUN(cfg_trunk_no_patch_rtp_ssrc,
800 cfg_trunk_no_patch_rtp_ssrc_cmd,
801 "no rtp-patch ssrc",
802 NO_STR RTP_PATCH_STR
803 "Force a fixed SSRC\n"
804 )
805{
806 struct mgcp_trunk_config *trunk = vty->index;
807 trunk->force_constant_ssrc = 0;
808 return CMD_SUCCESS;
809}
810
811DEFUN(cfg_trunk_patch_rtp_ts,
812 cfg_trunk_patch_rtp_ts_cmd,
813 "rtp-patch timestamp",
814 RTP_PATCH_STR
815 "Adjust RTP timestamp\n"
816 )
817{
818 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100819 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100820 return CMD_SUCCESS;
821}
822
823DEFUN(cfg_trunk_no_patch_rtp_ts,
824 cfg_trunk_no_patch_rtp_ts_cmd,
825 "no rtp-patch timestamp",
826 NO_STR RTP_PATCH_STR
827 "Adjust RTP timestamp\n"
828 )
829{
830 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100831 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100832 return CMD_SUCCESS;
833}
834
835DEFUN(cfg_trunk_no_patch_rtp,
836 cfg_trunk_no_patch_rtp_cmd,
837 "no rtp-patch",
838 NO_STR RTP_PATCH_STR)
839{
840 struct mgcp_trunk_config *trunk = vty->index;
841 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100842 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100843 return CMD_SUCCESS;
844}
845
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100846DEFUN(cfg_trunk_rtp_keepalive,
847 cfg_trunk_rtp_keepalive_cmd,
848 "rtp keep-alive <1-120>",
849 RTP_STR RTP_KEEPALIVE_STR
850 "Keep-alive interval in secs\n"
851 )
852{
853 struct mgcp_trunk_config *trunk = vty->index;
854 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
855 return CMD_SUCCESS;
856}
857
858DEFUN(cfg_trunk_rtp_keepalive_once,
859 cfg_trunk_rtp_keepalive_once_cmd,
860 "rtp keep-alive once",
861 RTP_STR RTP_KEEPALIVE_STR
862 "Send dummy packet only once after CRCX/MDCX\n"
863 )
864{
865 struct mgcp_trunk_config *trunk = vty->index;
866 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
867 return CMD_SUCCESS;
868}
869
870DEFUN(cfg_trunk_no_rtp_keepalive,
871 cfg_trunk_no_rtp_keepalive_cmd,
872 "no rtp keep-alive",
873 NO_STR RTP_STR RTP_KEEPALIVE_STR
874 )
875{
876 struct mgcp_trunk_config *trunk = vty->index;
877 mgcp_trunk_set_keepalive(trunk, 0);
878 return CMD_SUCCESS;
879}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100880
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800881DEFUN(loop_endp,
882 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100883 "loop-endpoint <0-64> NAME (0|1)",
884 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800885 "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 +0800886{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100887 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800888 struct mgcp_endpoint *endp;
889
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100890 trunk = find_trunk(g_cfg, atoi(argv[0]));
891 if (!trunk) {
892 vty_out(vty, "%%Trunk %d not found in the config.%s",
893 atoi(argv[0]), VTY_NEWLINE);
894 return CMD_WARNING;
895 }
896
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100897 if (!trunk->endpoints) {
898 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
899 trunk->trunk_nr, VTY_NEWLINE);
900 return CMD_WARNING;
901 }
902
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100903 int endp_no = strtoul(argv[1], NULL, 16);
904 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800905 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100906 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800907 return CMD_WARNING;
908 }
909
910
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100911 endp = &trunk->endpoints[endp_no];
912 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800913
914 if (loop)
915 endp->conn_mode = MGCP_CONN_LOOPBACK;
916 else
917 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100918
919 /* Handle it like a MDCX, switch on SSRC patching if enabled */
920 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
921 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800922
923 return CMD_SUCCESS;
924}
925
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800926DEFUN(tap_call,
927 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100928 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
929 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800930 "The endpoint in hex\n"
931 "Forward the data coming from the bts\n"
932 "Forward the data coming from the bts leaving to the network\n"
933 "Forward the data coming from the net\n"
934 "Forward the data coming from the net leaving to the bts\n"
935 "destination IP of the data\n" "destination port\n")
936{
937 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100938 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800939 struct mgcp_endpoint *endp;
940 int port = 0;
941
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100942 trunk = find_trunk(g_cfg, atoi(argv[0]));
943 if (!trunk) {
944 vty_out(vty, "%%Trunk %d not found in the config.%s",
945 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800946 return CMD_WARNING;
947 }
948
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100949 if (!trunk->endpoints) {
950 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
951 trunk->trunk_nr, VTY_NEWLINE);
952 return CMD_WARNING;
953 }
954
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100955 int endp_no = strtoul(argv[1], NULL, 16);
956 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
957 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
958 argv[1], endp_no, VTY_NEWLINE);
959 return CMD_WARNING;
960 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800961
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100962 endp = &trunk->endpoints[endp_no];
963
964 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800965 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100966 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800967 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100968 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800969 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100970 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800971 port = MGCP_TAP_NET_OUT;
972 } else {
973 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
974 return CMD_WARNING;
975 }
976
977 tap = &endp->taps[port];
978 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100979 inet_aton(argv[3], &tap->forward.sin_addr);
980 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800981 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800982 return CMD_SUCCESS;
983}
984
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800985DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100986 "free-endpoint <0-64> NUMBER",
987 "Free the given endpoint\n" "Trunk number\n"
988 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800989{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100990 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800991 struct mgcp_endpoint *endp;
992
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100993 trunk = find_trunk(g_cfg, atoi(argv[0]));
994 if (!trunk) {
995 vty_out(vty, "%%Trunk %d not found in the config.%s",
996 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800997 return CMD_WARNING;
998 }
999
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001000 if (!trunk->endpoints) {
1001 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1002 trunk->trunk_nr, VTY_NEWLINE);
1003 return CMD_WARNING;
1004 }
1005
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001006 int endp_no = strtoul(argv[1], NULL, 16);
1007 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1008 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1009 argv[1], endp_no, VTY_NEWLINE);
1010 return CMD_WARNING;
1011 }
1012
1013 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001014 mgcp_free_endp(endp);
1015 return CMD_SUCCESS;
1016}
1017
Harald Welte6a857052012-01-27 00:41:39 +01001018DEFUN(reset_endp, reset_endp_cmd,
1019 "reset-endpoint <0-64> NUMBER",
1020 "Reset the given endpoint\n" "Trunk number\n"
1021 "Endpoint number in hex.\n")
1022{
1023 struct mgcp_trunk_config *trunk;
1024 struct mgcp_endpoint *endp;
1025 int endp_no, rc;
1026
1027 trunk = find_trunk(g_cfg, atoi(argv[0]));
1028 if (!trunk) {
1029 vty_out(vty, "%%Trunk %d not found in the config.%s",
1030 atoi(argv[0]), VTY_NEWLINE);
1031 return CMD_WARNING;
1032 }
1033
1034 if (!trunk->endpoints) {
1035 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1036 trunk->trunk_nr, VTY_NEWLINE);
1037 return CMD_WARNING;
1038 }
1039
1040 endp_no = strtoul(argv[1], NULL, 16);
1041 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1042 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1043 argv[1], endp_no, VTY_NEWLINE);
1044 return CMD_WARNING;
1045 }
1046
1047 endp = &trunk->endpoints[endp_no];
1048 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1049 if (rc < 0) {
1050 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1051 return CMD_WARNING;
1052 }
1053 return CMD_SUCCESS;
1054}
1055
1056DEFUN(reset_all_endp, reset_all_endp_cmd,
1057 "reset-all-endpoints",
1058 "Reset all endpoints\n")
1059{
1060 int rc;
1061
1062 rc = mgcp_send_reset_all(g_cfg);
1063 if (rc < 0) {
1064 vty_out(vty, "Error %d during endpoint reset.%s",
1065 rc, VTY_NEWLINE);
1066 return CMD_WARNING;
1067 }
1068 return CMD_SUCCESS;
1069}
1070
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001071#define OSMUX_STR "RTP multiplexing"
1072DEFUN(cfg_mgcp_osmux,
1073 cfg_mgcp_osmux_cmd,
1074 "osmux (on|off)",
1075 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1076{
1077 if (strcmp(argv[0], "on") == 0) {
1078 g_cfg->osmux = 1;
1079 if (g_cfg->trunk.audio_loop) {
1080 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1081 VTY_NEWLINE);
1082 return CMD_WARNING;
1083 }
1084 } else if (strcmp(argv[0], "off") == 0)
1085 g_cfg->osmux = 0;
1086
1087 return CMD_SUCCESS;
1088}
1089
1090DEFUN(cfg_mgcp_osmux_batch_factor,
1091 cfg_mgcp_osmux_batch_factor_cmd,
1092 "osmux batch-factor <1-4>",
1093 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1094{
1095 g_cfg->osmux_batch = atoi(argv[0]);
1096 return CMD_SUCCESS;
1097}
Harald Welte6a857052012-01-27 00:41:39 +01001098
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001099int mgcp_vty_init(void)
1100{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001101 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001102 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001103 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001104 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001105 install_element(ENABLE_NODE, &reset_endp_cmd);
1106 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001107
1108 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1109 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001110
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001111 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001112 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1113 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1114 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1115 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1116 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1117 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001118 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001119 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001120 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1121 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001122 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1123 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001124 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001125 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001126 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1127 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1128 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001129 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001130 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001131 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001132 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001133 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001134 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1135 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001136 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1137 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001138 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1139 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001140 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1141 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001142 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1143 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1144 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1145 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1146 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001147 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001148 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1149 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001150 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1151 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001152
1153 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1154 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001155 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001156 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1157 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1158 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001159 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1160 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001161 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1162 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001163 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001164 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1165 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001166 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1167 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1168 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1169 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1170 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001171 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001172 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1173 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001174
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001175 return 0;
1176}
1177
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001178static int allocate_trunk(struct mgcp_trunk_config *trunk)
1179{
1180 int i;
1181 struct mgcp_config *cfg = trunk->cfg;
1182
1183 if (mgcp_endpoints_allocate(trunk) != 0) {
1184 LOGP(DMGCP, LOGL_ERROR,
1185 "Failed to allocate %d endpoints on trunk %d.\n",
1186 trunk->number_endpoints, trunk->trunk_nr);
1187 return -1;
1188 }
1189
1190 /* early bind */
1191 for (i = 1; i < trunk->number_endpoints; ++i) {
1192 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001193
1194 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001195 cfg->last_bts_port += 2;
1196 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1197 LOGP(DMGCP, LOGL_FATAL,
1198 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001199 return -1;
1200 }
1201 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1202 }
1203
1204 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001205 cfg->last_net_port += 2;
1206 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1207 LOGP(DMGCP, LOGL_FATAL,
1208 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001209 return -1;
1210 }
1211 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1212 }
1213
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001214 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1215 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001216 int rtp_port;
1217
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001218 /* network side */
1219 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1220 cfg->transcoder_ports.base_port);
1221 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1222 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1223 return -1;
1224 }
1225 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1226
1227 /* bts side */
1228 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1229 cfg->transcoder_ports.base_port);
1230 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1231 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1232 return -1;
1233 }
1234 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1235 }
1236 }
1237
1238 return 0;
1239}
1240
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001241int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1242 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001243{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001244 int rc;
1245 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001246
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001247 /* Default to 4 messages */
1248 cfg->osmux_batch = 4;
1249
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001250 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001251 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001252 if (rc < 0) {
1253 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1254 return rc;
1255 }
1256
1257
1258 if (!g_cfg->bts_ip)
1259 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1260
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001261 if (!g_cfg->source_addr) {
1262 fprintf(stderr, "You need to specify a bind address.\n");
1263 return -1;
1264 }
1265
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001266 /* initialize the last ports */
1267 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1268 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1269
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001270 if (allocate_trunk(&g_cfg->trunk) != 0) {
1271 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001272 return -1;
1273 }
1274
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001275 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1276 if (allocate_trunk(trunk) != 0) {
1277 LOGP(DMGCP, LOGL_ERROR,
1278 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1279 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001280 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001281 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001282 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001283
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001284 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001285}
1286