blob: 42d99e78433baac364f4afe7cda6ba72aa8b939c [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);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800138
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100139 return CMD_SUCCESS;
140}
141
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200142static void dump_rtp_end(const char *end_name, struct vty *vty,
143 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
144{
145 vty_out(vty,
146 " %s%s"
147 " Timestamp Errs: %d->%d%s"
148 " Dropped Packets: %d%s"
149 " Payload Type: %d Rate: %u Channels: %d %s"
150 " Frame Duration: %u Frame Denominator: %u%s"
151 " FPP: %d Packet Duration: %u%s"
152 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
153 " Output-Enabled: %d Force-PTIME: %d%s",
154 end_name, VTY_NEWLINE,
155 state->in_stream.err_ts_counter,
156 state->out_stream.err_ts_counter, VTY_NEWLINE,
157 end->dropped_packets, VTY_NEWLINE,
158 end->payload_type, end->rate, end->channels, VTY_NEWLINE,
159 end->frame_duration_num, end->frame_duration_den, VTY_NEWLINE,
160 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
161 end->fmtp_extra, end->audio_name, end->subtype_name, VTY_NEWLINE,
162 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
163}
164
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100165static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100166{
167 int i;
168
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100169 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
170 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
171 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
172
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100173 if (!cfg->endpoints) {
174 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
175 return;
176 }
177
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100178 for (i = 1; i < cfg->number_endpoints; ++i) {
179 struct mgcp_endpoint *endp = &cfg->endpoints[i];
180 vty_out(vty,
181 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200182 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100183 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800184 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
185 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
186 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200187 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100188 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200189 VTY_NEWLINE);
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100190
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200191 if (verbose && endp->allocated) {
192 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
193 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100194 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100195 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100196}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100197
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100198DEFUN(show_mcgp, show_mgcp_cmd,
199 "show mgcp [stats]",
200 SHOW_STR
201 "Display information about the MGCP Media Gateway\n"
202 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100203{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100204 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100205 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100206
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100207 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100208
209 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100210 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100211
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100212 return CMD_SUCCESS;
213}
214
215DEFUN(cfg_mgcp,
216 cfg_mgcp_cmd,
217 "mgcp",
218 "Configure the MGCP")
219{
220 vty->node = MGCP_NODE;
221 return CMD_SUCCESS;
222}
223
224DEFUN(cfg_mgcp_local_ip,
225 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800226 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100227 "Local options for the SDP record\n"
228 IP_STR
229 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100230{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200231 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100232 return CMD_SUCCESS;
233}
234
235DEFUN(cfg_mgcp_bts_ip,
236 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800237 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100238 "BTS Audio source/destination options\n"
239 IP_STR
240 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100241{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200242 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100243 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
244 return CMD_SUCCESS;
245}
246
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100247#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100248DEFUN(cfg_mgcp_bind_ip,
249 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800250 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100251 BIND_STR
252 IP_STR
253 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100254{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200255 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100256 return CMD_SUCCESS;
257}
258
259DEFUN(cfg_mgcp_bind_port,
260 cfg_mgcp_bind_port_cmd,
261 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100262 BIND_STR
263 "Port information\n"
264 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100265{
266 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100267 g_cfg->source_port = port;
268 return CMD_SUCCESS;
269}
270
271DEFUN(cfg_mgcp_bind_early,
272 cfg_mgcp_bind_early_cmd,
273 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100274 BIND_STR
275 "Bind local ports on start up\n"
276 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100277{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800278 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
279 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100280}
281
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800282static void parse_base(struct mgcp_port_range *range, const char **argv)
283{
284 unsigned int port = atoi(argv[0]);
285 range->mode = PORT_ALLOC_STATIC;
286 range->base_port = port;
287}
288
289static void parse_range(struct mgcp_port_range *range, const char **argv)
290{
291 range->mode = PORT_ALLOC_DYNAMIC;
292 range->range_start = atoi(argv[0]);
293 range->range_end = atoi(argv[1]);
294 range->last_port = g_cfg->bts_ports.range_start;
295}
296
297
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100298#define RTP_STR "RTP configuration\n"
299#define BTS_START_STR "First UDP port allocated for the BTS side\n"
300#define NET_START_STR "First UDP port allocated for the NET side\n"
301#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800302DEFUN(cfg_mgcp_rtp_bts_base_port,
303 cfg_mgcp_rtp_bts_base_port_cmd,
304 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100305 RTP_STR
306 BTS_START_STR
307 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100308{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800309 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100310 return CMD_SUCCESS;
311}
312
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100313#define RANGE_START_STR "Start of the range of ports\n"
314#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800315DEFUN(cfg_mgcp_rtp_bts_range,
316 cfg_mgcp_rtp_bts_range_cmd,
317 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100318 RTP_STR "Range of ports to use for the BTS side\n"
319 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800320{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800321 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800322 return CMD_SUCCESS;
323}
324
325DEFUN(cfg_mgcp_rtp_net_range,
326 cfg_mgcp_rtp_net_range_cmd,
327 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100328 RTP_STR "Range of ports to use for the NET side\n"
329 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800330{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800331 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800332 return CMD_SUCCESS;
333}
334
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800335DEFUN(cfg_mgcp_rtp_net_base_port,
336 cfg_mgcp_rtp_net_base_port_cmd,
337 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100338 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800339{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800340 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800341 return CMD_SUCCESS;
342}
343
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800344ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100345 "rtp base <0-65534>",
346 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800347
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800348DEFUN(cfg_mgcp_rtp_transcoder_range,
349 cfg_mgcp_rtp_transcoder_range_cmd,
350 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100351 RTP_STR "Range of ports to use for the Transcoder\n"
352 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800353{
354 parse_range(&g_cfg->transcoder_ports, argv);
355 return CMD_SUCCESS;
356}
357
358DEFUN(cfg_mgcp_rtp_transcoder_base,
359 cfg_mgcp_rtp_transcoder_base_cmd,
360 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100361 RTP_STR "First UDP port allocated for the Transcoder side\n"
362 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800363{
364 parse_base(&g_cfg->transcoder_ports, argv);
365 return CMD_SUCCESS;
366}
367
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800368DEFUN(cfg_mgcp_rtp_ip_dscp,
369 cfg_mgcp_rtp_ip_dscp_cmd,
370 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100371 RTP_STR
372 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800373{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800374 int dscp = atoi(argv[0]);
375 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800376 return CMD_SUCCESS;
377}
378
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800379ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
380 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100381 RTP_STR
382 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800383
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200384#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
385DEFUN(cfg_mgcp_rtp_force_ptime,
386 cfg_mgcp_rtp_force_ptime_cmd,
387 "rtp force-ptime (10|20|40)",
388 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther29474112014-07-04 20:11:11 +0200389 "The required ptime (packet duration) in ms\n"
390 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200391{
392 g_cfg->bts_force_ptime = atoi(argv[0]);
393 return CMD_SUCCESS;
394}
395
396DEFUN(cfg_mgcp_no_rtp_force_ptime,
397 cfg_mgcp_no_rtp_force_ptime_cmd,
398 "no rtp force-ptime",
399 NO_STR RTP_STR FORCE_PTIME_STR)
400{
401 g_cfg->bts_force_ptime = 0;
402 return CMD_SUCCESS;
403}
404
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200405DEFUN(cfg_mgcp_sdp_fmtp_extra,
406 cfg_mgcp_sdp_fmtp_extra_cmd,
407 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100408 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
409 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200410{
411 char *txt = argv_concat(argv, argc, 0);
412 if (!txt)
413 return CMD_WARNING;
414
415 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
416 talloc_free(txt);
417 return CMD_SUCCESS;
418}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800419
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100420#define SDP_STR "SDP File related options\n"
421#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100422DEFUN(cfg_mgcp_sdp_payload_number,
423 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100424 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100425 SDP_STR AUDIO_STR
426 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100427{
428 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100429 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100430 return CMD_SUCCESS;
431}
432
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100433ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100434 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100435 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
436
437
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100438DEFUN(cfg_mgcp_sdp_payload_name,
439 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100440 "sdp audio-payload name NAME",
441 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100442{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100443 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100444 return CMD_SUCCESS;
445}
446
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100447ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
448 "sdp audio payload name NAME",
449 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
450
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100451DEFUN(cfg_mgcp_sdp_payload_send_ptime,
452 cfg_mgcp_sdp_payload_send_ptime_cmd,
453 "sdp audio-payload send-ptime",
454 SDP_STR AUDIO_STR
455 "Send SDP ptime (packet duration) attribute\n")
456{
457 g_cfg->trunk.audio_send_ptime = 1;
458 return CMD_SUCCESS;
459}
460
461DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
462 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
463 "no sdp audio-payload send-ptime",
464 NO_STR SDP_STR AUDIO_STR
465 "Send SDP ptime (packet duration) attribute\n")
466{
467 g_cfg->trunk.audio_send_ptime = 0;
468 return CMD_SUCCESS;
469}
470
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100471DEFUN(cfg_mgcp_loop,
472 cfg_mgcp_loop_cmd,
473 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100474 "Loop audio for all endpoints on main trunk\n"
475 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100476{
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100477 if (g_cfg->osmux) {
478 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
479 return CMD_WARNING;
480 }
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100481 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100482 return CMD_SUCCESS;
483}
484
485DEFUN(cfg_mgcp_number_endp,
486 cfg_mgcp_number_endp_cmd,
487 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100488 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100489{
490 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100491 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100492 return CMD_SUCCESS;
493}
494
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200495DEFUN(cfg_mgcp_omit_rtcp,
496 cfg_mgcp_omit_rtcp_cmd,
497 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200498 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200499{
500 g_cfg->trunk.omit_rtcp = 1;
501 return CMD_SUCCESS;
502}
503
504DEFUN(cfg_mgcp_no_omit_rtcp,
505 cfg_mgcp_no_omit_rtcp_cmd,
506 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200507 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200508{
509 g_cfg->trunk.omit_rtcp = 0;
510 return CMD_SUCCESS;
511}
512
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100513DEFUN(cfg_mgcp_patch_rtp_ssrc,
514 cfg_mgcp_patch_rtp_ssrc_cmd,
515 "rtp-patch ssrc",
516 RTP_PATCH_STR
517 "Force a fixed SSRC\n"
518 )
519{
520 g_cfg->trunk.force_constant_ssrc = 1;
521 return CMD_SUCCESS;
522}
523
524DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
525 cfg_mgcp_no_patch_rtp_ssrc_cmd,
526 "no rtp-patch ssrc",
527 NO_STR RTP_PATCH_STR
528 "Force a fixed SSRC\n"
529 )
530{
531 g_cfg->trunk.force_constant_ssrc = 0;
532 return CMD_SUCCESS;
533}
534
535DEFUN(cfg_mgcp_patch_rtp_ts,
536 cfg_mgcp_patch_rtp_ts_cmd,
537 "rtp-patch timestamp",
538 RTP_PATCH_STR
539 "Adjust RTP timestamp\n"
540 )
541{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100542 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100543 return CMD_SUCCESS;
544}
545
546DEFUN(cfg_mgcp_no_patch_rtp_ts,
547 cfg_mgcp_no_patch_rtp_ts_cmd,
548 "no rtp-patch timestamp",
549 NO_STR RTP_PATCH_STR
550 "Adjust RTP timestamp\n"
551 )
552{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100553 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100554 return CMD_SUCCESS;
555}
556
557DEFUN(cfg_mgcp_no_patch_rtp,
558 cfg_mgcp_no_patch_rtp_cmd,
559 "no rtp-patch",
560 NO_STR RTP_PATCH_STR)
561{
562 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100563 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100564 return CMD_SUCCESS;
565}
566
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100567DEFUN(cfg_mgcp_rtp_keepalive,
568 cfg_mgcp_rtp_keepalive_cmd,
569 "rtp keep-alive <1-120>",
570 RTP_STR RTP_KEEPALIVE_STR
571 "Keep alive interval in secs\n"
572 )
573{
574 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
575 return CMD_SUCCESS;
576}
577
578DEFUN(cfg_mgcp_rtp_keepalive_once,
579 cfg_mgcp_rtp_keepalive_once_cmd,
580 "rtp keep-alive once",
581 RTP_STR RTP_KEEPALIVE_STR
582 "Send dummy packet only once after CRCX/MDCX\n"
583 )
584{
585 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
586 return CMD_SUCCESS;
587}
588
589DEFUN(cfg_mgcp_no_rtp_keepalive,
590 cfg_mgcp_no_rtp_keepalive_cmd,
591 "no rtp keep-alive",
592 NO_STR RTP_STR RTP_KEEPALIVE_STR
593 )
594{
595 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
596 return CMD_SUCCESS;
597}
598
599
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100600
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100601#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200602DEFUN(cfg_mgcp_agent_addr,
603 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100604 "call-agent ip A.B.C.D",
605 CALL_AGENT_STR IP_STR
606 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200607{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200608 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200609 return CMD_SUCCESS;
610}
611
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100612ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
613 "call agent ip A.B.C.D",
614 CALL_AGENT_STR CALL_AGENT_STR IP_STR
615 "IPv4 Address of the callagent\n")
616
617
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800618DEFUN(cfg_mgcp_transcoder,
619 cfg_mgcp_transcoder_cmd,
620 "transcoder-mgw A.B.C.D",
621 "Use a MGW to detranscoder RTP\n"
622 "The IP address of the MGW")
623{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200624 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800625 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
626
627 return CMD_SUCCESS;
628}
629
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100630DEFUN(cfg_mgcp_no_transcoder,
631 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100632 "no transcoder-mgw",
633 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100634{
635 if (g_cfg->transcoder_ip) {
636 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
637 talloc_free(g_cfg->transcoder_ip);
638 g_cfg->transcoder_ip = NULL;
639 }
640
641 return CMD_SUCCESS;
642}
643
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800644DEFUN(cfg_mgcp_transcoder_remote_base,
645 cfg_mgcp_transcoder_remote_base_cmd,
646 "transcoder-remote-base <0-65534>",
647 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
648{
649 g_cfg->transcoder_remote_base = atoi(argv[0]);
650 return CMD_SUCCESS;
651}
652
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100653DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
654 "trunk <1-64>",
655 "Configure a SS7 trunk\n" "Trunk Nr\n")
656{
657 struct mgcp_trunk_config *trunk;
658 int index = atoi(argv[0]);
659
660 trunk = mgcp_trunk_num(g_cfg, index);
661 if (!trunk)
662 trunk = mgcp_trunk_alloc(g_cfg, index);
663
664 if (!trunk) {
665 vty_out(vty, "%%Unable to allocate trunk %u.%s",
666 index, VTY_NEWLINE);
667 return CMD_WARNING;
668 }
669
670 vty->node = TRUNK_NODE;
671 vty->index = trunk;
672 return CMD_SUCCESS;
673}
674
675static int config_write_trunk(struct vty *vty)
676{
677 struct mgcp_trunk_config *trunk;
678
679 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
680 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100681 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100682 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100683 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100684 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100685 vty_out(vty, " %ssdp audio-payload send-ptime%s",
686 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100687
688 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
689 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
690 else if (trunk->keepalive_interval)
691 vty_out(vty, " rtp keep-alive %d%s",
692 trunk->keepalive_interval, VTY_NEWLINE);
693 else
694 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
695
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100696 vty_out(vty, " loop %d%s",
697 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200698 if (trunk->omit_rtcp)
699 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
700 else
701 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100702 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100703 vty_out(vty, " %srtp-patch ssrc%s",
704 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
705 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100706 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100707 } else
708 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200709 if (trunk->audio_fmtp_extra)
710 vty_out(vty, " sdp audio fmtp-extra %s%s",
711 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100712 }
713
714 return CMD_SUCCESS;
715}
716
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200717DEFUN(cfg_trunk_sdp_fmtp_extra,
718 cfg_trunk_sdp_fmtp_extra_cmd,
719 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100720 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
721 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200722{
723 struct mgcp_trunk_config *trunk = vty->index;
724 char *txt = argv_concat(argv, argc, 0);
725 if (!txt)
726 return CMD_WARNING;
727
728 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
729 talloc_free(txt);
730 return CMD_SUCCESS;
731}
732
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100733DEFUN(cfg_trunk_payload_number,
734 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100735 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100736 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100737{
738 struct mgcp_trunk_config *trunk = vty->index;
739 unsigned int payload = atoi(argv[0]);
740
741 trunk->audio_payload = payload;
742 return CMD_SUCCESS;
743}
744
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100745ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100746 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100747 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
748
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100749DEFUN(cfg_trunk_payload_name,
750 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100751 "sdp audio-payload name NAME",
752 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100753{
754 struct mgcp_trunk_config *trunk = vty->index;
755
756 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
757 return CMD_SUCCESS;
758}
759
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100760ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
761 "sdp audio payload name NAME",
762 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
763
764
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100765DEFUN(cfg_trunk_loop,
766 cfg_trunk_loop_cmd,
767 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100768 "Loop audio for all endpoints on this trunk\n"
769 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100770{
771 struct mgcp_trunk_config *trunk = vty->index;
772
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100773 if (g_cfg->osmux) {
774 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
775 return CMD_WARNING;
776 }
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100777 trunk->audio_loop = atoi(argv[0]);
778 return CMD_SUCCESS;
779}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800780
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100781DEFUN(cfg_trunk_sdp_payload_send_ptime,
782 cfg_trunk_sdp_payload_send_ptime_cmd,
783 "sdp audio-payload send-ptime",
784 SDP_STR AUDIO_STR
785 "Send SDP ptime (packet duration) attribute\n")
786{
787 struct mgcp_trunk_config *trunk = vty->index;
788 trunk->audio_send_ptime = 1;
789 return CMD_SUCCESS;
790}
791
792DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
793 cfg_trunk_no_sdp_payload_send_ptime_cmd,
794 "no sdp audio-payload send-ptime",
795 NO_STR SDP_STR AUDIO_STR
796 "Send SDP ptime (packet duration) attribute\n")
797{
798 struct mgcp_trunk_config *trunk = vty->index;
799 trunk->audio_send_ptime = 0;
800 return CMD_SUCCESS;
801}
802
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200803DEFUN(cfg_trunk_omit_rtcp,
804 cfg_trunk_omit_rtcp_cmd,
805 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200806 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200807{
808 struct mgcp_trunk_config *trunk = vty->index;
809 trunk->omit_rtcp = 1;
810 return CMD_SUCCESS;
811}
812
813DEFUN(cfg_trunk_no_omit_rtcp,
814 cfg_trunk_no_omit_rtcp_cmd,
815 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200816 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200817{
818 struct mgcp_trunk_config *trunk = vty->index;
819 trunk->omit_rtcp = 0;
820 return CMD_SUCCESS;
821}
822
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100823DEFUN(cfg_trunk_patch_rtp_ssrc,
824 cfg_trunk_patch_rtp_ssrc_cmd,
825 "rtp-patch ssrc",
826 RTP_PATCH_STR
827 "Force a fixed SSRC\n"
828 )
829{
830 struct mgcp_trunk_config *trunk = vty->index;
831 trunk->force_constant_ssrc = 1;
832 return CMD_SUCCESS;
833}
834
835DEFUN(cfg_trunk_no_patch_rtp_ssrc,
836 cfg_trunk_no_patch_rtp_ssrc_cmd,
837 "no rtp-patch ssrc",
838 NO_STR RTP_PATCH_STR
839 "Force a fixed SSRC\n"
840 )
841{
842 struct mgcp_trunk_config *trunk = vty->index;
843 trunk->force_constant_ssrc = 0;
844 return CMD_SUCCESS;
845}
846
847DEFUN(cfg_trunk_patch_rtp_ts,
848 cfg_trunk_patch_rtp_ts_cmd,
849 "rtp-patch timestamp",
850 RTP_PATCH_STR
851 "Adjust RTP timestamp\n"
852 )
853{
854 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100855 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100856 return CMD_SUCCESS;
857}
858
859DEFUN(cfg_trunk_no_patch_rtp_ts,
860 cfg_trunk_no_patch_rtp_ts_cmd,
861 "no rtp-patch timestamp",
862 NO_STR RTP_PATCH_STR
863 "Adjust RTP timestamp\n"
864 )
865{
866 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100867 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100868 return CMD_SUCCESS;
869}
870
871DEFUN(cfg_trunk_no_patch_rtp,
872 cfg_trunk_no_patch_rtp_cmd,
873 "no rtp-patch",
874 NO_STR RTP_PATCH_STR)
875{
876 struct mgcp_trunk_config *trunk = vty->index;
877 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100878 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100879 return CMD_SUCCESS;
880}
881
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100882DEFUN(cfg_trunk_rtp_keepalive,
883 cfg_trunk_rtp_keepalive_cmd,
884 "rtp keep-alive <1-120>",
885 RTP_STR RTP_KEEPALIVE_STR
886 "Keep-alive interval in secs\n"
887 )
888{
889 struct mgcp_trunk_config *trunk = vty->index;
890 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
891 return CMD_SUCCESS;
892}
893
894DEFUN(cfg_trunk_rtp_keepalive_once,
895 cfg_trunk_rtp_keepalive_once_cmd,
896 "rtp keep-alive once",
897 RTP_STR RTP_KEEPALIVE_STR
898 "Send dummy packet only once after CRCX/MDCX\n"
899 )
900{
901 struct mgcp_trunk_config *trunk = vty->index;
902 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
903 return CMD_SUCCESS;
904}
905
906DEFUN(cfg_trunk_no_rtp_keepalive,
907 cfg_trunk_no_rtp_keepalive_cmd,
908 "no rtp keep-alive",
909 NO_STR RTP_STR RTP_KEEPALIVE_STR
910 )
911{
912 struct mgcp_trunk_config *trunk = vty->index;
913 mgcp_trunk_set_keepalive(trunk, 0);
914 return CMD_SUCCESS;
915}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100916
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800917DEFUN(loop_endp,
918 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100919 "loop-endpoint <0-64> NAME (0|1)",
920 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800921 "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 +0800922{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100923 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800924 struct mgcp_endpoint *endp;
925
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100926 trunk = find_trunk(g_cfg, atoi(argv[0]));
927 if (!trunk) {
928 vty_out(vty, "%%Trunk %d not found in the config.%s",
929 atoi(argv[0]), VTY_NEWLINE);
930 return CMD_WARNING;
931 }
932
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100933 if (!trunk->endpoints) {
934 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
935 trunk->trunk_nr, VTY_NEWLINE);
936 return CMD_WARNING;
937 }
938
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100939 int endp_no = strtoul(argv[1], NULL, 16);
940 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800941 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100942 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800943 return CMD_WARNING;
944 }
945
946
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100947 endp = &trunk->endpoints[endp_no];
948 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800949
950 if (loop)
951 endp->conn_mode = MGCP_CONN_LOOPBACK;
952 else
953 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100954
955 /* Handle it like a MDCX, switch on SSRC patching if enabled */
956 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
957 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800958
959 return CMD_SUCCESS;
960}
961
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800962DEFUN(tap_call,
963 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100964 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
965 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800966 "The endpoint in hex\n"
967 "Forward the data coming from the bts\n"
968 "Forward the data coming from the bts leaving to the network\n"
969 "Forward the data coming from the net\n"
970 "Forward the data coming from the net leaving to the bts\n"
971 "destination IP of the data\n" "destination port\n")
972{
973 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100974 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800975 struct mgcp_endpoint *endp;
976 int port = 0;
977
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100978 trunk = find_trunk(g_cfg, atoi(argv[0]));
979 if (!trunk) {
980 vty_out(vty, "%%Trunk %d not found in the config.%s",
981 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800982 return CMD_WARNING;
983 }
984
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100985 if (!trunk->endpoints) {
986 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
987 trunk->trunk_nr, VTY_NEWLINE);
988 return CMD_WARNING;
989 }
990
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100991 int endp_no = strtoul(argv[1], NULL, 16);
992 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
993 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
994 argv[1], endp_no, VTY_NEWLINE);
995 return CMD_WARNING;
996 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800997
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100998 endp = &trunk->endpoints[endp_no];
999
1000 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001001 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001002 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001003 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001004 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001005 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001006 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001007 port = MGCP_TAP_NET_OUT;
1008 } else {
1009 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1010 return CMD_WARNING;
1011 }
1012
1013 tap = &endp->taps[port];
1014 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001015 inet_aton(argv[3], &tap->forward.sin_addr);
1016 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +08001017 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001018 return CMD_SUCCESS;
1019}
1020
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001021DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001022 "free-endpoint <0-64> NUMBER",
1023 "Free the given endpoint\n" "Trunk number\n"
1024 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001025{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001026 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001027 struct mgcp_endpoint *endp;
1028
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001029 trunk = find_trunk(g_cfg, atoi(argv[0]));
1030 if (!trunk) {
1031 vty_out(vty, "%%Trunk %d not found in the config.%s",
1032 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001033 return CMD_WARNING;
1034 }
1035
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001036 if (!trunk->endpoints) {
1037 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1038 trunk->trunk_nr, VTY_NEWLINE);
1039 return CMD_WARNING;
1040 }
1041
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001042 int endp_no = strtoul(argv[1], NULL, 16);
1043 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1044 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1045 argv[1], endp_no, VTY_NEWLINE);
1046 return CMD_WARNING;
1047 }
1048
1049 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001050 mgcp_free_endp(endp);
1051 return CMD_SUCCESS;
1052}
1053
Harald Welte6a857052012-01-27 00:41:39 +01001054DEFUN(reset_endp, reset_endp_cmd,
1055 "reset-endpoint <0-64> NUMBER",
1056 "Reset the given endpoint\n" "Trunk number\n"
1057 "Endpoint number in hex.\n")
1058{
1059 struct mgcp_trunk_config *trunk;
1060 struct mgcp_endpoint *endp;
1061 int endp_no, rc;
1062
1063 trunk = find_trunk(g_cfg, atoi(argv[0]));
1064 if (!trunk) {
1065 vty_out(vty, "%%Trunk %d not found in the config.%s",
1066 atoi(argv[0]), VTY_NEWLINE);
1067 return CMD_WARNING;
1068 }
1069
1070 if (!trunk->endpoints) {
1071 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1072 trunk->trunk_nr, VTY_NEWLINE);
1073 return CMD_WARNING;
1074 }
1075
1076 endp_no = strtoul(argv[1], NULL, 16);
1077 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1078 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1079 argv[1], endp_no, VTY_NEWLINE);
1080 return CMD_WARNING;
1081 }
1082
1083 endp = &trunk->endpoints[endp_no];
1084 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1085 if (rc < 0) {
1086 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1087 return CMD_WARNING;
1088 }
1089 return CMD_SUCCESS;
1090}
1091
1092DEFUN(reset_all_endp, reset_all_endp_cmd,
1093 "reset-all-endpoints",
1094 "Reset all endpoints\n")
1095{
1096 int rc;
1097
1098 rc = mgcp_send_reset_all(g_cfg);
1099 if (rc < 0) {
1100 vty_out(vty, "Error %d during endpoint reset.%s",
1101 rc, VTY_NEWLINE);
1102 return CMD_WARNING;
1103 }
1104 return CMD_SUCCESS;
1105}
1106
Holger Hans Peter Freythercc84c952014-06-03 13:36:42 +02001107#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001108DEFUN(cfg_mgcp_osmux,
1109 cfg_mgcp_osmux_cmd,
1110 "osmux (on|off)",
1111 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1112{
1113 if (strcmp(argv[0], "on") == 0) {
1114 g_cfg->osmux = 1;
1115 if (g_cfg->trunk.audio_loop) {
1116 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1117 VTY_NEWLINE);
1118 return CMD_WARNING;
1119 }
1120 } else if (strcmp(argv[0], "off") == 0)
1121 g_cfg->osmux = 0;
1122
1123 return CMD_SUCCESS;
1124}
1125
1126DEFUN(cfg_mgcp_osmux_batch_factor,
1127 cfg_mgcp_osmux_batch_factor_cmd,
Holger Hans Peter Freyther421365e2014-06-16 14:12:02 +02001128 "osmux batch-factor <1-16>",
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001129 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1130{
1131 g_cfg->osmux_batch = atoi(argv[0]);
1132 return CMD_SUCCESS;
1133}
Harald Welte6a857052012-01-27 00:41:39 +01001134
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001135int mgcp_vty_init(void)
1136{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001137 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001138 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001139 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001140 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001141 install_element(ENABLE_NODE, &reset_endp_cmd);
1142 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001143
1144 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1145 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001146
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001147 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001148 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1149 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1150 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1151 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1152 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1153 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001154 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001155 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001156 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1157 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001158 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1159 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001160 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001161 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck42a833e2014-04-14 10:31:47 +02001162 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1163 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001164 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1165 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1166 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001167 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001168 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001169 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001170 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001171 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001172 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1173 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001174 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1175 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001176 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1177 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001178 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1179 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001180 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1181 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1182 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1183 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1184 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001185 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001186 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1187 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001188 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1189 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001190
1191 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1192 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001193 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001194 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1195 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1196 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001197 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1198 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001199 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1200 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001201 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001202 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1203 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001204 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1205 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1206 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1207 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1208 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001209 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001210 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1211 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001212
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001213 return 0;
1214}
1215
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001216static int allocate_trunk(struct mgcp_trunk_config *trunk)
1217{
1218 int i;
1219 struct mgcp_config *cfg = trunk->cfg;
1220
1221 if (mgcp_endpoints_allocate(trunk) != 0) {
1222 LOGP(DMGCP, LOGL_ERROR,
1223 "Failed to allocate %d endpoints on trunk %d.\n",
1224 trunk->number_endpoints, trunk->trunk_nr);
1225 return -1;
1226 }
1227
1228 /* early bind */
1229 for (i = 1; i < trunk->number_endpoints; ++i) {
1230 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001231
1232 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001233 cfg->last_bts_port += 2;
1234 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1235 LOGP(DMGCP, LOGL_FATAL,
1236 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001237 return -1;
1238 }
1239 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1240 }
1241
1242 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001243 cfg->last_net_port += 2;
1244 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1245 LOGP(DMGCP, LOGL_FATAL,
1246 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001247 return -1;
1248 }
1249 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1250 }
1251
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001252 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1253 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001254 int rtp_port;
1255
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001256 /* network side */
1257 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1258 cfg->transcoder_ports.base_port);
1259 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1260 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1261 return -1;
1262 }
1263 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1264
1265 /* bts side */
1266 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1267 cfg->transcoder_ports.base_port);
1268 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1269 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1270 return -1;
1271 }
1272 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1273 }
1274 }
1275
1276 return 0;
1277}
1278
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001279int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1280 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001281{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001282 int rc;
1283 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001284
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001285 /* Default to 4 messages */
1286 cfg->osmux_batch = 4;
1287
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001288 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001289 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001290 if (rc < 0) {
1291 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1292 return rc;
1293 }
1294
1295
1296 if (!g_cfg->bts_ip)
1297 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1298
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001299 if (!g_cfg->source_addr) {
1300 fprintf(stderr, "You need to specify a bind address.\n");
1301 return -1;
1302 }
1303
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001304 /* initialize the last ports */
1305 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1306 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1307
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001308 if (allocate_trunk(&g_cfg->trunk) != 0) {
1309 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001310 return -1;
1311 }
1312
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001313 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1314 if (allocate_trunk(trunk) != 0) {
1315 LOGP(DMGCP, LOGL_ERROR,
1316 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1317 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001318 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001319 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001320 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001321
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001322 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001323}
1324