blob: 6b180efbf504fa017c6c4e8aa77e2732729801ee [file] [log] [blame]
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
2/* The protocol implementation */
3
4/*
5 * (C) 2009-2014 by Holger Hans Peter Freyther <zecke@selfish.org>
6 * (C) 2009-2011 by On-Waves
7 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU Affero General Public License as published by
11 * the Free Software Foundation; either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU Affero General Public License for more details.
18 *
19 * You should have received a copy of the GNU Affero General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 *
22 */
23
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020024#include <osmocom/core/talloc.h>
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +020025#include <osmocom/core/sockaddr_str.h>
Stefan Sperling1e174872018-10-25 18:36:10 +020026#include <osmocom/vty/misc.h>
Philipp Maier87bd9be2017-08-22 16:35:41 +020027#include <osmocom/mgcp/mgcp.h>
Neels Hofmeyr67793542017-09-08 04:25:16 +020028#include <osmocom/mgcp/mgcp_common.h>
Philipp Maier993ea6b2020-08-04 18:26:50 +020029#include <osmocom/mgcp/osmux.h>
30#include <osmocom/mgcp/mgcp_protocol.h>
Philipp Maier87bd9be2017-08-22 16:35:41 +020031#include <osmocom/mgcp/vty.h>
32#include <osmocom/mgcp/mgcp_conn.h>
Philipp Maier37d11c82018-02-01 14:38:12 +010033#include <osmocom/mgcp/mgcp_endp.h>
Philipp Maierc66ab2c2020-06-02 20:55:34 +020034#include <osmocom/mgcp/mgcp_trunk.h>
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020035
36#include <string.h>
Philipp Maierbca0ef62018-07-09 17:20:51 +020037#include <inttypes.h>
Stefan Sperling12086582018-06-26 15:26:28 +020038#include <limits.h>
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020039
40#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
41#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
42#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
Philipp Maier9fc8a022019-02-20 12:26:52 +010043#define RTP_TS101318_RFC5993_CONV_STR "Convert GSM-HR from TS101318 to RFC5993 and vice versa\n"
44
Philipp Maier19c430f2020-09-22 15:52:50 +020045#define X(x) (1 << x)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020046
47static struct mgcp_config *g_cfg = NULL;
48
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020049struct cmd_node mgcp_node = {
50 MGCP_NODE,
51 "%s(config-mgcp)# ",
52 1,
53};
54
55struct cmd_node trunk_node = {
56 TRUNK_NODE,
57 "%s(config-mgcp-trunk)# ",
58 1,
59};
60
61static int config_write_mgcp(struct vty *vty)
62{
Philipp Maier6fbbeec2020-07-01 23:00:54 +020063 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +020064 OSMO_ASSERT(trunk);
Harald Weltec39b1bf2020-03-08 11:29:39 +010065
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020066 vty_out(vty, "mgcp%s", VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +020067 vty_out(vty, " domain %s%s", g_cfg->domain, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020068 if (g_cfg->local_ip)
69 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +020070 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
71 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
72 vty_out(vty, " rtp port-range %u %u%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +020073 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end,
74 VTY_NEWLINE);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +020075 if (g_cfg->net_ports.bind_addr_v4)
Philipp Maierf53796c2020-06-02 20:38:28 +020076 vty_out(vty, " rtp bind-ip %s%s",
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +020077 g_cfg->net_ports.bind_addr_v4, VTY_NEWLINE);
78 if (g_cfg->net_ports.bind_addr_v6)
79 vty_out(vty, " rtp bind-ip-v6 %s%s",
80 g_cfg->net_ports.bind_addr_v6, VTY_NEWLINE);
Philipp Maier1cb1e382017-11-02 17:16:04 +010081 if (g_cfg->net_ports.bind_addr_probe)
Philipp Maierf53796c2020-06-02 20:38:28 +020082 vty_out(vty, " rtp ip-probing%s", VTY_NEWLINE);
Philipp Maier1cb1e382017-11-02 17:16:04 +010083 else
Philipp Maierf53796c2020-06-02 20:38:28 +020084 vty_out(vty, " no rtp ip-probing%s", VTY_NEWLINE);
85 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +010086 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
Philipp Maierf53796c2020-06-02 20:38:28 +020087 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +010088 else if (trunk->keepalive_interval)
Philipp Maierf53796c2020-06-02 20:38:28 +020089 vty_out(vty, " rtp keep-alive %d%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +010090 trunk->keepalive_interval, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020091 else
Philipp Maierf53796c2020-06-02 20:38:28 +020092 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020093
Harald Weltec39b1bf2020-03-08 11:29:39 +010094 if (trunk->omit_rtcp)
Philipp Maierf53796c2020-06-02 20:38:28 +020095 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020096 else
Philipp Maierf53796c2020-06-02 20:38:28 +020097 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +010098 if (trunk->force_constant_ssrc
99 || trunk->force_aligned_timing
100 || trunk->rfc5993_hr_convert) {
Philipp Maierf53796c2020-06-02 20:38:28 +0200101 vty_out(vty, " %srtp-patch ssrc%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100102 trunk->force_constant_ssrc ? "" : "no ",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200103 VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200104 vty_out(vty, " %srtp-patch timestamp%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100105 trunk->force_aligned_timing ? "" : "no ",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200106 VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200107 vty_out(vty, " %srtp-patch rfc5993hr%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100108 trunk->rfc5993_hr_convert ? "" : "no ",
Philipp Maier9fc8a022019-02-20 12:26:52 +0100109 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200110 } else
Philipp Maierf53796c2020-06-02 20:38:28 +0200111 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100112 if (trunk->audio_fmtp_extra)
Philipp Maierf53796c2020-06-02 20:38:28 +0200113 vty_out(vty, " sdp audio fmtp-extra %s%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100114 trunk->audio_fmtp_extra, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200115 vty_out(vty, " %ssdp audio-payload send-ptime%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100116 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200117 vty_out(vty, " %ssdp audio-payload send-name%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100118 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200119 vty_out(vty, " number endpoints %u%s",
Philipp Maier889fe7f2020-07-06 17:44:12 +0200120 trunk->v.vty_number_endpoints, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200121 vty_out(vty, " %sallow-transcoding%s",
Harald Weltec39b1bf2020-03-08 11:29:39 +0100122 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200123 if (g_cfg->call_agent_addr)
Philipp Maierf53796c2020-06-02 20:38:28 +0200124 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200125 VTY_NEWLINE);
126 if (g_cfg->force_ptime > 0)
Philipp Maierf53796c2020-06-02 20:38:28 +0200127 vty_out(vty, " rtp force-ptime %d%s", g_cfg->force_ptime,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200128 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200129
130 switch (g_cfg->osmux) {
131 case OSMUX_USAGE_ON:
Philipp Maierf53796c2020-06-02 20:38:28 +0200132 vty_out(vty, " osmux on%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200133 break;
134 case OSMUX_USAGE_ONLY:
Philipp Maierf53796c2020-06-02 20:38:28 +0200135 vty_out(vty, " osmux only%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200136 break;
137 case OSMUX_USAGE_OFF:
138 default:
Philipp Maierf53796c2020-06-02 20:38:28 +0200139 vty_out(vty, " osmux off%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200140 break;
141 }
142 if (g_cfg->osmux) {
Philipp Maierf53796c2020-06-02 20:38:28 +0200143 vty_out(vty, " osmux bind-ip %s%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200144 g_cfg->osmux_addr, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200145 vty_out(vty, " osmux batch-factor %d%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200146 g_cfg->osmux_batch, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200147 vty_out(vty, " osmux batch-size %u%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200148 g_cfg->osmux_batch_size, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200149 vty_out(vty, " osmux port %u%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200150 g_cfg->osmux_port, VTY_NEWLINE);
Philipp Maierf53796c2020-06-02 20:38:28 +0200151 vty_out(vty, " osmux dummy %s%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200152 g_cfg->osmux_dummy ? "on" : "off", VTY_NEWLINE);
153 }
Oliver Smithe36b7752019-01-22 16:31:36 +0100154
155 if (g_cfg->conn_timeout)
Philipp Maierf53796c2020-06-02 20:38:28 +0200156 vty_out(vty, " conn-timeout %u%s", g_cfg->conn_timeout, VTY_NEWLINE);
Oliver Smithe36b7752019-01-22 16:31:36 +0100157
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200158 return CMD_SUCCESS;
159}
160
Philipp Maiercede2a42018-07-03 14:14:21 +0200161static void dump_rtp_end(struct vty *vty, struct mgcp_conn_rtp *conn)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200162{
Philipp Maiercede2a42018-07-03 14:14:21 +0200163 struct mgcp_rtp_state *state = &conn->state;
164 struct mgcp_rtp_end *end = &conn->end;
Philipp Maierbc0346e2018-06-07 09:52:16 +0200165 struct mgcp_rtp_codec *codec = end->codec;
Stefan Sperlingb7974e22018-10-29 13:22:00 +0100166 struct rate_ctr *tx_packets, *tx_bytes;
167 struct rate_ctr *rx_packets, *rx_bytes;
Philipp Maiercede2a42018-07-03 14:14:21 +0200168 struct rate_ctr *dropped_packets;
169
Stefan Sperlingb7974e22018-10-29 13:22:00 +0100170 tx_packets = &conn->rate_ctr_group->ctr[RTP_PACKETS_TX_CTR];
171 tx_bytes = &conn->rate_ctr_group->ctr[RTP_OCTETS_TX_CTR];
172 rx_packets = &conn->rate_ctr_group->ctr[RTP_PACKETS_RX_CTR];
173 rx_bytes = &conn->rate_ctr_group->ctr[RTP_OCTETS_RX_CTR];
Philipp Maiercede2a42018-07-03 14:14:21 +0200174 dropped_packets = &conn->rate_ctr_group->ctr[RTP_DROPPED_PACKETS_CTR];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200175
176 vty_out(vty,
Stefan Sperlingb7974e22018-10-29 13:22:00 +0100177 " Packets Sent: %" PRIu64 " (%" PRIu64 " bytes total)%s"
178 " Packets Received: %" PRIu64 " (%" PRIu64 " bytes total)%s"
Philipp Maierbca0ef62018-07-09 17:20:51 +0200179 " Timestamp Errs: %" PRIu64 "->%" PRIu64 "%s"
180 " Dropped Packets: %" PRIu64 "%s"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200181 " Payload Type: %d Rate: %u Channels: %d %s"
182 " Frame Duration: %u Frame Denominator: %u%s"
183 " FPP: %d Packet Duration: %u%s"
184 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
185 " Output-Enabled: %d Force-PTIME: %d%s",
Stefan Sperlingb7974e22018-10-29 13:22:00 +0100186 tx_packets->current, tx_bytes->current, VTY_NEWLINE,
187 rx_packets->current, rx_bytes->current, VTY_NEWLINE,
Philipp Maier9e1d1642018-05-09 16:26:34 +0200188 state->in_stream.err_ts_ctr->current,
189 state->out_stream.err_ts_ctr->current,
190 VTY_NEWLINE,
Philipp Maiercede2a42018-07-03 14:14:21 +0200191 dropped_packets->current, VTY_NEWLINE,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200192 codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200193 codec->frame_duration_num, codec->frame_duration_den,
194 VTY_NEWLINE, end->frames_per_packet, end->packet_duration_ms,
195 VTY_NEWLINE, end->fmtp_extra, codec->audio_name,
196 codec->subtype_name, VTY_NEWLINE, end->output_enabled,
197 end->force_output_ptime, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200198}
199
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200200static void dump_endpoint(struct vty *vty, struct mgcp_endpoint *endp,
Stefan Sperling12086582018-06-26 15:26:28 +0200201 int trunk_nr, enum mgcp_trunk_type trunk_type, int show_stats)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200202{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200203 struct mgcp_conn *conn;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200204
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200205 vty_out(vty, "%s trunk %d endpoint %s:%s",
206 trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1", trunk_nr, endp->name, VTY_NEWLINE);
Philipp Maier8d6a1932020-06-18 12:19:31 +0200207 vty_out(vty, " Availability: %s%s",
208 mgcp_endp_avail(endp) ? "available" : "not in service", VTY_NEWLINE);
Stefan Sperling12086582018-06-26 15:26:28 +0200209
210 if (llist_empty(&endp->conns)) {
211 vty_out(vty, " No active connections%s", VTY_NEWLINE);
212 return;
213 }
214
215 llist_for_each_entry(conn, &endp->conns, entry) {
216 vty_out(vty, " CONN: %s%s", mgcp_conn_dump(conn), VTY_NEWLINE);
217
218 if (show_stats) {
Oliver Smithe36b7752019-01-22 16:31:36 +0100219 if (endp->cfg->conn_timeout) {
220 struct timeval remaining;
221 osmo_timer_remaining(&conn->watchdog, NULL, &remaining);
222 vty_out(vty, " Currently remaining timeout (seconds): %d.%06d%s",
223 (int)remaining.tv_sec, (int)remaining.tv_usec, VTY_NEWLINE);
224 }
225
Stefan Sperling12086582018-06-26 15:26:28 +0200226 /* FIXME: Also add verbosity for other
227 * connection types (E1) as soon as
228 * the implementation is available */
229 if (conn->type == MGCP_CONN_TYPE_RTP) {
230 dump_rtp_end(vty, &conn->u.rtp);
231 }
232 }
233 }
234}
235
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200236static void dump_ratectr_global(struct vty *vty, struct mgcp_ratectr_global *ratectr)
237{
238 vty_out(vty, "%s", VTY_NEWLINE);
239 vty_out(vty, "Rate counters (global):%s", VTY_NEWLINE);
240
241 if (ratectr->mgcp_general_ctr_group) {
242 vty_out(vty, " %s:%s",
243 ratectr->mgcp_general_ctr_group->desc->
244 group_description, VTY_NEWLINE);
245 vty_out_rate_ctr_group_fmt(vty,
246 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
247 ratectr->mgcp_general_ctr_group);
248 }
249}
250
Philipp Maier889fe7f2020-07-06 17:44:12 +0200251static void dump_ratectr_trunk(struct vty *vty, struct mgcp_trunk *trunk)
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200252{
Philipp Maier889fe7f2020-07-06 17:44:12 +0200253 struct mgcp_ratectr_trunk *ratectr = &trunk->ratectr;
254
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200255 vty_out(vty, "%s", VTY_NEWLINE);
256 vty_out(vty, "Rate counters (trunk):%s", VTY_NEWLINE);
257
258 if (ratectr->mgcp_crcx_ctr_group) {
259 vty_out(vty, " %s:%s",
260 ratectr->mgcp_crcx_ctr_group->desc->group_description,
261 VTY_NEWLINE);
262 vty_out_rate_ctr_group_fmt(vty,
263 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
264 ratectr->mgcp_crcx_ctr_group);
265 }
266 if (ratectr->mgcp_dlcx_ctr_group) {
267 vty_out(vty, " %s:%s",
268 ratectr->mgcp_dlcx_ctr_group->desc->group_description,
269 VTY_NEWLINE);
270 vty_out_rate_ctr_group_fmt(vty,
271 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
272 ratectr->mgcp_dlcx_ctr_group);
273 }
274 if (ratectr->mgcp_mdcx_ctr_group) {
275 vty_out(vty, " %s:%s",
276 ratectr->mgcp_mdcx_ctr_group->desc->group_description,
277 VTY_NEWLINE);
278 vty_out_rate_ctr_group_fmt(vty,
279 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
280 ratectr->mgcp_mdcx_ctr_group);
281 }
282 if (ratectr->all_rtp_conn_stats) {
283 vty_out(vty, " %s:%s",
284 ratectr->all_rtp_conn_stats->desc->group_description,
285 VTY_NEWLINE);
286 vty_out_rate_ctr_group_fmt(vty,
287 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
288 ratectr->all_rtp_conn_stats);
289 }
Philipp Maier889fe7f2020-07-06 17:44:12 +0200290
291 if (ratectr->e1_stats && trunk->trunk_type == MGCP_TRUNK_E1) {
292 vty_out(vty, " %s:%s",
293 ratectr->e1_stats->desc->group_description,
294 VTY_NEWLINE);
295 vty_out_rate_ctr_group_fmt(vty,
296 " %25n: %10c (%S/s %M/m %H/h %D/d) %d",
297 ratectr->e1_stats);
298 }
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200299}
300
301
302static void dump_trunk(struct vty *vty, struct mgcp_trunk *trunk, int show_stats)
Stefan Sperling12086582018-06-26 15:26:28 +0200303{
304 int i;
305
306 vty_out(vty, "%s trunk %d with %d endpoints:%s",
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200307 trunk->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
Philipp Maier869b21c2020-07-03 16:04:16 +0200308 trunk->trunk_nr, trunk->number_endpoints, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200309
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200310 if (!trunk->endpoints) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200311 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
312 return;
313 }
314
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200315 for (i = 0; i < trunk->number_endpoints; ++i) {
316 struct mgcp_endpoint *endp = trunk->endpoints[i];
317 dump_endpoint(vty, endp, trunk->trunk_nr, trunk->trunk_type,
318 show_stats);
319 if (i < trunk->number_endpoints - 1)
Stefan Sperling12086582018-06-26 15:26:28 +0200320 vty_out(vty, "%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200321 }
Stefan Sperling1e174872018-10-25 18:36:10 +0200322
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200323 if (show_stats)
Philipp Maier889fe7f2020-07-06 17:44:12 +0200324 dump_ratectr_trunk(vty, trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200325}
326
Stefan Sperling12086582018-06-26 15:26:28 +0200327#define SHOW_MGCP_STR "Display information about the MGCP Media Gateway\n"
328
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200329DEFUN(show_mcgp, show_mgcp_cmd,
330 "show mgcp [stats]",
331 SHOW_STR
Stefan Sperling12086582018-06-26 15:26:28 +0200332 SHOW_MGCP_STR
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200333 "Include Statistics\n")
334{
Philipp Maier14b27a82020-06-02 20:15:30 +0200335 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200336 int show_stats = argc >= 1;
337
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200338 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200339 dump_trunk(vty, trunk, show_stats);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200340
341 if (g_cfg->osmux)
Pau Espin Pedrol8de58e72019-04-24 13:33:46 +0200342 vty_out(vty, "Osmux used CID: %d%s", osmux_cid_pool_count_used(),
Philipp Maier87bd9be2017-08-22 16:35:41 +0200343 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200344
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200345 if (show_stats)
346 dump_ratectr_global(vty, &g_cfg->ratectr);
347
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200348 return CMD_SUCCESS;
349}
350
Stefan Sperling12086582018-06-26 15:26:28 +0200351static void
Philipp Maier14b27a82020-06-02 20:15:30 +0200352dump_mgcp_endpoint(struct vty *vty, struct mgcp_trunk *trunk, const char *epname)
Stefan Sperling12086582018-06-26 15:26:28 +0200353{
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200354 struct mgcp_endpoint *endp;
Stefan Sperling12086582018-06-26 15:26:28 +0200355
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200356 if (trunk) {
357 /* If a trunk is given, search on that specific trunk only */
358 endp = mgcp_endp_by_name_trunk(NULL, epname, trunk);
359 if (!endp) {
360 vty_out(vty, "endpoint %s not configured on trunk %d%s", epname, trunk->trunk_nr, VTY_NEWLINE);
361 return;
362 }
363 } else {
364 /* If no trunk is given, search on all possible trunks */
365 endp = mgcp_endp_by_name(NULL, epname, g_cfg);
366 if (!endp) {
367 vty_out(vty, "endpoint %s not configured%s", epname, VTY_NEWLINE);
368 return;
Stefan Sperling12086582018-06-26 15:26:28 +0200369 }
370 }
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200371
372 trunk = endp->trunk;
373 dump_endpoint(vty, endp, trunk->trunk_nr, trunk->trunk_type, true);
Stefan Sperling12086582018-06-26 15:26:28 +0200374}
375
376DEFUN(show_mcgp_endpoint, show_mgcp_endpoint_cmd,
377 "show mgcp endpoint NAME",
378 SHOW_STR
379 SHOW_MGCP_STR
380 "Display information about an endpoint\n" "The name of the endpoint\n")
381{
Philipp Maierc66ab2c2020-06-02 20:55:34 +0200382 dump_mgcp_endpoint(vty, NULL, argv[0]);
Stefan Sperling12086582018-06-26 15:26:28 +0200383 return CMD_SUCCESS;
384}
385
386DEFUN(show_mcgp_trunk_endpoint, show_mgcp_trunk_endpoint_cmd,
387 "show mgcp trunk <0-64> endpoint NAME",
388 SHOW_STR
389 SHOW_MGCP_STR
390 "Display information about a trunk\n" "Trunk number\n"
391 "Display information about an endpoint\n" "The name of the endpoint\n")
392{
Philipp Maier14b27a82020-06-02 20:15:30 +0200393 struct mgcp_trunk *trunk;
Stefan Sperling12086582018-06-26 15:26:28 +0200394 int trunkidx = atoi(argv[0]);
395
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200396 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, trunkidx);
Stefan Sperling12086582018-06-26 15:26:28 +0200397 if (!trunk) {
398 vty_out(vty, "trunk %d not found%s", trunkidx, VTY_NEWLINE);
399 return CMD_WARNING;
400 }
401
402 dump_mgcp_endpoint(vty, trunk, argv[1]);
403 return CMD_SUCCESS;
404}
405
Philipp Maier87bd9be2017-08-22 16:35:41 +0200406DEFUN(cfg_mgcp, cfg_mgcp_cmd, "mgcp", "Configure the MGCP")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200407{
408 vty->node = MGCP_NODE;
409 return CMD_SUCCESS;
410}
411
Philipp Maier19c430f2020-09-22 15:52:50 +0200412DEFUN_USRATTR(cfg_mgcp_local_ip,
413 cfg_mgcp_local_ip_cmd,
414 X(MGW_CMD_ATTR_NEWCONN),
415 "local ip " VTY_IPV46_CMD,
416 "Local options for the SDP record\n"
417 IP_STR
418 "IPv4 Address to use in SDP record\n"
419 "IPv6 Address to use in SDP record\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200420{
421 osmo_talloc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
422 return CMD_SUCCESS;
423}
424
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200425#define BIND_STR "Listen/Bind related socket option\n"
426DEFUN(cfg_mgcp_bind_ip,
427 cfg_mgcp_bind_ip_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200428 "bind ip " VTY_IPV46_CMD,
429 BIND_STR IP_STR
430 "IPv4 Address to bind to\n"
431 "IPv6 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200432{
433 osmo_talloc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
434 return CMD_SUCCESS;
435}
436
437DEFUN(cfg_mgcp_bind_port,
438 cfg_mgcp_bind_port_cmd,
439 "bind port <0-65534>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200440 BIND_STR "Port information\n" "UDP port to listen for MGCP messages\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200441{
442 unsigned int port = atoi(argv[0]);
443 g_cfg->source_port = port;
444 return CMD_SUCCESS;
445}
446
Philipp Maier8cfe7df2020-09-22 16:18:26 +0200447DEFUN_DEPRECATED(cfg_mgcp_bind_early,
448 cfg_mgcp_bind_early_cmd,
449 "bind early (0|1)",
450 BIND_STR
451 "Bind local ports on start up\n" "Bind on demand\n" "Bind on startup\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200452{
Philipp Maier8cfe7df2020-09-22 16:18:26 +0200453 return CMD_SUCCESS;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200454}
455
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200456#define RTP_STR "RTP configuration\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200457#define UDP_PORT_STR "UDP Port number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +0200458#define NET_START_STR "First UDP port allocated\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200459#define RANGE_START_STR "Start of the range of ports\n"
460#define RANGE_END_STR "End of the range of ports\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200461
Philipp Maierf1889d82017-11-08 14:59:39 +0100462DEFUN(cfg_mgcp_rtp_port_range,
463 cfg_mgcp_rtp_port_range_cmd,
Philipp Maiera19547b2018-05-22 13:44:34 +0200464 "rtp port-range <1024-65534> <1025-65535>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200465 RTP_STR "Range of ports to use for the NET side\n"
466 RANGE_START_STR RANGE_END_STR)
467{
Philipp Maiera19547b2018-05-22 13:44:34 +0200468 int start;
469 int end;
470
471 start = atoi(argv[0]);
472 end = atoi(argv[1]);
473
474 if (end < start) {
475 vty_out(vty, "range end port (%i) must be greater than the range start port (%i)!%s",
476 end, start, VTY_NEWLINE);
477 return CMD_WARNING;
478 }
479
480 if (start & 1) {
481 vty_out(vty, "range must begin at an even port number, autocorrecting port (%i) to: %i%s",
482 start, start & 0xFFFE, VTY_NEWLINE);
483 start &= 0xFFFE;
484 }
485
486 if ((end & 1) == 0) {
487 vty_out(vty, "range must end at an odd port number, autocorrecting port (%i) to: %i%s",
488 end, end | 1, VTY_NEWLINE);
489 end |= 1;
490 }
491
492 g_cfg->net_ports.range_start = start;
493 g_cfg->net_ports.range_end = end;
494 g_cfg->net_ports.last_port = g_cfg->net_ports.range_start;
495
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200496 return CMD_SUCCESS;
497}
Philipp Maierf1889d82017-11-08 14:59:39 +0100498ALIAS_DEPRECATED(cfg_mgcp_rtp_port_range,
499 cfg_mgcp_rtp_net_range_cmd,
500 "rtp net-range <0-65534> <0-65534>",
501 RTP_STR "Range of ports to use for the NET side\n"
502 RANGE_START_STR RANGE_END_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200503
Philipp Maier19c430f2020-09-22 15:52:50 +0200504DEFUN_USRATTR(cfg_mgcp_rtp_bind_ip,
505 cfg_mgcp_rtp_bind_ip_cmd,
506 X(MGW_CMD_ATTR_NEWCONN),
507 "rtp bind-ip A.B.C.D",
508 RTP_STR "Bind endpoints facing the Network\n"
509 "IPv4 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200510{
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200511 osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr_v4, argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200512 return CMD_SUCCESS;
513}
Philipp Maierf1889d82017-11-08 14:59:39 +0100514ALIAS_DEPRECATED(cfg_mgcp_rtp_bind_ip,
515 cfg_mgcp_rtp_net_bind_ip_cmd,
516 "rtp net-bind-ip A.B.C.D",
517 RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200518
Philipp Maier19c430f2020-09-22 15:52:50 +0200519DEFUN_USRATTR(cfg_mgcp_rtp_no_bind_ip,
520 cfg_mgcp_rtp_no_bind_ip_cmd,
521 X(MGW_CMD_ATTR_NEWCONN),
522 "no rtp bind-ip",
523 NO_STR RTP_STR "Bind endpoints facing the Network\n"
524 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200525{
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200526 talloc_free(g_cfg->net_ports.bind_addr_v4);
527 g_cfg->net_ports.bind_addr_v4 = NULL;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200528 return CMD_SUCCESS;
529}
Philipp Maierf1889d82017-11-08 14:59:39 +0100530ALIAS_DEPRECATED(cfg_mgcp_rtp_no_bind_ip,
531 cfg_mgcp_rtp_no_net_bind_ip_cmd,
532 "no rtp net-bind-ip",
533 NO_STR RTP_STR "Bind endpoints facing the Network\n"
534 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200535
Philipp Maier19c430f2020-09-22 15:52:50 +0200536DEFUN_USRATTR(cfg_mgcp_rtp_bind_ip_v6,
537 cfg_mgcp_rtp_bind_ip_v6_cmd,
538 X(MGW_CMD_ATTR_NEWCONN),
539 "rtp bind-ip-v6 " VTY_IPV6_CMD,
540 RTP_STR "Bind endpoints facing the Network\n"
541 "IPv6 Address to bind to\n")
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200542{
543 osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr_v6, argv[0]);
544 return CMD_SUCCESS;
545}
546
Philipp Maier19c430f2020-09-22 15:52:50 +0200547DEFUN_USRATTR(cfg_mgcp_rtp_no_bind_ip_v6,
548 cfg_mgcp_rtp_no_bind_ip_v6_cmd,
549 X(MGW_CMD_ATTR_NEWCONN),
550 "no rtp bind-ip-v6",
551 NO_STR RTP_STR "Bind endpoints facing the Network\n"
552 "Address to bind to\n")
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +0200553{
554 talloc_free(g_cfg->net_ports.bind_addr_v6);
555 g_cfg->net_ports.bind_addr_v6 = NULL;
556 return CMD_SUCCESS;
557}
558
Philipp Maier19c430f2020-09-22 15:52:50 +0200559DEFUN_USRATTR(cfg_mgcp_rtp_net_bind_ip_probing,
560 cfg_mgcp_rtp_net_bind_ip_probing_cmd,
561 X(MGW_CMD_ATTR_NEWCONN),
562 "rtp ip-probing",
563 RTP_STR "automatic rtp bind ip selection\n")
Philipp Maier1cb1e382017-11-02 17:16:04 +0100564{
565 g_cfg->net_ports.bind_addr_probe = true;
566 return CMD_SUCCESS;
567}
568
Philipp Maier19c430f2020-09-22 15:52:50 +0200569DEFUN_USRATTR(cfg_mgcp_rtp_no_net_bind_ip_probing,
570 cfg_mgcp_rtp_no_net_bind_ip_probing_cmd,
571 X(MGW_CMD_ATTR_NEWCONN),
572 "no rtp ip-probing",
573 NO_STR RTP_STR "no automatic rtp bind ip selection\n")
Philipp Maier1cb1e382017-11-02 17:16:04 +0100574{
575 g_cfg->net_ports.bind_addr_probe = false;
576 return CMD_SUCCESS;
577}
578
Philipp Maier19c430f2020-09-22 15:52:50 +0200579DEFUN_USRATTR(cfg_mgcp_rtp_ip_dscp,
580 cfg_mgcp_rtp_ip_dscp_cmd,
581 X(MGW_CMD_ATTR_NEWCONN),
Harald Welte5936a9c2021-04-27 22:30:52 +0200582 "rtp ip-dscp <0-63>",
Philipp Maier19c430f2020-09-22 15:52:50 +0200583 RTP_STR
Harald Welte5936a9c2021-04-27 22:30:52 +0200584 "Use specified DSCP for the audio stream (including Osmux)\n" "The DSCP value\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200585{
586 int dscp = atoi(argv[0]);
587 g_cfg->endp_dscp = dscp;
588 return CMD_SUCCESS;
589}
590
Philipp Maier87bd9be2017-08-22 16:35:41 +0200591#define FORCE_PTIME_STR "Force a fixed ptime for packets sent"
Philipp Maier19c430f2020-09-22 15:52:50 +0200592DEFUN_USRATTR(cfg_mgcp_rtp_force_ptime,
593 cfg_mgcp_rtp_force_ptime_cmd,
594 X(MGW_CMD_ATTR_NEWCONN),
595 "rtp force-ptime (10|20|40)",
596 RTP_STR FORCE_PTIME_STR
597 "The required ptime (packet duration) in ms\n" "10 ms\n20 ms\n40 ms\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200598{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200599 g_cfg->force_ptime = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200600 return CMD_SUCCESS;
601}
602
Philipp Maier19c430f2020-09-22 15:52:50 +0200603DEFUN_USRATTR(cfg_mgcp_no_rtp_force_ptime,
604 cfg_mgcp_no_rtp_force_ptime_cmd,
605 X(MGW_CMD_ATTR_NEWCONN),
606 "no rtp force-ptime", NO_STR RTP_STR FORCE_PTIME_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200607{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200608 g_cfg->force_ptime = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200609 return CMD_SUCCESS;
610}
611
Philipp Maier19c430f2020-09-22 15:52:50 +0200612DEFUN_USRATTR(cfg_mgcp_sdp_fmtp_extra,
613 cfg_mgcp_sdp_fmtp_extra_cmd,
614 X(MGW_CMD_ATTR_NEWCONN),
615 "sdp audio fmtp-extra .NAME",
616 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
617 "Extra Information\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200618{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200619 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200620 OSMO_ASSERT(trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200621 char *txt = argv_concat(argv, argc, 0);
622 if (!txt)
623 return CMD_WARNING;
624
Philipp Maierd19de2e2020-06-03 13:55:33 +0200625 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200626 talloc_free(txt);
627 return CMD_SUCCESS;
628}
629
Philipp Maier19c430f2020-09-22 15:52:50 +0200630DEFUN_USRATTR(cfg_mgcp_allow_transcoding,
631 cfg_mgcp_allow_transcoding_cmd,
632 X(MGW_CMD_ATTR_NEWCONN),
633 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200634{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200635 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200636 OSMO_ASSERT(trunk);
637 trunk->no_audio_transcoding = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200638 return CMD_SUCCESS;
639}
640
Philipp Maier19c430f2020-09-22 15:52:50 +0200641DEFUN_USRATTR(cfg_mgcp_no_allow_transcoding,
642 cfg_mgcp_no_allow_transcoding_cmd,
643 X(MGW_CMD_ATTR_NEWCONN),
644 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200645{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200646 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200647 OSMO_ASSERT(trunk);
648 trunk->no_audio_transcoding = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200649 return CMD_SUCCESS;
650}
651
652#define SDP_STR "SDP File related options\n"
653#define AUDIO_STR "Audio payload options\n"
Philipp Maier7f90ddb2020-06-02 21:52:53 +0200654DEFUN_DEPRECATED(cfg_mgcp_sdp_payload_number,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200655 cfg_mgcp_sdp_payload_number_cmd,
656 "sdp audio-payload number <0-255>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200657 SDP_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200658{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200659 return CMD_SUCCESS;
660}
661
Philipp Maier87bd9be2017-08-22 16:35:41 +0200662ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number,
663 cfg_mgcp_sdp_payload_number_cmd_old,
664 "sdp audio payload number <0-255>",
665 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200666
Philipp Maier7f90ddb2020-06-02 21:52:53 +0200667DEFUN_DEPRECATED(cfg_mgcp_sdp_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200668 cfg_mgcp_sdp_payload_name_cmd,
669 "sdp audio-payload name NAME",
670 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
671{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200672 return CMD_SUCCESS;
673}
674
675ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200676 "sdp audio payload name NAME",
677 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200678
Philipp Maier19c430f2020-09-22 15:52:50 +0200679DEFUN_USRATTR(cfg_mgcp_sdp_payload_send_ptime,
680 cfg_mgcp_sdp_payload_send_ptime_cmd,
681 X(MGW_CMD_ATTR_NEWCONN),
682 "sdp audio-payload send-ptime",
683 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200684{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200685 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200686 OSMO_ASSERT(trunk);
687 trunk->audio_send_ptime = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200688 return CMD_SUCCESS;
689}
690
Philipp Maier19c430f2020-09-22 15:52:50 +0200691DEFUN_USRATTR(cfg_mgcp_no_sdp_payload_send_ptime,
692 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
693 X(MGW_CMD_ATTR_NEWCONN),
694 "no sdp audio-payload send-ptime",
695 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200696{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200697 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200698 OSMO_ASSERT(trunk);
699 trunk->audio_send_ptime = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200700 return CMD_SUCCESS;
701}
702
Philipp Maier19c430f2020-09-22 15:52:50 +0200703DEFUN_USRATTR(cfg_mgcp_sdp_payload_send_name,
704 cfg_mgcp_sdp_payload_send_name_cmd,
705 X(MGW_CMD_ATTR_NEWCONN),
706 "sdp audio-payload send-name",
707 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200708{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200709 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200710 OSMO_ASSERT(trunk);
711 trunk->audio_send_name = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200712 return CMD_SUCCESS;
713}
714
Philipp Maier19c430f2020-09-22 15:52:50 +0200715DEFUN_USRATTR(cfg_mgcp_no_sdp_payload_send_name,
716 cfg_mgcp_no_sdp_payload_send_name_cmd,
717 X(MGW_CMD_ATTR_NEWCONN),
718 "no sdp audio-payload send-name",
719 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200720{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200721 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200722 OSMO_ASSERT(trunk);
723 trunk->audio_send_name = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200724 return CMD_SUCCESS;
725}
726
Philipp Maierba94b6d2020-09-22 16:14:32 +0200727DEFUN_DEPRECATED(cfg_mgcp_loop,
728 cfg_mgcp_loop_cmd,
729 "loop (0|1)",
730 "Loop audio for all endpoints on main trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200731{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200732 return CMD_SUCCESS;
733}
734
Philipp Maier19c430f2020-09-22 15:52:50 +0200735DEFUN_USRATTR(cfg_mgcp_force_realloc,
736 cfg_mgcp_force_realloc_cmd,
737 X(MGW_CMD_ATTR_NEWCONN),
738 "force-realloc (0|1)",
739 "Force endpoint reallocation when the endpoint is still seized\n"
740 "Don't force reallocation\n" "force reallocation\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200741{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200742 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200743 OSMO_ASSERT(trunk);
744 trunk->force_realloc = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200745 return CMD_SUCCESS;
746}
747
Philipp Maier19c430f2020-09-22 15:52:50 +0200748DEFUN_ATTR(cfg_mgcp_rtp_accept_all,
749 cfg_mgcp_rtp_accept_all_cmd,
750 "rtp-accept-all (0|1)",
751 "Accept all RTP packets, even when the originating IP/Port does not match\n"
752 "enable filter\n" "disable filter\n",
753 CMD_ATTR_IMMEDIATE)
Philipp Maier87bd9be2017-08-22 16:35:41 +0200754{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200755 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200756 OSMO_ASSERT(trunk);
757 trunk->rtp_accept_all = atoi(argv[0]);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200758 return CMD_SUCCESS;
759}
760
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200761DEFUN(cfg_mgcp_number_endp,
762 cfg_mgcp_number_endp_cmd,
Philipp Maier869b21c2020-07-03 16:04:16 +0200763 "number endpoints <1-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200764 "Number options\n" "Endpoints available\n" "Number endpoints\n")
765{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200766 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200767 OSMO_ASSERT(trunk);
Philipp Maier889fe7f2020-07-06 17:44:12 +0200768 trunk->v.vty_number_endpoints = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200769 return CMD_SUCCESS;
770}
771
Philipp Maier19c430f2020-09-22 15:52:50 +0200772DEFUN_ATTR(cfg_mgcp_omit_rtcp,
773 cfg_mgcp_omit_rtcp_cmd,
774 "rtcp-omit", RTCP_OMIT_STR,
775 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200776{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200777 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200778 trunk->omit_rtcp = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200779 return CMD_SUCCESS;
780}
781
Philipp Maier19c430f2020-09-22 15:52:50 +0200782DEFUN_ATTR(cfg_mgcp_no_omit_rtcp,
783 cfg_mgcp_no_omit_rtcp_cmd,
784 "no rtcp-omit",
785 NO_STR RTCP_OMIT_STR,
786 CMD_ATTR_IMMEDIATE)
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->omit_rtcp = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200791 return CMD_SUCCESS;
792}
793
Philipp Maier19c430f2020-09-22 15:52:50 +0200794DEFUN_USRATTR(cfg_mgcp_patch_rtp_ssrc,
795 cfg_mgcp_patch_rtp_ssrc_cmd,
796 X(MGW_CMD_ATTR_NEWCONN),
797 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200798{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200799 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200800 OSMO_ASSERT(trunk);
801 trunk->force_constant_ssrc = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200802 return CMD_SUCCESS;
803}
804
Philipp Maier19c430f2020-09-22 15:52:50 +0200805DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_ssrc,
806 cfg_mgcp_no_patch_rtp_ssrc_cmd,
807 X(MGW_CMD_ATTR_NEWCONN),
808 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200809{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200810 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200811 OSMO_ASSERT(trunk);
812 trunk->force_constant_ssrc = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200813 return CMD_SUCCESS;
814}
815
Philipp Maier19c430f2020-09-22 15:52:50 +0200816DEFUN_USRATTR(cfg_mgcp_patch_rtp_ts,
817 cfg_mgcp_patch_rtp_ts_cmd,
818 X(MGW_CMD_ATTR_NEWCONN),
819 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200820{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200821 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200822 OSMO_ASSERT(trunk);
823 trunk->force_aligned_timing = 1;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200824 return CMD_SUCCESS;
825}
826
Philipp Maier19c430f2020-09-22 15:52:50 +0200827DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_ts,
828 cfg_mgcp_no_patch_rtp_ts_cmd,
829 X(MGW_CMD_ATTR_NEWCONN),
830 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200831{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200832 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200833 OSMO_ASSERT(trunk);
834 trunk->force_aligned_timing = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200835 return CMD_SUCCESS;
836}
837
Philipp Maier19c430f2020-09-22 15:52:50 +0200838DEFUN_USRATTR(cfg_mgcp_patch_rtp_rfc5993hr,
839 cfg_mgcp_patch_rtp_rfc5993hr_cmd,
840 X(MGW_CMD_ATTR_NEWCONN),
841 "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +0100842{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200843 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200844 OSMO_ASSERT(trunk);
845 trunk->rfc5993_hr_convert = true;
Philipp Maier9fc8a022019-02-20 12:26:52 +0100846 return CMD_SUCCESS;
847}
848
Philipp Maier19c430f2020-09-22 15:52:50 +0200849DEFUN_USRATTR(cfg_mgcp_no_patch_rtp_rfc5993hr,
850 cfg_mgcp_no_patch_rtp_rfc5993hr_cmd,
851 X(MGW_CMD_ATTR_NEWCONN),
852 "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +0100853{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200854 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200855 OSMO_ASSERT(trunk);
856 trunk->rfc5993_hr_convert = false;
Philipp Maier9fc8a022019-02-20 12:26:52 +0100857 return CMD_SUCCESS;
858}
859
Philipp Maier19c430f2020-09-22 15:52:50 +0200860DEFUN_USRATTR(cfg_mgcp_no_patch_rtp,
861 cfg_mgcp_no_patch_rtp_cmd,
862 X(MGW_CMD_ATTR_NEWCONN),
863 "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200864{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200865 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200866 OSMO_ASSERT(trunk);
867 trunk->force_constant_ssrc = 0;
868 trunk->force_aligned_timing = 0;
869 trunk->rfc5993_hr_convert = false;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200870 return CMD_SUCCESS;
871}
872
Philipp Maier19c430f2020-09-22 15:52:50 +0200873DEFUN_ATTR(cfg_mgcp_rtp_keepalive,
874 cfg_mgcp_rtp_keepalive_cmd,
875 "rtp keep-alive <1-120>",
876 RTP_STR RTP_KEEPALIVE_STR "Keep alive interval in secs\n",
877 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200878{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200879 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200880 OSMO_ASSERT(trunk);
881 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200882 return CMD_SUCCESS;
883}
884
Philipp Maier19c430f2020-09-22 15:52:50 +0200885DEFUN_ATTR(cfg_mgcp_rtp_keepalive_once,
886 cfg_mgcp_rtp_keepalive_once_cmd,
887 "rtp keep-alive once",
888 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n",
889 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200890{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200891 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200892 OSMO_ASSERT(trunk);
893 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200894 return CMD_SUCCESS;
895}
896
Philipp Maier19c430f2020-09-22 15:52:50 +0200897DEFUN_ATTR(cfg_mgcp_no_rtp_keepalive,
898 cfg_mgcp_no_rtp_keepalive_cmd,
899 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR,
900 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200901{
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200902 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +0200903 OSMO_ASSERT(trunk);
904 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_NEVER);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200905 return CMD_SUCCESS;
906}
907
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200908#define CALL_AGENT_STR "Call agent information\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200909DEFUN(cfg_mgcp_agent_addr,
910 cfg_mgcp_agent_addr_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +0200911 "call-agent ip " VTY_IPV46_CMD,
912 CALL_AGENT_STR IP_STR
913 "IPv4 Address of the call agent\n"
914 "IPv6 Address of the call agent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200915{
916 osmo_talloc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
917 return CMD_SUCCESS;
918}
919
920ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200921 "call agent ip A.B.C.D",
922 CALL_AGENT_STR CALL_AGENT_STR IP_STR
923 "IPv4 Address of the callagent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200924
Philipp Maier21be42a2020-05-29 21:39:48 +0200925DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
Philipp Maier0653cc82020-08-10 22:52:51 +0200926 "trunk <0-64>", "Configure a SS7 trunk\n" "Trunk Nr\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200927{
Philipp Maier14b27a82020-06-02 20:15:30 +0200928 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200929 int index = atoi(argv[0]);
930
Philipp Maier6fbbeec2020-07-01 23:00:54 +0200931 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, index);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100932 if (!trunk) {
933 trunk = mgcp_trunk_alloc(g_cfg, MGCP_TRUNK_E1, index);
Philipp Maier2d681fd2020-05-29 16:20:25 +0200934 if (!trunk) {
935 vty_out(vty, "%%Unable to allocate trunk %u.%s",
936 index, VTY_NEWLINE);
Harald Weltec39b1bf2020-03-08 11:29:39 +0100937 return CMD_WARNING;
Philipp Maier2d681fd2020-05-29 16:20:25 +0200938 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200939 }
940
941 vty->node = TRUNK_NODE;
942 vty->index = trunk;
943 return CMD_SUCCESS;
944}
945
946static int config_write_trunk(struct vty *vty)
947{
Philipp Maier14b27a82020-06-02 20:15:30 +0200948 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200949
950 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
Philipp Maierd19de2e2020-06-03 13:55:33 +0200951
952 /* Due to historical reasons, the virtual trunk is configured
953 using separate VTY parameters, so we omit writing the trunk
954 config of trunk 0 here. The configuration for the virtual
955 trunk is written by config_write_mgcp(). */
956
Philipp Maier31682a32020-11-26 00:39:35 +0100957 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL
958 && trunk->trunk_nr == MGCP_VIRT_TRUNK_ID)
Philipp Maierd19de2e2020-06-03 13:55:33 +0200959 continue;
960
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200961 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Philipp Maier889fe7f2020-07-06 17:44:12 +0200962 vty_out(vty, " line %u%s", trunk->e1.vty_line_nr, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200963 vty_out(vty, " %ssdp audio-payload send-ptime%s",
964 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
965 vty_out(vty, " %ssdp audio-payload send-name%s",
966 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
967
968 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
969 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
970 else if (trunk->keepalive_interval)
971 vty_out(vty, " rtp keep-alive %d%s",
972 trunk->keepalive_interval, VTY_NEWLINE);
973 else
974 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200975 vty_out(vty, " force-realloc %d%s",
976 trunk->force_realloc, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200977 vty_out(vty, " rtp-accept-all %d%s",
978 trunk->rtp_accept_all, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200979 if (trunk->omit_rtcp)
980 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
981 else
982 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Philipp Maier9fc8a022019-02-20 12:26:52 +0100983 if (trunk->force_constant_ssrc || trunk->force_aligned_timing
Philipp Maierd19de2e2020-06-03 13:55:33 +0200984 || trunk->rfc5993_hr_convert) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200985 vty_out(vty, " %srtp-patch ssrc%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200986 trunk->force_constant_ssrc ? "" : "no ",
987 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200988 vty_out(vty, " %srtp-patch timestamp%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200989 trunk->force_aligned_timing ? "" : "no ",
990 VTY_NEWLINE);
Philipp Maier9fc8a022019-02-20 12:26:52 +0100991 vty_out(vty, " %srtp-patch rfc5993hr%s",
992 trunk->rfc5993_hr_convert ? "" : "no ",
993 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200994 } else
995 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
996 if (trunk->audio_fmtp_extra)
997 vty_out(vty, " sdp audio fmtp-extra %s%s",
998 trunk->audio_fmtp_extra, VTY_NEWLINE);
999 vty_out(vty, " %sallow-transcoding%s",
1000 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
1001 }
1002
1003 return CMD_SUCCESS;
1004}
1005
Philipp Maier19c430f2020-09-22 15:52:50 +02001006DEFUN_USRATTR(cfg_trunk_sdp_fmtp_extra,
1007 cfg_trunk_sdp_fmtp_extra_cmd,
1008 X(MGW_CMD_ATTR_NEWCONN),
1009 "sdp audio fmtp-extra .NAME",
1010 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
1011 "Extra Information\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001012{
Philipp Maier14b27a82020-06-02 20:15:30 +02001013 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001014 char *txt = argv_concat(argv, argc, 0);
1015 if (!txt)
1016 return CMD_WARNING;
1017
1018 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
1019 talloc_free(txt);
1020 return CMD_SUCCESS;
1021}
1022
Philipp Maier7f90ddb2020-06-02 21:52:53 +02001023DEFUN_DEPRECATED(cfg_trunk_payload_number,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001024 cfg_trunk_payload_number_cmd,
1025 "sdp audio-payload number <0-255>",
1026 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
1027{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001028 return CMD_SUCCESS;
1029}
1030
1031ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001032 "sdp audio payload number <0-255>",
1033 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001034
Philipp Maier7f90ddb2020-06-02 21:52:53 +02001035DEFUN_DEPRECATED(cfg_trunk_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001036 cfg_trunk_payload_name_cmd,
1037 "sdp audio-payload name NAME",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001038 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001039{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001040 return CMD_SUCCESS;
1041}
1042
1043ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001044 "sdp audio payload name NAME",
1045 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001046
Philipp Maierba94b6d2020-09-22 16:14:32 +02001047DEFUN_DEPRECATED(cfg_trunk_loop,
1048 cfg_trunk_loop_cmd,
1049 "loop (0|1)",
1050 "Loop audio for all endpoints on this trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001051{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001052 return CMD_SUCCESS;
1053}
1054
Philipp Maier41425e92020-11-26 00:41:59 +01001055DEFUN_USRATTR(cfg_trunk_force_realloc,
1056 cfg_trunk_force_realloc_cmd,
1057 X(MGW_CMD_ATTR_NEWCONN),
1058 "force-realloc (0|1)",
1059 "Force endpoint reallocation when the endpoint is still seized\n"
1060 "Don't force reallocation\n" "force reallocation\n")
1061{
1062 struct mgcp_trunk *trunk = vty->index;
1063 OSMO_ASSERT(trunk);
1064 trunk->force_realloc = atoi(argv[0]);
1065 return CMD_SUCCESS;
1066}
1067
1068DEFUN_ATTR(cfg_trunk_rtp_accept_all,
1069 cfg_trunk_rtp_accept_all_cmd,
1070 "rtp-accept-all (0|1)",
1071 "Accept all RTP packets, even when the originating IP/Port does not match\n"
1072 "enable filter\n" "disable filter\n",
1073 CMD_ATTR_IMMEDIATE)
1074{
1075 struct mgcp_trunk *trunk = vty->index;
1076 OSMO_ASSERT(trunk);
1077 trunk->rtp_accept_all = atoi(argv[0]);
1078 return CMD_SUCCESS;
1079}
1080
Philipp Maier19c430f2020-09-22 15:52:50 +02001081DEFUN_USRATTR(cfg_trunk_sdp_payload_send_ptime,
1082 cfg_trunk_sdp_payload_send_ptime_cmd,
1083 X(MGW_CMD_ATTR_NEWCONN),
1084 "sdp audio-payload send-ptime",
1085 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001086{
Philipp Maier14b27a82020-06-02 20:15:30 +02001087 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001088 trunk->audio_send_ptime = 1;
1089 return CMD_SUCCESS;
1090}
1091
Philipp Maier19c430f2020-09-22 15:52:50 +02001092DEFUN_USRATTR(cfg_trunk_no_sdp_payload_send_ptime,
1093 cfg_trunk_no_sdp_payload_send_ptime_cmd,
1094 X(MGW_CMD_ATTR_NEWCONN),
1095 "no sdp audio-payload send-ptime",
1096 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001097{
Philipp Maier14b27a82020-06-02 20:15:30 +02001098 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001099 trunk->audio_send_ptime = 0;
1100 return CMD_SUCCESS;
1101}
1102
Philipp Maier19c430f2020-09-22 15:52:50 +02001103DEFUN_USRATTR(cfg_trunk_sdp_payload_send_name,
1104 cfg_trunk_sdp_payload_send_name_cmd,
1105 X(MGW_CMD_ATTR_NEWCONN),
1106 "sdp audio-payload send-name",
1107 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001108{
Philipp Maier14b27a82020-06-02 20:15:30 +02001109 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001110 trunk->audio_send_name = 1;
1111 return CMD_SUCCESS;
1112}
1113
Philipp Maier19c430f2020-09-22 15:52:50 +02001114DEFUN_USRATTR(cfg_trunk_no_sdp_payload_send_name,
1115 cfg_trunk_no_sdp_payload_send_name_cmd,
1116 X(MGW_CMD_ATTR_NEWCONN),
1117 "no sdp audio-payload send-name",
1118 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001119{
Philipp Maier14b27a82020-06-02 20:15:30 +02001120 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001121 trunk->audio_send_name = 0;
1122 return CMD_SUCCESS;
1123}
1124
Philipp Maier19c430f2020-09-22 15:52:50 +02001125DEFUN_ATTR(cfg_trunk_omit_rtcp,
1126 cfg_trunk_omit_rtcp_cmd,
1127 "rtcp-omit", RTCP_OMIT_STR,
1128 CMD_ATTR_IMMEDIATE)
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->omit_rtcp = 1;
1132 return CMD_SUCCESS;
1133}
1134
Philipp Maier19c430f2020-09-22 15:52:50 +02001135DEFUN_ATTR(cfg_trunk_no_omit_rtcp,
1136 cfg_trunk_no_omit_rtcp_cmd,
1137 "no rtcp-omit", NO_STR RTCP_OMIT_STR,
1138 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001139{
Philipp Maier14b27a82020-06-02 20:15:30 +02001140 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001141 trunk->omit_rtcp = 0;
1142 return CMD_SUCCESS;
1143}
1144
Philipp Maier19c430f2020-09-22 15:52:50 +02001145DEFUN_USRATTR(cfg_trunk_patch_rtp_ssrc,
1146 cfg_trunk_patch_rtp_ssrc_cmd,
1147 X(MGW_CMD_ATTR_NEWCONN),
1148 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001149{
Philipp Maier14b27a82020-06-02 20:15:30 +02001150 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001151 trunk->force_constant_ssrc = 1;
1152 return CMD_SUCCESS;
1153}
1154
Philipp Maier19c430f2020-09-22 15:52:50 +02001155DEFUN_USRATTR(cfg_trunk_no_patch_rtp_ssrc,
1156 cfg_trunk_no_patch_rtp_ssrc_cmd,
1157 X(MGW_CMD_ATTR_NEWCONN),
1158 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001159{
Philipp Maier14b27a82020-06-02 20:15:30 +02001160 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001161 trunk->force_constant_ssrc = 0;
1162 return CMD_SUCCESS;
1163}
1164
Philipp Maier19c430f2020-09-22 15:52:50 +02001165DEFUN_USRATTR(cfg_trunk_patch_rtp_ts,
1166 cfg_trunk_patch_rtp_ts_cmd,
1167 X(MGW_CMD_ATTR_NEWCONN),
1168 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001169{
Philipp Maier14b27a82020-06-02 20:15:30 +02001170 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001171 trunk->force_aligned_timing = 1;
1172 return CMD_SUCCESS;
1173}
1174
Philipp Maier19c430f2020-09-22 15:52:50 +02001175DEFUN_USRATTR(cfg_trunk_no_patch_rtp_ts,
1176 cfg_trunk_no_patch_rtp_ts_cmd,
1177 X(MGW_CMD_ATTR_NEWCONN),
1178 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001179{
Philipp Maier14b27a82020-06-02 20:15:30 +02001180 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001181 trunk->force_aligned_timing = 0;
1182 return CMD_SUCCESS;
1183}
1184
Philipp Maier19c430f2020-09-22 15:52:50 +02001185DEFUN_USRATTR(cfg_trunk_patch_rtp_rfc5993hr,
1186 cfg_trunk_patch_rtp_rfc5993hr_cmd,
1187 X(MGW_CMD_ATTR_NEWCONN),
1188 "rtp-patch rfc5993hr", RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +01001189{
Philipp Maier14b27a82020-06-02 20:15:30 +02001190 struct mgcp_trunk *trunk = vty->index;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001191 trunk->rfc5993_hr_convert = true;
1192 return CMD_SUCCESS;
1193}
1194
Philipp Maier19c430f2020-09-22 15:52:50 +02001195DEFUN_USRATTR(cfg_trunk_no_patch_rtp_rfc5993hr,
1196 cfg_trunk_no_patch_rtp_rfc5993hr_cmd,
1197 X(MGW_CMD_ATTR_NEWCONN),
1198 "no rtp-patch rfc5993hr", NO_STR RTP_PATCH_STR RTP_TS101318_RFC5993_CONV_STR)
Philipp Maier9fc8a022019-02-20 12:26:52 +01001199{
Philipp Maier14b27a82020-06-02 20:15:30 +02001200 struct mgcp_trunk *trunk = vty->index;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001201 trunk->rfc5993_hr_convert = false;
1202 return CMD_SUCCESS;
1203}
1204
Philipp Maier19c430f2020-09-22 15:52:50 +02001205DEFUN_USRATTR(cfg_trunk_no_patch_rtp,
1206 cfg_trunk_no_patch_rtp_cmd,
1207 X(MGW_CMD_ATTR_NEWCONN),
1208 "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001209{
Philipp Maier14b27a82020-06-02 20:15:30 +02001210 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001211 trunk->force_constant_ssrc = 0;
1212 trunk->force_aligned_timing = 0;
Philipp Maier9fc8a022019-02-20 12:26:52 +01001213 trunk->rfc5993_hr_convert = false;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001214 return CMD_SUCCESS;
1215}
1216
Philipp Maier19c430f2020-09-22 15:52:50 +02001217DEFUN_ATTR(cfg_trunk_rtp_keepalive,
1218 cfg_trunk_rtp_keepalive_cmd,
1219 "rtp keep-alive <1-120>",
1220 RTP_STR RTP_KEEPALIVE_STR "Keep-alive interval in secs\n",
1221 CMD_ATTR_IMMEDIATE)
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 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
1225 return CMD_SUCCESS;
1226}
1227
Philipp Maier19c430f2020-09-22 15:52:50 +02001228DEFUN_ATTR(cfg_trunk_rtp_keepalive_once,
1229 cfg_trunk_rtp_keepalive_once_cmd,
1230 "rtp keep-alive once",
1231 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n",
1232 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001233{
Philipp Maier14b27a82020-06-02 20:15:30 +02001234 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001235 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
1236 return CMD_SUCCESS;
1237}
1238
Philipp Maier19c430f2020-09-22 15:52:50 +02001239DEFUN_ATTR(cfg_trunk_no_rtp_keepalive,
1240 cfg_trunk_no_rtp_keepalive_cmd,
1241 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR,
1242 CMD_ATTR_IMMEDIATE)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001243{
Philipp Maier14b27a82020-06-02 20:15:30 +02001244 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001245 mgcp_trunk_set_keepalive(trunk, 0);
1246 return CMD_SUCCESS;
1247}
1248
Philipp Maier19c430f2020-09-22 15:52:50 +02001249DEFUN_USRATTR(cfg_trunk_allow_transcoding,
1250 cfg_trunk_allow_transcoding_cmd,
1251 X(MGW_CMD_ATTR_NEWCONN),
1252 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001253{
Philipp Maier14b27a82020-06-02 20:15:30 +02001254 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001255 trunk->no_audio_transcoding = 0;
1256 return CMD_SUCCESS;
1257}
1258
Philipp Maier19c430f2020-09-22 15:52:50 +02001259DEFUN_USRATTR(cfg_trunk_no_allow_transcoding,
1260 cfg_trunk_no_allow_transcoding_cmd,
1261 X(MGW_CMD_ATTR_NEWCONN),
1262 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001263{
Philipp Maier14b27a82020-06-02 20:15:30 +02001264 struct mgcp_trunk *trunk = vty->index;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001265 trunk->no_audio_transcoding = 1;
1266 return CMD_SUCCESS;
1267}
1268
Philipp Maier889fe7f2020-07-06 17:44:12 +02001269#define LINE_STR "Configure trunk for given Line\nE1/T1 Line Number\n"
1270
1271DEFUN(cfg_trunk_line,
1272 cfg_trunk_line_cmd,
1273 "line <0-255>",
1274 LINE_STR)
1275{
1276 struct mgcp_trunk *trunk = vty->index;
1277 int line_nr = atoi(argv[0]);
1278 trunk->e1.vty_line_nr = line_nr;
1279 return CMD_SUCCESS;
1280}
1281
Philipp Maier87bd9be2017-08-22 16:35:41 +02001282DEFUN(loop_conn,
1283 loop_conn_cmd,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001284 "loop-endpoint <0-64> NAME (0|1)",
1285 "Loop a given endpoint\n" "Trunk number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +02001286 "The name in hex of the endpoint\n" "Disable the loop\n"
1287 "Enable the loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001288{
Philipp Maier14b27a82020-06-02 20:15:30 +02001289 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001290 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +02001291 struct mgcp_conn *conn;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001292
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001293 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001294 if (!trunk) {
1295 vty_out(vty, "%%Trunk %d not found in the config.%s",
1296 atoi(argv[0]), VTY_NEWLINE);
1297 return CMD_WARNING;
1298 }
1299
1300 if (!trunk->endpoints) {
1301 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1302 trunk->trunk_nr, VTY_NEWLINE);
1303 return CMD_WARNING;
1304 }
1305
1306 int endp_no = strtoul(argv[1], NULL, 16);
1307 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1308 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001309 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001310 return CMD_WARNING;
1311 }
1312
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001313 endp = trunk->endpoints[endp_no];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001314 int loop = atoi(argv[2]);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001315 llist_for_each_entry(conn, &endp->conns, entry) {
1316 if (conn->type == MGCP_CONN_TYPE_RTP)
1317 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1318 mgcp_rtp_end_config(endp, 1, &conn->u.rtp.end);
1319 else {
1320 /* FIXME: Introduce support for other connection (E1)
1321 * types when implementation is available */
1322 vty_out(vty, "%%Can't enable SSRC patching,"
1323 "connection %s is not an RTP connection.%s",
1324 mgcp_conn_dump(conn), VTY_NEWLINE);
1325 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001326
Philipp Maier87bd9be2017-08-22 16:35:41 +02001327 if (loop)
1328 conn->mode = MGCP_CONN_LOOPBACK;
1329 else
1330 conn->mode = conn->mode_orig;
1331 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001332
1333 return CMD_SUCCESS;
1334}
1335
Philipp Maier87bd9be2017-08-22 16:35:41 +02001336DEFUN(tap_rtp,
1337 tap_rtp_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001338 "tap-rtp <0-64> ENDPOINT CONN (in|out) " VTY_IPV46_CMD " <0-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001339 "Forward data on endpoint to a different system\n" "Trunk number\n"
1340 "The endpoint in hex\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +02001341 "The connection id in hex\n"
1342 "Forward incoming data\n"
1343 "Forward leaving data\n"
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001344 "Destination IPv4 of the data\n"
1345 "Destination IPv6 of the data\n"
1346 "Destination port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001347{
1348 struct mgcp_rtp_tap *tap;
Philipp Maier14b27a82020-06-02 20:15:30 +02001349 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001350 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +02001351 struct mgcp_conn_rtp *conn;
Philipp Maier01d24a32017-11-21 17:26:09 +01001352 const char *conn_id = NULL;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001353
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001354 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001355 if (!trunk) {
1356 vty_out(vty, "%%Trunk %d not found in the config.%s",
1357 atoi(argv[0]), VTY_NEWLINE);
1358 return CMD_WARNING;
1359 }
1360
1361 if (!trunk->endpoints) {
1362 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1363 trunk->trunk_nr, VTY_NEWLINE);
1364 return CMD_WARNING;
1365 }
1366
1367 int endp_no = strtoul(argv[1], NULL, 16);
1368 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1369 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001370 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001371 return CMD_WARNING;
1372 }
1373
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001374 endp = trunk->endpoints[endp_no];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001375
Philipp Maier01d24a32017-11-21 17:26:09 +01001376 conn_id = argv[2];
Philipp Maier87bd9be2017-08-22 16:35:41 +02001377 conn = mgcp_conn_get_rtp(endp, conn_id);
1378 if (!conn) {
Philipp Maier01d24a32017-11-21 17:26:09 +01001379 vty_out(vty, "Conn ID %s is invalid.%s",
1380 conn_id, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001381 return CMD_WARNING;
1382 }
1383
1384 if (strcmp(argv[3], "in") == 0)
1385 tap = &conn->tap_in;
1386 else if (strcmp(argv[3], "out") == 0)
1387 tap = &conn->tap_out;
1388 else {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001389 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1390 return CMD_WARNING;
1391 }
1392
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001393 memset(&tap->forward, 0, sizeof(tap->forward));
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001394
1395 tap->forward.u.sa.sa_family = osmo_ip_str_type(argv[4]);
1396 switch (tap->forward.u.sa.sa_family) {
1397 case AF_INET:
1398 if (inet_pton(AF_INET, argv[4], &tap->forward.u.sin.sin_addr) != 1)
1399 return CMD_WARNING;
1400 tap->forward.u.sin.sin_port = htons(atoi(argv[5]));
1401 break;
1402 case AF_INET6:
1403 if (inet_pton(AF_INET6, argv[4], &tap->forward.u.sin6.sin6_addr) != 1)
1404 return CMD_WARNING;
1405 tap->forward.u.sin6.sin6_port = htons(atoi(argv[5]));
1406 break;
1407 default:
1408 return CMD_WARNING;
1409 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001410 tap->enabled = 1;
1411 return CMD_SUCCESS;
1412}
1413
1414DEFUN(free_endp, free_endp_cmd,
1415 "free-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001416 "Free the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001417{
Philipp Maier14b27a82020-06-02 20:15:30 +02001418 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001419 struct mgcp_endpoint *endp;
1420
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) {
1429 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1430 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];
Philipp Maier1355d7e2018-02-01 14:30:06 +01001442 mgcp_endp_release(endp);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001443 return CMD_SUCCESS;
1444}
1445
1446DEFUN(reset_endp, reset_endp_cmd,
1447 "reset-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001448 "Reset the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001449{
Philipp Maier14b27a82020-06-02 20:15:30 +02001450 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001451 struct mgcp_endpoint *endp;
1452 int endp_no, rc;
1453
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001454 trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_E1, atoi(argv[0]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001455 if (!trunk) {
1456 vty_out(vty, "%%Trunk %d not found in the config.%s",
1457 atoi(argv[0]), VTY_NEWLINE);
1458 return CMD_WARNING;
1459 }
1460
1461 if (!trunk->endpoints) {
1462 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1463 trunk->trunk_nr, VTY_NEWLINE);
1464 return CMD_WARNING;
1465 }
1466
1467 endp_no = strtoul(argv[1], NULL, 16);
1468 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1469 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001470 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001471 return CMD_WARNING;
1472 }
1473
Philipp Maierc66ab2c2020-06-02 20:55:34 +02001474 endp = trunk->endpoints[endp_no];
1475 rc = mgcp_send_reset_ep(endp);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001476 if (rc < 0) {
1477 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1478 return CMD_WARNING;
1479 }
1480 return CMD_SUCCESS;
1481}
1482
1483DEFUN(reset_all_endp, reset_all_endp_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001484 "reset-all-endpoints", "Reset all endpoints\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001485{
1486 int rc;
1487
1488 rc = mgcp_send_reset_all(g_cfg);
1489 if (rc < 0) {
1490 vty_out(vty, "Error %d during endpoint reset.%s",
1491 rc, VTY_NEWLINE);
1492 return CMD_WARNING;
1493 }
1494 return CMD_SUCCESS;
1495}
1496
1497#define OSMUX_STR "RTP multiplexing\n"
1498DEFUN(cfg_mgcp_osmux,
1499 cfg_mgcp_osmux_cmd,
1500 "osmux (on|off|only)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001501 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001502{
Philipp Maier6fbbeec2020-07-01 23:00:54 +02001503 struct mgcp_trunk *trunk = mgcp_trunk_by_num(g_cfg, MGCP_TRUNK_VIRTUAL, MGCP_VIRT_TRUNK_ID);
Philipp Maierd19de2e2020-06-03 13:55:33 +02001504 OSMO_ASSERT(trunk);
1505
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001506 if (strcmp(argv[0], "off") == 0) {
1507 g_cfg->osmux = OSMUX_USAGE_OFF;
1508 return CMD_SUCCESS;
Pau Espin Pedrolb542b042019-04-23 13:09:32 +02001509 } else if (strcmp(argv[0], "on") == 0)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001510 g_cfg->osmux = OSMUX_USAGE_ON;
1511 else if (strcmp(argv[0], "only") == 0)
1512 g_cfg->osmux = OSMUX_USAGE_ONLY;
1513
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001514 return CMD_SUCCESS;
Pau Espin Pedrolb542b042019-04-23 13:09:32 +02001515
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001516}
1517
1518DEFUN(cfg_mgcp_osmux_ip,
1519 cfg_mgcp_osmux_ip_cmd,
Pau Espin Pedrola790f0c2020-08-31 13:29:11 +02001520 "osmux bind-ip " VTY_IPV46_CMD,
1521 OSMUX_STR IP_STR
1522 "IPv4 Address to bind to\n"
1523 "IPv6 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001524{
1525 osmo_talloc_replace_string(g_cfg, &g_cfg->osmux_addr, argv[0]);
1526 return CMD_SUCCESS;
1527}
1528
1529DEFUN(cfg_mgcp_osmux_batch_factor,
1530 cfg_mgcp_osmux_batch_factor_cmd,
1531 "osmux batch-factor <1-8>",
1532 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1533{
1534 g_cfg->osmux_batch = atoi(argv[0]);
1535 return CMD_SUCCESS;
1536}
1537
1538DEFUN(cfg_mgcp_osmux_batch_size,
1539 cfg_mgcp_osmux_batch_size_cmd,
1540 "osmux batch-size <1-65535>",
1541 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1542{
1543 g_cfg->osmux_batch_size = atoi(argv[0]);
1544 return CMD_SUCCESS;
1545}
1546
1547DEFUN(cfg_mgcp_osmux_port,
1548 cfg_mgcp_osmux_port_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001549 "osmux port <1-65535>", OSMUX_STR "port\n" "UDP port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001550{
1551 g_cfg->osmux_port = atoi(argv[0]);
1552 return CMD_SUCCESS;
1553}
1554
1555DEFUN(cfg_mgcp_osmux_dummy,
1556 cfg_mgcp_osmux_dummy_cmd,
1557 "osmux dummy (on|off)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001558 OSMUX_STR "Dummy padding\n" "Enable dummy padding\n"
1559 "Disable dummy padding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001560{
1561 if (strcmp(argv[0], "on") == 0)
1562 g_cfg->osmux_dummy = 1;
1563 else if (strcmp(argv[0], "off") == 0)
1564 g_cfg->osmux_dummy = 0;
1565
1566 return CMD_SUCCESS;
1567}
1568
Philipp Maier12943ea2018-01-17 15:40:25 +01001569DEFUN(cfg_mgcp_domain,
1570 cfg_mgcp_domain_cmd,
Neels Hofmeyr352eed02018-08-20 23:59:32 +02001571 "domain NAME",
1572 "Set the domain part expected in MGCP messages' endpoint names\n"
1573 "Qualified domain name expected in MGCP endpoint names, or '*' to accept any domain\n")
Philipp Maier12943ea2018-01-17 15:40:25 +01001574{
1575 osmo_strlcpy(g_cfg->domain, argv[0], sizeof(g_cfg->domain));
1576 return CMD_SUCCESS;
1577}
1578
Oliver Smithe36b7752019-01-22 16:31:36 +01001579DEFUN(cfg_mgcp_conn_timeout,
1580 cfg_mgcp_conn_timeout_cmd,
Oliver Smithd2ce4442019-06-26 09:56:44 +02001581 "conn-timeout <0-65534>",
1582 "Set a time after which inactive connections (CIs) are closed. Set to 0 to disable timeout. This can be used to"
1583 " work around interoperability problems causing connections to stay open forever, and slowly exhausting all"
Oliver Smith189f29e2019-06-26 12:08:20 +02001584 " available ports. Enable keep-alive packets in MGW clients when using this option together with LCLS (OsmoBSC,"
1585 " OsmoMSC: 'rtp keep-alive')!\n"
Oliver Smithe36b7752019-01-22 16:31:36 +01001586 "Timeout value (sec.)\n")
1587{
1588 g_cfg->conn_timeout = strtoul(argv[0], NULL, 10);
1589 return CMD_SUCCESS;
1590}
1591
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001592int mgcp_vty_init(void)
1593{
1594 install_element_ve(&show_mgcp_cmd);
Stefan Sperling12086582018-06-26 15:26:28 +02001595 install_element_ve(&show_mgcp_endpoint_cmd);
1596 install_element_ve(&show_mgcp_trunk_endpoint_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001597 install_element(ENABLE_NODE, &loop_conn_cmd);
1598 install_element(ENABLE_NODE, &tap_rtp_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001599 install_element(ENABLE_NODE, &free_endp_cmd);
1600 install_element(ENABLE_NODE, &reset_endp_cmd);
1601 install_element(ENABLE_NODE, &reset_all_endp_cmd);
1602
1603 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1604 install_node(&mgcp_node, config_write_mgcp);
1605
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001606 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001607 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1608 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1609 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001610 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001611 install_element(MGCP_NODE, &cfg_mgcp_rtp_port_range_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001612 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001613 install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_cmd);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +02001614 install_element(MGCP_NODE, &cfg_mgcp_rtp_bind_ip_v6_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001615 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Philipp Maierf1889d82017-11-08 14:59:39 +01001616 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_cmd);
Pau Espin Pedrol8a2a1b22020-09-02 20:46:24 +02001617 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bind_ip_v6_cmd);
Philipp Maier1cb1e382017-11-02 17:16:04 +01001618 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_probing_cmd);
1619 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_probing_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001620 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001621 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1622 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
1623 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1624 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1625 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
1626 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
1627 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001628 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1629 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
1630 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1631 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
1632 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1633 install_element(MGCP_NODE, &cfg_mgcp_force_realloc_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001634 install_element(MGCP_NODE, &cfg_mgcp_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001635 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
1636 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1637 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
1638 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1639 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1640 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1641 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1642 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001643 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_rfc5993hr_cmd);
1644 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_rfc5993hr_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001645 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
1646 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1647 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
1648 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1649 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
1650 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1651 install_element(MGCP_NODE, &cfg_mgcp_osmux_ip_cmd);
1652 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
1653 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
1654 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
1655 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
1656 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1657 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
Philipp Maier12943ea2018-01-17 15:40:25 +01001658 install_element(MGCP_NODE, &cfg_mgcp_domain_cmd);
Oliver Smithe36b7752019-01-22 16:31:36 +01001659 install_element(MGCP_NODE, &cfg_mgcp_conn_timeout_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001660
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001661 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1662 install_node(&trunk_node, config_write_trunk);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001663 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1664 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1665 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
1666 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1667 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
1668 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1669 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
1670 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Philipp Maier41425e92020-11-26 00:41:59 +01001671 install_element(TRUNK_NODE, &cfg_trunk_force_realloc_cmd);
1672 install_element(TRUNK_NODE, &cfg_trunk_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001673 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1674 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
1675 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1676 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1677 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
Philipp Maier9fc8a022019-02-20 12:26:52 +01001678 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_rfc5993hr_cmd);
1679 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_rfc5993hr_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001680 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1681 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
1682 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
1683 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1684 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
1685 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1686 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
1687 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1688 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Philipp Maier889fe7f2020-07-06 17:44:12 +02001689 install_element(TRUNK_NODE, &cfg_trunk_line_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001690
1691 return 0;
1692}
1693
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001694int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1695 enum mgcp_role role)
1696{
1697 int rc;
Philipp Maier14b27a82020-06-02 20:15:30 +02001698 struct mgcp_trunk *trunk;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001699
1700 cfg->osmux_port = OSMUX_PORT;
1701 cfg->osmux_batch = 4;
1702 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
1703
1704 g_cfg = cfg;
1705 rc = vty_read_config_file(config_file, NULL);
1706 if (rc < 0) {
Philipp Maier87bd9be2017-08-22 16:35:41 +02001707 fprintf(stderr, "Failed to parse the config file: '%s'\n",
1708 config_file);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001709 return rc;
1710 }
1711
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001712 if (!g_cfg->source_addr) {
1713 fprintf(stderr, "You need to specify a bind address.\n");
1714 return -1;
1715 }
1716
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001717 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
Philipp Maier889fe7f2020-07-06 17:44:12 +02001718 if (mgcp_trunk_equip(trunk) != 0) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001719 LOGP(DLMGCP, LOGL_ERROR,
Philipp Maier48454982017-11-10 16:46:41 +01001720 "Failed to initialize trunk %d (%d endpoints)\n",
1721 trunk->trunk_nr, trunk->number_endpoints);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001722 return -1;
1723 }
1724 }
1725 cfg->role = role;
1726
1727 return 0;
1728}