blob: 51889d9a4e70bb3282be54f088a4d30035e37b33 [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);
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +020081 if (g_cfg->bts_ports.bind_addr)
82 vty_out(vty, " rtp bts-bind-ip %s%s", g_cfg->bts_ports.bind_addr, VTY_NEWLINE);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +080083
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080084 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
85 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 +080086 else
87 vty_out(vty, " rtp net-range %u %u%s",
88 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +020089 if (g_cfg->net_ports.bind_addr)
90 vty_out(vty, " rtp net-bind-ip %s%s", g_cfg->net_ports.bind_addr, VTY_NEWLINE);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +080091
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +080092 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +010093 if (g_cfg->trunk.keepalive_interval == MGCP_KEEPALIVE_ONCE)
94 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
95 else if (g_cfg->trunk.keepalive_interval)
96 vty_out(vty, " rtp keep-alive %d%s",
97 g_cfg->trunk.keepalive_interval, VTY_NEWLINE);
98 else
99 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
100
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200101 if (g_cfg->trunk.omit_rtcp)
102 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
103 else
104 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100105 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100106 vty_out(vty, " %srtp-patch ssrc%s",
107 g_cfg->trunk.force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
108 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100109 g_cfg->trunk.force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100110 } else
111 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100112 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100113 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100114 g_cfg->trunk.audio_payload, VTY_NEWLINE);
115 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100116 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100117 g_cfg->trunk.audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200118 if (g_cfg->trunk.audio_fmtp_extra)
119 vty_out(vty, " sdp audio fmtp-extra %s%s",
120 g_cfg->trunk.audio_fmtp_extra, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100121 vty_out(vty, " %ssdp audio-payload send-ptime%s",
122 g_cfg->trunk.audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100123 vty_out(vty, " %ssdp audio-payload send-name%s",
124 g_cfg->trunk.audio_send_name ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100125 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
126 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -0400127 vty_out(vty, " %sallow-transcoding%s",
128 g_cfg->trunk.no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200129 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100130 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800131 if (g_cfg->transcoder_ip)
132 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100133
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800134 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
135 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
136 else
137 vty_out(vty, " rtp transcoder-range %u %u%s",
138 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freyther8d998a72014-07-04 20:23:56 +0200139 if (g_cfg->bts_force_ptime > 0)
140 vty_out(vty, " rtp force-ptime %d%s", g_cfg->bts_force_ptime, VTY_NEWLINE);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800141 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther6598ded2015-10-02 17:38:27 +0200142
143 switch (g_cfg->osmux) {
144 case OSMUX_USAGE_ON:
145 vty_out(vty, " osmux on%s", VTY_NEWLINE);
146 break;
147 case OSMUX_USAGE_ONLY:
148 vty_out(vty, " osmux only%s", VTY_NEWLINE);
149 break;
150 case OSMUX_USAGE_OFF:
151 default:
152 vty_out(vty, " osmux off%s", VTY_NEWLINE);
153 break;
154 }
Pablo Neira Ayusofcec6d82014-08-29 15:24:00 +0200155 if (g_cfg->osmux) {
Holger Hans Peter Freythera777c9e2015-10-12 20:06:16 +0200156 vty_out(vty, " osmux bind-ip %s%s",
157 g_cfg->osmux_addr, VTY_NEWLINE);
Pablo Neira Ayusofcec6d82014-08-29 15:24:00 +0200158 vty_out(vty, " osmux batch-factor %d%s",
159 g_cfg->osmux_batch, VTY_NEWLINE);
160 vty_out(vty, " osmux batch-size %u%s",
161 g_cfg->osmux_batch_size, VTY_NEWLINE);
162 vty_out(vty, " osmux port %u%s",
163 g_cfg->osmux_port, VTY_NEWLINE);
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +0200164 vty_out(vty, " osmux dummy %s%s",
165 g_cfg->osmux_dummy ? "on" : "off", VTY_NEWLINE);
Pablo Neira Ayusofcec6d82014-08-29 15:24:00 +0200166 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100167 return CMD_SUCCESS;
168}
169
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200170static void dump_rtp_end(const char *end_name, struct vty *vty,
171 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
172{
Holger Hans Peter Freythercac24382014-09-01 10:35:55 +0200173 struct mgcp_rtp_codec *codec = &end->codec;
174
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200175 vty_out(vty,
176 " %s%s"
177 " Timestamp Errs: %d->%d%s"
178 " Dropped Packets: %d%s"
179 " Payload Type: %d Rate: %u Channels: %d %s"
180 " Frame Duration: %u Frame Denominator: %u%s"
181 " FPP: %d Packet Duration: %u%s"
182 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
183 " Output-Enabled: %d Force-PTIME: %d%s",
184 end_name, VTY_NEWLINE,
185 state->in_stream.err_ts_counter,
186 state->out_stream.err_ts_counter, VTY_NEWLINE,
187 end->dropped_packets, VTY_NEWLINE,
Holger Hans Peter Freythercac24382014-09-01 10:35:55 +0200188 codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
189 codec->frame_duration_num, codec->frame_duration_den, VTY_NEWLINE,
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200190 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
Holger Hans Peter Freythercac24382014-09-01 10:35:55 +0200191 end->fmtp_extra, codec->audio_name, codec->subtype_name, VTY_NEWLINE,
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200192 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
193}
194
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100195static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100196{
197 int i;
198
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100199 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
200 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
201 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
202
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100203 if (!cfg->endpoints) {
204 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
205 return;
206 }
207
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100208 for (i = 1; i < cfg->number_endpoints; ++i) {
209 struct mgcp_endpoint *endp = &cfg->endpoints[i];
210 vty_out(vty,
211 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200212 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100213 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800214 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
215 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
216 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200217 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100218 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200219 VTY_NEWLINE);
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100220
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200221 if (verbose && endp->allocated) {
222 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
223 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100224 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100225 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100226}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100227
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100228DEFUN(show_mcgp, show_mgcp_cmd,
229 "show mgcp [stats]",
230 SHOW_STR
231 "Display information about the MGCP Media Gateway\n"
232 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100233{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100234 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100235 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100236
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100237 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100238
239 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100240 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100241
Holger Hans Peter Freyther15a40db2015-10-02 16:25:21 +0200242 if (g_cfg->osmux)
243 vty_out(vty, "Osmux used CID: %d%s", osmux_used_cid(), VTY_NEWLINE);
244
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100245 return CMD_SUCCESS;
246}
247
248DEFUN(cfg_mgcp,
249 cfg_mgcp_cmd,
250 "mgcp",
251 "Configure the MGCP")
252{
253 vty->node = MGCP_NODE;
254 return CMD_SUCCESS;
255}
256
257DEFUN(cfg_mgcp_local_ip,
258 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800259 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100260 "Local options for the SDP record\n"
261 IP_STR
262 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100263{
Harald Welte4a824ca2017-05-29 13:54:27 +0200264 osmo_talloc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100265 return CMD_SUCCESS;
266}
267
268DEFUN(cfg_mgcp_bts_ip,
269 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800270 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100271 "BTS Audio source/destination options\n"
272 IP_STR
273 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100274{
Harald Welte4a824ca2017-05-29 13:54:27 +0200275 osmo_talloc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100276 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
277 return CMD_SUCCESS;
278}
279
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100280#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100281DEFUN(cfg_mgcp_bind_ip,
282 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800283 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100284 BIND_STR
285 IP_STR
286 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100287{
Harald Welte4a824ca2017-05-29 13:54:27 +0200288 osmo_talloc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100289 return CMD_SUCCESS;
290}
291
292DEFUN(cfg_mgcp_bind_port,
293 cfg_mgcp_bind_port_cmd,
294 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100295 BIND_STR
296 "Port information\n"
297 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100298{
299 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100300 g_cfg->source_port = port;
301 return CMD_SUCCESS;
302}
303
304DEFUN(cfg_mgcp_bind_early,
305 cfg_mgcp_bind_early_cmd,
306 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100307 BIND_STR
308 "Bind local ports on start up\n"
309 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100310{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800311 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
312 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100313}
314
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800315static void parse_base(struct mgcp_port_range *range, const char **argv)
316{
317 unsigned int port = atoi(argv[0]);
318 range->mode = PORT_ALLOC_STATIC;
319 range->base_port = port;
320}
321
322static void parse_range(struct mgcp_port_range *range, const char **argv)
323{
324 range->mode = PORT_ALLOC_DYNAMIC;
325 range->range_start = atoi(argv[0]);
326 range->range_end = atoi(argv[1]);
327 range->last_port = g_cfg->bts_ports.range_start;
328}
329
330
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100331#define RTP_STR "RTP configuration\n"
332#define BTS_START_STR "First UDP port allocated for the BTS side\n"
333#define NET_START_STR "First UDP port allocated for the NET side\n"
334#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800335DEFUN(cfg_mgcp_rtp_bts_base_port,
336 cfg_mgcp_rtp_bts_base_port_cmd,
337 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100338 RTP_STR
339 BTS_START_STR
340 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100341{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800342 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100343 return CMD_SUCCESS;
344}
345
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100346#define RANGE_START_STR "Start of the range of ports\n"
347#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800348DEFUN(cfg_mgcp_rtp_bts_range,
349 cfg_mgcp_rtp_bts_range_cmd,
350 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100351 RTP_STR "Range of ports to use for the BTS side\n"
352 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800353{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800354 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800355 return CMD_SUCCESS;
356}
357
358DEFUN(cfg_mgcp_rtp_net_range,
359 cfg_mgcp_rtp_net_range_cmd,
360 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100361 RTP_STR "Range of ports to use for the NET side\n"
362 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800363{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800364 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800365 return CMD_SUCCESS;
366}
367
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800368DEFUN(cfg_mgcp_rtp_net_base_port,
369 cfg_mgcp_rtp_net_base_port_cmd,
370 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100371 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800372{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800373 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800374 return CMD_SUCCESS;
375}
376
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800377ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100378 "rtp base <0-65534>",
379 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800380
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800381DEFUN(cfg_mgcp_rtp_transcoder_range,
382 cfg_mgcp_rtp_transcoder_range_cmd,
383 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100384 RTP_STR "Range of ports to use for the Transcoder\n"
385 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800386{
387 parse_range(&g_cfg->transcoder_ports, argv);
388 return CMD_SUCCESS;
389}
390
391DEFUN(cfg_mgcp_rtp_transcoder_base,
392 cfg_mgcp_rtp_transcoder_base_cmd,
393 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100394 RTP_STR "First UDP port allocated for the Transcoder side\n"
395 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800396{
397 parse_base(&g_cfg->transcoder_ports, argv);
398 return CMD_SUCCESS;
399}
400
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +0200401DEFUN(cfg_mgcp_rtp_bts_bind_ip,
402 cfg_mgcp_rtp_bts_bind_ip_cmd,
403 "rtp bts-bind-ip A.B.C.D",
404 RTP_STR "Bind endpoints facing the BTS\n" "Address to bind to\n")
405{
Harald Welte4a824ca2017-05-29 13:54:27 +0200406 osmo_talloc_replace_string(g_cfg, &g_cfg->bts_ports.bind_addr, argv[0]);
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +0200407 return CMD_SUCCESS;
408}
409
410DEFUN(cfg_mgcp_rtp_no_bts_bind_ip,
411 cfg_mgcp_rtp_no_bts_bind_ip_cmd,
412 "no rtp bts-bind-ip",
413 NO_STR RTP_STR "Bind endpoints facing the BTS\n" "Address to bind to\n")
414{
415 talloc_free(g_cfg->bts_ports.bind_addr);
416 g_cfg->bts_ports.bind_addr = NULL;
417 return CMD_SUCCESS;
418}
419
420DEFUN(cfg_mgcp_rtp_net_bind_ip,
421 cfg_mgcp_rtp_net_bind_ip_cmd,
422 "rtp net-bind-ip A.B.C.D",
423 RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
424{
Harald Welte4a824ca2017-05-29 13:54:27 +0200425 osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr, argv[0]);
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +0200426 return CMD_SUCCESS;
427}
428
429DEFUN(cfg_mgcp_rtp_no_net_bind_ip,
430 cfg_mgcp_rtp_no_net_bind_ip_cmd,
431 "no rtp net-bind-ip",
432 NO_STR RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
433{
434 talloc_free(g_cfg->net_ports.bind_addr);
435 g_cfg->net_ports.bind_addr = NULL;
436 return CMD_SUCCESS;
437}
438
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800439DEFUN(cfg_mgcp_rtp_ip_dscp,
440 cfg_mgcp_rtp_ip_dscp_cmd,
441 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100442 RTP_STR
Holger Hans Peter Freyther9be675e2015-01-21 11:39:47 +0100443 "Apply IP_TOS to the audio stream (including Osmux)\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800444{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800445 int dscp = atoi(argv[0]);
446 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800447 return CMD_SUCCESS;
448}
449
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800450ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
451 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100452 RTP_STR
453 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800454
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200455#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
456DEFUN(cfg_mgcp_rtp_force_ptime,
457 cfg_mgcp_rtp_force_ptime_cmd,
458 "rtp force-ptime (10|20|40)",
459 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther29474112014-07-04 20:11:11 +0200460 "The required ptime (packet duration) in ms\n"
461 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200462{
463 g_cfg->bts_force_ptime = atoi(argv[0]);
464 return CMD_SUCCESS;
465}
466
467DEFUN(cfg_mgcp_no_rtp_force_ptime,
468 cfg_mgcp_no_rtp_force_ptime_cmd,
469 "no rtp force-ptime",
470 NO_STR RTP_STR FORCE_PTIME_STR)
471{
472 g_cfg->bts_force_ptime = 0;
473 return CMD_SUCCESS;
474}
475
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200476DEFUN(cfg_mgcp_sdp_fmtp_extra,
477 cfg_mgcp_sdp_fmtp_extra_cmd,
478 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100479 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
480 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200481{
482 char *txt = argv_concat(argv, argc, 0);
483 if (!txt)
484 return CMD_WARNING;
485
Harald Welte4a824ca2017-05-29 13:54:27 +0200486 osmo_talloc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200487 talloc_free(txt);
488 return CMD_SUCCESS;
489}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800490
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -0400491DEFUN(cfg_mgcp_allow_transcoding,
492 cfg_mgcp_allow_transcoding_cmd,
493 "allow-transcoding",
494 "Allow transcoding\n")
495{
496 g_cfg->trunk.no_audio_transcoding = 0;
497 return CMD_SUCCESS;
498}
499
500DEFUN(cfg_mgcp_no_allow_transcoding,
501 cfg_mgcp_no_allow_transcoding_cmd,
502 "no allow-transcoding",
503 NO_STR "Allow transcoding\n")
504{
505 g_cfg->trunk.no_audio_transcoding = 1;
506 return CMD_SUCCESS;
507}
508
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100509#define SDP_STR "SDP File related options\n"
510#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100511DEFUN(cfg_mgcp_sdp_payload_number,
512 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100513 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100514 SDP_STR AUDIO_STR
515 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100516{
517 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100518 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100519 return CMD_SUCCESS;
520}
521
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100522ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100523 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100524 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
525
526
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100527DEFUN(cfg_mgcp_sdp_payload_name,
528 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100529 "sdp audio-payload name NAME",
530 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100531{
Harald Welte4a824ca2017-05-29 13:54:27 +0200532 osmo_talloc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100533 return CMD_SUCCESS;
534}
535
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100536ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
537 "sdp audio payload name NAME",
538 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
539
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100540DEFUN(cfg_mgcp_sdp_payload_send_ptime,
541 cfg_mgcp_sdp_payload_send_ptime_cmd,
542 "sdp audio-payload send-ptime",
543 SDP_STR AUDIO_STR
544 "Send SDP ptime (packet duration) attribute\n")
545{
546 g_cfg->trunk.audio_send_ptime = 1;
547 return CMD_SUCCESS;
548}
549
550DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
551 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
552 "no sdp audio-payload send-ptime",
553 NO_STR SDP_STR AUDIO_STR
554 "Send SDP ptime (packet duration) attribute\n")
555{
556 g_cfg->trunk.audio_send_ptime = 0;
557 return CMD_SUCCESS;
558}
559
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100560DEFUN(cfg_mgcp_sdp_payload_send_name,
561 cfg_mgcp_sdp_payload_send_name_cmd,
562 "sdp audio-payload send-name",
563 SDP_STR AUDIO_STR
564 "Send SDP rtpmap with the audio name\n")
565{
566 g_cfg->trunk.audio_send_name = 1;
567 return CMD_SUCCESS;
568}
569
570DEFUN(cfg_mgcp_no_sdp_payload_send_name,
571 cfg_mgcp_no_sdp_payload_send_name_cmd,
572 "no sdp audio-payload send-name",
573 NO_STR SDP_STR AUDIO_STR
574 "Send SDP rtpmap with the audio name\n")
575{
576 g_cfg->trunk.audio_send_name = 0;
577 return CMD_SUCCESS;
578}
579
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100580DEFUN(cfg_mgcp_loop,
581 cfg_mgcp_loop_cmd,
582 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100583 "Loop audio for all endpoints on main trunk\n"
584 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100585{
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100586 if (g_cfg->osmux) {
587 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
588 return CMD_WARNING;
589 }
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100590 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100591 return CMD_SUCCESS;
592}
593
Philipp Maierdd9f6cd2017-08-08 12:04:30 +0200594DEFUN(cfg_mgcp_force_realloc,
595 cfg_mgcp_force_realloc_cmd,
596 "force-realloc (0|1)",
597 "Force endpoint reallocation when the endpoint is still seized\n"
598 "Don't force reallocation\n" "force reallocation\n")
599{
600 g_cfg->trunk.force_realloc = atoi(argv[0]);
601 return CMD_SUCCESS;
602}
603
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100604DEFUN(cfg_mgcp_number_endp,
605 cfg_mgcp_number_endp_cmd,
606 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100607 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100608{
609 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100610 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100611 return CMD_SUCCESS;
612}
613
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200614DEFUN(cfg_mgcp_omit_rtcp,
615 cfg_mgcp_omit_rtcp_cmd,
616 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200617 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200618{
619 g_cfg->trunk.omit_rtcp = 1;
620 return CMD_SUCCESS;
621}
622
623DEFUN(cfg_mgcp_no_omit_rtcp,
624 cfg_mgcp_no_omit_rtcp_cmd,
625 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200626 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200627{
628 g_cfg->trunk.omit_rtcp = 0;
629 return CMD_SUCCESS;
630}
631
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100632DEFUN(cfg_mgcp_patch_rtp_ssrc,
633 cfg_mgcp_patch_rtp_ssrc_cmd,
634 "rtp-patch ssrc",
635 RTP_PATCH_STR
636 "Force a fixed SSRC\n"
637 )
638{
639 g_cfg->trunk.force_constant_ssrc = 1;
640 return CMD_SUCCESS;
641}
642
643DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
644 cfg_mgcp_no_patch_rtp_ssrc_cmd,
645 "no rtp-patch ssrc",
646 NO_STR RTP_PATCH_STR
647 "Force a fixed SSRC\n"
648 )
649{
650 g_cfg->trunk.force_constant_ssrc = 0;
651 return CMD_SUCCESS;
652}
653
654DEFUN(cfg_mgcp_patch_rtp_ts,
655 cfg_mgcp_patch_rtp_ts_cmd,
656 "rtp-patch timestamp",
657 RTP_PATCH_STR
658 "Adjust RTP timestamp\n"
659 )
660{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100661 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100662 return CMD_SUCCESS;
663}
664
665DEFUN(cfg_mgcp_no_patch_rtp_ts,
666 cfg_mgcp_no_patch_rtp_ts_cmd,
667 "no rtp-patch timestamp",
668 NO_STR RTP_PATCH_STR
669 "Adjust RTP timestamp\n"
670 )
671{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100672 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100673 return CMD_SUCCESS;
674}
675
676DEFUN(cfg_mgcp_no_patch_rtp,
677 cfg_mgcp_no_patch_rtp_cmd,
678 "no rtp-patch",
679 NO_STR RTP_PATCH_STR)
680{
681 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100682 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100683 return CMD_SUCCESS;
684}
685
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100686DEFUN(cfg_mgcp_rtp_keepalive,
687 cfg_mgcp_rtp_keepalive_cmd,
688 "rtp keep-alive <1-120>",
689 RTP_STR RTP_KEEPALIVE_STR
690 "Keep alive interval in secs\n"
691 )
692{
693 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
694 return CMD_SUCCESS;
695}
696
697DEFUN(cfg_mgcp_rtp_keepalive_once,
698 cfg_mgcp_rtp_keepalive_once_cmd,
699 "rtp keep-alive once",
700 RTP_STR RTP_KEEPALIVE_STR
701 "Send dummy packet only once after CRCX/MDCX\n"
702 )
703{
704 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
705 return CMD_SUCCESS;
706}
707
708DEFUN(cfg_mgcp_no_rtp_keepalive,
709 cfg_mgcp_no_rtp_keepalive_cmd,
710 "no rtp keep-alive",
711 NO_STR RTP_STR RTP_KEEPALIVE_STR
712 )
713{
714 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
715 return CMD_SUCCESS;
716}
717
718
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100719
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100720#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200721DEFUN(cfg_mgcp_agent_addr,
722 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100723 "call-agent ip A.B.C.D",
724 CALL_AGENT_STR IP_STR
725 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200726{
Harald Welte4a824ca2017-05-29 13:54:27 +0200727 osmo_talloc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200728 return CMD_SUCCESS;
729}
730
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100731ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
732 "call agent ip A.B.C.D",
733 CALL_AGENT_STR CALL_AGENT_STR IP_STR
734 "IPv4 Address of the callagent\n")
735
736
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800737DEFUN(cfg_mgcp_transcoder,
738 cfg_mgcp_transcoder_cmd,
739 "transcoder-mgw A.B.C.D",
740 "Use a MGW to detranscoder RTP\n"
741 "The IP address of the MGW")
742{
Harald Welte4a824ca2017-05-29 13:54:27 +0200743 osmo_talloc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800744 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
745
746 return CMD_SUCCESS;
747}
748
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100749DEFUN(cfg_mgcp_no_transcoder,
750 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100751 "no transcoder-mgw",
752 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100753{
754 if (g_cfg->transcoder_ip) {
755 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
756 talloc_free(g_cfg->transcoder_ip);
757 g_cfg->transcoder_ip = NULL;
758 }
759
760 return CMD_SUCCESS;
761}
762
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800763DEFUN(cfg_mgcp_transcoder_remote_base,
764 cfg_mgcp_transcoder_remote_base_cmd,
765 "transcoder-remote-base <0-65534>",
766 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
767{
768 g_cfg->transcoder_remote_base = atoi(argv[0]);
769 return CMD_SUCCESS;
770}
771
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100772DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
773 "trunk <1-64>",
774 "Configure a SS7 trunk\n" "Trunk Nr\n")
775{
776 struct mgcp_trunk_config *trunk;
777 int index = atoi(argv[0]);
778
779 trunk = mgcp_trunk_num(g_cfg, index);
780 if (!trunk)
781 trunk = mgcp_trunk_alloc(g_cfg, index);
782
783 if (!trunk) {
784 vty_out(vty, "%%Unable to allocate trunk %u.%s",
785 index, VTY_NEWLINE);
786 return CMD_WARNING;
787 }
788
789 vty->node = TRUNK_NODE;
790 vty->index = trunk;
791 return CMD_SUCCESS;
792}
793
794static int config_write_trunk(struct vty *vty)
795{
796 struct mgcp_trunk_config *trunk;
797
798 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
799 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100800 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100801 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100802 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100803 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100804 vty_out(vty, " %ssdp audio-payload send-ptime%s",
805 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100806 vty_out(vty, " %ssdp audio-payload send-name%s",
807 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100808
809 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
810 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
811 else if (trunk->keepalive_interval)
812 vty_out(vty, " rtp keep-alive %d%s",
813 trunk->keepalive_interval, VTY_NEWLINE);
814 else
815 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100816 vty_out(vty, " loop %d%s",
817 trunk->audio_loop, VTY_NEWLINE);
Philipp Maierdd9f6cd2017-08-08 12:04:30 +0200818 vty_out(vty, " force-realloc %d%s",
819 trunk->force_realloc, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200820 if (trunk->omit_rtcp)
821 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
822 else
823 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100824 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100825 vty_out(vty, " %srtp-patch ssrc%s",
826 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
827 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100828 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100829 } else
830 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200831 if (trunk->audio_fmtp_extra)
832 vty_out(vty, " sdp audio fmtp-extra %s%s",
833 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -0400834 vty_out(vty, " %sallow-transcoding%s",
835 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100836 }
837
838 return CMD_SUCCESS;
839}
840
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200841DEFUN(cfg_trunk_sdp_fmtp_extra,
842 cfg_trunk_sdp_fmtp_extra_cmd,
843 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100844 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
845 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200846{
847 struct mgcp_trunk_config *trunk = vty->index;
848 char *txt = argv_concat(argv, argc, 0);
849 if (!txt)
850 return CMD_WARNING;
851
Harald Welte4a824ca2017-05-29 13:54:27 +0200852 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200853 talloc_free(txt);
854 return CMD_SUCCESS;
855}
856
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100857DEFUN(cfg_trunk_payload_number,
858 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100859 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100860 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100861{
862 struct mgcp_trunk_config *trunk = vty->index;
863 unsigned int payload = atoi(argv[0]);
864
865 trunk->audio_payload = payload;
866 return CMD_SUCCESS;
867}
868
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100869ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100870 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100871 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
872
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100873DEFUN(cfg_trunk_payload_name,
874 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100875 "sdp audio-payload name NAME",
876 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100877{
878 struct mgcp_trunk_config *trunk = vty->index;
879
Harald Welte4a824ca2017-05-29 13:54:27 +0200880 osmo_talloc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100881 return CMD_SUCCESS;
882}
883
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100884ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
885 "sdp audio payload name NAME",
886 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
887
888
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100889DEFUN(cfg_trunk_loop,
890 cfg_trunk_loop_cmd,
891 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100892 "Loop audio for all endpoints on this trunk\n"
893 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100894{
895 struct mgcp_trunk_config *trunk = vty->index;
896
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100897 if (g_cfg->osmux) {
898 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
899 return CMD_WARNING;
900 }
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100901 trunk->audio_loop = atoi(argv[0]);
902 return CMD_SUCCESS;
903}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800904
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100905DEFUN(cfg_trunk_sdp_payload_send_ptime,
906 cfg_trunk_sdp_payload_send_ptime_cmd,
907 "sdp audio-payload send-ptime",
908 SDP_STR AUDIO_STR
909 "Send SDP ptime (packet duration) attribute\n")
910{
911 struct mgcp_trunk_config *trunk = vty->index;
912 trunk->audio_send_ptime = 1;
913 return CMD_SUCCESS;
914}
915
916DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
917 cfg_trunk_no_sdp_payload_send_ptime_cmd,
918 "no sdp audio-payload send-ptime",
919 NO_STR SDP_STR AUDIO_STR
920 "Send SDP ptime (packet duration) attribute\n")
921{
922 struct mgcp_trunk_config *trunk = vty->index;
923 trunk->audio_send_ptime = 0;
924 return CMD_SUCCESS;
925}
926
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100927DEFUN(cfg_trunk_sdp_payload_send_name,
928 cfg_trunk_sdp_payload_send_name_cmd,
929 "sdp audio-payload send-name",
930 SDP_STR AUDIO_STR
931 "Send SDP rtpmap with the audio name\n")
932{
933 struct mgcp_trunk_config *trunk = vty->index;
934 trunk->audio_send_name = 1;
935 return CMD_SUCCESS;
936}
937
938DEFUN(cfg_trunk_no_sdp_payload_send_name,
939 cfg_trunk_no_sdp_payload_send_name_cmd,
940 "no sdp audio-payload send-name",
941 NO_STR SDP_STR AUDIO_STR
942 "Send SDP rtpmap with the audio name\n")
943{
944 struct mgcp_trunk_config *trunk = vty->index;
945 trunk->audio_send_name = 0;
946 return CMD_SUCCESS;
947}
948
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200949DEFUN(cfg_trunk_omit_rtcp,
950 cfg_trunk_omit_rtcp_cmd,
951 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200952 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200953{
954 struct mgcp_trunk_config *trunk = vty->index;
955 trunk->omit_rtcp = 1;
956 return CMD_SUCCESS;
957}
958
959DEFUN(cfg_trunk_no_omit_rtcp,
960 cfg_trunk_no_omit_rtcp_cmd,
961 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200962 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200963{
964 struct mgcp_trunk_config *trunk = vty->index;
965 trunk->omit_rtcp = 0;
966 return CMD_SUCCESS;
967}
968
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100969DEFUN(cfg_trunk_patch_rtp_ssrc,
970 cfg_trunk_patch_rtp_ssrc_cmd,
971 "rtp-patch ssrc",
972 RTP_PATCH_STR
973 "Force a fixed SSRC\n"
974 )
975{
976 struct mgcp_trunk_config *trunk = vty->index;
977 trunk->force_constant_ssrc = 1;
978 return CMD_SUCCESS;
979}
980
981DEFUN(cfg_trunk_no_patch_rtp_ssrc,
982 cfg_trunk_no_patch_rtp_ssrc_cmd,
983 "no rtp-patch ssrc",
984 NO_STR RTP_PATCH_STR
985 "Force a fixed SSRC\n"
986 )
987{
988 struct mgcp_trunk_config *trunk = vty->index;
989 trunk->force_constant_ssrc = 0;
990 return CMD_SUCCESS;
991}
992
993DEFUN(cfg_trunk_patch_rtp_ts,
994 cfg_trunk_patch_rtp_ts_cmd,
995 "rtp-patch timestamp",
996 RTP_PATCH_STR
997 "Adjust RTP timestamp\n"
998 )
999{
1000 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +01001001 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001002 return CMD_SUCCESS;
1003}
1004
1005DEFUN(cfg_trunk_no_patch_rtp_ts,
1006 cfg_trunk_no_patch_rtp_ts_cmd,
1007 "no rtp-patch timestamp",
1008 NO_STR RTP_PATCH_STR
1009 "Adjust RTP timestamp\n"
1010 )
1011{
1012 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +01001013 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001014 return CMD_SUCCESS;
1015}
1016
1017DEFUN(cfg_trunk_no_patch_rtp,
1018 cfg_trunk_no_patch_rtp_cmd,
1019 "no rtp-patch",
1020 NO_STR RTP_PATCH_STR)
1021{
1022 struct mgcp_trunk_config *trunk = vty->index;
1023 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +01001024 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001025 return CMD_SUCCESS;
1026}
1027
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001028DEFUN(cfg_trunk_rtp_keepalive,
1029 cfg_trunk_rtp_keepalive_cmd,
1030 "rtp keep-alive <1-120>",
1031 RTP_STR RTP_KEEPALIVE_STR
1032 "Keep-alive interval in secs\n"
1033 )
1034{
1035 struct mgcp_trunk_config *trunk = vty->index;
1036 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
1037 return CMD_SUCCESS;
1038}
1039
1040DEFUN(cfg_trunk_rtp_keepalive_once,
1041 cfg_trunk_rtp_keepalive_once_cmd,
1042 "rtp keep-alive once",
1043 RTP_STR RTP_KEEPALIVE_STR
1044 "Send dummy packet only once after CRCX/MDCX\n"
1045 )
1046{
1047 struct mgcp_trunk_config *trunk = vty->index;
1048 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
1049 return CMD_SUCCESS;
1050}
1051
1052DEFUN(cfg_trunk_no_rtp_keepalive,
1053 cfg_trunk_no_rtp_keepalive_cmd,
1054 "no rtp keep-alive",
1055 NO_STR RTP_STR RTP_KEEPALIVE_STR
1056 )
1057{
1058 struct mgcp_trunk_config *trunk = vty->index;
1059 mgcp_trunk_set_keepalive(trunk, 0);
1060 return CMD_SUCCESS;
1061}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001062
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001063DEFUN(cfg_trunk_allow_transcoding,
1064 cfg_trunk_allow_transcoding_cmd,
1065 "allow-transcoding",
1066 "Allow transcoding\n")
1067{
1068 struct mgcp_trunk_config *trunk = vty->index;
1069 trunk->no_audio_transcoding = 0;
1070 return CMD_SUCCESS;
1071}
1072
1073DEFUN(cfg_trunk_no_allow_transcoding,
1074 cfg_trunk_no_allow_transcoding_cmd,
1075 "no allow-transcoding",
1076 NO_STR "Allow transcoding\n")
1077{
1078 struct mgcp_trunk_config *trunk = vty->index;
1079 trunk->no_audio_transcoding = 1;
1080 return CMD_SUCCESS;
1081}
1082
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001083DEFUN(loop_endp,
1084 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001085 "loop-endpoint <0-64> NAME (0|1)",
1086 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +08001087 "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 +08001088{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001089 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001090 struct mgcp_endpoint *endp;
1091
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001092 trunk = find_trunk(g_cfg, atoi(argv[0]));
1093 if (!trunk) {
1094 vty_out(vty, "%%Trunk %d not found in the config.%s",
1095 atoi(argv[0]), VTY_NEWLINE);
1096 return CMD_WARNING;
1097 }
1098
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001099 if (!trunk->endpoints) {
1100 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1101 trunk->trunk_nr, VTY_NEWLINE);
1102 return CMD_WARNING;
1103 }
1104
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001105 int endp_no = strtoul(argv[1], NULL, 16);
1106 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001107 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001108 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001109 return CMD_WARNING;
1110 }
1111
1112
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001113 endp = &trunk->endpoints[endp_no];
1114 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001115
1116 if (loop)
1117 endp->conn_mode = MGCP_CONN_LOOPBACK;
1118 else
1119 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001120
1121 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1122 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
1123 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001124
1125 return CMD_SUCCESS;
1126}
1127
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001128DEFUN(tap_call,
1129 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001130 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
1131 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001132 "The endpoint in hex\n"
1133 "Forward the data coming from the bts\n"
1134 "Forward the data coming from the bts leaving to the network\n"
1135 "Forward the data coming from the net\n"
1136 "Forward the data coming from the net leaving to the bts\n"
1137 "destination IP of the data\n" "destination port\n")
1138{
1139 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001140 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001141 struct mgcp_endpoint *endp;
1142 int port = 0;
1143
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001144 trunk = find_trunk(g_cfg, atoi(argv[0]));
1145 if (!trunk) {
1146 vty_out(vty, "%%Trunk %d not found in the config.%s",
1147 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001148 return CMD_WARNING;
1149 }
1150
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001151 if (!trunk->endpoints) {
1152 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1153 trunk->trunk_nr, VTY_NEWLINE);
1154 return CMD_WARNING;
1155 }
1156
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001157 int endp_no = strtoul(argv[1], NULL, 16);
1158 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1159 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1160 argv[1], endp_no, VTY_NEWLINE);
1161 return CMD_WARNING;
1162 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001163
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001164 endp = &trunk->endpoints[endp_no];
1165
1166 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001167 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001168 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001169 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001170 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001171 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001172 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001173 port = MGCP_TAP_NET_OUT;
1174 } else {
1175 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1176 return CMD_WARNING;
1177 }
1178
1179 tap = &endp->taps[port];
1180 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001181 inet_aton(argv[3], &tap->forward.sin_addr);
1182 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +08001183 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001184 return CMD_SUCCESS;
1185}
1186
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001187DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001188 "free-endpoint <0-64> NUMBER",
1189 "Free the given endpoint\n" "Trunk number\n"
1190 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001191{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001192 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001193 struct mgcp_endpoint *endp;
1194
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001195 trunk = find_trunk(g_cfg, atoi(argv[0]));
1196 if (!trunk) {
1197 vty_out(vty, "%%Trunk %d not found in the config.%s",
1198 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001199 return CMD_WARNING;
1200 }
1201
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001202 if (!trunk->endpoints) {
1203 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1204 trunk->trunk_nr, VTY_NEWLINE);
1205 return CMD_WARNING;
1206 }
1207
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001208 int endp_no = strtoul(argv[1], NULL, 16);
1209 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1210 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1211 argv[1], endp_no, VTY_NEWLINE);
1212 return CMD_WARNING;
1213 }
1214
1215 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freythercb6ad702014-07-22 15:00:52 +02001216 mgcp_release_endp(endp);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001217 return CMD_SUCCESS;
1218}
1219
Harald Welte6a857052012-01-27 00:41:39 +01001220DEFUN(reset_endp, reset_endp_cmd,
1221 "reset-endpoint <0-64> NUMBER",
1222 "Reset the given endpoint\n" "Trunk number\n"
1223 "Endpoint number in hex.\n")
1224{
1225 struct mgcp_trunk_config *trunk;
1226 struct mgcp_endpoint *endp;
1227 int endp_no, rc;
1228
1229 trunk = find_trunk(g_cfg, atoi(argv[0]));
1230 if (!trunk) {
1231 vty_out(vty, "%%Trunk %d not found in the config.%s",
1232 atoi(argv[0]), VTY_NEWLINE);
1233 return CMD_WARNING;
1234 }
1235
1236 if (!trunk->endpoints) {
1237 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1238 trunk->trunk_nr, VTY_NEWLINE);
1239 return CMD_WARNING;
1240 }
1241
1242 endp_no = strtoul(argv[1], NULL, 16);
1243 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1244 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1245 argv[1], endp_no, VTY_NEWLINE);
1246 return CMD_WARNING;
1247 }
1248
1249 endp = &trunk->endpoints[endp_no];
1250 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1251 if (rc < 0) {
1252 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1253 return CMD_WARNING;
1254 }
1255 return CMD_SUCCESS;
1256}
1257
1258DEFUN(reset_all_endp, reset_all_endp_cmd,
1259 "reset-all-endpoints",
1260 "Reset all endpoints\n")
1261{
1262 int rc;
1263
1264 rc = mgcp_send_reset_all(g_cfg);
1265 if (rc < 0) {
1266 vty_out(vty, "Error %d during endpoint reset.%s",
1267 rc, VTY_NEWLINE);
1268 return CMD_WARNING;
1269 }
1270 return CMD_SUCCESS;
1271}
1272
Holger Hans Peter Freythercc84c952014-06-03 13:36:42 +02001273#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001274DEFUN(cfg_mgcp_osmux,
1275 cfg_mgcp_osmux_cmd,
Holger Hans Peter Freyther6598ded2015-10-02 17:38:27 +02001276 "osmux (on|off|only)",
1277 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001278{
Holger Hans Peter Freyther6598ded2015-10-02 17:38:27 +02001279 if (strcmp(argv[0], "off") == 0) {
1280 g_cfg->osmux = OSMUX_USAGE_OFF;
1281 return CMD_SUCCESS;
1282 }
1283
1284 if (strcmp(argv[0], "on") == 0)
1285 g_cfg->osmux = OSMUX_USAGE_ON;
1286 else if (strcmp(argv[0], "only") == 0)
1287 g_cfg->osmux = OSMUX_USAGE_ONLY;
1288
1289 if (g_cfg->trunk.audio_loop) {
1290 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1291 VTY_NEWLINE);
1292 return CMD_WARNING;
1293 }
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001294
1295 return CMD_SUCCESS;
1296}
1297
Holger Hans Peter Freythera777c9e2015-10-12 20:06:16 +02001298DEFUN(cfg_mgcp_osmux_ip,
1299 cfg_mgcp_osmux_ip_cmd,
1300 "osmux bind-ip A.B.C.D",
1301 OSMUX_STR IP_STR "IPv4 Address to bind to\n")
1302{
Harald Welte4a824ca2017-05-29 13:54:27 +02001303 osmo_talloc_replace_string(g_cfg, &g_cfg->osmux_addr, argv[0]);
Holger Hans Peter Freythera777c9e2015-10-12 20:06:16 +02001304 return CMD_SUCCESS;
1305}
1306
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001307DEFUN(cfg_mgcp_osmux_batch_factor,
1308 cfg_mgcp_osmux_batch_factor_cmd,
Pablo Neira Ayusoc20a6612014-08-29 16:08:45 +02001309 "osmux batch-factor <1-8>",
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001310 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1311{
1312 g_cfg->osmux_batch = atoi(argv[0]);
1313 return CMD_SUCCESS;
1314}
Harald Welte6a857052012-01-27 00:41:39 +01001315
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +02001316DEFUN(cfg_mgcp_osmux_batch_size,
1317 cfg_mgcp_osmux_batch_size_cmd,
1318 "osmux batch-size <1-65535>",
1319 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1320{
1321 g_cfg->osmux_batch_size = atoi(argv[0]);
1322 return CMD_SUCCESS;
1323}
1324
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001325DEFUN(cfg_mgcp_osmux_port,
1326 cfg_mgcp_osmux_port_cmd,
1327 "osmux port <1-65535>",
1328 OSMUX_STR "port\n" "UDP port\n")
1329{
1330 g_cfg->osmux_port = atoi(argv[0]);
1331 return CMD_SUCCESS;
1332}
1333
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +02001334DEFUN(cfg_mgcp_osmux_dummy,
1335 cfg_mgcp_osmux_dummy_cmd,
1336 "osmux dummy (on|off)",
Pablo Neira Ayusod7215792015-09-07 11:22:04 +02001337 OSMUX_STR "Dummy padding\n" "Enable dummy padding\n" "Disable dummy padding\n")
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +02001338{
1339 if (strcmp(argv[0], "on") == 0)
1340 g_cfg->osmux_dummy = 1;
1341 else if (strcmp(argv[0], "off") == 0)
1342 g_cfg->osmux_dummy = 0;
1343
1344 return CMD_SUCCESS;
1345}
1346
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001347int mgcp_vty_init(void)
1348{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001349 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001350 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001351 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001352 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001353 install_element(ENABLE_NODE, &reset_endp_cmd);
1354 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001355
1356 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1357 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001358
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001359 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001360 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1361 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1362 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1363 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1364 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1365 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001366 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001367 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001368 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +02001369 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_bind_ip_cmd);
1370 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bts_bind_ip_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001371 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +02001372 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
1373 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001374 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1375 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001376 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001377 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck42a833e2014-04-14 10:31:47 +02001378 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1379 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001380 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1381 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1382 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001383 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001384 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001385 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001386 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001387 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001388 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1389 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001390 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1391 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001392 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
Philipp Maierdd9f6cd2017-08-08 12:04:30 +02001393 install_element(MGCP_NODE, &cfg_mgcp_force_realloc_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001394 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001395 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1396 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001397 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1398 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1399 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1400 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1401 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001402 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001403 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1404 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +01001405 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1406 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001407 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
Holger Hans Peter Freythera777c9e2015-10-12 20:06:16 +02001408 install_element(MGCP_NODE, &cfg_mgcp_osmux_ip_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001409 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +02001410 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001411 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +02001412 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001413 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1414 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
1415
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001416
1417 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1418 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001419 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001420 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1421 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1422 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001423 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1424 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001425 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1426 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001427 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001428 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1429 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001430 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1431 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1432 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1433 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1434 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001435 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001436 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1437 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +01001438 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1439 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001440 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1441 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001442
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001443 return 0;
1444}
1445
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001446static int allocate_trunk(struct mgcp_trunk_config *trunk)
1447{
1448 int i;
1449 struct mgcp_config *cfg = trunk->cfg;
1450
1451 if (mgcp_endpoints_allocate(trunk) != 0) {
1452 LOGP(DMGCP, LOGL_ERROR,
1453 "Failed to allocate %d endpoints on trunk %d.\n",
1454 trunk->number_endpoints, trunk->trunk_nr);
1455 return -1;
1456 }
1457
1458 /* early bind */
1459 for (i = 1; i < trunk->number_endpoints; ++i) {
1460 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001461
1462 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001463 cfg->last_bts_port += 2;
1464 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1465 LOGP(DMGCP, LOGL_FATAL,
1466 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001467 return -1;
1468 }
1469 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1470 }
1471
1472 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001473 cfg->last_net_port += 2;
1474 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1475 LOGP(DMGCP, LOGL_FATAL,
1476 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001477 return -1;
1478 }
1479 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1480 }
1481
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001482 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1483 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001484 int rtp_port;
1485
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001486 /* network side */
1487 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1488 cfg->transcoder_ports.base_port);
1489 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1490 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1491 return -1;
1492 }
1493 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1494
1495 /* bts side */
1496 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1497 cfg->transcoder_ports.base_port);
1498 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1499 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1500 return -1;
1501 }
1502 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1503 }
1504 }
1505
1506 return 0;
1507}
1508
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001509int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1510 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001511{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001512 int rc;
1513 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001514
Pablo Neira Ayuso308d5f82014-08-29 12:20:17 +02001515 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001516 cfg->osmux_batch = 4;
Pablo Neira Ayuso08726e22014-08-29 15:31:55 +02001517 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001518
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001519 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001520 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001521 if (rc < 0) {
1522 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1523 return rc;
1524 }
1525
1526
1527 if (!g_cfg->bts_ip)
1528 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1529
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001530 if (!g_cfg->source_addr) {
1531 fprintf(stderr, "You need to specify a bind address.\n");
1532 return -1;
1533 }
1534
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001535 /* initialize the last ports */
1536 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1537 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1538
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001539 if (allocate_trunk(&g_cfg->trunk) != 0) {
1540 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001541 return -1;
1542 }
1543
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001544 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1545 if (allocate_trunk(trunk) != 0) {
1546 LOGP(DMGCP, LOGL_ERROR,
1547 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1548 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001549 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001550 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001551 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001552
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001553 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001554}
1555