blob: 26b5706277a06c164d875ad782b80bf197e03888 [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
374 "The required ptime (packet duration) in ms\n")
375{
376 g_cfg->bts_force_ptime = atoi(argv[0]);
377 return CMD_SUCCESS;
378}
379
380DEFUN(cfg_mgcp_no_rtp_force_ptime,
381 cfg_mgcp_no_rtp_force_ptime_cmd,
382 "no rtp force-ptime",
383 NO_STR RTP_STR FORCE_PTIME_STR)
384{
385 g_cfg->bts_force_ptime = 0;
386 return CMD_SUCCESS;
387}
388
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200389DEFUN(cfg_mgcp_sdp_fmtp_extra,
390 cfg_mgcp_sdp_fmtp_extra_cmd,
391 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100392 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
393 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200394{
395 char *txt = argv_concat(argv, argc, 0);
396 if (!txt)
397 return CMD_WARNING;
398
399 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
400 talloc_free(txt);
401 return CMD_SUCCESS;
402}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800403
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100404#define SDP_STR "SDP File related options\n"
405#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100406DEFUN(cfg_mgcp_sdp_payload_number,
407 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100408 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100409 SDP_STR AUDIO_STR
410 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100411{
412 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100413 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100414 return CMD_SUCCESS;
415}
416
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100417ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100418 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100419 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
420
421
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100422DEFUN(cfg_mgcp_sdp_payload_name,
423 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100424 "sdp audio-payload name NAME",
425 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100426{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100427 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100428 return CMD_SUCCESS;
429}
430
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100431ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
432 "sdp audio payload name NAME",
433 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
434
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100435DEFUN(cfg_mgcp_sdp_payload_send_ptime,
436 cfg_mgcp_sdp_payload_send_ptime_cmd,
437 "sdp audio-payload send-ptime",
438 SDP_STR AUDIO_STR
439 "Send SDP ptime (packet duration) attribute\n")
440{
441 g_cfg->trunk.audio_send_ptime = 1;
442 return CMD_SUCCESS;
443}
444
445DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
446 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
447 "no sdp audio-payload send-ptime",
448 NO_STR SDP_STR AUDIO_STR
449 "Send SDP ptime (packet duration) attribute\n")
450{
451 g_cfg->trunk.audio_send_ptime = 0;
452 return CMD_SUCCESS;
453}
454
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100455DEFUN(cfg_mgcp_loop,
456 cfg_mgcp_loop_cmd,
457 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100458 "Loop audio for all endpoints on main trunk\n"
459 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100460{
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100461 if (g_cfg->osmux) {
462 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
463 return CMD_WARNING;
464 }
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100465 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100466 return CMD_SUCCESS;
467}
468
469DEFUN(cfg_mgcp_number_endp,
470 cfg_mgcp_number_endp_cmd,
471 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100472 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100473{
474 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100475 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100476 return CMD_SUCCESS;
477}
478
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200479DEFUN(cfg_mgcp_omit_rtcp,
480 cfg_mgcp_omit_rtcp_cmd,
481 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200482 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200483{
484 g_cfg->trunk.omit_rtcp = 1;
485 return CMD_SUCCESS;
486}
487
488DEFUN(cfg_mgcp_no_omit_rtcp,
489 cfg_mgcp_no_omit_rtcp_cmd,
490 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200491 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200492{
493 g_cfg->trunk.omit_rtcp = 0;
494 return CMD_SUCCESS;
495}
496
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100497DEFUN(cfg_mgcp_patch_rtp_ssrc,
498 cfg_mgcp_patch_rtp_ssrc_cmd,
499 "rtp-patch ssrc",
500 RTP_PATCH_STR
501 "Force a fixed SSRC\n"
502 )
503{
504 g_cfg->trunk.force_constant_ssrc = 1;
505 return CMD_SUCCESS;
506}
507
508DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
509 cfg_mgcp_no_patch_rtp_ssrc_cmd,
510 "no rtp-patch ssrc",
511 NO_STR RTP_PATCH_STR
512 "Force a fixed SSRC\n"
513 )
514{
515 g_cfg->trunk.force_constant_ssrc = 0;
516 return CMD_SUCCESS;
517}
518
519DEFUN(cfg_mgcp_patch_rtp_ts,
520 cfg_mgcp_patch_rtp_ts_cmd,
521 "rtp-patch timestamp",
522 RTP_PATCH_STR
523 "Adjust RTP timestamp\n"
524 )
525{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100526 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100527 return CMD_SUCCESS;
528}
529
530DEFUN(cfg_mgcp_no_patch_rtp_ts,
531 cfg_mgcp_no_patch_rtp_ts_cmd,
532 "no rtp-patch timestamp",
533 NO_STR RTP_PATCH_STR
534 "Adjust RTP timestamp\n"
535 )
536{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100537 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100538 return CMD_SUCCESS;
539}
540
541DEFUN(cfg_mgcp_no_patch_rtp,
542 cfg_mgcp_no_patch_rtp_cmd,
543 "no rtp-patch",
544 NO_STR RTP_PATCH_STR)
545{
546 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100547 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100548 return CMD_SUCCESS;
549}
550
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100551DEFUN(cfg_mgcp_rtp_keepalive,
552 cfg_mgcp_rtp_keepalive_cmd,
553 "rtp keep-alive <1-120>",
554 RTP_STR RTP_KEEPALIVE_STR
555 "Keep alive interval in secs\n"
556 )
557{
558 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
559 return CMD_SUCCESS;
560}
561
562DEFUN(cfg_mgcp_rtp_keepalive_once,
563 cfg_mgcp_rtp_keepalive_once_cmd,
564 "rtp keep-alive once",
565 RTP_STR RTP_KEEPALIVE_STR
566 "Send dummy packet only once after CRCX/MDCX\n"
567 )
568{
569 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
570 return CMD_SUCCESS;
571}
572
573DEFUN(cfg_mgcp_no_rtp_keepalive,
574 cfg_mgcp_no_rtp_keepalive_cmd,
575 "no rtp keep-alive",
576 NO_STR RTP_STR RTP_KEEPALIVE_STR
577 )
578{
579 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
580 return CMD_SUCCESS;
581}
582
583
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100584
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100585#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200586DEFUN(cfg_mgcp_agent_addr,
587 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100588 "call-agent ip A.B.C.D",
589 CALL_AGENT_STR IP_STR
590 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200591{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200592 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200593 return CMD_SUCCESS;
594}
595
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100596ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
597 "call agent ip A.B.C.D",
598 CALL_AGENT_STR CALL_AGENT_STR IP_STR
599 "IPv4 Address of the callagent\n")
600
601
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800602DEFUN(cfg_mgcp_transcoder,
603 cfg_mgcp_transcoder_cmd,
604 "transcoder-mgw A.B.C.D",
605 "Use a MGW to detranscoder RTP\n"
606 "The IP address of the MGW")
607{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200608 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800609 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
610
611 return CMD_SUCCESS;
612}
613
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100614DEFUN(cfg_mgcp_no_transcoder,
615 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100616 "no transcoder-mgw",
617 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100618{
619 if (g_cfg->transcoder_ip) {
620 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
621 talloc_free(g_cfg->transcoder_ip);
622 g_cfg->transcoder_ip = NULL;
623 }
624
625 return CMD_SUCCESS;
626}
627
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800628DEFUN(cfg_mgcp_transcoder_remote_base,
629 cfg_mgcp_transcoder_remote_base_cmd,
630 "transcoder-remote-base <0-65534>",
631 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
632{
633 g_cfg->transcoder_remote_base = atoi(argv[0]);
634 return CMD_SUCCESS;
635}
636
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100637DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
638 "trunk <1-64>",
639 "Configure a SS7 trunk\n" "Trunk Nr\n")
640{
641 struct mgcp_trunk_config *trunk;
642 int index = atoi(argv[0]);
643
644 trunk = mgcp_trunk_num(g_cfg, index);
645 if (!trunk)
646 trunk = mgcp_trunk_alloc(g_cfg, index);
647
648 if (!trunk) {
649 vty_out(vty, "%%Unable to allocate trunk %u.%s",
650 index, VTY_NEWLINE);
651 return CMD_WARNING;
652 }
653
654 vty->node = TRUNK_NODE;
655 vty->index = trunk;
656 return CMD_SUCCESS;
657}
658
659static int config_write_trunk(struct vty *vty)
660{
661 struct mgcp_trunk_config *trunk;
662
663 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
664 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100665 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100666 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100667 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100668 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100669 vty_out(vty, " %ssdp audio-payload send-ptime%s",
670 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100671
672 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
673 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
674 else if (trunk->keepalive_interval)
675 vty_out(vty, " rtp keep-alive %d%s",
676 trunk->keepalive_interval, VTY_NEWLINE);
677 else
678 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
679
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100680 vty_out(vty, " loop %d%s",
681 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200682 if (trunk->omit_rtcp)
683 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
684 else
685 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100686 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100687 vty_out(vty, " %srtp-patch ssrc%s",
688 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
689 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100690 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100691 } else
692 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200693 if (trunk->audio_fmtp_extra)
694 vty_out(vty, " sdp audio fmtp-extra %s%s",
695 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100696 }
697
698 return CMD_SUCCESS;
699}
700
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200701DEFUN(cfg_trunk_sdp_fmtp_extra,
702 cfg_trunk_sdp_fmtp_extra_cmd,
703 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100704 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
705 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200706{
707 struct mgcp_trunk_config *trunk = vty->index;
708 char *txt = argv_concat(argv, argc, 0);
709 if (!txt)
710 return CMD_WARNING;
711
712 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
713 talloc_free(txt);
714 return CMD_SUCCESS;
715}
716
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100717DEFUN(cfg_trunk_payload_number,
718 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100719 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100720 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100721{
722 struct mgcp_trunk_config *trunk = vty->index;
723 unsigned int payload = atoi(argv[0]);
724
725 trunk->audio_payload = payload;
726 return CMD_SUCCESS;
727}
728
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100729ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100730 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100731 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
732
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100733DEFUN(cfg_trunk_payload_name,
734 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100735 "sdp audio-payload name NAME",
736 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100737{
738 struct mgcp_trunk_config *trunk = vty->index;
739
740 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
741 return CMD_SUCCESS;
742}
743
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100744ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
745 "sdp audio payload name NAME",
746 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
747
748
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100749DEFUN(cfg_trunk_loop,
750 cfg_trunk_loop_cmd,
751 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100752 "Loop audio for all endpoints on this trunk\n"
753 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100754{
755 struct mgcp_trunk_config *trunk = vty->index;
756
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100757 if (g_cfg->osmux) {
758 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
759 return CMD_WARNING;
760 }
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100761 trunk->audio_loop = atoi(argv[0]);
762 return CMD_SUCCESS;
763}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800764
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100765DEFUN(cfg_trunk_sdp_payload_send_ptime,
766 cfg_trunk_sdp_payload_send_ptime_cmd,
767 "sdp audio-payload send-ptime",
768 SDP_STR AUDIO_STR
769 "Send SDP ptime (packet duration) attribute\n")
770{
771 struct mgcp_trunk_config *trunk = vty->index;
772 trunk->audio_send_ptime = 1;
773 return CMD_SUCCESS;
774}
775
776DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
777 cfg_trunk_no_sdp_payload_send_ptime_cmd,
778 "no sdp audio-payload send-ptime",
779 NO_STR SDP_STR AUDIO_STR
780 "Send SDP ptime (packet duration) attribute\n")
781{
782 struct mgcp_trunk_config *trunk = vty->index;
783 trunk->audio_send_ptime = 0;
784 return CMD_SUCCESS;
785}
786
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200787DEFUN(cfg_trunk_omit_rtcp,
788 cfg_trunk_omit_rtcp_cmd,
789 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200790 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200791{
792 struct mgcp_trunk_config *trunk = vty->index;
793 trunk->omit_rtcp = 1;
794 return CMD_SUCCESS;
795}
796
797DEFUN(cfg_trunk_no_omit_rtcp,
798 cfg_trunk_no_omit_rtcp_cmd,
799 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200800 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200801{
802 struct mgcp_trunk_config *trunk = vty->index;
803 trunk->omit_rtcp = 0;
804 return CMD_SUCCESS;
805}
806
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100807DEFUN(cfg_trunk_patch_rtp_ssrc,
808 cfg_trunk_patch_rtp_ssrc_cmd,
809 "rtp-patch ssrc",
810 RTP_PATCH_STR
811 "Force a fixed SSRC\n"
812 )
813{
814 struct mgcp_trunk_config *trunk = vty->index;
815 trunk->force_constant_ssrc = 1;
816 return CMD_SUCCESS;
817}
818
819DEFUN(cfg_trunk_no_patch_rtp_ssrc,
820 cfg_trunk_no_patch_rtp_ssrc_cmd,
821 "no rtp-patch ssrc",
822 NO_STR RTP_PATCH_STR
823 "Force a fixed SSRC\n"
824 )
825{
826 struct mgcp_trunk_config *trunk = vty->index;
827 trunk->force_constant_ssrc = 0;
828 return CMD_SUCCESS;
829}
830
831DEFUN(cfg_trunk_patch_rtp_ts,
832 cfg_trunk_patch_rtp_ts_cmd,
833 "rtp-patch timestamp",
834 RTP_PATCH_STR
835 "Adjust RTP timestamp\n"
836 )
837{
838 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100839 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100840 return CMD_SUCCESS;
841}
842
843DEFUN(cfg_trunk_no_patch_rtp_ts,
844 cfg_trunk_no_patch_rtp_ts_cmd,
845 "no rtp-patch timestamp",
846 NO_STR RTP_PATCH_STR
847 "Adjust RTP timestamp\n"
848 )
849{
850 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100851 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100852 return CMD_SUCCESS;
853}
854
855DEFUN(cfg_trunk_no_patch_rtp,
856 cfg_trunk_no_patch_rtp_cmd,
857 "no rtp-patch",
858 NO_STR RTP_PATCH_STR)
859{
860 struct mgcp_trunk_config *trunk = vty->index;
861 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100862 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100863 return CMD_SUCCESS;
864}
865
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100866DEFUN(cfg_trunk_rtp_keepalive,
867 cfg_trunk_rtp_keepalive_cmd,
868 "rtp keep-alive <1-120>",
869 RTP_STR RTP_KEEPALIVE_STR
870 "Keep-alive interval in secs\n"
871 )
872{
873 struct mgcp_trunk_config *trunk = vty->index;
874 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
875 return CMD_SUCCESS;
876}
877
878DEFUN(cfg_trunk_rtp_keepalive_once,
879 cfg_trunk_rtp_keepalive_once_cmd,
880 "rtp keep-alive once",
881 RTP_STR RTP_KEEPALIVE_STR
882 "Send dummy packet only once after CRCX/MDCX\n"
883 )
884{
885 struct mgcp_trunk_config *trunk = vty->index;
886 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
887 return CMD_SUCCESS;
888}
889
890DEFUN(cfg_trunk_no_rtp_keepalive,
891 cfg_trunk_no_rtp_keepalive_cmd,
892 "no rtp keep-alive",
893 NO_STR RTP_STR RTP_KEEPALIVE_STR
894 )
895{
896 struct mgcp_trunk_config *trunk = vty->index;
897 mgcp_trunk_set_keepalive(trunk, 0);
898 return CMD_SUCCESS;
899}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100900
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800901DEFUN(loop_endp,
902 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100903 "loop-endpoint <0-64> NAME (0|1)",
904 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800905 "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 +0800906{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100907 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800908 struct mgcp_endpoint *endp;
909
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100910 trunk = find_trunk(g_cfg, atoi(argv[0]));
911 if (!trunk) {
912 vty_out(vty, "%%Trunk %d not found in the config.%s",
913 atoi(argv[0]), VTY_NEWLINE);
914 return CMD_WARNING;
915 }
916
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100917 if (!trunk->endpoints) {
918 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
919 trunk->trunk_nr, VTY_NEWLINE);
920 return CMD_WARNING;
921 }
922
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100923 int endp_no = strtoul(argv[1], NULL, 16);
924 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800925 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100926 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800927 return CMD_WARNING;
928 }
929
930
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100931 endp = &trunk->endpoints[endp_no];
932 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800933
934 if (loop)
935 endp->conn_mode = MGCP_CONN_LOOPBACK;
936 else
937 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100938
939 /* Handle it like a MDCX, switch on SSRC patching if enabled */
940 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
941 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800942
943 return CMD_SUCCESS;
944}
945
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800946DEFUN(tap_call,
947 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100948 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
949 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800950 "The endpoint in hex\n"
951 "Forward the data coming from the bts\n"
952 "Forward the data coming from the bts leaving to the network\n"
953 "Forward the data coming from the net\n"
954 "Forward the data coming from the net leaving to the bts\n"
955 "destination IP of the data\n" "destination port\n")
956{
957 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100958 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800959 struct mgcp_endpoint *endp;
960 int port = 0;
961
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100962 trunk = find_trunk(g_cfg, atoi(argv[0]));
963 if (!trunk) {
964 vty_out(vty, "%%Trunk %d not found in the config.%s",
965 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800966 return CMD_WARNING;
967 }
968
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100969 if (!trunk->endpoints) {
970 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
971 trunk->trunk_nr, VTY_NEWLINE);
972 return CMD_WARNING;
973 }
974
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100975 int endp_no = strtoul(argv[1], NULL, 16);
976 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
977 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
978 argv[1], endp_no, VTY_NEWLINE);
979 return CMD_WARNING;
980 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800981
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100982 endp = &trunk->endpoints[endp_no];
983
984 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800985 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100986 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800987 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100988 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800989 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100990 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800991 port = MGCP_TAP_NET_OUT;
992 } else {
993 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
994 return CMD_WARNING;
995 }
996
997 tap = &endp->taps[port];
998 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100999 inet_aton(argv[3], &tap->forward.sin_addr);
1000 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +08001001 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001002 return CMD_SUCCESS;
1003}
1004
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001005DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001006 "free-endpoint <0-64> NUMBER",
1007 "Free the given endpoint\n" "Trunk number\n"
1008 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001009{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001010 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001011 struct mgcp_endpoint *endp;
1012
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001013 trunk = find_trunk(g_cfg, atoi(argv[0]));
1014 if (!trunk) {
1015 vty_out(vty, "%%Trunk %d not found in the config.%s",
1016 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001017 return CMD_WARNING;
1018 }
1019
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001020 if (!trunk->endpoints) {
1021 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1022 trunk->trunk_nr, VTY_NEWLINE);
1023 return CMD_WARNING;
1024 }
1025
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001026 int endp_no = strtoul(argv[1], NULL, 16);
1027 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1028 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1029 argv[1], endp_no, VTY_NEWLINE);
1030 return CMD_WARNING;
1031 }
1032
1033 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001034 mgcp_free_endp(endp);
1035 return CMD_SUCCESS;
1036}
1037
Harald Welte6a857052012-01-27 00:41:39 +01001038DEFUN(reset_endp, reset_endp_cmd,
1039 "reset-endpoint <0-64> NUMBER",
1040 "Reset the given endpoint\n" "Trunk number\n"
1041 "Endpoint number in hex.\n")
1042{
1043 struct mgcp_trunk_config *trunk;
1044 struct mgcp_endpoint *endp;
1045 int endp_no, rc;
1046
1047 trunk = find_trunk(g_cfg, atoi(argv[0]));
1048 if (!trunk) {
1049 vty_out(vty, "%%Trunk %d not found in the config.%s",
1050 atoi(argv[0]), VTY_NEWLINE);
1051 return CMD_WARNING;
1052 }
1053
1054 if (!trunk->endpoints) {
1055 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1056 trunk->trunk_nr, VTY_NEWLINE);
1057 return CMD_WARNING;
1058 }
1059
1060 endp_no = strtoul(argv[1], NULL, 16);
1061 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1062 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1063 argv[1], endp_no, VTY_NEWLINE);
1064 return CMD_WARNING;
1065 }
1066
1067 endp = &trunk->endpoints[endp_no];
1068 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1069 if (rc < 0) {
1070 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1071 return CMD_WARNING;
1072 }
1073 return CMD_SUCCESS;
1074}
1075
1076DEFUN(reset_all_endp, reset_all_endp_cmd,
1077 "reset-all-endpoints",
1078 "Reset all endpoints\n")
1079{
1080 int rc;
1081
1082 rc = mgcp_send_reset_all(g_cfg);
1083 if (rc < 0) {
1084 vty_out(vty, "Error %d during endpoint reset.%s",
1085 rc, VTY_NEWLINE);
1086 return CMD_WARNING;
1087 }
1088 return CMD_SUCCESS;
1089}
1090
Holger Hans Peter Freythercc84c952014-06-03 13:36:42 +02001091#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001092DEFUN(cfg_mgcp_osmux,
1093 cfg_mgcp_osmux_cmd,
1094 "osmux (on|off)",
1095 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1096{
1097 if (strcmp(argv[0], "on") == 0) {
1098 g_cfg->osmux = 1;
1099 if (g_cfg->trunk.audio_loop) {
1100 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1101 VTY_NEWLINE);
1102 return CMD_WARNING;
1103 }
1104 } else if (strcmp(argv[0], "off") == 0)
1105 g_cfg->osmux = 0;
1106
1107 return CMD_SUCCESS;
1108}
1109
1110DEFUN(cfg_mgcp_osmux_batch_factor,
1111 cfg_mgcp_osmux_batch_factor_cmd,
1112 "osmux batch-factor <1-4>",
1113 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1114{
1115 g_cfg->osmux_batch = atoi(argv[0]);
1116 return CMD_SUCCESS;
1117}
Harald Welte6a857052012-01-27 00:41:39 +01001118
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001119int mgcp_vty_init(void)
1120{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001121 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001122 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001123 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001124 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001125 install_element(ENABLE_NODE, &reset_endp_cmd);
1126 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001127
1128 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1129 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001130
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001131 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001132 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1133 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1134 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1135 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1136 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1137 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001138 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001139 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001140 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1141 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001142 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1143 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001144 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001145 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck42a833e2014-04-14 10:31:47 +02001146 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1147 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001148 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1149 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1150 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001151 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001152 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001153 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001154 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001155 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001156 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1157 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001158 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1159 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001160 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1161 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001162 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1163 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001164 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1165 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1166 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1167 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1168 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001169 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001170 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1171 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001172 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1173 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001174
1175 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1176 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001177 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001178 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1179 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1180 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001181 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1182 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001183 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1184 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001185 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001186 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1187 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001188 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1189 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1190 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1191 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1192 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001193 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001194 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1195 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001196
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001197 return 0;
1198}
1199
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001200static int allocate_trunk(struct mgcp_trunk_config *trunk)
1201{
1202 int i;
1203 struct mgcp_config *cfg = trunk->cfg;
1204
1205 if (mgcp_endpoints_allocate(trunk) != 0) {
1206 LOGP(DMGCP, LOGL_ERROR,
1207 "Failed to allocate %d endpoints on trunk %d.\n",
1208 trunk->number_endpoints, trunk->trunk_nr);
1209 return -1;
1210 }
1211
1212 /* early bind */
1213 for (i = 1; i < trunk->number_endpoints; ++i) {
1214 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001215
1216 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001217 cfg->last_bts_port += 2;
1218 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1219 LOGP(DMGCP, LOGL_FATAL,
1220 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001221 return -1;
1222 }
1223 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1224 }
1225
1226 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001227 cfg->last_net_port += 2;
1228 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1229 LOGP(DMGCP, LOGL_FATAL,
1230 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001231 return -1;
1232 }
1233 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1234 }
1235
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001236 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1237 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001238 int rtp_port;
1239
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001240 /* network side */
1241 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1242 cfg->transcoder_ports.base_port);
1243 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1244 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1245 return -1;
1246 }
1247 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1248
1249 /* bts side */
1250 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1251 cfg->transcoder_ports.base_port);
1252 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1253 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1254 return -1;
1255 }
1256 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1257 }
1258 }
1259
1260 return 0;
1261}
1262
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001263int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1264 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001265{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001266 int rc;
1267 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001268
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001269 /* Default to 4 messages */
1270 cfg->osmux_batch = 4;
1271
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001272 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001273 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001274 if (rc < 0) {
1275 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1276 return rc;
1277 }
1278
1279
1280 if (!g_cfg->bts_ip)
1281 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1282
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001283 if (!g_cfg->source_addr) {
1284 fprintf(stderr, "You need to specify a bind address.\n");
1285 return -1;
1286 }
1287
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001288 /* initialize the last ports */
1289 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1290 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1291
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001292 if (allocate_trunk(&g_cfg->trunk) != 0) {
1293 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001294 return -1;
1295 }
1296
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001297 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1298 if (allocate_trunk(trunk) != 0) {
1299 LOGP(DMGCP, LOGL_ERROR,
1300 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1301 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001302 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001303 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001304 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001305
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001306 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001307}
1308