blob: 408a0596a5eccb6d0a1bb65483910817979dafa4 [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);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800132
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100133 return CMD_SUCCESS;
134}
135
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100136static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100137{
138 int i;
139
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100140 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
141 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
142 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
143
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100144 if (!cfg->endpoints) {
145 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
146 return;
147 }
148
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100149 for (i = 1; i < cfg->number_endpoints; ++i) {
150 struct mgcp_endpoint *endp = &cfg->endpoints[i];
151 vty_out(vty,
152 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200153 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100154 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800155 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
156 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
157 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200158 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100159 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200160 VTY_NEWLINE);
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100161
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100162 if (verbose) {
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100163 vty_out(vty,
164 " Timestamp Errs: BTS %d->%d, Net %d->%d%s",
165 endp->bts_state.in_stream.err_ts_counter,
166 endp->bts_state.out_stream.err_ts_counter,
167 endp->net_state.in_stream.err_ts_counter,
168 endp->net_state.out_stream.err_ts_counter,
169 VTY_NEWLINE);
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100170 vty_out(vty,
171 " Dropped Packets: Net->BTS %d, BTS->Net %d%s",
172 endp->bts_end.dropped_packets,
173 endp->net_end.dropped_packets,
174 VTY_NEWLINE);
175 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100176 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100177}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100178
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100179DEFUN(show_mcgp, show_mgcp_cmd,
180 "show mgcp [stats]",
181 SHOW_STR
182 "Display information about the MGCP Media Gateway\n"
183 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100184{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100185 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100186 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100187
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100188 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100189
190 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100191 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100192
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100193 return CMD_SUCCESS;
194}
195
196DEFUN(cfg_mgcp,
197 cfg_mgcp_cmd,
198 "mgcp",
199 "Configure the MGCP")
200{
201 vty->node = MGCP_NODE;
202 return CMD_SUCCESS;
203}
204
205DEFUN(cfg_mgcp_local_ip,
206 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800207 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100208 "Local options for the SDP record\n"
209 IP_STR
210 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100211{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200212 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100213 return CMD_SUCCESS;
214}
215
216DEFUN(cfg_mgcp_bts_ip,
217 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800218 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100219 "BTS Audio source/destination options\n"
220 IP_STR
221 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100222{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200223 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100224 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
225 return CMD_SUCCESS;
226}
227
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100228#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100229DEFUN(cfg_mgcp_bind_ip,
230 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800231 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100232 BIND_STR
233 IP_STR
234 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100235{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200236 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100237 return CMD_SUCCESS;
238}
239
240DEFUN(cfg_mgcp_bind_port,
241 cfg_mgcp_bind_port_cmd,
242 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100243 BIND_STR
244 "Port information\n"
245 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100246{
247 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100248 g_cfg->source_port = port;
249 return CMD_SUCCESS;
250}
251
252DEFUN(cfg_mgcp_bind_early,
253 cfg_mgcp_bind_early_cmd,
254 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100255 BIND_STR
256 "Bind local ports on start up\n"
257 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100258{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800259 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
260 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100261}
262
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800263static void parse_base(struct mgcp_port_range *range, const char **argv)
264{
265 unsigned int port = atoi(argv[0]);
266 range->mode = PORT_ALLOC_STATIC;
267 range->base_port = port;
268}
269
270static void parse_range(struct mgcp_port_range *range, const char **argv)
271{
272 range->mode = PORT_ALLOC_DYNAMIC;
273 range->range_start = atoi(argv[0]);
274 range->range_end = atoi(argv[1]);
275 range->last_port = g_cfg->bts_ports.range_start;
276}
277
278
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100279#define RTP_STR "RTP configuration\n"
280#define BTS_START_STR "First UDP port allocated for the BTS side\n"
281#define NET_START_STR "First UDP port allocated for the NET side\n"
282#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800283DEFUN(cfg_mgcp_rtp_bts_base_port,
284 cfg_mgcp_rtp_bts_base_port_cmd,
285 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100286 RTP_STR
287 BTS_START_STR
288 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100289{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800290 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100291 return CMD_SUCCESS;
292}
293
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100294#define RANGE_START_STR "Start of the range of ports\n"
295#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800296DEFUN(cfg_mgcp_rtp_bts_range,
297 cfg_mgcp_rtp_bts_range_cmd,
298 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100299 RTP_STR "Range of ports to use for the BTS side\n"
300 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800301{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800302 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800303 return CMD_SUCCESS;
304}
305
306DEFUN(cfg_mgcp_rtp_net_range,
307 cfg_mgcp_rtp_net_range_cmd,
308 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100309 RTP_STR "Range of ports to use for the NET side\n"
310 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800311{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800312 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800313 return CMD_SUCCESS;
314}
315
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800316DEFUN(cfg_mgcp_rtp_net_base_port,
317 cfg_mgcp_rtp_net_base_port_cmd,
318 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100319 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800320{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800321 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800322 return CMD_SUCCESS;
323}
324
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800325ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100326 "rtp base <0-65534>",
327 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800328
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800329DEFUN(cfg_mgcp_rtp_transcoder_range,
330 cfg_mgcp_rtp_transcoder_range_cmd,
331 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100332 RTP_STR "Range of ports to use for the Transcoder\n"
333 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800334{
335 parse_range(&g_cfg->transcoder_ports, argv);
336 return CMD_SUCCESS;
337}
338
339DEFUN(cfg_mgcp_rtp_transcoder_base,
340 cfg_mgcp_rtp_transcoder_base_cmd,
341 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100342 RTP_STR "First UDP port allocated for the Transcoder side\n"
343 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800344{
345 parse_base(&g_cfg->transcoder_ports, argv);
346 return CMD_SUCCESS;
347}
348
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800349DEFUN(cfg_mgcp_rtp_ip_dscp,
350 cfg_mgcp_rtp_ip_dscp_cmd,
351 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100352 RTP_STR
353 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800354{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800355 int dscp = atoi(argv[0]);
356 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800357 return CMD_SUCCESS;
358}
359
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800360ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
361 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100362 RTP_STR
363 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800364
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200365DEFUN(cfg_mgcp_sdp_fmtp_extra,
366 cfg_mgcp_sdp_fmtp_extra_cmd,
367 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100368 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
369 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200370{
371 char *txt = argv_concat(argv, argc, 0);
372 if (!txt)
373 return CMD_WARNING;
374
375 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
376 talloc_free(txt);
377 return CMD_SUCCESS;
378}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800379
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100380#define SDP_STR "SDP File related options\n"
381#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100382DEFUN(cfg_mgcp_sdp_payload_number,
383 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100384 "sdp audio-payload number <1-255>",
385 SDP_STR AUDIO_STR
386 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100387{
388 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100389 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100390 return CMD_SUCCESS;
391}
392
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100393ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
394 "sdp audio payload number <1-255>",
395 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
396
397
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100398DEFUN(cfg_mgcp_sdp_payload_name,
399 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100400 "sdp audio-payload name NAME",
401 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100402{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100403 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100404 return CMD_SUCCESS;
405}
406
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100407ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
408 "sdp audio payload name NAME",
409 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
410
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100411DEFUN(cfg_mgcp_sdp_payload_send_ptime,
412 cfg_mgcp_sdp_payload_send_ptime_cmd,
413 "sdp audio-payload send-ptime",
414 SDP_STR AUDIO_STR
415 "Send SDP ptime (packet duration) attribute\n")
416{
417 g_cfg->trunk.audio_send_ptime = 1;
418 return CMD_SUCCESS;
419}
420
421DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
422 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
423 "no sdp audio-payload send-ptime",
424 NO_STR SDP_STR AUDIO_STR
425 "Send SDP ptime (packet duration) attribute\n")
426{
427 g_cfg->trunk.audio_send_ptime = 0;
428 return CMD_SUCCESS;
429}
430
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100431DEFUN(cfg_mgcp_loop,
432 cfg_mgcp_loop_cmd,
433 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100434 "Loop audio for all endpoints on main trunk\n"
435 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100436{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100437 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100438 return CMD_SUCCESS;
439}
440
441DEFUN(cfg_mgcp_number_endp,
442 cfg_mgcp_number_endp_cmd,
443 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100444 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100445{
446 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100447 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100448 return CMD_SUCCESS;
449}
450
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200451DEFUN(cfg_mgcp_omit_rtcp,
452 cfg_mgcp_omit_rtcp_cmd,
453 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200454 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200455{
456 g_cfg->trunk.omit_rtcp = 1;
457 return CMD_SUCCESS;
458}
459
460DEFUN(cfg_mgcp_no_omit_rtcp,
461 cfg_mgcp_no_omit_rtcp_cmd,
462 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200463 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200464{
465 g_cfg->trunk.omit_rtcp = 0;
466 return CMD_SUCCESS;
467}
468
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100469DEFUN(cfg_mgcp_patch_rtp_ssrc,
470 cfg_mgcp_patch_rtp_ssrc_cmd,
471 "rtp-patch ssrc",
472 RTP_PATCH_STR
473 "Force a fixed SSRC\n"
474 )
475{
476 g_cfg->trunk.force_constant_ssrc = 1;
477 return CMD_SUCCESS;
478}
479
480DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
481 cfg_mgcp_no_patch_rtp_ssrc_cmd,
482 "no rtp-patch ssrc",
483 NO_STR RTP_PATCH_STR
484 "Force a fixed SSRC\n"
485 )
486{
487 g_cfg->trunk.force_constant_ssrc = 0;
488 return CMD_SUCCESS;
489}
490
491DEFUN(cfg_mgcp_patch_rtp_ts,
492 cfg_mgcp_patch_rtp_ts_cmd,
493 "rtp-patch timestamp",
494 RTP_PATCH_STR
495 "Adjust RTP timestamp\n"
496 )
497{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100498 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100499 return CMD_SUCCESS;
500}
501
502DEFUN(cfg_mgcp_no_patch_rtp_ts,
503 cfg_mgcp_no_patch_rtp_ts_cmd,
504 "no rtp-patch timestamp",
505 NO_STR RTP_PATCH_STR
506 "Adjust RTP timestamp\n"
507 )
508{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100509 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100510 return CMD_SUCCESS;
511}
512
513DEFUN(cfg_mgcp_no_patch_rtp,
514 cfg_mgcp_no_patch_rtp_cmd,
515 "no rtp-patch",
516 NO_STR RTP_PATCH_STR)
517{
518 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100519 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100520 return CMD_SUCCESS;
521}
522
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100523DEFUN(cfg_mgcp_rtp_keepalive,
524 cfg_mgcp_rtp_keepalive_cmd,
525 "rtp keep-alive <1-120>",
526 RTP_STR RTP_KEEPALIVE_STR
527 "Keep alive interval in secs\n"
528 )
529{
530 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
531 return CMD_SUCCESS;
532}
533
534DEFUN(cfg_mgcp_rtp_keepalive_once,
535 cfg_mgcp_rtp_keepalive_once_cmd,
536 "rtp keep-alive once",
537 RTP_STR RTP_KEEPALIVE_STR
538 "Send dummy packet only once after CRCX/MDCX\n"
539 )
540{
541 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
542 return CMD_SUCCESS;
543}
544
545DEFUN(cfg_mgcp_no_rtp_keepalive,
546 cfg_mgcp_no_rtp_keepalive_cmd,
547 "no rtp keep-alive",
548 NO_STR RTP_STR RTP_KEEPALIVE_STR
549 )
550{
551 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
552 return CMD_SUCCESS;
553}
554
555
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100556
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100557#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200558DEFUN(cfg_mgcp_agent_addr,
559 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100560 "call-agent ip A.B.C.D",
561 CALL_AGENT_STR IP_STR
562 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200563{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200564 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200565 return CMD_SUCCESS;
566}
567
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100568ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
569 "call agent ip A.B.C.D",
570 CALL_AGENT_STR CALL_AGENT_STR IP_STR
571 "IPv4 Address of the callagent\n")
572
573
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800574DEFUN(cfg_mgcp_transcoder,
575 cfg_mgcp_transcoder_cmd,
576 "transcoder-mgw A.B.C.D",
577 "Use a MGW to detranscoder RTP\n"
578 "The IP address of the MGW")
579{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200580 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800581 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
582
583 return CMD_SUCCESS;
584}
585
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100586DEFUN(cfg_mgcp_no_transcoder,
587 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100588 "no transcoder-mgw",
589 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100590{
591 if (g_cfg->transcoder_ip) {
592 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
593 talloc_free(g_cfg->transcoder_ip);
594 g_cfg->transcoder_ip = NULL;
595 }
596
597 return CMD_SUCCESS;
598}
599
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800600DEFUN(cfg_mgcp_transcoder_remote_base,
601 cfg_mgcp_transcoder_remote_base_cmd,
602 "transcoder-remote-base <0-65534>",
603 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
604{
605 g_cfg->transcoder_remote_base = atoi(argv[0]);
606 return CMD_SUCCESS;
607}
608
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100609DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
610 "trunk <1-64>",
611 "Configure a SS7 trunk\n" "Trunk Nr\n")
612{
613 struct mgcp_trunk_config *trunk;
614 int index = atoi(argv[0]);
615
616 trunk = mgcp_trunk_num(g_cfg, index);
617 if (!trunk)
618 trunk = mgcp_trunk_alloc(g_cfg, index);
619
620 if (!trunk) {
621 vty_out(vty, "%%Unable to allocate trunk %u.%s",
622 index, VTY_NEWLINE);
623 return CMD_WARNING;
624 }
625
626 vty->node = TRUNK_NODE;
627 vty->index = trunk;
628 return CMD_SUCCESS;
629}
630
631static int config_write_trunk(struct vty *vty)
632{
633 struct mgcp_trunk_config *trunk;
634
635 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
636 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100637 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100638 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100639 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100640 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100641 vty_out(vty, " %ssdp audio-payload send-ptime%s",
642 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100643
644 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
645 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
646 else if (trunk->keepalive_interval)
647 vty_out(vty, " rtp keep-alive %d%s",
648 trunk->keepalive_interval, VTY_NEWLINE);
649 else
650 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
651
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100652 vty_out(vty, " loop %d%s",
653 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200654 if (trunk->omit_rtcp)
655 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
656 else
657 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100658 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100659 vty_out(vty, " %srtp-patch ssrc%s",
660 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
661 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100662 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100663 } else
664 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200665 if (trunk->audio_fmtp_extra)
666 vty_out(vty, " sdp audio fmtp-extra %s%s",
667 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100668 }
669
670 return CMD_SUCCESS;
671}
672
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200673DEFUN(cfg_trunk_sdp_fmtp_extra,
674 cfg_trunk_sdp_fmtp_extra_cmd,
675 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100676 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
677 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200678{
679 struct mgcp_trunk_config *trunk = vty->index;
680 char *txt = argv_concat(argv, argc, 0);
681 if (!txt)
682 return CMD_WARNING;
683
684 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
685 talloc_free(txt);
686 return CMD_SUCCESS;
687}
688
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100689DEFUN(cfg_trunk_payload_number,
690 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100691 "sdp audio-payload number <1-255>",
692 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100693{
694 struct mgcp_trunk_config *trunk = vty->index;
695 unsigned int payload = atoi(argv[0]);
696
697 trunk->audio_payload = payload;
698 return CMD_SUCCESS;
699}
700
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100701ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
702 "sdp audio payload number <1-255>",
703 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
704
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100705DEFUN(cfg_trunk_payload_name,
706 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100707 "sdp audio-payload name NAME",
708 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100709{
710 struct mgcp_trunk_config *trunk = vty->index;
711
712 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
713 return CMD_SUCCESS;
714}
715
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100716ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
717 "sdp audio payload name NAME",
718 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
719
720
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100721DEFUN(cfg_trunk_loop,
722 cfg_trunk_loop_cmd,
723 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100724 "Loop audio for all endpoints on this trunk\n"
725 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100726{
727 struct mgcp_trunk_config *trunk = vty->index;
728
729 trunk->audio_loop = atoi(argv[0]);
730 return CMD_SUCCESS;
731}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800732
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100733DEFUN(cfg_trunk_sdp_payload_send_ptime,
734 cfg_trunk_sdp_payload_send_ptime_cmd,
735 "sdp audio-payload send-ptime",
736 SDP_STR AUDIO_STR
737 "Send SDP ptime (packet duration) attribute\n")
738{
739 struct mgcp_trunk_config *trunk = vty->index;
740 trunk->audio_send_ptime = 1;
741 return CMD_SUCCESS;
742}
743
744DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
745 cfg_trunk_no_sdp_payload_send_ptime_cmd,
746 "no sdp audio-payload send-ptime",
747 NO_STR SDP_STR AUDIO_STR
748 "Send SDP ptime (packet duration) attribute\n")
749{
750 struct mgcp_trunk_config *trunk = vty->index;
751 trunk->audio_send_ptime = 0;
752 return CMD_SUCCESS;
753}
754
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200755DEFUN(cfg_trunk_omit_rtcp,
756 cfg_trunk_omit_rtcp_cmd,
757 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200758 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200759{
760 struct mgcp_trunk_config *trunk = vty->index;
761 trunk->omit_rtcp = 1;
762 return CMD_SUCCESS;
763}
764
765DEFUN(cfg_trunk_no_omit_rtcp,
766 cfg_trunk_no_omit_rtcp_cmd,
767 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200768 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200769{
770 struct mgcp_trunk_config *trunk = vty->index;
771 trunk->omit_rtcp = 0;
772 return CMD_SUCCESS;
773}
774
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100775DEFUN(cfg_trunk_patch_rtp_ssrc,
776 cfg_trunk_patch_rtp_ssrc_cmd,
777 "rtp-patch ssrc",
778 RTP_PATCH_STR
779 "Force a fixed SSRC\n"
780 )
781{
782 struct mgcp_trunk_config *trunk = vty->index;
783 trunk->force_constant_ssrc = 1;
784 return CMD_SUCCESS;
785}
786
787DEFUN(cfg_trunk_no_patch_rtp_ssrc,
788 cfg_trunk_no_patch_rtp_ssrc_cmd,
789 "no rtp-patch ssrc",
790 NO_STR RTP_PATCH_STR
791 "Force a fixed SSRC\n"
792 )
793{
794 struct mgcp_trunk_config *trunk = vty->index;
795 trunk->force_constant_ssrc = 0;
796 return CMD_SUCCESS;
797}
798
799DEFUN(cfg_trunk_patch_rtp_ts,
800 cfg_trunk_patch_rtp_ts_cmd,
801 "rtp-patch timestamp",
802 RTP_PATCH_STR
803 "Adjust RTP timestamp\n"
804 )
805{
806 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100807 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100808 return CMD_SUCCESS;
809}
810
811DEFUN(cfg_trunk_no_patch_rtp_ts,
812 cfg_trunk_no_patch_rtp_ts_cmd,
813 "no rtp-patch timestamp",
814 NO_STR RTP_PATCH_STR
815 "Adjust RTP timestamp\n"
816 )
817{
818 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100819 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100820 return CMD_SUCCESS;
821}
822
823DEFUN(cfg_trunk_no_patch_rtp,
824 cfg_trunk_no_patch_rtp_cmd,
825 "no rtp-patch",
826 NO_STR RTP_PATCH_STR)
827{
828 struct mgcp_trunk_config *trunk = vty->index;
829 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100830 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100831 return CMD_SUCCESS;
832}
833
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100834DEFUN(cfg_trunk_rtp_keepalive,
835 cfg_trunk_rtp_keepalive_cmd,
836 "rtp keep-alive <1-120>",
837 RTP_STR RTP_KEEPALIVE_STR
838 "Keep-alive interval in secs\n"
839 )
840{
841 struct mgcp_trunk_config *trunk = vty->index;
842 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
843 return CMD_SUCCESS;
844}
845
846DEFUN(cfg_trunk_rtp_keepalive_once,
847 cfg_trunk_rtp_keepalive_once_cmd,
848 "rtp keep-alive once",
849 RTP_STR RTP_KEEPALIVE_STR
850 "Send dummy packet only once after CRCX/MDCX\n"
851 )
852{
853 struct mgcp_trunk_config *trunk = vty->index;
854 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
855 return CMD_SUCCESS;
856}
857
858DEFUN(cfg_trunk_no_rtp_keepalive,
859 cfg_trunk_no_rtp_keepalive_cmd,
860 "no rtp keep-alive",
861 NO_STR RTP_STR RTP_KEEPALIVE_STR
862 )
863{
864 struct mgcp_trunk_config *trunk = vty->index;
865 mgcp_trunk_set_keepalive(trunk, 0);
866 return CMD_SUCCESS;
867}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100868
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800869DEFUN(loop_endp,
870 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100871 "loop-endpoint <0-64> NAME (0|1)",
872 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800873 "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 +0800874{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100875 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800876 struct mgcp_endpoint *endp;
877
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100878 trunk = find_trunk(g_cfg, atoi(argv[0]));
879 if (!trunk) {
880 vty_out(vty, "%%Trunk %d not found in the config.%s",
881 atoi(argv[0]), VTY_NEWLINE);
882 return CMD_WARNING;
883 }
884
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100885 if (!trunk->endpoints) {
886 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
887 trunk->trunk_nr, VTY_NEWLINE);
888 return CMD_WARNING;
889 }
890
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100891 int endp_no = strtoul(argv[1], NULL, 16);
892 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800893 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100894 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800895 return CMD_WARNING;
896 }
897
898
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100899 endp = &trunk->endpoints[endp_no];
900 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800901
902 if (loop)
903 endp->conn_mode = MGCP_CONN_LOOPBACK;
904 else
905 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100906
907 /* Handle it like a MDCX, switch on SSRC patching if enabled */
908 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
909 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800910
911 return CMD_SUCCESS;
912}
913
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800914DEFUN(tap_call,
915 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100916 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
917 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800918 "The endpoint in hex\n"
919 "Forward the data coming from the bts\n"
920 "Forward the data coming from the bts leaving to the network\n"
921 "Forward the data coming from the net\n"
922 "Forward the data coming from the net leaving to the bts\n"
923 "destination IP of the data\n" "destination port\n")
924{
925 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100926 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800927 struct mgcp_endpoint *endp;
928 int port = 0;
929
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100930 trunk = find_trunk(g_cfg, atoi(argv[0]));
931 if (!trunk) {
932 vty_out(vty, "%%Trunk %d not found in the config.%s",
933 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800934 return CMD_WARNING;
935 }
936
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100937 if (!trunk->endpoints) {
938 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
939 trunk->trunk_nr, VTY_NEWLINE);
940 return CMD_WARNING;
941 }
942
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100943 int endp_no = strtoul(argv[1], NULL, 16);
944 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
945 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
946 argv[1], endp_no, VTY_NEWLINE);
947 return CMD_WARNING;
948 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800949
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100950 endp = &trunk->endpoints[endp_no];
951
952 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800953 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100954 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800955 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100956 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800957 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100958 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800959 port = MGCP_TAP_NET_OUT;
960 } else {
961 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
962 return CMD_WARNING;
963 }
964
965 tap = &endp->taps[port];
966 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100967 inet_aton(argv[3], &tap->forward.sin_addr);
968 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800969 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800970 return CMD_SUCCESS;
971}
972
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800973DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100974 "free-endpoint <0-64> NUMBER",
975 "Free the given endpoint\n" "Trunk number\n"
976 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800977{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100978 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800979 struct mgcp_endpoint *endp;
980
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100981 trunk = find_trunk(g_cfg, atoi(argv[0]));
982 if (!trunk) {
983 vty_out(vty, "%%Trunk %d not found in the config.%s",
984 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800985 return CMD_WARNING;
986 }
987
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100988 if (!trunk->endpoints) {
989 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
990 trunk->trunk_nr, VTY_NEWLINE);
991 return CMD_WARNING;
992 }
993
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100994 int endp_no = strtoul(argv[1], NULL, 16);
995 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
996 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
997 argv[1], endp_no, VTY_NEWLINE);
998 return CMD_WARNING;
999 }
1000
1001 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001002 mgcp_free_endp(endp);
1003 return CMD_SUCCESS;
1004}
1005
Harald Welte6a857052012-01-27 00:41:39 +01001006DEFUN(reset_endp, reset_endp_cmd,
1007 "reset-endpoint <0-64> NUMBER",
1008 "Reset the given endpoint\n" "Trunk number\n"
1009 "Endpoint number in hex.\n")
1010{
1011 struct mgcp_trunk_config *trunk;
1012 struct mgcp_endpoint *endp;
1013 int endp_no, rc;
1014
1015 trunk = find_trunk(g_cfg, atoi(argv[0]));
1016 if (!trunk) {
1017 vty_out(vty, "%%Trunk %d not found in the config.%s",
1018 atoi(argv[0]), VTY_NEWLINE);
1019 return CMD_WARNING;
1020 }
1021
1022 if (!trunk->endpoints) {
1023 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1024 trunk->trunk_nr, VTY_NEWLINE);
1025 return CMD_WARNING;
1026 }
1027
1028 endp_no = strtoul(argv[1], NULL, 16);
1029 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1030 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1031 argv[1], endp_no, VTY_NEWLINE);
1032 return CMD_WARNING;
1033 }
1034
1035 endp = &trunk->endpoints[endp_no];
1036 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1037 if (rc < 0) {
1038 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1039 return CMD_WARNING;
1040 }
1041 return CMD_SUCCESS;
1042}
1043
1044DEFUN(reset_all_endp, reset_all_endp_cmd,
1045 "reset-all-endpoints",
1046 "Reset all endpoints\n")
1047{
1048 int rc;
1049
1050 rc = mgcp_send_reset_all(g_cfg);
1051 if (rc < 0) {
1052 vty_out(vty, "Error %d during endpoint reset.%s",
1053 rc, VTY_NEWLINE);
1054 return CMD_WARNING;
1055 }
1056 return CMD_SUCCESS;
1057}
1058
1059
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001060int mgcp_vty_init(void)
1061{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001062 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001063 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001064 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001065 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001066 install_element(ENABLE_NODE, &reset_endp_cmd);
1067 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001068
1069 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1070 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001071
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001072 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001073 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1074 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1075 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1076 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1077 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1078 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001079 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001080 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001081 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1082 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001083 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1084 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001085 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001086 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001087 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1088 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1089 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001090 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001091 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001092 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001093 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001094 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001095 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1096 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001097 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1098 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001099 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1100 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001101 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1102 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001103 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1104 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1105 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1106 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1107 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001108 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001109 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1110 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001111
1112 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1113 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001114 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001115 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1116 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1117 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001118 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1119 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001120 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1121 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001122 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001123 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1124 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001125 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1126 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1127 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1128 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1129 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001130 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001131 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1132 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001133
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001134 return 0;
1135}
1136
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001137static int allocate_trunk(struct mgcp_trunk_config *trunk)
1138{
1139 int i;
1140 struct mgcp_config *cfg = trunk->cfg;
1141
1142 if (mgcp_endpoints_allocate(trunk) != 0) {
1143 LOGP(DMGCP, LOGL_ERROR,
1144 "Failed to allocate %d endpoints on trunk %d.\n",
1145 trunk->number_endpoints, trunk->trunk_nr);
1146 return -1;
1147 }
1148
1149 /* early bind */
1150 for (i = 1; i < trunk->number_endpoints; ++i) {
1151 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001152
1153 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001154 cfg->last_bts_port += 2;
1155 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1156 LOGP(DMGCP, LOGL_FATAL,
1157 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001158 return -1;
1159 }
1160 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1161 }
1162
1163 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001164 cfg->last_net_port += 2;
1165 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1166 LOGP(DMGCP, LOGL_FATAL,
1167 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001168 return -1;
1169 }
1170 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1171 }
1172
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001173 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1174 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001175 int rtp_port;
1176
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001177 /* network side */
1178 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1179 cfg->transcoder_ports.base_port);
1180 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1181 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1182 return -1;
1183 }
1184 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1185
1186 /* bts side */
1187 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1188 cfg->transcoder_ports.base_port);
1189 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1190 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1191 return -1;
1192 }
1193 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1194 }
1195 }
1196
1197 return 0;
1198}
1199
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001200int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1201 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001202{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001203 int rc;
1204 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001205
1206 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001207 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001208 if (rc < 0) {
1209 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1210 return rc;
1211 }
1212
1213
1214 if (!g_cfg->bts_ip)
1215 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1216
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001217 if (!g_cfg->source_addr) {
1218 fprintf(stderr, "You need to specify a bind address.\n");
1219 return -1;
1220 }
1221
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001222 /* initialize the last ports */
1223 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1224 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1225
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001226 if (allocate_trunk(&g_cfg->trunk) != 0) {
1227 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001228 return -1;
1229 }
1230
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001231 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1232 if (allocate_trunk(trunk) != 0) {
1233 LOGP(DMGCP, LOGL_ERROR,
1234 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1235 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001236 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001237 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001238 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001239
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001240 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001241}
1242