blob: 5124ca670964aeb5ad1c3f552f5497f731bc2f43 [file] [log] [blame]
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
2/* The protocol implementation */
3
4/*
Holger Hans Peter Freytherb30b3aa2014-07-04 20:23:56 +02005 * (C) 2009-2014 by Holger Hans Peter Freyther <zecke@selfish.org>
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +01006 * (C) 2009-2011 by On-Waves
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01007 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
Harald Welte0e3e88e2011-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 Freyther6f38c062010-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 Welte0e3e88e2011-01-01 15:25:50 +010017 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010018 *
Harald Welte0e3e88e2011-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 Freyther6f38c062010-02-20 21:21:02 +010021 *
22 */
23
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010024
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +010025#include <osmocom/core/talloc.h>
Holger Hans Peter Freytherf41fb1f2010-02-26 20:16:37 +010026
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010027#include <openbsc/mgcp.h>
28#include <openbsc/mgcp_internal.h>
Harald Welte58ed1cb2010-05-14 18:59:17 +020029#include <openbsc/vty.h>
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010030
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020031#include <string.h>
32
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +020033#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
Jacob Erlbecke5546cd2013-12-03 14:43:34 +010034#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
Jacob Erlbecke64bb122013-12-19 18:53:07 +010035#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +020036
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010037static struct mgcp_config *g_cfg = NULL;
38
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010039static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010040{
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010041 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010042
Holger Hans Peter Freyther1ca419d2011-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 Freyther75cf62d2011-02-28 01:29:02 +010049}
50
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010051/*
52 * vty code for mgcp below
53 */
54struct cmd_node mgcp_node = {
55 MGCP_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020056 "%s(config-mgcp)# ",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010057 1,
58};
59
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010060struct cmd_node trunk_node = {
61 TRUNK_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020062 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010063 1,
64};
65
Holger Hans Peter Freyther6f38c062010-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 Freythere8d13712010-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 Freyther6f38c062010-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 Freyther2ea91182010-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 Freytherf3307292010-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 Freyther2ea91182010-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 Freytherf3307292010-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 Freyther3140c4f2010-07-27 20:34:45 +080088 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Jacob Erlbecke64bb122013-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 Freyther51ade842012-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 Erlbeckf12c8492013-12-18 12:54:51 +0100101 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_aligned_timing) {
Jacob Erlbecke5546cd2013-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 Erlbeckf12c8492013-12-18 12:54:51 +0100105 g_cfg->trunk.force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100106 } else
107 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100108 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100109 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100110 g_cfg->trunk.audio_payload, VTY_NEWLINE);
111 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100112 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100113 g_cfg->trunk.audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-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 Erlbecke91324d2013-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 Freyther60e09922014-11-19 16:04:45 +0100119 vty_out(vty, " %ssdp audio-payload send-name%s",
120 g_cfg->trunk.audio_send_name ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100121 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
122 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200123 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100124 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800125 if (g_cfg->transcoder_ip)
126 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100127
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800128 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
129 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
130 else
131 vty_out(vty, " rtp transcoder-range %u %u%s",
132 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb30b3aa2014-07-04 20:23:56 +0200133 if (g_cfg->bts_force_ptime > 0)
134 vty_out(vty, " rtp force-ptime %d%s", g_cfg->bts_force_ptime, VTY_NEWLINE);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800135 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100136 vty_out(vty, " osmux %s%s",
137 g_cfg->osmux == 1 ? "on" : "off", VTY_NEWLINE);
Pablo Neira Ayusob84aea32014-08-29 15:24:00 +0200138 if (g_cfg->osmux) {
139 vty_out(vty, " osmux batch-factor %d%s",
140 g_cfg->osmux_batch, VTY_NEWLINE);
141 vty_out(vty, " osmux batch-size %u%s",
142 g_cfg->osmux_batch_size, VTY_NEWLINE);
143 vty_out(vty, " osmux port %u%s",
144 g_cfg->osmux_port, VTY_NEWLINE);
145 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100146 return CMD_SUCCESS;
147}
148
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200149static void dump_rtp_end(const char *end_name, struct vty *vty,
150 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
151{
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200152 struct mgcp_rtp_codec *codec = &end->codec;
153
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200154 vty_out(vty,
155 " %s%s"
156 " Timestamp Errs: %d->%d%s"
157 " Dropped Packets: %d%s"
158 " Payload Type: %d Rate: %u Channels: %d %s"
159 " Frame Duration: %u Frame Denominator: %u%s"
160 " FPP: %d Packet Duration: %u%s"
161 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
162 " Output-Enabled: %d Force-PTIME: %d%s",
163 end_name, VTY_NEWLINE,
164 state->in_stream.err_ts_counter,
165 state->out_stream.err_ts_counter, VTY_NEWLINE,
166 end->dropped_packets, VTY_NEWLINE,
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200167 codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
168 codec->frame_duration_num, codec->frame_duration_den, VTY_NEWLINE,
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200169 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200170 end->fmtp_extra, codec->audio_name, codec->subtype_name, VTY_NEWLINE,
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200171 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
172}
173
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100174static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100175{
176 int i;
177
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100178 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
179 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
180 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
181
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100182 if (!cfg->endpoints) {
183 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
184 return;
185 }
186
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100187 for (i = 1; i < cfg->number_endpoints; ++i) {
188 struct mgcp_endpoint *endp = &cfg->endpoints[i];
189 vty_out(vty,
190 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200191 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100192 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-08-05 01:34:51 +0800193 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
194 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
195 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200196 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100197 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200198 VTY_NEWLINE);
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100199
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200200 if (verbose && endp->allocated) {
201 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
202 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck8c1f4b02013-12-19 12:13:32 +0100203 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100204 }
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100205}
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100206
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100207DEFUN(show_mcgp, show_mgcp_cmd,
208 "show mgcp [stats]",
209 SHOW_STR
210 "Display information about the MGCP Media Gateway\n"
211 "Include Statistics\n")
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100212{
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100213 struct mgcp_trunk_config *trunk;
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100214 int show_stats = argc >= 1;
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100215
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100216 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100217
218 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100219 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100220
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100221 return CMD_SUCCESS;
222}
223
224DEFUN(cfg_mgcp,
225 cfg_mgcp_cmd,
226 "mgcp",
227 "Configure the MGCP")
228{
229 vty->node = MGCP_NODE;
230 return CMD_SUCCESS;
231}
232
233DEFUN(cfg_mgcp_local_ip,
234 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800235 "local ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100236 "Local options for the SDP record\n"
237 IP_STR
238 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100239{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200240 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100241 return CMD_SUCCESS;
242}
243
244DEFUN(cfg_mgcp_bts_ip,
245 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800246 "bts ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100247 "BTS Audio source/destination options\n"
248 IP_STR
249 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100250{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200251 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100252 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
253 return CMD_SUCCESS;
254}
255
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100256#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100257DEFUN(cfg_mgcp_bind_ip,
258 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800259 "bind ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100260 BIND_STR
261 IP_STR
262 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100263{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200264 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100265 return CMD_SUCCESS;
266}
267
268DEFUN(cfg_mgcp_bind_port,
269 cfg_mgcp_bind_port_cmd,
270 "bind port <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100271 BIND_STR
272 "Port information\n"
273 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100274{
275 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100276 g_cfg->source_port = port;
277 return CMD_SUCCESS;
278}
279
280DEFUN(cfg_mgcp_bind_early,
281 cfg_mgcp_bind_early_cmd,
282 "bind early (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100283 BIND_STR
284 "Bind local ports on start up\n"
285 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100286{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800287 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
288 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100289}
290
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800291static void parse_base(struct mgcp_port_range *range, const char **argv)
292{
293 unsigned int port = atoi(argv[0]);
294 range->mode = PORT_ALLOC_STATIC;
295 range->base_port = port;
296}
297
298static void parse_range(struct mgcp_port_range *range, const char **argv)
299{
300 range->mode = PORT_ALLOC_DYNAMIC;
301 range->range_start = atoi(argv[0]);
302 range->range_end = atoi(argv[1]);
303 range->last_port = g_cfg->bts_ports.range_start;
304}
305
306
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100307#define RTP_STR "RTP configuration\n"
308#define BTS_START_STR "First UDP port allocated for the BTS side\n"
309#define NET_START_STR "First UDP port allocated for the NET side\n"
310#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800311DEFUN(cfg_mgcp_rtp_bts_base_port,
312 cfg_mgcp_rtp_bts_base_port_cmd,
313 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100314 RTP_STR
315 BTS_START_STR
316 UDP_PORT_STR)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100317{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800318 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100319 return CMD_SUCCESS;
320}
321
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100322#define RANGE_START_STR "Start of the range of ports\n"
323#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800324DEFUN(cfg_mgcp_rtp_bts_range,
325 cfg_mgcp_rtp_bts_range_cmd,
326 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100327 RTP_STR "Range of ports to use for the BTS side\n"
328 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800329{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800330 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800331 return CMD_SUCCESS;
332}
333
334DEFUN(cfg_mgcp_rtp_net_range,
335 cfg_mgcp_rtp_net_range_cmd,
336 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100337 RTP_STR "Range of ports to use for the NET side\n"
338 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800339{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800340 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800341 return CMD_SUCCESS;
342}
343
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800344DEFUN(cfg_mgcp_rtp_net_base_port,
345 cfg_mgcp_rtp_net_base_port_cmd,
346 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100347 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800348{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800349 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800350 return CMD_SUCCESS;
351}
352
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800353ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100354 "rtp base <0-65534>",
355 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800356
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800357DEFUN(cfg_mgcp_rtp_transcoder_range,
358 cfg_mgcp_rtp_transcoder_range_cmd,
359 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100360 RTP_STR "Range of ports to use for the Transcoder\n"
361 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800362{
363 parse_range(&g_cfg->transcoder_ports, argv);
364 return CMD_SUCCESS;
365}
366
367DEFUN(cfg_mgcp_rtp_transcoder_base,
368 cfg_mgcp_rtp_transcoder_base_cmd,
369 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100370 RTP_STR "First UDP port allocated for the Transcoder side\n"
371 UDP_PORT_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800372{
373 parse_base(&g_cfg->transcoder_ports, argv);
374 return CMD_SUCCESS;
375}
376
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800377DEFUN(cfg_mgcp_rtp_ip_dscp,
378 cfg_mgcp_rtp_ip_dscp_cmd,
379 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100380 RTP_STR
381 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800382{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800383 int dscp = atoi(argv[0]);
384 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800385 return CMD_SUCCESS;
386}
387
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800388ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
389 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100390 RTP_STR
391 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800392
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200393#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
394DEFUN(cfg_mgcp_rtp_force_ptime,
395 cfg_mgcp_rtp_force_ptime_cmd,
396 "rtp force-ptime (10|20|40)",
397 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther7a4464e2014-07-04 20:11:11 +0200398 "The required ptime (packet duration) in ms\n"
399 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200400{
401 g_cfg->bts_force_ptime = atoi(argv[0]);
402 return CMD_SUCCESS;
403}
404
405DEFUN(cfg_mgcp_no_rtp_force_ptime,
406 cfg_mgcp_no_rtp_force_ptime_cmd,
407 "no rtp force-ptime",
408 NO_STR RTP_STR FORCE_PTIME_STR)
409{
410 g_cfg->bts_force_ptime = 0;
411 return CMD_SUCCESS;
412}
413
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200414DEFUN(cfg_mgcp_sdp_fmtp_extra,
415 cfg_mgcp_sdp_fmtp_extra_cmd,
416 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100417 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
418 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200419{
420 char *txt = argv_concat(argv, argc, 0);
421 if (!txt)
422 return CMD_WARNING;
423
424 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
425 talloc_free(txt);
426 return CMD_SUCCESS;
427}
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800428
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100429#define SDP_STR "SDP File related options\n"
430#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100431DEFUN(cfg_mgcp_sdp_payload_number,
432 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100433 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100434 SDP_STR AUDIO_STR
435 "Number\n" "Payload number\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100436{
437 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100438 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100439 return CMD_SUCCESS;
440}
441
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100442ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100443 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100444 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
445
446
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100447DEFUN(cfg_mgcp_sdp_payload_name,
448 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100449 "sdp audio-payload name NAME",
450 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100451{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100452 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100453 return CMD_SUCCESS;
454}
455
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100456ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
457 "sdp audio payload name NAME",
458 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
459
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100460DEFUN(cfg_mgcp_sdp_payload_send_ptime,
461 cfg_mgcp_sdp_payload_send_ptime_cmd,
462 "sdp audio-payload send-ptime",
463 SDP_STR AUDIO_STR
464 "Send SDP ptime (packet duration) attribute\n")
465{
466 g_cfg->trunk.audio_send_ptime = 1;
467 return CMD_SUCCESS;
468}
469
470DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
471 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
472 "no sdp audio-payload send-ptime",
473 NO_STR SDP_STR AUDIO_STR
474 "Send SDP ptime (packet duration) attribute\n")
475{
476 g_cfg->trunk.audio_send_ptime = 0;
477 return CMD_SUCCESS;
478}
479
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100480DEFUN(cfg_mgcp_sdp_payload_send_name,
481 cfg_mgcp_sdp_payload_send_name_cmd,
482 "sdp audio-payload send-name",
483 SDP_STR AUDIO_STR
484 "Send SDP rtpmap with the audio name\n")
485{
486 g_cfg->trunk.audio_send_name = 1;
487 return CMD_SUCCESS;
488}
489
490DEFUN(cfg_mgcp_no_sdp_payload_send_name,
491 cfg_mgcp_no_sdp_payload_send_name_cmd,
492 "no sdp audio-payload send-name",
493 NO_STR SDP_STR AUDIO_STR
494 "Send SDP rtpmap with the audio name\n")
495{
496 g_cfg->trunk.audio_send_name = 0;
497 return CMD_SUCCESS;
498}
499
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100500DEFUN(cfg_mgcp_loop,
501 cfg_mgcp_loop_cmd,
502 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100503 "Loop audio for all endpoints on main trunk\n"
504 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100505{
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100506 if (g_cfg->osmux) {
507 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
508 return CMD_WARNING;
509 }
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100510 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100511 return CMD_SUCCESS;
512}
513
514DEFUN(cfg_mgcp_number_endp,
515 cfg_mgcp_number_endp_cmd,
516 "number endpoints <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100517 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100518{
519 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100520 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100521 return CMD_SUCCESS;
522}
523
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200524DEFUN(cfg_mgcp_omit_rtcp,
525 cfg_mgcp_omit_rtcp_cmd,
526 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200527 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200528{
529 g_cfg->trunk.omit_rtcp = 1;
530 return CMD_SUCCESS;
531}
532
533DEFUN(cfg_mgcp_no_omit_rtcp,
534 cfg_mgcp_no_omit_rtcp_cmd,
535 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200536 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200537{
538 g_cfg->trunk.omit_rtcp = 0;
539 return CMD_SUCCESS;
540}
541
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100542DEFUN(cfg_mgcp_patch_rtp_ssrc,
543 cfg_mgcp_patch_rtp_ssrc_cmd,
544 "rtp-patch ssrc",
545 RTP_PATCH_STR
546 "Force a fixed SSRC\n"
547 )
548{
549 g_cfg->trunk.force_constant_ssrc = 1;
550 return CMD_SUCCESS;
551}
552
553DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
554 cfg_mgcp_no_patch_rtp_ssrc_cmd,
555 "no rtp-patch ssrc",
556 NO_STR RTP_PATCH_STR
557 "Force a fixed SSRC\n"
558 )
559{
560 g_cfg->trunk.force_constant_ssrc = 0;
561 return CMD_SUCCESS;
562}
563
564DEFUN(cfg_mgcp_patch_rtp_ts,
565 cfg_mgcp_patch_rtp_ts_cmd,
566 "rtp-patch timestamp",
567 RTP_PATCH_STR
568 "Adjust RTP timestamp\n"
569 )
570{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100571 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100572 return CMD_SUCCESS;
573}
574
575DEFUN(cfg_mgcp_no_patch_rtp_ts,
576 cfg_mgcp_no_patch_rtp_ts_cmd,
577 "no rtp-patch timestamp",
578 NO_STR RTP_PATCH_STR
579 "Adjust RTP timestamp\n"
580 )
581{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100582 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100583 return CMD_SUCCESS;
584}
585
586DEFUN(cfg_mgcp_no_patch_rtp,
587 cfg_mgcp_no_patch_rtp_cmd,
588 "no rtp-patch",
589 NO_STR RTP_PATCH_STR)
590{
591 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100592 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100593 return CMD_SUCCESS;
594}
595
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100596DEFUN(cfg_mgcp_rtp_keepalive,
597 cfg_mgcp_rtp_keepalive_cmd,
598 "rtp keep-alive <1-120>",
599 RTP_STR RTP_KEEPALIVE_STR
600 "Keep alive interval in secs\n"
601 )
602{
603 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
604 return CMD_SUCCESS;
605}
606
607DEFUN(cfg_mgcp_rtp_keepalive_once,
608 cfg_mgcp_rtp_keepalive_once_cmd,
609 "rtp keep-alive once",
610 RTP_STR RTP_KEEPALIVE_STR
611 "Send dummy packet only once after CRCX/MDCX\n"
612 )
613{
614 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
615 return CMD_SUCCESS;
616}
617
618DEFUN(cfg_mgcp_no_rtp_keepalive,
619 cfg_mgcp_no_rtp_keepalive_cmd,
620 "no rtp keep-alive",
621 NO_STR RTP_STR RTP_KEEPALIVE_STR
622 )
623{
624 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
625 return CMD_SUCCESS;
626}
627
628
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100629
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100630#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200631DEFUN(cfg_mgcp_agent_addr,
632 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100633 "call-agent ip A.B.C.D",
634 CALL_AGENT_STR IP_STR
635 "IPv4 Address of the callagent\n")
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200636{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200637 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200638 return CMD_SUCCESS;
639}
640
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100641ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
642 "call agent ip A.B.C.D",
643 CALL_AGENT_STR CALL_AGENT_STR IP_STR
644 "IPv4 Address of the callagent\n")
645
646
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800647DEFUN(cfg_mgcp_transcoder,
648 cfg_mgcp_transcoder_cmd,
649 "transcoder-mgw A.B.C.D",
650 "Use a MGW to detranscoder RTP\n"
651 "The IP address of the MGW")
652{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200653 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800654 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
655
656 return CMD_SUCCESS;
657}
658
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100659DEFUN(cfg_mgcp_no_transcoder,
660 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100661 "no transcoder-mgw",
662 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100663{
664 if (g_cfg->transcoder_ip) {
665 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
666 talloc_free(g_cfg->transcoder_ip);
667 g_cfg->transcoder_ip = NULL;
668 }
669
670 return CMD_SUCCESS;
671}
672
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800673DEFUN(cfg_mgcp_transcoder_remote_base,
674 cfg_mgcp_transcoder_remote_base_cmd,
675 "transcoder-remote-base <0-65534>",
676 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
677{
678 g_cfg->transcoder_remote_base = atoi(argv[0]);
679 return CMD_SUCCESS;
680}
681
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100682DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
683 "trunk <1-64>",
684 "Configure a SS7 trunk\n" "Trunk Nr\n")
685{
686 struct mgcp_trunk_config *trunk;
687 int index = atoi(argv[0]);
688
689 trunk = mgcp_trunk_num(g_cfg, index);
690 if (!trunk)
691 trunk = mgcp_trunk_alloc(g_cfg, index);
692
693 if (!trunk) {
694 vty_out(vty, "%%Unable to allocate trunk %u.%s",
695 index, VTY_NEWLINE);
696 return CMD_WARNING;
697 }
698
699 vty->node = TRUNK_NODE;
700 vty->index = trunk;
701 return CMD_SUCCESS;
702}
703
704static int config_write_trunk(struct vty *vty)
705{
706 struct mgcp_trunk_config *trunk;
707
708 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
709 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100710 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100711 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100712 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100713 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100714 vty_out(vty, " %ssdp audio-payload send-ptime%s",
715 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100716 vty_out(vty, " %ssdp audio-payload send-name%s",
717 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100718
719 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
720 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
721 else if (trunk->keepalive_interval)
722 vty_out(vty, " rtp keep-alive %d%s",
723 trunk->keepalive_interval, VTY_NEWLINE);
724 else
725 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
726
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100727 vty_out(vty, " loop %d%s",
728 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200729 if (trunk->omit_rtcp)
730 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
731 else
732 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100733 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100734 vty_out(vty, " %srtp-patch ssrc%s",
735 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
736 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100737 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100738 } else
739 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200740 if (trunk->audio_fmtp_extra)
741 vty_out(vty, " sdp audio fmtp-extra %s%s",
742 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100743 }
744
745 return CMD_SUCCESS;
746}
747
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200748DEFUN(cfg_trunk_sdp_fmtp_extra,
749 cfg_trunk_sdp_fmtp_extra_cmd,
750 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100751 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
752 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200753{
754 struct mgcp_trunk_config *trunk = vty->index;
755 char *txt = argv_concat(argv, argc, 0);
756 if (!txt)
757 return CMD_WARNING;
758
759 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
760 talloc_free(txt);
761 return CMD_SUCCESS;
762}
763
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100764DEFUN(cfg_trunk_payload_number,
765 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100766 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100767 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100768{
769 struct mgcp_trunk_config *trunk = vty->index;
770 unsigned int payload = atoi(argv[0]);
771
772 trunk->audio_payload = payload;
773 return CMD_SUCCESS;
774}
775
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100776ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100777 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100778 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
779
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100780DEFUN(cfg_trunk_payload_name,
781 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100782 "sdp audio-payload name NAME",
783 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100784{
785 struct mgcp_trunk_config *trunk = vty->index;
786
787 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
788 return CMD_SUCCESS;
789}
790
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100791ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
792 "sdp audio payload name NAME",
793 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
794
795
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100796DEFUN(cfg_trunk_loop,
797 cfg_trunk_loop_cmd,
798 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100799 "Loop audio for all endpoints on this trunk\n"
800 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100801{
802 struct mgcp_trunk_config *trunk = vty->index;
803
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100804 if (g_cfg->osmux) {
805 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
806 return CMD_WARNING;
807 }
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100808 trunk->audio_loop = atoi(argv[0]);
809 return CMD_SUCCESS;
810}
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800811
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100812DEFUN(cfg_trunk_sdp_payload_send_ptime,
813 cfg_trunk_sdp_payload_send_ptime_cmd,
814 "sdp audio-payload send-ptime",
815 SDP_STR AUDIO_STR
816 "Send SDP ptime (packet duration) attribute\n")
817{
818 struct mgcp_trunk_config *trunk = vty->index;
819 trunk->audio_send_ptime = 1;
820 return CMD_SUCCESS;
821}
822
823DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
824 cfg_trunk_no_sdp_payload_send_ptime_cmd,
825 "no sdp audio-payload send-ptime",
826 NO_STR SDP_STR AUDIO_STR
827 "Send SDP ptime (packet duration) attribute\n")
828{
829 struct mgcp_trunk_config *trunk = vty->index;
830 trunk->audio_send_ptime = 0;
831 return CMD_SUCCESS;
832}
833
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100834DEFUN(cfg_trunk_sdp_payload_send_name,
835 cfg_trunk_sdp_payload_send_name_cmd,
836 "sdp audio-payload send-name",
837 SDP_STR AUDIO_STR
838 "Send SDP rtpmap with the audio name\n")
839{
840 struct mgcp_trunk_config *trunk = vty->index;
841 trunk->audio_send_name = 1;
842 return CMD_SUCCESS;
843}
844
845DEFUN(cfg_trunk_no_sdp_payload_send_name,
846 cfg_trunk_no_sdp_payload_send_name_cmd,
847 "no sdp audio-payload send-name",
848 NO_STR SDP_STR AUDIO_STR
849 "Send SDP rtpmap with the audio name\n")
850{
851 struct mgcp_trunk_config *trunk = vty->index;
852 trunk->audio_send_name = 0;
853 return CMD_SUCCESS;
854}
855
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200856DEFUN(cfg_trunk_omit_rtcp,
857 cfg_trunk_omit_rtcp_cmd,
858 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200859 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200860{
861 struct mgcp_trunk_config *trunk = vty->index;
862 trunk->omit_rtcp = 1;
863 return CMD_SUCCESS;
864}
865
866DEFUN(cfg_trunk_no_omit_rtcp,
867 cfg_trunk_no_omit_rtcp_cmd,
868 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200869 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200870{
871 struct mgcp_trunk_config *trunk = vty->index;
872 trunk->omit_rtcp = 0;
873 return CMD_SUCCESS;
874}
875
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100876DEFUN(cfg_trunk_patch_rtp_ssrc,
877 cfg_trunk_patch_rtp_ssrc_cmd,
878 "rtp-patch ssrc",
879 RTP_PATCH_STR
880 "Force a fixed SSRC\n"
881 )
882{
883 struct mgcp_trunk_config *trunk = vty->index;
884 trunk->force_constant_ssrc = 1;
885 return CMD_SUCCESS;
886}
887
888DEFUN(cfg_trunk_no_patch_rtp_ssrc,
889 cfg_trunk_no_patch_rtp_ssrc_cmd,
890 "no rtp-patch ssrc",
891 NO_STR RTP_PATCH_STR
892 "Force a fixed SSRC\n"
893 )
894{
895 struct mgcp_trunk_config *trunk = vty->index;
896 trunk->force_constant_ssrc = 0;
897 return CMD_SUCCESS;
898}
899
900DEFUN(cfg_trunk_patch_rtp_ts,
901 cfg_trunk_patch_rtp_ts_cmd,
902 "rtp-patch timestamp",
903 RTP_PATCH_STR
904 "Adjust RTP timestamp\n"
905 )
906{
907 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100908 trunk->force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100909 return CMD_SUCCESS;
910}
911
912DEFUN(cfg_trunk_no_patch_rtp_ts,
913 cfg_trunk_no_patch_rtp_ts_cmd,
914 "no rtp-patch timestamp",
915 NO_STR RTP_PATCH_STR
916 "Adjust RTP timestamp\n"
917 )
918{
919 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100920 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100921 return CMD_SUCCESS;
922}
923
924DEFUN(cfg_trunk_no_patch_rtp,
925 cfg_trunk_no_patch_rtp_cmd,
926 "no rtp-patch",
927 NO_STR RTP_PATCH_STR)
928{
929 struct mgcp_trunk_config *trunk = vty->index;
930 trunk->force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100931 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100932 return CMD_SUCCESS;
933}
934
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100935DEFUN(cfg_trunk_rtp_keepalive,
936 cfg_trunk_rtp_keepalive_cmd,
937 "rtp keep-alive <1-120>",
938 RTP_STR RTP_KEEPALIVE_STR
939 "Keep-alive interval in secs\n"
940 )
941{
942 struct mgcp_trunk_config *trunk = vty->index;
943 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
944 return CMD_SUCCESS;
945}
946
947DEFUN(cfg_trunk_rtp_keepalive_once,
948 cfg_trunk_rtp_keepalive_once_cmd,
949 "rtp keep-alive once",
950 RTP_STR RTP_KEEPALIVE_STR
951 "Send dummy packet only once after CRCX/MDCX\n"
952 )
953{
954 struct mgcp_trunk_config *trunk = vty->index;
955 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
956 return CMD_SUCCESS;
957}
958
959DEFUN(cfg_trunk_no_rtp_keepalive,
960 cfg_trunk_no_rtp_keepalive_cmd,
961 "no rtp keep-alive",
962 NO_STR RTP_STR RTP_KEEPALIVE_STR
963 )
964{
965 struct mgcp_trunk_config *trunk = vty->index;
966 mgcp_trunk_set_keepalive(trunk, 0);
967 return CMD_SUCCESS;
968}
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100969
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800970DEFUN(loop_endp,
971 loop_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100972 "loop-endpoint <0-64> NAME (0|1)",
973 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +0800974 "The name in hex of the endpoint\n" "Disable the loop\n" "Enable the loop\n")
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800975{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100976 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800977 struct mgcp_endpoint *endp;
978
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100979 trunk = find_trunk(g_cfg, atoi(argv[0]));
980 if (!trunk) {
981 vty_out(vty, "%%Trunk %d not found in the config.%s",
982 atoi(argv[0]), VTY_NEWLINE);
983 return CMD_WARNING;
984 }
985
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100986 if (!trunk->endpoints) {
987 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
988 trunk->trunk_nr, VTY_NEWLINE);
989 return CMD_WARNING;
990 }
991
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100992 int endp_no = strtoul(argv[1], NULL, 16);
993 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800994 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100995 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800996 return CMD_WARNING;
997 }
998
999
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001000 endp = &trunk->endpoints[endp_no];
1001 int loop = atoi(argv[2]);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001002
1003 if (loop)
1004 endp->conn_mode = MGCP_CONN_LOOPBACK;
1005 else
1006 endp->conn_mode = endp->orig_mode;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001007
1008 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1009 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
1010 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001011
1012 return CMD_SUCCESS;
1013}
1014
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001015DEFUN(tap_call,
1016 tap_call_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001017 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
1018 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001019 "The endpoint in hex\n"
1020 "Forward the data coming from the bts\n"
1021 "Forward the data coming from the bts leaving to the network\n"
1022 "Forward the data coming from the net\n"
1023 "Forward the data coming from the net leaving to the bts\n"
1024 "destination IP of the data\n" "destination port\n")
1025{
1026 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001027 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001028 struct mgcp_endpoint *endp;
1029 int port = 0;
1030
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001031 trunk = find_trunk(g_cfg, atoi(argv[0]));
1032 if (!trunk) {
1033 vty_out(vty, "%%Trunk %d not found in the config.%s",
1034 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001035 return CMD_WARNING;
1036 }
1037
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001038 if (!trunk->endpoints) {
1039 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1040 trunk->trunk_nr, VTY_NEWLINE);
1041 return CMD_WARNING;
1042 }
1043
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001044 int endp_no = strtoul(argv[1], NULL, 16);
1045 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1046 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1047 argv[1], endp_no, VTY_NEWLINE);
1048 return CMD_WARNING;
1049 }
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001050
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001051 endp = &trunk->endpoints[endp_no];
1052
1053 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001054 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001055 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001056 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001057 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001058 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001059 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001060 port = MGCP_TAP_NET_OUT;
1061 } else {
1062 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1063 return CMD_WARNING;
1064 }
1065
1066 tap = &endp->taps[port];
1067 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001068 inet_aton(argv[3], &tap->forward.sin_addr);
1069 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +08001070 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001071 return CMD_SUCCESS;
1072}
1073
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001074DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001075 "free-endpoint <0-64> NUMBER",
1076 "Free the given endpoint\n" "Trunk number\n"
1077 "Endpoint number in hex.\n")
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001078{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001079 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001080 struct mgcp_endpoint *endp;
1081
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001082 trunk = find_trunk(g_cfg, atoi(argv[0]));
1083 if (!trunk) {
1084 vty_out(vty, "%%Trunk %d not found in the config.%s",
1085 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001086 return CMD_WARNING;
1087 }
1088
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001089 if (!trunk->endpoints) {
1090 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1091 trunk->trunk_nr, VTY_NEWLINE);
1092 return CMD_WARNING;
1093 }
1094
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001095 int endp_no = strtoul(argv[1], NULL, 16);
1096 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1097 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1098 argv[1], endp_no, VTY_NEWLINE);
1099 return CMD_WARNING;
1100 }
1101
1102 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freytherbb8627a2014-07-22 15:00:52 +02001103 mgcp_release_endp(endp);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001104 return CMD_SUCCESS;
1105}
1106
Harald Welteba4f8b22012-01-27 00:41:39 +01001107DEFUN(reset_endp, reset_endp_cmd,
1108 "reset-endpoint <0-64> NUMBER",
1109 "Reset the given endpoint\n" "Trunk number\n"
1110 "Endpoint number in hex.\n")
1111{
1112 struct mgcp_trunk_config *trunk;
1113 struct mgcp_endpoint *endp;
1114 int endp_no, rc;
1115
1116 trunk = find_trunk(g_cfg, atoi(argv[0]));
1117 if (!trunk) {
1118 vty_out(vty, "%%Trunk %d not found in the config.%s",
1119 atoi(argv[0]), VTY_NEWLINE);
1120 return CMD_WARNING;
1121 }
1122
1123 if (!trunk->endpoints) {
1124 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1125 trunk->trunk_nr, VTY_NEWLINE);
1126 return CMD_WARNING;
1127 }
1128
1129 endp_no = strtoul(argv[1], NULL, 16);
1130 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1131 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1132 argv[1], endp_no, VTY_NEWLINE);
1133 return CMD_WARNING;
1134 }
1135
1136 endp = &trunk->endpoints[endp_no];
1137 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1138 if (rc < 0) {
1139 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1140 return CMD_WARNING;
1141 }
1142 return CMD_SUCCESS;
1143}
1144
1145DEFUN(reset_all_endp, reset_all_endp_cmd,
1146 "reset-all-endpoints",
1147 "Reset all endpoints\n")
1148{
1149 int rc;
1150
1151 rc = mgcp_send_reset_all(g_cfg);
1152 if (rc < 0) {
1153 vty_out(vty, "Error %d during endpoint reset.%s",
1154 rc, VTY_NEWLINE);
1155 return CMD_WARNING;
1156 }
1157 return CMD_SUCCESS;
1158}
1159
Holger Hans Peter Freytherea285e42014-06-03 13:36:42 +02001160#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001161DEFUN(cfg_mgcp_osmux,
1162 cfg_mgcp_osmux_cmd,
1163 "osmux (on|off)",
1164 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1165{
1166 if (strcmp(argv[0], "on") == 0) {
1167 g_cfg->osmux = 1;
1168 if (g_cfg->trunk.audio_loop) {
1169 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1170 VTY_NEWLINE);
1171 return CMD_WARNING;
1172 }
1173 } else if (strcmp(argv[0], "off") == 0)
1174 g_cfg->osmux = 0;
1175
1176 return CMD_SUCCESS;
1177}
1178
1179DEFUN(cfg_mgcp_osmux_batch_factor,
1180 cfg_mgcp_osmux_batch_factor_cmd,
Pablo Neira Ayuso9776fd02014-08-29 16:08:45 +02001181 "osmux batch-factor <1-8>",
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001182 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1183{
1184 g_cfg->osmux_batch = atoi(argv[0]);
1185 return CMD_SUCCESS;
1186}
Harald Welteba4f8b22012-01-27 00:41:39 +01001187
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001188DEFUN(cfg_mgcp_osmux_batch_size,
1189 cfg_mgcp_osmux_batch_size_cmd,
1190 "osmux batch-size <1-65535>",
1191 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1192{
1193 g_cfg->osmux_batch_size = atoi(argv[0]);
1194 return CMD_SUCCESS;
1195}
1196
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001197DEFUN(cfg_mgcp_osmux_port,
1198 cfg_mgcp_osmux_port_cmd,
1199 "osmux port <1-65535>",
1200 OSMUX_STR "port\n" "UDP port\n")
1201{
1202 g_cfg->osmux_port = atoi(argv[0]);
1203 return CMD_SUCCESS;
1204}
1205
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001206int mgcp_vty_init(void)
1207{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +08001208 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001209 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001210 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001211 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welteba4f8b22012-01-27 00:41:39 +01001212 install_element(ENABLE_NODE, &reset_endp_cmd);
1213 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001214
1215 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1216 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001217
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001218 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001219 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1220 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1221 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1222 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1223 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1224 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +08001225 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +08001226 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +08001227 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1228 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +08001229 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1230 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +08001231 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +08001232 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck16491a92014-04-14 10:31:47 +02001233 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1234 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001235 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1236 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1237 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +02001238 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001239 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +08001240 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +01001241 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +08001242 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001243 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1244 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001245 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1246 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001247 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1248 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001249 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1250 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001251 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1252 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1253 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1254 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1255 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001256 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001257 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1258 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +01001259 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1260 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001261 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1262 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001263 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001264 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001265
1266 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1267 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001268 vty_install_default(TRUNK_NODE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001269 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1270 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1271 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001272 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1273 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001274 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1275 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001276 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001277 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1278 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001279 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1280 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1281 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1282 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1283 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001284 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001285 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1286 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +01001287 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1288 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001289
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001290 return 0;
1291}
1292
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001293static int allocate_trunk(struct mgcp_trunk_config *trunk)
1294{
1295 int i;
1296 struct mgcp_config *cfg = trunk->cfg;
1297
1298 if (mgcp_endpoints_allocate(trunk) != 0) {
1299 LOGP(DMGCP, LOGL_ERROR,
1300 "Failed to allocate %d endpoints on trunk %d.\n",
1301 trunk->number_endpoints, trunk->trunk_nr);
1302 return -1;
1303 }
1304
1305 /* early bind */
1306 for (i = 1; i < trunk->number_endpoints; ++i) {
1307 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001308
1309 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001310 cfg->last_bts_port += 2;
1311 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1312 LOGP(DMGCP, LOGL_FATAL,
1313 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001314 return -1;
1315 }
1316 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1317 }
1318
1319 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001320 cfg->last_net_port += 2;
1321 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1322 LOGP(DMGCP, LOGL_FATAL,
1323 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001324 return -1;
1325 }
1326 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1327 }
1328
Holger Hans Peter Freyther1b8eaf42011-02-28 14:51:48 +01001329 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1330 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001331 int rtp_port;
1332
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001333 /* network side */
1334 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1335 cfg->transcoder_ports.base_port);
1336 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1337 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1338 return -1;
1339 }
1340 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1341
1342 /* bts side */
1343 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1344 cfg->transcoder_ports.base_port);
1345 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1346 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1347 return -1;
1348 }
1349 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1350 }
1351 }
1352
1353 return 0;
1354}
1355
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001356int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1357 enum mgcp_role role)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001358{
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001359 int rc;
1360 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001361
Pablo Neira Ayusofa422c52014-08-29 12:20:17 +02001362 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001363 cfg->osmux_batch = 4;
Pablo Neira Ayusoefb34f62014-08-29 15:31:55 +02001364 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001365
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001366 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +02001367 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001368 if (rc < 0) {
1369 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1370 return rc;
1371 }
1372
1373
1374 if (!g_cfg->bts_ip)
1375 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1376
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +02001377 if (!g_cfg->source_addr) {
1378 fprintf(stderr, "You need to specify a bind address.\n");
1379 return -1;
1380 }
1381
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001382 /* initialize the last ports */
1383 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1384 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1385
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001386 if (allocate_trunk(&g_cfg->trunk) != 0) {
1387 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001388 return -1;
1389 }
1390
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001391 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1392 if (allocate_trunk(trunk) != 0) {
1393 LOGP(DMGCP, LOGL_ERROR,
1394 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1395 return -1;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +08001396 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001397 }
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001398 cfg->role = role;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001399
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +08001400 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001401}
1402