blob: d40a3ce27591bcefb6e3177cb16e073e19fd64e2 [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 Ayusoeb7aeb12014-08-28 16:48:55 +0200138 vty_out(vty, " osmux port %u%s",
139 g_cfg->osmux_port, VTY_NEWLINE);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800140
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100141 return CMD_SUCCESS;
142}
143
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200144static void dump_rtp_end(const char *end_name, struct vty *vty,
145 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
146{
147 vty_out(vty,
148 " %s%s"
149 " Timestamp Errs: %d->%d%s"
150 " Dropped Packets: %d%s"
151 " Payload Type: %d Rate: %u Channels: %d %s"
152 " Frame Duration: %u Frame Denominator: %u%s"
153 " FPP: %d Packet Duration: %u%s"
154 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
155 " Output-Enabled: %d Force-PTIME: %d%s",
156 end_name, VTY_NEWLINE,
157 state->in_stream.err_ts_counter,
158 state->out_stream.err_ts_counter, VTY_NEWLINE,
159 end->dropped_packets, VTY_NEWLINE,
160 end->payload_type, end->rate, end->channels, VTY_NEWLINE,
161 end->frame_duration_num, end->frame_duration_den, VTY_NEWLINE,
162 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
163 end->fmtp_extra, end->audio_name, end->subtype_name, VTY_NEWLINE,
164 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
165}
166
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100167static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100168{
169 int i;
170
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100171 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
172 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
173 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
174
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100175 if (!cfg->endpoints) {
176 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
177 return;
178 }
179
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100180 for (i = 1; i < cfg->number_endpoints; ++i) {
181 struct mgcp_endpoint *endp = &cfg->endpoints[i];
182 vty_out(vty,
183 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200184 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100185 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800186 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
187 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
188 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200189 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100190 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200191 VTY_NEWLINE);
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100192
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200193 if (verbose && endp->allocated) {
194 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
195 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100196 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100197 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100198}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100199
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100200DEFUN(show_mcgp, show_mgcp_cmd,
201 "show mgcp [stats]",
202 SHOW_STR
203 "Display information about the MGCP Media Gateway\n"
204 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100205{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100206 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100207 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100208
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100209 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100210
211 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100212 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100213
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100214 return CMD_SUCCESS;
215}
216
217DEFUN(cfg_mgcp,
218 cfg_mgcp_cmd,
219 "mgcp",
220 "Configure the MGCP")
221{
222 vty->node = MGCP_NODE;
223 return CMD_SUCCESS;
224}
225
226DEFUN(cfg_mgcp_local_ip,
227 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800228 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100229 "Local options for the SDP record\n"
230 IP_STR
231 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100232{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200233 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100234 return CMD_SUCCESS;
235}
236
237DEFUN(cfg_mgcp_bts_ip,
238 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800239 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100240 "BTS Audio source/destination options\n"
241 IP_STR
242 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100243{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200244 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100245 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
246 return CMD_SUCCESS;
247}
248
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100249#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100250DEFUN(cfg_mgcp_bind_ip,
251 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800252 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100253 BIND_STR
254 IP_STR
255 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100256{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200257 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100258 return CMD_SUCCESS;
259}
260
261DEFUN(cfg_mgcp_bind_port,
262 cfg_mgcp_bind_port_cmd,
263 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100264 BIND_STR
265 "Port information\n"
266 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100267{
268 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100269 g_cfg->source_port = port;
270 return CMD_SUCCESS;
271}
272
273DEFUN(cfg_mgcp_bind_early,
274 cfg_mgcp_bind_early_cmd,
275 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100276 BIND_STR
277 "Bind local ports on start up\n"
278 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100279{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800280 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
281 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100282}
283
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800284static void parse_base(struct mgcp_port_range *range, const char **argv)
285{
286 unsigned int port = atoi(argv[0]);
287 range->mode = PORT_ALLOC_STATIC;
288 range->base_port = port;
289}
290
291static void parse_range(struct mgcp_port_range *range, const char **argv)
292{
293 range->mode = PORT_ALLOC_DYNAMIC;
294 range->range_start = atoi(argv[0]);
295 range->range_end = atoi(argv[1]);
296 range->last_port = g_cfg->bts_ports.range_start;
297}
298
299
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100300#define RTP_STR "RTP configuration\n"
301#define BTS_START_STR "First UDP port allocated for the BTS side\n"
302#define NET_START_STR "First UDP port allocated for the NET side\n"
303#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800304DEFUN(cfg_mgcp_rtp_bts_base_port,
305 cfg_mgcp_rtp_bts_base_port_cmd,
306 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100307 RTP_STR
308 BTS_START_STR
309 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100310{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800311 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100312 return CMD_SUCCESS;
313}
314
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100315#define RANGE_START_STR "Start of the range of ports\n"
316#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800317DEFUN(cfg_mgcp_rtp_bts_range,
318 cfg_mgcp_rtp_bts_range_cmd,
319 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100320 RTP_STR "Range of ports to use for the BTS side\n"
321 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800322{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800323 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800324 return CMD_SUCCESS;
325}
326
327DEFUN(cfg_mgcp_rtp_net_range,
328 cfg_mgcp_rtp_net_range_cmd,
329 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100330 RTP_STR "Range of ports to use for the NET side\n"
331 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800332{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800333 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800334 return CMD_SUCCESS;
335}
336
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800337DEFUN(cfg_mgcp_rtp_net_base_port,
338 cfg_mgcp_rtp_net_base_port_cmd,
339 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100340 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800341{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800342 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800343 return CMD_SUCCESS;
344}
345
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800346ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100347 "rtp base <0-65534>",
348 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800349
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800350DEFUN(cfg_mgcp_rtp_transcoder_range,
351 cfg_mgcp_rtp_transcoder_range_cmd,
352 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100353 RTP_STR "Range of ports to use for the Transcoder\n"
354 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800355{
356 parse_range(&g_cfg->transcoder_ports, argv);
357 return CMD_SUCCESS;
358}
359
360DEFUN(cfg_mgcp_rtp_transcoder_base,
361 cfg_mgcp_rtp_transcoder_base_cmd,
362 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100363 RTP_STR "First UDP port allocated for the Transcoder side\n"
364 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800365{
366 parse_base(&g_cfg->transcoder_ports, argv);
367 return CMD_SUCCESS;
368}
369
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800370DEFUN(cfg_mgcp_rtp_ip_dscp,
371 cfg_mgcp_rtp_ip_dscp_cmd,
372 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100373 RTP_STR
374 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800375{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800376 int dscp = atoi(argv[0]);
377 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800378 return CMD_SUCCESS;
379}
380
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800381ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
382 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100383 RTP_STR
384 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800385
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200386#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
387DEFUN(cfg_mgcp_rtp_force_ptime,
388 cfg_mgcp_rtp_force_ptime_cmd,
389 "rtp force-ptime (10|20|40)",
390 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther29474112014-07-04 20:11:11 +0200391 "The required ptime (packet duration) in ms\n"
392 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200393{
394 g_cfg->bts_force_ptime = atoi(argv[0]);
395 return CMD_SUCCESS;
396}
397
398DEFUN(cfg_mgcp_no_rtp_force_ptime,
399 cfg_mgcp_no_rtp_force_ptime_cmd,
400 "no rtp force-ptime",
401 NO_STR RTP_STR FORCE_PTIME_STR)
402{
403 g_cfg->bts_force_ptime = 0;
404 return CMD_SUCCESS;
405}
406
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200407DEFUN(cfg_mgcp_sdp_fmtp_extra,
408 cfg_mgcp_sdp_fmtp_extra_cmd,
409 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100410 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
411 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200412{
413 char *txt = argv_concat(argv, argc, 0);
414 if (!txt)
415 return CMD_WARNING;
416
417 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
418 talloc_free(txt);
419 return CMD_SUCCESS;
420}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800421
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100422#define SDP_STR "SDP File related options\n"
423#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100424DEFUN(cfg_mgcp_sdp_payload_number,
425 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100426 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100427 SDP_STR AUDIO_STR
428 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100429{
430 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100431 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100432 return CMD_SUCCESS;
433}
434
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100435ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100436 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100437 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
438
439
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100440DEFUN(cfg_mgcp_sdp_payload_name,
441 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100442 "sdp audio-payload name NAME",
443 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100444{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100445 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100446 return CMD_SUCCESS;
447}
448
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100449ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
450 "sdp audio payload name NAME",
451 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
452
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100453DEFUN(cfg_mgcp_sdp_payload_send_ptime,
454 cfg_mgcp_sdp_payload_send_ptime_cmd,
455 "sdp audio-payload send-ptime",
456 SDP_STR AUDIO_STR
457 "Send SDP ptime (packet duration) attribute\n")
458{
459 g_cfg->trunk.audio_send_ptime = 1;
460 return CMD_SUCCESS;
461}
462
463DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
464 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
465 "no sdp audio-payload send-ptime",
466 NO_STR SDP_STR AUDIO_STR
467 "Send SDP ptime (packet duration) attribute\n")
468{
469 g_cfg->trunk.audio_send_ptime = 0;
470 return CMD_SUCCESS;
471}
472
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100473DEFUN(cfg_mgcp_loop,
474 cfg_mgcp_loop_cmd,
475 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100476 "Loop audio for all endpoints on main trunk\n"
477 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100478{
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100479 if (g_cfg->osmux) {
480 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
481 return CMD_WARNING;
482 }
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100483 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100484 return CMD_SUCCESS;
485}
486
487DEFUN(cfg_mgcp_number_endp,
488 cfg_mgcp_number_endp_cmd,
489 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100490 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100491{
492 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100493 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100494 return CMD_SUCCESS;
495}
496
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200497DEFUN(cfg_mgcp_omit_rtcp,
498 cfg_mgcp_omit_rtcp_cmd,
499 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200500 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200501{
502 g_cfg->trunk.omit_rtcp = 1;
503 return CMD_SUCCESS;
504}
505
506DEFUN(cfg_mgcp_no_omit_rtcp,
507 cfg_mgcp_no_omit_rtcp_cmd,
508 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200509 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200510{
511 g_cfg->trunk.omit_rtcp = 0;
512 return CMD_SUCCESS;
513}
514
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100515DEFUN(cfg_mgcp_patch_rtp_ssrc,
516 cfg_mgcp_patch_rtp_ssrc_cmd,
517 "rtp-patch ssrc",
518 RTP_PATCH_STR
519 "Force a fixed SSRC\n"
520 )
521{
522 g_cfg->trunk.force_constant_ssrc = 1;
523 return CMD_SUCCESS;
524}
525
526DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
527 cfg_mgcp_no_patch_rtp_ssrc_cmd,
528 "no rtp-patch ssrc",
529 NO_STR RTP_PATCH_STR
530 "Force a fixed SSRC\n"
531 )
532{
533 g_cfg->trunk.force_constant_ssrc = 0;
534 return CMD_SUCCESS;
535}
536
537DEFUN(cfg_mgcp_patch_rtp_ts,
538 cfg_mgcp_patch_rtp_ts_cmd,
539 "rtp-patch timestamp",
540 RTP_PATCH_STR
541 "Adjust RTP timestamp\n"
542 )
543{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100544 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100545 return CMD_SUCCESS;
546}
547
548DEFUN(cfg_mgcp_no_patch_rtp_ts,
549 cfg_mgcp_no_patch_rtp_ts_cmd,
550 "no rtp-patch timestamp",
551 NO_STR RTP_PATCH_STR
552 "Adjust RTP timestamp\n"
553 )
554{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100555 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100556 return CMD_SUCCESS;
557}
558
559DEFUN(cfg_mgcp_no_patch_rtp,
560 cfg_mgcp_no_patch_rtp_cmd,
561 "no rtp-patch",
562 NO_STR RTP_PATCH_STR)
563{
564 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100565 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100566 return CMD_SUCCESS;
567}
568
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100569DEFUN(cfg_mgcp_rtp_keepalive,
570 cfg_mgcp_rtp_keepalive_cmd,
571 "rtp keep-alive <1-120>",
572 RTP_STR RTP_KEEPALIVE_STR
573 "Keep alive interval in secs\n"
574 )
575{
576 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
577 return CMD_SUCCESS;
578}
579
580DEFUN(cfg_mgcp_rtp_keepalive_once,
581 cfg_mgcp_rtp_keepalive_once_cmd,
582 "rtp keep-alive once",
583 RTP_STR RTP_KEEPALIVE_STR
584 "Send dummy packet only once after CRCX/MDCX\n"
585 )
586{
587 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
588 return CMD_SUCCESS;
589}
590
591DEFUN(cfg_mgcp_no_rtp_keepalive,
592 cfg_mgcp_no_rtp_keepalive_cmd,
593 "no rtp keep-alive",
594 NO_STR RTP_STR RTP_KEEPALIVE_STR
595 )
596{
597 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
598 return CMD_SUCCESS;
599}
600
601
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100602
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100603#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200604DEFUN(cfg_mgcp_agent_addr,
605 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100606 "call-agent ip A.B.C.D",
607 CALL_AGENT_STR IP_STR
608 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200609{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200610 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200611 return CMD_SUCCESS;
612}
613
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100614ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
615 "call agent ip A.B.C.D",
616 CALL_AGENT_STR CALL_AGENT_STR IP_STR
617 "IPv4 Address of the callagent\n")
618
619
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800620DEFUN(cfg_mgcp_transcoder,
621 cfg_mgcp_transcoder_cmd,
622 "transcoder-mgw A.B.C.D",
623 "Use a MGW to detranscoder RTP\n"
624 "The IP address of the MGW")
625{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200626 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800627 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
628
629 return CMD_SUCCESS;
630}
631
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100632DEFUN(cfg_mgcp_no_transcoder,
633 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100634 "no transcoder-mgw",
635 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100636{
637 if (g_cfg->transcoder_ip) {
638 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
639 talloc_free(g_cfg->transcoder_ip);
640 g_cfg->transcoder_ip = NULL;
641 }
642
643 return CMD_SUCCESS;
644}
645
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800646DEFUN(cfg_mgcp_transcoder_remote_base,
647 cfg_mgcp_transcoder_remote_base_cmd,
648 "transcoder-remote-base <0-65534>",
649 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
650{
651 g_cfg->transcoder_remote_base = atoi(argv[0]);
652 return CMD_SUCCESS;
653}
654
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100655DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
656 "trunk <1-64>",
657 "Configure a SS7 trunk\n" "Trunk Nr\n")
658{
659 struct mgcp_trunk_config *trunk;
660 int index = atoi(argv[0]);
661
662 trunk = mgcp_trunk_num(g_cfg, index);
663 if (!trunk)
664 trunk = mgcp_trunk_alloc(g_cfg, index);
665
666 if (!trunk) {
667 vty_out(vty, "%%Unable to allocate trunk %u.%s",
668 index, VTY_NEWLINE);
669 return CMD_WARNING;
670 }
671
672 vty->node = TRUNK_NODE;
673 vty->index = trunk;
674 return CMD_SUCCESS;
675}
676
677static int config_write_trunk(struct vty *vty)
678{
679 struct mgcp_trunk_config *trunk;
680
681 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
682 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100683 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100684 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100685 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100686 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100687 vty_out(vty, " %ssdp audio-payload send-ptime%s",
688 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100689
690 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
691 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
692 else if (trunk->keepalive_interval)
693 vty_out(vty, " rtp keep-alive %d%s",
694 trunk->keepalive_interval, VTY_NEWLINE);
695 else
696 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
697
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100698 vty_out(vty, " loop %d%s",
699 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200700 if (trunk->omit_rtcp)
701 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
702 else
703 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100704 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100705 vty_out(vty, " %srtp-patch ssrc%s",
706 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
707 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100708 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100709 } else
710 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200711 if (trunk->audio_fmtp_extra)
712 vty_out(vty, " sdp audio fmtp-extra %s%s",
713 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100714 }
715
716 return CMD_SUCCESS;
717}
718
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200719DEFUN(cfg_trunk_sdp_fmtp_extra,
720 cfg_trunk_sdp_fmtp_extra_cmd,
721 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100722 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
723 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200724{
725 struct mgcp_trunk_config *trunk = vty->index;
726 char *txt = argv_concat(argv, argc, 0);
727 if (!txt)
728 return CMD_WARNING;
729
730 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
731 talloc_free(txt);
732 return CMD_SUCCESS;
733}
734
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100735DEFUN(cfg_trunk_payload_number,
736 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100737 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100738 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100739{
740 struct mgcp_trunk_config *trunk = vty->index;
741 unsigned int payload = atoi(argv[0]);
742
743 trunk->audio_payload = payload;
744 return CMD_SUCCESS;
745}
746
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100747ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100748 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100749 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
750
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100751DEFUN(cfg_trunk_payload_name,
752 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100753 "sdp audio-payload name NAME",
754 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100755{
756 struct mgcp_trunk_config *trunk = vty->index;
757
758 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
759 return CMD_SUCCESS;
760}
761
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100762ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
763 "sdp audio payload name NAME",
764 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
765
766
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100767DEFUN(cfg_trunk_loop,
768 cfg_trunk_loop_cmd,
769 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100770 "Loop audio for all endpoints on this trunk\n"
771 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100772{
773 struct mgcp_trunk_config *trunk = vty->index;
774
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100775 if (g_cfg->osmux) {
776 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
777 return CMD_WARNING;
778 }
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100779 trunk->audio_loop = atoi(argv[0]);
780 return CMD_SUCCESS;
781}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800782
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100783DEFUN(cfg_trunk_sdp_payload_send_ptime,
784 cfg_trunk_sdp_payload_send_ptime_cmd,
785 "sdp audio-payload send-ptime",
786 SDP_STR AUDIO_STR
787 "Send SDP ptime (packet duration) attribute\n")
788{
789 struct mgcp_trunk_config *trunk = vty->index;
790 trunk->audio_send_ptime = 1;
791 return CMD_SUCCESS;
792}
793
794DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
795 cfg_trunk_no_sdp_payload_send_ptime_cmd,
796 "no sdp audio-payload send-ptime",
797 NO_STR SDP_STR AUDIO_STR
798 "Send SDP ptime (packet duration) attribute\n")
799{
800 struct mgcp_trunk_config *trunk = vty->index;
801 trunk->audio_send_ptime = 0;
802 return CMD_SUCCESS;
803}
804
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200805DEFUN(cfg_trunk_omit_rtcp,
806 cfg_trunk_omit_rtcp_cmd,
807 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200808 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200809{
810 struct mgcp_trunk_config *trunk = vty->index;
811 trunk->omit_rtcp = 1;
812 return CMD_SUCCESS;
813}
814
815DEFUN(cfg_trunk_no_omit_rtcp,
816 cfg_trunk_no_omit_rtcp_cmd,
817 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200818 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200819{
820 struct mgcp_trunk_config *trunk = vty->index;
821 trunk->omit_rtcp = 0;
822 return CMD_SUCCESS;
823}
824
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100825DEFUN(cfg_trunk_patch_rtp_ssrc,
826 cfg_trunk_patch_rtp_ssrc_cmd,
827 "rtp-patch ssrc",
828 RTP_PATCH_STR
829 "Force a fixed SSRC\n"
830 )
831{
832 struct mgcp_trunk_config *trunk = vty->index;
833 trunk->force_constant_ssrc = 1;
834 return CMD_SUCCESS;
835}
836
837DEFUN(cfg_trunk_no_patch_rtp_ssrc,
838 cfg_trunk_no_patch_rtp_ssrc_cmd,
839 "no rtp-patch ssrc",
840 NO_STR RTP_PATCH_STR
841 "Force a fixed SSRC\n"
842 )
843{
844 struct mgcp_trunk_config *trunk = vty->index;
845 trunk->force_constant_ssrc = 0;
846 return CMD_SUCCESS;
847}
848
849DEFUN(cfg_trunk_patch_rtp_ts,
850 cfg_trunk_patch_rtp_ts_cmd,
851 "rtp-patch timestamp",
852 RTP_PATCH_STR
853 "Adjust RTP timestamp\n"
854 )
855{
856 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100857 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100858 return CMD_SUCCESS;
859}
860
861DEFUN(cfg_trunk_no_patch_rtp_ts,
862 cfg_trunk_no_patch_rtp_ts_cmd,
863 "no rtp-patch timestamp",
864 NO_STR RTP_PATCH_STR
865 "Adjust RTP timestamp\n"
866 )
867{
868 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100869 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100870 return CMD_SUCCESS;
871}
872
873DEFUN(cfg_trunk_no_patch_rtp,
874 cfg_trunk_no_patch_rtp_cmd,
875 "no rtp-patch",
876 NO_STR RTP_PATCH_STR)
877{
878 struct mgcp_trunk_config *trunk = vty->index;
879 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100880 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100881 return CMD_SUCCESS;
882}
883
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100884DEFUN(cfg_trunk_rtp_keepalive,
885 cfg_trunk_rtp_keepalive_cmd,
886 "rtp keep-alive <1-120>",
887 RTP_STR RTP_KEEPALIVE_STR
888 "Keep-alive interval in secs\n"
889 )
890{
891 struct mgcp_trunk_config *trunk = vty->index;
892 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
893 return CMD_SUCCESS;
894}
895
896DEFUN(cfg_trunk_rtp_keepalive_once,
897 cfg_trunk_rtp_keepalive_once_cmd,
898 "rtp keep-alive once",
899 RTP_STR RTP_KEEPALIVE_STR
900 "Send dummy packet only once after CRCX/MDCX\n"
901 )
902{
903 struct mgcp_trunk_config *trunk = vty->index;
904 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
905 return CMD_SUCCESS;
906}
907
908DEFUN(cfg_trunk_no_rtp_keepalive,
909 cfg_trunk_no_rtp_keepalive_cmd,
910 "no rtp keep-alive",
911 NO_STR RTP_STR RTP_KEEPALIVE_STR
912 )
913{
914 struct mgcp_trunk_config *trunk = vty->index;
915 mgcp_trunk_set_keepalive(trunk, 0);
916 return CMD_SUCCESS;
917}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100918
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800919DEFUN(loop_endp,
920 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100921 "loop-endpoint <0-64> NAME (0|1)",
922 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800923 "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 +0800924{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100925 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800926 struct mgcp_endpoint *endp;
927
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100928 trunk = find_trunk(g_cfg, atoi(argv[0]));
929 if (!trunk) {
930 vty_out(vty, "%%Trunk %d not found in the config.%s",
931 atoi(argv[0]), VTY_NEWLINE);
932 return CMD_WARNING;
933 }
934
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100935 if (!trunk->endpoints) {
936 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
937 trunk->trunk_nr, VTY_NEWLINE);
938 return CMD_WARNING;
939 }
940
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100941 int endp_no = strtoul(argv[1], NULL, 16);
942 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800943 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100944 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800945 return CMD_WARNING;
946 }
947
948
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100949 endp = &trunk->endpoints[endp_no];
950 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800951
952 if (loop)
953 endp->conn_mode = MGCP_CONN_LOOPBACK;
954 else
955 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100956
957 /* Handle it like a MDCX, switch on SSRC patching if enabled */
958 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
959 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800960
961 return CMD_SUCCESS;
962}
963
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800964DEFUN(tap_call,
965 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100966 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
967 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800968 "The endpoint in hex\n"
969 "Forward the data coming from the bts\n"
970 "Forward the data coming from the bts leaving to the network\n"
971 "Forward the data coming from the net\n"
972 "Forward the data coming from the net leaving to the bts\n"
973 "destination IP of the data\n" "destination port\n")
974{
975 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100976 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800977 struct mgcp_endpoint *endp;
978 int port = 0;
979
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100980 trunk = find_trunk(g_cfg, atoi(argv[0]));
981 if (!trunk) {
982 vty_out(vty, "%%Trunk %d not found in the config.%s",
983 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800984 return CMD_WARNING;
985 }
986
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100987 if (!trunk->endpoints) {
988 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
989 trunk->trunk_nr, VTY_NEWLINE);
990 return CMD_WARNING;
991 }
992
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100993 int endp_no = strtoul(argv[1], NULL, 16);
994 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
995 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
996 argv[1], endp_no, VTY_NEWLINE);
997 return CMD_WARNING;
998 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800999
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001000 endp = &trunk->endpoints[endp_no];
1001
1002 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001003 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001004 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001005 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001006 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001007 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001008 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001009 port = MGCP_TAP_NET_OUT;
1010 } else {
1011 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1012 return CMD_WARNING;
1013 }
1014
1015 tap = &endp->taps[port];
1016 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001017 inet_aton(argv[3], &tap->forward.sin_addr);
1018 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +08001019 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001020 return CMD_SUCCESS;
1021}
1022
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001023DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001024 "free-endpoint <0-64> NUMBER",
1025 "Free the given endpoint\n" "Trunk number\n"
1026 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001027{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001028 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001029 struct mgcp_endpoint *endp;
1030
Holger Hans Peter Freytherab3bb9d2011-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 Freyther5508fe32010-08-08 16:39:57 +08001035 return CMD_WARNING;
1036 }
1037
Holger Hans Peter Freyther6ea7e772011-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 Freytherab3bb9d2011-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 }
1050
1051 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freythercb6ad702014-07-22 15:00:52 +02001052 mgcp_release_endp(endp);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001053 return CMD_SUCCESS;
1054}
1055
Harald Welte6a857052012-01-27 00:41:39 +01001056DEFUN(reset_endp, reset_endp_cmd,
1057 "reset-endpoint <0-64> NUMBER",
1058 "Reset the given endpoint\n" "Trunk number\n"
1059 "Endpoint number in hex.\n")
1060{
1061 struct mgcp_trunk_config *trunk;
1062 struct mgcp_endpoint *endp;
1063 int endp_no, rc;
1064
1065 trunk = find_trunk(g_cfg, atoi(argv[0]));
1066 if (!trunk) {
1067 vty_out(vty, "%%Trunk %d not found in the config.%s",
1068 atoi(argv[0]), VTY_NEWLINE);
1069 return CMD_WARNING;
1070 }
1071
1072 if (!trunk->endpoints) {
1073 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1074 trunk->trunk_nr, VTY_NEWLINE);
1075 return CMD_WARNING;
1076 }
1077
1078 endp_no = strtoul(argv[1], NULL, 16);
1079 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1080 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1081 argv[1], endp_no, VTY_NEWLINE);
1082 return CMD_WARNING;
1083 }
1084
1085 endp = &trunk->endpoints[endp_no];
1086 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1087 if (rc < 0) {
1088 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1089 return CMD_WARNING;
1090 }
1091 return CMD_SUCCESS;
1092}
1093
1094DEFUN(reset_all_endp, reset_all_endp_cmd,
1095 "reset-all-endpoints",
1096 "Reset all endpoints\n")
1097{
1098 int rc;
1099
1100 rc = mgcp_send_reset_all(g_cfg);
1101 if (rc < 0) {
1102 vty_out(vty, "Error %d during endpoint reset.%s",
1103 rc, VTY_NEWLINE);
1104 return CMD_WARNING;
1105 }
1106 return CMD_SUCCESS;
1107}
1108
Holger Hans Peter Freythercc84c952014-06-03 13:36:42 +02001109#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001110DEFUN(cfg_mgcp_osmux,
1111 cfg_mgcp_osmux_cmd,
1112 "osmux (on|off)",
1113 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1114{
1115 if (strcmp(argv[0], "on") == 0) {
1116 g_cfg->osmux = 1;
1117 if (g_cfg->trunk.audio_loop) {
1118 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1119 VTY_NEWLINE);
1120 return CMD_WARNING;
1121 }
1122 } else if (strcmp(argv[0], "off") == 0)
1123 g_cfg->osmux = 0;
1124
1125 return CMD_SUCCESS;
1126}
1127
1128DEFUN(cfg_mgcp_osmux_batch_factor,
1129 cfg_mgcp_osmux_batch_factor_cmd,
Holger Hans Peter Freyther421365e2014-06-16 14:12:02 +02001130 "osmux batch-factor <1-16>",
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001131 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1132{
1133 g_cfg->osmux_batch = atoi(argv[0]);
1134 return CMD_SUCCESS;
1135}
Harald Welte6a857052012-01-27 00:41:39 +01001136
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001137DEFUN(cfg_mgcp_osmux_port,
1138 cfg_mgcp_osmux_port_cmd,
1139 "osmux port <1-65535>",
1140 OSMUX_STR "port\n" "UDP port\n")
1141{
1142 g_cfg->osmux_port = atoi(argv[0]);
1143 return CMD_SUCCESS;
1144}
1145
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001146int mgcp_vty_init(void)
1147{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001148 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001149 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001150 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001151 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001152 install_element(ENABLE_NODE, &reset_endp_cmd);
1153 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001154
1155 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1156 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001157
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001158 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001159 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1160 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1161 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1162 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1163 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1164 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001165 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001166 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001167 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1168 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001169 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1170 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001171 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001172 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck42a833e2014-04-14 10:31:47 +02001173 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1174 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001175 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1176 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1177 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001178 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001179 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001180 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001181 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001182 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001183 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1184 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001185 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1186 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001187 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1188 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001189 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1190 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001191 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1192 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1193 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1194 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1195 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001196 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001197 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1198 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001199 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1200 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001201 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001202
1203 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1204 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001205 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001206 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1207 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1208 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001209 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1210 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001211 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1212 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001213 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001214 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1215 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001216 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1217 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1218 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1219 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1220 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001221 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001222 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1223 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001224
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001225 return 0;
1226}
1227
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001228static int allocate_trunk(struct mgcp_trunk_config *trunk)
1229{
1230 int i;
1231 struct mgcp_config *cfg = trunk->cfg;
1232
1233 if (mgcp_endpoints_allocate(trunk) != 0) {
1234 LOGP(DMGCP, LOGL_ERROR,
1235 "Failed to allocate %d endpoints on trunk %d.\n",
1236 trunk->number_endpoints, trunk->trunk_nr);
1237 return -1;
1238 }
1239
1240 /* early bind */
1241 for (i = 1; i < trunk->number_endpoints; ++i) {
1242 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001243
1244 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001245 cfg->last_bts_port += 2;
1246 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1247 LOGP(DMGCP, LOGL_FATAL,
1248 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001249 return -1;
1250 }
1251 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1252 }
1253
1254 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001255 cfg->last_net_port += 2;
1256 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1257 LOGP(DMGCP, LOGL_FATAL,
1258 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001259 return -1;
1260 }
1261 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1262 }
1263
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001264 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1265 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001266 int rtp_port;
1267
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001268 /* network side */
1269 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1270 cfg->transcoder_ports.base_port);
1271 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1272 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1273 return -1;
1274 }
1275 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1276
1277 /* bts side */
1278 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1279 cfg->transcoder_ports.base_port);
1280 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1281 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1282 return -1;
1283 }
1284 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1285 }
1286 }
1287
1288 return 0;
1289}
1290
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001291int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1292 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001293{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001294 int rc;
1295 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001296
Pablo Neira Ayuso308d5f82014-08-29 12:20:17 +02001297 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001298 /* Default to 4 messages */
1299 cfg->osmux_batch = 4;
1300
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001301 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001302 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001303 if (rc < 0) {
1304 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1305 return rc;
1306 }
1307
1308
1309 if (!g_cfg->bts_ip)
1310 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1311
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001312 if (!g_cfg->source_addr) {
1313 fprintf(stderr, "You need to specify a bind address.\n");
1314 return -1;
1315 }
1316
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001317 /* initialize the last ports */
1318 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1319 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1320
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001321 if (allocate_trunk(&g_cfg->trunk) != 0) {
1322 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001323 return -1;
1324 }
1325
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001326 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1327 if (allocate_trunk(trunk) != 0) {
1328 LOGP(DMGCP, LOGL_ERROR,
1329 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1330 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001331 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001332 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001333 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001334
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001335 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001336}
1337