blob: 4dd89b7ae5569e8de0533ed300b201771c3db4e0 [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 Freyther8d998a72014-07-04 20:23:56 +02005 * (C) 2009-2014 by Holger Hans Peter Freyther <zecke@selfish.org>
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +01006 * (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 Freyther8d998a72014-07-04 20:23:56 +0200131 if (g_cfg->bts_force_ptime > 0)
132 vty_out(vty, " rtp force-ptime %d%s", g_cfg->bts_force_ptime, VTY_NEWLINE);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800133 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100134 vty_out(vty, " osmux %s%s",
135 g_cfg->osmux == 1 ? "on" : "off", VTY_NEWLINE);
136 vty_out(vty, " osmux batch-factor %d%s",
137 g_cfg->osmux_batch, VTY_NEWLINE);
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +0200138 vty_out(vty, " osmux batch-size %u%s",
139 g_cfg->osmux_batch_size, VTY_NEWLINE);
Pablo Neira Ayusoeb7aeb12014-08-28 16:48:55 +0200140 vty_out(vty, " osmux port %u%s",
141 g_cfg->osmux_port, VTY_NEWLINE);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800142
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100143 return CMD_SUCCESS;
144}
145
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200146static void dump_rtp_end(const char *end_name, struct vty *vty,
147 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
148{
149 vty_out(vty,
150 " %s%s"
151 " Timestamp Errs: %d->%d%s"
152 " Dropped Packets: %d%s"
153 " Payload Type: %d Rate: %u Channels: %d %s"
154 " Frame Duration: %u Frame Denominator: %u%s"
155 " FPP: %d Packet Duration: %u%s"
156 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
157 " Output-Enabled: %d Force-PTIME: %d%s",
158 end_name, VTY_NEWLINE,
159 state->in_stream.err_ts_counter,
160 state->out_stream.err_ts_counter, VTY_NEWLINE,
161 end->dropped_packets, VTY_NEWLINE,
162 end->payload_type, end->rate, end->channels, VTY_NEWLINE,
163 end->frame_duration_num, end->frame_duration_den, VTY_NEWLINE,
164 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
165 end->fmtp_extra, end->audio_name, end->subtype_name, VTY_NEWLINE,
166 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
167}
168
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100169static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100170{
171 int i;
172
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100173 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
174 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
175 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
176
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100177 if (!cfg->endpoints) {
178 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
179 return;
180 }
181
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100182 for (i = 1; i < cfg->number_endpoints; ++i) {
183 struct mgcp_endpoint *endp = &cfg->endpoints[i];
184 vty_out(vty,
185 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200186 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100187 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800188 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
189 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
190 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200191 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100192 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200193 VTY_NEWLINE);
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100194
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200195 if (verbose && endp->allocated) {
196 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
197 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100198 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100199 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100200}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100201
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100202DEFUN(show_mcgp, show_mgcp_cmd,
203 "show mgcp [stats]",
204 SHOW_STR
205 "Display information about the MGCP Media Gateway\n"
206 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100207{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100208 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100209 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100210
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100211 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100212
213 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100214 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100215
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100216 return CMD_SUCCESS;
217}
218
219DEFUN(cfg_mgcp,
220 cfg_mgcp_cmd,
221 "mgcp",
222 "Configure the MGCP")
223{
224 vty->node = MGCP_NODE;
225 return CMD_SUCCESS;
226}
227
228DEFUN(cfg_mgcp_local_ip,
229 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800230 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100231 "Local options for the SDP record\n"
232 IP_STR
233 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100234{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200235 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100236 return CMD_SUCCESS;
237}
238
239DEFUN(cfg_mgcp_bts_ip,
240 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800241 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100242 "BTS Audio source/destination options\n"
243 IP_STR
244 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100245{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200246 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100247 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
248 return CMD_SUCCESS;
249}
250
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100251#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100252DEFUN(cfg_mgcp_bind_ip,
253 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800254 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100255 BIND_STR
256 IP_STR
257 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100258{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200259 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100260 return CMD_SUCCESS;
261}
262
263DEFUN(cfg_mgcp_bind_port,
264 cfg_mgcp_bind_port_cmd,
265 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100266 BIND_STR
267 "Port information\n"
268 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100269{
270 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100271 g_cfg->source_port = port;
272 return CMD_SUCCESS;
273}
274
275DEFUN(cfg_mgcp_bind_early,
276 cfg_mgcp_bind_early_cmd,
277 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100278 BIND_STR
279 "Bind local ports on start up\n"
280 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100281{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800282 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
283 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100284}
285
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800286static void parse_base(struct mgcp_port_range *range, const char **argv)
287{
288 unsigned int port = atoi(argv[0]);
289 range->mode = PORT_ALLOC_STATIC;
290 range->base_port = port;
291}
292
293static void parse_range(struct mgcp_port_range *range, const char **argv)
294{
295 range->mode = PORT_ALLOC_DYNAMIC;
296 range->range_start = atoi(argv[0]);
297 range->range_end = atoi(argv[1]);
298 range->last_port = g_cfg->bts_ports.range_start;
299}
300
301
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100302#define RTP_STR "RTP configuration\n"
303#define BTS_START_STR "First UDP port allocated for the BTS side\n"
304#define NET_START_STR "First UDP port allocated for the NET side\n"
305#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800306DEFUN(cfg_mgcp_rtp_bts_base_port,
307 cfg_mgcp_rtp_bts_base_port_cmd,
308 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100309 RTP_STR
310 BTS_START_STR
311 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100312{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800313 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100314 return CMD_SUCCESS;
315}
316
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100317#define RANGE_START_STR "Start of the range of ports\n"
318#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800319DEFUN(cfg_mgcp_rtp_bts_range,
320 cfg_mgcp_rtp_bts_range_cmd,
321 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100322 RTP_STR "Range of ports to use for the BTS side\n"
323 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800324{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800325 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800326 return CMD_SUCCESS;
327}
328
329DEFUN(cfg_mgcp_rtp_net_range,
330 cfg_mgcp_rtp_net_range_cmd,
331 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100332 RTP_STR "Range of ports to use for the NET side\n"
333 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800334{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800335 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800336 return CMD_SUCCESS;
337}
338
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800339DEFUN(cfg_mgcp_rtp_net_base_port,
340 cfg_mgcp_rtp_net_base_port_cmd,
341 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100342 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800343{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800344 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800345 return CMD_SUCCESS;
346}
347
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800348ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100349 "rtp base <0-65534>",
350 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800351
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800352DEFUN(cfg_mgcp_rtp_transcoder_range,
353 cfg_mgcp_rtp_transcoder_range_cmd,
354 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100355 RTP_STR "Range of ports to use for the Transcoder\n"
356 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800357{
358 parse_range(&g_cfg->transcoder_ports, argv);
359 return CMD_SUCCESS;
360}
361
362DEFUN(cfg_mgcp_rtp_transcoder_base,
363 cfg_mgcp_rtp_transcoder_base_cmd,
364 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100365 RTP_STR "First UDP port allocated for the Transcoder side\n"
366 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800367{
368 parse_base(&g_cfg->transcoder_ports, argv);
369 return CMD_SUCCESS;
370}
371
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800372DEFUN(cfg_mgcp_rtp_ip_dscp,
373 cfg_mgcp_rtp_ip_dscp_cmd,
374 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100375 RTP_STR
376 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800377{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800378 int dscp = atoi(argv[0]);
379 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800380 return CMD_SUCCESS;
381}
382
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800383ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
384 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100385 RTP_STR
386 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800387
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200388#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
389DEFUN(cfg_mgcp_rtp_force_ptime,
390 cfg_mgcp_rtp_force_ptime_cmd,
391 "rtp force-ptime (10|20|40)",
392 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther29474112014-07-04 20:11:11 +0200393 "The required ptime (packet duration) in ms\n"
394 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200395{
396 g_cfg->bts_force_ptime = atoi(argv[0]);
397 return CMD_SUCCESS;
398}
399
400DEFUN(cfg_mgcp_no_rtp_force_ptime,
401 cfg_mgcp_no_rtp_force_ptime_cmd,
402 "no rtp force-ptime",
403 NO_STR RTP_STR FORCE_PTIME_STR)
404{
405 g_cfg->bts_force_ptime = 0;
406 return CMD_SUCCESS;
407}
408
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200409DEFUN(cfg_mgcp_sdp_fmtp_extra,
410 cfg_mgcp_sdp_fmtp_extra_cmd,
411 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100412 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
413 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200414{
415 char *txt = argv_concat(argv, argc, 0);
416 if (!txt)
417 return CMD_WARNING;
418
419 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
420 talloc_free(txt);
421 return CMD_SUCCESS;
422}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800423
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100424#define SDP_STR "SDP File related options\n"
425#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100426DEFUN(cfg_mgcp_sdp_payload_number,
427 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100428 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100429 SDP_STR AUDIO_STR
430 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100431{
432 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100433 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100434 return CMD_SUCCESS;
435}
436
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100437ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100438 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100439 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
440
441
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100442DEFUN(cfg_mgcp_sdp_payload_name,
443 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100444 "sdp audio-payload name NAME",
445 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100446{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100447 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100448 return CMD_SUCCESS;
449}
450
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100451ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
452 "sdp audio payload name NAME",
453 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
454
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100455DEFUN(cfg_mgcp_sdp_payload_send_ptime,
456 cfg_mgcp_sdp_payload_send_ptime_cmd,
457 "sdp audio-payload send-ptime",
458 SDP_STR AUDIO_STR
459 "Send SDP ptime (packet duration) attribute\n")
460{
461 g_cfg->trunk.audio_send_ptime = 1;
462 return CMD_SUCCESS;
463}
464
465DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
466 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
467 "no sdp audio-payload send-ptime",
468 NO_STR SDP_STR AUDIO_STR
469 "Send SDP ptime (packet duration) attribute\n")
470{
471 g_cfg->trunk.audio_send_ptime = 0;
472 return CMD_SUCCESS;
473}
474
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100475DEFUN(cfg_mgcp_loop,
476 cfg_mgcp_loop_cmd,
477 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100478 "Loop audio for all endpoints on main trunk\n"
479 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100480{
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100481 if (g_cfg->osmux) {
482 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
483 return CMD_WARNING;
484 }
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100485 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100486 return CMD_SUCCESS;
487}
488
489DEFUN(cfg_mgcp_number_endp,
490 cfg_mgcp_number_endp_cmd,
491 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100492 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100493{
494 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100495 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100496 return CMD_SUCCESS;
497}
498
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200499DEFUN(cfg_mgcp_omit_rtcp,
500 cfg_mgcp_omit_rtcp_cmd,
501 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200502 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200503{
504 g_cfg->trunk.omit_rtcp = 1;
505 return CMD_SUCCESS;
506}
507
508DEFUN(cfg_mgcp_no_omit_rtcp,
509 cfg_mgcp_no_omit_rtcp_cmd,
510 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200511 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200512{
513 g_cfg->trunk.omit_rtcp = 0;
514 return CMD_SUCCESS;
515}
516
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100517DEFUN(cfg_mgcp_patch_rtp_ssrc,
518 cfg_mgcp_patch_rtp_ssrc_cmd,
519 "rtp-patch ssrc",
520 RTP_PATCH_STR
521 "Force a fixed SSRC\n"
522 )
523{
524 g_cfg->trunk.force_constant_ssrc = 1;
525 return CMD_SUCCESS;
526}
527
528DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
529 cfg_mgcp_no_patch_rtp_ssrc_cmd,
530 "no rtp-patch ssrc",
531 NO_STR RTP_PATCH_STR
532 "Force a fixed SSRC\n"
533 )
534{
535 g_cfg->trunk.force_constant_ssrc = 0;
536 return CMD_SUCCESS;
537}
538
539DEFUN(cfg_mgcp_patch_rtp_ts,
540 cfg_mgcp_patch_rtp_ts_cmd,
541 "rtp-patch timestamp",
542 RTP_PATCH_STR
543 "Adjust RTP timestamp\n"
544 )
545{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100546 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100547 return CMD_SUCCESS;
548}
549
550DEFUN(cfg_mgcp_no_patch_rtp_ts,
551 cfg_mgcp_no_patch_rtp_ts_cmd,
552 "no rtp-patch timestamp",
553 NO_STR RTP_PATCH_STR
554 "Adjust RTP timestamp\n"
555 )
556{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100557 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100558 return CMD_SUCCESS;
559}
560
561DEFUN(cfg_mgcp_no_patch_rtp,
562 cfg_mgcp_no_patch_rtp_cmd,
563 "no rtp-patch",
564 NO_STR RTP_PATCH_STR)
565{
566 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100567 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100568 return CMD_SUCCESS;
569}
570
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100571DEFUN(cfg_mgcp_rtp_keepalive,
572 cfg_mgcp_rtp_keepalive_cmd,
573 "rtp keep-alive <1-120>",
574 RTP_STR RTP_KEEPALIVE_STR
575 "Keep alive interval in secs\n"
576 )
577{
578 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
579 return CMD_SUCCESS;
580}
581
582DEFUN(cfg_mgcp_rtp_keepalive_once,
583 cfg_mgcp_rtp_keepalive_once_cmd,
584 "rtp keep-alive once",
585 RTP_STR RTP_KEEPALIVE_STR
586 "Send dummy packet only once after CRCX/MDCX\n"
587 )
588{
589 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
590 return CMD_SUCCESS;
591}
592
593DEFUN(cfg_mgcp_no_rtp_keepalive,
594 cfg_mgcp_no_rtp_keepalive_cmd,
595 "no rtp keep-alive",
596 NO_STR RTP_STR RTP_KEEPALIVE_STR
597 )
598{
599 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
600 return CMD_SUCCESS;
601}
602
603
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100604
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100605#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200606DEFUN(cfg_mgcp_agent_addr,
607 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100608 "call-agent ip A.B.C.D",
609 CALL_AGENT_STR IP_STR
610 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200611{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200612 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200613 return CMD_SUCCESS;
614}
615
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100616ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
617 "call agent ip A.B.C.D",
618 CALL_AGENT_STR CALL_AGENT_STR IP_STR
619 "IPv4 Address of the callagent\n")
620
621
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800622DEFUN(cfg_mgcp_transcoder,
623 cfg_mgcp_transcoder_cmd,
624 "transcoder-mgw A.B.C.D",
625 "Use a MGW to detranscoder RTP\n"
626 "The IP address of the MGW")
627{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200628 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800629 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
630
631 return CMD_SUCCESS;
632}
633
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100634DEFUN(cfg_mgcp_no_transcoder,
635 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100636 "no transcoder-mgw",
637 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100638{
639 if (g_cfg->transcoder_ip) {
640 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
641 talloc_free(g_cfg->transcoder_ip);
642 g_cfg->transcoder_ip = NULL;
643 }
644
645 return CMD_SUCCESS;
646}
647
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800648DEFUN(cfg_mgcp_transcoder_remote_base,
649 cfg_mgcp_transcoder_remote_base_cmd,
650 "transcoder-remote-base <0-65534>",
651 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
652{
653 g_cfg->transcoder_remote_base = atoi(argv[0]);
654 return CMD_SUCCESS;
655}
656
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100657DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
658 "trunk <1-64>",
659 "Configure a SS7 trunk\n" "Trunk Nr\n")
660{
661 struct mgcp_trunk_config *trunk;
662 int index = atoi(argv[0]);
663
664 trunk = mgcp_trunk_num(g_cfg, index);
665 if (!trunk)
666 trunk = mgcp_trunk_alloc(g_cfg, index);
667
668 if (!trunk) {
669 vty_out(vty, "%%Unable to allocate trunk %u.%s",
670 index, VTY_NEWLINE);
671 return CMD_WARNING;
672 }
673
674 vty->node = TRUNK_NODE;
675 vty->index = trunk;
676 return CMD_SUCCESS;
677}
678
679static int config_write_trunk(struct vty *vty)
680{
681 struct mgcp_trunk_config *trunk;
682
683 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
684 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100685 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100686 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100687 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100688 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100689 vty_out(vty, " %ssdp audio-payload send-ptime%s",
690 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100691
692 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
693 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
694 else if (trunk->keepalive_interval)
695 vty_out(vty, " rtp keep-alive %d%s",
696 trunk->keepalive_interval, VTY_NEWLINE);
697 else
698 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
699
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100700 vty_out(vty, " loop %d%s",
701 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200702 if (trunk->omit_rtcp)
703 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
704 else
705 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100706 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100707 vty_out(vty, " %srtp-patch ssrc%s",
708 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
709 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100710 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100711 } else
712 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200713 if (trunk->audio_fmtp_extra)
714 vty_out(vty, " sdp audio fmtp-extra %s%s",
715 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100716 }
717
718 return CMD_SUCCESS;
719}
720
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200721DEFUN(cfg_trunk_sdp_fmtp_extra,
722 cfg_trunk_sdp_fmtp_extra_cmd,
723 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100724 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
725 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200726{
727 struct mgcp_trunk_config *trunk = vty->index;
728 char *txt = argv_concat(argv, argc, 0);
729 if (!txt)
730 return CMD_WARNING;
731
732 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
733 talloc_free(txt);
734 return CMD_SUCCESS;
735}
736
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100737DEFUN(cfg_trunk_payload_number,
738 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100739 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100740 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100741{
742 struct mgcp_trunk_config *trunk = vty->index;
743 unsigned int payload = atoi(argv[0]);
744
745 trunk->audio_payload = payload;
746 return CMD_SUCCESS;
747}
748
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100749ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100750 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100751 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
752
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100753DEFUN(cfg_trunk_payload_name,
754 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100755 "sdp audio-payload name NAME",
756 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100757{
758 struct mgcp_trunk_config *trunk = vty->index;
759
760 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
761 return CMD_SUCCESS;
762}
763
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100764ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
765 "sdp audio payload name NAME",
766 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
767
768
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100769DEFUN(cfg_trunk_loop,
770 cfg_trunk_loop_cmd,
771 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100772 "Loop audio for all endpoints on this trunk\n"
773 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100774{
775 struct mgcp_trunk_config *trunk = vty->index;
776
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100777 if (g_cfg->osmux) {
778 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
779 return CMD_WARNING;
780 }
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100781 trunk->audio_loop = atoi(argv[0]);
782 return CMD_SUCCESS;
783}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800784
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100785DEFUN(cfg_trunk_sdp_payload_send_ptime,
786 cfg_trunk_sdp_payload_send_ptime_cmd,
787 "sdp audio-payload send-ptime",
788 SDP_STR AUDIO_STR
789 "Send SDP ptime (packet duration) attribute\n")
790{
791 struct mgcp_trunk_config *trunk = vty->index;
792 trunk->audio_send_ptime = 1;
793 return CMD_SUCCESS;
794}
795
796DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
797 cfg_trunk_no_sdp_payload_send_ptime_cmd,
798 "no sdp audio-payload send-ptime",
799 NO_STR SDP_STR AUDIO_STR
800 "Send SDP ptime (packet duration) attribute\n")
801{
802 struct mgcp_trunk_config *trunk = vty->index;
803 trunk->audio_send_ptime = 0;
804 return CMD_SUCCESS;
805}
806
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200807DEFUN(cfg_trunk_omit_rtcp,
808 cfg_trunk_omit_rtcp_cmd,
809 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200810 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200811{
812 struct mgcp_trunk_config *trunk = vty->index;
813 trunk->omit_rtcp = 1;
814 return CMD_SUCCESS;
815}
816
817DEFUN(cfg_trunk_no_omit_rtcp,
818 cfg_trunk_no_omit_rtcp_cmd,
819 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200820 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200821{
822 struct mgcp_trunk_config *trunk = vty->index;
823 trunk->omit_rtcp = 0;
824 return CMD_SUCCESS;
825}
826
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100827DEFUN(cfg_trunk_patch_rtp_ssrc,
828 cfg_trunk_patch_rtp_ssrc_cmd,
829 "rtp-patch ssrc",
830 RTP_PATCH_STR
831 "Force a fixed SSRC\n"
832 )
833{
834 struct mgcp_trunk_config *trunk = vty->index;
835 trunk->force_constant_ssrc = 1;
836 return CMD_SUCCESS;
837}
838
839DEFUN(cfg_trunk_no_patch_rtp_ssrc,
840 cfg_trunk_no_patch_rtp_ssrc_cmd,
841 "no rtp-patch ssrc",
842 NO_STR RTP_PATCH_STR
843 "Force a fixed SSRC\n"
844 )
845{
846 struct mgcp_trunk_config *trunk = vty->index;
847 trunk->force_constant_ssrc = 0;
848 return CMD_SUCCESS;
849}
850
851DEFUN(cfg_trunk_patch_rtp_ts,
852 cfg_trunk_patch_rtp_ts_cmd,
853 "rtp-patch timestamp",
854 RTP_PATCH_STR
855 "Adjust RTP timestamp\n"
856 )
857{
858 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100859 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100860 return CMD_SUCCESS;
861}
862
863DEFUN(cfg_trunk_no_patch_rtp_ts,
864 cfg_trunk_no_patch_rtp_ts_cmd,
865 "no rtp-patch timestamp",
866 NO_STR RTP_PATCH_STR
867 "Adjust RTP timestamp\n"
868 )
869{
870 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100871 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100872 return CMD_SUCCESS;
873}
874
875DEFUN(cfg_trunk_no_patch_rtp,
876 cfg_trunk_no_patch_rtp_cmd,
877 "no rtp-patch",
878 NO_STR RTP_PATCH_STR)
879{
880 struct mgcp_trunk_config *trunk = vty->index;
881 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100882 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100883 return CMD_SUCCESS;
884}
885
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100886DEFUN(cfg_trunk_rtp_keepalive,
887 cfg_trunk_rtp_keepalive_cmd,
888 "rtp keep-alive <1-120>",
889 RTP_STR RTP_KEEPALIVE_STR
890 "Keep-alive interval in secs\n"
891 )
892{
893 struct mgcp_trunk_config *trunk = vty->index;
894 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
895 return CMD_SUCCESS;
896}
897
898DEFUN(cfg_trunk_rtp_keepalive_once,
899 cfg_trunk_rtp_keepalive_once_cmd,
900 "rtp keep-alive once",
901 RTP_STR RTP_KEEPALIVE_STR
902 "Send dummy packet only once after CRCX/MDCX\n"
903 )
904{
905 struct mgcp_trunk_config *trunk = vty->index;
906 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
907 return CMD_SUCCESS;
908}
909
910DEFUN(cfg_trunk_no_rtp_keepalive,
911 cfg_trunk_no_rtp_keepalive_cmd,
912 "no rtp keep-alive",
913 NO_STR RTP_STR RTP_KEEPALIVE_STR
914 )
915{
916 struct mgcp_trunk_config *trunk = vty->index;
917 mgcp_trunk_set_keepalive(trunk, 0);
918 return CMD_SUCCESS;
919}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100920
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800921DEFUN(loop_endp,
922 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100923 "loop-endpoint <0-64> NAME (0|1)",
924 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800925 "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 +0800926{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100927 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800928 struct mgcp_endpoint *endp;
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);
934 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) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800945 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100946 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800947 return CMD_WARNING;
948 }
949
950
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100951 endp = &trunk->endpoints[endp_no];
952 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800953
954 if (loop)
955 endp->conn_mode = MGCP_CONN_LOOPBACK;
956 else
957 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100958
959 /* Handle it like a MDCX, switch on SSRC patching if enabled */
960 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
961 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800962
963 return CMD_SUCCESS;
964}
965
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800966DEFUN(tap_call,
967 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100968 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
969 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800970 "The endpoint in hex\n"
971 "Forward the data coming from the bts\n"
972 "Forward the data coming from the bts leaving to the network\n"
973 "Forward the data coming from the net\n"
974 "Forward the data coming from the net leaving to the bts\n"
975 "destination IP of the data\n" "destination port\n")
976{
977 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100978 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800979 struct mgcp_endpoint *endp;
980 int port = 0;
981
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100982 trunk = find_trunk(g_cfg, atoi(argv[0]));
983 if (!trunk) {
984 vty_out(vty, "%%Trunk %d not found in the config.%s",
985 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800986 return CMD_WARNING;
987 }
988
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100989 if (!trunk->endpoints) {
990 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
991 trunk->trunk_nr, VTY_NEWLINE);
992 return CMD_WARNING;
993 }
994
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100995 int endp_no = strtoul(argv[1], NULL, 16);
996 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
997 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
998 argv[1], endp_no, VTY_NEWLINE);
999 return CMD_WARNING;
1000 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001001
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001002 endp = &trunk->endpoints[endp_no];
1003
1004 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001005 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001006 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001007 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001008 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001009 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001010 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001011 port = MGCP_TAP_NET_OUT;
1012 } else {
1013 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1014 return CMD_WARNING;
1015 }
1016
1017 tap = &endp->taps[port];
1018 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001019 inet_aton(argv[3], &tap->forward.sin_addr);
1020 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +08001021 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001022 return CMD_SUCCESS;
1023}
1024
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001025DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001026 "free-endpoint <0-64> NUMBER",
1027 "Free the given endpoint\n" "Trunk number\n"
1028 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001029{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001030 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001031 struct mgcp_endpoint *endp;
1032
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001033 trunk = find_trunk(g_cfg, atoi(argv[0]));
1034 if (!trunk) {
1035 vty_out(vty, "%%Trunk %d not found in the config.%s",
1036 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001037 return CMD_WARNING;
1038 }
1039
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001040 if (!trunk->endpoints) {
1041 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1042 trunk->trunk_nr, VTY_NEWLINE);
1043 return CMD_WARNING;
1044 }
1045
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001046 int endp_no = strtoul(argv[1], NULL, 16);
1047 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1048 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1049 argv[1], endp_no, VTY_NEWLINE);
1050 return CMD_WARNING;
1051 }
1052
1053 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freythercb6ad702014-07-22 15:00:52 +02001054 mgcp_release_endp(endp);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001055 return CMD_SUCCESS;
1056}
1057
Harald Welte6a857052012-01-27 00:41:39 +01001058DEFUN(reset_endp, reset_endp_cmd,
1059 "reset-endpoint <0-64> NUMBER",
1060 "Reset the given endpoint\n" "Trunk number\n"
1061 "Endpoint number in hex.\n")
1062{
1063 struct mgcp_trunk_config *trunk;
1064 struct mgcp_endpoint *endp;
1065 int endp_no, rc;
1066
1067 trunk = find_trunk(g_cfg, atoi(argv[0]));
1068 if (!trunk) {
1069 vty_out(vty, "%%Trunk %d not found in the config.%s",
1070 atoi(argv[0]), VTY_NEWLINE);
1071 return CMD_WARNING;
1072 }
1073
1074 if (!trunk->endpoints) {
1075 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1076 trunk->trunk_nr, VTY_NEWLINE);
1077 return CMD_WARNING;
1078 }
1079
1080 endp_no = strtoul(argv[1], NULL, 16);
1081 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1082 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1083 argv[1], endp_no, VTY_NEWLINE);
1084 return CMD_WARNING;
1085 }
1086
1087 endp = &trunk->endpoints[endp_no];
1088 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1089 if (rc < 0) {
1090 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1091 return CMD_WARNING;
1092 }
1093 return CMD_SUCCESS;
1094}
1095
1096DEFUN(reset_all_endp, reset_all_endp_cmd,
1097 "reset-all-endpoints",
1098 "Reset all endpoints\n")
1099{
1100 int rc;
1101
1102 rc = mgcp_send_reset_all(g_cfg);
1103 if (rc < 0) {
1104 vty_out(vty, "Error %d during endpoint reset.%s",
1105 rc, VTY_NEWLINE);
1106 return CMD_WARNING;
1107 }
1108 return CMD_SUCCESS;
1109}
1110
Holger Hans Peter Freythercc84c952014-06-03 13:36:42 +02001111#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001112DEFUN(cfg_mgcp_osmux,
1113 cfg_mgcp_osmux_cmd,
1114 "osmux (on|off)",
1115 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1116{
1117 if (strcmp(argv[0], "on") == 0) {
1118 g_cfg->osmux = 1;
1119 if (g_cfg->trunk.audio_loop) {
1120 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1121 VTY_NEWLINE);
1122 return CMD_WARNING;
1123 }
1124 } else if (strcmp(argv[0], "off") == 0)
1125 g_cfg->osmux = 0;
1126
1127 return CMD_SUCCESS;
1128}
1129
1130DEFUN(cfg_mgcp_osmux_batch_factor,
1131 cfg_mgcp_osmux_batch_factor_cmd,
Holger Hans Peter Freyther421365e2014-06-16 14:12:02 +02001132 "osmux batch-factor <1-16>",
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001133 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1134{
1135 g_cfg->osmux_batch = atoi(argv[0]);
1136 return CMD_SUCCESS;
1137}
Harald Welte6a857052012-01-27 00:41:39 +01001138
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +02001139DEFUN(cfg_mgcp_osmux_batch_size,
1140 cfg_mgcp_osmux_batch_size_cmd,
1141 "osmux batch-size <1-65535>",
1142 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1143{
1144 g_cfg->osmux_batch_size = atoi(argv[0]);
1145 return CMD_SUCCESS;
1146}
1147
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001148DEFUN(cfg_mgcp_osmux_port,
1149 cfg_mgcp_osmux_port_cmd,
1150 "osmux port <1-65535>",
1151 OSMUX_STR "port\n" "UDP port\n")
1152{
1153 g_cfg->osmux_port = atoi(argv[0]);
1154 return CMD_SUCCESS;
1155}
1156
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001157int mgcp_vty_init(void)
1158{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001159 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001160 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001161 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001162 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001163 install_element(ENABLE_NODE, &reset_endp_cmd);
1164 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001165
1166 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1167 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001168
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001169 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001170 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1171 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1172 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1173 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1174 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1175 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001176 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001177 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001178 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1179 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001180 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1181 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001182 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001183 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck42a833e2014-04-14 10:31:47 +02001184 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1185 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001186 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1187 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1188 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001189 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001190 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001191 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001192 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001193 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001194 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1195 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001196 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1197 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001198 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1199 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001200 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1201 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001202 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1203 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1204 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1205 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1206 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001207 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001208 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1209 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001210 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1211 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +02001212 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001213 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001214
1215 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1216 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001217 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001218 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1219 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1220 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001221 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1222 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001223 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1224 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001225 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001226 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1227 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001228 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1229 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1230 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1231 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1232 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001233 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001234 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1235 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001236
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001237 return 0;
1238}
1239
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001240static int allocate_trunk(struct mgcp_trunk_config *trunk)
1241{
1242 int i;
1243 struct mgcp_config *cfg = trunk->cfg;
1244
1245 if (mgcp_endpoints_allocate(trunk) != 0) {
1246 LOGP(DMGCP, LOGL_ERROR,
1247 "Failed to allocate %d endpoints on trunk %d.\n",
1248 trunk->number_endpoints, trunk->trunk_nr);
1249 return -1;
1250 }
1251
1252 /* early bind */
1253 for (i = 1; i < trunk->number_endpoints; ++i) {
1254 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001255
1256 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001257 cfg->last_bts_port += 2;
1258 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1259 LOGP(DMGCP, LOGL_FATAL,
1260 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001261 return -1;
1262 }
1263 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1264 }
1265
1266 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001267 cfg->last_net_port += 2;
1268 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1269 LOGP(DMGCP, LOGL_FATAL,
1270 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001271 return -1;
1272 }
1273 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1274 }
1275
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001276 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1277 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001278 int rtp_port;
1279
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001280 /* network side */
1281 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1282 cfg->transcoder_ports.base_port);
1283 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1284 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1285 return -1;
1286 }
1287 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1288
1289 /* bts side */
1290 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1291 cfg->transcoder_ports.base_port);
1292 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1293 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1294 return -1;
1295 }
1296 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1297 }
1298 }
1299
1300 return 0;
1301}
1302
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001303int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1304 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001305{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001306 int rc;
1307 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001308
Pablo Neira Ayuso308d5f82014-08-29 12:20:17 +02001309 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001310 /* Default to 4 messages */
1311 cfg->osmux_batch = 4;
1312
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001313 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001314 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001315 if (rc < 0) {
1316 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1317 return rc;
1318 }
1319
1320
1321 if (!g_cfg->bts_ip)
1322 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1323
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001324 if (!g_cfg->source_addr) {
1325 fprintf(stderr, "You need to specify a bind address.\n");
1326 return -1;
1327 }
1328
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001329 /* initialize the last ports */
1330 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1331 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1332
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001333 if (allocate_trunk(&g_cfg->trunk) != 0) {
1334 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001335 return -1;
1336 }
1337
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001338 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1339 if (allocate_trunk(trunk) != 0) {
1340 LOGP(DMGCP, LOGL_ERROR,
1341 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1342 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001343 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001344 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001345 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001346
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001347 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001348}
1349