blob: 1bf87897bad8627fec8b9c840afb566474e358ce [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);
Pau Espin Pedrolea7aaf22022-09-22 21:07:54 +0200200 if (mgcp_conn_rtp_is_osmux(conn)) {
201 struct rate_ctr *rx_chunks, *rx_octets, *rtp_tx, *rtp_tx_dropped, *octets_tx;
202 rx_chunks = rate_ctr_group_get_ctr(conn->osmux.ctrg, OSMUX_CHUNKS_RX_CTR);
203 rx_octets = rate_ctr_group_get_ctr(conn->osmux.ctrg, OSMUX_OCTETS_RX_CTR);
204 rtp_tx = rate_ctr_group_get_ctr(conn->osmux.ctrg, OSMUX_RTP_PACKETS_TX_CTR);
205 rtp_tx_dropped = rate_ctr_group_get_ctr(conn->osmux.ctrg, OSMUX_RTP_PACKETS_TX_DROPPED_CTR);
206 octets_tx = rate_ctr_group_get_ctr(conn->osmux.ctrg, OSMUX_AMR_OCTETS_TX_CTR);
207 vty_out(vty,
208 " Osmux:%s"
209 " State: %s%s"
210 " Local CID: %d%s"
211 " Remote CID: %d%s"
212 " Chunks received: %" PRIu64 " (%" PRIu64 " bytes total)%s"
213 " RTP Packets encoded (Tx): %" PRIu64 " (%" PRIu64 " AMR octets total)%s"
214 " AMR payloads Dropped (Tx): %" PRIu64 "%s",
215 VTY_NEWLINE, osmux_state_str(conn->osmux.state), VTY_NEWLINE,
216 conn->osmux.local_cid_allocated ? conn->osmux.local_cid : -1, VTY_NEWLINE,
217 conn->osmux.remote_cid_present ? conn->osmux.remote_cid : -1, VTY_NEWLINE,
218 rx_chunks->current, rx_octets->current, VTY_NEWLINE,
219 rtp_tx->current, octets_tx->current, VTY_NEWLINE,
220 rtp_tx_dropped->current, VTY_NEWLINE
221 );
222
223 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200224}
225
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200226static void dump_endpoint(struct vty *vty, struct mgcp_endpoint *endp,
Philipp Maierd70eef62021-07-19 13:53:28 +0200227 unsigned int trunk_nr, enum mgcp_trunk_type trunk_type, int show_stats)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200228{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200229 struct mgcp_conn *conn;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200230
Philipp Maierd70eef62021-07-19 13:53:28 +0200231 vty_out(vty, "%s trunk %u endpoint %s:%s",
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200232 trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1", trunk_nr, endp->name, VTY_NEWLINE);
Philipp Maier8d6a1932020-06-18 12:19:31 +0200233 vty_out(vty, " Availability: %s%s",
234 mgcp_endp_avail(endp) ? "available" : "not in service", VTY_NEWLINE);
Stefan Sperling12086582018-06-26 15:26:28 +0200235
236 if (llist_empty(&endp->conns)) {
237 vty_out(vty, " No active connections%s", VTY_NEWLINE);
238 return;
239 }
240
241 llist_for_each_entry(conn, &endp->conns, entry) {
242 vty_out(vty, " CONN: %s%s", mgcp_conn_dump(conn), VTY_NEWLINE);
243
244 if (show_stats) {
Ericfbf78d12021-08-23 22:31:39 +0200245 if (endp->trunk->cfg->conn_timeout) {
Oliver Smithe36b7752019-01-22 16:31:36 +0100246 struct timeval remaining;
247 osmo_timer_remaining(&conn->watchdog, NULL, &remaining);
248 vty_out(vty, " Currently remaining timeout (seconds): %d.%06d%s",
249 (int)remaining.tv_sec, (int)remaining.tv_usec, VTY_NEWLINE);
250 }
251
Stefan Sperling12086582018-06-26 15:26:28 +0200252 /* FIXME: Also add verbosity for other
253 * connection types (E1) as soon as
254 * the implementation is available */
255 if (conn->type == MGCP_CONN_TYPE_RTP) {
256 dump_rtp_end(vty, &conn->u.rtp);
257 }
258 }
259 }
260}
261
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200262static void dump_ratectr_global(struct vty *vty, struct mgcp_ratectr_global *ratectr)
263{
264 vty_out(vty, "%s", VTY_NEWLINE);
265 vty_out(vty, "Rate counters (global):%s", VTY_NEWLINE);
266
267 if (ratectr->mgcp_general_ctr_group) {
268 vty_out(vty, " %s:%s",
269 ratectr->mgcp_general_ctr_group->desc->
270 group_description, VTY_NEWLINE);
271 vty_out_rate_ctr_group_fmt(vty,
272 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
273 ratectr->mgcp_general_ctr_group);
274 }
275}
276
Philipp Maier889fe7f2020-07-06 17:44:12 +0200277static void dump_ratectr_trunk(struct vty *vty, struct mgcp_trunk *trunk)
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200278{
Philipp Maier889fe7f2020-07-06 17:44:12 +0200279 struct mgcp_ratectr_trunk *ratectr = &trunk->ratectr;
280
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200281 vty_out(vty, "%s", VTY_NEWLINE);
282 vty_out(vty, "Rate counters (trunk):%s", VTY_NEWLINE);
283
284 if (ratectr->mgcp_crcx_ctr_group) {
285 vty_out(vty, " %s:%s",
286 ratectr->mgcp_crcx_ctr_group->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->mgcp_crcx_ctr_group);
291 }
292 if (ratectr->mgcp_dlcx_ctr_group) {
293 vty_out(vty, " %s:%s",
294 ratectr->mgcp_dlcx_ctr_group->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->mgcp_dlcx_ctr_group);
299 }
300 if (ratectr->mgcp_mdcx_ctr_group) {
301 vty_out(vty, " %s:%s",
302 ratectr->mgcp_mdcx_ctr_group->desc->group_description,
303 VTY_NEWLINE);
304 vty_out_rate_ctr_group_fmt(vty,
305 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
306 ratectr->mgcp_mdcx_ctr_group);
307 }
308 if (ratectr->all_rtp_conn_stats) {
309 vty_out(vty, " %s:%s",
310 ratectr->all_rtp_conn_stats->desc->group_description,
311 VTY_NEWLINE);
312 vty_out_rate_ctr_group_fmt(vty,
313 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
314 ratectr->all_rtp_conn_stats);
315 }
Pau Espin Pedrol582c2bf2022-09-22 17:53:44 +0200316 if (ratectr->all_osmux_conn_stats) {
317 vty_out(vty, " %s:%s",
318 ratectr->all_osmux_conn_stats->desc->group_description,
319 VTY_NEWLINE);
320 vty_out_rate_ctr_group_fmt(vty,
321 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
322 ratectr->all_osmux_conn_stats);
323 }
Philipp Maier889fe7f2020-07-06 17:44:12 +0200324
325 if (ratectr->e1_stats && trunk->trunk_type == MGCP_TRUNK_E1) {
326 vty_out(vty, " %s:%s",
327 ratectr->e1_stats->desc->group_description,
328 VTY_NEWLINE);
329 vty_out_rate_ctr_group_fmt(vty,
330 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
331 ratectr->e1_stats);
332 }
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200333}
334
335
Keithfe53edd2021-05-04 15:23:30 -0500336static void dump_trunk(struct vty *vty, struct mgcp_trunk *trunk, int show_stats, int active_only)
Stefan Sperling12086582018-06-26 15:26:28 +0200337{
338 int i;
Keithfe53edd2021-05-04 15:23:30 -0500339 int active_count = 0;
Stefan Sperling12086582018-06-26 15:26:28 +0200340
341 vty_out(vty, "%s trunk %d with %d endpoints:%s",
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200342 trunk->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
Philipp Maier869b21c2020-07-03 16:04:16 +0200343 trunk->trunk_nr, trunk->number_endpoints, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200344
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200345 if (!trunk->endpoints) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200346 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
347 return;
348 }
349
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200350 for (i = 0; i < trunk->number_endpoints; ++i) {
351 struct mgcp_endpoint *endp = trunk->endpoints[i];
Keithfe53edd2021-05-04 15:23:30 -0500352 if (!active_only || !llist_empty(&endp->conns)) {
353 dump_endpoint(vty, endp, trunk->trunk_nr, trunk->trunk_type,
354 show_stats);
355 if (i < trunk->number_endpoints - 1)
356 vty_out(vty, "%s", VTY_NEWLINE);
357 }
358 if (!llist_empty(&endp->conns))
359 active_count++;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200360 }
Stefan Sperling1e174872018-10-25 18:36:10 +0200361
Keithfe53edd2021-05-04 15:23:30 -0500362 if (active_count == 0)
363 vty_out(vty, "No endpoints in use.%s", VTY_NEWLINE);
364
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200365 if (show_stats)
Philipp Maier889fe7f2020-07-06 17:44:12 +0200366 dump_ratectr_trunk(vty, trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200367}
368
Keithfe53edd2021-05-04 15:23:30 -0500369static int mgcp_show(struct vty *vty, int argc, const char **argv,
370 int show_stats, int active_only)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200371{
Philipp Maier14b27a82020-06-02 20:15:30 +0200372 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200373
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200374 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Keithfe53edd2021-05-04 15:23:30 -0500375 dump_trunk(vty, trunk, show_stats, active_only);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200376
Pau Espin Pedrol928a20b2022-09-23 15:38:24 +0200377 if (g_cfg->osmux_use != OSMUX_USAGE_OFF)
Pau Espin Pedrol8de58e72019-04-24 13:33:46 +0200378 vty_out(vty, "Osmux used CID: %d%s", osmux_cid_pool_count_used(),
Philipp Maier87bd9be2017-08-22 16:35:41 +0200379 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200380
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200381 if (show_stats)
382 dump_ratectr_global(vty, &g_cfg->ratectr);
383
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200384 return CMD_SUCCESS;
385}
386
Keithfe53edd2021-05-04 15:23:30 -0500387#define SHOW_MGCP_STR "Display information about the MGCP Media Gateway\n"
388
389DEFUN(show_mgcp, show_mgcp_cmd,
390 "show mgcp [stats]",
391 SHOW_STR
392 SHOW_MGCP_STR
393 "Include statistics\n")
394{
395 int show_stats = argc >= 1;
396 return mgcp_show(vty, argc, argv, show_stats, 0);
397}
398
399DEFUN(show_mgcp_active, show_mgcp_active_cmd,
400 "show mgcp active",
401 SHOW_STR
402 SHOW_MGCP_STR
403 "Show only endpoints with active connections\n")
404{
405 return mgcp_show(vty, argc, argv, 0, 1);
406}
407
Stefan Sperling12086582018-06-26 15:26:28 +0200408static void
Philipp Maier14b27a82020-06-02 20:15:30 +0200409dump_mgcp_endpoint(struct vty *vty, struct mgcp_trunk *trunk, const char *epname)
Stefan Sperling12086582018-06-26 15:26:28 +0200410{
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200411 struct mgcp_endpoint *endp;
Stefan Sperling12086582018-06-26 15:26:28 +0200412
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200413 if (trunk) {
414 /* If a trunk is given, search on that specific trunk only */
415 endp = mgcp_endp_by_name_trunk(NULL, epname, trunk);
416 if (!endp) {
Philipp Maierd70eef62021-07-19 13:53:28 +0200417 vty_out(vty, "endpoint %s not configured on trunk %u%s", epname, trunk->trunk_nr, VTY_NEWLINE);
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200418 return;
419 }
420 } else {
421 /* If no trunk is given, search on all possible trunks */
422 endp = mgcp_endp_by_name(NULL, epname, g_cfg);
423 if (!endp) {
424 vty_out(vty, "endpoint %s not configured%s", epname, VTY_NEWLINE);
425 return;
Stefan Sperling12086582018-06-26 15:26:28 +0200426 }
427 }
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200428
429 trunk = endp->trunk;
430 dump_endpoint(vty, endp, trunk->trunk_nr, trunk->trunk_type, true);
Stefan Sperling12086582018-06-26 15:26:28 +0200431}
432
433DEFUN(show_mcgp_endpoint, show_mgcp_endpoint_cmd,
434 "show mgcp endpoint NAME",
435 SHOW_STR
436 SHOW_MGCP_STR
437 "Display information about an endpoint\n" "The name of the endpoint\n")
438{
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200439 dump_mgcp_endpoint(vty, NULL, argv[0]);
Stefan Sperling12086582018-06-26 15:26:28 +0200440 return CMD_SUCCESS;
441}
442
443DEFUN(show_mcgp_trunk_endpoint, show_mgcp_trunk_endpoint_cmd,
444 "show mgcp trunk <0-64> endpoint NAME",
445 SHOW_STR
446 SHOW_MGCP_STR
447 "Display information about a trunk\n" "Trunk number\n"
448 "Display information about an endpoint\n" "The name of the endpoint\n")
449{
Philipp Maier14b27a82020-06-02 20:15:30 +0200450 struct mgcp_trunk *trunk;
Stefan Sperling12086582018-06-26 15:26:28 +0200451 int trunkidx = atoi(argv[0]);
452
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200453 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, trunkidx);
Stefan Sperling12086582018-06-26 15:26:28 +0200454 if (!trunk) {
455 vty_out(vty, "trunk %d not found%s", trunkidx, VTY_NEWLINE);
456 return CMD_WARNING;
457 }
458
459 dump_mgcp_endpoint(vty, trunk, argv[1]);
460 return CMD_SUCCESS;
461}
462
Philipp Maier87bd9be2017-08-22 16:35:41 +0200463DEFUN(cfg_mgcp, cfg_mgcp_cmd, "mgcp", "Configure the MGCP")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200464{
465 vty->node = MGCP_NODE;
466 return CMD_SUCCESS;
467}
468
Philipp Maier19c430f2020-09-22 15:52:50 +0200469DEFUN_USRATTR(cfg_mgcp_local_ip,
470 cfg_mgcp_local_ip_cmd,
471 X(MGW_CMD_ATTR_NEWCONN),
472 "local ip " VTY_IPV46_CMD,
473 "Local options for the SDP record\n"
474 IP_STR
475 "IPv4 Address to use in SDP record\n"
476 "IPv6 Address to use in SDP record\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200477{
Eric2764bdb2021-08-23 22:11:47 +0200478 osmo_strlcpy(g_cfg->local_ip, argv[0], sizeof(g_cfg->local_ip));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200479 return CMD_SUCCESS;
480}
481
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200482#define BIND_STR "Listen/Bind related socket option\n"
483DEFUN(cfg_mgcp_bind_ip,
484 cfg_mgcp_bind_ip_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200485 "bind ip " VTY_IPV46_CMD,
486 BIND_STR IP_STR
487 "IPv4 Address to bind to\n"
488 "IPv6 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200489{
Eric2764bdb2021-08-23 22:11:47 +0200490 osmo_strlcpy(g_cfg->source_addr, argv[0], sizeof(g_cfg->source_addr));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200491 return CMD_SUCCESS;
492}
493
494DEFUN(cfg_mgcp_bind_port,
495 cfg_mgcp_bind_port_cmd,
496 "bind port <0-65534>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200497 BIND_STR "Port information\n" "UDP port to listen for MGCP messages\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200498{
499 unsigned int port = atoi(argv[0]);
500 g_cfg->source_port = port;
501 return CMD_SUCCESS;
502}
503
Philipp Maier8cfe7df2020-09-22 16:18:26 +0200504DEFUN_DEPRECATED(cfg_mgcp_bind_early,
505 cfg_mgcp_bind_early_cmd,
506 "bind early (0|1)",
507 BIND_STR
508 "Bind local ports on start up\n" "Bind on demand\n" "Bind on startup\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200509{
Philipp Maier8cfe7df2020-09-22 16:18:26 +0200510 return CMD_SUCCESS;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200511}
512
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200513#define RTP_STR "RTP configuration\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200514#define UDP_PORT_STR "UDP Port number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +0200515#define NET_START_STR "First UDP port allocated\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200516#define RANGE_START_STR "Start of the range of ports\n"
517#define RANGE_END_STR "End of the range of ports\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200518
Philipp Maierf1889d82017-11-08 14:59:39 +0100519DEFUN(cfg_mgcp_rtp_port_range,
520 cfg_mgcp_rtp_port_range_cmd,
Philipp Maiera19547b2018-05-22 13:44:34 +0200521 "rtp port-range <1024-65534> <1025-65535>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200522 RTP_STR "Range of ports to use for the NET side\n"
523 RANGE_START_STR RANGE_END_STR)
524{
Philipp Maiera19547b2018-05-22 13:44:34 +0200525 int start;
526 int end;
527
528 start = atoi(argv[0]);
529 end = atoi(argv[1]);
530
531 if (end < start) {
532 vty_out(vty, "range end port (%i) must be greater than the range start port (%i)!%s",
533 end, start, VTY_NEWLINE);
534 return CMD_WARNING;
535 }
536
537 if (start & 1) {
538 vty_out(vty, "range must begin at an even port number, autocorrecting port (%i) to: %i%s",
539 start, start & 0xFFFE, VTY_NEWLINE);
540 start &= 0xFFFE;
541 }
542
543 if ((end & 1) == 0) {
544 vty_out(vty, "range must end at an odd port number, autocorrecting port (%i) to: %i%s",
545 end, end | 1, VTY_NEWLINE);
546 end |= 1;
547 }
548
549 g_cfg->net_ports.range_start = start;
550 g_cfg->net_ports.range_end = end;
551 g_cfg->net_ports.last_port = g_cfg->net_ports.range_start;
552
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200553 return CMD_SUCCESS;
554}
Philipp Maierf1889d82017-11-08 14:59:39 +0100555ALIAS_DEPRECATED(cfg_mgcp_rtp_port_range,
556 cfg_mgcp_rtp_net_range_cmd,
557 "rtp net-range <0-65534> <0-65534>",
558 RTP_STR "Range of ports to use for the NET side\n"
559 RANGE_START_STR RANGE_END_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200560
Philipp Maier19c430f2020-09-22 15:52:50 +0200561DEFUN_USRATTR(cfg_mgcp_rtp_bind_ip,
562 cfg_mgcp_rtp_bind_ip_cmd,
563 X(MGW_CMD_ATTR_NEWCONN),
564 "rtp bind-ip A.B.C.D",
565 RTP_STR "Bind endpoints facing the Network\n"
566 "IPv4 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200567{
Eric2764bdb2021-08-23 22:11:47 +0200568 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 +0200569 return CMD_SUCCESS;
570}
Philipp Maierf1889d82017-11-08 14:59:39 +0100571ALIAS_DEPRECATED(cfg_mgcp_rtp_bind_ip,
572 cfg_mgcp_rtp_net_bind_ip_cmd,
573 "rtp net-bind-ip A.B.C.D",
574 RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200575
Philipp Maier19c430f2020-09-22 15:52:50 +0200576DEFUN_USRATTR(cfg_mgcp_rtp_no_bind_ip,
577 cfg_mgcp_rtp_no_bind_ip_cmd,
578 X(MGW_CMD_ATTR_NEWCONN),
579 "no rtp bind-ip",
580 NO_STR RTP_STR "Bind endpoints facing the Network\n"
581 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200582{
Eric2764bdb2021-08-23 22:11:47 +0200583 osmo_strlcpy(g_cfg->net_ports.bind_addr_v4, "", sizeof(g_cfg->net_ports.bind_addr_v4));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200584 return CMD_SUCCESS;
585}
Philipp Maierf1889d82017-11-08 14:59:39 +0100586ALIAS_DEPRECATED(cfg_mgcp_rtp_no_bind_ip,
587 cfg_mgcp_rtp_no_net_bind_ip_cmd,
588 "no rtp net-bind-ip",
589 NO_STR RTP_STR "Bind endpoints facing the Network\n"
590 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200591
Philipp Maier19c430f2020-09-22 15:52:50 +0200592DEFUN_USRATTR(cfg_mgcp_rtp_bind_ip_v6,
593 cfg_mgcp_rtp_bind_ip_v6_cmd,
594 X(MGW_CMD_ATTR_NEWCONN),
595 "rtp bind-ip-v6 " VTY_IPV6_CMD,
596 RTP_STR "Bind endpoints facing the Network\n"
597 "IPv6 Address to bind to\n")
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200598{
Eric2764bdb2021-08-23 22:11:47 +0200599 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 +0200600 return CMD_SUCCESS;
601}
602
Philipp Maier19c430f2020-09-22 15:52:50 +0200603DEFUN_USRATTR(cfg_mgcp_rtp_no_bind_ip_v6,
604 cfg_mgcp_rtp_no_bind_ip_v6_cmd,
605 X(MGW_CMD_ATTR_NEWCONN),
606 "no rtp bind-ip-v6",
607 NO_STR RTP_STR "Bind endpoints facing the Network\n"
608 "Address to bind to\n")
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200609{
Eric2764bdb2021-08-23 22:11:47 +0200610 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 +0200611 return CMD_SUCCESS;
612}
613
Philipp Maier19c430f2020-09-22 15:52:50 +0200614DEFUN_USRATTR(cfg_mgcp_rtp_net_bind_ip_probing,
615 cfg_mgcp_rtp_net_bind_ip_probing_cmd,
616 X(MGW_CMD_ATTR_NEWCONN),
617 "rtp ip-probing",
618 RTP_STR "automatic rtp bind ip selection\n")
Philipp Maier1cb1e382017-11-02 17:16:04 +0100619{
620 g_cfg->net_ports.bind_addr_probe = true;
621 return CMD_SUCCESS;
622}
623
Philipp Maier19c430f2020-09-22 15:52:50 +0200624DEFUN_USRATTR(cfg_mgcp_rtp_no_net_bind_ip_probing,
625 cfg_mgcp_rtp_no_net_bind_ip_probing_cmd,
626 X(MGW_CMD_ATTR_NEWCONN),
627 "no rtp ip-probing",
628 NO_STR RTP_STR "no automatic rtp bind ip selection\n")
Philipp Maier1cb1e382017-11-02 17:16:04 +0100629{
630 g_cfg->net_ports.bind_addr_probe = false;
631 return CMD_SUCCESS;
632}
633
Philipp Maier19c430f2020-09-22 15:52:50 +0200634DEFUN_USRATTR(cfg_mgcp_rtp_ip_dscp,
635 cfg_mgcp_rtp_ip_dscp_cmd,
636 X(MGW_CMD_ATTR_NEWCONN),
Harald Welte5936a9c2021-04-27 22:30:52 +0200637 "rtp ip-dscp <0-63>",
Philipp Maier19c430f2020-09-22 15:52:50 +0200638 RTP_STR
Harald Welte5936a9c2021-04-27 22:30:52 +0200639 "Use specified DSCP for the audio stream (including Osmux)\n" "The DSCP value\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200640{
641 int dscp = atoi(argv[0]);
642 g_cfg->endp_dscp = dscp;
643 return CMD_SUCCESS;
644}
645
Harald Welte55a92292021-04-28 19:06:34 +0200646DEFUN_USRATTR(cfg_mgcp_rtp_priority,
647 cfg_mgcp_rtp_priority_cmd,
648 X(MGW_CMD_ATTR_NEWCONN),
649 "rtp socket-priority <0-255>",
650 RTP_STR
651 "socket priority (values > 6 require CAP_NET_ADMIN)\n" "socket priority value\n")
652{
653 int prio = atoi(argv[0]);
654 g_cfg->endp_priority = prio;
655 return CMD_SUCCESS;
656}
657
Philipp Maier87bd9be2017-08-22 16:35:41 +0200658#define FORCE_PTIME_STR "Force a fixed ptime for packets sent"
Philipp Maier19c430f2020-09-22 15:52:50 +0200659DEFUN_USRATTR(cfg_mgcp_rtp_force_ptime,
660 cfg_mgcp_rtp_force_ptime_cmd,
661 X(MGW_CMD_ATTR_NEWCONN),
662 "rtp force-ptime (10|20|40)",
663 RTP_STR FORCE_PTIME_STR
664 "The required ptime (packet duration) in ms\n" "10 ms\n20 ms\n40 ms\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200665{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200666 g_cfg->force_ptime = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200667 return CMD_SUCCESS;
668}
669
Philipp Maier19c430f2020-09-22 15:52:50 +0200670DEFUN_USRATTR(cfg_mgcp_no_rtp_force_ptime,
671 cfg_mgcp_no_rtp_force_ptime_cmd,
672 X(MGW_CMD_ATTR_NEWCONN),
673 "no rtp force-ptime", NO_STR RTP_STR FORCE_PTIME_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200674{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200675 g_cfg->force_ptime = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200676 return CMD_SUCCESS;
677}
678
Philipp Maier19c430f2020-09-22 15:52:50 +0200679DEFUN_USRATTR(cfg_mgcp_sdp_fmtp_extra,
680 cfg_mgcp_sdp_fmtp_extra_cmd,
681 X(MGW_CMD_ATTR_NEWCONN),
682 "sdp audio fmtp-extra .NAME",
683 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
684 "Extra Information\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200685{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200686 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200687 OSMO_ASSERT(trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200688 char *txt = argv_concat(argv, argc, 0);
689 if (!txt)
690 return CMD_WARNING;
691
Philipp Maierd19de2e2020-06-03 13:55:33 +0200692 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200693 talloc_free(txt);
694 return CMD_SUCCESS;
695}
696
Philipp Maier19c430f2020-09-22 15:52:50 +0200697DEFUN_USRATTR(cfg_mgcp_allow_transcoding,
698 cfg_mgcp_allow_transcoding_cmd,
699 X(MGW_CMD_ATTR_NEWCONN),
700 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200701{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200702 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200703 OSMO_ASSERT(trunk);
704 trunk->no_audio_transcoding = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200705 return CMD_SUCCESS;
706}
707
Philipp Maier19c430f2020-09-22 15:52:50 +0200708DEFUN_USRATTR(cfg_mgcp_no_allow_transcoding,
709 cfg_mgcp_no_allow_transcoding_cmd,
710 X(MGW_CMD_ATTR_NEWCONN),
711 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200712{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200713 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200714 OSMO_ASSERT(trunk);
715 trunk->no_audio_transcoding = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200716 return CMD_SUCCESS;
717}
718
719#define SDP_STR "SDP File related options\n"
720#define AUDIO_STR "Audio payload options\n"
Philipp Maier7f90ddb2020-06-02 21:52:53 +0200721DEFUN_DEPRECATED(cfg_mgcp_sdp_payload_number,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200722 cfg_mgcp_sdp_payload_number_cmd,
723 "sdp audio-payload number <0-255>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200724 SDP_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200725{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200726 return CMD_SUCCESS;
727}
728
Philipp Maier87bd9be2017-08-22 16:35:41 +0200729ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number,
730 cfg_mgcp_sdp_payload_number_cmd_old,
731 "sdp audio payload number <0-255>",
732 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200733
Philipp Maier7f90ddb2020-06-02 21:52:53 +0200734DEFUN_DEPRECATED(cfg_mgcp_sdp_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200735 cfg_mgcp_sdp_payload_name_cmd,
736 "sdp audio-payload name NAME",
737 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
738{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200739 return CMD_SUCCESS;
740}
741
742ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200743 "sdp audio payload name NAME",
744 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200745
Philipp Maier19c430f2020-09-22 15:52:50 +0200746DEFUN_USRATTR(cfg_mgcp_sdp_payload_send_ptime,
747 cfg_mgcp_sdp_payload_send_ptime_cmd,
748 X(MGW_CMD_ATTR_NEWCONN),
749 "sdp audio-payload send-ptime",
750 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\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_ptime = 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_ptime,
759 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
760 X(MGW_CMD_ATTR_NEWCONN),
761 "no sdp audio-payload send-ptime",
762 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\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_ptime = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200767 return CMD_SUCCESS;
768}
769
Philipp Maier19c430f2020-09-22 15:52:50 +0200770DEFUN_USRATTR(cfg_mgcp_sdp_payload_send_name,
771 cfg_mgcp_sdp_payload_send_name_cmd,
772 X(MGW_CMD_ATTR_NEWCONN),
773 "sdp audio-payload send-name",
774 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200775{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200776 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200777 OSMO_ASSERT(trunk);
778 trunk->audio_send_name = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200779 return CMD_SUCCESS;
780}
781
Philipp Maier19c430f2020-09-22 15:52:50 +0200782DEFUN_USRATTR(cfg_mgcp_no_sdp_payload_send_name,
783 cfg_mgcp_no_sdp_payload_send_name_cmd,
784 X(MGW_CMD_ATTR_NEWCONN),
785 "no sdp audio-payload send-name",
786 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200787{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200788 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200789 OSMO_ASSERT(trunk);
790 trunk->audio_send_name = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200791 return CMD_SUCCESS;
792}
793
Philipp Maierba94b6d2020-09-22 16:14:32 +0200794DEFUN_DEPRECATED(cfg_mgcp_loop,
795 cfg_mgcp_loop_cmd,
796 "loop (0|1)",
797 "Loop audio for all endpoints on main trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200798{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200799 return CMD_SUCCESS;
800}
801
Philipp Maier19c430f2020-09-22 15:52:50 +0200802DEFUN_USRATTR(cfg_mgcp_force_realloc,
803 cfg_mgcp_force_realloc_cmd,
804 X(MGW_CMD_ATTR_NEWCONN),
805 "force-realloc (0|1)",
806 "Force endpoint reallocation when the endpoint is still seized\n"
807 "Don't force reallocation\n" "force reallocation\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200808{
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);
811 trunk->force_realloc = 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_rtp_accept_all,
816 cfg_mgcp_rtp_accept_all_cmd,
817 "rtp-accept-all (0|1)",
818 "Accept all RTP packets, even when the originating IP/Port does not match\n"
819 "enable filter\n" "disable filter\n",
820 CMD_ATTR_IMMEDIATE)
Philipp Maier87bd9be2017-08-22 16:35:41 +0200821{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200822 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200823 OSMO_ASSERT(trunk);
824 trunk->rtp_accept_all = atoi(argv[0]);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200825 return CMD_SUCCESS;
826}
827
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200828DEFUN(cfg_mgcp_number_endp,
829 cfg_mgcp_number_endp_cmd,
Philipp Maier869b21c2020-07-03 16:04:16 +0200830 "number endpoints <1-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200831 "Number options\n" "Endpoints available\n" "Number endpoints\n")
832{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200833 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200834 OSMO_ASSERT(trunk);
Philipp Maier889fe7f2020-07-06 17:44:12 +0200835 trunk->v.vty_number_endpoints = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200836 return CMD_SUCCESS;
837}
838
Philipp Maier19c430f2020-09-22 15:52:50 +0200839DEFUN_ATTR(cfg_mgcp_omit_rtcp,
840 cfg_mgcp_omit_rtcp_cmd,
841 "rtcp-omit", RTCP_OMIT_STR,
842 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200843{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200844 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200845 trunk->omit_rtcp = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200846 return CMD_SUCCESS;
847}
848
Philipp Maier19c430f2020-09-22 15:52:50 +0200849DEFUN_ATTR(cfg_mgcp_no_omit_rtcp,
850 cfg_mgcp_no_omit_rtcp_cmd,
851 "no rtcp-omit",
852 NO_STR RTCP_OMIT_STR,
853 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200854{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200855 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200856 OSMO_ASSERT(trunk);
857 trunk->omit_rtcp = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200858 return CMD_SUCCESS;
859}
860
Philipp Maier19c430f2020-09-22 15:52:50 +0200861DEFUN_USRATTR(cfg_mgcp_patch_rtp_ssrc,
862 cfg_mgcp_patch_rtp_ssrc_cmd,
863 X(MGW_CMD_ATTR_NEWCONN),
864 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200865{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200866 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200867 OSMO_ASSERT(trunk);
868 trunk->force_constant_ssrc = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200869 return CMD_SUCCESS;
870}
871
Philipp Maier19c430f2020-09-22 15:52:50 +0200872DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_ssrc,
873 cfg_mgcp_no_patch_rtp_ssrc_cmd,
874 X(MGW_CMD_ATTR_NEWCONN),
875 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200876{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200877 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200878 OSMO_ASSERT(trunk);
879 trunk->force_constant_ssrc = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200880 return CMD_SUCCESS;
881}
882
Philipp Maier19c430f2020-09-22 15:52:50 +0200883DEFUN_USRATTR(cfg_mgcp_patch_rtp_ts,
884 cfg_mgcp_patch_rtp_ts_cmd,
885 X(MGW_CMD_ATTR_NEWCONN),
886 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200887{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200888 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200889 OSMO_ASSERT(trunk);
890 trunk->force_aligned_timing = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200891 return CMD_SUCCESS;
892}
893
Philipp Maier19c430f2020-09-22 15:52:50 +0200894DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_ts,
895 cfg_mgcp_no_patch_rtp_ts_cmd,
896 X(MGW_CMD_ATTR_NEWCONN),
897 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200898{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200899 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200900 OSMO_ASSERT(trunk);
901 trunk->force_aligned_timing = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200902 return CMD_SUCCESS;
903}
904
Philipp Maier19c430f2020-09-22 15:52:50 +0200905DEFUN_USRATTR(cfg_mgcp_patch_rtp_rfc5993hr,
906 cfg_mgcp_patch_rtp_rfc5993hr_cmd,
907 X(MGW_CMD_ATTR_NEWCONN),
908 "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +0100909{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200910 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200911 OSMO_ASSERT(trunk);
912 trunk->rfc5993_hr_convert = true;
Philipp Maier9fc8a022019-02-20 12:26:52 +0100913 return CMD_SUCCESS;
914}
915
Philipp Maier19c430f2020-09-22 15:52:50 +0200916DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_rfc5993hr,
917 cfg_mgcp_no_patch_rtp_rfc5993hr_cmd,
918 X(MGW_CMD_ATTR_NEWCONN),
919 "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +0100920{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200921 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200922 OSMO_ASSERT(trunk);
923 trunk->rfc5993_hr_convert = false;
Philipp Maier9fc8a022019-02-20 12:26:52 +0100924 return CMD_SUCCESS;
925}
926
Philipp Maier19c430f2020-09-22 15:52:50 +0200927DEFUN_USRATTR(cfg_mgcp_no_patch_rtp,
928 cfg_mgcp_no_patch_rtp_cmd,
929 X(MGW_CMD_ATTR_NEWCONN),
930 "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200931{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200932 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200933 OSMO_ASSERT(trunk);
934 trunk->force_constant_ssrc = 0;
935 trunk->force_aligned_timing = 0;
936 trunk->rfc5993_hr_convert = false;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200937 return CMD_SUCCESS;
938}
939
Philipp Maier19c430f2020-09-22 15:52:50 +0200940DEFUN_ATTR(cfg_mgcp_rtp_keepalive,
941 cfg_mgcp_rtp_keepalive_cmd,
942 "rtp keep-alive <1-120>",
943 RTP_STR RTP_KEEPALIVE_STR "Keep alive interval in secs\n",
944 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200945{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200946 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200947 OSMO_ASSERT(trunk);
948 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200949 return CMD_SUCCESS;
950}
951
Philipp Maier19c430f2020-09-22 15:52:50 +0200952DEFUN_ATTR(cfg_mgcp_rtp_keepalive_once,
953 cfg_mgcp_rtp_keepalive_once_cmd,
954 "rtp keep-alive once",
955 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n",
956 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200957{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200958 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200959 OSMO_ASSERT(trunk);
960 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200961 return CMD_SUCCESS;
962}
963
Philipp Maier19c430f2020-09-22 15:52:50 +0200964DEFUN_ATTR(cfg_mgcp_no_rtp_keepalive,
965 cfg_mgcp_no_rtp_keepalive_cmd,
966 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR,
967 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200968{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200969 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200970 OSMO_ASSERT(trunk);
971 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_NEVER);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200972 return CMD_SUCCESS;
973}
974
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200975#define CALL_AGENT_STR "Call agent information\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200976DEFUN(cfg_mgcp_agent_addr,
977 cfg_mgcp_agent_addr_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200978 "call-agent ip " VTY_IPV46_CMD,
979 CALL_AGENT_STR IP_STR
980 "IPv4 Address of the call agent\n"
981 "IPv6 Address of the call agent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200982{
Eric2764bdb2021-08-23 22:11:47 +0200983 osmo_strlcpy(g_cfg->call_agent_addr, argv[0], sizeof(g_cfg->call_agent_addr));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200984 return CMD_SUCCESS;
985}
986
987ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200988 "call agent ip A.B.C.D",
989 CALL_AGENT_STR CALL_AGENT_STR IP_STR
990 "IPv4 Address of the callagent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200991
Philipp Maier21be42a2020-05-29 21:39:48 +0200992DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
Philipp Maier0653cc82020-08-10 22:52:51 +0200993 "trunk <0-64>", "Configure a SS7 trunk\n" "Trunk Nr\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200994{
Philipp Maier14b27a82020-06-02 20:15:30 +0200995 struct mgcp_trunk *trunk;
Philipp Maierd70eef62021-07-19 13:53:28 +0200996 unsigned int index = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200997
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200998 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, index);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100999 if (!trunk) {
1000 trunk = mgcp_trunk_alloc(g_cfg, MGCP_TRUNK_E1, index);
Philipp Maier2d681fd2020-05-29 16:20:25 +02001001 if (!trunk) {
1002 vty_out(vty, "%%Unable to allocate trunk %u.%s",
1003 index, VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +01001004 return CMD_WARNING;
Philipp Maier2d681fd2020-05-29 16:20:25 +02001005 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001006 }
1007
1008 vty->node = TRUNK_NODE;
1009 vty->index = trunk;
1010 return CMD_SUCCESS;
1011}
1012
1013static int config_write_trunk(struct vty *vty)
1014{
Philipp Maier14b27a82020-06-02 20:15:30 +02001015 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001016
1017 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
Philipp Maierd19de2e2020-06-03 13:55:33 +02001018
1019 /* Due to historical reasons, the virtual trunk is configured
1020 using separate VTY parameters, so we omit writing the trunk
1021 config of trunk 0 here. The configuration for the virtual
1022 trunk is written by config_write_mgcp(). */
1023
Philipp Maier31682a32020-11-26 00:39:35 +01001024 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL
1025 && trunk->trunk_nr == MGCP_VIRT_TRUNK_ID)
Philipp Maierd19de2e2020-06-03 13:55:33 +02001026 continue;
1027
Philipp Maierd70eef62021-07-19 13:53:28 +02001028 vty_out(vty, " trunk %u%s", trunk->trunk_nr, VTY_NEWLINE);
Philipp Maier889fe7f2020-07-06 17:44:12 +02001029 vty_out(vty, " line %u%s", trunk->e1.vty_line_nr, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001030 vty_out(vty, " %ssdp audio-payload send-ptime%s",
1031 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
1032 vty_out(vty, " %ssdp audio-payload send-name%s",
1033 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
1034
1035 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
1036 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
1037 else if (trunk->keepalive_interval)
1038 vty_out(vty, " rtp keep-alive %d%s",
1039 trunk->keepalive_interval, VTY_NEWLINE);
1040 else
1041 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001042 vty_out(vty, " force-realloc %d%s",
1043 trunk->force_realloc, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001044 vty_out(vty, " rtp-accept-all %d%s",
1045 trunk->rtp_accept_all, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001046 if (trunk->omit_rtcp)
1047 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
1048 else
1049 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001050 if (trunk->force_constant_ssrc || trunk->force_aligned_timing
Philipp Maierd19de2e2020-06-03 13:55:33 +02001051 || trunk->rfc5993_hr_convert) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001052 vty_out(vty, " %srtp-patch ssrc%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001053 trunk->force_constant_ssrc ? "" : "no ",
1054 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001055 vty_out(vty, " %srtp-patch timestamp%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001056 trunk->force_aligned_timing ? "" : "no ",
1057 VTY_NEWLINE);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001058 vty_out(vty, " %srtp-patch rfc5993hr%s",
1059 trunk->rfc5993_hr_convert ? "" : "no ",
1060 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001061 } else
1062 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
1063 if (trunk->audio_fmtp_extra)
1064 vty_out(vty, " sdp audio fmtp-extra %s%s",
1065 trunk->audio_fmtp_extra, VTY_NEWLINE);
1066 vty_out(vty, " %sallow-transcoding%s",
1067 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
1068 }
1069
1070 return CMD_SUCCESS;
1071}
1072
Philipp Maier19c430f2020-09-22 15:52:50 +02001073DEFUN_USRATTR(cfg_trunk_sdp_fmtp_extra,
1074 cfg_trunk_sdp_fmtp_extra_cmd,
1075 X(MGW_CMD_ATTR_NEWCONN),
1076 "sdp audio fmtp-extra .NAME",
1077 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
1078 "Extra Information\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001079{
Philipp Maier14b27a82020-06-02 20:15:30 +02001080 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001081 char *txt = argv_concat(argv, argc, 0);
1082 if (!txt)
1083 return CMD_WARNING;
1084
1085 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
1086 talloc_free(txt);
1087 return CMD_SUCCESS;
1088}
1089
Philipp Maier7f90ddb2020-06-02 21:52:53 +02001090DEFUN_DEPRECATED(cfg_trunk_payload_number,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001091 cfg_trunk_payload_number_cmd,
1092 "sdp audio-payload number <0-255>",
1093 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
1094{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001095 return CMD_SUCCESS;
1096}
1097
1098ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001099 "sdp audio payload number <0-255>",
1100 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001101
Philipp Maier7f90ddb2020-06-02 21:52:53 +02001102DEFUN_DEPRECATED(cfg_trunk_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001103 cfg_trunk_payload_name_cmd,
1104 "sdp audio-payload name NAME",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001105 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001106{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001107 return CMD_SUCCESS;
1108}
1109
1110ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001111 "sdp audio payload name NAME",
1112 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001113
Philipp Maierba94b6d2020-09-22 16:14:32 +02001114DEFUN_DEPRECATED(cfg_trunk_loop,
1115 cfg_trunk_loop_cmd,
1116 "loop (0|1)",
1117 "Loop audio for all endpoints on this trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001118{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001119 return CMD_SUCCESS;
1120}
1121
Philipp Maier41425e92020-11-26 00:41:59 +01001122DEFUN_USRATTR(cfg_trunk_force_realloc,
1123 cfg_trunk_force_realloc_cmd,
1124 X(MGW_CMD_ATTR_NEWCONN),
1125 "force-realloc (0|1)",
1126 "Force endpoint reallocation when the endpoint is still seized\n"
1127 "Don't force reallocation\n" "force reallocation\n")
1128{
1129 struct mgcp_trunk *trunk = vty->index;
1130 OSMO_ASSERT(trunk);
1131 trunk->force_realloc = atoi(argv[0]);
1132 return CMD_SUCCESS;
1133}
1134
1135DEFUN_ATTR(cfg_trunk_rtp_accept_all,
1136 cfg_trunk_rtp_accept_all_cmd,
1137 "rtp-accept-all (0|1)",
1138 "Accept all RTP packets, even when the originating IP/Port does not match\n"
1139 "enable filter\n" "disable filter\n",
1140 CMD_ATTR_IMMEDIATE)
1141{
1142 struct mgcp_trunk *trunk = vty->index;
1143 OSMO_ASSERT(trunk);
1144 trunk->rtp_accept_all = atoi(argv[0]);
1145 return CMD_SUCCESS;
1146}
1147
Philipp Maier19c430f2020-09-22 15:52:50 +02001148DEFUN_USRATTR(cfg_trunk_sdp_payload_send_ptime,
1149 cfg_trunk_sdp_payload_send_ptime_cmd,
1150 X(MGW_CMD_ATTR_NEWCONN),
1151 "sdp audio-payload send-ptime",
1152 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001153{
Philipp Maier14b27a82020-06-02 20:15:30 +02001154 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001155 trunk->audio_send_ptime = 1;
1156 return CMD_SUCCESS;
1157}
1158
Philipp Maier19c430f2020-09-22 15:52:50 +02001159DEFUN_USRATTR(cfg_trunk_no_sdp_payload_send_ptime,
1160 cfg_trunk_no_sdp_payload_send_ptime_cmd,
1161 X(MGW_CMD_ATTR_NEWCONN),
1162 "no sdp audio-payload send-ptime",
1163 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
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->audio_send_ptime = 0;
1167 return CMD_SUCCESS;
1168}
1169
Philipp Maier19c430f2020-09-22 15:52:50 +02001170DEFUN_USRATTR(cfg_trunk_sdp_payload_send_name,
1171 cfg_trunk_sdp_payload_send_name_cmd,
1172 X(MGW_CMD_ATTR_NEWCONN),
1173 "sdp audio-payload send-name",
1174 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001175{
Philipp Maier14b27a82020-06-02 20:15:30 +02001176 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001177 trunk->audio_send_name = 1;
1178 return CMD_SUCCESS;
1179}
1180
Philipp Maier19c430f2020-09-22 15:52:50 +02001181DEFUN_USRATTR(cfg_trunk_no_sdp_payload_send_name,
1182 cfg_trunk_no_sdp_payload_send_name_cmd,
1183 X(MGW_CMD_ATTR_NEWCONN),
1184 "no sdp audio-payload send-name",
1185 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001186{
Philipp Maier14b27a82020-06-02 20:15:30 +02001187 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001188 trunk->audio_send_name = 0;
1189 return CMD_SUCCESS;
1190}
1191
Philipp Maier19c430f2020-09-22 15:52:50 +02001192DEFUN_ATTR(cfg_trunk_omit_rtcp,
1193 cfg_trunk_omit_rtcp_cmd,
1194 "rtcp-omit", RTCP_OMIT_STR,
1195 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001196{
Philipp Maier14b27a82020-06-02 20:15:30 +02001197 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001198 trunk->omit_rtcp = 1;
1199 return CMD_SUCCESS;
1200}
1201
Philipp Maier19c430f2020-09-22 15:52:50 +02001202DEFUN_ATTR(cfg_trunk_no_omit_rtcp,
1203 cfg_trunk_no_omit_rtcp_cmd,
1204 "no rtcp-omit", NO_STR RTCP_OMIT_STR,
1205 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001206{
Philipp Maier14b27a82020-06-02 20:15:30 +02001207 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001208 trunk->omit_rtcp = 0;
1209 return CMD_SUCCESS;
1210}
1211
Philipp Maier19c430f2020-09-22 15:52:50 +02001212DEFUN_USRATTR(cfg_trunk_patch_rtp_ssrc,
1213 cfg_trunk_patch_rtp_ssrc_cmd,
1214 X(MGW_CMD_ATTR_NEWCONN),
1215 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001216{
Philipp Maier14b27a82020-06-02 20:15:30 +02001217 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001218 trunk->force_constant_ssrc = 1;
1219 return CMD_SUCCESS;
1220}
1221
Philipp Maier19c430f2020-09-22 15:52:50 +02001222DEFUN_USRATTR(cfg_trunk_no_patch_rtp_ssrc,
1223 cfg_trunk_no_patch_rtp_ssrc_cmd,
1224 X(MGW_CMD_ATTR_NEWCONN),
1225 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001226{
Philipp Maier14b27a82020-06-02 20:15:30 +02001227 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001228 trunk->force_constant_ssrc = 0;
1229 return CMD_SUCCESS;
1230}
1231
Philipp Maier19c430f2020-09-22 15:52:50 +02001232DEFUN_USRATTR(cfg_trunk_patch_rtp_ts,
1233 cfg_trunk_patch_rtp_ts_cmd,
1234 X(MGW_CMD_ATTR_NEWCONN),
1235 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001236{
Philipp Maier14b27a82020-06-02 20:15:30 +02001237 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001238 trunk->force_aligned_timing = 1;
1239 return CMD_SUCCESS;
1240}
1241
Philipp Maier19c430f2020-09-22 15:52:50 +02001242DEFUN_USRATTR(cfg_trunk_no_patch_rtp_ts,
1243 cfg_trunk_no_patch_rtp_ts_cmd,
1244 X(MGW_CMD_ATTR_NEWCONN),
1245 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001246{
Philipp Maier14b27a82020-06-02 20:15:30 +02001247 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001248 trunk->force_aligned_timing = 0;
1249 return CMD_SUCCESS;
1250}
1251
Philipp Maier19c430f2020-09-22 15:52:50 +02001252DEFUN_USRATTR(cfg_trunk_patch_rtp_rfc5993hr,
1253 cfg_trunk_patch_rtp_rfc5993hr_cmd,
1254 X(MGW_CMD_ATTR_NEWCONN),
1255 "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +01001256{
Philipp Maier14b27a82020-06-02 20:15:30 +02001257 struct mgcp_trunk *trunk = vty->index;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001258 trunk->rfc5993_hr_convert = true;
1259 return CMD_SUCCESS;
1260}
1261
Philipp Maier19c430f2020-09-22 15:52:50 +02001262DEFUN_USRATTR(cfg_trunk_no_patch_rtp_rfc5993hr,
1263 cfg_trunk_no_patch_rtp_rfc5993hr_cmd,
1264 X(MGW_CMD_ATTR_NEWCONN),
1265 "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +01001266{
Philipp Maier14b27a82020-06-02 20:15:30 +02001267 struct mgcp_trunk *trunk = vty->index;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001268 trunk->rfc5993_hr_convert = false;
1269 return CMD_SUCCESS;
1270}
1271
Philipp Maier19c430f2020-09-22 15:52:50 +02001272DEFUN_USRATTR(cfg_trunk_no_patch_rtp,
1273 cfg_trunk_no_patch_rtp_cmd,
1274 X(MGW_CMD_ATTR_NEWCONN),
1275 "no rtp-patch", NO_STR RTP_PATCH_STR)
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 trunk->force_constant_ssrc = 0;
1279 trunk->force_aligned_timing = 0;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001280 trunk->rfc5993_hr_convert = false;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001281 return CMD_SUCCESS;
1282}
1283
Philipp Maier19c430f2020-09-22 15:52:50 +02001284DEFUN_ATTR(cfg_trunk_rtp_keepalive,
1285 cfg_trunk_rtp_keepalive_cmd,
1286 "rtp keep-alive <1-120>",
1287 RTP_STR RTP_KEEPALIVE_STR "Keep-alive interval in secs\n",
1288 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001289{
Philipp Maier14b27a82020-06-02 20:15:30 +02001290 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001291 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
1292 return CMD_SUCCESS;
1293}
1294
Philipp Maier19c430f2020-09-22 15:52:50 +02001295DEFUN_ATTR(cfg_trunk_rtp_keepalive_once,
1296 cfg_trunk_rtp_keepalive_once_cmd,
1297 "rtp keep-alive once",
1298 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n",
1299 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001300{
Philipp Maier14b27a82020-06-02 20:15:30 +02001301 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001302 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
1303 return CMD_SUCCESS;
1304}
1305
Philipp Maier19c430f2020-09-22 15:52:50 +02001306DEFUN_ATTR(cfg_trunk_no_rtp_keepalive,
1307 cfg_trunk_no_rtp_keepalive_cmd,
1308 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR,
1309 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001310{
Philipp Maier14b27a82020-06-02 20:15:30 +02001311 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001312 mgcp_trunk_set_keepalive(trunk, 0);
1313 return CMD_SUCCESS;
1314}
1315
Philipp Maier19c430f2020-09-22 15:52:50 +02001316DEFUN_USRATTR(cfg_trunk_allow_transcoding,
1317 cfg_trunk_allow_transcoding_cmd,
1318 X(MGW_CMD_ATTR_NEWCONN),
1319 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001320{
Philipp Maier14b27a82020-06-02 20:15:30 +02001321 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001322 trunk->no_audio_transcoding = 0;
1323 return CMD_SUCCESS;
1324}
1325
Philipp Maier19c430f2020-09-22 15:52:50 +02001326DEFUN_USRATTR(cfg_trunk_no_allow_transcoding,
1327 cfg_trunk_no_allow_transcoding_cmd,
1328 X(MGW_CMD_ATTR_NEWCONN),
1329 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001330{
Philipp Maier14b27a82020-06-02 20:15:30 +02001331 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001332 trunk->no_audio_transcoding = 1;
1333 return CMD_SUCCESS;
1334}
1335
Philipp Maier889fe7f2020-07-06 17:44:12 +02001336#define LINE_STR "Configure trunk for given Line\nE1/T1 Line Number\n"
1337
1338DEFUN(cfg_trunk_line,
1339 cfg_trunk_line_cmd,
1340 "line <0-255>",
1341 LINE_STR)
1342{
1343 struct mgcp_trunk *trunk = vty->index;
1344 int line_nr = atoi(argv[0]);
1345 trunk->e1.vty_line_nr = line_nr;
1346 return CMD_SUCCESS;
1347}
1348
Philipp Maier87bd9be2017-08-22 16:35:41 +02001349DEFUN(loop_conn,
1350 loop_conn_cmd,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001351 "loop-endpoint <0-64> NAME (0|1)",
1352 "Loop a given endpoint\n" "Trunk number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +02001353 "The name in hex of the endpoint\n" "Disable the loop\n"
1354 "Enable the loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001355{
Philipp Maier14b27a82020-06-02 20:15:30 +02001356 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001357 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +02001358 struct mgcp_conn *conn;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001359
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001360 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001361 if (!trunk) {
1362 vty_out(vty, "%%Trunk %d not found in the config.%s",
1363 atoi(argv[0]), VTY_NEWLINE);
1364 return CMD_WARNING;
1365 }
1366
1367 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001368 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001369 trunk->trunk_nr, VTY_NEWLINE);
1370 return CMD_WARNING;
1371 }
1372
1373 int endp_no = strtoul(argv[1], NULL, 16);
1374 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1375 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001376 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001377 return CMD_WARNING;
1378 }
1379
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001380 endp = trunk->endpoints[endp_no];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001381 int loop = atoi(argv[2]);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001382 llist_for_each_entry(conn, &endp->conns, entry) {
1383 if (conn->type == MGCP_CONN_TYPE_RTP)
1384 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1385 mgcp_rtp_end_config(endp, 1, &conn->u.rtp.end);
1386 else {
1387 /* FIXME: Introduce support for other connection (E1)
1388 * types when implementation is available */
1389 vty_out(vty, "%%Can't enable SSRC patching,"
1390 "connection %s is not an RTP connection.%s",
1391 mgcp_conn_dump(conn), VTY_NEWLINE);
1392 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001393
Philipp Maier87bd9be2017-08-22 16:35:41 +02001394 if (loop)
1395 conn->mode = MGCP_CONN_LOOPBACK;
1396 else
1397 conn->mode = conn->mode_orig;
1398 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001399
1400 return CMD_SUCCESS;
1401}
1402
Philipp Maier87bd9be2017-08-22 16:35:41 +02001403DEFUN(tap_rtp,
1404 tap_rtp_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001405 "tap-rtp <0-64> ENDPOINT CONN (in|out) " VTY_IPV46_CMD " <0-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001406 "Forward data on endpoint to a different system\n" "Trunk number\n"
1407 "The endpoint in hex\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +02001408 "The connection id in hex\n"
1409 "Forward incoming data\n"
1410 "Forward leaving data\n"
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001411 "Destination IPv4 of the data\n"
1412 "Destination IPv6 of the data\n"
1413 "Destination port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001414{
1415 struct mgcp_rtp_tap *tap;
Philipp Maier14b27a82020-06-02 20:15:30 +02001416 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001417 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +02001418 struct mgcp_conn_rtp *conn;
Philipp Maier01d24a32017-11-21 17:26:09 +01001419 const char *conn_id = NULL;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001420
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001421 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001422 if (!trunk) {
1423 vty_out(vty, "%%Trunk %d not found in the config.%s",
1424 atoi(argv[0]), VTY_NEWLINE);
1425 return CMD_WARNING;
1426 }
1427
1428 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001429 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001430 trunk->trunk_nr, VTY_NEWLINE);
1431 return CMD_WARNING;
1432 }
1433
1434 int endp_no = strtoul(argv[1], NULL, 16);
1435 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1436 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001437 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001438 return CMD_WARNING;
1439 }
1440
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001441 endp = trunk->endpoints[endp_no];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001442
Philipp Maier01d24a32017-11-21 17:26:09 +01001443 conn_id = argv[2];
Philipp Maier87bd9be2017-08-22 16:35:41 +02001444 conn = mgcp_conn_get_rtp(endp, conn_id);
1445 if (!conn) {
Philipp Maier01d24a32017-11-21 17:26:09 +01001446 vty_out(vty, "Conn ID %s is invalid.%s",
1447 conn_id, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001448 return CMD_WARNING;
1449 }
1450
1451 if (strcmp(argv[3], "in") == 0)
1452 tap = &conn->tap_in;
1453 else if (strcmp(argv[3], "out") == 0)
1454 tap = &conn->tap_out;
1455 else {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001456 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1457 return CMD_WARNING;
1458 }
1459
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001460 memset(&tap->forward, 0, sizeof(tap->forward));
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001461
1462 tap->forward.u.sa.sa_family = osmo_ip_str_type(argv[4]);
1463 switch (tap->forward.u.sa.sa_family) {
1464 case AF_INET:
1465 if (inet_pton(AF_INET, argv[4], &tap->forward.u.sin.sin_addr) != 1)
1466 return CMD_WARNING;
1467 tap->forward.u.sin.sin_port = htons(atoi(argv[5]));
1468 break;
1469 case AF_INET6:
1470 if (inet_pton(AF_INET6, argv[4], &tap->forward.u.sin6.sin6_addr) != 1)
1471 return CMD_WARNING;
1472 tap->forward.u.sin6.sin6_port = htons(atoi(argv[5]));
1473 break;
1474 default:
1475 return CMD_WARNING;
1476 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001477 tap->enabled = 1;
1478 return CMD_SUCCESS;
1479}
1480
1481DEFUN(free_endp, free_endp_cmd,
1482 "free-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001483 "Free 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
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001488 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001489 if (!trunk) {
1490 vty_out(vty, "%%Trunk %d not found in the config.%s",
1491 atoi(argv[0]), VTY_NEWLINE);
1492 return CMD_WARNING;
1493 }
1494
1495 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001496 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001497 trunk->trunk_nr, VTY_NEWLINE);
1498 return CMD_WARNING;
1499 }
1500
1501 int endp_no = strtoul(argv[1], NULL, 16);
1502 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1503 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001504 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001505 return CMD_WARNING;
1506 }
1507
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001508 endp = trunk->endpoints[endp_no];
Philipp Maier1355d7e2018-02-01 14:30:06 +01001509 mgcp_endp_release(endp);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001510 return CMD_SUCCESS;
1511}
1512
1513DEFUN(reset_endp, reset_endp_cmd,
1514 "reset-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001515 "Reset the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001516{
Philipp Maier14b27a82020-06-02 20:15:30 +02001517 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001518 struct mgcp_endpoint *endp;
1519 int endp_no, rc;
1520
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001521 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001522 if (!trunk) {
1523 vty_out(vty, "%%Trunk %d not found in the config.%s",
1524 atoi(argv[0]), VTY_NEWLINE);
1525 return CMD_WARNING;
1526 }
1527
1528 if (!trunk->endpoints) {
Philipp Maierd70eef62021-07-19 13:53:28 +02001529 vty_out(vty, "%%Trunk %u has no endpoints allocated.%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001530 trunk->trunk_nr, VTY_NEWLINE);
1531 return CMD_WARNING;
1532 }
1533
1534 endp_no = strtoul(argv[1], NULL, 16);
1535 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1536 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001537 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001538 return CMD_WARNING;
1539 }
1540
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001541 endp = trunk->endpoints[endp_no];
1542 rc = mgcp_send_reset_ep(endp);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001543 if (rc < 0) {
1544 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1545 return CMD_WARNING;
1546 }
1547 return CMD_SUCCESS;
1548}
1549
1550DEFUN(reset_all_endp, reset_all_endp_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001551 "reset-all-endpoints", "Reset all endpoints\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001552{
1553 int rc;
1554
1555 rc = mgcp_send_reset_all(g_cfg);
1556 if (rc < 0) {
1557 vty_out(vty, "Error %d during endpoint reset.%s",
1558 rc, VTY_NEWLINE);
1559 return CMD_WARNING;
1560 }
1561 return CMD_SUCCESS;
1562}
1563
1564#define OSMUX_STR "RTP multiplexing\n"
1565DEFUN(cfg_mgcp_osmux,
1566 cfg_mgcp_osmux_cmd,
1567 "osmux (on|off|only)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001568 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001569{
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001570 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +02001571 OSMO_ASSERT(trunk);
1572
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001573 if (strcmp(argv[0], "off") == 0) {
Pau Espin Pedrol928a20b2022-09-23 15:38:24 +02001574 g_cfg->osmux_use = OSMUX_USAGE_OFF;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001575 return CMD_SUCCESS;
Pau Espin Pedrolb542b042019-04-23 13:09:32 +02001576 } else if (strcmp(argv[0], "on") == 0)
Pau Espin Pedrol928a20b2022-09-23 15:38:24 +02001577 g_cfg->osmux_use = OSMUX_USAGE_ON;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001578 else if (strcmp(argv[0], "only") == 0)
Pau Espin Pedrol928a20b2022-09-23 15:38:24 +02001579 g_cfg->osmux_use = OSMUX_USAGE_ONLY;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001580
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001581 return CMD_SUCCESS;
Pau Espin Pedrolb542b042019-04-23 13:09:32 +02001582
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001583}
1584
1585DEFUN(cfg_mgcp_osmux_ip,
1586 cfg_mgcp_osmux_ip_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001587 "osmux bind-ip " VTY_IPV46_CMD,
1588 OSMUX_STR IP_STR
1589 "IPv4 Address to bind to\n"
1590 "IPv6 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001591{
Eric2764bdb2021-08-23 22:11:47 +02001592 osmo_strlcpy(g_cfg->osmux_addr, argv[0], sizeof(g_cfg->osmux_addr));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001593 return CMD_SUCCESS;
1594}
1595
1596DEFUN(cfg_mgcp_osmux_batch_factor,
1597 cfg_mgcp_osmux_batch_factor_cmd,
1598 "osmux batch-factor <1-8>",
1599 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1600{
1601 g_cfg->osmux_batch = atoi(argv[0]);
1602 return CMD_SUCCESS;
1603}
1604
1605DEFUN(cfg_mgcp_osmux_batch_size,
1606 cfg_mgcp_osmux_batch_size_cmd,
1607 "osmux batch-size <1-65535>",
1608 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1609{
1610 g_cfg->osmux_batch_size = atoi(argv[0]);
1611 return CMD_SUCCESS;
1612}
1613
1614DEFUN(cfg_mgcp_osmux_port,
1615 cfg_mgcp_osmux_port_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001616 "osmux port <1-65535>", OSMUX_STR "port\n" "UDP port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001617{
1618 g_cfg->osmux_port = atoi(argv[0]);
1619 return CMD_SUCCESS;
1620}
1621
1622DEFUN(cfg_mgcp_osmux_dummy,
1623 cfg_mgcp_osmux_dummy_cmd,
1624 "osmux dummy (on|off)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001625 OSMUX_STR "Dummy padding\n" "Enable dummy padding\n"
1626 "Disable dummy padding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001627{
1628 if (strcmp(argv[0], "on") == 0)
1629 g_cfg->osmux_dummy = 1;
1630 else if (strcmp(argv[0], "off") == 0)
1631 g_cfg->osmux_dummy = 0;
1632
1633 return CMD_SUCCESS;
1634}
1635
Philipp Maier12943ea2018-01-17 15:40:25 +01001636DEFUN(cfg_mgcp_domain,
1637 cfg_mgcp_domain_cmd,
Neels Hofmeyr352eed02018-08-20 23:59:32 +02001638 "domain NAME",
1639 "Set the domain part expected in MGCP messages' endpoint names\n"
1640 "Qualified domain name expected in MGCP endpoint names, or '*' to accept any domain\n")
Philipp Maier12943ea2018-01-17 15:40:25 +01001641{
1642 osmo_strlcpy(g_cfg->domain, argv[0], sizeof(g_cfg->domain));
1643 return CMD_SUCCESS;
1644}
1645
Oliver Smithe36b7752019-01-22 16:31:36 +01001646DEFUN(cfg_mgcp_conn_timeout,
1647 cfg_mgcp_conn_timeout_cmd,
Oliver Smithd2ce4442019-06-26 09:56:44 +02001648 "conn-timeout <0-65534>",
1649 "Set a time after which inactive connections (CIs) are closed. Set to 0 to disable timeout. This can be used to"
1650 " work around interoperability problems causing connections to stay open forever, and slowly exhausting all"
Oliver Smith189f29e2019-06-26 12:08:20 +02001651 " available ports. Enable keep-alive packets in MGW clients when using this option together with LCLS (OsmoBSC,"
1652 " OsmoMSC: 'rtp keep-alive')!\n"
Oliver Smithe36b7752019-01-22 16:31:36 +01001653 "Timeout value (sec.)\n")
1654{
1655 g_cfg->conn_timeout = strtoul(argv[0], NULL, 10);
1656 return CMD_SUCCESS;
1657}
1658
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001659int mgcp_vty_init(void)
1660{
1661 install_element_ve(&show_mgcp_cmd);
Keithfe53edd2021-05-04 15:23:30 -05001662 install_element_ve(&show_mgcp_active_cmd);
Stefan Sperling12086582018-06-26 15:26:28 +02001663 install_element_ve(&show_mgcp_endpoint_cmd);
1664 install_element_ve(&show_mgcp_trunk_endpoint_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001665 install_element(ENABLE_NODE, &loop_conn_cmd);
1666 install_element(ENABLE_NODE, &tap_rtp_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001667 install_element(ENABLE_NODE, &free_endp_cmd);
1668 install_element(ENABLE_NODE, &reset_endp_cmd);
1669 install_element(ENABLE_NODE, &reset_all_endp_cmd);
1670
1671 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1672 install_node(&mgcp_node, config_write_mgcp);
1673
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001674 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001675 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1676 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1677 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001678 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001679 install_element(MGCP_NODE, &cfg_mgcp_rtp_port_range_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001680 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001681 install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_cmd);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +02001682 install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_v6_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001683 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001684 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_cmd);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +02001685 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_v6_cmd);
Philipp Maier1cb1e382017-11-02 17:16:04 +01001686 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_probing_cmd);
1687 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_probing_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001688 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Harald Welte55a92292021-04-28 19:06:34 +02001689 install_element(MGCP_NODE, &cfg_mgcp_rtp_priority_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001690 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1691 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
1692 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1693 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1694 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
1695 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
1696 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001697 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1698 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
1699 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1700 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
1701 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1702 install_element(MGCP_NODE, &cfg_mgcp_force_realloc_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001703 install_element(MGCP_NODE, &cfg_mgcp_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001704 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
1705 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1706 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
1707 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1708 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1709 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1710 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1711 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001712 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_rfc5993hr_cmd);
1713 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_rfc5993hr_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001714 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
1715 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1716 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
1717 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1718 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
1719 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1720 install_element(MGCP_NODE, &cfg_mgcp_osmux_ip_cmd);
1721 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
1722 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
1723 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
1724 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
1725 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1726 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
Philipp Maier12943ea2018-01-17 15:40:25 +01001727 install_element(MGCP_NODE, &cfg_mgcp_domain_cmd);
Oliver Smithe36b7752019-01-22 16:31:36 +01001728 install_element(MGCP_NODE, &cfg_mgcp_conn_timeout_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001729
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001730 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1731 install_node(&trunk_node, config_write_trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001732 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1733 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1734 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
1735 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1736 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
1737 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1738 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
1739 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Philipp Maier41425e92020-11-26 00:41:59 +01001740 install_element(TRUNK_NODE, &cfg_trunk_force_realloc_cmd);
1741 install_element(TRUNK_NODE, &cfg_trunk_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001742 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1743 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
1744 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1745 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1746 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001747 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_rfc5993hr_cmd);
1748 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_rfc5993hr_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001749 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1750 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
1751 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
1752 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1753 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
1754 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1755 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
1756 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1757 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Philipp Maier889fe7f2020-07-06 17:44:12 +02001758 install_element(TRUNK_NODE, &cfg_trunk_line_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001759
1760 return 0;
1761}
1762
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001763int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1764 enum mgcp_role role)
1765{
1766 int rc;
Philipp Maier14b27a82020-06-02 20:15:30 +02001767 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001768
Pau Espin Pedrol5892b2e2022-08-11 19:21:45 +02001769 cfg->osmux_port = OSMUX_DEFAULT_PORT;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001770 cfg->osmux_batch = 4;
1771 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
1772
1773 g_cfg = cfg;
1774 rc = vty_read_config_file(config_file, NULL);
1775 if (rc < 0) {
Philipp Maier87bd9be2017-08-22 16:35:41 +02001776 fprintf(stderr, "Failed to parse the config file: '%s'\n",
1777 config_file);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001778 return rc;
1779 }
1780
Eric2764bdb2021-08-23 22:11:47 +02001781 if (!strlen(g_cfg->source_addr)) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001782 fprintf(stderr, "You need to specify a bind address.\n");
1783 return -1;
1784 }
1785
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001786 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
Philipp Maier889fe7f2020-07-06 17:44:12 +02001787 if (mgcp_trunk_equip(trunk) != 0) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001788 LOGP(DLMGCP, LOGL_ERROR,
Philipp Maierd70eef62021-07-19 13:53:28 +02001789 "Failed to initialize trunk %u (%d endpoints)\n",
Philipp Maier48454982017-11-10 16:46:41 +01001790 trunk->trunk_nr, trunk->number_endpoints);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001791 return -1;
1792 }
1793 }
1794 cfg->role = role;
1795
1796 return 0;
1797}