blob: b29eb6b4d1ae6477d41432faaca34d32e6297492 [file] [log] [blame]
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
2/* The protocol implementation */
3
4/*
Holger Hans Peter Freytherb30b3aa2014-07-04 20:23:56 +02005 * (C) 2009-2014 by Holger Hans Peter Freyther <zecke@selfish.org>
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +01006 * (C) 2009-2011 by On-Waves
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01007 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
Harald Welte0e3e88e2011-01-01 15:25:50 +010010 * it under the terms of the GNU Affero General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010012 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Harald Welte0e3e88e2011-01-01 15:25:50 +010017 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010018 *
Harald Welte0e3e88e2011-01-01 15:25:50 +010019 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010021 *
22 */
23
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010024
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +010025#include <osmocom/core/talloc.h>
Holger Hans Peter Freytherf41fb1f2010-02-26 20:16:37 +010026
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010027#include <openbsc/mgcp.h>
28#include <openbsc/mgcp_internal.h>
Harald Welte58ed1cb2010-05-14 18:59:17 +020029#include <openbsc/vty.h>
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010030
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020031#include <string.h>
32
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +020033#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
Jacob Erlbecke5546cd2013-12-03 14:43:34 +010034#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
Jacob Erlbecke64bb122013-12-19 18:53:07 +010035#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +020036
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010037static struct mgcp_config *g_cfg = NULL;
38
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010039static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010040{
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010041 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010042
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010043 if (nr == 0)
44 trunk = &cfg->trunk;
45 else
46 trunk = mgcp_trunk_num(cfg, nr);
47
48 return trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010049}
50
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010051/*
52 * vty code for mgcp below
53 */
54struct cmd_node mgcp_node = {
55 MGCP_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020056 "%s(config-mgcp)# ",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010057 1,
58};
59
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010060struct cmd_node trunk_node = {
61 TRUNK_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020062 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010063 1,
64};
65
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010066static int config_write_mgcp(struct vty *vty)
67{
68 vty_out(vty, "mgcp%s", VTY_NEWLINE);
69 if (g_cfg->local_ip)
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020070 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
71 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010072 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
73 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
74 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080075
76 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
77 vty_out(vty, " rtp bts-base %u%s", g_cfg->bts_ports.base_port, VTY_NEWLINE);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +080078 else
79 vty_out(vty, " rtp bts-range %u %u%s",
80 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
81
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080082 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
83 vty_out(vty, " rtp net-base %u%s", g_cfg->net_ports.base_port, VTY_NEWLINE);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +080084 else
85 vty_out(vty, " rtp net-range %u %u%s",
86 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
87
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +080088 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +010089 if (g_cfg->trunk.keepalive_interval == MGCP_KEEPALIVE_ONCE)
90 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
91 else if (g_cfg->trunk.keepalive_interval)
92 vty_out(vty, " rtp keep-alive %d%s",
93 g_cfg->trunk.keepalive_interval, VTY_NEWLINE);
94 else
95 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
96
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +020097 if (g_cfg->trunk.omit_rtcp)
98 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
99 else
100 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100101 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_aligned_timing) {
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100102 vty_out(vty, " %srtp-patch ssrc%s",
103 g_cfg->trunk.force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
104 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100105 g_cfg->trunk.force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100106 } else
107 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100108 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100109 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100110 g_cfg->trunk.audio_payload, VTY_NEWLINE);
111 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100112 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100113 g_cfg->trunk.audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200114 if (g_cfg->trunk.audio_fmtp_extra)
115 vty_out(vty, " sdp audio fmtp-extra %s%s",
116 g_cfg->trunk.audio_fmtp_extra, VTY_NEWLINE);
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100117 vty_out(vty, " %ssdp audio-payload send-ptime%s",
118 g_cfg->trunk.audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-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 Freyther19ff6792010-03-31 11:46:41 +0200121 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100122 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythercab38342010-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 Freyther6f38c062010-02-20 21:21:02 +0100125
Holger Hans Peter Freyther39f2f6d2010-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 Freytherb30b3aa2014-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 Freytherd582b202010-09-19 04:21:39 +0800133 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100134 vty_out(vty, " osmux %s%s",
135 g_cfg->osmux == 1 ? "on" : "off", VTY_NEWLINE);
Pablo Neira Ayusob84aea32014-08-29 15:24:00 +0200136 if (g_cfg->osmux) {
137 vty_out(vty, " osmux batch-factor %d%s",
138 g_cfg->osmux_batch, VTY_NEWLINE);
139 vty_out(vty, " osmux batch-size %u%s",
140 g_cfg->osmux_batch_size, VTY_NEWLINE);
141 vty_out(vty, " osmux port %u%s",
142 g_cfg->osmux_port, VTY_NEWLINE);
143 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100144 return CMD_SUCCESS;
145}
146
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200147static void dump_rtp_end(const char *end_name, struct vty *vty,
148 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
149{
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200150 struct mgcp_rtp_codec *codec = &end->codec;
151
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200152 vty_out(vty,
153 " %s%s"
154 " Timestamp Errs: %d->%d%s"
155 " Dropped Packets: %d%s"
156 " Payload Type: %d Rate: %u Channels: %d %s"
157 " Frame Duration: %u Frame Denominator: %u%s"
158 " FPP: %d Packet Duration: %u%s"
159 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
160 " Output-Enabled: %d Force-PTIME: %d%s",
161 end_name, VTY_NEWLINE,
162 state->in_stream.err_ts_counter,
163 state->out_stream.err_ts_counter, VTY_NEWLINE,
164 end->dropped_packets, VTY_NEWLINE,
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200165 codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
166 codec->frame_duration_num, codec->frame_duration_den, VTY_NEWLINE,
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200167 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200168 end->fmtp_extra, codec->audio_name, codec->subtype_name, VTY_NEWLINE,
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200169 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
170}
171
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100172static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100173{
174 int i;
175
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100176 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
177 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
178 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
179
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100180 if (!cfg->endpoints) {
181 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
182 return;
183 }
184
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100185 for (i = 1; i < cfg->number_endpoints; ++i) {
186 struct mgcp_endpoint *endp = &cfg->endpoints[i];
187 vty_out(vty,
188 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200189 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100190 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-08-05 01:34:51 +0800191 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
192 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
193 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200194 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100195 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200196 VTY_NEWLINE);
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100197
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200198 if (verbose && endp->allocated) {
199 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
200 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck8c1f4b02013-12-19 12:13:32 +0100201 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100202 }
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100203}
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100204
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100205DEFUN(show_mcgp, show_mgcp_cmd,
206 "show mgcp [stats]",
207 SHOW_STR
208 "Display information about the MGCP Media Gateway\n"
209 "Include Statistics\n")
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100210{
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100211 struct mgcp_trunk_config *trunk;
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100212 int show_stats = argc >= 1;
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100213
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100214 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100215
216 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100217 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100218
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100219 return CMD_SUCCESS;
220}
221
222DEFUN(cfg_mgcp,
223 cfg_mgcp_cmd,
224 "mgcp",
225 "Configure the MGCP")
226{
227 vty->node = MGCP_NODE;
228 return CMD_SUCCESS;
229}
230
231DEFUN(cfg_mgcp_local_ip,
232 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800233 "local ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100234 "Local options for the SDP record\n"
235 IP_STR
236 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100237{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200238 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100239 return CMD_SUCCESS;
240}
241
242DEFUN(cfg_mgcp_bts_ip,
243 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800244 "bts ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100245 "BTS Audio source/destination options\n"
246 IP_STR
247 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100248{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200249 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100250 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
251 return CMD_SUCCESS;
252}
253
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100254#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100255DEFUN(cfg_mgcp_bind_ip,
256 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800257 "bind ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100258 BIND_STR
259 IP_STR
260 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100261{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200262 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100263 return CMD_SUCCESS;
264}
265
266DEFUN(cfg_mgcp_bind_port,
267 cfg_mgcp_bind_port_cmd,
268 "bind port <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100269 BIND_STR
270 "Port information\n"
271 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100272{
273 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100274 g_cfg->source_port = port;
275 return CMD_SUCCESS;
276}
277
278DEFUN(cfg_mgcp_bind_early,
279 cfg_mgcp_bind_early_cmd,
280 "bind early (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100281 BIND_STR
282 "Bind local ports on start up\n"
283 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100284{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800285 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
286 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100287}
288
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800289static void parse_base(struct mgcp_port_range *range, const char **argv)
290{
291 unsigned int port = atoi(argv[0]);
292 range->mode = PORT_ALLOC_STATIC;
293 range->base_port = port;
294}
295
296static void parse_range(struct mgcp_port_range *range, const char **argv)
297{
298 range->mode = PORT_ALLOC_DYNAMIC;
299 range->range_start = atoi(argv[0]);
300 range->range_end = atoi(argv[1]);
301 range->last_port = g_cfg->bts_ports.range_start;
302}
303
304
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100305#define RTP_STR "RTP configuration\n"
306#define BTS_START_STR "First UDP port allocated for the BTS side\n"
307#define NET_START_STR "First UDP port allocated for the NET side\n"
308#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800309DEFUN(cfg_mgcp_rtp_bts_base_port,
310 cfg_mgcp_rtp_bts_base_port_cmd,
311 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100312 RTP_STR
313 BTS_START_STR
314 UDP_PORT_STR)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100315{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800316 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100317 return CMD_SUCCESS;
318}
319
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100320#define RANGE_START_STR "Start of the range of ports\n"
321#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800322DEFUN(cfg_mgcp_rtp_bts_range,
323 cfg_mgcp_rtp_bts_range_cmd,
324 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100325 RTP_STR "Range of ports to use for the BTS side\n"
326 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800327{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800328 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800329 return CMD_SUCCESS;
330}
331
332DEFUN(cfg_mgcp_rtp_net_range,
333 cfg_mgcp_rtp_net_range_cmd,
334 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100335 RTP_STR "Range of ports to use for the NET side\n"
336 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800337{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800338 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800339 return CMD_SUCCESS;
340}
341
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800342DEFUN(cfg_mgcp_rtp_net_base_port,
343 cfg_mgcp_rtp_net_base_port_cmd,
344 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100345 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800346{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800347 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800348 return CMD_SUCCESS;
349}
350
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800351ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100352 "rtp base <0-65534>",
353 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800354
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800355DEFUN(cfg_mgcp_rtp_transcoder_range,
356 cfg_mgcp_rtp_transcoder_range_cmd,
357 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100358 RTP_STR "Range of ports to use for the Transcoder\n"
359 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800360{
361 parse_range(&g_cfg->transcoder_ports, argv);
362 return CMD_SUCCESS;
363}
364
365DEFUN(cfg_mgcp_rtp_transcoder_base,
366 cfg_mgcp_rtp_transcoder_base_cmd,
367 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100368 RTP_STR "First UDP port allocated for the Transcoder side\n"
369 UDP_PORT_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800370{
371 parse_base(&g_cfg->transcoder_ports, argv);
372 return CMD_SUCCESS;
373}
374
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800375DEFUN(cfg_mgcp_rtp_ip_dscp,
376 cfg_mgcp_rtp_ip_dscp_cmd,
377 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100378 RTP_STR
379 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800380{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800381 int dscp = atoi(argv[0]);
382 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800383 return CMD_SUCCESS;
384}
385
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800386ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
387 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100388 RTP_STR
389 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800390
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200391#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
392DEFUN(cfg_mgcp_rtp_force_ptime,
393 cfg_mgcp_rtp_force_ptime_cmd,
394 "rtp force-ptime (10|20|40)",
395 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther7a4464e2014-07-04 20:11:11 +0200396 "The required ptime (packet duration) in ms\n"
397 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200398{
399 g_cfg->bts_force_ptime = atoi(argv[0]);
400 return CMD_SUCCESS;
401}
402
403DEFUN(cfg_mgcp_no_rtp_force_ptime,
404 cfg_mgcp_no_rtp_force_ptime_cmd,
405 "no rtp force-ptime",
406 NO_STR RTP_STR FORCE_PTIME_STR)
407{
408 g_cfg->bts_force_ptime = 0;
409 return CMD_SUCCESS;
410}
411
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200412DEFUN(cfg_mgcp_sdp_fmtp_extra,
413 cfg_mgcp_sdp_fmtp_extra_cmd,
414 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100415 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
416 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200417{
418 char *txt = argv_concat(argv, argc, 0);
419 if (!txt)
420 return CMD_WARNING;
421
422 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
423 talloc_free(txt);
424 return CMD_SUCCESS;
425}
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800426
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100427#define SDP_STR "SDP File related options\n"
428#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100429DEFUN(cfg_mgcp_sdp_payload_number,
430 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100431 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100432 SDP_STR AUDIO_STR
433 "Number\n" "Payload number\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100434{
435 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100436 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100437 return CMD_SUCCESS;
438}
439
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100440ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100441 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100442 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
443
444
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100445DEFUN(cfg_mgcp_sdp_payload_name,
446 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100447 "sdp audio-payload name NAME",
448 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100449{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100450 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100451 return CMD_SUCCESS;
452}
453
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100454ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
455 "sdp audio payload name NAME",
456 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
457
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100458DEFUN(cfg_mgcp_sdp_payload_send_ptime,
459 cfg_mgcp_sdp_payload_send_ptime_cmd,
460 "sdp audio-payload send-ptime",
461 SDP_STR AUDIO_STR
462 "Send SDP ptime (packet duration) attribute\n")
463{
464 g_cfg->trunk.audio_send_ptime = 1;
465 return CMD_SUCCESS;
466}
467
468DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
469 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
470 "no sdp audio-payload send-ptime",
471 NO_STR SDP_STR AUDIO_STR
472 "Send SDP ptime (packet duration) attribute\n")
473{
474 g_cfg->trunk.audio_send_ptime = 0;
475 return CMD_SUCCESS;
476}
477
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100478DEFUN(cfg_mgcp_loop,
479 cfg_mgcp_loop_cmd,
480 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100481 "Loop audio for all endpoints on main trunk\n"
482 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100483{
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100484 if (g_cfg->osmux) {
485 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
486 return CMD_WARNING;
487 }
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100488 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100489 return CMD_SUCCESS;
490}
491
492DEFUN(cfg_mgcp_number_endp,
493 cfg_mgcp_number_endp_cmd,
494 "number endpoints <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100495 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100496{
497 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100498 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100499 return CMD_SUCCESS;
500}
501
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200502DEFUN(cfg_mgcp_omit_rtcp,
503 cfg_mgcp_omit_rtcp_cmd,
504 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200505 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200506{
507 g_cfg->trunk.omit_rtcp = 1;
508 return CMD_SUCCESS;
509}
510
511DEFUN(cfg_mgcp_no_omit_rtcp,
512 cfg_mgcp_no_omit_rtcp_cmd,
513 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200514 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200515{
516 g_cfg->trunk.omit_rtcp = 0;
517 return CMD_SUCCESS;
518}
519
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100520DEFUN(cfg_mgcp_patch_rtp_ssrc,
521 cfg_mgcp_patch_rtp_ssrc_cmd,
522 "rtp-patch ssrc",
523 RTP_PATCH_STR
524 "Force a fixed SSRC\n"
525 )
526{
527 g_cfg->trunk.force_constant_ssrc = 1;
528 return CMD_SUCCESS;
529}
530
531DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
532 cfg_mgcp_no_patch_rtp_ssrc_cmd,
533 "no rtp-patch ssrc",
534 NO_STR RTP_PATCH_STR
535 "Force a fixed SSRC\n"
536 )
537{
538 g_cfg->trunk.force_constant_ssrc = 0;
539 return CMD_SUCCESS;
540}
541
542DEFUN(cfg_mgcp_patch_rtp_ts,
543 cfg_mgcp_patch_rtp_ts_cmd,
544 "rtp-patch timestamp",
545 RTP_PATCH_STR
546 "Adjust RTP timestamp\n"
547 )
548{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100549 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100550 return CMD_SUCCESS;
551}
552
553DEFUN(cfg_mgcp_no_patch_rtp_ts,
554 cfg_mgcp_no_patch_rtp_ts_cmd,
555 "no rtp-patch timestamp",
556 NO_STR RTP_PATCH_STR
557 "Adjust RTP timestamp\n"
558 )
559{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100560 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100561 return CMD_SUCCESS;
562}
563
564DEFUN(cfg_mgcp_no_patch_rtp,
565 cfg_mgcp_no_patch_rtp_cmd,
566 "no rtp-patch",
567 NO_STR RTP_PATCH_STR)
568{
569 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100570 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100571 return CMD_SUCCESS;
572}
573
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100574DEFUN(cfg_mgcp_rtp_keepalive,
575 cfg_mgcp_rtp_keepalive_cmd,
576 "rtp keep-alive <1-120>",
577 RTP_STR RTP_KEEPALIVE_STR
578 "Keep alive interval in secs\n"
579 )
580{
581 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
582 return CMD_SUCCESS;
583}
584
585DEFUN(cfg_mgcp_rtp_keepalive_once,
586 cfg_mgcp_rtp_keepalive_once_cmd,
587 "rtp keep-alive once",
588 RTP_STR RTP_KEEPALIVE_STR
589 "Send dummy packet only once after CRCX/MDCX\n"
590 )
591{
592 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
593 return CMD_SUCCESS;
594}
595
596DEFUN(cfg_mgcp_no_rtp_keepalive,
597 cfg_mgcp_no_rtp_keepalive_cmd,
598 "no rtp keep-alive",
599 NO_STR RTP_STR RTP_KEEPALIVE_STR
600 )
601{
602 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
603 return CMD_SUCCESS;
604}
605
606
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100607
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100608#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200609DEFUN(cfg_mgcp_agent_addr,
610 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100611 "call-agent ip A.B.C.D",
612 CALL_AGENT_STR IP_STR
613 "IPv4 Address of the callagent\n")
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200614{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200615 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200616 return CMD_SUCCESS;
617}
618
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100619ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
620 "call agent ip A.B.C.D",
621 CALL_AGENT_STR CALL_AGENT_STR IP_STR
622 "IPv4 Address of the callagent\n")
623
624
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800625DEFUN(cfg_mgcp_transcoder,
626 cfg_mgcp_transcoder_cmd,
627 "transcoder-mgw A.B.C.D",
628 "Use a MGW to detranscoder RTP\n"
629 "The IP address of the MGW")
630{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200631 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800632 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
633
634 return CMD_SUCCESS;
635}
636
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100637DEFUN(cfg_mgcp_no_transcoder,
638 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100639 "no transcoder-mgw",
640 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100641{
642 if (g_cfg->transcoder_ip) {
643 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
644 talloc_free(g_cfg->transcoder_ip);
645 g_cfg->transcoder_ip = NULL;
646 }
647
648 return CMD_SUCCESS;
649}
650
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800651DEFUN(cfg_mgcp_transcoder_remote_base,
652 cfg_mgcp_transcoder_remote_base_cmd,
653 "transcoder-remote-base <0-65534>",
654 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
655{
656 g_cfg->transcoder_remote_base = atoi(argv[0]);
657 return CMD_SUCCESS;
658}
659
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100660DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
661 "trunk <1-64>",
662 "Configure a SS7 trunk\n" "Trunk Nr\n")
663{
664 struct mgcp_trunk_config *trunk;
665 int index = atoi(argv[0]);
666
667 trunk = mgcp_trunk_num(g_cfg, index);
668 if (!trunk)
669 trunk = mgcp_trunk_alloc(g_cfg, index);
670
671 if (!trunk) {
672 vty_out(vty, "%%Unable to allocate trunk %u.%s",
673 index, VTY_NEWLINE);
674 return CMD_WARNING;
675 }
676
677 vty->node = TRUNK_NODE;
678 vty->index = trunk;
679 return CMD_SUCCESS;
680}
681
682static int config_write_trunk(struct vty *vty)
683{
684 struct mgcp_trunk_config *trunk;
685
686 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
687 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100688 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100689 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100690 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100691 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100692 vty_out(vty, " %ssdp audio-payload send-ptime%s",
693 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100694
695 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
696 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
697 else if (trunk->keepalive_interval)
698 vty_out(vty, " rtp keep-alive %d%s",
699 trunk->keepalive_interval, VTY_NEWLINE);
700 else
701 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
702
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100703 vty_out(vty, " loop %d%s",
704 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200705 if (trunk->omit_rtcp)
706 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
707 else
708 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100709 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100710 vty_out(vty, " %srtp-patch ssrc%s",
711 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
712 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100713 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100714 } else
715 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200716 if (trunk->audio_fmtp_extra)
717 vty_out(vty, " sdp audio fmtp-extra %s%s",
718 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100719 }
720
721 return CMD_SUCCESS;
722}
723
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200724DEFUN(cfg_trunk_sdp_fmtp_extra,
725 cfg_trunk_sdp_fmtp_extra_cmd,
726 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100727 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
728 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200729{
730 struct mgcp_trunk_config *trunk = vty->index;
731 char *txt = argv_concat(argv, argc, 0);
732 if (!txt)
733 return CMD_WARNING;
734
735 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
736 talloc_free(txt);
737 return CMD_SUCCESS;
738}
739
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100740DEFUN(cfg_trunk_payload_number,
741 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100742 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100743 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100744{
745 struct mgcp_trunk_config *trunk = vty->index;
746 unsigned int payload = atoi(argv[0]);
747
748 trunk->audio_payload = payload;
749 return CMD_SUCCESS;
750}
751
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100752ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100753 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100754 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
755
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100756DEFUN(cfg_trunk_payload_name,
757 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100758 "sdp audio-payload name NAME",
759 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100760{
761 struct mgcp_trunk_config *trunk = vty->index;
762
763 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
764 return CMD_SUCCESS;
765}
766
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100767ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
768 "sdp audio payload name NAME",
769 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
770
771
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100772DEFUN(cfg_trunk_loop,
773 cfg_trunk_loop_cmd,
774 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100775 "Loop audio for all endpoints on this trunk\n"
776 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100777{
778 struct mgcp_trunk_config *trunk = vty->index;
779
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100780 if (g_cfg->osmux) {
781 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
782 return CMD_WARNING;
783 }
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100784 trunk->audio_loop = atoi(argv[0]);
785 return CMD_SUCCESS;
786}
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800787
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100788DEFUN(cfg_trunk_sdp_payload_send_ptime,
789 cfg_trunk_sdp_payload_send_ptime_cmd,
790 "sdp audio-payload send-ptime",
791 SDP_STR AUDIO_STR
792 "Send SDP ptime (packet duration) attribute\n")
793{
794 struct mgcp_trunk_config *trunk = vty->index;
795 trunk->audio_send_ptime = 1;
796 return CMD_SUCCESS;
797}
798
799DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
800 cfg_trunk_no_sdp_payload_send_ptime_cmd,
801 "no sdp audio-payload send-ptime",
802 NO_STR SDP_STR AUDIO_STR
803 "Send SDP ptime (packet duration) attribute\n")
804{
805 struct mgcp_trunk_config *trunk = vty->index;
806 trunk->audio_send_ptime = 0;
807 return CMD_SUCCESS;
808}
809
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200810DEFUN(cfg_trunk_omit_rtcp,
811 cfg_trunk_omit_rtcp_cmd,
812 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200813 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200814{
815 struct mgcp_trunk_config *trunk = vty->index;
816 trunk->omit_rtcp = 1;
817 return CMD_SUCCESS;
818}
819
820DEFUN(cfg_trunk_no_omit_rtcp,
821 cfg_trunk_no_omit_rtcp_cmd,
822 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200823 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200824{
825 struct mgcp_trunk_config *trunk = vty->index;
826 trunk->omit_rtcp = 0;
827 return CMD_SUCCESS;
828}
829
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100830DEFUN(cfg_trunk_patch_rtp_ssrc,
831 cfg_trunk_patch_rtp_ssrc_cmd,
832 "rtp-patch ssrc",
833 RTP_PATCH_STR
834 "Force a fixed SSRC\n"
835 )
836{
837 struct mgcp_trunk_config *trunk = vty->index;
838 trunk->force_constant_ssrc = 1;
839 return CMD_SUCCESS;
840}
841
842DEFUN(cfg_trunk_no_patch_rtp_ssrc,
843 cfg_trunk_no_patch_rtp_ssrc_cmd,
844 "no rtp-patch ssrc",
845 NO_STR RTP_PATCH_STR
846 "Force a fixed SSRC\n"
847 )
848{
849 struct mgcp_trunk_config *trunk = vty->index;
850 trunk->force_constant_ssrc = 0;
851 return CMD_SUCCESS;
852}
853
854DEFUN(cfg_trunk_patch_rtp_ts,
855 cfg_trunk_patch_rtp_ts_cmd,
856 "rtp-patch timestamp",
857 RTP_PATCH_STR
858 "Adjust RTP timestamp\n"
859 )
860{
861 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100862 trunk->force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100863 return CMD_SUCCESS;
864}
865
866DEFUN(cfg_trunk_no_patch_rtp_ts,
867 cfg_trunk_no_patch_rtp_ts_cmd,
868 "no rtp-patch timestamp",
869 NO_STR RTP_PATCH_STR
870 "Adjust RTP timestamp\n"
871 )
872{
873 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100874 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100875 return CMD_SUCCESS;
876}
877
878DEFUN(cfg_trunk_no_patch_rtp,
879 cfg_trunk_no_patch_rtp_cmd,
880 "no rtp-patch",
881 NO_STR RTP_PATCH_STR)
882{
883 struct mgcp_trunk_config *trunk = vty->index;
884 trunk->force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100885 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100886 return CMD_SUCCESS;
887}
888
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100889DEFUN(cfg_trunk_rtp_keepalive,
890 cfg_trunk_rtp_keepalive_cmd,
891 "rtp keep-alive <1-120>",
892 RTP_STR RTP_KEEPALIVE_STR
893 "Keep-alive interval in secs\n"
894 )
895{
896 struct mgcp_trunk_config *trunk = vty->index;
897 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
898 return CMD_SUCCESS;
899}
900
901DEFUN(cfg_trunk_rtp_keepalive_once,
902 cfg_trunk_rtp_keepalive_once_cmd,
903 "rtp keep-alive once",
904 RTP_STR RTP_KEEPALIVE_STR
905 "Send dummy packet only once after CRCX/MDCX\n"
906 )
907{
908 struct mgcp_trunk_config *trunk = vty->index;
909 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
910 return CMD_SUCCESS;
911}
912
913DEFUN(cfg_trunk_no_rtp_keepalive,
914 cfg_trunk_no_rtp_keepalive_cmd,
915 "no rtp keep-alive",
916 NO_STR RTP_STR RTP_KEEPALIVE_STR
917 )
918{
919 struct mgcp_trunk_config *trunk = vty->index;
920 mgcp_trunk_set_keepalive(trunk, 0);
921 return CMD_SUCCESS;
922}
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100923
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800924DEFUN(loop_endp,
925 loop_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100926 "loop-endpoint <0-64> NAME (0|1)",
927 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +0800928 "The name in hex of the endpoint\n" "Disable the loop\n" "Enable the loop\n")
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800929{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100930 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800931 struct mgcp_endpoint *endp;
932
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100933 trunk = find_trunk(g_cfg, atoi(argv[0]));
934 if (!trunk) {
935 vty_out(vty, "%%Trunk %d not found in the config.%s",
936 atoi(argv[0]), VTY_NEWLINE);
937 return CMD_WARNING;
938 }
939
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100940 if (!trunk->endpoints) {
941 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
942 trunk->trunk_nr, VTY_NEWLINE);
943 return CMD_WARNING;
944 }
945
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100946 int endp_no = strtoul(argv[1], NULL, 16);
947 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800948 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100949 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800950 return CMD_WARNING;
951 }
952
953
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100954 endp = &trunk->endpoints[endp_no];
955 int loop = atoi(argv[2]);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800956
957 if (loop)
958 endp->conn_mode = MGCP_CONN_LOOPBACK;
959 else
960 endp->conn_mode = endp->orig_mode;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100961
962 /* Handle it like a MDCX, switch on SSRC patching if enabled */
963 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
964 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +0800965
966 return CMD_SUCCESS;
967}
968
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800969DEFUN(tap_call,
970 tap_call_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100971 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
972 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800973 "The endpoint in hex\n"
974 "Forward the data coming from the bts\n"
975 "Forward the data coming from the bts leaving to the network\n"
976 "Forward the data coming from the net\n"
977 "Forward the data coming from the net leaving to the bts\n"
978 "destination IP of the data\n" "destination port\n")
979{
980 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100981 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800982 struct mgcp_endpoint *endp;
983 int port = 0;
984
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100985 trunk = find_trunk(g_cfg, atoi(argv[0]));
986 if (!trunk) {
987 vty_out(vty, "%%Trunk %d not found in the config.%s",
988 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +0800989 return CMD_WARNING;
990 }
991
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +0100992 if (!trunk->endpoints) {
993 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
994 trunk->trunk_nr, VTY_NEWLINE);
995 return CMD_WARNING;
996 }
997
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +0100998 int endp_no = strtoul(argv[1], NULL, 16);
999 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1000 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1001 argv[1], endp_no, VTY_NEWLINE);
1002 return CMD_WARNING;
1003 }
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001004
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001005 endp = &trunk->endpoints[endp_no];
1006
1007 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001008 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001009 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001010 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001011 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001012 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001013 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001014 port = MGCP_TAP_NET_OUT;
1015 } else {
1016 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1017 return CMD_WARNING;
1018 }
1019
1020 tap = &endp->taps[port];
1021 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001022 inet_aton(argv[3], &tap->forward.sin_addr);
1023 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +08001024 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001025 return CMD_SUCCESS;
1026}
1027
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001028DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001029 "free-endpoint <0-64> NUMBER",
1030 "Free the given endpoint\n" "Trunk number\n"
1031 "Endpoint number in hex.\n")
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001032{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001033 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001034 struct mgcp_endpoint *endp;
1035
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001036 trunk = find_trunk(g_cfg, atoi(argv[0]));
1037 if (!trunk) {
1038 vty_out(vty, "%%Trunk %d not found in the config.%s",
1039 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001040 return CMD_WARNING;
1041 }
1042
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001043 if (!trunk->endpoints) {
1044 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1045 trunk->trunk_nr, VTY_NEWLINE);
1046 return CMD_WARNING;
1047 }
1048
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001049 int endp_no = strtoul(argv[1], NULL, 16);
1050 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1051 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1052 argv[1], endp_no, VTY_NEWLINE);
1053 return CMD_WARNING;
1054 }
1055
1056 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freytherbb8627a2014-07-22 15:00:52 +02001057 mgcp_release_endp(endp);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001058 return CMD_SUCCESS;
1059}
1060
Harald Welteba4f8b22012-01-27 00:41:39 +01001061DEFUN(reset_endp, reset_endp_cmd,
1062 "reset-endpoint <0-64> NUMBER",
1063 "Reset the given endpoint\n" "Trunk number\n"
1064 "Endpoint number in hex.\n")
1065{
1066 struct mgcp_trunk_config *trunk;
1067 struct mgcp_endpoint *endp;
1068 int endp_no, rc;
1069
1070 trunk = find_trunk(g_cfg, atoi(argv[0]));
1071 if (!trunk) {
1072 vty_out(vty, "%%Trunk %d not found in the config.%s",
1073 atoi(argv[0]), VTY_NEWLINE);
1074 return CMD_WARNING;
1075 }
1076
1077 if (!trunk->endpoints) {
1078 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1079 trunk->trunk_nr, VTY_NEWLINE);
1080 return CMD_WARNING;
1081 }
1082
1083 endp_no = strtoul(argv[1], NULL, 16);
1084 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1085 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1086 argv[1], endp_no, VTY_NEWLINE);
1087 return CMD_WARNING;
1088 }
1089
1090 endp = &trunk->endpoints[endp_no];
1091 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1092 if (rc < 0) {
1093 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1094 return CMD_WARNING;
1095 }
1096 return CMD_SUCCESS;
1097}
1098
1099DEFUN(reset_all_endp, reset_all_endp_cmd,
1100 "reset-all-endpoints",
1101 "Reset all endpoints\n")
1102{
1103 int rc;
1104
1105 rc = mgcp_send_reset_all(g_cfg);
1106 if (rc < 0) {
1107 vty_out(vty, "Error %d during endpoint reset.%s",
1108 rc, VTY_NEWLINE);
1109 return CMD_WARNING;
1110 }
1111 return CMD_SUCCESS;
1112}
1113
Holger Hans Peter Freytherea285e42014-06-03 13:36:42 +02001114#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001115DEFUN(cfg_mgcp_osmux,
1116 cfg_mgcp_osmux_cmd,
1117 "osmux (on|off)",
1118 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1119{
1120 if (strcmp(argv[0], "on") == 0) {
1121 g_cfg->osmux = 1;
1122 if (g_cfg->trunk.audio_loop) {
1123 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1124 VTY_NEWLINE);
1125 return CMD_WARNING;
1126 }
1127 } else if (strcmp(argv[0], "off") == 0)
1128 g_cfg->osmux = 0;
1129
1130 return CMD_SUCCESS;
1131}
1132
1133DEFUN(cfg_mgcp_osmux_batch_factor,
1134 cfg_mgcp_osmux_batch_factor_cmd,
Pablo Neira Ayuso9776fd02014-08-29 16:08:45 +02001135 "osmux batch-factor <1-8>",
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001136 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1137{
1138 g_cfg->osmux_batch = atoi(argv[0]);
1139 return CMD_SUCCESS;
1140}
Harald Welteba4f8b22012-01-27 00:41:39 +01001141
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001142DEFUN(cfg_mgcp_osmux_batch_size,
1143 cfg_mgcp_osmux_batch_size_cmd,
1144 "osmux batch-size <1-65535>",
1145 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1146{
1147 g_cfg->osmux_batch_size = atoi(argv[0]);
1148 return CMD_SUCCESS;
1149}
1150
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001151DEFUN(cfg_mgcp_osmux_port,
1152 cfg_mgcp_osmux_port_cmd,
1153 "osmux port <1-65535>",
1154 OSMUX_STR "port\n" "UDP port\n")
1155{
1156 g_cfg->osmux_port = atoi(argv[0]);
1157 return CMD_SUCCESS;
1158}
1159
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001160int mgcp_vty_init(void)
1161{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +08001162 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001163 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001164 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001165 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welteba4f8b22012-01-27 00:41:39 +01001166 install_element(ENABLE_NODE, &reset_endp_cmd);
1167 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001168
1169 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1170 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001171
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001172 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001173 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1174 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1175 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1176 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1177 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1178 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +08001179 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +08001180 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +08001181 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
1182 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +08001183 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1184 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +08001185 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +08001186 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck16491a92014-04-14 10:31:47 +02001187 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1188 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001189 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1190 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1191 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +02001192 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001193 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +08001194 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +01001195 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +08001196 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001197 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1198 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001199 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1200 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001201 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1202 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001203 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1204 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001205 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1206 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1207 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1208 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1209 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001210 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001211 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1212 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001213 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1214 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001215 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001216 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001217
1218 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1219 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001220 vty_install_default(TRUNK_NODE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001221 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1222 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1223 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001224 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1225 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001226 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1227 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001228 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001229 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1230 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001231 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1232 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1233 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1234 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1235 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001236 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001237 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1238 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001239
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001240 return 0;
1241}
1242
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001243static int allocate_trunk(struct mgcp_trunk_config *trunk)
1244{
1245 int i;
1246 struct mgcp_config *cfg = trunk->cfg;
1247
1248 if (mgcp_endpoints_allocate(trunk) != 0) {
1249 LOGP(DMGCP, LOGL_ERROR,
1250 "Failed to allocate %d endpoints on trunk %d.\n",
1251 trunk->number_endpoints, trunk->trunk_nr);
1252 return -1;
1253 }
1254
1255 /* early bind */
1256 for (i = 1; i < trunk->number_endpoints; ++i) {
1257 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001258
1259 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001260 cfg->last_bts_port += 2;
1261 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1262 LOGP(DMGCP, LOGL_FATAL,
1263 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001264 return -1;
1265 }
1266 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1267 }
1268
1269 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001270 cfg->last_net_port += 2;
1271 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1272 LOGP(DMGCP, LOGL_FATAL,
1273 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001274 return -1;
1275 }
1276 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1277 }
1278
Holger Hans Peter Freyther1b8eaf42011-02-28 14:51:48 +01001279 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1280 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001281 int rtp_port;
1282
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001283 /* network side */
1284 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1285 cfg->transcoder_ports.base_port);
1286 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1287 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1288 return -1;
1289 }
1290 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1291
1292 /* bts side */
1293 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1294 cfg->transcoder_ports.base_port);
1295 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1296 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1297 return -1;
1298 }
1299 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1300 }
1301 }
1302
1303 return 0;
1304}
1305
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001306int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1307 enum mgcp_role role)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001308{
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001309 int rc;
1310 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001311
Pablo Neira Ayusofa422c52014-08-29 12:20:17 +02001312 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001313 cfg->osmux_batch = 4;
Pablo Neira Ayusoefb34f62014-08-29 15:31:55 +02001314 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001315
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001316 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +02001317 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001318 if (rc < 0) {
1319 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1320 return rc;
1321 }
1322
1323
1324 if (!g_cfg->bts_ip)
1325 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1326
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +02001327 if (!g_cfg->source_addr) {
1328 fprintf(stderr, "You need to specify a bind address.\n");
1329 return -1;
1330 }
1331
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001332 /* initialize the last ports */
1333 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1334 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1335
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001336 if (allocate_trunk(&g_cfg->trunk) != 0) {
1337 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001338 return -1;
1339 }
1340
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001341 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1342 if (allocate_trunk(trunk) != 0) {
1343 LOGP(DMGCP, LOGL_ERROR,
1344 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1345 return -1;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +08001346 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001347 }
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001348 cfg->role = role;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001349
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +08001350 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001351}
1352