blob: 34c2d4b4bdc2555192c6a77f8f04bb792a42e134 [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
Pau Espin Pedrol928a20b2022-09-23 15:38:24 +0200132 switch (g_cfg->osmux_use) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200133 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 }
Pau Espin Pedrol928a20b2022-09-23 15:38:24 +0200144 if (g_cfg->osmux_use != OSMUX_USAGE_OFF) {
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 Pedroldaf5bce2022-09-22 19:14:24 +0200172 tx_packets = rate_ctr_group_get_ctr(conn->ctrg, RTP_PACKETS_TX_CTR);
173 tx_bytes = rate_ctr_group_get_ctr(conn->ctrg, RTP_OCTETS_TX_CTR);
174 rx_packets = rate_ctr_group_get_ctr(conn->ctrg, RTP_PACKETS_RX_CTR);
175 rx_bytes = rate_ctr_group_get_ctr(conn->ctrg, RTP_OCTETS_RX_CTR);
176 dropped_packets = rate_ctr_group_get_ctr(conn->ctrg, 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,
Pau Espin Pedrol83df47c2022-09-21 20:07:59 +0200192 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 }
Pau Espin Pedrol582c2bf2022-09-22 17:53:44 +0200292 if (ratectr->all_osmux_conn_stats) {
293 vty_out(vty, " %s:%s",
294 ratectr->all_osmux_conn_stats->desc->group_description,
295 VTY_NEWLINE);
296 vty_out_rate_ctr_group_fmt(vty,
297 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
298 ratectr->all_osmux_conn_stats);
299 }
Philipp Maier889fe7f2020-07-06 17:44:12 +0200300
301 if (ratectr->e1_stats && trunk->trunk_type == MGCP_TRUNK_E1) {
302 vty_out(vty, " %s:%s",
303 ratectr->e1_stats->desc->group_description,
304 VTY_NEWLINE);
305 vty_out_rate_ctr_group_fmt(vty,
306 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
307 ratectr->e1_stats);
308 }
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200309}
310
311
Keithfe53edd2021-05-04 15:23:30 -0500312static void dump_trunk(struct vty *vty, struct mgcp_trunk *trunk, int show_stats, int active_only)
Stefan Sperling12086582018-06-26 15:26:28 +0200313{
314 int i;
Keithfe53edd2021-05-04 15:23:30 -0500315 int active_count = 0;
Stefan Sperling12086582018-06-26 15:26:28 +0200316
317 vty_out(vty, "%s trunk %d with %d endpoints:%s",
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200318 trunk->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
Philipp Maier869b21c2020-07-03 16:04:16 +0200319 trunk->trunk_nr, trunk->number_endpoints, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200320
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200321 if (!trunk->endpoints) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200322 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
323 return;
324 }
325
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200326 for (i = 0; i < trunk->number_endpoints; ++i) {
327 struct mgcp_endpoint *endp = trunk->endpoints[i];
Keithfe53edd2021-05-04 15:23:30 -0500328 if (!active_only || !llist_empty(&endp->conns)) {
329 dump_endpoint(vty, endp, trunk->trunk_nr, trunk->trunk_type,
330 show_stats);
331 if (i < trunk->number_endpoints - 1)
332 vty_out(vty, "%s", VTY_NEWLINE);
333 }
334 if (!llist_empty(&endp->conns))
335 active_count++;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200336 }
Stefan Sperling1e174872018-10-25 18:36:10 +0200337
Keithfe53edd2021-05-04 15:23:30 -0500338 if (active_count == 0)
339 vty_out(vty, "No endpoints in use.%s", VTY_NEWLINE);
340
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200341 if (show_stats)
Philipp Maier889fe7f2020-07-06 17:44:12 +0200342 dump_ratectr_trunk(vty, trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200343}
344
Keithfe53edd2021-05-04 15:23:30 -0500345static int mgcp_show(struct vty *vty, int argc, const char **argv,
346 int show_stats, int active_only)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200347{
Philipp Maier14b27a82020-06-02 20:15:30 +0200348 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200349
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200350 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Keithfe53edd2021-05-04 15:23:30 -0500351 dump_trunk(vty, trunk, show_stats, active_only);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200352
Pau Espin Pedrol928a20b2022-09-23 15:38:24 +0200353 if (g_cfg->osmux_use != OSMUX_USAGE_OFF)
Pau Espin Pedrol8de58e72019-04-24 13:33:46 +0200354 vty_out(vty, "Osmux used CID: %d%s", osmux_cid_pool_count_used(),
Philipp Maier87bd9be2017-08-22 16:35:41 +0200355 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200356
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200357 if (show_stats)
358 dump_ratectr_global(vty, &g_cfg->ratectr);
359
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200360 return CMD_SUCCESS;
361}
362
Keithfe53edd2021-05-04 15:23:30 -0500363#define SHOW_MGCP_STR "Display information about the MGCP Media Gateway\n"
364
365DEFUN(show_mgcp, show_mgcp_cmd,
366 "show mgcp [stats]",
367 SHOW_STR
368 SHOW_MGCP_STR
369 "Include statistics\n")
370{
371 int show_stats = argc >= 1;
372 return mgcp_show(vty, argc, argv, show_stats, 0);
373}
374
375DEFUN(show_mgcp_active, show_mgcp_active_cmd,
376 "show mgcp active",
377 SHOW_STR
378 SHOW_MGCP_STR
379 "Show only endpoints with active connections\n")
380{
381 return mgcp_show(vty, argc, argv, 0, 1);
382}
383
Stefan Sperling12086582018-06-26 15:26:28 +0200384static void
Philipp Maier14b27a82020-06-02 20:15:30 +0200385dump_mgcp_endpoint(struct vty *vty, struct mgcp_trunk *trunk, const char *epname)
Stefan Sperling12086582018-06-26 15:26:28 +0200386{
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200387 struct mgcp_endpoint *endp;
Stefan Sperling12086582018-06-26 15:26:28 +0200388
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200389 if (trunk) {
390 /* If a trunk is given, search on that specific trunk only */
391 endp = mgcp_endp_by_name_trunk(NULL, epname, trunk);
392 if (!endp) {
Philipp Maierd70eef62021-07-19 13:53:28 +0200393 vty_out(vty, "endpoint %s not configured on trunk %u%s", epname, trunk->trunk_nr, VTY_NEWLINE);
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200394 return;
395 }
396 } else {
397 /* If no trunk is given, search on all possible trunks */
398 endp = mgcp_endp_by_name(NULL, epname, g_cfg);
399 if (!endp) {
400 vty_out(vty, "endpoint %s not configured%s", epname, VTY_NEWLINE);
401 return;
Stefan Sperling12086582018-06-26 15:26:28 +0200402 }
403 }
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200404
405 trunk = endp->trunk;
406 dump_endpoint(vty, endp, trunk->trunk_nr, trunk->trunk_type, true);
Stefan Sperling12086582018-06-26 15:26:28 +0200407}
408
409DEFUN(show_mcgp_endpoint, show_mgcp_endpoint_cmd,
410 "show mgcp endpoint NAME",
411 SHOW_STR
412 SHOW_MGCP_STR
413 "Display information about an endpoint\n" "The name of the endpoint\n")
414{
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200415 dump_mgcp_endpoint(vty, NULL, argv[0]);
Stefan Sperling12086582018-06-26 15:26:28 +0200416 return CMD_SUCCESS;
417}
418
419DEFUN(show_mcgp_trunk_endpoint, show_mgcp_trunk_endpoint_cmd,
420 "show mgcp trunk <0-64> endpoint NAME",
421 SHOW_STR
422 SHOW_MGCP_STR
423 "Display information about a trunk\n" "Trunk number\n"
424 "Display information about an endpoint\n" "The name of the endpoint\n")
425{
Philipp Maier14b27a82020-06-02 20:15:30 +0200426 struct mgcp_trunk *trunk;
Stefan Sperling12086582018-06-26 15:26:28 +0200427 int trunkidx = atoi(argv[0]);
428
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200429 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, trunkidx);
Stefan Sperling12086582018-06-26 15:26:28 +0200430 if (!trunk) {
431 vty_out(vty, "trunk %d not found%s", trunkidx, VTY_NEWLINE);
432 return CMD_WARNING;
433 }
434
435 dump_mgcp_endpoint(vty, trunk, argv[1]);
436 return CMD_SUCCESS;
437}
438
Philipp Maier87bd9be2017-08-22 16:35:41 +0200439DEFUN(cfg_mgcp, cfg_mgcp_cmd, "mgcp", "Configure the MGCP")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200440{
441 vty->node = MGCP_NODE;
442 return CMD_SUCCESS;
443}
444
Philipp Maier19c430f2020-09-22 15:52:50 +0200445DEFUN_USRATTR(cfg_mgcp_local_ip,
446 cfg_mgcp_local_ip_cmd,
447 X(MGW_CMD_ATTR_NEWCONN),
448 "local ip " VTY_IPV46_CMD,
449 "Local options for the SDP record\n"
450 IP_STR
451 "IPv4 Address to use in SDP record\n"
452 "IPv6 Address to use in SDP record\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200453{
Eric2764bdb2021-08-23 22:11:47 +0200454 osmo_strlcpy(g_cfg->local_ip, argv[0], sizeof(g_cfg->local_ip));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200455 return CMD_SUCCESS;
456}
457
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200458#define BIND_STR "Listen/Bind related socket option\n"
459DEFUN(cfg_mgcp_bind_ip,
460 cfg_mgcp_bind_ip_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200461 "bind ip " VTY_IPV46_CMD,
462 BIND_STR IP_STR
463 "IPv4 Address to bind to\n"
464 "IPv6 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200465{
Eric2764bdb2021-08-23 22:11:47 +0200466 osmo_strlcpy(g_cfg->source_addr, argv[0], sizeof(g_cfg->source_addr));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200467 return CMD_SUCCESS;
468}
469
470DEFUN(cfg_mgcp_bind_port,
471 cfg_mgcp_bind_port_cmd,
472 "bind port <0-65534>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200473 BIND_STR "Port information\n" "UDP port to listen for MGCP messages\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200474{
475 unsigned int port = atoi(argv[0]);
476 g_cfg->source_port = port;
477 return CMD_SUCCESS;
478}
479
Philipp Maier8cfe7df2020-09-22 16:18:26 +0200480DEFUN_DEPRECATED(cfg_mgcp_bind_early,
481 cfg_mgcp_bind_early_cmd,
482 "bind early (0|1)",
483 BIND_STR
484 "Bind local ports on start up\n" "Bind on demand\n" "Bind on startup\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200485{
Philipp Maier8cfe7df2020-09-22 16:18:26 +0200486 return CMD_SUCCESS;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200487}
488
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200489#define RTP_STR "RTP configuration\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200490#define UDP_PORT_STR "UDP Port number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +0200491#define NET_START_STR "First UDP port allocated\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200492#define RANGE_START_STR "Start of the range of ports\n"
493#define RANGE_END_STR "End of the range of ports\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200494
Philipp Maierf1889d82017-11-08 14:59:39 +0100495DEFUN(cfg_mgcp_rtp_port_range,
496 cfg_mgcp_rtp_port_range_cmd,
Philipp Maiera19547b2018-05-22 13:44:34 +0200497 "rtp port-range <1024-65534> <1025-65535>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200498 RTP_STR "Range of ports to use for the NET side\n"
499 RANGE_START_STR RANGE_END_STR)
500{
Philipp Maiera19547b2018-05-22 13:44:34 +0200501 int start;
502 int end;
503
504 start = atoi(argv[0]);
505 end = atoi(argv[1]);
506
507 if (end < start) {
508 vty_out(vty, "range end port (%i) must be greater than the range start port (%i)!%s",
509 end, start, VTY_NEWLINE);
510 return CMD_WARNING;
511 }
512
513 if (start & 1) {
514 vty_out(vty, "range must begin at an even port number, autocorrecting port (%i) to: %i%s",
515 start, start & 0xFFFE, VTY_NEWLINE);
516 start &= 0xFFFE;
517 }
518
519 if ((end & 1) == 0) {
520 vty_out(vty, "range must end at an odd port number, autocorrecting port (%i) to: %i%s",
521 end, end | 1, VTY_NEWLINE);
522 end |= 1;
523 }
524
525 g_cfg->net_ports.range_start = start;
526 g_cfg->net_ports.range_end = end;
527 g_cfg->net_ports.last_port = g_cfg->net_ports.range_start;
528
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200529 return CMD_SUCCESS;
530}
Philipp Maierf1889d82017-11-08 14:59:39 +0100531ALIAS_DEPRECATED(cfg_mgcp_rtp_port_range,
532 cfg_mgcp_rtp_net_range_cmd,
533 "rtp net-range <0-65534> <0-65534>",
534 RTP_STR "Range of ports to use for the NET side\n"
535 RANGE_START_STR RANGE_END_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200536
Philipp Maier19c430f2020-09-22 15:52:50 +0200537DEFUN_USRATTR(cfg_mgcp_rtp_bind_ip,
538 cfg_mgcp_rtp_bind_ip_cmd,
539 X(MGW_CMD_ATTR_NEWCONN),
540 "rtp bind-ip A.B.C.D",
541 RTP_STR "Bind endpoints facing the Network\n"
542 "IPv4 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200543{
Eric2764bdb2021-08-23 22:11:47 +0200544 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 +0200545 return CMD_SUCCESS;
546}
Philipp Maierf1889d82017-11-08 14:59:39 +0100547ALIAS_DEPRECATED(cfg_mgcp_rtp_bind_ip,
548 cfg_mgcp_rtp_net_bind_ip_cmd,
549 "rtp net-bind-ip A.B.C.D",
550 RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200551
Philipp Maier19c430f2020-09-22 15:52:50 +0200552DEFUN_USRATTR(cfg_mgcp_rtp_no_bind_ip,
553 cfg_mgcp_rtp_no_bind_ip_cmd,
554 X(MGW_CMD_ATTR_NEWCONN),
555 "no rtp bind-ip",
556 NO_STR RTP_STR "Bind endpoints facing the Network\n"
557 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200558{
Eric2764bdb2021-08-23 22:11:47 +0200559 osmo_strlcpy(g_cfg->net_ports.bind_addr_v4, "", sizeof(g_cfg->net_ports.bind_addr_v4));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200560 return CMD_SUCCESS;
561}
Philipp Maierf1889d82017-11-08 14:59:39 +0100562ALIAS_DEPRECATED(cfg_mgcp_rtp_no_bind_ip,
563 cfg_mgcp_rtp_no_net_bind_ip_cmd,
564 "no rtp net-bind-ip",
565 NO_STR RTP_STR "Bind endpoints facing the Network\n"
566 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200567
Philipp Maier19c430f2020-09-22 15:52:50 +0200568DEFUN_USRATTR(cfg_mgcp_rtp_bind_ip_v6,
569 cfg_mgcp_rtp_bind_ip_v6_cmd,
570 X(MGW_CMD_ATTR_NEWCONN),
571 "rtp bind-ip-v6 " VTY_IPV6_CMD,
572 RTP_STR "Bind endpoints facing the Network\n"
573 "IPv6 Address to bind to\n")
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200574{
Eric2764bdb2021-08-23 22:11:47 +0200575 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 +0200576 return CMD_SUCCESS;
577}
578
Philipp Maier19c430f2020-09-22 15:52:50 +0200579DEFUN_USRATTR(cfg_mgcp_rtp_no_bind_ip_v6,
580 cfg_mgcp_rtp_no_bind_ip_v6_cmd,
581 X(MGW_CMD_ATTR_NEWCONN),
582 "no rtp bind-ip-v6",
583 NO_STR RTP_STR "Bind endpoints facing the Network\n"
584 "Address to bind to\n")
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200585{
Eric2764bdb2021-08-23 22:11:47 +0200586 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 +0200587 return CMD_SUCCESS;
588}
589
Philipp Maier19c430f2020-09-22 15:52:50 +0200590DEFUN_USRATTR(cfg_mgcp_rtp_net_bind_ip_probing,
591 cfg_mgcp_rtp_net_bind_ip_probing_cmd,
592 X(MGW_CMD_ATTR_NEWCONN),
593 "rtp ip-probing",
594 RTP_STR "automatic rtp bind ip selection\n")
Philipp Maier1cb1e382017-11-02 17:16:04 +0100595{
596 g_cfg->net_ports.bind_addr_probe = true;
597 return CMD_SUCCESS;
598}
599
Philipp Maier19c430f2020-09-22 15:52:50 +0200600DEFUN_USRATTR(cfg_mgcp_rtp_no_net_bind_ip_probing,
601 cfg_mgcp_rtp_no_net_bind_ip_probing_cmd,
602 X(MGW_CMD_ATTR_NEWCONN),
603 "no rtp ip-probing",
604 NO_STR RTP_STR "no automatic rtp bind ip selection\n")
Philipp Maier1cb1e382017-11-02 17:16:04 +0100605{
606 g_cfg->net_ports.bind_addr_probe = false;
607 return CMD_SUCCESS;
608}
609
Philipp Maier19c430f2020-09-22 15:52:50 +0200610DEFUN_USRATTR(cfg_mgcp_rtp_ip_dscp,
611 cfg_mgcp_rtp_ip_dscp_cmd,
612 X(MGW_CMD_ATTR_NEWCONN),
Harald Welte5936a9c2021-04-27 22:30:52 +0200613 "rtp ip-dscp <0-63>",
Philipp Maier19c430f2020-09-22 15:52:50 +0200614 RTP_STR
Harald Welte5936a9c2021-04-27 22:30:52 +0200615 "Use specified DSCP for the audio stream (including Osmux)\n" "The DSCP value\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200616{
617 int dscp = atoi(argv[0]);
618 g_cfg->endp_dscp = dscp;
619 return CMD_SUCCESS;
620}
621
Harald Welte55a92292021-04-28 19:06:34 +0200622DEFUN_USRATTR(cfg_mgcp_rtp_priority,
623 cfg_mgcp_rtp_priority_cmd,
624 X(MGW_CMD_ATTR_NEWCONN),
625 "rtp socket-priority <0-255>",
626 RTP_STR
627 "socket priority (values > 6 require CAP_NET_ADMIN)\n" "socket priority value\n")
628{
629 int prio = atoi(argv[0]);
630 g_cfg->endp_priority = prio;
631 return CMD_SUCCESS;
632}
633
Philipp Maier87bd9be2017-08-22 16:35:41 +0200634#define FORCE_PTIME_STR "Force a fixed ptime for packets sent"
Philipp Maier19c430f2020-09-22 15:52:50 +0200635DEFUN_USRATTR(cfg_mgcp_rtp_force_ptime,
636 cfg_mgcp_rtp_force_ptime_cmd,
637 X(MGW_CMD_ATTR_NEWCONN),
638 "rtp force-ptime (10|20|40)",
639 RTP_STR FORCE_PTIME_STR
640 "The required ptime (packet duration) in ms\n" "10 ms\n20 ms\n40 ms\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200641{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200642 g_cfg->force_ptime = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200643 return CMD_SUCCESS;
644}
645
Philipp Maier19c430f2020-09-22 15:52:50 +0200646DEFUN_USRATTR(cfg_mgcp_no_rtp_force_ptime,
647 cfg_mgcp_no_rtp_force_ptime_cmd,
648 X(MGW_CMD_ATTR_NEWCONN),
649 "no rtp force-ptime", NO_STR RTP_STR FORCE_PTIME_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200650{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200651 g_cfg->force_ptime = 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_sdp_fmtp_extra,
656 cfg_mgcp_sdp_fmtp_extra_cmd,
657 X(MGW_CMD_ATTR_NEWCONN),
658 "sdp audio fmtp-extra .NAME",
659 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
660 "Extra Information\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200661{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200662 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200663 OSMO_ASSERT(trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200664 char *txt = argv_concat(argv, argc, 0);
665 if (!txt)
666 return CMD_WARNING;
667
Philipp Maierd19de2e2020-06-03 13:55:33 +0200668 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200669 talloc_free(txt);
670 return CMD_SUCCESS;
671}
672
Philipp Maier19c430f2020-09-22 15:52:50 +0200673DEFUN_USRATTR(cfg_mgcp_allow_transcoding,
674 cfg_mgcp_allow_transcoding_cmd,
675 X(MGW_CMD_ATTR_NEWCONN),
676 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200677{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200678 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200679 OSMO_ASSERT(trunk);
680 trunk->no_audio_transcoding = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200681 return CMD_SUCCESS;
682}
683
Philipp Maier19c430f2020-09-22 15:52:50 +0200684DEFUN_USRATTR(cfg_mgcp_no_allow_transcoding,
685 cfg_mgcp_no_allow_transcoding_cmd,
686 X(MGW_CMD_ATTR_NEWCONN),
687 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200688{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200689 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200690 OSMO_ASSERT(trunk);
691 trunk->no_audio_transcoding = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200692 return CMD_SUCCESS;
693}
694
695#define SDP_STR "SDP File related options\n"
696#define AUDIO_STR "Audio payload options\n"
Philipp Maier7f90ddb2020-06-02 21:52:53 +0200697DEFUN_DEPRECATED(cfg_mgcp_sdp_payload_number,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200698 cfg_mgcp_sdp_payload_number_cmd,
699 "sdp audio-payload number <0-255>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200700 SDP_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200701{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200702 return CMD_SUCCESS;
703}
704
Philipp Maier87bd9be2017-08-22 16:35:41 +0200705ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number,
706 cfg_mgcp_sdp_payload_number_cmd_old,
707 "sdp audio payload number <0-255>",
708 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200709
Philipp Maier7f90ddb2020-06-02 21:52:53 +0200710DEFUN_DEPRECATED(cfg_mgcp_sdp_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200711 cfg_mgcp_sdp_payload_name_cmd,
712 "sdp audio-payload name NAME",
713 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
714{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200715 return CMD_SUCCESS;
716}
717
718ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200719 "sdp audio payload name NAME",
720 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200721
Philipp Maier19c430f2020-09-22 15:52:50 +0200722DEFUN_USRATTR(cfg_mgcp_sdp_payload_send_ptime,
723 cfg_mgcp_sdp_payload_send_ptime_cmd,
724 X(MGW_CMD_ATTR_NEWCONN),
725 "sdp audio-payload send-ptime",
726 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200727{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200728 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200729 OSMO_ASSERT(trunk);
730 trunk->audio_send_ptime = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200731 return CMD_SUCCESS;
732}
733
Philipp Maier19c430f2020-09-22 15:52:50 +0200734DEFUN_USRATTR(cfg_mgcp_no_sdp_payload_send_ptime,
735 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
736 X(MGW_CMD_ATTR_NEWCONN),
737 "no sdp audio-payload send-ptime",
738 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200739{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200740 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200741 OSMO_ASSERT(trunk);
742 trunk->audio_send_ptime = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200743 return CMD_SUCCESS;
744}
745
Philipp Maier19c430f2020-09-22 15:52:50 +0200746DEFUN_USRATTR(cfg_mgcp_sdp_payload_send_name,
747 cfg_mgcp_sdp_payload_send_name_cmd,
748 X(MGW_CMD_ATTR_NEWCONN),
749 "sdp audio-payload send-name",
750 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200751{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200752 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200753 OSMO_ASSERT(trunk);
754 trunk->audio_send_name = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200755 return CMD_SUCCESS;
756}
757
Philipp Maier19c430f2020-09-22 15:52:50 +0200758DEFUN_USRATTR(cfg_mgcp_no_sdp_payload_send_name,
759 cfg_mgcp_no_sdp_payload_send_name_cmd,
760 X(MGW_CMD_ATTR_NEWCONN),
761 "no sdp audio-payload send-name",
762 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200763{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200764 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200765 OSMO_ASSERT(trunk);
766 trunk->audio_send_name = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200767 return CMD_SUCCESS;
768}
769
Philipp Maierba94b6d2020-09-22 16:14:32 +0200770DEFUN_DEPRECATED(cfg_mgcp_loop,
771 cfg_mgcp_loop_cmd,
772 "loop (0|1)",
773 "Loop audio for all endpoints on main trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200774{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200775 return CMD_SUCCESS;
776}
777
Philipp Maier19c430f2020-09-22 15:52:50 +0200778DEFUN_USRATTR(cfg_mgcp_force_realloc,
779 cfg_mgcp_force_realloc_cmd,
780 X(MGW_CMD_ATTR_NEWCONN),
781 "force-realloc (0|1)",
782 "Force endpoint reallocation when the endpoint is still seized\n"
783 "Don't force reallocation\n" "force reallocation\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200784{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200785 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200786 OSMO_ASSERT(trunk);
787 trunk->force_realloc = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200788 return CMD_SUCCESS;
789}
790
Philipp Maier19c430f2020-09-22 15:52:50 +0200791DEFUN_ATTR(cfg_mgcp_rtp_accept_all,
792 cfg_mgcp_rtp_accept_all_cmd,
793 "rtp-accept-all (0|1)",
794 "Accept all RTP packets, even when the originating IP/Port does not match\n"
795 "enable filter\n" "disable filter\n",
796 CMD_ATTR_IMMEDIATE)
Philipp Maier87bd9be2017-08-22 16:35:41 +0200797{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200798 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200799 OSMO_ASSERT(trunk);
800 trunk->rtp_accept_all = atoi(argv[0]);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200801 return CMD_SUCCESS;
802}
803
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200804DEFUN(cfg_mgcp_number_endp,
805 cfg_mgcp_number_endp_cmd,
Philipp Maier869b21c2020-07-03 16:04:16 +0200806 "number endpoints <1-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200807 "Number options\n" "Endpoints available\n" "Number endpoints\n")
808{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200809 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200810 OSMO_ASSERT(trunk);
Philipp Maier889fe7f2020-07-06 17:44:12 +0200811 trunk->v.vty_number_endpoints = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200812 return CMD_SUCCESS;
813}
814
Philipp Maier19c430f2020-09-22 15:52:50 +0200815DEFUN_ATTR(cfg_mgcp_omit_rtcp,
816 cfg_mgcp_omit_rtcp_cmd,
817 "rtcp-omit", RTCP_OMIT_STR,
818 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200819{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200820 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200821 trunk->omit_rtcp = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200822 return CMD_SUCCESS;
823}
824
Philipp Maier19c430f2020-09-22 15:52:50 +0200825DEFUN_ATTR(cfg_mgcp_no_omit_rtcp,
826 cfg_mgcp_no_omit_rtcp_cmd,
827 "no rtcp-omit",
828 NO_STR RTCP_OMIT_STR,
829 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200830{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200831 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200832 OSMO_ASSERT(trunk);
833 trunk->omit_rtcp = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200834 return CMD_SUCCESS;
835}
836
Philipp Maier19c430f2020-09-22 15:52:50 +0200837DEFUN_USRATTR(cfg_mgcp_patch_rtp_ssrc,
838 cfg_mgcp_patch_rtp_ssrc_cmd,
839 X(MGW_CMD_ATTR_NEWCONN),
840 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200841{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200842 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200843 OSMO_ASSERT(trunk);
844 trunk->force_constant_ssrc = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200845 return CMD_SUCCESS;
846}
847
Philipp Maier19c430f2020-09-22 15:52:50 +0200848DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_ssrc,
849 cfg_mgcp_no_patch_rtp_ssrc_cmd,
850 X(MGW_CMD_ATTR_NEWCONN),
851 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200852{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200853 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200854 OSMO_ASSERT(trunk);
855 trunk->force_constant_ssrc = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200856 return CMD_SUCCESS;
857}
858
Philipp Maier19c430f2020-09-22 15:52:50 +0200859DEFUN_USRATTR(cfg_mgcp_patch_rtp_ts,
860 cfg_mgcp_patch_rtp_ts_cmd,
861 X(MGW_CMD_ATTR_NEWCONN),
862 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200863{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200864 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200865 OSMO_ASSERT(trunk);
866 trunk->force_aligned_timing = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200867 return CMD_SUCCESS;
868}
869
Philipp Maier19c430f2020-09-22 15:52:50 +0200870DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_ts,
871 cfg_mgcp_no_patch_rtp_ts_cmd,
872 X(MGW_CMD_ATTR_NEWCONN),
873 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200874{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200875 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200876 OSMO_ASSERT(trunk);
877 trunk->force_aligned_timing = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200878 return CMD_SUCCESS;
879}
880
Philipp Maier19c430f2020-09-22 15:52:50 +0200881DEFUN_USRATTR(cfg_mgcp_patch_rtp_rfc5993hr,
882 cfg_mgcp_patch_rtp_rfc5993hr_cmd,
883 X(MGW_CMD_ATTR_NEWCONN),
884 "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +0100885{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200886 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200887 OSMO_ASSERT(trunk);
888 trunk->rfc5993_hr_convert = true;
Philipp Maier9fc8a022019-02-20 12:26:52 +0100889 return CMD_SUCCESS;
890}
891
Philipp Maier19c430f2020-09-22 15:52:50 +0200892DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_rfc5993hr,
893 cfg_mgcp_no_patch_rtp_rfc5993hr_cmd,
894 X(MGW_CMD_ATTR_NEWCONN),
895 "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +0100896{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200897 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200898 OSMO_ASSERT(trunk);
899 trunk->rfc5993_hr_convert = false;
Philipp Maier9fc8a022019-02-20 12:26:52 +0100900 return CMD_SUCCESS;
901}
902
Philipp Maier19c430f2020-09-22 15:52:50 +0200903DEFUN_USRATTR(cfg_mgcp_no_patch_rtp,
904 cfg_mgcp_no_patch_rtp_cmd,
905 X(MGW_CMD_ATTR_NEWCONN),
906 "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200907{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200908 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200909 OSMO_ASSERT(trunk);
910 trunk->force_constant_ssrc = 0;
911 trunk->force_aligned_timing = 0;
912 trunk->rfc5993_hr_convert = false;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200913 return CMD_SUCCESS;
914}
915
Philipp Maier19c430f2020-09-22 15:52:50 +0200916DEFUN_ATTR(cfg_mgcp_rtp_keepalive,
917 cfg_mgcp_rtp_keepalive_cmd,
918 "rtp keep-alive <1-120>",
919 RTP_STR RTP_KEEPALIVE_STR "Keep alive interval in secs\n",
920 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200921{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200922 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200923 OSMO_ASSERT(trunk);
924 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200925 return CMD_SUCCESS;
926}
927
Philipp Maier19c430f2020-09-22 15:52:50 +0200928DEFUN_ATTR(cfg_mgcp_rtp_keepalive_once,
929 cfg_mgcp_rtp_keepalive_once_cmd,
930 "rtp keep-alive once",
931 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n",
932 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200933{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200934 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200935 OSMO_ASSERT(trunk);
936 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200937 return CMD_SUCCESS;
938}
939
Philipp Maier19c430f2020-09-22 15:52:50 +0200940DEFUN_ATTR(cfg_mgcp_no_rtp_keepalive,
941 cfg_mgcp_no_rtp_keepalive_cmd,
942 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR,
943 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200944{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200945 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200946 OSMO_ASSERT(trunk);
947 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_NEVER);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200948 return CMD_SUCCESS;
949}
950
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200951#define CALL_AGENT_STR "Call agent information\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200952DEFUN(cfg_mgcp_agent_addr,
953 cfg_mgcp_agent_addr_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200954 "call-agent ip " VTY_IPV46_CMD,
955 CALL_AGENT_STR IP_STR
956 "IPv4 Address of the call agent\n"
957 "IPv6 Address of the call agent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200958{
Eric2764bdb2021-08-23 22:11:47 +0200959 osmo_strlcpy(g_cfg->call_agent_addr, argv[0], sizeof(g_cfg->call_agent_addr));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200960 return CMD_SUCCESS;
961}
962
963ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200964 "call agent ip A.B.C.D",
965 CALL_AGENT_STR CALL_AGENT_STR IP_STR
966 "IPv4 Address of the callagent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200967
Philipp Maier21be42a2020-05-29 21:39:48 +0200968DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
Philipp Maier0653cc82020-08-10 22:52:51 +0200969 "trunk <0-64>", "Configure a SS7 trunk\n" "Trunk Nr\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200970{
Philipp Maier14b27a82020-06-02 20:15:30 +0200971 struct mgcp_trunk *trunk;
Philipp Maierd70eef62021-07-19 13:53:28 +0200972 unsigned int index = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200973
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200974 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, index);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100975 if (!trunk) {
976 trunk = mgcp_trunk_alloc(g_cfg, MGCP_TRUNK_E1, index);
Philipp Maier2d681fd2020-05-29 16:20:25 +0200977 if (!trunk) {
978 vty_out(vty, "%%Unable to allocate trunk %u.%s",
979 index, VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100980 return CMD_WARNING;
Philipp Maier2d681fd2020-05-29 16:20:25 +0200981 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200982 }
983
984 vty->node = TRUNK_NODE;
985 vty->index = trunk;
986 return CMD_SUCCESS;
987}
988
989static int config_write_trunk(struct vty *vty)
990{
Philipp Maier14b27a82020-06-02 20:15:30 +0200991 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200992
993 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
Philipp Maierd19de2e2020-06-03 13:55:33 +0200994
995 /* Due to historical reasons, the virtual trunk is configured
996 using separate VTY parameters, so we omit writing the trunk
997 config of trunk 0 here. The configuration for the virtual
998 trunk is written by config_write_mgcp(). */
999
Philipp Maier31682a32020-11-26 00:39:35 +01001000 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL
1001 && trunk->trunk_nr == MGCP_VIRT_TRUNK_ID)
Philipp Maierd19de2e2020-06-03 13:55:33 +02001002 continue;
1003
Philipp Maierd70eef62021-07-19 13:53:28 +02001004 vty_out(vty, " trunk %u%s", trunk->trunk_nr, VTY_NEWLINE);
Philipp Maier889fe7f2020-07-06 17:44:12 +02001005 vty_out(vty, " line %u%s", trunk->e1.vty_line_nr, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001006 vty_out(vty, " %ssdp audio-payload send-ptime%s",
1007 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
1008 vty_out(vty, " %ssdp audio-payload send-name%s",
1009 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
1010
1011 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
1012 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
1013 else if (trunk->keepalive_interval)
1014 vty_out(vty, " rtp keep-alive %d%s",
1015 trunk->keepalive_interval, VTY_NEWLINE);
1016 else
1017 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001018 vty_out(vty, " force-realloc %d%s",
1019 trunk->force_realloc, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001020 vty_out(vty, " rtp-accept-all %d%s",
1021 trunk->rtp_accept_all, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001022 if (trunk->omit_rtcp)
1023 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
1024 else
1025 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001026 if (trunk->force_constant_ssrc || trunk->force_aligned_timing
Philipp Maierd19de2e2020-06-03 13:55:33 +02001027 || trunk->rfc5993_hr_convert) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001028 vty_out(vty, " %srtp-patch ssrc%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001029 trunk->force_constant_ssrc ? "" : "no ",
1030 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001031 vty_out(vty, " %srtp-patch timestamp%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001032 trunk->force_aligned_timing ? "" : "no ",
1033 VTY_NEWLINE);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001034 vty_out(vty, " %srtp-patch rfc5993hr%s",
1035 trunk->rfc5993_hr_convert ? "" : "no ",
1036 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001037 } else
1038 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
1039 if (trunk->audio_fmtp_extra)
1040 vty_out(vty, " sdp audio fmtp-extra %s%s",
1041 trunk->audio_fmtp_extra, VTY_NEWLINE);
1042 vty_out(vty, " %sallow-transcoding%s",
1043 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
1044 }
1045
1046 return CMD_SUCCESS;
1047}
1048
Philipp Maier19c430f2020-09-22 15:52:50 +02001049DEFUN_USRATTR(cfg_trunk_sdp_fmtp_extra,
1050 cfg_trunk_sdp_fmtp_extra_cmd,
1051 X(MGW_CMD_ATTR_NEWCONN),
1052 "sdp audio fmtp-extra .NAME",
1053 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
1054 "Extra Information\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001055{
Philipp Maier14b27a82020-06-02 20:15:30 +02001056 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001057 char *txt = argv_concat(argv, argc, 0);
1058 if (!txt)
1059 return CMD_WARNING;
1060
1061 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
1062 talloc_free(txt);
1063 return CMD_SUCCESS;
1064}
1065
Philipp Maier7f90ddb2020-06-02 21:52:53 +02001066DEFUN_DEPRECATED(cfg_trunk_payload_number,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001067 cfg_trunk_payload_number_cmd,
1068 "sdp audio-payload number <0-255>",
1069 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
1070{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001071 return CMD_SUCCESS;
1072}
1073
1074ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001075 "sdp audio payload number <0-255>",
1076 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001077
Philipp Maier7f90ddb2020-06-02 21:52:53 +02001078DEFUN_DEPRECATED(cfg_trunk_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001079 cfg_trunk_payload_name_cmd,
1080 "sdp audio-payload name NAME",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001081 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001082{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001083 return CMD_SUCCESS;
1084}
1085
1086ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001087 "sdp audio payload name NAME",
1088 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001089
Philipp Maierba94b6d2020-09-22 16:14:32 +02001090DEFUN_DEPRECATED(cfg_trunk_loop,
1091 cfg_trunk_loop_cmd,
1092 "loop (0|1)",
1093 "Loop audio for all endpoints on this trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001094{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001095 return CMD_SUCCESS;
1096}
1097
Philipp Maier41425e92020-11-26 00:41:59 +01001098DEFUN_USRATTR(cfg_trunk_force_realloc,
1099 cfg_trunk_force_realloc_cmd,
1100 X(MGW_CMD_ATTR_NEWCONN),
1101 "force-realloc (0|1)",
1102 "Force endpoint reallocation when the endpoint is still seized\n"
1103 "Don't force reallocation\n" "force reallocation\n")
1104{
1105 struct mgcp_trunk *trunk = vty->index;
1106 OSMO_ASSERT(trunk);
1107 trunk->force_realloc = atoi(argv[0]);
1108 return CMD_SUCCESS;
1109}
1110
1111DEFUN_ATTR(cfg_trunk_rtp_accept_all,
1112 cfg_trunk_rtp_accept_all_cmd,
1113 "rtp-accept-all (0|1)",
1114 "Accept all RTP packets, even when the originating IP/Port does not match\n"
1115 "enable filter\n" "disable filter\n",
1116 CMD_ATTR_IMMEDIATE)
1117{
1118 struct mgcp_trunk *trunk = vty->index;
1119 OSMO_ASSERT(trunk);
1120 trunk->rtp_accept_all = atoi(argv[0]);
1121 return CMD_SUCCESS;
1122}
1123
Philipp Maier19c430f2020-09-22 15:52:50 +02001124DEFUN_USRATTR(cfg_trunk_sdp_payload_send_ptime,
1125 cfg_trunk_sdp_payload_send_ptime_cmd,
1126 X(MGW_CMD_ATTR_NEWCONN),
1127 "sdp audio-payload send-ptime",
1128 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001129{
Philipp Maier14b27a82020-06-02 20:15:30 +02001130 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001131 trunk->audio_send_ptime = 1;
1132 return CMD_SUCCESS;
1133}
1134
Philipp Maier19c430f2020-09-22 15:52:50 +02001135DEFUN_USRATTR(cfg_trunk_no_sdp_payload_send_ptime,
1136 cfg_trunk_no_sdp_payload_send_ptime_cmd,
1137 X(MGW_CMD_ATTR_NEWCONN),
1138 "no sdp audio-payload send-ptime",
1139 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001140{
Philipp Maier14b27a82020-06-02 20:15:30 +02001141 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001142 trunk->audio_send_ptime = 0;
1143 return CMD_SUCCESS;
1144}
1145
Philipp Maier19c430f2020-09-22 15:52:50 +02001146DEFUN_USRATTR(cfg_trunk_sdp_payload_send_name,
1147 cfg_trunk_sdp_payload_send_name_cmd,
1148 X(MGW_CMD_ATTR_NEWCONN),
1149 "sdp audio-payload send-name",
1150 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001151{
Philipp Maier14b27a82020-06-02 20:15:30 +02001152 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001153 trunk->audio_send_name = 1;
1154 return CMD_SUCCESS;
1155}
1156
Philipp Maier19c430f2020-09-22 15:52:50 +02001157DEFUN_USRATTR(cfg_trunk_no_sdp_payload_send_name,
1158 cfg_trunk_no_sdp_payload_send_name_cmd,
1159 X(MGW_CMD_ATTR_NEWCONN),
1160 "no sdp audio-payload send-name",
1161 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001162{
Philipp Maier14b27a82020-06-02 20:15:30 +02001163 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001164 trunk->audio_send_name = 0;
1165 return CMD_SUCCESS;
1166}
1167
Philipp Maier19c430f2020-09-22 15:52:50 +02001168DEFUN_ATTR(cfg_trunk_omit_rtcp,
1169 cfg_trunk_omit_rtcp_cmd,
1170 "rtcp-omit", RTCP_OMIT_STR,
1171 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001172{
Philipp Maier14b27a82020-06-02 20:15:30 +02001173 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001174 trunk->omit_rtcp = 1;
1175 return CMD_SUCCESS;
1176}
1177
Philipp Maier19c430f2020-09-22 15:52:50 +02001178DEFUN_ATTR(cfg_trunk_no_omit_rtcp,
1179 cfg_trunk_no_omit_rtcp_cmd,
1180 "no rtcp-omit", NO_STR RTCP_OMIT_STR,
1181 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001182{
Philipp Maier14b27a82020-06-02 20:15:30 +02001183 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001184 trunk->omit_rtcp = 0;
1185 return CMD_SUCCESS;
1186}
1187
Philipp Maier19c430f2020-09-22 15:52:50 +02001188DEFUN_USRATTR(cfg_trunk_patch_rtp_ssrc,
1189 cfg_trunk_patch_rtp_ssrc_cmd,
1190 X(MGW_CMD_ATTR_NEWCONN),
1191 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001192{
Philipp Maier14b27a82020-06-02 20:15:30 +02001193 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001194 trunk->force_constant_ssrc = 1;
1195 return CMD_SUCCESS;
1196}
1197
Philipp Maier19c430f2020-09-22 15:52:50 +02001198DEFUN_USRATTR(cfg_trunk_no_patch_rtp_ssrc,
1199 cfg_trunk_no_patch_rtp_ssrc_cmd,
1200 X(MGW_CMD_ATTR_NEWCONN),
1201 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001202{
Philipp Maier14b27a82020-06-02 20:15:30 +02001203 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001204 trunk->force_constant_ssrc = 0;
1205 return CMD_SUCCESS;
1206}
1207
Philipp Maier19c430f2020-09-22 15:52:50 +02001208DEFUN_USRATTR(cfg_trunk_patch_rtp_ts,
1209 cfg_trunk_patch_rtp_ts_cmd,
1210 X(MGW_CMD_ATTR_NEWCONN),
1211 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001212{
Philipp Maier14b27a82020-06-02 20:15:30 +02001213 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001214 trunk->force_aligned_timing = 1;
1215 return CMD_SUCCESS;
1216}
1217
Philipp Maier19c430f2020-09-22 15:52:50 +02001218DEFUN_USRATTR(cfg_trunk_no_patch_rtp_ts,
1219 cfg_trunk_no_patch_rtp_ts_cmd,
1220 X(MGW_CMD_ATTR_NEWCONN),
1221 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001222{
Philipp Maier14b27a82020-06-02 20:15:30 +02001223 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001224 trunk->force_aligned_timing = 0;
1225 return CMD_SUCCESS;
1226}
1227
Philipp Maier19c430f2020-09-22 15:52:50 +02001228DEFUN_USRATTR(cfg_trunk_patch_rtp_rfc5993hr,
1229 cfg_trunk_patch_rtp_rfc5993hr_cmd,
1230 X(MGW_CMD_ATTR_NEWCONN),
1231 "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +01001232{
Philipp Maier14b27a82020-06-02 20:15:30 +02001233 struct mgcp_trunk *trunk = vty->index;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001234 trunk->rfc5993_hr_convert = true;
1235 return CMD_SUCCESS;
1236}
1237
Philipp Maier19c430f2020-09-22 15:52:50 +02001238DEFUN_USRATTR(cfg_trunk_no_patch_rtp_rfc5993hr,
1239 cfg_trunk_no_patch_rtp_rfc5993hr_cmd,
1240 X(MGW_CMD_ATTR_NEWCONN),
1241 "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +01001242{
Philipp Maier14b27a82020-06-02 20:15:30 +02001243 struct mgcp_trunk *trunk = vty->index;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001244 trunk->rfc5993_hr_convert = false;
1245 return CMD_SUCCESS;
1246}
1247
Philipp Maier19c430f2020-09-22 15:52:50 +02001248DEFUN_USRATTR(cfg_trunk_no_patch_rtp,
1249 cfg_trunk_no_patch_rtp_cmd,
1250 X(MGW_CMD_ATTR_NEWCONN),
1251 "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001252{
Philipp Maier14b27a82020-06-02 20:15:30 +02001253 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001254 trunk->force_constant_ssrc = 0;
1255 trunk->force_aligned_timing = 0;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001256 trunk->rfc5993_hr_convert = false;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001257 return CMD_SUCCESS;
1258}
1259
Philipp Maier19c430f2020-09-22 15:52:50 +02001260DEFUN_ATTR(cfg_trunk_rtp_keepalive,
1261 cfg_trunk_rtp_keepalive_cmd,
1262 "rtp keep-alive <1-120>",
1263 RTP_STR RTP_KEEPALIVE_STR "Keep-alive interval in secs\n",
1264 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001265{
Philipp Maier14b27a82020-06-02 20:15:30 +02001266 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001267 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
1268 return CMD_SUCCESS;
1269}
1270
Philipp Maier19c430f2020-09-22 15:52:50 +02001271DEFUN_ATTR(cfg_trunk_rtp_keepalive_once,
1272 cfg_trunk_rtp_keepalive_once_cmd,
1273 "rtp keep-alive once",
1274 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n",
1275 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001276{
Philipp Maier14b27a82020-06-02 20:15:30 +02001277 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001278 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
1279 return CMD_SUCCESS;
1280}
1281
Philipp Maier19c430f2020-09-22 15:52:50 +02001282DEFUN_ATTR(cfg_trunk_no_rtp_keepalive,
1283 cfg_trunk_no_rtp_keepalive_cmd,
1284 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR,
1285 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001286{
Philipp Maier14b27a82020-06-02 20:15:30 +02001287 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001288 mgcp_trunk_set_keepalive(trunk, 0);
1289 return CMD_SUCCESS;
1290}
1291
Philipp Maier19c430f2020-09-22 15:52:50 +02001292DEFUN_USRATTR(cfg_trunk_allow_transcoding,
1293 cfg_trunk_allow_transcoding_cmd,
1294 X(MGW_CMD_ATTR_NEWCONN),
1295 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001296{
Philipp Maier14b27a82020-06-02 20:15:30 +02001297 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001298 trunk->no_audio_transcoding = 0;
1299 return CMD_SUCCESS;
1300}
1301
Philipp Maier19c430f2020-09-22 15:52:50 +02001302DEFUN_USRATTR(cfg_trunk_no_allow_transcoding,
1303 cfg_trunk_no_allow_transcoding_cmd,
1304 X(MGW_CMD_ATTR_NEWCONN),
1305 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001306{
Philipp Maier14b27a82020-06-02 20:15:30 +02001307 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001308 trunk->no_audio_transcoding = 1;
1309 return CMD_SUCCESS;
1310}
1311
Philipp Maier889fe7f2020-07-06 17:44:12 +02001312#define LINE_STR "Configure trunk for given Line\nE1/T1 Line Number\n"
1313
1314DEFUN(cfg_trunk_line,
1315 cfg_trunk_line_cmd,
1316 "line <0-255>",
1317 LINE_STR)
1318{
1319 struct mgcp_trunk *trunk = vty->index;
1320 int line_nr = atoi(argv[0]);
1321 trunk->e1.vty_line_nr = line_nr;
1322 return CMD_SUCCESS;
1323}
1324
Philipp Maier87bd9be2017-08-22 16:35:41 +02001325DEFUN(loop_conn,
1326 loop_conn_cmd,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001327 "loop-endpoint <0-64> NAME (0|1)",
1328 "Loop a given endpoint\n" "Trunk number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +02001329 "The name in hex of the endpoint\n" "Disable the loop\n"
1330 "Enable the loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001331{
Philipp Maier14b27a82020-06-02 20:15:30 +02001332 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001333 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +02001334 struct mgcp_conn *conn;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001335
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001336 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001337 if (!trunk) {
1338 vty_out(vty, "%%Trunk %d not found in the config.%s",
1339 atoi(argv[0]), VTY_NEWLINE);
1340 return CMD_WARNING;
1341 }
1342
1343 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001344 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001345 trunk->trunk_nr, VTY_NEWLINE);
1346 return CMD_WARNING;
1347 }
1348
1349 int endp_no = strtoul(argv[1], NULL, 16);
1350 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1351 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001352 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001353 return CMD_WARNING;
1354 }
1355
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001356 endp = trunk->endpoints[endp_no];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001357 int loop = atoi(argv[2]);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001358 llist_for_each_entry(conn, &endp->conns, entry) {
1359 if (conn->type == MGCP_CONN_TYPE_RTP)
1360 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1361 mgcp_rtp_end_config(endp, 1, &conn->u.rtp.end);
1362 else {
1363 /* FIXME: Introduce support for other connection (E1)
1364 * types when implementation is available */
1365 vty_out(vty, "%%Can't enable SSRC patching,"
1366 "connection %s is not an RTP connection.%s",
1367 mgcp_conn_dump(conn), VTY_NEWLINE);
1368 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001369
Philipp Maier87bd9be2017-08-22 16:35:41 +02001370 if (loop)
1371 conn->mode = MGCP_CONN_LOOPBACK;
1372 else
1373 conn->mode = conn->mode_orig;
1374 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001375
1376 return CMD_SUCCESS;
1377}
1378
Philipp Maier87bd9be2017-08-22 16:35:41 +02001379DEFUN(tap_rtp,
1380 tap_rtp_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001381 "tap-rtp <0-64> ENDPOINT CONN (in|out) " VTY_IPV46_CMD " <0-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001382 "Forward data on endpoint to a different system\n" "Trunk number\n"
1383 "The endpoint in hex\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +02001384 "The connection id in hex\n"
1385 "Forward incoming data\n"
1386 "Forward leaving data\n"
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001387 "Destination IPv4 of the data\n"
1388 "Destination IPv6 of the data\n"
1389 "Destination port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001390{
1391 struct mgcp_rtp_tap *tap;
Philipp Maier14b27a82020-06-02 20:15:30 +02001392 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001393 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +02001394 struct mgcp_conn_rtp *conn;
Philipp Maier01d24a32017-11-21 17:26:09 +01001395 const char *conn_id = NULL;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001396
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001397 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001398 if (!trunk) {
1399 vty_out(vty, "%%Trunk %d not found in the config.%s",
1400 atoi(argv[0]), VTY_NEWLINE);
1401 return CMD_WARNING;
1402 }
1403
1404 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001405 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001406 trunk->trunk_nr, VTY_NEWLINE);
1407 return CMD_WARNING;
1408 }
1409
1410 int endp_no = strtoul(argv[1], NULL, 16);
1411 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1412 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001413 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001414 return CMD_WARNING;
1415 }
1416
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001417 endp = trunk->endpoints[endp_no];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001418
Philipp Maier01d24a32017-11-21 17:26:09 +01001419 conn_id = argv[2];
Philipp Maier87bd9be2017-08-22 16:35:41 +02001420 conn = mgcp_conn_get_rtp(endp, conn_id);
1421 if (!conn) {
Philipp Maier01d24a32017-11-21 17:26:09 +01001422 vty_out(vty, "Conn ID %s is invalid.%s",
1423 conn_id, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001424 return CMD_WARNING;
1425 }
1426
1427 if (strcmp(argv[3], "in") == 0)
1428 tap = &conn->tap_in;
1429 else if (strcmp(argv[3], "out") == 0)
1430 tap = &conn->tap_out;
1431 else {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001432 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1433 return CMD_WARNING;
1434 }
1435
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001436 memset(&tap->forward, 0, sizeof(tap->forward));
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001437
1438 tap->forward.u.sa.sa_family = osmo_ip_str_type(argv[4]);
1439 switch (tap->forward.u.sa.sa_family) {
1440 case AF_INET:
1441 if (inet_pton(AF_INET, argv[4], &tap->forward.u.sin.sin_addr) != 1)
1442 return CMD_WARNING;
1443 tap->forward.u.sin.sin_port = htons(atoi(argv[5]));
1444 break;
1445 case AF_INET6:
1446 if (inet_pton(AF_INET6, argv[4], &tap->forward.u.sin6.sin6_addr) != 1)
1447 return CMD_WARNING;
1448 tap->forward.u.sin6.sin6_port = htons(atoi(argv[5]));
1449 break;
1450 default:
1451 return CMD_WARNING;
1452 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001453 tap->enabled = 1;
1454 return CMD_SUCCESS;
1455}
1456
1457DEFUN(free_endp, free_endp_cmd,
1458 "free-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001459 "Free the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001460{
Philipp Maier14b27a82020-06-02 20:15:30 +02001461 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001462 struct mgcp_endpoint *endp;
1463
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001464 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001465 if (!trunk) {
1466 vty_out(vty, "%%Trunk %d not found in the config.%s",
1467 atoi(argv[0]), VTY_NEWLINE);
1468 return CMD_WARNING;
1469 }
1470
1471 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001472 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001473 trunk->trunk_nr, VTY_NEWLINE);
1474 return CMD_WARNING;
1475 }
1476
1477 int endp_no = strtoul(argv[1], NULL, 16);
1478 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1479 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001480 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001481 return CMD_WARNING;
1482 }
1483
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001484 endp = trunk->endpoints[endp_no];
Philipp Maier1355d7e2018-02-01 14:30:06 +01001485 mgcp_endp_release(endp);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001486 return CMD_SUCCESS;
1487}
1488
1489DEFUN(reset_endp, reset_endp_cmd,
1490 "reset-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001491 "Reset the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001492{
Philipp Maier14b27a82020-06-02 20:15:30 +02001493 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001494 struct mgcp_endpoint *endp;
1495 int endp_no, rc;
1496
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001497 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001498 if (!trunk) {
1499 vty_out(vty, "%%Trunk %d not found in the config.%s",
1500 atoi(argv[0]), VTY_NEWLINE);
1501 return CMD_WARNING;
1502 }
1503
1504 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001505 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001506 trunk->trunk_nr, VTY_NEWLINE);
1507 return CMD_WARNING;
1508 }
1509
1510 endp_no = strtoul(argv[1], NULL, 16);
1511 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1512 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001513 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001514 return CMD_WARNING;
1515 }
1516
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001517 endp = trunk->endpoints[endp_no];
1518 rc = mgcp_send_reset_ep(endp);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001519 if (rc < 0) {
1520 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1521 return CMD_WARNING;
1522 }
1523 return CMD_SUCCESS;
1524}
1525
1526DEFUN(reset_all_endp, reset_all_endp_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001527 "reset-all-endpoints", "Reset all endpoints\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001528{
1529 int rc;
1530
1531 rc = mgcp_send_reset_all(g_cfg);
1532 if (rc < 0) {
1533 vty_out(vty, "Error %d during endpoint reset.%s",
1534 rc, VTY_NEWLINE);
1535 return CMD_WARNING;
1536 }
1537 return CMD_SUCCESS;
1538}
1539
1540#define OSMUX_STR "RTP multiplexing\n"
1541DEFUN(cfg_mgcp_osmux,
1542 cfg_mgcp_osmux_cmd,
1543 "osmux (on|off|only)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001544 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001545{
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001546 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +02001547 OSMO_ASSERT(trunk);
1548
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001549 if (strcmp(argv[0], "off") == 0) {
Pau Espin Pedrol928a20b2022-09-23 15:38:24 +02001550 g_cfg->osmux_use = OSMUX_USAGE_OFF;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001551 return CMD_SUCCESS;
Pau Espin Pedrolb542b042019-04-23 13:09:32 +02001552 } else if (strcmp(argv[0], "on") == 0)
Pau Espin Pedrol928a20b2022-09-23 15:38:24 +02001553 g_cfg->osmux_use = OSMUX_USAGE_ON;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001554 else if (strcmp(argv[0], "only") == 0)
Pau Espin Pedrol928a20b2022-09-23 15:38:24 +02001555 g_cfg->osmux_use = OSMUX_USAGE_ONLY;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001556
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001557 return CMD_SUCCESS;
Pau Espin Pedrolb542b042019-04-23 13:09:32 +02001558
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001559}
1560
1561DEFUN(cfg_mgcp_osmux_ip,
1562 cfg_mgcp_osmux_ip_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001563 "osmux bind-ip " VTY_IPV46_CMD,
1564 OSMUX_STR IP_STR
1565 "IPv4 Address to bind to\n"
1566 "IPv6 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001567{
Eric2764bdb2021-08-23 22:11:47 +02001568 osmo_strlcpy(g_cfg->osmux_addr, argv[0], sizeof(g_cfg->osmux_addr));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001569 return CMD_SUCCESS;
1570}
1571
1572DEFUN(cfg_mgcp_osmux_batch_factor,
1573 cfg_mgcp_osmux_batch_factor_cmd,
1574 "osmux batch-factor <1-8>",
1575 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1576{
1577 g_cfg->osmux_batch = atoi(argv[0]);
1578 return CMD_SUCCESS;
1579}
1580
1581DEFUN(cfg_mgcp_osmux_batch_size,
1582 cfg_mgcp_osmux_batch_size_cmd,
1583 "osmux batch-size <1-65535>",
1584 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1585{
1586 g_cfg->osmux_batch_size = atoi(argv[0]);
1587 return CMD_SUCCESS;
1588}
1589
1590DEFUN(cfg_mgcp_osmux_port,
1591 cfg_mgcp_osmux_port_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001592 "osmux port <1-65535>", OSMUX_STR "port\n" "UDP port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001593{
1594 g_cfg->osmux_port = atoi(argv[0]);
1595 return CMD_SUCCESS;
1596}
1597
1598DEFUN(cfg_mgcp_osmux_dummy,
1599 cfg_mgcp_osmux_dummy_cmd,
1600 "osmux dummy (on|off)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001601 OSMUX_STR "Dummy padding\n" "Enable dummy padding\n"
1602 "Disable dummy padding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001603{
1604 if (strcmp(argv[0], "on") == 0)
1605 g_cfg->osmux_dummy = 1;
1606 else if (strcmp(argv[0], "off") == 0)
1607 g_cfg->osmux_dummy = 0;
1608
1609 return CMD_SUCCESS;
1610}
1611
Philipp Maier12943ea2018-01-17 15:40:25 +01001612DEFUN(cfg_mgcp_domain,
1613 cfg_mgcp_domain_cmd,
Neels Hofmeyr352eed02018-08-20 23:59:32 +02001614 "domain NAME",
1615 "Set the domain part expected in MGCP messages' endpoint names\n"
1616 "Qualified domain name expected in MGCP endpoint names, or '*' to accept any domain\n")
Philipp Maier12943ea2018-01-17 15:40:25 +01001617{
1618 osmo_strlcpy(g_cfg->domain, argv[0], sizeof(g_cfg->domain));
1619 return CMD_SUCCESS;
1620}
1621
Oliver Smithe36b7752019-01-22 16:31:36 +01001622DEFUN(cfg_mgcp_conn_timeout,
1623 cfg_mgcp_conn_timeout_cmd,
Oliver Smithd2ce4442019-06-26 09:56:44 +02001624 "conn-timeout <0-65534>",
1625 "Set a time after which inactive connections (CIs) are closed. Set to 0 to disable timeout. This can be used to"
1626 " work around interoperability problems causing connections to stay open forever, and slowly exhausting all"
Oliver Smith189f29e2019-06-26 12:08:20 +02001627 " available ports. Enable keep-alive packets in MGW clients when using this option together with LCLS (OsmoBSC,"
1628 " OsmoMSC: 'rtp keep-alive')!\n"
Oliver Smithe36b7752019-01-22 16:31:36 +01001629 "Timeout value (sec.)\n")
1630{
1631 g_cfg->conn_timeout = strtoul(argv[0], NULL, 10);
1632 return CMD_SUCCESS;
1633}
1634
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001635int mgcp_vty_init(void)
1636{
1637 install_element_ve(&show_mgcp_cmd);
Keithfe53edd2021-05-04 15:23:30 -05001638 install_element_ve(&show_mgcp_active_cmd);
Stefan Sperling12086582018-06-26 15:26:28 +02001639 install_element_ve(&show_mgcp_endpoint_cmd);
1640 install_element_ve(&show_mgcp_trunk_endpoint_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001641 install_element(ENABLE_NODE, &loop_conn_cmd);
1642 install_element(ENABLE_NODE, &tap_rtp_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001643 install_element(ENABLE_NODE, &free_endp_cmd);
1644 install_element(ENABLE_NODE, &reset_endp_cmd);
1645 install_element(ENABLE_NODE, &reset_all_endp_cmd);
1646
1647 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1648 install_node(&mgcp_node, config_write_mgcp);
1649
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001650 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001651 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1652 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1653 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001654 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001655 install_element(MGCP_NODE, &cfg_mgcp_rtp_port_range_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001656 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001657 install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_cmd);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +02001658 install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_v6_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001659 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001660 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_cmd);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +02001661 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_v6_cmd);
Philipp Maier1cb1e382017-11-02 17:16:04 +01001662 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_probing_cmd);
1663 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_probing_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001664 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Harald Welte55a92292021-04-28 19:06:34 +02001665 install_element(MGCP_NODE, &cfg_mgcp_rtp_priority_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001666 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1667 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
1668 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1669 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1670 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
1671 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
1672 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001673 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1674 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
1675 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1676 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
1677 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1678 install_element(MGCP_NODE, &cfg_mgcp_force_realloc_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001679 install_element(MGCP_NODE, &cfg_mgcp_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001680 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
1681 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1682 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
1683 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1684 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1685 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1686 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1687 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001688 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_rfc5993hr_cmd);
1689 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_rfc5993hr_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001690 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
1691 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1692 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
1693 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1694 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
1695 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1696 install_element(MGCP_NODE, &cfg_mgcp_osmux_ip_cmd);
1697 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
1698 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
1699 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
1700 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
1701 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1702 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
Philipp Maier12943ea2018-01-17 15:40:25 +01001703 install_element(MGCP_NODE, &cfg_mgcp_domain_cmd);
Oliver Smithe36b7752019-01-22 16:31:36 +01001704 install_element(MGCP_NODE, &cfg_mgcp_conn_timeout_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001705
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001706 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1707 install_node(&trunk_node, config_write_trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001708 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1709 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1710 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
1711 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1712 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
1713 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1714 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
1715 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Philipp Maier41425e92020-11-26 00:41:59 +01001716 install_element(TRUNK_NODE, &cfg_trunk_force_realloc_cmd);
1717 install_element(TRUNK_NODE, &cfg_trunk_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001718 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1719 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
1720 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1721 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1722 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001723 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_rfc5993hr_cmd);
1724 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_rfc5993hr_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001725 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1726 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
1727 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
1728 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1729 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
1730 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1731 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
1732 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1733 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Philipp Maier889fe7f2020-07-06 17:44:12 +02001734 install_element(TRUNK_NODE, &cfg_trunk_line_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001735
1736 return 0;
1737}
1738
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001739int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1740 enum mgcp_role role)
1741{
1742 int rc;
Philipp Maier14b27a82020-06-02 20:15:30 +02001743 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001744
Pau Espin Pedrol5892b2e2022-08-11 19:21:45 +02001745 cfg->osmux_port = OSMUX_DEFAULT_PORT;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001746 cfg->osmux_batch = 4;
1747 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
1748
1749 g_cfg = cfg;
1750 rc = vty_read_config_file(config_file, NULL);
1751 if (rc < 0) {
Philipp Maier87bd9be2017-08-22 16:35:41 +02001752 fprintf(stderr, "Failed to parse the config file: '%s'\n",
1753 config_file);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001754 return rc;
1755 }
1756
Eric2764bdb2021-08-23 22:11:47 +02001757 if (!strlen(g_cfg->source_addr)) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001758 fprintf(stderr, "You need to specify a bind address.\n");
1759 return -1;
1760 }
1761
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001762 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
Philipp Maier889fe7f2020-07-06 17:44:12 +02001763 if (mgcp_trunk_equip(trunk) != 0) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001764 LOGP(DLMGCP, LOGL_ERROR,
Philipp Maierd70eef62021-07-19 13:53:28 +02001765 "Failed to initialize trunk %u (%d endpoints)\n",
Philipp Maier48454982017-11-10 16:46:41 +01001766 trunk->trunk_nr, trunk->number_endpoints);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001767 return -1;
1768 }
1769 }
1770 cfg->role = role;
1771
1772 return 0;
1773}