blob: a05733f482f0e5717f341e9cc119af1ba6aa278e [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);
Eric2764bdb2021-08-23 22:11:47 +020068 if (strlen(g_cfg->local_ip))
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020069 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);
Eric2764bdb2021-08-23 22:11:47 +020075 if (strlen(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);
Eric2764bdb2021-08-23 22:11:47 +020078 if (strlen(g_cfg->net_ports.bind_addr_v6))
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +020079 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);
Eric2764bdb2021-08-23 22:11:47 +0200125 if (strlen(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
Pau Espin Pedrol907744e2021-06-04 17:57:34 +0200172 tx_packets = rate_ctr_group_get_ctr(conn->rate_ctr_group, RTP_PACKETS_TX_CTR);
173 tx_bytes = rate_ctr_group_get_ctr(conn->rate_ctr_group, RTP_OCTETS_TX_CTR);
174 rx_packets = rate_ctr_group_get_ctr(conn->rate_ctr_group, RTP_PACKETS_RX_CTR);
175 rx_bytes = rate_ctr_group_get_ctr(conn->rate_ctr_group, RTP_OCTETS_RX_CTR);
176 dropped_packets = rate_ctr_group_get_ctr(conn->rate_ctr_group, 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,
Philipp Maierd70eef62021-07-19 13:53:28 +0200203 unsigned 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 Maierd70eef62021-07-19 13:53:28 +0200207 vty_out(vty, "%s trunk %u endpoint %s:%s",
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200208 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) {
Ericfbf78d12021-08-23 22:31:39 +0200221 if (endp->trunk->cfg->conn_timeout) {
Oliver Smithe36b7752019-01-22 16:31:36 +0100222 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
Keithfe53edd2021-05-04 15:23:30 -0500304static void dump_trunk(struct vty *vty, struct mgcp_trunk *trunk, int show_stats, int active_only)
Stefan Sperling12086582018-06-26 15:26:28 +0200305{
306 int i;
Keithfe53edd2021-05-04 15:23:30 -0500307 int active_count = 0;
Stefan Sperling12086582018-06-26 15:26:28 +0200308
309 vty_out(vty, "%s trunk %d with %d endpoints:%s",
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200310 trunk->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
Philipp Maier869b21c2020-07-03 16:04:16 +0200311 trunk->trunk_nr, trunk->number_endpoints, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200312
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200313 if (!trunk->endpoints) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200314 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
315 return;
316 }
317
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200318 for (i = 0; i < trunk->number_endpoints; ++i) {
319 struct mgcp_endpoint *endp = trunk->endpoints[i];
Keithfe53edd2021-05-04 15:23:30 -0500320 if (!active_only || !llist_empty(&endp->conns)) {
321 dump_endpoint(vty, endp, trunk->trunk_nr, trunk->trunk_type,
322 show_stats);
323 if (i < trunk->number_endpoints - 1)
324 vty_out(vty, "%s", VTY_NEWLINE);
325 }
326 if (!llist_empty(&endp->conns))
327 active_count++;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200328 }
Stefan Sperling1e174872018-10-25 18:36:10 +0200329
Keithfe53edd2021-05-04 15:23:30 -0500330 if (active_count == 0)
331 vty_out(vty, "No endpoints in use.%s", VTY_NEWLINE);
332
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200333 if (show_stats)
Philipp Maier889fe7f2020-07-06 17:44:12 +0200334 dump_ratectr_trunk(vty, trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200335}
336
Keithfe53edd2021-05-04 15:23:30 -0500337static int mgcp_show(struct vty *vty, int argc, const char **argv,
338 int show_stats, int active_only)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200339{
Philipp Maier14b27a82020-06-02 20:15:30 +0200340 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200341
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200342 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Keithfe53edd2021-05-04 15:23:30 -0500343 dump_trunk(vty, trunk, show_stats, active_only);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200344
345 if (g_cfg->osmux)
Pau Espin Pedrol8de58e72019-04-24 13:33:46 +0200346 vty_out(vty, "Osmux used CID: %d%s", osmux_cid_pool_count_used(),
Philipp Maier87bd9be2017-08-22 16:35:41 +0200347 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200348
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200349 if (show_stats)
350 dump_ratectr_global(vty, &g_cfg->ratectr);
351
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200352 return CMD_SUCCESS;
353}
354
Keithfe53edd2021-05-04 15:23:30 -0500355#define SHOW_MGCP_STR "Display information about the MGCP Media Gateway\n"
356
357DEFUN(show_mgcp, show_mgcp_cmd,
358 "show mgcp [stats]",
359 SHOW_STR
360 SHOW_MGCP_STR
361 "Include statistics\n")
362{
363 int show_stats = argc >= 1;
364 return mgcp_show(vty, argc, argv, show_stats, 0);
365}
366
367DEFUN(show_mgcp_active, show_mgcp_active_cmd,
368 "show mgcp active",
369 SHOW_STR
370 SHOW_MGCP_STR
371 "Show only endpoints with active connections\n")
372{
373 return mgcp_show(vty, argc, argv, 0, 1);
374}
375
Stefan Sperling12086582018-06-26 15:26:28 +0200376static void
Philipp Maier14b27a82020-06-02 20:15:30 +0200377dump_mgcp_endpoint(struct vty *vty, struct mgcp_trunk *trunk, const char *epname)
Stefan Sperling12086582018-06-26 15:26:28 +0200378{
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200379 struct mgcp_endpoint *endp;
Stefan Sperling12086582018-06-26 15:26:28 +0200380
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200381 if (trunk) {
382 /* If a trunk is given, search on that specific trunk only */
383 endp = mgcp_endp_by_name_trunk(NULL, epname, trunk);
384 if (!endp) {
Philipp Maierd70eef62021-07-19 13:53:28 +0200385 vty_out(vty, "endpoint %s not configured on trunk %u%s", epname, trunk->trunk_nr, VTY_NEWLINE);
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200386 return;
387 }
388 } else {
389 /* If no trunk is given, search on all possible trunks */
390 endp = mgcp_endp_by_name(NULL, epname, g_cfg);
391 if (!endp) {
392 vty_out(vty, "endpoint %s not configured%s", epname, VTY_NEWLINE);
393 return;
Stefan Sperling12086582018-06-26 15:26:28 +0200394 }
395 }
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200396
397 trunk = endp->trunk;
398 dump_endpoint(vty, endp, trunk->trunk_nr, trunk->trunk_type, true);
Stefan Sperling12086582018-06-26 15:26:28 +0200399}
400
401DEFUN(show_mcgp_endpoint, show_mgcp_endpoint_cmd,
402 "show mgcp endpoint NAME",
403 SHOW_STR
404 SHOW_MGCP_STR
405 "Display information about an endpoint\n" "The name of the endpoint\n")
406{
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200407 dump_mgcp_endpoint(vty, NULL, argv[0]);
Stefan Sperling12086582018-06-26 15:26:28 +0200408 return CMD_SUCCESS;
409}
410
411DEFUN(show_mcgp_trunk_endpoint, show_mgcp_trunk_endpoint_cmd,
412 "show mgcp trunk <0-64> endpoint NAME",
413 SHOW_STR
414 SHOW_MGCP_STR
415 "Display information about a trunk\n" "Trunk number\n"
416 "Display information about an endpoint\n" "The name of the endpoint\n")
417{
Philipp Maier14b27a82020-06-02 20:15:30 +0200418 struct mgcp_trunk *trunk;
Stefan Sperling12086582018-06-26 15:26:28 +0200419 int trunkidx = atoi(argv[0]);
420
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200421 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, trunkidx);
Stefan Sperling12086582018-06-26 15:26:28 +0200422 if (!trunk) {
423 vty_out(vty, "trunk %d not found%s", trunkidx, VTY_NEWLINE);
424 return CMD_WARNING;
425 }
426
427 dump_mgcp_endpoint(vty, trunk, argv[1]);
428 return CMD_SUCCESS;
429}
430
Philipp Maier87bd9be2017-08-22 16:35:41 +0200431DEFUN(cfg_mgcp, cfg_mgcp_cmd, "mgcp", "Configure the MGCP")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200432{
433 vty->node = MGCP_NODE;
434 return CMD_SUCCESS;
435}
436
Philipp Maier19c430f2020-09-22 15:52:50 +0200437DEFUN_USRATTR(cfg_mgcp_local_ip,
438 cfg_mgcp_local_ip_cmd,
439 X(MGW_CMD_ATTR_NEWCONN),
440 "local ip " VTY_IPV46_CMD,
441 "Local options for the SDP record\n"
442 IP_STR
443 "IPv4 Address to use in SDP record\n"
444 "IPv6 Address to use in SDP record\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200445{
Eric2764bdb2021-08-23 22:11:47 +0200446 osmo_strlcpy(g_cfg->local_ip, argv[0], sizeof(g_cfg->local_ip));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200447 return CMD_SUCCESS;
448}
449
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200450#define BIND_STR "Listen/Bind related socket option\n"
451DEFUN(cfg_mgcp_bind_ip,
452 cfg_mgcp_bind_ip_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200453 "bind ip " VTY_IPV46_CMD,
454 BIND_STR IP_STR
455 "IPv4 Address to bind to\n"
456 "IPv6 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200457{
Eric2764bdb2021-08-23 22:11:47 +0200458 osmo_strlcpy(g_cfg->source_addr, argv[0], sizeof(g_cfg->source_addr));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200459 return CMD_SUCCESS;
460}
461
462DEFUN(cfg_mgcp_bind_port,
463 cfg_mgcp_bind_port_cmd,
464 "bind port <0-65534>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200465 BIND_STR "Port information\n" "UDP port to listen for MGCP messages\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200466{
467 unsigned int port = atoi(argv[0]);
468 g_cfg->source_port = port;
469 return CMD_SUCCESS;
470}
471
Philipp Maier8cfe7df2020-09-22 16:18:26 +0200472DEFUN_DEPRECATED(cfg_mgcp_bind_early,
473 cfg_mgcp_bind_early_cmd,
474 "bind early (0|1)",
475 BIND_STR
476 "Bind local ports on start up\n" "Bind on demand\n" "Bind on startup\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200477{
Philipp Maier8cfe7df2020-09-22 16:18:26 +0200478 return CMD_SUCCESS;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200479}
480
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200481#define RTP_STR "RTP configuration\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200482#define UDP_PORT_STR "UDP Port number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +0200483#define NET_START_STR "First UDP port allocated\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200484#define RANGE_START_STR "Start of the range of ports\n"
485#define RANGE_END_STR "End of the range of ports\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200486
Philipp Maierf1889d82017-11-08 14:59:39 +0100487DEFUN(cfg_mgcp_rtp_port_range,
488 cfg_mgcp_rtp_port_range_cmd,
Philipp Maiera19547b2018-05-22 13:44:34 +0200489 "rtp port-range <1024-65534> <1025-65535>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200490 RTP_STR "Range of ports to use for the NET side\n"
491 RANGE_START_STR RANGE_END_STR)
492{
Philipp Maiera19547b2018-05-22 13:44:34 +0200493 int start;
494 int end;
495
496 start = atoi(argv[0]);
497 end = atoi(argv[1]);
498
499 if (end < start) {
500 vty_out(vty, "range end port (%i) must be greater than the range start port (%i)!%s",
501 end, start, VTY_NEWLINE);
502 return CMD_WARNING;
503 }
504
505 if (start & 1) {
506 vty_out(vty, "range must begin at an even port number, autocorrecting port (%i) to: %i%s",
507 start, start & 0xFFFE, VTY_NEWLINE);
508 start &= 0xFFFE;
509 }
510
511 if ((end & 1) == 0) {
512 vty_out(vty, "range must end at an odd port number, autocorrecting port (%i) to: %i%s",
513 end, end | 1, VTY_NEWLINE);
514 end |= 1;
515 }
516
517 g_cfg->net_ports.range_start = start;
518 g_cfg->net_ports.range_end = end;
519 g_cfg->net_ports.last_port = g_cfg->net_ports.range_start;
520
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200521 return CMD_SUCCESS;
522}
Philipp Maierf1889d82017-11-08 14:59:39 +0100523ALIAS_DEPRECATED(cfg_mgcp_rtp_port_range,
524 cfg_mgcp_rtp_net_range_cmd,
525 "rtp net-range <0-65534> <0-65534>",
526 RTP_STR "Range of ports to use for the NET side\n"
527 RANGE_START_STR RANGE_END_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200528
Philipp Maier19c430f2020-09-22 15:52:50 +0200529DEFUN_USRATTR(cfg_mgcp_rtp_bind_ip,
530 cfg_mgcp_rtp_bind_ip_cmd,
531 X(MGW_CMD_ATTR_NEWCONN),
532 "rtp bind-ip A.B.C.D",
533 RTP_STR "Bind endpoints facing the Network\n"
534 "IPv4 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200535{
Eric2764bdb2021-08-23 22:11:47 +0200536 osmo_strlcpy(g_cfg->net_ports.bind_addr_v4, argv[0], sizeof(g_cfg->net_ports.bind_addr_v4));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200537 return CMD_SUCCESS;
538}
Philipp Maierf1889d82017-11-08 14:59:39 +0100539ALIAS_DEPRECATED(cfg_mgcp_rtp_bind_ip,
540 cfg_mgcp_rtp_net_bind_ip_cmd,
541 "rtp net-bind-ip A.B.C.D",
542 RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200543
Philipp Maier19c430f2020-09-22 15:52:50 +0200544DEFUN_USRATTR(cfg_mgcp_rtp_no_bind_ip,
545 cfg_mgcp_rtp_no_bind_ip_cmd,
546 X(MGW_CMD_ATTR_NEWCONN),
547 "no rtp bind-ip",
548 NO_STR RTP_STR "Bind endpoints facing the Network\n"
549 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200550{
Eric2764bdb2021-08-23 22:11:47 +0200551 osmo_strlcpy(g_cfg->net_ports.bind_addr_v4, "", sizeof(g_cfg->net_ports.bind_addr_v4));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200552 return CMD_SUCCESS;
553}
Philipp Maierf1889d82017-11-08 14:59:39 +0100554ALIAS_DEPRECATED(cfg_mgcp_rtp_no_bind_ip,
555 cfg_mgcp_rtp_no_net_bind_ip_cmd,
556 "no rtp net-bind-ip",
557 NO_STR RTP_STR "Bind endpoints facing the Network\n"
558 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200559
Philipp Maier19c430f2020-09-22 15:52:50 +0200560DEFUN_USRATTR(cfg_mgcp_rtp_bind_ip_v6,
561 cfg_mgcp_rtp_bind_ip_v6_cmd,
562 X(MGW_CMD_ATTR_NEWCONN),
563 "rtp bind-ip-v6 " VTY_IPV6_CMD,
564 RTP_STR "Bind endpoints facing the Network\n"
565 "IPv6 Address to bind to\n")
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200566{
Eric2764bdb2021-08-23 22:11:47 +0200567 osmo_strlcpy(g_cfg->net_ports.bind_addr_v6, argv[0], sizeof(g_cfg->net_ports.bind_addr_v6));
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200568 return CMD_SUCCESS;
569}
570
Philipp Maier19c430f2020-09-22 15:52:50 +0200571DEFUN_USRATTR(cfg_mgcp_rtp_no_bind_ip_v6,
572 cfg_mgcp_rtp_no_bind_ip_v6_cmd,
573 X(MGW_CMD_ATTR_NEWCONN),
574 "no rtp bind-ip-v6",
575 NO_STR RTP_STR "Bind endpoints facing the Network\n"
576 "Address to bind to\n")
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200577{
Eric2764bdb2021-08-23 22:11:47 +0200578 osmo_strlcpy(g_cfg->net_ports.bind_addr_v6, "", sizeof(g_cfg->net_ports.bind_addr_v6));
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200579 return CMD_SUCCESS;
580}
581
Philipp Maier19c430f2020-09-22 15:52:50 +0200582DEFUN_USRATTR(cfg_mgcp_rtp_net_bind_ip_probing,
583 cfg_mgcp_rtp_net_bind_ip_probing_cmd,
584 X(MGW_CMD_ATTR_NEWCONN),
585 "rtp ip-probing",
586 RTP_STR "automatic rtp bind ip selection\n")
Philipp Maier1cb1e382017-11-02 17:16:04 +0100587{
588 g_cfg->net_ports.bind_addr_probe = true;
589 return CMD_SUCCESS;
590}
591
Philipp Maier19c430f2020-09-22 15:52:50 +0200592DEFUN_USRATTR(cfg_mgcp_rtp_no_net_bind_ip_probing,
593 cfg_mgcp_rtp_no_net_bind_ip_probing_cmd,
594 X(MGW_CMD_ATTR_NEWCONN),
595 "no rtp ip-probing",
596 NO_STR RTP_STR "no automatic rtp bind ip selection\n")
Philipp Maier1cb1e382017-11-02 17:16:04 +0100597{
598 g_cfg->net_ports.bind_addr_probe = false;
599 return CMD_SUCCESS;
600}
601
Philipp Maier19c430f2020-09-22 15:52:50 +0200602DEFUN_USRATTR(cfg_mgcp_rtp_ip_dscp,
603 cfg_mgcp_rtp_ip_dscp_cmd,
604 X(MGW_CMD_ATTR_NEWCONN),
Harald Welte5936a9c2021-04-27 22:30:52 +0200605 "rtp ip-dscp <0-63>",
Philipp Maier19c430f2020-09-22 15:52:50 +0200606 RTP_STR
Harald Welte5936a9c2021-04-27 22:30:52 +0200607 "Use specified DSCP for the audio stream (including Osmux)\n" "The DSCP value\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200608{
609 int dscp = atoi(argv[0]);
610 g_cfg->endp_dscp = dscp;
611 return CMD_SUCCESS;
612}
613
Harald Welte55a92292021-04-28 19:06:34 +0200614DEFUN_USRATTR(cfg_mgcp_rtp_priority,
615 cfg_mgcp_rtp_priority_cmd,
616 X(MGW_CMD_ATTR_NEWCONN),
617 "rtp socket-priority <0-255>",
618 RTP_STR
619 "socket priority (values > 6 require CAP_NET_ADMIN)\n" "socket priority value\n")
620{
621 int prio = atoi(argv[0]);
622 g_cfg->endp_priority = prio;
623 return CMD_SUCCESS;
624}
625
Philipp Maier87bd9be2017-08-22 16:35:41 +0200626#define FORCE_PTIME_STR "Force a fixed ptime for packets sent"
Philipp Maier19c430f2020-09-22 15:52:50 +0200627DEFUN_USRATTR(cfg_mgcp_rtp_force_ptime,
628 cfg_mgcp_rtp_force_ptime_cmd,
629 X(MGW_CMD_ATTR_NEWCONN),
630 "rtp force-ptime (10|20|40)",
631 RTP_STR FORCE_PTIME_STR
632 "The required ptime (packet duration) in ms\n" "10 ms\n20 ms\n40 ms\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200633{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200634 g_cfg->force_ptime = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200635 return CMD_SUCCESS;
636}
637
Philipp Maier19c430f2020-09-22 15:52:50 +0200638DEFUN_USRATTR(cfg_mgcp_no_rtp_force_ptime,
639 cfg_mgcp_no_rtp_force_ptime_cmd,
640 X(MGW_CMD_ATTR_NEWCONN),
641 "no rtp force-ptime", NO_STR RTP_STR FORCE_PTIME_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200642{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200643 g_cfg->force_ptime = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200644 return CMD_SUCCESS;
645}
646
Philipp Maier19c430f2020-09-22 15:52:50 +0200647DEFUN_USRATTR(cfg_mgcp_sdp_fmtp_extra,
648 cfg_mgcp_sdp_fmtp_extra_cmd,
649 X(MGW_CMD_ATTR_NEWCONN),
650 "sdp audio fmtp-extra .NAME",
651 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
652 "Extra Information\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200653{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200654 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200655 OSMO_ASSERT(trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200656 char *txt = argv_concat(argv, argc, 0);
657 if (!txt)
658 return CMD_WARNING;
659
Philipp Maierd19de2e2020-06-03 13:55:33 +0200660 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200661 talloc_free(txt);
662 return CMD_SUCCESS;
663}
664
Philipp Maier19c430f2020-09-22 15:52:50 +0200665DEFUN_USRATTR(cfg_mgcp_allow_transcoding,
666 cfg_mgcp_allow_transcoding_cmd,
667 X(MGW_CMD_ATTR_NEWCONN),
668 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200669{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200670 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200671 OSMO_ASSERT(trunk);
672 trunk->no_audio_transcoding = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200673 return CMD_SUCCESS;
674}
675
Philipp Maier19c430f2020-09-22 15:52:50 +0200676DEFUN_USRATTR(cfg_mgcp_no_allow_transcoding,
677 cfg_mgcp_no_allow_transcoding_cmd,
678 X(MGW_CMD_ATTR_NEWCONN),
679 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200680{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200681 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200682 OSMO_ASSERT(trunk);
683 trunk->no_audio_transcoding = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200684 return CMD_SUCCESS;
685}
686
687#define SDP_STR "SDP File related options\n"
688#define AUDIO_STR "Audio payload options\n"
Philipp Maier7f90ddb2020-06-02 21:52:53 +0200689DEFUN_DEPRECATED(cfg_mgcp_sdp_payload_number,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200690 cfg_mgcp_sdp_payload_number_cmd,
691 "sdp audio-payload number <0-255>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200692 SDP_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200693{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200694 return CMD_SUCCESS;
695}
696
Philipp Maier87bd9be2017-08-22 16:35:41 +0200697ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number,
698 cfg_mgcp_sdp_payload_number_cmd_old,
699 "sdp audio payload number <0-255>",
700 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200701
Philipp Maier7f90ddb2020-06-02 21:52:53 +0200702DEFUN_DEPRECATED(cfg_mgcp_sdp_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200703 cfg_mgcp_sdp_payload_name_cmd,
704 "sdp audio-payload name NAME",
705 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
706{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200707 return CMD_SUCCESS;
708}
709
710ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200711 "sdp audio payload name NAME",
712 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200713
Philipp Maier19c430f2020-09-22 15:52:50 +0200714DEFUN_USRATTR(cfg_mgcp_sdp_payload_send_ptime,
715 cfg_mgcp_sdp_payload_send_ptime_cmd,
716 X(MGW_CMD_ATTR_NEWCONN),
717 "sdp audio-payload send-ptime",
718 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200719{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200720 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200721 OSMO_ASSERT(trunk);
722 trunk->audio_send_ptime = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200723 return CMD_SUCCESS;
724}
725
Philipp Maier19c430f2020-09-22 15:52:50 +0200726DEFUN_USRATTR(cfg_mgcp_no_sdp_payload_send_ptime,
727 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
728 X(MGW_CMD_ATTR_NEWCONN),
729 "no sdp audio-payload send-ptime",
730 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200731{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200732 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200733 OSMO_ASSERT(trunk);
734 trunk->audio_send_ptime = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200735 return CMD_SUCCESS;
736}
737
Philipp Maier19c430f2020-09-22 15:52:50 +0200738DEFUN_USRATTR(cfg_mgcp_sdp_payload_send_name,
739 cfg_mgcp_sdp_payload_send_name_cmd,
740 X(MGW_CMD_ATTR_NEWCONN),
741 "sdp audio-payload send-name",
742 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200743{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200744 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200745 OSMO_ASSERT(trunk);
746 trunk->audio_send_name = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200747 return CMD_SUCCESS;
748}
749
Philipp Maier19c430f2020-09-22 15:52:50 +0200750DEFUN_USRATTR(cfg_mgcp_no_sdp_payload_send_name,
751 cfg_mgcp_no_sdp_payload_send_name_cmd,
752 X(MGW_CMD_ATTR_NEWCONN),
753 "no sdp audio-payload send-name",
754 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\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->audio_send_name = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200759 return CMD_SUCCESS;
760}
761
Philipp Maierba94b6d2020-09-22 16:14:32 +0200762DEFUN_DEPRECATED(cfg_mgcp_loop,
763 cfg_mgcp_loop_cmd,
764 "loop (0|1)",
765 "Loop audio for all endpoints on main trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200766{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200767 return CMD_SUCCESS;
768}
769
Philipp Maier19c430f2020-09-22 15:52:50 +0200770DEFUN_USRATTR(cfg_mgcp_force_realloc,
771 cfg_mgcp_force_realloc_cmd,
772 X(MGW_CMD_ATTR_NEWCONN),
773 "force-realloc (0|1)",
774 "Force endpoint reallocation when the endpoint is still seized\n"
775 "Don't force reallocation\n" "force reallocation\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200776{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200777 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200778 OSMO_ASSERT(trunk);
779 trunk->force_realloc = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200780 return CMD_SUCCESS;
781}
782
Philipp Maier19c430f2020-09-22 15:52:50 +0200783DEFUN_ATTR(cfg_mgcp_rtp_accept_all,
784 cfg_mgcp_rtp_accept_all_cmd,
785 "rtp-accept-all (0|1)",
786 "Accept all RTP packets, even when the originating IP/Port does not match\n"
787 "enable filter\n" "disable filter\n",
788 CMD_ATTR_IMMEDIATE)
Philipp Maier87bd9be2017-08-22 16:35:41 +0200789{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200790 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200791 OSMO_ASSERT(trunk);
792 trunk->rtp_accept_all = atoi(argv[0]);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200793 return CMD_SUCCESS;
794}
795
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200796DEFUN(cfg_mgcp_number_endp,
797 cfg_mgcp_number_endp_cmd,
Philipp Maier869b21c2020-07-03 16:04:16 +0200798 "number endpoints <1-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200799 "Number options\n" "Endpoints available\n" "Number endpoints\n")
800{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200801 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200802 OSMO_ASSERT(trunk);
Philipp Maier889fe7f2020-07-06 17:44:12 +0200803 trunk->v.vty_number_endpoints = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200804 return CMD_SUCCESS;
805}
806
Philipp Maier19c430f2020-09-22 15:52:50 +0200807DEFUN_ATTR(cfg_mgcp_omit_rtcp,
808 cfg_mgcp_omit_rtcp_cmd,
809 "rtcp-omit", RTCP_OMIT_STR,
810 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200811{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200812 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200813 trunk->omit_rtcp = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200814 return CMD_SUCCESS;
815}
816
Philipp Maier19c430f2020-09-22 15:52:50 +0200817DEFUN_ATTR(cfg_mgcp_no_omit_rtcp,
818 cfg_mgcp_no_omit_rtcp_cmd,
819 "no rtcp-omit",
820 NO_STR RTCP_OMIT_STR,
821 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200822{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200823 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200824 OSMO_ASSERT(trunk);
825 trunk->omit_rtcp = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200826 return CMD_SUCCESS;
827}
828
Philipp Maier19c430f2020-09-22 15:52:50 +0200829DEFUN_USRATTR(cfg_mgcp_patch_rtp_ssrc,
830 cfg_mgcp_patch_rtp_ssrc_cmd,
831 X(MGW_CMD_ATTR_NEWCONN),
832 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200833{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200834 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200835 OSMO_ASSERT(trunk);
836 trunk->force_constant_ssrc = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200837 return CMD_SUCCESS;
838}
839
Philipp Maier19c430f2020-09-22 15:52:50 +0200840DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_ssrc,
841 cfg_mgcp_no_patch_rtp_ssrc_cmd,
842 X(MGW_CMD_ATTR_NEWCONN),
843 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200844{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200845 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200846 OSMO_ASSERT(trunk);
847 trunk->force_constant_ssrc = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200848 return CMD_SUCCESS;
849}
850
Philipp Maier19c430f2020-09-22 15:52:50 +0200851DEFUN_USRATTR(cfg_mgcp_patch_rtp_ts,
852 cfg_mgcp_patch_rtp_ts_cmd,
853 X(MGW_CMD_ATTR_NEWCONN),
854 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200855{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200856 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200857 OSMO_ASSERT(trunk);
858 trunk->force_aligned_timing = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200859 return CMD_SUCCESS;
860}
861
Philipp Maier19c430f2020-09-22 15:52:50 +0200862DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_ts,
863 cfg_mgcp_no_patch_rtp_ts_cmd,
864 X(MGW_CMD_ATTR_NEWCONN),
865 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200866{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200867 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200868 OSMO_ASSERT(trunk);
869 trunk->force_aligned_timing = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200870 return CMD_SUCCESS;
871}
872
Philipp Maier19c430f2020-09-22 15:52:50 +0200873DEFUN_USRATTR(cfg_mgcp_patch_rtp_rfc5993hr,
874 cfg_mgcp_patch_rtp_rfc5993hr_cmd,
875 X(MGW_CMD_ATTR_NEWCONN),
876 "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +0100877{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200878 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200879 OSMO_ASSERT(trunk);
880 trunk->rfc5993_hr_convert = true;
Philipp Maier9fc8a022019-02-20 12:26:52 +0100881 return CMD_SUCCESS;
882}
883
Philipp Maier19c430f2020-09-22 15:52:50 +0200884DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_rfc5993hr,
885 cfg_mgcp_no_patch_rtp_rfc5993hr_cmd,
886 X(MGW_CMD_ATTR_NEWCONN),
887 "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +0100888{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200889 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200890 OSMO_ASSERT(trunk);
891 trunk->rfc5993_hr_convert = false;
Philipp Maier9fc8a022019-02-20 12:26:52 +0100892 return CMD_SUCCESS;
893}
894
Philipp Maier19c430f2020-09-22 15:52:50 +0200895DEFUN_USRATTR(cfg_mgcp_no_patch_rtp,
896 cfg_mgcp_no_patch_rtp_cmd,
897 X(MGW_CMD_ATTR_NEWCONN),
898 "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200899{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200900 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200901 OSMO_ASSERT(trunk);
902 trunk->force_constant_ssrc = 0;
903 trunk->force_aligned_timing = 0;
904 trunk->rfc5993_hr_convert = false;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200905 return CMD_SUCCESS;
906}
907
Philipp Maier19c430f2020-09-22 15:52:50 +0200908DEFUN_ATTR(cfg_mgcp_rtp_keepalive,
909 cfg_mgcp_rtp_keepalive_cmd,
910 "rtp keep-alive <1-120>",
911 RTP_STR RTP_KEEPALIVE_STR "Keep alive interval in secs\n",
912 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200913{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200914 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200915 OSMO_ASSERT(trunk);
916 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200917 return CMD_SUCCESS;
918}
919
Philipp Maier19c430f2020-09-22 15:52:50 +0200920DEFUN_ATTR(cfg_mgcp_rtp_keepalive_once,
921 cfg_mgcp_rtp_keepalive_once_cmd,
922 "rtp keep-alive once",
923 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n",
924 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200925{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200926 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200927 OSMO_ASSERT(trunk);
928 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200929 return CMD_SUCCESS;
930}
931
Philipp Maier19c430f2020-09-22 15:52:50 +0200932DEFUN_ATTR(cfg_mgcp_no_rtp_keepalive,
933 cfg_mgcp_no_rtp_keepalive_cmd,
934 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR,
935 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200936{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200937 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200938 OSMO_ASSERT(trunk);
939 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_NEVER);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200940 return CMD_SUCCESS;
941}
942
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200943#define CALL_AGENT_STR "Call agent information\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200944DEFUN(cfg_mgcp_agent_addr,
945 cfg_mgcp_agent_addr_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200946 "call-agent ip " VTY_IPV46_CMD,
947 CALL_AGENT_STR IP_STR
948 "IPv4 Address of the call agent\n"
949 "IPv6 Address of the call agent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200950{
Eric2764bdb2021-08-23 22:11:47 +0200951 osmo_strlcpy(g_cfg->call_agent_addr, argv[0], sizeof(g_cfg->call_agent_addr));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200952 return CMD_SUCCESS;
953}
954
955ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200956 "call agent ip A.B.C.D",
957 CALL_AGENT_STR CALL_AGENT_STR IP_STR
958 "IPv4 Address of the callagent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200959
Philipp Maier21be42a2020-05-29 21:39:48 +0200960DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
Philipp Maier0653cc82020-08-10 22:52:51 +0200961 "trunk <0-64>", "Configure a SS7 trunk\n" "Trunk Nr\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200962{
Philipp Maier14b27a82020-06-02 20:15:30 +0200963 struct mgcp_trunk *trunk;
Philipp Maierd70eef62021-07-19 13:53:28 +0200964 unsigned int index = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200965
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200966 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, index);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100967 if (!trunk) {
968 trunk = mgcp_trunk_alloc(g_cfg, MGCP_TRUNK_E1, index);
Philipp Maier2d681fd2020-05-29 16:20:25 +0200969 if (!trunk) {
970 vty_out(vty, "%%Unable to allocate trunk %u.%s",
971 index, VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100972 return CMD_WARNING;
Philipp Maier2d681fd2020-05-29 16:20:25 +0200973 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200974 }
975
976 vty->node = TRUNK_NODE;
977 vty->index = trunk;
978 return CMD_SUCCESS;
979}
980
981static int config_write_trunk(struct vty *vty)
982{
Philipp Maier14b27a82020-06-02 20:15:30 +0200983 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200984
985 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
Philipp Maierd19de2e2020-06-03 13:55:33 +0200986
987 /* Due to historical reasons, the virtual trunk is configured
988 using separate VTY parameters, so we omit writing the trunk
989 config of trunk 0 here. The configuration for the virtual
990 trunk is written by config_write_mgcp(). */
991
Philipp Maier31682a32020-11-26 00:39:35 +0100992 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL
993 && trunk->trunk_nr == MGCP_VIRT_TRUNK_ID)
Philipp Maierd19de2e2020-06-03 13:55:33 +0200994 continue;
995
Philipp Maierd70eef62021-07-19 13:53:28 +0200996 vty_out(vty, " trunk %u%s", trunk->trunk_nr, VTY_NEWLINE);
Philipp Maier889fe7f2020-07-06 17:44:12 +0200997 vty_out(vty, " line %u%s", trunk->e1.vty_line_nr, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200998 vty_out(vty, " %ssdp audio-payload send-ptime%s",
999 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
1000 vty_out(vty, " %ssdp audio-payload send-name%s",
1001 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
1002
1003 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
1004 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
1005 else if (trunk->keepalive_interval)
1006 vty_out(vty, " rtp keep-alive %d%s",
1007 trunk->keepalive_interval, VTY_NEWLINE);
1008 else
1009 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001010 vty_out(vty, " force-realloc %d%s",
1011 trunk->force_realloc, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001012 vty_out(vty, " rtp-accept-all %d%s",
1013 trunk->rtp_accept_all, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001014 if (trunk->omit_rtcp)
1015 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
1016 else
1017 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001018 if (trunk->force_constant_ssrc || trunk->force_aligned_timing
Philipp Maierd19de2e2020-06-03 13:55:33 +02001019 || trunk->rfc5993_hr_convert) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001020 vty_out(vty, " %srtp-patch ssrc%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001021 trunk->force_constant_ssrc ? "" : "no ",
1022 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001023 vty_out(vty, " %srtp-patch timestamp%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001024 trunk->force_aligned_timing ? "" : "no ",
1025 VTY_NEWLINE);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001026 vty_out(vty, " %srtp-patch rfc5993hr%s",
1027 trunk->rfc5993_hr_convert ? "" : "no ",
1028 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001029 } else
1030 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
1031 if (trunk->audio_fmtp_extra)
1032 vty_out(vty, " sdp audio fmtp-extra %s%s",
1033 trunk->audio_fmtp_extra, VTY_NEWLINE);
1034 vty_out(vty, " %sallow-transcoding%s",
1035 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
1036 }
1037
1038 return CMD_SUCCESS;
1039}
1040
Philipp Maier19c430f2020-09-22 15:52:50 +02001041DEFUN_USRATTR(cfg_trunk_sdp_fmtp_extra,
1042 cfg_trunk_sdp_fmtp_extra_cmd,
1043 X(MGW_CMD_ATTR_NEWCONN),
1044 "sdp audio fmtp-extra .NAME",
1045 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
1046 "Extra Information\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001047{
Philipp Maier14b27a82020-06-02 20:15:30 +02001048 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001049 char *txt = argv_concat(argv, argc, 0);
1050 if (!txt)
1051 return CMD_WARNING;
1052
1053 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
1054 talloc_free(txt);
1055 return CMD_SUCCESS;
1056}
1057
Philipp Maier7f90ddb2020-06-02 21:52:53 +02001058DEFUN_DEPRECATED(cfg_trunk_payload_number,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001059 cfg_trunk_payload_number_cmd,
1060 "sdp audio-payload number <0-255>",
1061 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
1062{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001063 return CMD_SUCCESS;
1064}
1065
1066ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001067 "sdp audio payload number <0-255>",
1068 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001069
Philipp Maier7f90ddb2020-06-02 21:52:53 +02001070DEFUN_DEPRECATED(cfg_trunk_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001071 cfg_trunk_payload_name_cmd,
1072 "sdp audio-payload name NAME",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001073 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001074{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001075 return CMD_SUCCESS;
1076}
1077
1078ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001079 "sdp audio payload name NAME",
1080 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001081
Philipp Maierba94b6d2020-09-22 16:14:32 +02001082DEFUN_DEPRECATED(cfg_trunk_loop,
1083 cfg_trunk_loop_cmd,
1084 "loop (0|1)",
1085 "Loop audio for all endpoints on this trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001086{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001087 return CMD_SUCCESS;
1088}
1089
Philipp Maier41425e92020-11-26 00:41:59 +01001090DEFUN_USRATTR(cfg_trunk_force_realloc,
1091 cfg_trunk_force_realloc_cmd,
1092 X(MGW_CMD_ATTR_NEWCONN),
1093 "force-realloc (0|1)",
1094 "Force endpoint reallocation when the endpoint is still seized\n"
1095 "Don't force reallocation\n" "force reallocation\n")
1096{
1097 struct mgcp_trunk *trunk = vty->index;
1098 OSMO_ASSERT(trunk);
1099 trunk->force_realloc = atoi(argv[0]);
1100 return CMD_SUCCESS;
1101}
1102
1103DEFUN_ATTR(cfg_trunk_rtp_accept_all,
1104 cfg_trunk_rtp_accept_all_cmd,
1105 "rtp-accept-all (0|1)",
1106 "Accept all RTP packets, even when the originating IP/Port does not match\n"
1107 "enable filter\n" "disable filter\n",
1108 CMD_ATTR_IMMEDIATE)
1109{
1110 struct mgcp_trunk *trunk = vty->index;
1111 OSMO_ASSERT(trunk);
1112 trunk->rtp_accept_all = atoi(argv[0]);
1113 return CMD_SUCCESS;
1114}
1115
Philipp Maier19c430f2020-09-22 15:52:50 +02001116DEFUN_USRATTR(cfg_trunk_sdp_payload_send_ptime,
1117 cfg_trunk_sdp_payload_send_ptime_cmd,
1118 X(MGW_CMD_ATTR_NEWCONN),
1119 "sdp audio-payload send-ptime",
1120 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001121{
Philipp Maier14b27a82020-06-02 20:15:30 +02001122 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001123 trunk->audio_send_ptime = 1;
1124 return CMD_SUCCESS;
1125}
1126
Philipp Maier19c430f2020-09-22 15:52:50 +02001127DEFUN_USRATTR(cfg_trunk_no_sdp_payload_send_ptime,
1128 cfg_trunk_no_sdp_payload_send_ptime_cmd,
1129 X(MGW_CMD_ATTR_NEWCONN),
1130 "no sdp audio-payload send-ptime",
1131 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001132{
Philipp Maier14b27a82020-06-02 20:15:30 +02001133 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001134 trunk->audio_send_ptime = 0;
1135 return CMD_SUCCESS;
1136}
1137
Philipp Maier19c430f2020-09-22 15:52:50 +02001138DEFUN_USRATTR(cfg_trunk_sdp_payload_send_name,
1139 cfg_trunk_sdp_payload_send_name_cmd,
1140 X(MGW_CMD_ATTR_NEWCONN),
1141 "sdp audio-payload send-name",
1142 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
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->audio_send_name = 1;
1146 return CMD_SUCCESS;
1147}
1148
Philipp Maier19c430f2020-09-22 15:52:50 +02001149DEFUN_USRATTR(cfg_trunk_no_sdp_payload_send_name,
1150 cfg_trunk_no_sdp_payload_send_name_cmd,
1151 X(MGW_CMD_ATTR_NEWCONN),
1152 "no sdp audio-payload send-name",
1153 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001154{
Philipp Maier14b27a82020-06-02 20:15:30 +02001155 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001156 trunk->audio_send_name = 0;
1157 return CMD_SUCCESS;
1158}
1159
Philipp Maier19c430f2020-09-22 15:52:50 +02001160DEFUN_ATTR(cfg_trunk_omit_rtcp,
1161 cfg_trunk_omit_rtcp_cmd,
1162 "rtcp-omit", RTCP_OMIT_STR,
1163 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001164{
Philipp Maier14b27a82020-06-02 20:15:30 +02001165 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001166 trunk->omit_rtcp = 1;
1167 return CMD_SUCCESS;
1168}
1169
Philipp Maier19c430f2020-09-22 15:52:50 +02001170DEFUN_ATTR(cfg_trunk_no_omit_rtcp,
1171 cfg_trunk_no_omit_rtcp_cmd,
1172 "no rtcp-omit", NO_STR RTCP_OMIT_STR,
1173 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001174{
Philipp Maier14b27a82020-06-02 20:15:30 +02001175 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001176 trunk->omit_rtcp = 0;
1177 return CMD_SUCCESS;
1178}
1179
Philipp Maier19c430f2020-09-22 15:52:50 +02001180DEFUN_USRATTR(cfg_trunk_patch_rtp_ssrc,
1181 cfg_trunk_patch_rtp_ssrc_cmd,
1182 X(MGW_CMD_ATTR_NEWCONN),
1183 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001184{
Philipp Maier14b27a82020-06-02 20:15:30 +02001185 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001186 trunk->force_constant_ssrc = 1;
1187 return CMD_SUCCESS;
1188}
1189
Philipp Maier19c430f2020-09-22 15:52:50 +02001190DEFUN_USRATTR(cfg_trunk_no_patch_rtp_ssrc,
1191 cfg_trunk_no_patch_rtp_ssrc_cmd,
1192 X(MGW_CMD_ATTR_NEWCONN),
1193 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001194{
Philipp Maier14b27a82020-06-02 20:15:30 +02001195 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001196 trunk->force_constant_ssrc = 0;
1197 return CMD_SUCCESS;
1198}
1199
Philipp Maier19c430f2020-09-22 15:52:50 +02001200DEFUN_USRATTR(cfg_trunk_patch_rtp_ts,
1201 cfg_trunk_patch_rtp_ts_cmd,
1202 X(MGW_CMD_ATTR_NEWCONN),
1203 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001204{
Philipp Maier14b27a82020-06-02 20:15:30 +02001205 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001206 trunk->force_aligned_timing = 1;
1207 return CMD_SUCCESS;
1208}
1209
Philipp Maier19c430f2020-09-22 15:52:50 +02001210DEFUN_USRATTR(cfg_trunk_no_patch_rtp_ts,
1211 cfg_trunk_no_patch_rtp_ts_cmd,
1212 X(MGW_CMD_ATTR_NEWCONN),
1213 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001214{
Philipp Maier14b27a82020-06-02 20:15:30 +02001215 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001216 trunk->force_aligned_timing = 0;
1217 return CMD_SUCCESS;
1218}
1219
Philipp Maier19c430f2020-09-22 15:52:50 +02001220DEFUN_USRATTR(cfg_trunk_patch_rtp_rfc5993hr,
1221 cfg_trunk_patch_rtp_rfc5993hr_cmd,
1222 X(MGW_CMD_ATTR_NEWCONN),
1223 "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +01001224{
Philipp Maier14b27a82020-06-02 20:15:30 +02001225 struct mgcp_trunk *trunk = vty->index;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001226 trunk->rfc5993_hr_convert = true;
1227 return CMD_SUCCESS;
1228}
1229
Philipp Maier19c430f2020-09-22 15:52:50 +02001230DEFUN_USRATTR(cfg_trunk_no_patch_rtp_rfc5993hr,
1231 cfg_trunk_no_patch_rtp_rfc5993hr_cmd,
1232 X(MGW_CMD_ATTR_NEWCONN),
1233 "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +01001234{
Philipp Maier14b27a82020-06-02 20:15:30 +02001235 struct mgcp_trunk *trunk = vty->index;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001236 trunk->rfc5993_hr_convert = false;
1237 return CMD_SUCCESS;
1238}
1239
Philipp Maier19c430f2020-09-22 15:52:50 +02001240DEFUN_USRATTR(cfg_trunk_no_patch_rtp,
1241 cfg_trunk_no_patch_rtp_cmd,
1242 X(MGW_CMD_ATTR_NEWCONN),
1243 "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001244{
Philipp Maier14b27a82020-06-02 20:15:30 +02001245 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001246 trunk->force_constant_ssrc = 0;
1247 trunk->force_aligned_timing = 0;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001248 trunk->rfc5993_hr_convert = false;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001249 return CMD_SUCCESS;
1250}
1251
Philipp Maier19c430f2020-09-22 15:52:50 +02001252DEFUN_ATTR(cfg_trunk_rtp_keepalive,
1253 cfg_trunk_rtp_keepalive_cmd,
1254 "rtp keep-alive <1-120>",
1255 RTP_STR RTP_KEEPALIVE_STR "Keep-alive interval in secs\n",
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, atoi(argv[0]));
1260 return CMD_SUCCESS;
1261}
1262
Philipp Maier19c430f2020-09-22 15:52:50 +02001263DEFUN_ATTR(cfg_trunk_rtp_keepalive_once,
1264 cfg_trunk_rtp_keepalive_once_cmd,
1265 "rtp keep-alive once",
1266 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n",
1267 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001268{
Philipp Maier14b27a82020-06-02 20:15:30 +02001269 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001270 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
1271 return CMD_SUCCESS;
1272}
1273
Philipp Maier19c430f2020-09-22 15:52:50 +02001274DEFUN_ATTR(cfg_trunk_no_rtp_keepalive,
1275 cfg_trunk_no_rtp_keepalive_cmd,
1276 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR,
1277 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001278{
Philipp Maier14b27a82020-06-02 20:15:30 +02001279 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001280 mgcp_trunk_set_keepalive(trunk, 0);
1281 return CMD_SUCCESS;
1282}
1283
Philipp Maier19c430f2020-09-22 15:52:50 +02001284DEFUN_USRATTR(cfg_trunk_allow_transcoding,
1285 cfg_trunk_allow_transcoding_cmd,
1286 X(MGW_CMD_ATTR_NEWCONN),
1287 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001288{
Philipp Maier14b27a82020-06-02 20:15:30 +02001289 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001290 trunk->no_audio_transcoding = 0;
1291 return CMD_SUCCESS;
1292}
1293
Philipp Maier19c430f2020-09-22 15:52:50 +02001294DEFUN_USRATTR(cfg_trunk_no_allow_transcoding,
1295 cfg_trunk_no_allow_transcoding_cmd,
1296 X(MGW_CMD_ATTR_NEWCONN),
1297 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001298{
Philipp Maier14b27a82020-06-02 20:15:30 +02001299 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001300 trunk->no_audio_transcoding = 1;
1301 return CMD_SUCCESS;
1302}
1303
Philipp Maier889fe7f2020-07-06 17:44:12 +02001304#define LINE_STR "Configure trunk for given Line\nE1/T1 Line Number\n"
1305
1306DEFUN(cfg_trunk_line,
1307 cfg_trunk_line_cmd,
1308 "line <0-255>",
1309 LINE_STR)
1310{
1311 struct mgcp_trunk *trunk = vty->index;
1312 int line_nr = atoi(argv[0]);
1313 trunk->e1.vty_line_nr = line_nr;
1314 return CMD_SUCCESS;
1315}
1316
Philipp Maier87bd9be2017-08-22 16:35:41 +02001317DEFUN(loop_conn,
1318 loop_conn_cmd,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001319 "loop-endpoint <0-64> NAME (0|1)",
1320 "Loop a given endpoint\n" "Trunk number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +02001321 "The name in hex of the endpoint\n" "Disable the loop\n"
1322 "Enable the loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001323{
Philipp Maier14b27a82020-06-02 20:15:30 +02001324 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001325 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +02001326 struct mgcp_conn *conn;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001327
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001328 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001329 if (!trunk) {
1330 vty_out(vty, "%%Trunk %d not found in the config.%s",
1331 atoi(argv[0]), VTY_NEWLINE);
1332 return CMD_WARNING;
1333 }
1334
1335 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001336 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001337 trunk->trunk_nr, VTY_NEWLINE);
1338 return CMD_WARNING;
1339 }
1340
1341 int endp_no = strtoul(argv[1], NULL, 16);
1342 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1343 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001344 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001345 return CMD_WARNING;
1346 }
1347
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001348 endp = trunk->endpoints[endp_no];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001349 int loop = atoi(argv[2]);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001350 llist_for_each_entry(conn, &endp->conns, entry) {
1351 if (conn->type == MGCP_CONN_TYPE_RTP)
1352 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1353 mgcp_rtp_end_config(endp, 1, &conn->u.rtp.end);
1354 else {
1355 /* FIXME: Introduce support for other connection (E1)
1356 * types when implementation is available */
1357 vty_out(vty, "%%Can't enable SSRC patching,"
1358 "connection %s is not an RTP connection.%s",
1359 mgcp_conn_dump(conn), VTY_NEWLINE);
1360 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001361
Philipp Maier87bd9be2017-08-22 16:35:41 +02001362 if (loop)
1363 conn->mode = MGCP_CONN_LOOPBACK;
1364 else
1365 conn->mode = conn->mode_orig;
1366 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001367
1368 return CMD_SUCCESS;
1369}
1370
Philipp Maier87bd9be2017-08-22 16:35:41 +02001371DEFUN(tap_rtp,
1372 tap_rtp_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001373 "tap-rtp <0-64> ENDPOINT CONN (in|out) " VTY_IPV46_CMD " <0-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001374 "Forward data on endpoint to a different system\n" "Trunk number\n"
1375 "The endpoint in hex\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +02001376 "The connection id in hex\n"
1377 "Forward incoming data\n"
1378 "Forward leaving data\n"
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001379 "Destination IPv4 of the data\n"
1380 "Destination IPv6 of the data\n"
1381 "Destination port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001382{
1383 struct mgcp_rtp_tap *tap;
Philipp Maier14b27a82020-06-02 20:15:30 +02001384 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001385 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +02001386 struct mgcp_conn_rtp *conn;
Philipp Maier01d24a32017-11-21 17:26:09 +01001387 const char *conn_id = NULL;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001388
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001389 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001390 if (!trunk) {
1391 vty_out(vty, "%%Trunk %d not found in the config.%s",
1392 atoi(argv[0]), VTY_NEWLINE);
1393 return CMD_WARNING;
1394 }
1395
1396 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001397 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001398 trunk->trunk_nr, VTY_NEWLINE);
1399 return CMD_WARNING;
1400 }
1401
1402 int endp_no = strtoul(argv[1], NULL, 16);
1403 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1404 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001405 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001406 return CMD_WARNING;
1407 }
1408
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001409 endp = trunk->endpoints[endp_no];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001410
Philipp Maier01d24a32017-11-21 17:26:09 +01001411 conn_id = argv[2];
Philipp Maier87bd9be2017-08-22 16:35:41 +02001412 conn = mgcp_conn_get_rtp(endp, conn_id);
1413 if (!conn) {
Philipp Maier01d24a32017-11-21 17:26:09 +01001414 vty_out(vty, "Conn ID %s is invalid.%s",
1415 conn_id, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001416 return CMD_WARNING;
1417 }
1418
1419 if (strcmp(argv[3], "in") == 0)
1420 tap = &conn->tap_in;
1421 else if (strcmp(argv[3], "out") == 0)
1422 tap = &conn->tap_out;
1423 else {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001424 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1425 return CMD_WARNING;
1426 }
1427
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001428 memset(&tap->forward, 0, sizeof(tap->forward));
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001429
1430 tap->forward.u.sa.sa_family = osmo_ip_str_type(argv[4]);
1431 switch (tap->forward.u.sa.sa_family) {
1432 case AF_INET:
1433 if (inet_pton(AF_INET, argv[4], &tap->forward.u.sin.sin_addr) != 1)
1434 return CMD_WARNING;
1435 tap->forward.u.sin.sin_port = htons(atoi(argv[5]));
1436 break;
1437 case AF_INET6:
1438 if (inet_pton(AF_INET6, argv[4], &tap->forward.u.sin6.sin6_addr) != 1)
1439 return CMD_WARNING;
1440 tap->forward.u.sin6.sin6_port = htons(atoi(argv[5]));
1441 break;
1442 default:
1443 return CMD_WARNING;
1444 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001445 tap->enabled = 1;
1446 return CMD_SUCCESS;
1447}
1448
1449DEFUN(free_endp, free_endp_cmd,
1450 "free-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001451 "Free the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001452{
Philipp Maier14b27a82020-06-02 20:15:30 +02001453 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001454 struct mgcp_endpoint *endp;
1455
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001456 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001457 if (!trunk) {
1458 vty_out(vty, "%%Trunk %d not found in the config.%s",
1459 atoi(argv[0]), VTY_NEWLINE);
1460 return CMD_WARNING;
1461 }
1462
1463 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001464 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001465 trunk->trunk_nr, VTY_NEWLINE);
1466 return CMD_WARNING;
1467 }
1468
1469 int endp_no = strtoul(argv[1], NULL, 16);
1470 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1471 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001472 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001473 return CMD_WARNING;
1474 }
1475
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001476 endp = trunk->endpoints[endp_no];
Philipp Maier1355d7e2018-02-01 14:30:06 +01001477 mgcp_endp_release(endp);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001478 return CMD_SUCCESS;
1479}
1480
1481DEFUN(reset_endp, reset_endp_cmd,
1482 "reset-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001483 "Reset the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001484{
Philipp Maier14b27a82020-06-02 20:15:30 +02001485 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001486 struct mgcp_endpoint *endp;
1487 int endp_no, rc;
1488
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001489 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001490 if (!trunk) {
1491 vty_out(vty, "%%Trunk %d not found in the config.%s",
1492 atoi(argv[0]), VTY_NEWLINE);
1493 return CMD_WARNING;
1494 }
1495
1496 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001497 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001498 trunk->trunk_nr, VTY_NEWLINE);
1499 return CMD_WARNING;
1500 }
1501
1502 endp_no = strtoul(argv[1], NULL, 16);
1503 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1504 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001505 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001506 return CMD_WARNING;
1507 }
1508
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001509 endp = trunk->endpoints[endp_no];
1510 rc = mgcp_send_reset_ep(endp);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001511 if (rc < 0) {
1512 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1513 return CMD_WARNING;
1514 }
1515 return CMD_SUCCESS;
1516}
1517
1518DEFUN(reset_all_endp, reset_all_endp_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001519 "reset-all-endpoints", "Reset all endpoints\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001520{
1521 int rc;
1522
1523 rc = mgcp_send_reset_all(g_cfg);
1524 if (rc < 0) {
1525 vty_out(vty, "Error %d during endpoint reset.%s",
1526 rc, VTY_NEWLINE);
1527 return CMD_WARNING;
1528 }
1529 return CMD_SUCCESS;
1530}
1531
1532#define OSMUX_STR "RTP multiplexing\n"
1533DEFUN(cfg_mgcp_osmux,
1534 cfg_mgcp_osmux_cmd,
1535 "osmux (on|off|only)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001536 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001537{
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001538 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +02001539 OSMO_ASSERT(trunk);
1540
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001541 if (strcmp(argv[0], "off") == 0) {
1542 g_cfg->osmux = OSMUX_USAGE_OFF;
1543 return CMD_SUCCESS;
Pau Espin Pedrolb542b042019-04-23 13:09:32 +02001544 } else if (strcmp(argv[0], "on") == 0)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001545 g_cfg->osmux = OSMUX_USAGE_ON;
1546 else if (strcmp(argv[0], "only") == 0)
1547 g_cfg->osmux = OSMUX_USAGE_ONLY;
1548
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001549 return CMD_SUCCESS;
Pau Espin Pedrolb542b042019-04-23 13:09:32 +02001550
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001551}
1552
1553DEFUN(cfg_mgcp_osmux_ip,
1554 cfg_mgcp_osmux_ip_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001555 "osmux bind-ip " VTY_IPV46_CMD,
1556 OSMUX_STR IP_STR
1557 "IPv4 Address to bind to\n"
1558 "IPv6 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001559{
Eric2764bdb2021-08-23 22:11:47 +02001560 osmo_strlcpy(g_cfg->osmux_addr, argv[0], sizeof(g_cfg->osmux_addr));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001561 return CMD_SUCCESS;
1562}
1563
1564DEFUN(cfg_mgcp_osmux_batch_factor,
1565 cfg_mgcp_osmux_batch_factor_cmd,
1566 "osmux batch-factor <1-8>",
1567 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1568{
1569 g_cfg->osmux_batch = atoi(argv[0]);
1570 return CMD_SUCCESS;
1571}
1572
1573DEFUN(cfg_mgcp_osmux_batch_size,
1574 cfg_mgcp_osmux_batch_size_cmd,
1575 "osmux batch-size <1-65535>",
1576 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1577{
1578 g_cfg->osmux_batch_size = atoi(argv[0]);
1579 return CMD_SUCCESS;
1580}
1581
1582DEFUN(cfg_mgcp_osmux_port,
1583 cfg_mgcp_osmux_port_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001584 "osmux port <1-65535>", OSMUX_STR "port\n" "UDP port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001585{
1586 g_cfg->osmux_port = atoi(argv[0]);
1587 return CMD_SUCCESS;
1588}
1589
1590DEFUN(cfg_mgcp_osmux_dummy,
1591 cfg_mgcp_osmux_dummy_cmd,
1592 "osmux dummy (on|off)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001593 OSMUX_STR "Dummy padding\n" "Enable dummy padding\n"
1594 "Disable dummy padding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001595{
1596 if (strcmp(argv[0], "on") == 0)
1597 g_cfg->osmux_dummy = 1;
1598 else if (strcmp(argv[0], "off") == 0)
1599 g_cfg->osmux_dummy = 0;
1600
1601 return CMD_SUCCESS;
1602}
1603
Philipp Maier12943ea2018-01-17 15:40:25 +01001604DEFUN(cfg_mgcp_domain,
1605 cfg_mgcp_domain_cmd,
Neels Hofmeyr352eed02018-08-20 23:59:32 +02001606 "domain NAME",
1607 "Set the domain part expected in MGCP messages' endpoint names\n"
1608 "Qualified domain name expected in MGCP endpoint names, or '*' to accept any domain\n")
Philipp Maier12943ea2018-01-17 15:40:25 +01001609{
1610 osmo_strlcpy(g_cfg->domain, argv[0], sizeof(g_cfg->domain));
1611 return CMD_SUCCESS;
1612}
1613
Oliver Smithe36b7752019-01-22 16:31:36 +01001614DEFUN(cfg_mgcp_conn_timeout,
1615 cfg_mgcp_conn_timeout_cmd,
Oliver Smithd2ce4442019-06-26 09:56:44 +02001616 "conn-timeout <0-65534>",
1617 "Set a time after which inactive connections (CIs) are closed. Set to 0 to disable timeout. This can be used to"
1618 " work around interoperability problems causing connections to stay open forever, and slowly exhausting all"
Oliver Smith189f29e2019-06-26 12:08:20 +02001619 " available ports. Enable keep-alive packets in MGW clients when using this option together with LCLS (OsmoBSC,"
1620 " OsmoMSC: 'rtp keep-alive')!\n"
Oliver Smithe36b7752019-01-22 16:31:36 +01001621 "Timeout value (sec.)\n")
1622{
1623 g_cfg->conn_timeout = strtoul(argv[0], NULL, 10);
1624 return CMD_SUCCESS;
1625}
1626
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001627int mgcp_vty_init(void)
1628{
1629 install_element_ve(&show_mgcp_cmd);
Keithfe53edd2021-05-04 15:23:30 -05001630 install_element_ve(&show_mgcp_active_cmd);
Stefan Sperling12086582018-06-26 15:26:28 +02001631 install_element_ve(&show_mgcp_endpoint_cmd);
1632 install_element_ve(&show_mgcp_trunk_endpoint_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001633 install_element(ENABLE_NODE, &loop_conn_cmd);
1634 install_element(ENABLE_NODE, &tap_rtp_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001635 install_element(ENABLE_NODE, &free_endp_cmd);
1636 install_element(ENABLE_NODE, &reset_endp_cmd);
1637 install_element(ENABLE_NODE, &reset_all_endp_cmd);
1638
1639 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1640 install_node(&mgcp_node, config_write_mgcp);
1641
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001642 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001643 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1644 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1645 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001646 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001647 install_element(MGCP_NODE, &cfg_mgcp_rtp_port_range_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001648 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001649 install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_cmd);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +02001650 install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_v6_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001651 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001652 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_cmd);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +02001653 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_v6_cmd);
Philipp Maier1cb1e382017-11-02 17:16:04 +01001654 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_probing_cmd);
1655 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_probing_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001656 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Harald Welte55a92292021-04-28 19:06:34 +02001657 install_element(MGCP_NODE, &cfg_mgcp_rtp_priority_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001658 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1659 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
1660 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1661 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1662 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
1663 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
1664 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001665 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1666 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
1667 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1668 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
1669 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1670 install_element(MGCP_NODE, &cfg_mgcp_force_realloc_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001671 install_element(MGCP_NODE, &cfg_mgcp_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001672 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
1673 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1674 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
1675 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1676 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1677 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1678 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1679 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001680 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_rfc5993hr_cmd);
1681 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_rfc5993hr_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001682 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
1683 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1684 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
1685 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1686 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
1687 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1688 install_element(MGCP_NODE, &cfg_mgcp_osmux_ip_cmd);
1689 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
1690 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
1691 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
1692 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
1693 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1694 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
Philipp Maier12943ea2018-01-17 15:40:25 +01001695 install_element(MGCP_NODE, &cfg_mgcp_domain_cmd);
Oliver Smithe36b7752019-01-22 16:31:36 +01001696 install_element(MGCP_NODE, &cfg_mgcp_conn_timeout_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001697
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001698 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1699 install_node(&trunk_node, config_write_trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001700 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1701 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1702 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
1703 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1704 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
1705 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1706 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
1707 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Philipp Maier41425e92020-11-26 00:41:59 +01001708 install_element(TRUNK_NODE, &cfg_trunk_force_realloc_cmd);
1709 install_element(TRUNK_NODE, &cfg_trunk_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001710 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1711 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
1712 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1713 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1714 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001715 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_rfc5993hr_cmd);
1716 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_rfc5993hr_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001717 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1718 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
1719 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
1720 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1721 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
1722 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1723 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
1724 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1725 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Philipp Maier889fe7f2020-07-06 17:44:12 +02001726 install_element(TRUNK_NODE, &cfg_trunk_line_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001727
1728 return 0;
1729}
1730
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001731int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1732 enum mgcp_role role)
1733{
1734 int rc;
Philipp Maier14b27a82020-06-02 20:15:30 +02001735 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001736
1737 cfg->osmux_port = OSMUX_PORT;
1738 cfg->osmux_batch = 4;
1739 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
1740
1741 g_cfg = cfg;
1742 rc = vty_read_config_file(config_file, NULL);
1743 if (rc < 0) {
Philipp Maier87bd9be2017-08-22 16:35:41 +02001744 fprintf(stderr, "Failed to parse the config file: '%s'\n",
1745 config_file);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001746 return rc;
1747 }
1748
Eric2764bdb2021-08-23 22:11:47 +02001749 if (!strlen(g_cfg->source_addr)) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001750 fprintf(stderr, "You need to specify a bind address.\n");
1751 return -1;
1752 }
1753
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001754 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
Philipp Maier889fe7f2020-07-06 17:44:12 +02001755 if (mgcp_trunk_equip(trunk) != 0) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001756 LOGP(DLMGCP, LOGL_ERROR,
Philipp Maierd70eef62021-07-19 13:53:28 +02001757 "Failed to initialize trunk %u (%d endpoints)\n",
Philipp Maier48454982017-11-10 16:46:41 +01001758 trunk->trunk_nr, trunk->number_endpoints);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001759 return -1;
1760 }
1761 }
1762 cfg->role = role;
1763
1764 return 0;
1765}