blob: 521f86ea958b16a635ab695818483cc6555f55b0 [file] [log] [blame]
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
2/* The protocol implementation */
3
4/*
5 * (C) 2009-2014 by Holger Hans Peter Freyther <zecke@selfish.org>
6 * (C) 2009-2011 by On-Waves
7 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * 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
12 * (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
17 * GNU Affero General Public License for more details.
18 *
19 * 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/>.
21 *
22 */
23
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020024#include <osmocom/core/talloc.h>
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +020025#include <osmocom/core/sockaddr_str.h>
Stefan Sperling1e174872018-10-25 18:36:10 +020026#include <osmocom/vty/misc.h>
Philipp Maier87bd9be2017-08-22 16:35:41 +020027#include <osmocom/mgcp/mgcp.h>
Neels Hofmeyr67793542017-09-08 04:25:16 +020028#include <osmocom/mgcp/mgcp_common.h>
Philipp Maier993ea6b2020-08-04 18:26:50 +020029#include <osmocom/mgcp/osmux.h>
30#include <osmocom/mgcp/mgcp_protocol.h>
Philipp Maier87bd9be2017-08-22 16:35:41 +020031#include <osmocom/mgcp/vty.h>
32#include <osmocom/mgcp/mgcp_conn.h>
Philipp Maier37d11c82018-02-01 14:38:12 +010033#include <osmocom/mgcp/mgcp_endp.h>
Philipp Maierc66ab2c2020-06-02 20:55:34 +020034#include <osmocom/mgcp/mgcp_trunk.h>
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020035
36#include <string.h>
Philipp Maierbca0ef62018-07-09 17:20:51 +020037#include <inttypes.h>
Stefan Sperling12086582018-06-26 15:26:28 +020038#include <limits.h>
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020039
40#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
41#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
42#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
Philipp Maier9fc8a022019-02-20 12:26:52 +010043#define RTP_TS101318_RFC5993_CONV_STR "Convert GSM-HR from TS101318 to RFC5993 and vice versa\n"
44
Philipp Maier19c430f2020-09-22 15:52:50 +020045#define X(x) (1 << x)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020046
47static struct mgcp_config *g_cfg = NULL;
48
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020049struct cmd_node mgcp_node = {
50 MGCP_NODE,
51 "%s(config-mgcp)# ",
52 1,
53};
54
55struct cmd_node trunk_node = {
56 TRUNK_NODE,
57 "%s(config-mgcp-trunk)# ",
58 1,
59};
60
61static int config_write_mgcp(struct vty *vty)
62{
Philipp Maier6fbbeec2020-07-01 23:00:54 +020063 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +020064 OSMO_ASSERT(trunk);
Harald Weltec39b1bf2020-03-08 11:29:39 +010065
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020066 vty_out(vty, "mgcp%s", VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +020067 vty_out(vty, " domain %s%s", g_cfg->domain, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020068 if (g_cfg->local_ip)
69 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +020070 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
71 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
72 vty_out(vty, " rtp port-range %u %u%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +020073 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end,
74 VTY_NEWLINE);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +020075 if (g_cfg->net_ports.bind_addr_v4)
Philipp Maierf53796c2020-06-02 20:38:28 +020076 vty_out(vty, " rtp bind-ip %s%s",
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +020077 g_cfg->net_ports.bind_addr_v4, VTY_NEWLINE);
78 if (g_cfg->net_ports.bind_addr_v6)
79 vty_out(vty, " rtp bind-ip-v6 %s%s",
80 g_cfg->net_ports.bind_addr_v6, VTY_NEWLINE);
Philipp Maier1cb1e382017-11-02 17:16:04 +010081 if (g_cfg->net_ports.bind_addr_probe)
Philipp Maierf53796c2020-06-02 20:38:28 +020082 vty_out(vty, " rtp ip-probing%s", VTY_NEWLINE);
Philipp Maier1cb1e382017-11-02 17:16:04 +010083 else
Philipp Maierf53796c2020-06-02 20:38:28 +020084 vty_out(vty, " no rtp ip-probing%s", VTY_NEWLINE);
85 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Harald Welte55a92292021-04-28 19:06:34 +020086 if (g_cfg->endp_priority)
87 vty_out(vty, " rtp socket-priority %d%s", g_cfg->endp_priority, VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +010088 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
Philipp Maierf53796c2020-06-02 20:38:28 +020089 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +010090 else if (trunk->keepalive_interval)
Philipp Maierf53796c2020-06-02 20:38:28 +020091 vty_out(vty, " rtp keep-alive %d%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +010092 trunk->keepalive_interval, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020093 else
Philipp Maierf53796c2020-06-02 20:38:28 +020094 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020095
Harald Weltec39b1bf2020-03-08 11:29:39 +010096 if (trunk->omit_rtcp)
Philipp Maierf53796c2020-06-02 20:38:28 +020097 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020098 else
Philipp Maierf53796c2020-06-02 20:38:28 +020099 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100100 if (trunk->force_constant_ssrc
101 || trunk->force_aligned_timing
102 || trunk->rfc5993_hr_convert) {
Philipp Maierf53796c2020-06-02 20:38:28 +0200103 vty_out(vty, " %srtp-patch ssrc%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100104 trunk->force_constant_ssrc ? "" : "no ",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200105 VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200106 vty_out(vty, " %srtp-patch timestamp%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100107 trunk->force_aligned_timing ? "" : "no ",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200108 VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200109 vty_out(vty, " %srtp-patch rfc5993hr%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100110 trunk->rfc5993_hr_convert ? "" : "no ",
Philipp Maier9fc8a022019-02-20 12:26:52 +0100111 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200112 } else
Philipp Maierf53796c2020-06-02 20:38:28 +0200113 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100114 if (trunk->audio_fmtp_extra)
Philipp Maierf53796c2020-06-02 20:38:28 +0200115 vty_out(vty, " sdp audio fmtp-extra %s%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100116 trunk->audio_fmtp_extra, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200117 vty_out(vty, " %ssdp audio-payload send-ptime%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100118 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200119 vty_out(vty, " %ssdp audio-payload send-name%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100120 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200121 vty_out(vty, " number endpoints %u%s",
Philipp Maier889fe7f2020-07-06 17:44:12 +0200122 trunk->v.vty_number_endpoints, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200123 vty_out(vty, " %sallow-transcoding%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100124 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200125 if (g_cfg->call_agent_addr)
Philipp Maierf53796c2020-06-02 20:38:28 +0200126 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200127 VTY_NEWLINE);
128 if (g_cfg->force_ptime > 0)
Philipp Maierf53796c2020-06-02 20:38:28 +0200129 vty_out(vty, " rtp force-ptime %d%s", g_cfg->force_ptime,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200130 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200131
132 switch (g_cfg->osmux) {
133 case OSMUX_USAGE_ON:
Philipp Maierf53796c2020-06-02 20:38:28 +0200134 vty_out(vty, " osmux on%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200135 break;
136 case OSMUX_USAGE_ONLY:
Philipp Maierf53796c2020-06-02 20:38:28 +0200137 vty_out(vty, " osmux only%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200138 break;
139 case OSMUX_USAGE_OFF:
140 default:
Philipp Maierf53796c2020-06-02 20:38:28 +0200141 vty_out(vty, " osmux off%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200142 break;
143 }
144 if (g_cfg->osmux) {
Philipp Maierf53796c2020-06-02 20:38:28 +0200145 vty_out(vty, " osmux bind-ip %s%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200146 g_cfg->osmux_addr, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200147 vty_out(vty, " osmux batch-factor %d%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200148 g_cfg->osmux_batch, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200149 vty_out(vty, " osmux batch-size %u%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200150 g_cfg->osmux_batch_size, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200151 vty_out(vty, " osmux port %u%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200152 g_cfg->osmux_port, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200153 vty_out(vty, " osmux dummy %s%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200154 g_cfg->osmux_dummy ? "on" : "off", VTY_NEWLINE);
155 }
Oliver Smithe36b7752019-01-22 16:31:36 +0100156
157 if (g_cfg->conn_timeout)
Philipp Maierf53796c2020-06-02 20:38:28 +0200158 vty_out(vty, " conn-timeout %u%s", g_cfg->conn_timeout, VTY_NEWLINE);
Oliver Smithe36b7752019-01-22 16:31:36 +0100159
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200160 return CMD_SUCCESS;
161}
162
Philipp Maiercede2a42018-07-03 14:14:21 +0200163static void dump_rtp_end(struct vty *vty, struct mgcp_conn_rtp *conn)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200164{
Philipp Maiercede2a42018-07-03 14:14:21 +0200165 struct mgcp_rtp_state *state = &conn->state;
166 struct mgcp_rtp_end *end = &conn->end;
Philipp Maierbc0346e2018-06-07 09:52:16 +0200167 struct mgcp_rtp_codec *codec = end->codec;
Stefan Sperlingb7974e22018-10-29 13:22:00 +0100168 struct rate_ctr *tx_packets, *tx_bytes;
169 struct rate_ctr *rx_packets, *rx_bytes;
Philipp Maiercede2a42018-07-03 14:14:21 +0200170 struct rate_ctr *dropped_packets;
171
Stefan Sperlingb7974e22018-10-29 13:22:00 +0100172 tx_packets = &conn->rate_ctr_group->ctr[RTP_PACKETS_TX_CTR];
173 tx_bytes = &conn->rate_ctr_group->ctr[RTP_OCTETS_TX_CTR];
174 rx_packets = &conn->rate_ctr_group->ctr[RTP_PACKETS_RX_CTR];
175 rx_bytes = &conn->rate_ctr_group->ctr[RTP_OCTETS_RX_CTR];
Philipp Maiercede2a42018-07-03 14:14:21 +0200176 dropped_packets = &conn->rate_ctr_group->ctr[RTP_DROPPED_PACKETS_CTR];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200177
178 vty_out(vty,
Stefan Sperlingb7974e22018-10-29 13:22:00 +0100179 " Packets Sent: %" PRIu64 " (%" PRIu64 " bytes total)%s"
180 " Packets Received: %" PRIu64 " (%" PRIu64 " bytes total)%s"
Philipp Maierbca0ef62018-07-09 17:20:51 +0200181 " Timestamp Errs: %" PRIu64 "->%" PRIu64 "%s"
182 " Dropped Packets: %" PRIu64 "%s"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200183 " Payload Type: %d Rate: %u Channels: %d %s"
184 " Frame Duration: %u Frame Denominator: %u%s"
185 " FPP: %d Packet Duration: %u%s"
186 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
187 " Output-Enabled: %d Force-PTIME: %d%s",
Stefan Sperlingb7974e22018-10-29 13:22:00 +0100188 tx_packets->current, tx_bytes->current, VTY_NEWLINE,
189 rx_packets->current, rx_bytes->current, VTY_NEWLINE,
Philipp Maier9e1d1642018-05-09 16:26:34 +0200190 state->in_stream.err_ts_ctr->current,
191 state->out_stream.err_ts_ctr->current,
192 VTY_NEWLINE,
Philipp Maiercede2a42018-07-03 14:14:21 +0200193 dropped_packets->current, VTY_NEWLINE,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200194 codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200195 codec->frame_duration_num, codec->frame_duration_den,
196 VTY_NEWLINE, end->frames_per_packet, end->packet_duration_ms,
197 VTY_NEWLINE, end->fmtp_extra, codec->audio_name,
198 codec->subtype_name, VTY_NEWLINE, end->output_enabled,
199 end->force_output_ptime, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200200}
201
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200202static void dump_endpoint(struct vty *vty, struct mgcp_endpoint *endp,
Stefan Sperling12086582018-06-26 15:26:28 +0200203 int trunk_nr, enum mgcp_trunk_type trunk_type, int show_stats)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200204{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200205 struct mgcp_conn *conn;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200206
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200207 vty_out(vty, "%s trunk %d endpoint %s:%s",
208 trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1", trunk_nr, endp->name, VTY_NEWLINE);
Philipp Maier8d6a1932020-06-18 12:19:31 +0200209 vty_out(vty, " Availability: %s%s",
210 mgcp_endp_avail(endp) ? "available" : "not in service", VTY_NEWLINE);
Stefan Sperling12086582018-06-26 15:26:28 +0200211
212 if (llist_empty(&endp->conns)) {
213 vty_out(vty, " No active connections%s", VTY_NEWLINE);
214 return;
215 }
216
217 llist_for_each_entry(conn, &endp->conns, entry) {
218 vty_out(vty, " CONN: %s%s", mgcp_conn_dump(conn), VTY_NEWLINE);
219
220 if (show_stats) {
Oliver Smithe36b7752019-01-22 16:31:36 +0100221 if (endp->cfg->conn_timeout) {
222 struct timeval remaining;
223 osmo_timer_remaining(&conn->watchdog, NULL, &remaining);
224 vty_out(vty, " Currently remaining timeout (seconds): %d.%06d%s",
225 (int)remaining.tv_sec, (int)remaining.tv_usec, VTY_NEWLINE);
226 }
227
Stefan Sperling12086582018-06-26 15:26:28 +0200228 /* FIXME: Also add verbosity for other
229 * connection types (E1) as soon as
230 * the implementation is available */
231 if (conn->type == MGCP_CONN_TYPE_RTP) {
232 dump_rtp_end(vty, &conn->u.rtp);
233 }
234 }
235 }
236}
237
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200238static void dump_ratectr_global(struct vty *vty, struct mgcp_ratectr_global *ratectr)
239{
240 vty_out(vty, "%s", VTY_NEWLINE);
241 vty_out(vty, "Rate counters (global):%s", VTY_NEWLINE);
242
243 if (ratectr->mgcp_general_ctr_group) {
244 vty_out(vty, " %s:%s",
245 ratectr->mgcp_general_ctr_group->desc->
246 group_description, VTY_NEWLINE);
247 vty_out_rate_ctr_group_fmt(vty,
248 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
249 ratectr->mgcp_general_ctr_group);
250 }
251}
252
Philipp Maier889fe7f2020-07-06 17:44:12 +0200253static void dump_ratectr_trunk(struct vty *vty, struct mgcp_trunk *trunk)
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200254{
Philipp Maier889fe7f2020-07-06 17:44:12 +0200255 struct mgcp_ratectr_trunk *ratectr = &trunk->ratectr;
256
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200257 vty_out(vty, "%s", VTY_NEWLINE);
258 vty_out(vty, "Rate counters (trunk):%s", VTY_NEWLINE);
259
260 if (ratectr->mgcp_crcx_ctr_group) {
261 vty_out(vty, " %s:%s",
262 ratectr->mgcp_crcx_ctr_group->desc->group_description,
263 VTY_NEWLINE);
264 vty_out_rate_ctr_group_fmt(vty,
265 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
266 ratectr->mgcp_crcx_ctr_group);
267 }
268 if (ratectr->mgcp_dlcx_ctr_group) {
269 vty_out(vty, " %s:%s",
270 ratectr->mgcp_dlcx_ctr_group->desc->group_description,
271 VTY_NEWLINE);
272 vty_out_rate_ctr_group_fmt(vty,
273 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
274 ratectr->mgcp_dlcx_ctr_group);
275 }
276 if (ratectr->mgcp_mdcx_ctr_group) {
277 vty_out(vty, " %s:%s",
278 ratectr->mgcp_mdcx_ctr_group->desc->group_description,
279 VTY_NEWLINE);
280 vty_out_rate_ctr_group_fmt(vty,
281 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
282 ratectr->mgcp_mdcx_ctr_group);
283 }
284 if (ratectr->all_rtp_conn_stats) {
285 vty_out(vty, " %s:%s",
286 ratectr->all_rtp_conn_stats->desc->group_description,
287 VTY_NEWLINE);
288 vty_out_rate_ctr_group_fmt(vty,
289 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
290 ratectr->all_rtp_conn_stats);
291 }
Philipp Maier889fe7f2020-07-06 17:44:12 +0200292
293 if (ratectr->e1_stats && trunk->trunk_type == MGCP_TRUNK_E1) {
294 vty_out(vty, " %s:%s",
295 ratectr->e1_stats->desc->group_description,
296 VTY_NEWLINE);
297 vty_out_rate_ctr_group_fmt(vty,
298 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
299 ratectr->e1_stats);
300 }
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200301}
302
303
304static void dump_trunk(struct vty *vty, struct mgcp_trunk *trunk, int show_stats)
Stefan Sperling12086582018-06-26 15:26:28 +0200305{
306 int i;
307
308 vty_out(vty, "%s trunk %d with %d endpoints:%s",
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200309 trunk->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
Philipp Maier869b21c2020-07-03 16:04:16 +0200310 trunk->trunk_nr, trunk->number_endpoints, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200311
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200312 if (!trunk->endpoints) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200313 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
314 return;
315 }
316
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200317 for (i = 0; i < trunk->number_endpoints; ++i) {
318 struct mgcp_endpoint *endp = trunk->endpoints[i];
319 dump_endpoint(vty, endp, trunk->trunk_nr, trunk->trunk_type,
320 show_stats);
321 if (i < trunk->number_endpoints - 1)
Stefan Sperling12086582018-06-26 15:26:28 +0200322 vty_out(vty, "%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200323 }
Stefan Sperling1e174872018-10-25 18:36:10 +0200324
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200325 if (show_stats)
Philipp Maier889fe7f2020-07-06 17:44:12 +0200326 dump_ratectr_trunk(vty, trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200327}
328
Stefan Sperling12086582018-06-26 15:26:28 +0200329#define SHOW_MGCP_STR "Display information about the MGCP Media Gateway\n"
330
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200331DEFUN(show_mcgp, show_mgcp_cmd,
332 "show mgcp [stats]",
333 SHOW_STR
Stefan Sperling12086582018-06-26 15:26:28 +0200334 SHOW_MGCP_STR
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200335 "Include Statistics\n")
336{
Philipp Maier14b27a82020-06-02 20:15:30 +0200337 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200338 int show_stats = argc >= 1;
339
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200340 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200341 dump_trunk(vty, trunk, show_stats);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200342
343 if (g_cfg->osmux)
Pau Espin Pedrol8de58e72019-04-24 13:33:46 +0200344 vty_out(vty, "Osmux used CID: %d%s", osmux_cid_pool_count_used(),
Philipp Maier87bd9be2017-08-22 16:35:41 +0200345 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200346
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200347 if (show_stats)
348 dump_ratectr_global(vty, &g_cfg->ratectr);
349
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200350 return CMD_SUCCESS;
351}
352
Stefan Sperling12086582018-06-26 15:26:28 +0200353static void
Philipp Maier14b27a82020-06-02 20:15:30 +0200354dump_mgcp_endpoint(struct vty *vty, struct mgcp_trunk *trunk, const char *epname)
Stefan Sperling12086582018-06-26 15:26:28 +0200355{
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200356 struct mgcp_endpoint *endp;
Stefan Sperling12086582018-06-26 15:26:28 +0200357
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200358 if (trunk) {
359 /* If a trunk is given, search on that specific trunk only */
360 endp = mgcp_endp_by_name_trunk(NULL, epname, trunk);
361 if (!endp) {
362 vty_out(vty, "endpoint %s not configured on trunk %d%s", epname, trunk->trunk_nr, VTY_NEWLINE);
363 return;
364 }
365 } else {
366 /* If no trunk is given, search on all possible trunks */
367 endp = mgcp_endp_by_name(NULL, epname, g_cfg);
368 if (!endp) {
369 vty_out(vty, "endpoint %s not configured%s", epname, VTY_NEWLINE);
370 return;
Stefan Sperling12086582018-06-26 15:26:28 +0200371 }
372 }
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200373
374 trunk = endp->trunk;
375 dump_endpoint(vty, endp, trunk->trunk_nr, trunk->trunk_type, true);
Stefan Sperling12086582018-06-26 15:26:28 +0200376}
377
378DEFUN(show_mcgp_endpoint, show_mgcp_endpoint_cmd,
379 "show mgcp endpoint NAME",
380 SHOW_STR
381 SHOW_MGCP_STR
382 "Display information about an endpoint\n" "The name of the endpoint\n")
383{
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200384 dump_mgcp_endpoint(vty, NULL, argv[0]);
Stefan Sperling12086582018-06-26 15:26:28 +0200385 return CMD_SUCCESS;
386}
387
388DEFUN(show_mcgp_trunk_endpoint, show_mgcp_trunk_endpoint_cmd,
389 "show mgcp trunk <0-64> endpoint NAME",
390 SHOW_STR
391 SHOW_MGCP_STR
392 "Display information about a trunk\n" "Trunk number\n"
393 "Display information about an endpoint\n" "The name of the endpoint\n")
394{
Philipp Maier14b27a82020-06-02 20:15:30 +0200395 struct mgcp_trunk *trunk;
Stefan Sperling12086582018-06-26 15:26:28 +0200396 int trunkidx = atoi(argv[0]);
397
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200398 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, trunkidx);
Stefan Sperling12086582018-06-26 15:26:28 +0200399 if (!trunk) {
400 vty_out(vty, "trunk %d not found%s", trunkidx, VTY_NEWLINE);
401 return CMD_WARNING;
402 }
403
404 dump_mgcp_endpoint(vty, trunk, argv[1]);
405 return CMD_SUCCESS;
406}
407
Philipp Maier87bd9be2017-08-22 16:35:41 +0200408DEFUN(cfg_mgcp, cfg_mgcp_cmd, "mgcp", "Configure the MGCP")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200409{
410 vty->node = MGCP_NODE;
411 return CMD_SUCCESS;
412}
413
Philipp Maier19c430f2020-09-22 15:52:50 +0200414DEFUN_USRATTR(cfg_mgcp_local_ip,
415 cfg_mgcp_local_ip_cmd,
416 X(MGW_CMD_ATTR_NEWCONN),
417 "local ip " VTY_IPV46_CMD,
418 "Local options for the SDP record\n"
419 IP_STR
420 "IPv4 Address to use in SDP record\n"
421 "IPv6 Address to use in SDP record\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200422{
423 osmo_talloc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
424 return CMD_SUCCESS;
425}
426
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200427#define BIND_STR "Listen/Bind related socket option\n"
428DEFUN(cfg_mgcp_bind_ip,
429 cfg_mgcp_bind_ip_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200430 "bind ip " VTY_IPV46_CMD,
431 BIND_STR IP_STR
432 "IPv4 Address to bind to\n"
433 "IPv6 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200434{
435 osmo_talloc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
436 return CMD_SUCCESS;
437}
438
439DEFUN(cfg_mgcp_bind_port,
440 cfg_mgcp_bind_port_cmd,
441 "bind port <0-65534>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200442 BIND_STR "Port information\n" "UDP port to listen for MGCP messages\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200443{
444 unsigned int port = atoi(argv[0]);
445 g_cfg->source_port = port;
446 return CMD_SUCCESS;
447}
448
Philipp Maier8cfe7df2020-09-22 16:18:26 +0200449DEFUN_DEPRECATED(cfg_mgcp_bind_early,
450 cfg_mgcp_bind_early_cmd,
451 "bind early (0|1)",
452 BIND_STR
453 "Bind local ports on start up\n" "Bind on demand\n" "Bind on startup\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200454{
Philipp Maier8cfe7df2020-09-22 16:18:26 +0200455 return CMD_SUCCESS;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200456}
457
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200458#define RTP_STR "RTP configuration\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200459#define UDP_PORT_STR "UDP Port number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +0200460#define NET_START_STR "First UDP port allocated\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200461#define RANGE_START_STR "Start of the range of ports\n"
462#define RANGE_END_STR "End of the range of ports\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200463
Philipp Maierf1889d82017-11-08 14:59:39 +0100464DEFUN(cfg_mgcp_rtp_port_range,
465 cfg_mgcp_rtp_port_range_cmd,
Philipp Maiera19547b2018-05-22 13:44:34 +0200466 "rtp port-range <1024-65534> <1025-65535>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200467 RTP_STR "Range of ports to use for the NET side\n"
468 RANGE_START_STR RANGE_END_STR)
469{
Philipp Maiera19547b2018-05-22 13:44:34 +0200470 int start;
471 int end;
472
473 start = atoi(argv[0]);
474 end = atoi(argv[1]);
475
476 if (end < start) {
477 vty_out(vty, "range end port (%i) must be greater than the range start port (%i)!%s",
478 end, start, VTY_NEWLINE);
479 return CMD_WARNING;
480 }
481
482 if (start & 1) {
483 vty_out(vty, "range must begin at an even port number, autocorrecting port (%i) to: %i%s",
484 start, start & 0xFFFE, VTY_NEWLINE);
485 start &= 0xFFFE;
486 }
487
488 if ((end & 1) == 0) {
489 vty_out(vty, "range must end at an odd port number, autocorrecting port (%i) to: %i%s",
490 end, end | 1, VTY_NEWLINE);
491 end |= 1;
492 }
493
494 g_cfg->net_ports.range_start = start;
495 g_cfg->net_ports.range_end = end;
496 g_cfg->net_ports.last_port = g_cfg->net_ports.range_start;
497
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200498 return CMD_SUCCESS;
499}
Philipp Maierf1889d82017-11-08 14:59:39 +0100500ALIAS_DEPRECATED(cfg_mgcp_rtp_port_range,
501 cfg_mgcp_rtp_net_range_cmd,
502 "rtp net-range <0-65534> <0-65534>",
503 RTP_STR "Range of ports to use for the NET side\n"
504 RANGE_START_STR RANGE_END_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200505
Philipp Maier19c430f2020-09-22 15:52:50 +0200506DEFUN_USRATTR(cfg_mgcp_rtp_bind_ip,
507 cfg_mgcp_rtp_bind_ip_cmd,
508 X(MGW_CMD_ATTR_NEWCONN),
509 "rtp bind-ip A.B.C.D",
510 RTP_STR "Bind endpoints facing the Network\n"
511 "IPv4 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200512{
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200513 osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr_v4, argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200514 return CMD_SUCCESS;
515}
Philipp Maierf1889d82017-11-08 14:59:39 +0100516ALIAS_DEPRECATED(cfg_mgcp_rtp_bind_ip,
517 cfg_mgcp_rtp_net_bind_ip_cmd,
518 "rtp net-bind-ip A.B.C.D",
519 RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200520
Philipp Maier19c430f2020-09-22 15:52:50 +0200521DEFUN_USRATTR(cfg_mgcp_rtp_no_bind_ip,
522 cfg_mgcp_rtp_no_bind_ip_cmd,
523 X(MGW_CMD_ATTR_NEWCONN),
524 "no rtp bind-ip",
525 NO_STR RTP_STR "Bind endpoints facing the Network\n"
526 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200527{
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200528 talloc_free(g_cfg->net_ports.bind_addr_v4);
529 g_cfg->net_ports.bind_addr_v4 = NULL;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200530 return CMD_SUCCESS;
531}
Philipp Maierf1889d82017-11-08 14:59:39 +0100532ALIAS_DEPRECATED(cfg_mgcp_rtp_no_bind_ip,
533 cfg_mgcp_rtp_no_net_bind_ip_cmd,
534 "no rtp net-bind-ip",
535 NO_STR RTP_STR "Bind endpoints facing the Network\n"
536 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200537
Philipp Maier19c430f2020-09-22 15:52:50 +0200538DEFUN_USRATTR(cfg_mgcp_rtp_bind_ip_v6,
539 cfg_mgcp_rtp_bind_ip_v6_cmd,
540 X(MGW_CMD_ATTR_NEWCONN),
541 "rtp bind-ip-v6 " VTY_IPV6_CMD,
542 RTP_STR "Bind endpoints facing the Network\n"
543 "IPv6 Address to bind to\n")
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200544{
545 osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr_v6, argv[0]);
546 return CMD_SUCCESS;
547}
548
Philipp Maier19c430f2020-09-22 15:52:50 +0200549DEFUN_USRATTR(cfg_mgcp_rtp_no_bind_ip_v6,
550 cfg_mgcp_rtp_no_bind_ip_v6_cmd,
551 X(MGW_CMD_ATTR_NEWCONN),
552 "no rtp bind-ip-v6",
553 NO_STR RTP_STR "Bind endpoints facing the Network\n"
554 "Address to bind to\n")
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200555{
556 talloc_free(g_cfg->net_ports.bind_addr_v6);
557 g_cfg->net_ports.bind_addr_v6 = NULL;
558 return CMD_SUCCESS;
559}
560
Philipp Maier19c430f2020-09-22 15:52:50 +0200561DEFUN_USRATTR(cfg_mgcp_rtp_net_bind_ip_probing,
562 cfg_mgcp_rtp_net_bind_ip_probing_cmd,
563 X(MGW_CMD_ATTR_NEWCONN),
564 "rtp ip-probing",
565 RTP_STR "automatic rtp bind ip selection\n")
Philipp Maier1cb1e382017-11-02 17:16:04 +0100566{
567 g_cfg->net_ports.bind_addr_probe = true;
568 return CMD_SUCCESS;
569}
570
Philipp Maier19c430f2020-09-22 15:52:50 +0200571DEFUN_USRATTR(cfg_mgcp_rtp_no_net_bind_ip_probing,
572 cfg_mgcp_rtp_no_net_bind_ip_probing_cmd,
573 X(MGW_CMD_ATTR_NEWCONN),
574 "no rtp ip-probing",
575 NO_STR RTP_STR "no automatic rtp bind ip selection\n")
Philipp Maier1cb1e382017-11-02 17:16:04 +0100576{
577 g_cfg->net_ports.bind_addr_probe = false;
578 return CMD_SUCCESS;
579}
580
Philipp Maier19c430f2020-09-22 15:52:50 +0200581DEFUN_USRATTR(cfg_mgcp_rtp_ip_dscp,
582 cfg_mgcp_rtp_ip_dscp_cmd,
583 X(MGW_CMD_ATTR_NEWCONN),
Harald Welte5936a9c2021-04-27 22:30:52 +0200584 "rtp ip-dscp <0-63>",
Philipp Maier19c430f2020-09-22 15:52:50 +0200585 RTP_STR
Harald Welte5936a9c2021-04-27 22:30:52 +0200586 "Use specified DSCP for the audio stream (including Osmux)\n" "The DSCP value\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200587{
588 int dscp = atoi(argv[0]);
589 g_cfg->endp_dscp = dscp;
590 return CMD_SUCCESS;
591}
592
Harald Welte55a92292021-04-28 19:06:34 +0200593DEFUN_USRATTR(cfg_mgcp_rtp_priority,
594 cfg_mgcp_rtp_priority_cmd,
595 X(MGW_CMD_ATTR_NEWCONN),
596 "rtp socket-priority <0-255>",
597 RTP_STR
598 "socket priority (values > 6 require CAP_NET_ADMIN)\n" "socket priority value\n")
599{
600 int prio = atoi(argv[0]);
601 g_cfg->endp_priority = prio;
602 return CMD_SUCCESS;
603}
604
Philipp Maier87bd9be2017-08-22 16:35:41 +0200605#define FORCE_PTIME_STR "Force a fixed ptime for packets sent"
Philipp Maier19c430f2020-09-22 15:52:50 +0200606DEFUN_USRATTR(cfg_mgcp_rtp_force_ptime,
607 cfg_mgcp_rtp_force_ptime_cmd,
608 X(MGW_CMD_ATTR_NEWCONN),
609 "rtp force-ptime (10|20|40)",
610 RTP_STR FORCE_PTIME_STR
611 "The required ptime (packet duration) in ms\n" "10 ms\n20 ms\n40 ms\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200612{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200613 g_cfg->force_ptime = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200614 return CMD_SUCCESS;
615}
616
Philipp Maier19c430f2020-09-22 15:52:50 +0200617DEFUN_USRATTR(cfg_mgcp_no_rtp_force_ptime,
618 cfg_mgcp_no_rtp_force_ptime_cmd,
619 X(MGW_CMD_ATTR_NEWCONN),
620 "no rtp force-ptime", NO_STR RTP_STR FORCE_PTIME_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200621{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200622 g_cfg->force_ptime = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200623 return CMD_SUCCESS;
624}
625
Philipp Maier19c430f2020-09-22 15:52:50 +0200626DEFUN_USRATTR(cfg_mgcp_sdp_fmtp_extra,
627 cfg_mgcp_sdp_fmtp_extra_cmd,
628 X(MGW_CMD_ATTR_NEWCONN),
629 "sdp audio fmtp-extra .NAME",
630 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
631 "Extra Information\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200632{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200633 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200634 OSMO_ASSERT(trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200635 char *txt = argv_concat(argv, argc, 0);
636 if (!txt)
637 return CMD_WARNING;
638
Philipp Maierd19de2e2020-06-03 13:55:33 +0200639 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200640 talloc_free(txt);
641 return CMD_SUCCESS;
642}
643
Philipp Maier19c430f2020-09-22 15:52:50 +0200644DEFUN_USRATTR(cfg_mgcp_allow_transcoding,
645 cfg_mgcp_allow_transcoding_cmd,
646 X(MGW_CMD_ATTR_NEWCONN),
647 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200648{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200649 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200650 OSMO_ASSERT(trunk);
651 trunk->no_audio_transcoding = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200652 return CMD_SUCCESS;
653}
654
Philipp Maier19c430f2020-09-22 15:52:50 +0200655DEFUN_USRATTR(cfg_mgcp_no_allow_transcoding,
656 cfg_mgcp_no_allow_transcoding_cmd,
657 X(MGW_CMD_ATTR_NEWCONN),
658 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200659{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200660 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200661 OSMO_ASSERT(trunk);
662 trunk->no_audio_transcoding = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200663 return CMD_SUCCESS;
664}
665
666#define SDP_STR "SDP File related options\n"
667#define AUDIO_STR "Audio payload options\n"
Philipp Maier7f90ddb2020-06-02 21:52:53 +0200668DEFUN_DEPRECATED(cfg_mgcp_sdp_payload_number,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200669 cfg_mgcp_sdp_payload_number_cmd,
670 "sdp audio-payload number <0-255>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200671 SDP_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200672{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200673 return CMD_SUCCESS;
674}
675
Philipp Maier87bd9be2017-08-22 16:35:41 +0200676ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number,
677 cfg_mgcp_sdp_payload_number_cmd_old,
678 "sdp audio payload number <0-255>",
679 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200680
Philipp Maier7f90ddb2020-06-02 21:52:53 +0200681DEFUN_DEPRECATED(cfg_mgcp_sdp_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200682 cfg_mgcp_sdp_payload_name_cmd,
683 "sdp audio-payload name NAME",
684 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
685{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200686 return CMD_SUCCESS;
687}
688
689ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200690 "sdp audio payload name NAME",
691 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200692
Philipp Maier19c430f2020-09-22 15:52:50 +0200693DEFUN_USRATTR(cfg_mgcp_sdp_payload_send_ptime,
694 cfg_mgcp_sdp_payload_send_ptime_cmd,
695 X(MGW_CMD_ATTR_NEWCONN),
696 "sdp audio-payload send-ptime",
697 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200698{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200699 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200700 OSMO_ASSERT(trunk);
701 trunk->audio_send_ptime = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200702 return CMD_SUCCESS;
703}
704
Philipp Maier19c430f2020-09-22 15:52:50 +0200705DEFUN_USRATTR(cfg_mgcp_no_sdp_payload_send_ptime,
706 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
707 X(MGW_CMD_ATTR_NEWCONN),
708 "no sdp audio-payload send-ptime",
709 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200710{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200711 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200712 OSMO_ASSERT(trunk);
713 trunk->audio_send_ptime = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200714 return CMD_SUCCESS;
715}
716
Philipp Maier19c430f2020-09-22 15:52:50 +0200717DEFUN_USRATTR(cfg_mgcp_sdp_payload_send_name,
718 cfg_mgcp_sdp_payload_send_name_cmd,
719 X(MGW_CMD_ATTR_NEWCONN),
720 "sdp audio-payload send-name",
721 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200722{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200723 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200724 OSMO_ASSERT(trunk);
725 trunk->audio_send_name = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200726 return CMD_SUCCESS;
727}
728
Philipp Maier19c430f2020-09-22 15:52:50 +0200729DEFUN_USRATTR(cfg_mgcp_no_sdp_payload_send_name,
730 cfg_mgcp_no_sdp_payload_send_name_cmd,
731 X(MGW_CMD_ATTR_NEWCONN),
732 "no sdp audio-payload send-name",
733 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200734{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200735 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200736 OSMO_ASSERT(trunk);
737 trunk->audio_send_name = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200738 return CMD_SUCCESS;
739}
740
Philipp Maierba94b6d2020-09-22 16:14:32 +0200741DEFUN_DEPRECATED(cfg_mgcp_loop,
742 cfg_mgcp_loop_cmd,
743 "loop (0|1)",
744 "Loop audio for all endpoints on main trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200745{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200746 return CMD_SUCCESS;
747}
748
Philipp Maier19c430f2020-09-22 15:52:50 +0200749DEFUN_USRATTR(cfg_mgcp_force_realloc,
750 cfg_mgcp_force_realloc_cmd,
751 X(MGW_CMD_ATTR_NEWCONN),
752 "force-realloc (0|1)",
753 "Force endpoint reallocation when the endpoint is still seized\n"
754 "Don't force reallocation\n" "force reallocation\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200755{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200756 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200757 OSMO_ASSERT(trunk);
758 trunk->force_realloc = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200759 return CMD_SUCCESS;
760}
761
Philipp Maier19c430f2020-09-22 15:52:50 +0200762DEFUN_ATTR(cfg_mgcp_rtp_accept_all,
763 cfg_mgcp_rtp_accept_all_cmd,
764 "rtp-accept-all (0|1)",
765 "Accept all RTP packets, even when the originating IP/Port does not match\n"
766 "enable filter\n" "disable filter\n",
767 CMD_ATTR_IMMEDIATE)
Philipp Maier87bd9be2017-08-22 16:35:41 +0200768{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200769 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200770 OSMO_ASSERT(trunk);
771 trunk->rtp_accept_all = atoi(argv[0]);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200772 return CMD_SUCCESS;
773}
774
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200775DEFUN(cfg_mgcp_number_endp,
776 cfg_mgcp_number_endp_cmd,
Philipp Maier869b21c2020-07-03 16:04:16 +0200777 "number endpoints <1-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200778 "Number options\n" "Endpoints available\n" "Number endpoints\n")
779{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200780 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200781 OSMO_ASSERT(trunk);
Philipp Maier889fe7f2020-07-06 17:44:12 +0200782 trunk->v.vty_number_endpoints = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200783 return CMD_SUCCESS;
784}
785
Philipp Maier19c430f2020-09-22 15:52:50 +0200786DEFUN_ATTR(cfg_mgcp_omit_rtcp,
787 cfg_mgcp_omit_rtcp_cmd,
788 "rtcp-omit", RTCP_OMIT_STR,
789 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200790{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200791 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200792 trunk->omit_rtcp = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200793 return CMD_SUCCESS;
794}
795
Philipp Maier19c430f2020-09-22 15:52:50 +0200796DEFUN_ATTR(cfg_mgcp_no_omit_rtcp,
797 cfg_mgcp_no_omit_rtcp_cmd,
798 "no rtcp-omit",
799 NO_STR RTCP_OMIT_STR,
800 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200801{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200802 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200803 OSMO_ASSERT(trunk);
804 trunk->omit_rtcp = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200805 return CMD_SUCCESS;
806}
807
Philipp Maier19c430f2020-09-22 15:52:50 +0200808DEFUN_USRATTR(cfg_mgcp_patch_rtp_ssrc,
809 cfg_mgcp_patch_rtp_ssrc_cmd,
810 X(MGW_CMD_ATTR_NEWCONN),
811 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200812{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200813 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200814 OSMO_ASSERT(trunk);
815 trunk->force_constant_ssrc = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200816 return CMD_SUCCESS;
817}
818
Philipp Maier19c430f2020-09-22 15:52:50 +0200819DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_ssrc,
820 cfg_mgcp_no_patch_rtp_ssrc_cmd,
821 X(MGW_CMD_ATTR_NEWCONN),
822 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200823{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200824 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200825 OSMO_ASSERT(trunk);
826 trunk->force_constant_ssrc = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200827 return CMD_SUCCESS;
828}
829
Philipp Maier19c430f2020-09-22 15:52:50 +0200830DEFUN_USRATTR(cfg_mgcp_patch_rtp_ts,
831 cfg_mgcp_patch_rtp_ts_cmd,
832 X(MGW_CMD_ATTR_NEWCONN),
833 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200834{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200835 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200836 OSMO_ASSERT(trunk);
837 trunk->force_aligned_timing = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200838 return CMD_SUCCESS;
839}
840
Philipp Maier19c430f2020-09-22 15:52:50 +0200841DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_ts,
842 cfg_mgcp_no_patch_rtp_ts_cmd,
843 X(MGW_CMD_ATTR_NEWCONN),
844 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200845{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200846 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200847 OSMO_ASSERT(trunk);
848 trunk->force_aligned_timing = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200849 return CMD_SUCCESS;
850}
851
Philipp Maier19c430f2020-09-22 15:52:50 +0200852DEFUN_USRATTR(cfg_mgcp_patch_rtp_rfc5993hr,
853 cfg_mgcp_patch_rtp_rfc5993hr_cmd,
854 X(MGW_CMD_ATTR_NEWCONN),
855 "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +0100856{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200857 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200858 OSMO_ASSERT(trunk);
859 trunk->rfc5993_hr_convert = true;
Philipp Maier9fc8a022019-02-20 12:26:52 +0100860 return CMD_SUCCESS;
861}
862
Philipp Maier19c430f2020-09-22 15:52:50 +0200863DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_rfc5993hr,
864 cfg_mgcp_no_patch_rtp_rfc5993hr_cmd,
865 X(MGW_CMD_ATTR_NEWCONN),
866 "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +0100867{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200868 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200869 OSMO_ASSERT(trunk);
870 trunk->rfc5993_hr_convert = false;
Philipp Maier9fc8a022019-02-20 12:26:52 +0100871 return CMD_SUCCESS;
872}
873
Philipp Maier19c430f2020-09-22 15:52:50 +0200874DEFUN_USRATTR(cfg_mgcp_no_patch_rtp,
875 cfg_mgcp_no_patch_rtp_cmd,
876 X(MGW_CMD_ATTR_NEWCONN),
877 "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200878{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200879 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200880 OSMO_ASSERT(trunk);
881 trunk->force_constant_ssrc = 0;
882 trunk->force_aligned_timing = 0;
883 trunk->rfc5993_hr_convert = false;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200884 return CMD_SUCCESS;
885}
886
Philipp Maier19c430f2020-09-22 15:52:50 +0200887DEFUN_ATTR(cfg_mgcp_rtp_keepalive,
888 cfg_mgcp_rtp_keepalive_cmd,
889 "rtp keep-alive <1-120>",
890 RTP_STR RTP_KEEPALIVE_STR "Keep alive interval in secs\n",
891 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200892{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200893 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200894 OSMO_ASSERT(trunk);
895 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200896 return CMD_SUCCESS;
897}
898
Philipp Maier19c430f2020-09-22 15:52:50 +0200899DEFUN_ATTR(cfg_mgcp_rtp_keepalive_once,
900 cfg_mgcp_rtp_keepalive_once_cmd,
901 "rtp keep-alive once",
902 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n",
903 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200904{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200905 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200906 OSMO_ASSERT(trunk);
907 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200908 return CMD_SUCCESS;
909}
910
Philipp Maier19c430f2020-09-22 15:52:50 +0200911DEFUN_ATTR(cfg_mgcp_no_rtp_keepalive,
912 cfg_mgcp_no_rtp_keepalive_cmd,
913 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR,
914 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200915{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200916 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200917 OSMO_ASSERT(trunk);
918 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_NEVER);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200919 return CMD_SUCCESS;
920}
921
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200922#define CALL_AGENT_STR "Call agent information\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200923DEFUN(cfg_mgcp_agent_addr,
924 cfg_mgcp_agent_addr_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200925 "call-agent ip " VTY_IPV46_CMD,
926 CALL_AGENT_STR IP_STR
927 "IPv4 Address of the call agent\n"
928 "IPv6 Address of the call agent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200929{
930 osmo_talloc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
931 return CMD_SUCCESS;
932}
933
934ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200935 "call agent ip A.B.C.D",
936 CALL_AGENT_STR CALL_AGENT_STR IP_STR
937 "IPv4 Address of the callagent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200938
Philipp Maier21be42a2020-05-29 21:39:48 +0200939DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
Philipp Maier0653cc82020-08-10 22:52:51 +0200940 "trunk <0-64>", "Configure a SS7 trunk\n" "Trunk Nr\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200941{
Philipp Maier14b27a82020-06-02 20:15:30 +0200942 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200943 int index = atoi(argv[0]);
944
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200945 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, index);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100946 if (!trunk) {
947 trunk = mgcp_trunk_alloc(g_cfg, MGCP_TRUNK_E1, index);
Philipp Maier2d681fd2020-05-29 16:20:25 +0200948 if (!trunk) {
949 vty_out(vty, "%%Unable to allocate trunk %u.%s",
950 index, VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100951 return CMD_WARNING;
Philipp Maier2d681fd2020-05-29 16:20:25 +0200952 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200953 }
954
955 vty->node = TRUNK_NODE;
956 vty->index = trunk;
957 return CMD_SUCCESS;
958}
959
960static int config_write_trunk(struct vty *vty)
961{
Philipp Maier14b27a82020-06-02 20:15:30 +0200962 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200963
964 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
Philipp Maierd19de2e2020-06-03 13:55:33 +0200965
966 /* Due to historical reasons, the virtual trunk is configured
967 using separate VTY parameters, so we omit writing the trunk
968 config of trunk 0 here. The configuration for the virtual
969 trunk is written by config_write_mgcp(). */
970
Philipp Maier31682a32020-11-26 00:39:35 +0100971 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL
972 && trunk->trunk_nr == MGCP_VIRT_TRUNK_ID)
Philipp Maierd19de2e2020-06-03 13:55:33 +0200973 continue;
974
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200975 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Philipp Maier889fe7f2020-07-06 17:44:12 +0200976 vty_out(vty, " line %u%s", trunk->e1.vty_line_nr, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200977 vty_out(vty, " %ssdp audio-payload send-ptime%s",
978 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
979 vty_out(vty, " %ssdp audio-payload send-name%s",
980 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
981
982 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
983 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
984 else if (trunk->keepalive_interval)
985 vty_out(vty, " rtp keep-alive %d%s",
986 trunk->keepalive_interval, VTY_NEWLINE);
987 else
988 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200989 vty_out(vty, " force-realloc %d%s",
990 trunk->force_realloc, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200991 vty_out(vty, " rtp-accept-all %d%s",
992 trunk->rtp_accept_all, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200993 if (trunk->omit_rtcp)
994 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
995 else
996 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Philipp Maier9fc8a022019-02-20 12:26:52 +0100997 if (trunk->force_constant_ssrc || trunk->force_aligned_timing
Philipp Maierd19de2e2020-06-03 13:55:33 +0200998 || trunk->rfc5993_hr_convert) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200999 vty_out(vty, " %srtp-patch ssrc%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001000 trunk->force_constant_ssrc ? "" : "no ",
1001 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001002 vty_out(vty, " %srtp-patch timestamp%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001003 trunk->force_aligned_timing ? "" : "no ",
1004 VTY_NEWLINE);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001005 vty_out(vty, " %srtp-patch rfc5993hr%s",
1006 trunk->rfc5993_hr_convert ? "" : "no ",
1007 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001008 } else
1009 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
1010 if (trunk->audio_fmtp_extra)
1011 vty_out(vty, " sdp audio fmtp-extra %s%s",
1012 trunk->audio_fmtp_extra, VTY_NEWLINE);
1013 vty_out(vty, " %sallow-transcoding%s",
1014 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
1015 }
1016
1017 return CMD_SUCCESS;
1018}
1019
Philipp Maier19c430f2020-09-22 15:52:50 +02001020DEFUN_USRATTR(cfg_trunk_sdp_fmtp_extra,
1021 cfg_trunk_sdp_fmtp_extra_cmd,
1022 X(MGW_CMD_ATTR_NEWCONN),
1023 "sdp audio fmtp-extra .NAME",
1024 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
1025 "Extra Information\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001026{
Philipp Maier14b27a82020-06-02 20:15:30 +02001027 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001028 char *txt = argv_concat(argv, argc, 0);
1029 if (!txt)
1030 return CMD_WARNING;
1031
1032 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
1033 talloc_free(txt);
1034 return CMD_SUCCESS;
1035}
1036
Philipp Maier7f90ddb2020-06-02 21:52:53 +02001037DEFUN_DEPRECATED(cfg_trunk_payload_number,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001038 cfg_trunk_payload_number_cmd,
1039 "sdp audio-payload number <0-255>",
1040 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
1041{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001042 return CMD_SUCCESS;
1043}
1044
1045ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001046 "sdp audio payload number <0-255>",
1047 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001048
Philipp Maier7f90ddb2020-06-02 21:52:53 +02001049DEFUN_DEPRECATED(cfg_trunk_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001050 cfg_trunk_payload_name_cmd,
1051 "sdp audio-payload name NAME",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001052 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001053{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001054 return CMD_SUCCESS;
1055}
1056
1057ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001058 "sdp audio payload name NAME",
1059 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001060
Philipp Maierba94b6d2020-09-22 16:14:32 +02001061DEFUN_DEPRECATED(cfg_trunk_loop,
1062 cfg_trunk_loop_cmd,
1063 "loop (0|1)",
1064 "Loop audio for all endpoints on this trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001065{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001066 return CMD_SUCCESS;
1067}
1068
Philipp Maier41425e92020-11-26 00:41:59 +01001069DEFUN_USRATTR(cfg_trunk_force_realloc,
1070 cfg_trunk_force_realloc_cmd,
1071 X(MGW_CMD_ATTR_NEWCONN),
1072 "force-realloc (0|1)",
1073 "Force endpoint reallocation when the endpoint is still seized\n"
1074 "Don't force reallocation\n" "force reallocation\n")
1075{
1076 struct mgcp_trunk *trunk = vty->index;
1077 OSMO_ASSERT(trunk);
1078 trunk->force_realloc = atoi(argv[0]);
1079 return CMD_SUCCESS;
1080}
1081
1082DEFUN_ATTR(cfg_trunk_rtp_accept_all,
1083 cfg_trunk_rtp_accept_all_cmd,
1084 "rtp-accept-all (0|1)",
1085 "Accept all RTP packets, even when the originating IP/Port does not match\n"
1086 "enable filter\n" "disable filter\n",
1087 CMD_ATTR_IMMEDIATE)
1088{
1089 struct mgcp_trunk *trunk = vty->index;
1090 OSMO_ASSERT(trunk);
1091 trunk->rtp_accept_all = atoi(argv[0]);
1092 return CMD_SUCCESS;
1093}
1094
Philipp Maier19c430f2020-09-22 15:52:50 +02001095DEFUN_USRATTR(cfg_trunk_sdp_payload_send_ptime,
1096 cfg_trunk_sdp_payload_send_ptime_cmd,
1097 X(MGW_CMD_ATTR_NEWCONN),
1098 "sdp audio-payload send-ptime",
1099 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001100{
Philipp Maier14b27a82020-06-02 20:15:30 +02001101 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001102 trunk->audio_send_ptime = 1;
1103 return CMD_SUCCESS;
1104}
1105
Philipp Maier19c430f2020-09-22 15:52:50 +02001106DEFUN_USRATTR(cfg_trunk_no_sdp_payload_send_ptime,
1107 cfg_trunk_no_sdp_payload_send_ptime_cmd,
1108 X(MGW_CMD_ATTR_NEWCONN),
1109 "no sdp audio-payload send-ptime",
1110 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001111{
Philipp Maier14b27a82020-06-02 20:15:30 +02001112 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001113 trunk->audio_send_ptime = 0;
1114 return CMD_SUCCESS;
1115}
1116
Philipp Maier19c430f2020-09-22 15:52:50 +02001117DEFUN_USRATTR(cfg_trunk_sdp_payload_send_name,
1118 cfg_trunk_sdp_payload_send_name_cmd,
1119 X(MGW_CMD_ATTR_NEWCONN),
1120 "sdp audio-payload send-name",
1121 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001122{
Philipp Maier14b27a82020-06-02 20:15:30 +02001123 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001124 trunk->audio_send_name = 1;
1125 return CMD_SUCCESS;
1126}
1127
Philipp Maier19c430f2020-09-22 15:52:50 +02001128DEFUN_USRATTR(cfg_trunk_no_sdp_payload_send_name,
1129 cfg_trunk_no_sdp_payload_send_name_cmd,
1130 X(MGW_CMD_ATTR_NEWCONN),
1131 "no sdp audio-payload send-name",
1132 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001133{
Philipp Maier14b27a82020-06-02 20:15:30 +02001134 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001135 trunk->audio_send_name = 0;
1136 return CMD_SUCCESS;
1137}
1138
Philipp Maier19c430f2020-09-22 15:52:50 +02001139DEFUN_ATTR(cfg_trunk_omit_rtcp,
1140 cfg_trunk_omit_rtcp_cmd,
1141 "rtcp-omit", RTCP_OMIT_STR,
1142 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001143{
Philipp Maier14b27a82020-06-02 20:15:30 +02001144 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001145 trunk->omit_rtcp = 1;
1146 return CMD_SUCCESS;
1147}
1148
Philipp Maier19c430f2020-09-22 15:52:50 +02001149DEFUN_ATTR(cfg_trunk_no_omit_rtcp,
1150 cfg_trunk_no_omit_rtcp_cmd,
1151 "no rtcp-omit", NO_STR RTCP_OMIT_STR,
1152 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001153{
Philipp Maier14b27a82020-06-02 20:15:30 +02001154 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001155 trunk->omit_rtcp = 0;
1156 return CMD_SUCCESS;
1157}
1158
Philipp Maier19c430f2020-09-22 15:52:50 +02001159DEFUN_USRATTR(cfg_trunk_patch_rtp_ssrc,
1160 cfg_trunk_patch_rtp_ssrc_cmd,
1161 X(MGW_CMD_ATTR_NEWCONN),
1162 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001163{
Philipp Maier14b27a82020-06-02 20:15:30 +02001164 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001165 trunk->force_constant_ssrc = 1;
1166 return CMD_SUCCESS;
1167}
1168
Philipp Maier19c430f2020-09-22 15:52:50 +02001169DEFUN_USRATTR(cfg_trunk_no_patch_rtp_ssrc,
1170 cfg_trunk_no_patch_rtp_ssrc_cmd,
1171 X(MGW_CMD_ATTR_NEWCONN),
1172 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001173{
Philipp Maier14b27a82020-06-02 20:15:30 +02001174 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001175 trunk->force_constant_ssrc = 0;
1176 return CMD_SUCCESS;
1177}
1178
Philipp Maier19c430f2020-09-22 15:52:50 +02001179DEFUN_USRATTR(cfg_trunk_patch_rtp_ts,
1180 cfg_trunk_patch_rtp_ts_cmd,
1181 X(MGW_CMD_ATTR_NEWCONN),
1182 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001183{
Philipp Maier14b27a82020-06-02 20:15:30 +02001184 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001185 trunk->force_aligned_timing = 1;
1186 return CMD_SUCCESS;
1187}
1188
Philipp Maier19c430f2020-09-22 15:52:50 +02001189DEFUN_USRATTR(cfg_trunk_no_patch_rtp_ts,
1190 cfg_trunk_no_patch_rtp_ts_cmd,
1191 X(MGW_CMD_ATTR_NEWCONN),
1192 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001193{
Philipp Maier14b27a82020-06-02 20:15:30 +02001194 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001195 trunk->force_aligned_timing = 0;
1196 return CMD_SUCCESS;
1197}
1198
Philipp Maier19c430f2020-09-22 15:52:50 +02001199DEFUN_USRATTR(cfg_trunk_patch_rtp_rfc5993hr,
1200 cfg_trunk_patch_rtp_rfc5993hr_cmd,
1201 X(MGW_CMD_ATTR_NEWCONN),
1202 "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +01001203{
Philipp Maier14b27a82020-06-02 20:15:30 +02001204 struct mgcp_trunk *trunk = vty->index;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001205 trunk->rfc5993_hr_convert = true;
1206 return CMD_SUCCESS;
1207}
1208
Philipp Maier19c430f2020-09-22 15:52:50 +02001209DEFUN_USRATTR(cfg_trunk_no_patch_rtp_rfc5993hr,
1210 cfg_trunk_no_patch_rtp_rfc5993hr_cmd,
1211 X(MGW_CMD_ATTR_NEWCONN),
1212 "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +01001213{
Philipp Maier14b27a82020-06-02 20:15:30 +02001214 struct mgcp_trunk *trunk = vty->index;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001215 trunk->rfc5993_hr_convert = false;
1216 return CMD_SUCCESS;
1217}
1218
Philipp Maier19c430f2020-09-22 15:52:50 +02001219DEFUN_USRATTR(cfg_trunk_no_patch_rtp,
1220 cfg_trunk_no_patch_rtp_cmd,
1221 X(MGW_CMD_ATTR_NEWCONN),
1222 "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001223{
Philipp Maier14b27a82020-06-02 20:15:30 +02001224 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001225 trunk->force_constant_ssrc = 0;
1226 trunk->force_aligned_timing = 0;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001227 trunk->rfc5993_hr_convert = false;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001228 return CMD_SUCCESS;
1229}
1230
Philipp Maier19c430f2020-09-22 15:52:50 +02001231DEFUN_ATTR(cfg_trunk_rtp_keepalive,
1232 cfg_trunk_rtp_keepalive_cmd,
1233 "rtp keep-alive <1-120>",
1234 RTP_STR RTP_KEEPALIVE_STR "Keep-alive interval in secs\n",
1235 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001236{
Philipp Maier14b27a82020-06-02 20:15:30 +02001237 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001238 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
1239 return CMD_SUCCESS;
1240}
1241
Philipp Maier19c430f2020-09-22 15:52:50 +02001242DEFUN_ATTR(cfg_trunk_rtp_keepalive_once,
1243 cfg_trunk_rtp_keepalive_once_cmd,
1244 "rtp keep-alive once",
1245 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n",
1246 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001247{
Philipp Maier14b27a82020-06-02 20:15:30 +02001248 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001249 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
1250 return CMD_SUCCESS;
1251}
1252
Philipp Maier19c430f2020-09-22 15:52:50 +02001253DEFUN_ATTR(cfg_trunk_no_rtp_keepalive,
1254 cfg_trunk_no_rtp_keepalive_cmd,
1255 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR,
1256 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001257{
Philipp Maier14b27a82020-06-02 20:15:30 +02001258 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001259 mgcp_trunk_set_keepalive(trunk, 0);
1260 return CMD_SUCCESS;
1261}
1262
Philipp Maier19c430f2020-09-22 15:52:50 +02001263DEFUN_USRATTR(cfg_trunk_allow_transcoding,
1264 cfg_trunk_allow_transcoding_cmd,
1265 X(MGW_CMD_ATTR_NEWCONN),
1266 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001267{
Philipp Maier14b27a82020-06-02 20:15:30 +02001268 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001269 trunk->no_audio_transcoding = 0;
1270 return CMD_SUCCESS;
1271}
1272
Philipp Maier19c430f2020-09-22 15:52:50 +02001273DEFUN_USRATTR(cfg_trunk_no_allow_transcoding,
1274 cfg_trunk_no_allow_transcoding_cmd,
1275 X(MGW_CMD_ATTR_NEWCONN),
1276 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001277{
Philipp Maier14b27a82020-06-02 20:15:30 +02001278 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001279 trunk->no_audio_transcoding = 1;
1280 return CMD_SUCCESS;
1281}
1282
Philipp Maier889fe7f2020-07-06 17:44:12 +02001283#define LINE_STR "Configure trunk for given Line\nE1/T1 Line Number\n"
1284
1285DEFUN(cfg_trunk_line,
1286 cfg_trunk_line_cmd,
1287 "line <0-255>",
1288 LINE_STR)
1289{
1290 struct mgcp_trunk *trunk = vty->index;
1291 int line_nr = atoi(argv[0]);
1292 trunk->e1.vty_line_nr = line_nr;
1293 return CMD_SUCCESS;
1294}
1295
Philipp Maier87bd9be2017-08-22 16:35:41 +02001296DEFUN(loop_conn,
1297 loop_conn_cmd,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001298 "loop-endpoint <0-64> NAME (0|1)",
1299 "Loop a given endpoint\n" "Trunk number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +02001300 "The name in hex of the endpoint\n" "Disable the loop\n"
1301 "Enable the loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001302{
Philipp Maier14b27a82020-06-02 20:15:30 +02001303 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001304 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +02001305 struct mgcp_conn *conn;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001306
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001307 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001308 if (!trunk) {
1309 vty_out(vty, "%%Trunk %d not found in the config.%s",
1310 atoi(argv[0]), VTY_NEWLINE);
1311 return CMD_WARNING;
1312 }
1313
1314 if (!trunk->endpoints) {
1315 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1316 trunk->trunk_nr, VTY_NEWLINE);
1317 return CMD_WARNING;
1318 }
1319
1320 int endp_no = strtoul(argv[1], NULL, 16);
1321 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1322 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001323 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001324 return CMD_WARNING;
1325 }
1326
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001327 endp = trunk->endpoints[endp_no];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001328 int loop = atoi(argv[2]);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001329 llist_for_each_entry(conn, &endp->conns, entry) {
1330 if (conn->type == MGCP_CONN_TYPE_RTP)
1331 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1332 mgcp_rtp_end_config(endp, 1, &conn->u.rtp.end);
1333 else {
1334 /* FIXME: Introduce support for other connection (E1)
1335 * types when implementation is available */
1336 vty_out(vty, "%%Can't enable SSRC patching,"
1337 "connection %s is not an RTP connection.%s",
1338 mgcp_conn_dump(conn), VTY_NEWLINE);
1339 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001340
Philipp Maier87bd9be2017-08-22 16:35:41 +02001341 if (loop)
1342 conn->mode = MGCP_CONN_LOOPBACK;
1343 else
1344 conn->mode = conn->mode_orig;
1345 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001346
1347 return CMD_SUCCESS;
1348}
1349
Philipp Maier87bd9be2017-08-22 16:35:41 +02001350DEFUN(tap_rtp,
1351 tap_rtp_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001352 "tap-rtp <0-64> ENDPOINT CONN (in|out) " VTY_IPV46_CMD " <0-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001353 "Forward data on endpoint to a different system\n" "Trunk number\n"
1354 "The endpoint in hex\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +02001355 "The connection id in hex\n"
1356 "Forward incoming data\n"
1357 "Forward leaving data\n"
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001358 "Destination IPv4 of the data\n"
1359 "Destination IPv6 of the data\n"
1360 "Destination port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001361{
1362 struct mgcp_rtp_tap *tap;
Philipp Maier14b27a82020-06-02 20:15:30 +02001363 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001364 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +02001365 struct mgcp_conn_rtp *conn;
Philipp Maier01d24a32017-11-21 17:26:09 +01001366 const char *conn_id = NULL;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001367
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001368 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001369 if (!trunk) {
1370 vty_out(vty, "%%Trunk %d not found in the config.%s",
1371 atoi(argv[0]), VTY_NEWLINE);
1372 return CMD_WARNING;
1373 }
1374
1375 if (!trunk->endpoints) {
1376 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1377 trunk->trunk_nr, VTY_NEWLINE);
1378 return CMD_WARNING;
1379 }
1380
1381 int endp_no = strtoul(argv[1], NULL, 16);
1382 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1383 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001384 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001385 return CMD_WARNING;
1386 }
1387
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001388 endp = trunk->endpoints[endp_no];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001389
Philipp Maier01d24a32017-11-21 17:26:09 +01001390 conn_id = argv[2];
Philipp Maier87bd9be2017-08-22 16:35:41 +02001391 conn = mgcp_conn_get_rtp(endp, conn_id);
1392 if (!conn) {
Philipp Maier01d24a32017-11-21 17:26:09 +01001393 vty_out(vty, "Conn ID %s is invalid.%s",
1394 conn_id, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001395 return CMD_WARNING;
1396 }
1397
1398 if (strcmp(argv[3], "in") == 0)
1399 tap = &conn->tap_in;
1400 else if (strcmp(argv[3], "out") == 0)
1401 tap = &conn->tap_out;
1402 else {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001403 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1404 return CMD_WARNING;
1405 }
1406
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001407 memset(&tap->forward, 0, sizeof(tap->forward));
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001408
1409 tap->forward.u.sa.sa_family = osmo_ip_str_type(argv[4]);
1410 switch (tap->forward.u.sa.sa_family) {
1411 case AF_INET:
1412 if (inet_pton(AF_INET, argv[4], &tap->forward.u.sin.sin_addr) != 1)
1413 return CMD_WARNING;
1414 tap->forward.u.sin.sin_port = htons(atoi(argv[5]));
1415 break;
1416 case AF_INET6:
1417 if (inet_pton(AF_INET6, argv[4], &tap->forward.u.sin6.sin6_addr) != 1)
1418 return CMD_WARNING;
1419 tap->forward.u.sin6.sin6_port = htons(atoi(argv[5]));
1420 break;
1421 default:
1422 return CMD_WARNING;
1423 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001424 tap->enabled = 1;
1425 return CMD_SUCCESS;
1426}
1427
1428DEFUN(free_endp, free_endp_cmd,
1429 "free-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001430 "Free the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001431{
Philipp Maier14b27a82020-06-02 20:15:30 +02001432 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001433 struct mgcp_endpoint *endp;
1434
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001435 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001436 if (!trunk) {
1437 vty_out(vty, "%%Trunk %d not found in the config.%s",
1438 atoi(argv[0]), VTY_NEWLINE);
1439 return CMD_WARNING;
1440 }
1441
1442 if (!trunk->endpoints) {
1443 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1444 trunk->trunk_nr, VTY_NEWLINE);
1445 return CMD_WARNING;
1446 }
1447
1448 int endp_no = strtoul(argv[1], NULL, 16);
1449 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1450 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001451 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001452 return CMD_WARNING;
1453 }
1454
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001455 endp = trunk->endpoints[endp_no];
Philipp Maier1355d7e2018-02-01 14:30:06 +01001456 mgcp_endp_release(endp);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001457 return CMD_SUCCESS;
1458}
1459
1460DEFUN(reset_endp, reset_endp_cmd,
1461 "reset-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001462 "Reset the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001463{
Philipp Maier14b27a82020-06-02 20:15:30 +02001464 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001465 struct mgcp_endpoint *endp;
1466 int endp_no, rc;
1467
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001468 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001469 if (!trunk) {
1470 vty_out(vty, "%%Trunk %d not found in the config.%s",
1471 atoi(argv[0]), VTY_NEWLINE);
1472 return CMD_WARNING;
1473 }
1474
1475 if (!trunk->endpoints) {
1476 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1477 trunk->trunk_nr, VTY_NEWLINE);
1478 return CMD_WARNING;
1479 }
1480
1481 endp_no = strtoul(argv[1], NULL, 16);
1482 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1483 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001484 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001485 return CMD_WARNING;
1486 }
1487
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001488 endp = trunk->endpoints[endp_no];
1489 rc = mgcp_send_reset_ep(endp);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001490 if (rc < 0) {
1491 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1492 return CMD_WARNING;
1493 }
1494 return CMD_SUCCESS;
1495}
1496
1497DEFUN(reset_all_endp, reset_all_endp_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001498 "reset-all-endpoints", "Reset all endpoints\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001499{
1500 int rc;
1501
1502 rc = mgcp_send_reset_all(g_cfg);
1503 if (rc < 0) {
1504 vty_out(vty, "Error %d during endpoint reset.%s",
1505 rc, VTY_NEWLINE);
1506 return CMD_WARNING;
1507 }
1508 return CMD_SUCCESS;
1509}
1510
1511#define OSMUX_STR "RTP multiplexing\n"
1512DEFUN(cfg_mgcp_osmux,
1513 cfg_mgcp_osmux_cmd,
1514 "osmux (on|off|only)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001515 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001516{
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001517 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +02001518 OSMO_ASSERT(trunk);
1519
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001520 if (strcmp(argv[0], "off") == 0) {
1521 g_cfg->osmux = OSMUX_USAGE_OFF;
1522 return CMD_SUCCESS;
Pau Espin Pedrolb542b042019-04-23 13:09:32 +02001523 } else if (strcmp(argv[0], "on") == 0)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001524 g_cfg->osmux = OSMUX_USAGE_ON;
1525 else if (strcmp(argv[0], "only") == 0)
1526 g_cfg->osmux = OSMUX_USAGE_ONLY;
1527
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001528 return CMD_SUCCESS;
Pau Espin Pedrolb542b042019-04-23 13:09:32 +02001529
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001530}
1531
1532DEFUN(cfg_mgcp_osmux_ip,
1533 cfg_mgcp_osmux_ip_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001534 "osmux bind-ip " VTY_IPV46_CMD,
1535 OSMUX_STR IP_STR
1536 "IPv4 Address to bind to\n"
1537 "IPv6 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001538{
1539 osmo_talloc_replace_string(g_cfg, &g_cfg->osmux_addr, argv[0]);
1540 return CMD_SUCCESS;
1541}
1542
1543DEFUN(cfg_mgcp_osmux_batch_factor,
1544 cfg_mgcp_osmux_batch_factor_cmd,
1545 "osmux batch-factor <1-8>",
1546 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1547{
1548 g_cfg->osmux_batch = atoi(argv[0]);
1549 return CMD_SUCCESS;
1550}
1551
1552DEFUN(cfg_mgcp_osmux_batch_size,
1553 cfg_mgcp_osmux_batch_size_cmd,
1554 "osmux batch-size <1-65535>",
1555 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1556{
1557 g_cfg->osmux_batch_size = atoi(argv[0]);
1558 return CMD_SUCCESS;
1559}
1560
1561DEFUN(cfg_mgcp_osmux_port,
1562 cfg_mgcp_osmux_port_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001563 "osmux port <1-65535>", OSMUX_STR "port\n" "UDP port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001564{
1565 g_cfg->osmux_port = atoi(argv[0]);
1566 return CMD_SUCCESS;
1567}
1568
1569DEFUN(cfg_mgcp_osmux_dummy,
1570 cfg_mgcp_osmux_dummy_cmd,
1571 "osmux dummy (on|off)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001572 OSMUX_STR "Dummy padding\n" "Enable dummy padding\n"
1573 "Disable dummy padding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001574{
1575 if (strcmp(argv[0], "on") == 0)
1576 g_cfg->osmux_dummy = 1;
1577 else if (strcmp(argv[0], "off") == 0)
1578 g_cfg->osmux_dummy = 0;
1579
1580 return CMD_SUCCESS;
1581}
1582
Philipp Maier12943ea2018-01-17 15:40:25 +01001583DEFUN(cfg_mgcp_domain,
1584 cfg_mgcp_domain_cmd,
Neels Hofmeyr352eed02018-08-20 23:59:32 +02001585 "domain NAME",
1586 "Set the domain part expected in MGCP messages' endpoint names\n"
1587 "Qualified domain name expected in MGCP endpoint names, or '*' to accept any domain\n")
Philipp Maier12943ea2018-01-17 15:40:25 +01001588{
1589 osmo_strlcpy(g_cfg->domain, argv[0], sizeof(g_cfg->domain));
1590 return CMD_SUCCESS;
1591}
1592
Oliver Smithe36b7752019-01-22 16:31:36 +01001593DEFUN(cfg_mgcp_conn_timeout,
1594 cfg_mgcp_conn_timeout_cmd,
Oliver Smithd2ce4442019-06-26 09:56:44 +02001595 "conn-timeout <0-65534>",
1596 "Set a time after which inactive connections (CIs) are closed. Set to 0 to disable timeout. This can be used to"
1597 " work around interoperability problems causing connections to stay open forever, and slowly exhausting all"
Oliver Smith189f29e2019-06-26 12:08:20 +02001598 " available ports. Enable keep-alive packets in MGW clients when using this option together with LCLS (OsmoBSC,"
1599 " OsmoMSC: 'rtp keep-alive')!\n"
Oliver Smithe36b7752019-01-22 16:31:36 +01001600 "Timeout value (sec.)\n")
1601{
1602 g_cfg->conn_timeout = strtoul(argv[0], NULL, 10);
1603 return CMD_SUCCESS;
1604}
1605
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001606int mgcp_vty_init(void)
1607{
1608 install_element_ve(&show_mgcp_cmd);
Stefan Sperling12086582018-06-26 15:26:28 +02001609 install_element_ve(&show_mgcp_endpoint_cmd);
1610 install_element_ve(&show_mgcp_trunk_endpoint_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001611 install_element(ENABLE_NODE, &loop_conn_cmd);
1612 install_element(ENABLE_NODE, &tap_rtp_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001613 install_element(ENABLE_NODE, &free_endp_cmd);
1614 install_element(ENABLE_NODE, &reset_endp_cmd);
1615 install_element(ENABLE_NODE, &reset_all_endp_cmd);
1616
1617 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1618 install_node(&mgcp_node, config_write_mgcp);
1619
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001620 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001621 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1622 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1623 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001624 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001625 install_element(MGCP_NODE, &cfg_mgcp_rtp_port_range_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001626 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001627 install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_cmd);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +02001628 install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_v6_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001629 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001630 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_cmd);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +02001631 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_v6_cmd);
Philipp Maier1cb1e382017-11-02 17:16:04 +01001632 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_probing_cmd);
1633 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_probing_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001634 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Harald Welte55a92292021-04-28 19:06:34 +02001635 install_element(MGCP_NODE, &cfg_mgcp_rtp_priority_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001636 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1637 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
1638 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1639 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1640 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
1641 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
1642 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001643 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1644 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
1645 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1646 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
1647 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1648 install_element(MGCP_NODE, &cfg_mgcp_force_realloc_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001649 install_element(MGCP_NODE, &cfg_mgcp_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001650 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
1651 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1652 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
1653 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1654 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1655 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1656 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1657 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001658 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_rfc5993hr_cmd);
1659 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_rfc5993hr_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001660 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
1661 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1662 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
1663 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1664 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
1665 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1666 install_element(MGCP_NODE, &cfg_mgcp_osmux_ip_cmd);
1667 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
1668 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
1669 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
1670 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
1671 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1672 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
Philipp Maier12943ea2018-01-17 15:40:25 +01001673 install_element(MGCP_NODE, &cfg_mgcp_domain_cmd);
Oliver Smithe36b7752019-01-22 16:31:36 +01001674 install_element(MGCP_NODE, &cfg_mgcp_conn_timeout_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001675
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001676 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1677 install_node(&trunk_node, config_write_trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001678 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1679 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1680 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
1681 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1682 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
1683 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1684 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
1685 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Philipp Maier41425e92020-11-26 00:41:59 +01001686 install_element(TRUNK_NODE, &cfg_trunk_force_realloc_cmd);
1687 install_element(TRUNK_NODE, &cfg_trunk_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001688 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1689 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
1690 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1691 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1692 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001693 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_rfc5993hr_cmd);
1694 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_rfc5993hr_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001695 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1696 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
1697 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
1698 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1699 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
1700 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1701 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
1702 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1703 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Philipp Maier889fe7f2020-07-06 17:44:12 +02001704 install_element(TRUNK_NODE, &cfg_trunk_line_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001705
1706 return 0;
1707}
1708
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001709int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1710 enum mgcp_role role)
1711{
1712 int rc;
Philipp Maier14b27a82020-06-02 20:15:30 +02001713 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001714
1715 cfg->osmux_port = OSMUX_PORT;
1716 cfg->osmux_batch = 4;
1717 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
1718
1719 g_cfg = cfg;
1720 rc = vty_read_config_file(config_file, NULL);
1721 if (rc < 0) {
Philipp Maier87bd9be2017-08-22 16:35:41 +02001722 fprintf(stderr, "Failed to parse the config file: '%s'\n",
1723 config_file);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001724 return rc;
1725 }
1726
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001727 if (!g_cfg->source_addr) {
1728 fprintf(stderr, "You need to specify a bind address.\n");
1729 return -1;
1730 }
1731
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001732 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
Philipp Maier889fe7f2020-07-06 17:44:12 +02001733 if (mgcp_trunk_equip(trunk) != 0) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001734 LOGP(DLMGCP, LOGL_ERROR,
Philipp Maier48454982017-11-10 16:46:41 +01001735 "Failed to initialize trunk %d (%d endpoints)\n",
1736 trunk->trunk_nr, trunk->number_endpoints);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001737 return -1;
1738 }
1739 }
1740 cfg->role = role;
1741
1742 return 0;
1743}