blob: aaa0429b526d8e21e0e25c328c2303d4a9e1e2e6 [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>
Philipp Maier87bd9be2017-08-22 16:35:41 +020025#include <osmocom/mgcp/mgcp.h>
26#include <osmocom/mgcp/mgcp_internal.h>
27#include <osmocom/mgcp/vty.h>
28#include <osmocom/mgcp/mgcp_conn.h>
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020029
30#include <string.h>
31
32#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
33#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
34#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
35
36static struct mgcp_config *g_cfg = NULL;
37
38static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
39{
40 struct mgcp_trunk_config *trunk;
41
42 if (nr == 0)
43 trunk = &cfg->trunk;
44 else
45 trunk = mgcp_trunk_num(cfg, nr);
46
47 return trunk;
48}
49
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020050struct cmd_node mgcp_node = {
51 MGCP_NODE,
52 "%s(config-mgcp)# ",
53 1,
54};
55
56struct cmd_node trunk_node = {
57 TRUNK_NODE,
58 "%s(config-mgcp-trunk)# ",
59 1,
60};
61
62static int config_write_mgcp(struct vty *vty)
63{
64 vty_out(vty, "mgcp%s", VTY_NEWLINE);
65 if (g_cfg->local_ip)
66 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020067 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
68 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +020069 vty_out(vty, " rtp net-range %u %u%s",
70 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end,
71 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020072
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020073 if (g_cfg->net_ports.bind_addr)
Philipp Maier87bd9be2017-08-22 16:35:41 +020074 vty_out(vty, " rtp net-bind-ip %s%s",
75 g_cfg->net_ports.bind_addr, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020076
77 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
78 if (g_cfg->trunk.keepalive_interval == MGCP_KEEPALIVE_ONCE)
79 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
80 else if (g_cfg->trunk.keepalive_interval)
81 vty_out(vty, " rtp keep-alive %d%s",
82 g_cfg->trunk.keepalive_interval, VTY_NEWLINE);
83 else
84 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
85
86 if (g_cfg->trunk.omit_rtcp)
87 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
88 else
89 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +020090 if (g_cfg->trunk.force_constant_ssrc
91 || g_cfg->trunk.force_aligned_timing) {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020092 vty_out(vty, " %srtp-patch ssrc%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +020093 g_cfg->trunk.force_constant_ssrc ? "" : "no ",
94 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020095 vty_out(vty, " %srtp-patch timestamp%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +020096 g_cfg->trunk.force_aligned_timing ? "" : "no ",
97 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +020098 } else
99 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
100 if (g_cfg->trunk.audio_payload != -1)
101 vty_out(vty, " sdp audio-payload number %d%s",
102 g_cfg->trunk.audio_payload, VTY_NEWLINE);
103 if (g_cfg->trunk.audio_name)
104 vty_out(vty, " sdp audio-payload name %s%s",
105 g_cfg->trunk.audio_name, VTY_NEWLINE);
106 if (g_cfg->trunk.audio_fmtp_extra)
107 vty_out(vty, " sdp audio fmtp-extra %s%s",
108 g_cfg->trunk.audio_fmtp_extra, VTY_NEWLINE);
109 vty_out(vty, " %ssdp audio-payload send-ptime%s",
110 g_cfg->trunk.audio_send_ptime ? "" : "no ", VTY_NEWLINE);
111 vty_out(vty, " %ssdp audio-payload send-name%s",
112 g_cfg->trunk.audio_send_name ? "" : "no ", VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200113 vty_out(vty, " loop %u%s", ! !g_cfg->trunk.audio_loop, VTY_NEWLINE);
114 vty_out(vty, " number endpoints %u%s",
115 g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200116 vty_out(vty, " %sallow-transcoding%s",
117 g_cfg->trunk.no_audio_transcoding ? "no " : "", VTY_NEWLINE);
118 if (g_cfg->call_agent_addr)
Philipp Maier87bd9be2017-08-22 16:35:41 +0200119 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr,
120 VTY_NEWLINE);
121 if (g_cfg->force_ptime > 0)
122 vty_out(vty, " rtp force-ptime %d%s", g_cfg->force_ptime,
123 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200124
125 switch (g_cfg->osmux) {
126 case OSMUX_USAGE_ON:
127 vty_out(vty, " osmux on%s", VTY_NEWLINE);
128 break;
129 case OSMUX_USAGE_ONLY:
130 vty_out(vty, " osmux only%s", VTY_NEWLINE);
131 break;
132 case OSMUX_USAGE_OFF:
133 default:
134 vty_out(vty, " osmux off%s", VTY_NEWLINE);
135 break;
136 }
137 if (g_cfg->osmux) {
138 vty_out(vty, " osmux bind-ip %s%s",
139 g_cfg->osmux_addr, VTY_NEWLINE);
140 vty_out(vty, " osmux batch-factor %d%s",
141 g_cfg->osmux_batch, VTY_NEWLINE);
142 vty_out(vty, " osmux batch-size %u%s",
143 g_cfg->osmux_batch_size, VTY_NEWLINE);
144 vty_out(vty, " osmux port %u%s",
145 g_cfg->osmux_port, VTY_NEWLINE);
146 vty_out(vty, " osmux dummy %s%s",
147 g_cfg->osmux_dummy ? "on" : "off", VTY_NEWLINE);
148 }
149 return CMD_SUCCESS;
150}
151
Philipp Maier87bd9be2017-08-22 16:35:41 +0200152static void dump_rtp_end(struct vty *vty, struct mgcp_rtp_state *state,
153 struct mgcp_rtp_end *end)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200154{
155 struct mgcp_rtp_codec *codec = &end->codec;
156
157 vty_out(vty,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200158 " Timestamp Errs: %d->%d%s"
159 " Dropped Packets: %d%s"
160 " Payload Type: %d Rate: %u Channels: %d %s"
161 " Frame Duration: %u Frame Denominator: %u%s"
162 " FPP: %d Packet Duration: %u%s"
163 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
164 " Output-Enabled: %d Force-PTIME: %d%s",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200165 state->in_stream.err_ts_counter,
166 state->out_stream.err_ts_counter, VTY_NEWLINE,
167 end->dropped_packets, VTY_NEWLINE,
168 codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200169 codec->frame_duration_num, codec->frame_duration_den,
170 VTY_NEWLINE, end->frames_per_packet, end->packet_duration_ms,
171 VTY_NEWLINE, end->fmtp_extra, codec->audio_name,
172 codec->subtype_name, VTY_NEWLINE, end->output_enabled,
173 end->force_output_ptime, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200174}
175
Philipp Maier87bd9be2017-08-22 16:35:41 +0200176static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg,
177 int verbose)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200178{
179 int i;
Philipp Maier87bd9be2017-08-22 16:35:41 +0200180 struct mgcp_conn *conn;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200181
182 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
183 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
184 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
185
186 if (!cfg->endpoints) {
187 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
188 return;
189 }
190
191 for (i = 1; i < cfg->number_endpoints; ++i) {
192 struct mgcp_endpoint *endp = &cfg->endpoints[i];
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200193
Philipp Maier87bd9be2017-08-22 16:35:41 +0200194 vty_out(vty, "Endpoint 0x%.2x:%s", i, VTY_NEWLINE);
195
196 llist_for_each_entry(conn, &endp->conns, entry) {
197 vty_out(vty, " CONN: %s%s",
198 mgcp_conn_dump(conn), VTY_NEWLINE);
199
200 if (verbose) {
201 /* FIXME: Also add verbosity for other
202 * connection types (E1) as soon as
203 * the implementation is available */
204 if (conn->type == MGCP_CONN_TYPE_RTP) {
205 dump_rtp_end(vty, &conn->u.rtp.state,
206 &conn->u.rtp.end);
207 }
208 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200209 }
210 }
211}
212
213DEFUN(show_mcgp, show_mgcp_cmd,
214 "show mgcp [stats]",
215 SHOW_STR
216 "Display information about the MGCP Media Gateway\n"
217 "Include Statistics\n")
218{
219 struct mgcp_trunk_config *trunk;
220 int show_stats = argc >= 1;
221
222 dump_trunk(vty, &g_cfg->trunk, show_stats);
223
224 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Philipp Maier87bd9be2017-08-22 16:35:41 +0200225 dump_trunk(vty, trunk, show_stats);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200226
227 if (g_cfg->osmux)
Philipp Maier87bd9be2017-08-22 16:35:41 +0200228 vty_out(vty, "Osmux used CID: %d%s", osmux_used_cid(),
229 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200230
231 return CMD_SUCCESS;
232}
233
Philipp Maier87bd9be2017-08-22 16:35:41 +0200234DEFUN(cfg_mgcp, cfg_mgcp_cmd, "mgcp", "Configure the MGCP")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200235{
236 vty->node = MGCP_NODE;
237 return CMD_SUCCESS;
238}
239
240DEFUN(cfg_mgcp_local_ip,
241 cfg_mgcp_local_ip_cmd,
242 "local ip A.B.C.D",
243 "Local options for the SDP record\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +0200244 IP_STR "IPv4 Address to use in SDP record\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200245{
246 osmo_talloc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
247 return CMD_SUCCESS;
248}
249
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200250#define BIND_STR "Listen/Bind related socket option\n"
251DEFUN(cfg_mgcp_bind_ip,
252 cfg_mgcp_bind_ip_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200253 "bind ip A.B.C.D", BIND_STR IP_STR "IPv4 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200254{
255 osmo_talloc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
256 return CMD_SUCCESS;
257}
258
259DEFUN(cfg_mgcp_bind_port,
260 cfg_mgcp_bind_port_cmd,
261 "bind port <0-65534>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200262 BIND_STR "Port information\n" "UDP port to listen for MGCP messages\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200263{
264 unsigned int port = atoi(argv[0]);
265 g_cfg->source_port = port;
266 return CMD_SUCCESS;
267}
268
269DEFUN(cfg_mgcp_bind_early,
270 cfg_mgcp_bind_early_cmd,
271 "bind early (0|1)",
272 BIND_STR
Philipp Maier87bd9be2017-08-22 16:35:41 +0200273 "Bind local ports on start up\n" "Bind on demand\n" "Bind on startup\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200274{
275 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
276 return CMD_WARNING;
277}
278
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200279static void parse_range(struct mgcp_port_range *range, const char **argv)
280{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200281 range->range_start = atoi(argv[0]);
282 range->range_end = atoi(argv[1]);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200283 range->last_port = g_cfg->net_ports.range_start;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200284}
285
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200286#define RTP_STR "RTP configuration\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200287#define UDP_PORT_STR "UDP Port number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +0200288#define NET_START_STR "First UDP port allocated\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200289#define RANGE_START_STR "Start of the range of ports\n"
290#define RANGE_END_STR "End of the range of ports\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200291
292DEFUN(cfg_mgcp_rtp_net_range,
293 cfg_mgcp_rtp_net_range_cmd,
294 "rtp net-range <0-65534> <0-65534>",
295 RTP_STR "Range of ports to use for the NET side\n"
296 RANGE_START_STR RANGE_END_STR)
297{
298 parse_range(&g_cfg->net_ports, argv);
299 return CMD_SUCCESS;
300}
301
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200302DEFUN(cfg_mgcp_rtp_net_bind_ip,
303 cfg_mgcp_rtp_net_bind_ip_cmd,
304 "rtp net-bind-ip A.B.C.D",
305 RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
306{
307 osmo_talloc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr, argv[0]);
308 return CMD_SUCCESS;
309}
310
311DEFUN(cfg_mgcp_rtp_no_net_bind_ip,
312 cfg_mgcp_rtp_no_net_bind_ip_cmd,
313 "no rtp net-bind-ip",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200314 NO_STR RTP_STR "Bind endpoints facing the Network\n"
315 "Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200316{
317 talloc_free(g_cfg->net_ports.bind_addr);
318 g_cfg->net_ports.bind_addr = NULL;
319 return CMD_SUCCESS;
320}
321
322DEFUN(cfg_mgcp_rtp_ip_dscp,
323 cfg_mgcp_rtp_ip_dscp_cmd,
324 "rtp ip-dscp <0-255>",
325 RTP_STR
326 "Apply IP_TOS to the audio stream (including Osmux)\n" "The DSCP value\n")
327{
328 int dscp = atoi(argv[0]);
329 g_cfg->endp_dscp = dscp;
330 return CMD_SUCCESS;
331}
332
333ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200334 "rtp ip-tos <0-255>",
335 RTP_STR
336 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
337#define FORCE_PTIME_STR "Force a fixed ptime for packets sent"
338 DEFUN(cfg_mgcp_rtp_force_ptime,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200339 cfg_mgcp_rtp_force_ptime_cmd,
340 "rtp force-ptime (10|20|40)",
341 RTP_STR FORCE_PTIME_STR
Philipp Maier87bd9be2017-08-22 16:35:41 +0200342 "The required ptime (packet duration) in ms\n" "10 ms\n20 ms\n40 ms\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200343{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200344 g_cfg->force_ptime = atoi(argv[0]);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200345 return CMD_SUCCESS;
346}
347
348DEFUN(cfg_mgcp_no_rtp_force_ptime,
349 cfg_mgcp_no_rtp_force_ptime_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200350 "no rtp force-ptime", NO_STR RTP_STR FORCE_PTIME_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200351{
Philipp Maier87bd9be2017-08-22 16:35:41 +0200352 g_cfg->force_ptime = 0;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200353 return CMD_SUCCESS;
354}
355
356DEFUN(cfg_mgcp_sdp_fmtp_extra,
357 cfg_mgcp_sdp_fmtp_extra_cmd,
358 "sdp audio fmtp-extra .NAME",
359 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
360 "Extra Information\n")
361{
362 char *txt = argv_concat(argv, argc, 0);
363 if (!txt)
364 return CMD_WARNING;
365
366 osmo_talloc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
367 talloc_free(txt);
368 return CMD_SUCCESS;
369}
370
371DEFUN(cfg_mgcp_allow_transcoding,
372 cfg_mgcp_allow_transcoding_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200373 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200374{
375 g_cfg->trunk.no_audio_transcoding = 0;
376 return CMD_SUCCESS;
377}
378
379DEFUN(cfg_mgcp_no_allow_transcoding,
380 cfg_mgcp_no_allow_transcoding_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200381 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200382{
383 g_cfg->trunk.no_audio_transcoding = 1;
384 return CMD_SUCCESS;
385}
386
387#define SDP_STR "SDP File related options\n"
388#define AUDIO_STR "Audio payload options\n"
389DEFUN(cfg_mgcp_sdp_payload_number,
390 cfg_mgcp_sdp_payload_number_cmd,
391 "sdp audio-payload number <0-255>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200392 SDP_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200393{
394 unsigned int payload = atoi(argv[0]);
395 g_cfg->trunk.audio_payload = payload;
396 return CMD_SUCCESS;
397}
398
Philipp Maier87bd9be2017-08-22 16:35:41 +0200399ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number,
400 cfg_mgcp_sdp_payload_number_cmd_old,
401 "sdp audio payload number <0-255>",
402 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200403
Philipp Maier87bd9be2017-08-22 16:35:41 +0200404 DEFUN(cfg_mgcp_sdp_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200405 cfg_mgcp_sdp_payload_name_cmd,
406 "sdp audio-payload name NAME",
407 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
408{
409 osmo_talloc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
410 return CMD_SUCCESS;
411}
412
413ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200414 "sdp audio payload name NAME",
415 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200416
Philipp Maier87bd9be2017-08-22 16:35:41 +0200417 DEFUN(cfg_mgcp_sdp_payload_send_ptime,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200418 cfg_mgcp_sdp_payload_send_ptime_cmd,
419 "sdp audio-payload send-ptime",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200420 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200421{
422 g_cfg->trunk.audio_send_ptime = 1;
423 return CMD_SUCCESS;
424}
425
426DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
427 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
428 "no sdp audio-payload send-ptime",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200429 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200430{
431 g_cfg->trunk.audio_send_ptime = 0;
432 return CMD_SUCCESS;
433}
434
435DEFUN(cfg_mgcp_sdp_payload_send_name,
436 cfg_mgcp_sdp_payload_send_name_cmd,
437 "sdp audio-payload send-name",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200438 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200439{
440 g_cfg->trunk.audio_send_name = 1;
441 return CMD_SUCCESS;
442}
443
444DEFUN(cfg_mgcp_no_sdp_payload_send_name,
445 cfg_mgcp_no_sdp_payload_send_name_cmd,
446 "no sdp audio-payload send-name",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200447 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200448{
449 g_cfg->trunk.audio_send_name = 0;
450 return CMD_SUCCESS;
451}
452
453DEFUN(cfg_mgcp_loop,
454 cfg_mgcp_loop_cmd,
455 "loop (0|1)",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200456 "Loop audio for all endpoints on main trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200457{
458 if (g_cfg->osmux) {
459 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
460 return CMD_WARNING;
461 }
462 g_cfg->trunk.audio_loop = atoi(argv[0]);
463 return CMD_SUCCESS;
464}
465
466DEFUN(cfg_mgcp_force_realloc,
467 cfg_mgcp_force_realloc_cmd,
468 "force-realloc (0|1)",
469 "Force endpoint reallocation when the endpoint is still seized\n"
470 "Don't force reallocation\n" "force reallocation\n")
471{
472 g_cfg->trunk.force_realloc = atoi(argv[0]);
473 return CMD_SUCCESS;
474}
475
Philipp Maier87bd9be2017-08-22 16:35:41 +0200476DEFUN(cfg_mgcp_rtp_accept_all,
477 cfg_mgcp_rtp_accept_all_cmd,
478 "rtp-accept-all (0|1)",
479 "Accept all RTP packets, even when the originating IP/Port does not match\n"
480 "enable filter\n" "disable filter\n")
481{
482 g_cfg->trunk.rtp_accept_all = atoi(argv[0]);
483 return CMD_SUCCESS;
484}
485
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200486DEFUN(cfg_mgcp_number_endp,
487 cfg_mgcp_number_endp_cmd,
488 "number endpoints <0-65534>",
489 "Number options\n" "Endpoints available\n" "Number endpoints\n")
490{
491 /* + 1 as we start counting at one */
492 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
493 return CMD_SUCCESS;
494}
495
Philipp Maier87bd9be2017-08-22 16:35:41 +0200496DEFUN(cfg_mgcp_omit_rtcp, cfg_mgcp_omit_rtcp_cmd, "rtcp-omit", RTCP_OMIT_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200497{
498 g_cfg->trunk.omit_rtcp = 1;
499 return CMD_SUCCESS;
500}
501
502DEFUN(cfg_mgcp_no_omit_rtcp,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200503 cfg_mgcp_no_omit_rtcp_cmd, "no rtcp-omit", NO_STR RTCP_OMIT_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200504{
505 g_cfg->trunk.omit_rtcp = 0;
506 return CMD_SUCCESS;
507}
508
509DEFUN(cfg_mgcp_patch_rtp_ssrc,
510 cfg_mgcp_patch_rtp_ssrc_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200511 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200512{
513 g_cfg->trunk.force_constant_ssrc = 1;
514 return CMD_SUCCESS;
515}
516
517DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
518 cfg_mgcp_no_patch_rtp_ssrc_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200519 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200520{
521 g_cfg->trunk.force_constant_ssrc = 0;
522 return CMD_SUCCESS;
523}
524
525DEFUN(cfg_mgcp_patch_rtp_ts,
526 cfg_mgcp_patch_rtp_ts_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200527 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200528{
529 g_cfg->trunk.force_aligned_timing = 1;
530 return CMD_SUCCESS;
531}
532
533DEFUN(cfg_mgcp_no_patch_rtp_ts,
534 cfg_mgcp_no_patch_rtp_ts_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200535 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200536{
537 g_cfg->trunk.force_aligned_timing = 0;
538 return CMD_SUCCESS;
539}
540
541DEFUN(cfg_mgcp_no_patch_rtp,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200542 cfg_mgcp_no_patch_rtp_cmd, "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200543{
544 g_cfg->trunk.force_constant_ssrc = 0;
545 g_cfg->trunk.force_aligned_timing = 0;
546 return CMD_SUCCESS;
547}
548
549DEFUN(cfg_mgcp_rtp_keepalive,
550 cfg_mgcp_rtp_keepalive_cmd,
551 "rtp keep-alive <1-120>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200552 RTP_STR RTP_KEEPALIVE_STR "Keep alive interval in secs\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200553{
554 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
555 return CMD_SUCCESS;
556}
557
558DEFUN(cfg_mgcp_rtp_keepalive_once,
559 cfg_mgcp_rtp_keepalive_once_cmd,
560 "rtp keep-alive once",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200561 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200562{
563 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
564 return CMD_SUCCESS;
565}
566
567DEFUN(cfg_mgcp_no_rtp_keepalive,
568 cfg_mgcp_no_rtp_keepalive_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200569 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200570{
571 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
572 return CMD_SUCCESS;
573}
574
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200575#define CALL_AGENT_STR "Callagent information\n"
576DEFUN(cfg_mgcp_agent_addr,
577 cfg_mgcp_agent_addr_cmd,
578 "call-agent ip A.B.C.D",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200579 CALL_AGENT_STR IP_STR "IPv4 Address of the callagent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200580{
581 osmo_talloc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
582 return CMD_SUCCESS;
583}
584
585ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200586 "call agent ip A.B.C.D",
587 CALL_AGENT_STR CALL_AGENT_STR IP_STR
588 "IPv4 Address of the callagent\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200589
Philipp Maier87bd9be2017-08-22 16:35:41 +0200590 DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
591 "trunk <1-64>", "Configure a SS7 trunk\n" "Trunk Nr\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200592{
593 struct mgcp_trunk_config *trunk;
594 int index = atoi(argv[0]);
595
596 trunk = mgcp_trunk_num(g_cfg, index);
597 if (!trunk)
598 trunk = mgcp_trunk_alloc(g_cfg, index);
599
600 if (!trunk) {
601 vty_out(vty, "%%Unable to allocate trunk %u.%s",
602 index, VTY_NEWLINE);
603 return CMD_WARNING;
604 }
605
606 vty->node = TRUNK_NODE;
607 vty->index = trunk;
608 return CMD_SUCCESS;
609}
610
611static int config_write_trunk(struct vty *vty)
612{
613 struct mgcp_trunk_config *trunk;
614
615 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
616 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
617 vty_out(vty, " sdp audio-payload number %d%s",
618 trunk->audio_payload, VTY_NEWLINE);
619 vty_out(vty, " sdp audio-payload name %s%s",
620 trunk->audio_name, VTY_NEWLINE);
621 vty_out(vty, " %ssdp audio-payload send-ptime%s",
622 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
623 vty_out(vty, " %ssdp audio-payload send-name%s",
624 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
625
626 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
627 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
628 else if (trunk->keepalive_interval)
629 vty_out(vty, " rtp keep-alive %d%s",
630 trunk->keepalive_interval, VTY_NEWLINE);
631 else
632 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200633 vty_out(vty, " loop %d%s", trunk->audio_loop, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200634 vty_out(vty, " force-realloc %d%s",
635 trunk->force_realloc, VTY_NEWLINE);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200636 vty_out(vty, " rtp-accept-all %d%s",
637 trunk->rtp_accept_all, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200638 if (trunk->omit_rtcp)
639 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
640 else
641 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
642 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
643 vty_out(vty, " %srtp-patch ssrc%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200644 trunk->force_constant_ssrc ? "" : "no ",
645 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200646 vty_out(vty, " %srtp-patch timestamp%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200647 trunk->force_aligned_timing ? "" : "no ",
648 VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200649 } else
650 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
651 if (trunk->audio_fmtp_extra)
652 vty_out(vty, " sdp audio fmtp-extra %s%s",
653 trunk->audio_fmtp_extra, VTY_NEWLINE);
654 vty_out(vty, " %sallow-transcoding%s",
655 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
656 }
657
658 return CMD_SUCCESS;
659}
660
661DEFUN(cfg_trunk_sdp_fmtp_extra,
662 cfg_trunk_sdp_fmtp_extra_cmd,
663 "sdp audio fmtp-extra .NAME",
664 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
665 "Extra Information\n")
666{
667 struct mgcp_trunk_config *trunk = vty->index;
668 char *txt = argv_concat(argv, argc, 0);
669 if (!txt)
670 return CMD_WARNING;
671
672 osmo_talloc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
673 talloc_free(txt);
674 return CMD_SUCCESS;
675}
676
677DEFUN(cfg_trunk_payload_number,
678 cfg_trunk_payload_number_cmd,
679 "sdp audio-payload number <0-255>",
680 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
681{
682 struct mgcp_trunk_config *trunk = vty->index;
683 unsigned int payload = atoi(argv[0]);
684
685 trunk->audio_payload = payload;
686 return CMD_SUCCESS;
687}
688
689ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200690 "sdp audio payload number <0-255>",
691 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200692
Philipp Maier87bd9be2017-08-22 16:35:41 +0200693 DEFUN(cfg_trunk_payload_name,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200694 cfg_trunk_payload_name_cmd,
695 "sdp audio-payload name NAME",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200696 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200697{
698 struct mgcp_trunk_config *trunk = vty->index;
699
700 osmo_talloc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
701 return CMD_SUCCESS;
702}
703
704ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200705 "sdp audio payload name NAME",
706 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200707
Philipp Maier87bd9be2017-08-22 16:35:41 +0200708 DEFUN(cfg_trunk_loop,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200709 cfg_trunk_loop_cmd,
710 "loop (0|1)",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200711 "Loop audio for all endpoints on this trunk\n" "Don't Loop\n" "Loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200712{
713 struct mgcp_trunk_config *trunk = vty->index;
714
715 if (g_cfg->osmux) {
716 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
717 return CMD_WARNING;
718 }
719 trunk->audio_loop = atoi(argv[0]);
720 return CMD_SUCCESS;
721}
722
723DEFUN(cfg_trunk_sdp_payload_send_ptime,
724 cfg_trunk_sdp_payload_send_ptime_cmd,
725 "sdp audio-payload send-ptime",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200726 SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200727{
728 struct mgcp_trunk_config *trunk = vty->index;
729 trunk->audio_send_ptime = 1;
730 return CMD_SUCCESS;
731}
732
733DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
734 cfg_trunk_no_sdp_payload_send_ptime_cmd,
735 "no sdp audio-payload send-ptime",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200736 NO_STR SDP_STR AUDIO_STR "Send SDP ptime (packet duration) attribute\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200737{
738 struct mgcp_trunk_config *trunk = vty->index;
739 trunk->audio_send_ptime = 0;
740 return CMD_SUCCESS;
741}
742
743DEFUN(cfg_trunk_sdp_payload_send_name,
744 cfg_trunk_sdp_payload_send_name_cmd,
745 "sdp audio-payload send-name",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200746 SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200747{
748 struct mgcp_trunk_config *trunk = vty->index;
749 trunk->audio_send_name = 1;
750 return CMD_SUCCESS;
751}
752
753DEFUN(cfg_trunk_no_sdp_payload_send_name,
754 cfg_trunk_no_sdp_payload_send_name_cmd,
755 "no sdp audio-payload send-name",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200756 NO_STR SDP_STR AUDIO_STR "Send SDP rtpmap with the audio name\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200757{
758 struct mgcp_trunk_config *trunk = vty->index;
759 trunk->audio_send_name = 0;
760 return CMD_SUCCESS;
761}
762
Philipp Maier87bd9be2017-08-22 16:35:41 +0200763DEFUN(cfg_trunk_omit_rtcp, cfg_trunk_omit_rtcp_cmd, "rtcp-omit", RTCP_OMIT_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200764{
765 struct mgcp_trunk_config *trunk = vty->index;
766 trunk->omit_rtcp = 1;
767 return CMD_SUCCESS;
768}
769
770DEFUN(cfg_trunk_no_omit_rtcp,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200771 cfg_trunk_no_omit_rtcp_cmd, "no rtcp-omit", NO_STR RTCP_OMIT_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200772{
773 struct mgcp_trunk_config *trunk = vty->index;
774 trunk->omit_rtcp = 0;
775 return CMD_SUCCESS;
776}
777
778DEFUN(cfg_trunk_patch_rtp_ssrc,
779 cfg_trunk_patch_rtp_ssrc_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200780 "rtp-patch ssrc", RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200781{
782 struct mgcp_trunk_config *trunk = vty->index;
783 trunk->force_constant_ssrc = 1;
784 return CMD_SUCCESS;
785}
786
787DEFUN(cfg_trunk_no_patch_rtp_ssrc,
788 cfg_trunk_no_patch_rtp_ssrc_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200789 "no rtp-patch ssrc", NO_STR RTP_PATCH_STR "Force a fixed SSRC\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200790{
791 struct mgcp_trunk_config *trunk = vty->index;
792 trunk->force_constant_ssrc = 0;
793 return CMD_SUCCESS;
794}
795
796DEFUN(cfg_trunk_patch_rtp_ts,
797 cfg_trunk_patch_rtp_ts_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200798 "rtp-patch timestamp", RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200799{
800 struct mgcp_trunk_config *trunk = vty->index;
801 trunk->force_aligned_timing = 1;
802 return CMD_SUCCESS;
803}
804
805DEFUN(cfg_trunk_no_patch_rtp_ts,
806 cfg_trunk_no_patch_rtp_ts_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200807 "no rtp-patch timestamp", NO_STR RTP_PATCH_STR "Adjust RTP timestamp\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200808{
809 struct mgcp_trunk_config *trunk = vty->index;
810 trunk->force_aligned_timing = 0;
811 return CMD_SUCCESS;
812}
813
814DEFUN(cfg_trunk_no_patch_rtp,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200815 cfg_trunk_no_patch_rtp_cmd, "no rtp-patch", NO_STR RTP_PATCH_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200816{
817 struct mgcp_trunk_config *trunk = vty->index;
818 trunk->force_constant_ssrc = 0;
819 trunk->force_aligned_timing = 0;
820 return CMD_SUCCESS;
821}
822
823DEFUN(cfg_trunk_rtp_keepalive,
824 cfg_trunk_rtp_keepalive_cmd,
825 "rtp keep-alive <1-120>",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200826 RTP_STR RTP_KEEPALIVE_STR "Keep-alive interval in secs\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200827{
828 struct mgcp_trunk_config *trunk = vty->index;
829 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
830 return CMD_SUCCESS;
831}
832
833DEFUN(cfg_trunk_rtp_keepalive_once,
834 cfg_trunk_rtp_keepalive_once_cmd,
835 "rtp keep-alive once",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200836 RTP_STR RTP_KEEPALIVE_STR "Send dummy packet only once after CRCX/MDCX\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200837{
838 struct mgcp_trunk_config *trunk = vty->index;
839 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
840 return CMD_SUCCESS;
841}
842
843DEFUN(cfg_trunk_no_rtp_keepalive,
844 cfg_trunk_no_rtp_keepalive_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200845 "no rtp keep-alive", NO_STR RTP_STR RTP_KEEPALIVE_STR)
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200846{
847 struct mgcp_trunk_config *trunk = vty->index;
848 mgcp_trunk_set_keepalive(trunk, 0);
849 return CMD_SUCCESS;
850}
851
852DEFUN(cfg_trunk_allow_transcoding,
853 cfg_trunk_allow_transcoding_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200854 "allow-transcoding", "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200855{
856 struct mgcp_trunk_config *trunk = vty->index;
857 trunk->no_audio_transcoding = 0;
858 return CMD_SUCCESS;
859}
860
861DEFUN(cfg_trunk_no_allow_transcoding,
862 cfg_trunk_no_allow_transcoding_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +0200863 "no allow-transcoding", NO_STR "Allow transcoding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200864{
865 struct mgcp_trunk_config *trunk = vty->index;
866 trunk->no_audio_transcoding = 1;
867 return CMD_SUCCESS;
868}
869
Philipp Maier87bd9be2017-08-22 16:35:41 +0200870DEFUN(loop_conn,
871 loop_conn_cmd,
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200872 "loop-endpoint <0-64> NAME (0|1)",
873 "Loop a given endpoint\n" "Trunk number\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +0200874 "The name in hex of the endpoint\n" "Disable the loop\n"
875 "Enable the loop\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200876{
877 struct mgcp_trunk_config *trunk;
878 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +0200879 struct mgcp_conn *conn;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200880
881 trunk = find_trunk(g_cfg, atoi(argv[0]));
882 if (!trunk) {
883 vty_out(vty, "%%Trunk %d not found in the config.%s",
884 atoi(argv[0]), VTY_NEWLINE);
885 return CMD_WARNING;
886 }
887
888 if (!trunk->endpoints) {
889 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
890 trunk->trunk_nr, VTY_NEWLINE);
891 return CMD_WARNING;
892 }
893
894 int endp_no = strtoul(argv[1], NULL, 16);
895 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
896 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200897 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200898 return CMD_WARNING;
899 }
900
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200901 endp = &trunk->endpoints[endp_no];
902 int loop = atoi(argv[2]);
Philipp Maier87bd9be2017-08-22 16:35:41 +0200903 llist_for_each_entry(conn, &endp->conns, entry) {
904 if (conn->type == MGCP_CONN_TYPE_RTP)
905 /* Handle it like a MDCX, switch on SSRC patching if enabled */
906 mgcp_rtp_end_config(endp, 1, &conn->u.rtp.end);
907 else {
908 /* FIXME: Introduce support for other connection (E1)
909 * types when implementation is available */
910 vty_out(vty, "%%Can't enable SSRC patching,"
911 "connection %s is not an RTP connection.%s",
912 mgcp_conn_dump(conn), VTY_NEWLINE);
913 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200914
Philipp Maier87bd9be2017-08-22 16:35:41 +0200915 if (loop)
916 conn->mode = MGCP_CONN_LOOPBACK;
917 else
918 conn->mode = conn->mode_orig;
919 }
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200920
921 return CMD_SUCCESS;
922}
923
Philipp Maier87bd9be2017-08-22 16:35:41 +0200924DEFUN(tap_rtp,
925 tap_rtp_cmd,
926 "tap-rtp <0-64> ENDPOINT CONN (in|out) A.B.C.D <0-65534>",
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200927 "Forward data on endpoint to a different system\n" "Trunk number\n"
928 "The endpoint in hex\n"
Philipp Maier87bd9be2017-08-22 16:35:41 +0200929 "The connection id in hex\n"
930 "Forward incoming data\n"
931 "Forward leaving data\n"
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200932 "destination IP of the data\n" "destination port\n")
933{
934 struct mgcp_rtp_tap *tap;
935 struct mgcp_trunk_config *trunk;
936 struct mgcp_endpoint *endp;
Philipp Maier87bd9be2017-08-22 16:35:41 +0200937 struct mgcp_conn_rtp *conn;
938 uint32_t conn_id;
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200939
940 trunk = find_trunk(g_cfg, atoi(argv[0]));
941 if (!trunk) {
942 vty_out(vty, "%%Trunk %d not found in the config.%s",
943 atoi(argv[0]), VTY_NEWLINE);
944 return CMD_WARNING;
945 }
946
947 if (!trunk->endpoints) {
948 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
949 trunk->trunk_nr, VTY_NEWLINE);
950 return CMD_WARNING;
951 }
952
953 int endp_no = strtoul(argv[1], NULL, 16);
954 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
955 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200956 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200957 return CMD_WARNING;
958 }
959
960 endp = &trunk->endpoints[endp_no];
961
Philipp Maier87bd9be2017-08-22 16:35:41 +0200962 conn_id = strtoul(argv[2], NULL, 10);
963 conn = mgcp_conn_get_rtp(endp, conn_id);
964 if (!conn) {
965 vty_out(vty, "Conn ID %s/%d is invalid.%s",
966 argv[2], conn_id, VTY_NEWLINE);
967 return CMD_WARNING;
968 }
969
970 if (strcmp(argv[3], "in") == 0)
971 tap = &conn->tap_in;
972 else if (strcmp(argv[3], "out") == 0)
973 tap = &conn->tap_out;
974 else {
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200975 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
976 return CMD_WARNING;
977 }
978
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200979 memset(&tap->forward, 0, sizeof(tap->forward));
Philipp Maier87bd9be2017-08-22 16:35:41 +0200980 inet_aton(argv[4], &tap->forward.sin_addr);
981 tap->forward.sin_port = htons(atoi(argv[5]));
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200982 tap->enabled = 1;
983 return CMD_SUCCESS;
984}
985
986DEFUN(free_endp, free_endp_cmd,
987 "free-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +0200988 "Free the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +0200989{
990 struct mgcp_trunk_config *trunk;
991 struct mgcp_endpoint *endp;
992
993 trunk = find_trunk(g_cfg, atoi(argv[0]));
994 if (!trunk) {
995 vty_out(vty, "%%Trunk %d not found in the config.%s",
996 atoi(argv[0]), VTY_NEWLINE);
997 return CMD_WARNING;
998 }
999
1000 if (!trunk->endpoints) {
1001 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1002 trunk->trunk_nr, VTY_NEWLINE);
1003 return CMD_WARNING;
1004 }
1005
1006 int endp_no = strtoul(argv[1], NULL, 16);
1007 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1008 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001009 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001010 return CMD_WARNING;
1011 }
1012
1013 endp = &trunk->endpoints[endp_no];
1014 mgcp_release_endp(endp);
1015 return CMD_SUCCESS;
1016}
1017
1018DEFUN(reset_endp, reset_endp_cmd,
1019 "reset-endpoint <0-64> NUMBER",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001020 "Reset the given endpoint\n" "Trunk number\n" "Endpoint number in hex.\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001021{
1022 struct mgcp_trunk_config *trunk;
1023 struct mgcp_endpoint *endp;
1024 int endp_no, rc;
1025
1026 trunk = find_trunk(g_cfg, atoi(argv[0]));
1027 if (!trunk) {
1028 vty_out(vty, "%%Trunk %d not found in the config.%s",
1029 atoi(argv[0]), VTY_NEWLINE);
1030 return CMD_WARNING;
1031 }
1032
1033 if (!trunk->endpoints) {
1034 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1035 trunk->trunk_nr, VTY_NEWLINE);
1036 return CMD_WARNING;
1037 }
1038
1039 endp_no = strtoul(argv[1], NULL, 16);
1040 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1041 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001042 argv[1], endp_no, VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001043 return CMD_WARNING;
1044 }
1045
1046 endp = &trunk->endpoints[endp_no];
1047 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1048 if (rc < 0) {
1049 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1050 return CMD_WARNING;
1051 }
1052 return CMD_SUCCESS;
1053}
1054
1055DEFUN(reset_all_endp, reset_all_endp_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001056 "reset-all-endpoints", "Reset all endpoints\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001057{
1058 int rc;
1059
1060 rc = mgcp_send_reset_all(g_cfg);
1061 if (rc < 0) {
1062 vty_out(vty, "Error %d during endpoint reset.%s",
1063 rc, VTY_NEWLINE);
1064 return CMD_WARNING;
1065 }
1066 return CMD_SUCCESS;
1067}
1068
1069#define OSMUX_STR "RTP multiplexing\n"
1070DEFUN(cfg_mgcp_osmux,
1071 cfg_mgcp_osmux_cmd,
1072 "osmux (on|off|only)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001073 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001074{
1075 if (strcmp(argv[0], "off") == 0) {
1076 g_cfg->osmux = OSMUX_USAGE_OFF;
1077 return CMD_SUCCESS;
1078 }
1079
Philipp Maier87bd9be2017-08-22 16:35:41 +02001080 /* Since OSMUX support is not finished, we do not
1081 * allow to turn it on yet. */
1082 vty_out(vty, "OSMUX currently unavailable in this software version.%s", VTY_NEWLINE);
1083 return CMD_WARNING;
1084
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001085 if (strcmp(argv[0], "on") == 0)
1086 g_cfg->osmux = OSMUX_USAGE_ON;
1087 else if (strcmp(argv[0], "only") == 0)
1088 g_cfg->osmux = OSMUX_USAGE_ONLY;
1089
1090 if (g_cfg->trunk.audio_loop) {
Philipp Maier87bd9be2017-08-22 16:35:41 +02001091 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001092 return CMD_WARNING;
1093 }
1094
1095 return CMD_SUCCESS;
1096}
1097
1098DEFUN(cfg_mgcp_osmux_ip,
1099 cfg_mgcp_osmux_ip_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001100 "osmux bind-ip A.B.C.D", OSMUX_STR IP_STR "IPv4 Address to bind to\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001101{
1102 osmo_talloc_replace_string(g_cfg, &g_cfg->osmux_addr, argv[0]);
1103 return CMD_SUCCESS;
1104}
1105
1106DEFUN(cfg_mgcp_osmux_batch_factor,
1107 cfg_mgcp_osmux_batch_factor_cmd,
1108 "osmux batch-factor <1-8>",
1109 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1110{
1111 g_cfg->osmux_batch = atoi(argv[0]);
1112 return CMD_SUCCESS;
1113}
1114
1115DEFUN(cfg_mgcp_osmux_batch_size,
1116 cfg_mgcp_osmux_batch_size_cmd,
1117 "osmux batch-size <1-65535>",
1118 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1119{
1120 g_cfg->osmux_batch_size = atoi(argv[0]);
1121 return CMD_SUCCESS;
1122}
1123
1124DEFUN(cfg_mgcp_osmux_port,
1125 cfg_mgcp_osmux_port_cmd,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001126 "osmux port <1-65535>", OSMUX_STR "port\n" "UDP port\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001127{
1128 g_cfg->osmux_port = atoi(argv[0]);
1129 return CMD_SUCCESS;
1130}
1131
1132DEFUN(cfg_mgcp_osmux_dummy,
1133 cfg_mgcp_osmux_dummy_cmd,
1134 "osmux dummy (on|off)",
Philipp Maier87bd9be2017-08-22 16:35:41 +02001135 OSMUX_STR "Dummy padding\n" "Enable dummy padding\n"
1136 "Disable dummy padding\n")
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001137{
1138 if (strcmp(argv[0], "on") == 0)
1139 g_cfg->osmux_dummy = 1;
1140 else if (strcmp(argv[0], "off") == 0)
1141 g_cfg->osmux_dummy = 0;
1142
1143 return CMD_SUCCESS;
1144}
1145
1146int mgcp_vty_init(void)
1147{
1148 install_element_ve(&show_mgcp_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001149 install_element(ENABLE_NODE, &loop_conn_cmd);
1150 install_element(ENABLE_NODE, &tap_rtp_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001151 install_element(ENABLE_NODE, &free_endp_cmd);
1152 install_element(ENABLE_NODE, &reset_endp_cmd);
1153 install_element(ENABLE_NODE, &reset_all_endp_cmd);
1154
1155 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1156 install_node(&mgcp_node, config_write_mgcp);
1157
1158 vty_install_default(MGCP_NODE);
1159 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001160 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1161 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1162 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001163 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
1164 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
1165 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001166 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
1167 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
1168 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1169 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
1170 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1171 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1172 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
1173 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
1174 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001175 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1176 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
1177 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1178 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
1179 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1180 install_element(MGCP_NODE, &cfg_mgcp_force_realloc_cmd);
Philipp Maier87bd9be2017-08-22 16:35:41 +02001181 install_element(MGCP_NODE, &cfg_mgcp_rtp_accept_all_cmd);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001182 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
1183 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1184 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
1185 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1186 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1187 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1188 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1189 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
1190 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
1191 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1192 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
1193 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1194 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
1195 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1196 install_element(MGCP_NODE, &cfg_mgcp_osmux_ip_cmd);
1197 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
1198 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
1199 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
1200 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
1201 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1202 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
1203
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001204 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1205 install_node(&trunk_node, config_write_trunk);
1206 vty_install_default(TRUNK_NODE);
1207 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1208 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1209 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
1210 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1211 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
1212 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1213 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
1214 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
1215 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1216 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
1217 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1218 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1219 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1220 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1221 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
1222 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
1223 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1224 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
1225 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1226 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
1227 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1228 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
1229
1230 return 0;
1231}
1232
1233static int allocate_trunk(struct mgcp_trunk_config *trunk)
1234{
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001235 if (mgcp_endpoints_allocate(trunk) != 0) {
1236 LOGP(DLMGCP, LOGL_ERROR,
1237 "Failed to allocate %d endpoints on trunk %d.\n",
1238 trunk->number_endpoints, trunk->trunk_nr);
1239 return -1;
1240 }
1241
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001242 return 0;
1243}
1244
1245int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1246 enum mgcp_role role)
1247{
1248 int rc;
1249 struct mgcp_trunk_config *trunk;
1250
1251 cfg->osmux_port = OSMUX_PORT;
1252 cfg->osmux_batch = 4;
1253 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
1254
1255 g_cfg = cfg;
1256 rc = vty_read_config_file(config_file, NULL);
1257 if (rc < 0) {
Philipp Maier87bd9be2017-08-22 16:35:41 +02001258 fprintf(stderr, "Failed to parse the config file: '%s'\n",
1259 config_file);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001260 return rc;
1261 }
1262
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001263 if (!g_cfg->source_addr) {
1264 fprintf(stderr, "You need to specify a bind address.\n");
1265 return -1;
1266 }
1267
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001268 if (allocate_trunk(&g_cfg->trunk) != 0) {
Philipp Maier87bd9be2017-08-22 16:35:41 +02001269 LOGP(DLMGCP, LOGL_ERROR,
1270 "Failed to initialize the virtual trunk.\n");
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001271 return -1;
1272 }
1273
1274 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1275 if (allocate_trunk(trunk) != 0) {
1276 LOGP(DLMGCP, LOGL_ERROR,
Philipp Maier87bd9be2017-08-22 16:35:41 +02001277 "Failed to initialize E1 trunk %d.\n",
1278 trunk->trunk_nr);
Neels Hofmeyrf83ec562017-09-07 19:18:40 +02001279 return -1;
1280 }
1281 }
1282 cfg->role = role;
1283
1284 return 0;
1285}