blob: 0b116691ef8c3562895e4747a692f3a058944081 [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
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200369#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
370DEFUN(cfg_mgcp_rtp_force_ptime,
371 cfg_mgcp_rtp_force_ptime_cmd,
372 "rtp force-ptime (10|20|40)",
373 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther29474112014-07-04 20:11:11 +0200374 "The required ptime (packet duration) in ms\n"
375 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200376{
377 g_cfg->bts_force_ptime = atoi(argv[0]);
378 return CMD_SUCCESS;
379}
380
381DEFUN(cfg_mgcp_no_rtp_force_ptime,
382 cfg_mgcp_no_rtp_force_ptime_cmd,
383 "no rtp force-ptime",
384 NO_STR RTP_STR FORCE_PTIME_STR)
385{
386 g_cfg->bts_force_ptime = 0;
387 return CMD_SUCCESS;
388}
389
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200390DEFUN(cfg_mgcp_sdp_fmtp_extra,
391 cfg_mgcp_sdp_fmtp_extra_cmd,
392 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100393 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
394 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200395{
396 char *txt = argv_concat(argv, argc, 0);
397 if (!txt)
398 return CMD_WARNING;
399
400 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
401 talloc_free(txt);
402 return CMD_SUCCESS;
403}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800404
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100405#define SDP_STR "SDP File related options\n"
406#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100407DEFUN(cfg_mgcp_sdp_payload_number,
408 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100409 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100410 SDP_STR AUDIO_STR
411 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100412{
413 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100414 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100415 return CMD_SUCCESS;
416}
417
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100418ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100419 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100420 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
421
422
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100423DEFUN(cfg_mgcp_sdp_payload_name,
424 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100425 "sdp audio-payload name NAME",
426 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100427{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100428 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100429 return CMD_SUCCESS;
430}
431
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100432ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
433 "sdp audio payload name NAME",
434 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
435
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100436DEFUN(cfg_mgcp_sdp_payload_send_ptime,
437 cfg_mgcp_sdp_payload_send_ptime_cmd,
438 "sdp audio-payload send-ptime",
439 SDP_STR AUDIO_STR
440 "Send SDP ptime (packet duration) attribute\n")
441{
442 g_cfg->trunk.audio_send_ptime = 1;
443 return CMD_SUCCESS;
444}
445
446DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
447 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
448 "no sdp audio-payload send-ptime",
449 NO_STR SDP_STR AUDIO_STR
450 "Send SDP ptime (packet duration) attribute\n")
451{
452 g_cfg->trunk.audio_send_ptime = 0;
453 return CMD_SUCCESS;
454}
455
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100456DEFUN(cfg_mgcp_loop,
457 cfg_mgcp_loop_cmd,
458 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100459 "Loop audio for all endpoints on main trunk\n"
460 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100461{
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100462 if (g_cfg->osmux) {
463 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
464 return CMD_WARNING;
465 }
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100466 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100467 return CMD_SUCCESS;
468}
469
470DEFUN(cfg_mgcp_number_endp,
471 cfg_mgcp_number_endp_cmd,
472 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100473 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100474{
475 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100476 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100477 return CMD_SUCCESS;
478}
479
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200480DEFUN(cfg_mgcp_omit_rtcp,
481 cfg_mgcp_omit_rtcp_cmd,
482 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200483 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200484{
485 g_cfg->trunk.omit_rtcp = 1;
486 return CMD_SUCCESS;
487}
488
489DEFUN(cfg_mgcp_no_omit_rtcp,
490 cfg_mgcp_no_omit_rtcp_cmd,
491 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200492 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200493{
494 g_cfg->trunk.omit_rtcp = 0;
495 return CMD_SUCCESS;
496}
497
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100498DEFUN(cfg_mgcp_patch_rtp_ssrc,
499 cfg_mgcp_patch_rtp_ssrc_cmd,
500 "rtp-patch ssrc",
501 RTP_PATCH_STR
502 "Force a fixed SSRC\n"
503 )
504{
505 g_cfg->trunk.force_constant_ssrc = 1;
506 return CMD_SUCCESS;
507}
508
509DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
510 cfg_mgcp_no_patch_rtp_ssrc_cmd,
511 "no rtp-patch ssrc",
512 NO_STR RTP_PATCH_STR
513 "Force a fixed SSRC\n"
514 )
515{
516 g_cfg->trunk.force_constant_ssrc = 0;
517 return CMD_SUCCESS;
518}
519
520DEFUN(cfg_mgcp_patch_rtp_ts,
521 cfg_mgcp_patch_rtp_ts_cmd,
522 "rtp-patch timestamp",
523 RTP_PATCH_STR
524 "Adjust RTP timestamp\n"
525 )
526{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100527 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100528 return CMD_SUCCESS;
529}
530
531DEFUN(cfg_mgcp_no_patch_rtp_ts,
532 cfg_mgcp_no_patch_rtp_ts_cmd,
533 "no rtp-patch timestamp",
534 NO_STR RTP_PATCH_STR
535 "Adjust RTP timestamp\n"
536 )
537{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100538 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100539 return CMD_SUCCESS;
540}
541
542DEFUN(cfg_mgcp_no_patch_rtp,
543 cfg_mgcp_no_patch_rtp_cmd,
544 "no rtp-patch",
545 NO_STR RTP_PATCH_STR)
546{
547 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100548 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100549 return CMD_SUCCESS;
550}
551
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100552DEFUN(cfg_mgcp_rtp_keepalive,
553 cfg_mgcp_rtp_keepalive_cmd,
554 "rtp keep-alive <1-120>",
555 RTP_STR RTP_KEEPALIVE_STR
556 "Keep alive interval in secs\n"
557 )
558{
559 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
560 return CMD_SUCCESS;
561}
562
563DEFUN(cfg_mgcp_rtp_keepalive_once,
564 cfg_mgcp_rtp_keepalive_once_cmd,
565 "rtp keep-alive once",
566 RTP_STR RTP_KEEPALIVE_STR
567 "Send dummy packet only once after CRCX/MDCX\n"
568 )
569{
570 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
571 return CMD_SUCCESS;
572}
573
574DEFUN(cfg_mgcp_no_rtp_keepalive,
575 cfg_mgcp_no_rtp_keepalive_cmd,
576 "no rtp keep-alive",
577 NO_STR RTP_STR RTP_KEEPALIVE_STR
578 )
579{
580 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
581 return CMD_SUCCESS;
582}
583
584
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100585
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100586#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200587DEFUN(cfg_mgcp_agent_addr,
588 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100589 "call-agent ip A.B.C.D",
590 CALL_AGENT_STR IP_STR
591 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200592{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200593 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200594 return CMD_SUCCESS;
595}
596
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100597ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
598 "call agent ip A.B.C.D",
599 CALL_AGENT_STR CALL_AGENT_STR IP_STR
600 "IPv4 Address of the callagent\n")
601
602
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800603DEFUN(cfg_mgcp_transcoder,
604 cfg_mgcp_transcoder_cmd,
605 "transcoder-mgw A.B.C.D",
606 "Use a MGW to detranscoder RTP\n"
607 "The IP address of the MGW")
608{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200609 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800610 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
611
612 return CMD_SUCCESS;
613}
614
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100615DEFUN(cfg_mgcp_no_transcoder,
616 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100617 "no transcoder-mgw",
618 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100619{
620 if (g_cfg->transcoder_ip) {
621 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
622 talloc_free(g_cfg->transcoder_ip);
623 g_cfg->transcoder_ip = NULL;
624 }
625
626 return CMD_SUCCESS;
627}
628
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800629DEFUN(cfg_mgcp_transcoder_remote_base,
630 cfg_mgcp_transcoder_remote_base_cmd,
631 "transcoder-remote-base <0-65534>",
632 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
633{
634 g_cfg->transcoder_remote_base = atoi(argv[0]);
635 return CMD_SUCCESS;
636}
637
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100638DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
639 "trunk <1-64>",
640 "Configure a SS7 trunk\n" "Trunk Nr\n")
641{
642 struct mgcp_trunk_config *trunk;
643 int index = atoi(argv[0]);
644
645 trunk = mgcp_trunk_num(g_cfg, index);
646 if (!trunk)
647 trunk = mgcp_trunk_alloc(g_cfg, index);
648
649 if (!trunk) {
650 vty_out(vty, "%%Unable to allocate trunk %u.%s",
651 index, VTY_NEWLINE);
652 return CMD_WARNING;
653 }
654
655 vty->node = TRUNK_NODE;
656 vty->index = trunk;
657 return CMD_SUCCESS;
658}
659
660static int config_write_trunk(struct vty *vty)
661{
662 struct mgcp_trunk_config *trunk;
663
664 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
665 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100666 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100667 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100668 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100669 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100670 vty_out(vty, " %ssdp audio-payload send-ptime%s",
671 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100672
673 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
674 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
675 else if (trunk->keepalive_interval)
676 vty_out(vty, " rtp keep-alive %d%s",
677 trunk->keepalive_interval, VTY_NEWLINE);
678 else
679 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
680
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100681 vty_out(vty, " loop %d%s",
682 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200683 if (trunk->omit_rtcp)
684 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
685 else
686 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100687 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100688 vty_out(vty, " %srtp-patch ssrc%s",
689 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
690 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100691 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100692 } else
693 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200694 if (trunk->audio_fmtp_extra)
695 vty_out(vty, " sdp audio fmtp-extra %s%s",
696 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100697 }
698
699 return CMD_SUCCESS;
700}
701
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200702DEFUN(cfg_trunk_sdp_fmtp_extra,
703 cfg_trunk_sdp_fmtp_extra_cmd,
704 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100705 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
706 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200707{
708 struct mgcp_trunk_config *trunk = vty->index;
709 char *txt = argv_concat(argv, argc, 0);
710 if (!txt)
711 return CMD_WARNING;
712
713 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
714 talloc_free(txt);
715 return CMD_SUCCESS;
716}
717
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100718DEFUN(cfg_trunk_payload_number,
719 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100720 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100721 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100722{
723 struct mgcp_trunk_config *trunk = vty->index;
724 unsigned int payload = atoi(argv[0]);
725
726 trunk->audio_payload = payload;
727 return CMD_SUCCESS;
728}
729
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100730ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100731 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100732 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
733
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100734DEFUN(cfg_trunk_payload_name,
735 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100736 "sdp audio-payload name NAME",
737 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100738{
739 struct mgcp_trunk_config *trunk = vty->index;
740
741 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
742 return CMD_SUCCESS;
743}
744
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100745ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
746 "sdp audio payload name NAME",
747 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
748
749
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100750DEFUN(cfg_trunk_loop,
751 cfg_trunk_loop_cmd,
752 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100753 "Loop audio for all endpoints on this trunk\n"
754 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100755{
756 struct mgcp_trunk_config *trunk = vty->index;
757
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100758 if (g_cfg->osmux) {
759 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
760 return CMD_WARNING;
761 }
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100762 trunk->audio_loop = atoi(argv[0]);
763 return CMD_SUCCESS;
764}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800765
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100766DEFUN(cfg_trunk_sdp_payload_send_ptime,
767 cfg_trunk_sdp_payload_send_ptime_cmd,
768 "sdp audio-payload send-ptime",
769 SDP_STR AUDIO_STR
770 "Send SDP ptime (packet duration) attribute\n")
771{
772 struct mgcp_trunk_config *trunk = vty->index;
773 trunk->audio_send_ptime = 1;
774 return CMD_SUCCESS;
775}
776
777DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
778 cfg_trunk_no_sdp_payload_send_ptime_cmd,
779 "no sdp audio-payload send-ptime",
780 NO_STR SDP_STR AUDIO_STR
781 "Send SDP ptime (packet duration) attribute\n")
782{
783 struct mgcp_trunk_config *trunk = vty->index;
784 trunk->audio_send_ptime = 0;
785 return CMD_SUCCESS;
786}
787
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200788DEFUN(cfg_trunk_omit_rtcp,
789 cfg_trunk_omit_rtcp_cmd,
790 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200791 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200792{
793 struct mgcp_trunk_config *trunk = vty->index;
794 trunk->omit_rtcp = 1;
795 return CMD_SUCCESS;
796}
797
798DEFUN(cfg_trunk_no_omit_rtcp,
799 cfg_trunk_no_omit_rtcp_cmd,
800 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200801 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200802{
803 struct mgcp_trunk_config *trunk = vty->index;
804 trunk->omit_rtcp = 0;
805 return CMD_SUCCESS;
806}
807
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100808DEFUN(cfg_trunk_patch_rtp_ssrc,
809 cfg_trunk_patch_rtp_ssrc_cmd,
810 "rtp-patch ssrc",
811 RTP_PATCH_STR
812 "Force a fixed SSRC\n"
813 )
814{
815 struct mgcp_trunk_config *trunk = vty->index;
816 trunk->force_constant_ssrc = 1;
817 return CMD_SUCCESS;
818}
819
820DEFUN(cfg_trunk_no_patch_rtp_ssrc,
821 cfg_trunk_no_patch_rtp_ssrc_cmd,
822 "no rtp-patch ssrc",
823 NO_STR RTP_PATCH_STR
824 "Force a fixed SSRC\n"
825 )
826{
827 struct mgcp_trunk_config *trunk = vty->index;
828 trunk->force_constant_ssrc = 0;
829 return CMD_SUCCESS;
830}
831
832DEFUN(cfg_trunk_patch_rtp_ts,
833 cfg_trunk_patch_rtp_ts_cmd,
834 "rtp-patch timestamp",
835 RTP_PATCH_STR
836 "Adjust RTP timestamp\n"
837 )
838{
839 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100840 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100841 return CMD_SUCCESS;
842}
843
844DEFUN(cfg_trunk_no_patch_rtp_ts,
845 cfg_trunk_no_patch_rtp_ts_cmd,
846 "no rtp-patch timestamp",
847 NO_STR RTP_PATCH_STR
848 "Adjust RTP timestamp\n"
849 )
850{
851 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100852 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100853 return CMD_SUCCESS;
854}
855
856DEFUN(cfg_trunk_no_patch_rtp,
857 cfg_trunk_no_patch_rtp_cmd,
858 "no rtp-patch",
859 NO_STR RTP_PATCH_STR)
860{
861 struct mgcp_trunk_config *trunk = vty->index;
862 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100863 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100864 return CMD_SUCCESS;
865}
866
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100867DEFUN(cfg_trunk_rtp_keepalive,
868 cfg_trunk_rtp_keepalive_cmd,
869 "rtp keep-alive <1-120>",
870 RTP_STR RTP_KEEPALIVE_STR
871 "Keep-alive interval in secs\n"
872 )
873{
874 struct mgcp_trunk_config *trunk = vty->index;
875 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
876 return CMD_SUCCESS;
877}
878
879DEFUN(cfg_trunk_rtp_keepalive_once,
880 cfg_trunk_rtp_keepalive_once_cmd,
881 "rtp keep-alive once",
882 RTP_STR RTP_KEEPALIVE_STR
883 "Send dummy packet only once after CRCX/MDCX\n"
884 )
885{
886 struct mgcp_trunk_config *trunk = vty->index;
887 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
888 return CMD_SUCCESS;
889}
890
891DEFUN(cfg_trunk_no_rtp_keepalive,
892 cfg_trunk_no_rtp_keepalive_cmd,
893 "no rtp keep-alive",
894 NO_STR RTP_STR RTP_KEEPALIVE_STR
895 )
896{
897 struct mgcp_trunk_config *trunk = vty->index;
898 mgcp_trunk_set_keepalive(trunk, 0);
899 return CMD_SUCCESS;
900}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100901
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800902DEFUN(loop_endp,
903 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100904 "loop-endpoint <0-64> NAME (0|1)",
905 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800906 "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 +0800907{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100908 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800909 struct mgcp_endpoint *endp;
910
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100911 trunk = find_trunk(g_cfg, atoi(argv[0]));
912 if (!trunk) {
913 vty_out(vty, "%%Trunk %d not found in the config.%s",
914 atoi(argv[0]), VTY_NEWLINE);
915 return CMD_WARNING;
916 }
917
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100918 if (!trunk->endpoints) {
919 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
920 trunk->trunk_nr, VTY_NEWLINE);
921 return CMD_WARNING;
922 }
923
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100924 int endp_no = strtoul(argv[1], NULL, 16);
925 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800926 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100927 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800928 return CMD_WARNING;
929 }
930
931
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100932 endp = &trunk->endpoints[endp_no];
933 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800934
935 if (loop)
936 endp->conn_mode = MGCP_CONN_LOOPBACK;
937 else
938 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100939
940 /* Handle it like a MDCX, switch on SSRC patching if enabled */
941 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
942 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800943
944 return CMD_SUCCESS;
945}
946
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800947DEFUN(tap_call,
948 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100949 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
950 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800951 "The endpoint in hex\n"
952 "Forward the data coming from the bts\n"
953 "Forward the data coming from the bts leaving to the network\n"
954 "Forward the data coming from the net\n"
955 "Forward the data coming from the net leaving to the bts\n"
956 "destination IP of the data\n" "destination port\n")
957{
958 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100959 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800960 struct mgcp_endpoint *endp;
961 int port = 0;
962
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100963 trunk = find_trunk(g_cfg, atoi(argv[0]));
964 if (!trunk) {
965 vty_out(vty, "%%Trunk %d not found in the config.%s",
966 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800967 return CMD_WARNING;
968 }
969
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100970 if (!trunk->endpoints) {
971 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
972 trunk->trunk_nr, VTY_NEWLINE);
973 return CMD_WARNING;
974 }
975
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100976 int endp_no = strtoul(argv[1], NULL, 16);
977 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
978 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
979 argv[1], endp_no, VTY_NEWLINE);
980 return CMD_WARNING;
981 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800982
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100983 endp = &trunk->endpoints[endp_no];
984
985 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800986 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100987 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800988 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100989 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800990 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100991 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800992 port = MGCP_TAP_NET_OUT;
993 } else {
994 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
995 return CMD_WARNING;
996 }
997
998 tap = &endp->taps[port];
999 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001000 inet_aton(argv[3], &tap->forward.sin_addr);
1001 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +08001002 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001003 return CMD_SUCCESS;
1004}
1005
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001006DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001007 "free-endpoint <0-64> NUMBER",
1008 "Free the given endpoint\n" "Trunk number\n"
1009 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001010{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001011 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001012 struct mgcp_endpoint *endp;
1013
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001014 trunk = find_trunk(g_cfg, atoi(argv[0]));
1015 if (!trunk) {
1016 vty_out(vty, "%%Trunk %d not found in the config.%s",
1017 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001018 return CMD_WARNING;
1019 }
1020
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001021 if (!trunk->endpoints) {
1022 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1023 trunk->trunk_nr, VTY_NEWLINE);
1024 return CMD_WARNING;
1025 }
1026
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001027 int endp_no = strtoul(argv[1], NULL, 16);
1028 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1029 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1030 argv[1], endp_no, VTY_NEWLINE);
1031 return CMD_WARNING;
1032 }
1033
1034 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001035 mgcp_free_endp(endp);
1036 return CMD_SUCCESS;
1037}
1038
Harald Welte6a857052012-01-27 00:41:39 +01001039DEFUN(reset_endp, reset_endp_cmd,
1040 "reset-endpoint <0-64> NUMBER",
1041 "Reset the given endpoint\n" "Trunk number\n"
1042 "Endpoint number in hex.\n")
1043{
1044 struct mgcp_trunk_config *trunk;
1045 struct mgcp_endpoint *endp;
1046 int endp_no, rc;
1047
1048 trunk = find_trunk(g_cfg, atoi(argv[0]));
1049 if (!trunk) {
1050 vty_out(vty, "%%Trunk %d not found in the config.%s",
1051 atoi(argv[0]), VTY_NEWLINE);
1052 return CMD_WARNING;
1053 }
1054
1055 if (!trunk->endpoints) {
1056 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1057 trunk->trunk_nr, VTY_NEWLINE);
1058 return CMD_WARNING;
1059 }
1060
1061 endp_no = strtoul(argv[1], NULL, 16);
1062 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1063 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1064 argv[1], endp_no, VTY_NEWLINE);
1065 return CMD_WARNING;
1066 }
1067
1068 endp = &trunk->endpoints[endp_no];
1069 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1070 if (rc < 0) {
1071 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1072 return CMD_WARNING;
1073 }
1074 return CMD_SUCCESS;
1075}
1076
1077DEFUN(reset_all_endp, reset_all_endp_cmd,
1078 "reset-all-endpoints",
1079 "Reset all endpoints\n")
1080{
1081 int rc;
1082
1083 rc = mgcp_send_reset_all(g_cfg);
1084 if (rc < 0) {
1085 vty_out(vty, "Error %d during endpoint reset.%s",
1086 rc, VTY_NEWLINE);
1087 return CMD_WARNING;
1088 }
1089 return CMD_SUCCESS;
1090}
1091
Holger Hans Peter Freythercc84c952014-06-03 13:36:42 +02001092#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001093DEFUN(cfg_mgcp_osmux,
1094 cfg_mgcp_osmux_cmd,
1095 "osmux (on|off)",
1096 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1097{
1098 if (strcmp(argv[0], "on") == 0) {
1099 g_cfg->osmux = 1;
1100 if (g_cfg->trunk.audio_loop) {
1101 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1102 VTY_NEWLINE);
1103 return CMD_WARNING;
1104 }
1105 } else if (strcmp(argv[0], "off") == 0)
1106 g_cfg->osmux = 0;
1107
1108 return CMD_SUCCESS;
1109}
1110
1111DEFUN(cfg_mgcp_osmux_batch_factor,
1112 cfg_mgcp_osmux_batch_factor_cmd,
Holger Hans Peter Freyther421365e2014-06-16 14:12:02 +02001113 "osmux batch-factor <1-16>",
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001114 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1115{
1116 g_cfg->osmux_batch = atoi(argv[0]);
1117 return CMD_SUCCESS;
1118}
Harald Welte6a857052012-01-27 00:41:39 +01001119
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001120int mgcp_vty_init(void)
1121{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001122 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001123 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001124 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001125 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001126 install_element(ENABLE_NODE, &reset_endp_cmd);
1127 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001128
1129 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1130 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001131
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001132 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001133 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1134 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1135 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1136 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1137 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1138 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001139 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001140 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001141 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1142 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001143 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1144 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001145 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001146 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck42a833e2014-04-14 10:31:47 +02001147 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1148 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001149 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1150 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1151 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001152 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001153 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001154 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001155 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001156 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001157 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1158 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001159 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1160 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001161 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1162 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001163 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1164 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001165 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1166 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1167 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1168 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1169 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001170 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001171 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1172 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001173 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1174 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001175
1176 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1177 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001178 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001179 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1180 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1181 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001182 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1183 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001184 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1185 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001186 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001187 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1188 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001189 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1190 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1191 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1192 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1193 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001194 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001195 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1196 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001197
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001198 return 0;
1199}
1200
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001201static int allocate_trunk(struct mgcp_trunk_config *trunk)
1202{
1203 int i;
1204 struct mgcp_config *cfg = trunk->cfg;
1205
1206 if (mgcp_endpoints_allocate(trunk) != 0) {
1207 LOGP(DMGCP, LOGL_ERROR,
1208 "Failed to allocate %d endpoints on trunk %d.\n",
1209 trunk->number_endpoints, trunk->trunk_nr);
1210 return -1;
1211 }
1212
1213 /* early bind */
1214 for (i = 1; i < trunk->number_endpoints; ++i) {
1215 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001216
1217 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001218 cfg->last_bts_port += 2;
1219 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1220 LOGP(DMGCP, LOGL_FATAL,
1221 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001222 return -1;
1223 }
1224 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1225 }
1226
1227 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001228 cfg->last_net_port += 2;
1229 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1230 LOGP(DMGCP, LOGL_FATAL,
1231 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001232 return -1;
1233 }
1234 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1235 }
1236
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001237 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1238 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001239 int rtp_port;
1240
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001241 /* network side */
1242 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1243 cfg->transcoder_ports.base_port);
1244 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1245 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1246 return -1;
1247 }
1248 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1249
1250 /* bts side */
1251 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1252 cfg->transcoder_ports.base_port);
1253 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1254 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1255 return -1;
1256 }
1257 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1258 }
1259 }
1260
1261 return 0;
1262}
1263
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001264int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1265 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001266{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001267 int rc;
1268 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001269
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001270 /* Default to 4 messages */
1271 cfg->osmux_batch = 4;
1272
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001273 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001274 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001275 if (rc < 0) {
1276 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1277 return rc;
1278 }
1279
1280
1281 if (!g_cfg->bts_ip)
1282 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1283
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001284 if (!g_cfg->source_addr) {
1285 fprintf(stderr, "You need to specify a bind address.\n");
1286 return -1;
1287 }
1288
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001289 /* initialize the last ports */
1290 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1291 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1292
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001293 if (allocate_trunk(&g_cfg->trunk) != 0) {
1294 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001295 return -1;
1296 }
1297
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001298 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1299 if (allocate_trunk(trunk) != 0) {
1300 LOGP(DMGCP, LOGL_ERROR,
1301 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1302 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001303 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001304 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001305 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001306
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001307 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001308}
1309