blob: 7d4b2da841b8598996258890d28984423324df4a [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
594DEFUN(cfg_mgcp_number_endp,
595 cfg_mgcp_number_endp_cmd,
596 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100597 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100598{
599 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100600 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100601 return CMD_SUCCESS;
602}
603
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200604DEFUN(cfg_mgcp_omit_rtcp,
605 cfg_mgcp_omit_rtcp_cmd,
606 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200607 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200608{
609 g_cfg->trunk.omit_rtcp = 1;
610 return CMD_SUCCESS;
611}
612
613DEFUN(cfg_mgcp_no_omit_rtcp,
614 cfg_mgcp_no_omit_rtcp_cmd,
615 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200616 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200617{
618 g_cfg->trunk.omit_rtcp = 0;
619 return CMD_SUCCESS;
620}
621
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100622DEFUN(cfg_mgcp_patch_rtp_ssrc,
623 cfg_mgcp_patch_rtp_ssrc_cmd,
624 "rtp-patch ssrc",
625 RTP_PATCH_STR
626 "Force a fixed SSRC\n"
627 )
628{
629 g_cfg->trunk.force_constant_ssrc = 1;
630 return CMD_SUCCESS;
631}
632
633DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
634 cfg_mgcp_no_patch_rtp_ssrc_cmd,
635 "no rtp-patch ssrc",
636 NO_STR RTP_PATCH_STR
637 "Force a fixed SSRC\n"
638 )
639{
640 g_cfg->trunk.force_constant_ssrc = 0;
641 return CMD_SUCCESS;
642}
643
644DEFUN(cfg_mgcp_patch_rtp_ts,
645 cfg_mgcp_patch_rtp_ts_cmd,
646 "rtp-patch timestamp",
647 RTP_PATCH_STR
648 "Adjust RTP timestamp\n"
649 )
650{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100651 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100652 return CMD_SUCCESS;
653}
654
655DEFUN(cfg_mgcp_no_patch_rtp_ts,
656 cfg_mgcp_no_patch_rtp_ts_cmd,
657 "no rtp-patch timestamp",
658 NO_STR RTP_PATCH_STR
659 "Adjust RTP timestamp\n"
660 )
661{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100662 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100663 return CMD_SUCCESS;
664}
665
666DEFUN(cfg_mgcp_no_patch_rtp,
667 cfg_mgcp_no_patch_rtp_cmd,
668 "no rtp-patch",
669 NO_STR RTP_PATCH_STR)
670{
671 g_cfg->trunk.force_constant_ssrc = 0;
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
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100676DEFUN(cfg_mgcp_rtp_keepalive,
677 cfg_mgcp_rtp_keepalive_cmd,
678 "rtp keep-alive <1-120>",
679 RTP_STR RTP_KEEPALIVE_STR
680 "Keep alive interval in secs\n"
681 )
682{
683 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
684 return CMD_SUCCESS;
685}
686
687DEFUN(cfg_mgcp_rtp_keepalive_once,
688 cfg_mgcp_rtp_keepalive_once_cmd,
689 "rtp keep-alive once",
690 RTP_STR RTP_KEEPALIVE_STR
691 "Send dummy packet only once after CRCX/MDCX\n"
692 )
693{
694 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
695 return CMD_SUCCESS;
696}
697
698DEFUN(cfg_mgcp_no_rtp_keepalive,
699 cfg_mgcp_no_rtp_keepalive_cmd,
700 "no rtp keep-alive",
701 NO_STR RTP_STR RTP_KEEPALIVE_STR
702 )
703{
704 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
705 return CMD_SUCCESS;
706}
707
708
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100709
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100710#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200711DEFUN(cfg_mgcp_agent_addr,
712 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100713 "call-agent ip A.B.C.D",
714 CALL_AGENT_STR IP_STR
715 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200716{
Harald Welte4a824ca2017-05-29 13:54:27 +0200717 osmo_talloc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200718 return CMD_SUCCESS;
719}
720
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100721ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
722 "call agent ip A.B.C.D",
723 CALL_AGENT_STR CALL_AGENT_STR IP_STR
724 "IPv4 Address of the callagent\n")
725
726
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800727DEFUN(cfg_mgcp_transcoder,
728 cfg_mgcp_transcoder_cmd,
729 "transcoder-mgw A.B.C.D",
730 "Use a MGW to detranscoder RTP\n"
731 "The IP address of the MGW")
732{
Harald Welte4a824ca2017-05-29 13:54:27 +0200733 osmo_talloc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800734 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
735
736 return CMD_SUCCESS;
737}
738
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100739DEFUN(cfg_mgcp_no_transcoder,
740 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100741 "no transcoder-mgw",
742 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100743{
744 if (g_cfg->transcoder_ip) {
745 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
746 talloc_free(g_cfg->transcoder_ip);
747 g_cfg->transcoder_ip = NULL;
748 }
749
750 return CMD_SUCCESS;
751}
752
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800753DEFUN(cfg_mgcp_transcoder_remote_base,
754 cfg_mgcp_transcoder_remote_base_cmd,
755 "transcoder-remote-base <0-65534>",
756 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
757{
758 g_cfg->transcoder_remote_base = atoi(argv[0]);
759 return CMD_SUCCESS;
760}
761
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100762DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
763 "trunk <1-64>",
764 "Configure a SS7 trunk\n" "Trunk Nr\n")
765{
766 struct mgcp_trunk_config *trunk;
767 int index = atoi(argv[0]);
768
769 trunk = mgcp_trunk_num(g_cfg, index);
770 if (!trunk)
771 trunk = mgcp_trunk_alloc(g_cfg, index);
772
773 if (!trunk) {
774 vty_out(vty, "%%Unable to allocate trunk %u.%s",
775 index, VTY_NEWLINE);
776 return CMD_WARNING;
777 }
778
779 vty->node = TRUNK_NODE;
780 vty->index = trunk;
781 return CMD_SUCCESS;
782}
783
784static int config_write_trunk(struct vty *vty)
785{
786 struct mgcp_trunk_config *trunk;
787
788 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
789 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100790 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100791 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100792 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100793 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100794 vty_out(vty, " %ssdp audio-payload send-ptime%s",
795 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100796 vty_out(vty, " %ssdp audio-payload send-name%s",
797 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100798
799 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
800 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
801 else if (trunk->keepalive_interval)
802 vty_out(vty, " rtp keep-alive %d%s",
803 trunk->keepalive_interval, VTY_NEWLINE);
804 else
805 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
806
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100807 vty_out(vty, " loop %d%s",
808 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200809 if (trunk->omit_rtcp)
810 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
811 else
812 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100813 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100814 vty_out(vty, " %srtp-patch ssrc%s",
815 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
816 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100817 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100818 } else
819 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200820 if (trunk->audio_fmtp_extra)
821 vty_out(vty, " sdp audio fmtp-extra %s%s",
822 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -0400823 vty_out(vty, " %sallow-transcoding%s",
824 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100825 }
826
827 return CMD_SUCCESS;
828}
829
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200830DEFUN(cfg_trunk_sdp_fmtp_extra,
831 cfg_trunk_sdp_fmtp_extra_cmd,
832 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100833 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
834 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200835{
836 struct mgcp_trunk_config *trunk = vty->index;
837 char *txt = argv_concat(argv, argc, 0);
838 if (!txt)
839 return CMD_WARNING;
840
Harald Welte4a824ca2017-05-29 13:54:27 +0200841 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200842 talloc_free(txt);
843 return CMD_SUCCESS;
844}
845
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100846DEFUN(cfg_trunk_payload_number,
847 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100848 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100849 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100850{
851 struct mgcp_trunk_config *trunk = vty->index;
852 unsigned int payload = atoi(argv[0]);
853
854 trunk->audio_payload = payload;
855 return CMD_SUCCESS;
856}
857
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100858ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
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 AUDIO_STR "Number\n" "Payload Number\n")
861
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100862DEFUN(cfg_trunk_payload_name,
863 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100864 "sdp audio-payload name NAME",
865 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100866{
867 struct mgcp_trunk_config *trunk = vty->index;
868
Harald Welte4a824ca2017-05-29 13:54:27 +0200869 osmo_talloc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100870 return CMD_SUCCESS;
871}
872
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100873ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
874 "sdp audio payload name NAME",
875 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
876
877
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100878DEFUN(cfg_trunk_loop,
879 cfg_trunk_loop_cmd,
880 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100881 "Loop audio for all endpoints on this trunk\n"
882 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100883{
884 struct mgcp_trunk_config *trunk = vty->index;
885
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100886 if (g_cfg->osmux) {
887 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
888 return CMD_WARNING;
889 }
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100890 trunk->audio_loop = atoi(argv[0]);
891 return CMD_SUCCESS;
892}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800893
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100894DEFUN(cfg_trunk_sdp_payload_send_ptime,
895 cfg_trunk_sdp_payload_send_ptime_cmd,
896 "sdp audio-payload send-ptime",
897 SDP_STR AUDIO_STR
898 "Send SDP ptime (packet duration) attribute\n")
899{
900 struct mgcp_trunk_config *trunk = vty->index;
901 trunk->audio_send_ptime = 1;
902 return CMD_SUCCESS;
903}
904
905DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
906 cfg_trunk_no_sdp_payload_send_ptime_cmd,
907 "no sdp audio-payload send-ptime",
908 NO_STR 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 = 0;
913 return CMD_SUCCESS;
914}
915
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100916DEFUN(cfg_trunk_sdp_payload_send_name,
917 cfg_trunk_sdp_payload_send_name_cmd,
918 "sdp audio-payload send-name",
919 SDP_STR AUDIO_STR
920 "Send SDP rtpmap with the audio name\n")
921{
922 struct mgcp_trunk_config *trunk = vty->index;
923 trunk->audio_send_name = 1;
924 return CMD_SUCCESS;
925}
926
927DEFUN(cfg_trunk_no_sdp_payload_send_name,
928 cfg_trunk_no_sdp_payload_send_name_cmd,
929 "no sdp audio-payload send-name",
930 NO_STR 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 = 0;
935 return CMD_SUCCESS;
936}
937
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200938DEFUN(cfg_trunk_omit_rtcp,
939 cfg_trunk_omit_rtcp_cmd,
940 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200941 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200942{
943 struct mgcp_trunk_config *trunk = vty->index;
944 trunk->omit_rtcp = 1;
945 return CMD_SUCCESS;
946}
947
948DEFUN(cfg_trunk_no_omit_rtcp,
949 cfg_trunk_no_omit_rtcp_cmd,
950 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200951 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200952{
953 struct mgcp_trunk_config *trunk = vty->index;
954 trunk->omit_rtcp = 0;
955 return CMD_SUCCESS;
956}
957
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100958DEFUN(cfg_trunk_patch_rtp_ssrc,
959 cfg_trunk_patch_rtp_ssrc_cmd,
960 "rtp-patch ssrc",
961 RTP_PATCH_STR
962 "Force a fixed SSRC\n"
963 )
964{
965 struct mgcp_trunk_config *trunk = vty->index;
966 trunk->force_constant_ssrc = 1;
967 return CMD_SUCCESS;
968}
969
970DEFUN(cfg_trunk_no_patch_rtp_ssrc,
971 cfg_trunk_no_patch_rtp_ssrc_cmd,
972 "no rtp-patch ssrc",
973 NO_STR RTP_PATCH_STR
974 "Force a fixed SSRC\n"
975 )
976{
977 struct mgcp_trunk_config *trunk = vty->index;
978 trunk->force_constant_ssrc = 0;
979 return CMD_SUCCESS;
980}
981
982DEFUN(cfg_trunk_patch_rtp_ts,
983 cfg_trunk_patch_rtp_ts_cmd,
984 "rtp-patch timestamp",
985 RTP_PATCH_STR
986 "Adjust RTP timestamp\n"
987 )
988{
989 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100990 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100991 return CMD_SUCCESS;
992}
993
994DEFUN(cfg_trunk_no_patch_rtp_ts,
995 cfg_trunk_no_patch_rtp_ts_cmd,
996 "no rtp-patch timestamp",
997 NO_STR RTP_PATCH_STR
998 "Adjust RTP timestamp\n"
999 )
1000{
1001 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +01001002 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001003 return CMD_SUCCESS;
1004}
1005
1006DEFUN(cfg_trunk_no_patch_rtp,
1007 cfg_trunk_no_patch_rtp_cmd,
1008 "no rtp-patch",
1009 NO_STR RTP_PATCH_STR)
1010{
1011 struct mgcp_trunk_config *trunk = vty->index;
1012 trunk->force_constant_ssrc = 0;
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
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001017DEFUN(cfg_trunk_rtp_keepalive,
1018 cfg_trunk_rtp_keepalive_cmd,
1019 "rtp keep-alive <1-120>",
1020 RTP_STR RTP_KEEPALIVE_STR
1021 "Keep-alive interval in secs\n"
1022 )
1023{
1024 struct mgcp_trunk_config *trunk = vty->index;
1025 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
1026 return CMD_SUCCESS;
1027}
1028
1029DEFUN(cfg_trunk_rtp_keepalive_once,
1030 cfg_trunk_rtp_keepalive_once_cmd,
1031 "rtp keep-alive once",
1032 RTP_STR RTP_KEEPALIVE_STR
1033 "Send dummy packet only once after CRCX/MDCX\n"
1034 )
1035{
1036 struct mgcp_trunk_config *trunk = vty->index;
1037 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
1038 return CMD_SUCCESS;
1039}
1040
1041DEFUN(cfg_trunk_no_rtp_keepalive,
1042 cfg_trunk_no_rtp_keepalive_cmd,
1043 "no rtp keep-alive",
1044 NO_STR RTP_STR RTP_KEEPALIVE_STR
1045 )
1046{
1047 struct mgcp_trunk_config *trunk = vty->index;
1048 mgcp_trunk_set_keepalive(trunk, 0);
1049 return CMD_SUCCESS;
1050}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001051
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001052DEFUN(cfg_trunk_allow_transcoding,
1053 cfg_trunk_allow_transcoding_cmd,
1054 "allow-transcoding",
1055 "Allow transcoding\n")
1056{
1057 struct mgcp_trunk_config *trunk = vty->index;
1058 trunk->no_audio_transcoding = 0;
1059 return CMD_SUCCESS;
1060}
1061
1062DEFUN(cfg_trunk_no_allow_transcoding,
1063 cfg_trunk_no_allow_transcoding_cmd,
1064 "no allow-transcoding",
1065 NO_STR "Allow transcoding\n")
1066{
1067 struct mgcp_trunk_config *trunk = vty->index;
1068 trunk->no_audio_transcoding = 1;
1069 return CMD_SUCCESS;
1070}
1071
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001072DEFUN(loop_endp,
1073 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001074 "loop-endpoint <0-64> NAME (0|1)",
1075 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +08001076 "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 +08001077{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001078 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001079 struct mgcp_endpoint *endp;
1080
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001081 trunk = find_trunk(g_cfg, atoi(argv[0]));
1082 if (!trunk) {
1083 vty_out(vty, "%%Trunk %d not found in the config.%s",
1084 atoi(argv[0]), VTY_NEWLINE);
1085 return CMD_WARNING;
1086 }
1087
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001088 if (!trunk->endpoints) {
1089 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1090 trunk->trunk_nr, VTY_NEWLINE);
1091 return CMD_WARNING;
1092 }
1093
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001094 int endp_no = strtoul(argv[1], NULL, 16);
1095 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001096 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001097 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001098 return CMD_WARNING;
1099 }
1100
1101
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001102 endp = &trunk->endpoints[endp_no];
1103 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001104
1105 if (loop)
1106 endp->conn_mode = MGCP_CONN_LOOPBACK;
1107 else
1108 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001109
1110 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1111 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
1112 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001113
1114 return CMD_SUCCESS;
1115}
1116
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001117DEFUN(tap_call,
1118 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001119 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
1120 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001121 "The endpoint in hex\n"
1122 "Forward the data coming from the bts\n"
1123 "Forward the data coming from the bts leaving to the network\n"
1124 "Forward the data coming from the net\n"
1125 "Forward the data coming from the net leaving to the bts\n"
1126 "destination IP of the data\n" "destination port\n")
1127{
1128 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001129 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001130 struct mgcp_endpoint *endp;
1131 int port = 0;
1132
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001133 trunk = find_trunk(g_cfg, atoi(argv[0]));
1134 if (!trunk) {
1135 vty_out(vty, "%%Trunk %d not found in the config.%s",
1136 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001137 return CMD_WARNING;
1138 }
1139
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001140 if (!trunk->endpoints) {
1141 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1142 trunk->trunk_nr, VTY_NEWLINE);
1143 return CMD_WARNING;
1144 }
1145
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001146 int endp_no = strtoul(argv[1], NULL, 16);
1147 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1148 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1149 argv[1], endp_no, VTY_NEWLINE);
1150 return CMD_WARNING;
1151 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001152
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001153 endp = &trunk->endpoints[endp_no];
1154
1155 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001156 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001157 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001158 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001159 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001160 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001161 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001162 port = MGCP_TAP_NET_OUT;
1163 } else {
1164 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1165 return CMD_WARNING;
1166 }
1167
1168 tap = &endp->taps[port];
1169 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001170 inet_aton(argv[3], &tap->forward.sin_addr);
1171 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +08001172 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001173 return CMD_SUCCESS;
1174}
1175
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001176DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001177 "free-endpoint <0-64> NUMBER",
1178 "Free the given endpoint\n" "Trunk number\n"
1179 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001180{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001181 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001182 struct mgcp_endpoint *endp;
1183
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001184 trunk = find_trunk(g_cfg, atoi(argv[0]));
1185 if (!trunk) {
1186 vty_out(vty, "%%Trunk %d not found in the config.%s",
1187 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001188 return CMD_WARNING;
1189 }
1190
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001191 if (!trunk->endpoints) {
1192 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1193 trunk->trunk_nr, VTY_NEWLINE);
1194 return CMD_WARNING;
1195 }
1196
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001197 int endp_no = strtoul(argv[1], NULL, 16);
1198 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1199 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1200 argv[1], endp_no, VTY_NEWLINE);
1201 return CMD_WARNING;
1202 }
1203
1204 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freythercb6ad702014-07-22 15:00:52 +02001205 mgcp_release_endp(endp);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001206 return CMD_SUCCESS;
1207}
1208
Harald Welte6a857052012-01-27 00:41:39 +01001209DEFUN(reset_endp, reset_endp_cmd,
1210 "reset-endpoint <0-64> NUMBER",
1211 "Reset the given endpoint\n" "Trunk number\n"
1212 "Endpoint number in hex.\n")
1213{
1214 struct mgcp_trunk_config *trunk;
1215 struct mgcp_endpoint *endp;
1216 int endp_no, rc;
1217
1218 trunk = find_trunk(g_cfg, atoi(argv[0]));
1219 if (!trunk) {
1220 vty_out(vty, "%%Trunk %d not found in the config.%s",
1221 atoi(argv[0]), VTY_NEWLINE);
1222 return CMD_WARNING;
1223 }
1224
1225 if (!trunk->endpoints) {
1226 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1227 trunk->trunk_nr, VTY_NEWLINE);
1228 return CMD_WARNING;
1229 }
1230
1231 endp_no = strtoul(argv[1], NULL, 16);
1232 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1233 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1234 argv[1], endp_no, VTY_NEWLINE);
1235 return CMD_WARNING;
1236 }
1237
1238 endp = &trunk->endpoints[endp_no];
1239 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1240 if (rc < 0) {
1241 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1242 return CMD_WARNING;
1243 }
1244 return CMD_SUCCESS;
1245}
1246
1247DEFUN(reset_all_endp, reset_all_endp_cmd,
1248 "reset-all-endpoints",
1249 "Reset all endpoints\n")
1250{
1251 int rc;
1252
1253 rc = mgcp_send_reset_all(g_cfg);
1254 if (rc < 0) {
1255 vty_out(vty, "Error %d during endpoint reset.%s",
1256 rc, VTY_NEWLINE);
1257 return CMD_WARNING;
1258 }
1259 return CMD_SUCCESS;
1260}
1261
Holger Hans Peter Freythercc84c952014-06-03 13:36:42 +02001262#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001263DEFUN(cfg_mgcp_osmux,
1264 cfg_mgcp_osmux_cmd,
Holger Hans Peter Freyther6598ded2015-10-02 17:38:27 +02001265 "osmux (on|off|only)",
1266 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001267{
Holger Hans Peter Freyther6598ded2015-10-02 17:38:27 +02001268 if (strcmp(argv[0], "off") == 0) {
1269 g_cfg->osmux = OSMUX_USAGE_OFF;
1270 return CMD_SUCCESS;
1271 }
1272
1273 if (strcmp(argv[0], "on") == 0)
1274 g_cfg->osmux = OSMUX_USAGE_ON;
1275 else if (strcmp(argv[0], "only") == 0)
1276 g_cfg->osmux = OSMUX_USAGE_ONLY;
1277
1278 if (g_cfg->trunk.audio_loop) {
1279 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1280 VTY_NEWLINE);
1281 return CMD_WARNING;
1282 }
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001283
1284 return CMD_SUCCESS;
1285}
1286
Holger Hans Peter Freythera777c9e2015-10-12 20:06:16 +02001287DEFUN(cfg_mgcp_osmux_ip,
1288 cfg_mgcp_osmux_ip_cmd,
1289 "osmux bind-ip A.B.C.D",
1290 OSMUX_STR IP_STR "IPv4 Address to bind to\n")
1291{
Harald Welte4a824ca2017-05-29 13:54:27 +02001292 osmo_talloc_replace_string(g_cfg, &g_cfg->osmux_addr, argv[0]);
Holger Hans Peter Freythera777c9e2015-10-12 20:06:16 +02001293 return CMD_SUCCESS;
1294}
1295
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001296DEFUN(cfg_mgcp_osmux_batch_factor,
1297 cfg_mgcp_osmux_batch_factor_cmd,
Pablo Neira Ayusoc20a6612014-08-29 16:08:45 +02001298 "osmux batch-factor <1-8>",
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001299 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1300{
1301 g_cfg->osmux_batch = atoi(argv[0]);
1302 return CMD_SUCCESS;
1303}
Harald Welte6a857052012-01-27 00:41:39 +01001304
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +02001305DEFUN(cfg_mgcp_osmux_batch_size,
1306 cfg_mgcp_osmux_batch_size_cmd,
1307 "osmux batch-size <1-65535>",
1308 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1309{
1310 g_cfg->osmux_batch_size = atoi(argv[0]);
1311 return CMD_SUCCESS;
1312}
1313
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001314DEFUN(cfg_mgcp_osmux_port,
1315 cfg_mgcp_osmux_port_cmd,
1316 "osmux port <1-65535>",
1317 OSMUX_STR "port\n" "UDP port\n")
1318{
1319 g_cfg->osmux_port = atoi(argv[0]);
1320 return CMD_SUCCESS;
1321}
1322
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +02001323DEFUN(cfg_mgcp_osmux_dummy,
1324 cfg_mgcp_osmux_dummy_cmd,
1325 "osmux dummy (on|off)",
Pablo Neira Ayusod7215792015-09-07 11:22:04 +02001326 OSMUX_STR "Dummy padding\n" "Enable dummy padding\n" "Disable dummy padding\n")
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +02001327{
1328 if (strcmp(argv[0], "on") == 0)
1329 g_cfg->osmux_dummy = 1;
1330 else if (strcmp(argv[0], "off") == 0)
1331 g_cfg->osmux_dummy = 0;
1332
1333 return CMD_SUCCESS;
1334}
1335
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001336int mgcp_vty_init(void)
1337{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001338 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001339 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001340 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001341 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001342 install_element(ENABLE_NODE, &reset_endp_cmd);
1343 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001344
1345 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1346 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001347
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001348 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001349 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1350 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1351 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1352 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1353 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1354 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001355 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001356 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001357 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +02001358 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_bind_ip_cmd);
1359 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bts_bind_ip_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001360 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +02001361 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
1362 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001363 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1364 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001365 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001366 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck42a833e2014-04-14 10:31:47 +02001367 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1368 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001369 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1370 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1371 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001372 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001373 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001374 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001375 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001376 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001377 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1378 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001379 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1380 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001381 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1382 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001383 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1384 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001385 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1386 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1387 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1388 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1389 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001390 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001391 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1392 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +01001393 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1394 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001395 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
Holger Hans Peter Freythera777c9e2015-10-12 20:06:16 +02001396 install_element(MGCP_NODE, &cfg_mgcp_osmux_ip_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001397 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +02001398 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001399 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +02001400 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001401 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1402 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
1403
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001404
1405 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1406 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001407 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001408 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1409 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1410 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001411 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1412 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001413 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1414 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001415 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001416 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1417 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001418 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1419 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1420 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1421 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1422 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001423 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001424 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1425 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +01001426 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1427 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001428 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1429 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001430
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001431 return 0;
1432}
1433
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001434static int allocate_trunk(struct mgcp_trunk_config *trunk)
1435{
1436 int i;
1437 struct mgcp_config *cfg = trunk->cfg;
1438
1439 if (mgcp_endpoints_allocate(trunk) != 0) {
1440 LOGP(DMGCP, LOGL_ERROR,
1441 "Failed to allocate %d endpoints on trunk %d.\n",
1442 trunk->number_endpoints, trunk->trunk_nr);
1443 return -1;
1444 }
1445
1446 /* early bind */
1447 for (i = 1; i < trunk->number_endpoints; ++i) {
1448 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001449
1450 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001451 cfg->last_bts_port += 2;
1452 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1453 LOGP(DMGCP, LOGL_FATAL,
1454 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001455 return -1;
1456 }
1457 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1458 }
1459
1460 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001461 cfg->last_net_port += 2;
1462 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1463 LOGP(DMGCP, LOGL_FATAL,
1464 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001465 return -1;
1466 }
1467 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1468 }
1469
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001470 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1471 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001472 int rtp_port;
1473
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001474 /* network side */
1475 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1476 cfg->transcoder_ports.base_port);
1477 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1478 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1479 return -1;
1480 }
1481 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1482
1483 /* bts side */
1484 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1485 cfg->transcoder_ports.base_port);
1486 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1487 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1488 return -1;
1489 }
1490 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1491 }
1492 }
1493
1494 return 0;
1495}
1496
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001497int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1498 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001499{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001500 int rc;
1501 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001502
Pablo Neira Ayuso308d5f82014-08-29 12:20:17 +02001503 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001504 cfg->osmux_batch = 4;
Pablo Neira Ayuso08726e22014-08-29 15:31:55 +02001505 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001506
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001507 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001508 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001509 if (rc < 0) {
1510 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1511 return rc;
1512 }
1513
1514
1515 if (!g_cfg->bts_ip)
1516 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1517
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001518 if (!g_cfg->source_addr) {
1519 fprintf(stderr, "You need to specify a bind address.\n");
1520 return -1;
1521 }
1522
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001523 /* initialize the last ports */
1524 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1525 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1526
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001527 if (allocate_trunk(&g_cfg->trunk) != 0) {
1528 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001529 return -1;
1530 }
1531
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001532 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1533 if (allocate_trunk(trunk) != 0) {
1534 LOGP(DMGCP, LOGL_ERROR,
1535 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1536 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001537 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001538 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001539 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001540
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001541 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001542}
1543