blob: 2b76436473809ae0e9f49274ec3a088657e9a0f2 [file] [log] [blame]
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
2/* The protocol implementation */
3
4/*
Holger Hans Peter Freytherb30b3aa2014-07-04 20:23:56 +02005 * (C) 2009-2014 by Holger Hans Peter Freyther <zecke@selfish.org>
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +01006 * (C) 2009-2011 by On-Waves
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01007 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
Harald Welte0e3e88e2011-01-01 15:25:50 +010010 * 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
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010012 * (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
Harald Welte0e3e88e2011-01-01 15:25:50 +010017 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010018 *
Harald Welte0e3e88e2011-01-01 15:25:50 +010019 * 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/>.
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010021 *
22 */
23
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010024
Pablo Neira Ayusodd5fff42011-03-22 16:47:59 +010025#include <osmocom/core/talloc.h>
Holger Hans Peter Freytherf41fb1f2010-02-26 20:16:37 +010026
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010027#include <openbsc/mgcp.h>
28#include <openbsc/mgcp_internal.h>
Harald Welte58ed1cb2010-05-14 18:59:17 +020029#include <openbsc/vty.h>
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010030
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020031#include <string.h>
32
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +020033#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
Jacob Erlbecke5546cd2013-12-03 14:43:34 +010034#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
Jacob Erlbecke64bb122013-12-19 18:53:07 +010035#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +020036
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010037static struct mgcp_config *g_cfg = NULL;
38
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010039static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010040{
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010041 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010042
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +010043 if (nr == 0)
44 trunk = &cfg->trunk;
45 else
46 trunk = mgcp_trunk_num(cfg, nr);
47
48 return trunk;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +010049}
50
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010051/*
52 * vty code for mgcp below
53 */
54struct cmd_node mgcp_node = {
55 MGCP_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020056 "%s(config-mgcp)# ",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010057 1,
58};
59
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010060struct cmd_node trunk_node = {
61 TRUNK_NODE,
Harald Welte45362bb2012-08-17 13:16:10 +020062 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +010063 1,
64};
65
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010066static int config_write_mgcp(struct vty *vty)
67{
68 vty_out(vty, "mgcp%s", VTY_NEWLINE);
69 if (g_cfg->local_ip)
Holger Hans Peter Freythere8d13712010-04-16 16:59:48 +020070 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
71 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +010072 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
73 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
74 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080075
76 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
77 vty_out(vty, " rtp bts-base %u%s", g_cfg->bts_ports.base_port, VTY_NEWLINE);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +080078 else
79 vty_out(vty, " rtp bts-range %u %u%s",
80 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freythere5899382015-08-20 15:15:50 +020081 if (g_cfg->bts_ports.bind_addr)
82 vty_out(vty, " rtp bts-bind-ip %s%s", g_cfg->bts_ports.bind_addr, VTY_NEWLINE);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +080083
Holger Hans Peter Freyther2ea91182010-08-05 07:10:56 +080084 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
85 vty_out(vty, " rtp net-base %u%s", g_cfg->net_ports.base_port, VTY_NEWLINE);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +080086 else
87 vty_out(vty, " rtp net-range %u %u%s",
88 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freythere5899382015-08-20 15:15:50 +020089 if (g_cfg->net_ports.bind_addr)
90 vty_out(vty, " rtp net-bind-ip %s%s", g_cfg->net_ports.bind_addr, VTY_NEWLINE);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +080091
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +080092 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +010093 if (g_cfg->trunk.keepalive_interval == MGCP_KEEPALIVE_ONCE)
94 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
95 else if (g_cfg->trunk.keepalive_interval)
96 vty_out(vty, " rtp keep-alive %d%s",
97 g_cfg->trunk.keepalive_interval, VTY_NEWLINE);
98 else
99 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
100
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200101 if (g_cfg->trunk.omit_rtcp)
102 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
103 else
104 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100105 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_aligned_timing) {
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100106 vty_out(vty, " %srtp-patch ssrc%s",
107 g_cfg->trunk.force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
108 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100109 g_cfg->trunk.force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100110 } else
111 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100112 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100113 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100114 g_cfg->trunk.audio_payload, VTY_NEWLINE);
115 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100116 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100117 g_cfg->trunk.audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200118 if (g_cfg->trunk.audio_fmtp_extra)
119 vty_out(vty, " sdp audio fmtp-extra %s%s",
120 g_cfg->trunk.audio_fmtp_extra, VTY_NEWLINE);
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100121 vty_out(vty, " %ssdp audio-payload send-ptime%s",
122 g_cfg->trunk.audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100123 vty_out(vty, " %ssdp audio-payload send-name%s",
124 g_cfg->trunk.audio_send_name ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100125 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
126 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -0400127 vty_out(vty, " %sallow-transcoding%s",
128 g_cfg->trunk.no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200129 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100130 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800131 if (g_cfg->transcoder_ip)
132 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100133
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800134 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
135 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
136 else
137 vty_out(vty, " rtp transcoder-range %u %u%s",
138 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb30b3aa2014-07-04 20:23:56 +0200139 if (g_cfg->bts_force_ptime > 0)
140 vty_out(vty, " rtp force-ptime %d%s", g_cfg->bts_force_ptime, VTY_NEWLINE);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800141 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100142 vty_out(vty, " osmux %s%s",
143 g_cfg->osmux == 1 ? "on" : "off", VTY_NEWLINE);
Pablo Neira Ayusob84aea32014-08-29 15:24:00 +0200144 if (g_cfg->osmux) {
145 vty_out(vty, " osmux batch-factor %d%s",
146 g_cfg->osmux_batch, VTY_NEWLINE);
147 vty_out(vty, " osmux batch-size %u%s",
148 g_cfg->osmux_batch_size, VTY_NEWLINE);
149 vty_out(vty, " osmux port %u%s",
150 g_cfg->osmux_port, VTY_NEWLINE);
Pablo Neira Ayuso644fdc22015-07-17 21:56:23 +0200151 vty_out(vty, " osmux dummy %s%s",
152 g_cfg->osmux_dummy ? "on" : "off", VTY_NEWLINE);
Pablo Neira Ayusob84aea32014-08-29 15:24:00 +0200153 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100154 return CMD_SUCCESS;
155}
156
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200157static void dump_rtp_end(const char *end_name, struct vty *vty,
158 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
159{
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200160 struct mgcp_rtp_codec *codec = &end->codec;
161
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200162 vty_out(vty,
163 " %s%s"
164 " Timestamp Errs: %d->%d%s"
165 " Dropped Packets: %d%s"
166 " Payload Type: %d Rate: %u Channels: %d %s"
167 " Frame Duration: %u Frame Denominator: %u%s"
168 " FPP: %d Packet Duration: %u%s"
169 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
170 " Output-Enabled: %d Force-PTIME: %d%s",
171 end_name, VTY_NEWLINE,
172 state->in_stream.err_ts_counter,
173 state->out_stream.err_ts_counter, VTY_NEWLINE,
174 end->dropped_packets, VTY_NEWLINE,
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200175 codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
176 codec->frame_duration_num, codec->frame_duration_den, VTY_NEWLINE,
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200177 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
Holger Hans Peter Freyther40461262014-09-01 10:35:55 +0200178 end->fmtp_extra, codec->audio_name, codec->subtype_name, VTY_NEWLINE,
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200179 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
180}
181
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100182static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100183{
184 int i;
185
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100186 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
187 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
188 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
189
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100190 if (!cfg->endpoints) {
191 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
192 return;
193 }
194
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100195 for (i = 1; i < cfg->number_endpoints; ++i) {
196 struct mgcp_endpoint *endp = &cfg->endpoints[i];
197 vty_out(vty,
198 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200199 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100200 i, endp->ci,
Holger Hans Peter Freytherfab76aa2010-08-05 01:34:51 +0800201 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
202 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
203 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther90dd3fe2012-09-12 11:30:41 +0200204 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherc983f832010-11-01 21:04:54 +0100205 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freyther6de5b112010-04-07 09:37:17 +0200206 VTY_NEWLINE);
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100207
Holger Hans Peter Freytherd7ab8052014-07-02 19:36:12 +0200208 if (verbose && endp->allocated) {
209 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
210 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck8c1f4b02013-12-19 12:13:32 +0100211 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100212 }
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100213}
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100214
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100215DEFUN(show_mcgp, show_mgcp_cmd,
216 "show mgcp [stats]",
217 SHOW_STR
218 "Display information about the MGCP Media Gateway\n"
219 "Include Statistics\n")
Holger Hans Peter Freyther1584bdb2011-02-28 01:12:33 +0100220{
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100221 struct mgcp_trunk_config *trunk;
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100222 int show_stats = argc >= 1;
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100223
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100224 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100225
226 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbecka2528da2013-11-25 12:53:28 +0100227 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freyther088bc282011-02-28 12:27:47 +0100228
Holger Hans Peter Freyther17cdccd2015-10-02 16:25:21 +0200229 if (g_cfg->osmux)
230 vty_out(vty, "Osmux used CID: %d%s", osmux_used_cid(), VTY_NEWLINE);
231
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100232 return CMD_SUCCESS;
233}
234
235DEFUN(cfg_mgcp,
236 cfg_mgcp_cmd,
237 "mgcp",
238 "Configure the MGCP")
239{
240 vty->node = MGCP_NODE;
241 return CMD_SUCCESS;
242}
243
244DEFUN(cfg_mgcp_local_ip,
245 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800246 "local ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100247 "Local options for the SDP record\n"
248 IP_STR
249 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100250{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200251 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100252 return CMD_SUCCESS;
253}
254
255DEFUN(cfg_mgcp_bts_ip,
256 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800257 "bts ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100258 "BTS Audio source/destination options\n"
259 IP_STR
260 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100261{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200262 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100263 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
264 return CMD_SUCCESS;
265}
266
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100267#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100268DEFUN(cfg_mgcp_bind_ip,
269 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800270 "bind ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100271 BIND_STR
272 IP_STR
273 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100274{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200275 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100276 return CMD_SUCCESS;
277}
278
279DEFUN(cfg_mgcp_bind_port,
280 cfg_mgcp_bind_port_cmd,
281 "bind port <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100282 BIND_STR
283 "Port information\n"
284 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100285{
286 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100287 g_cfg->source_port = port;
288 return CMD_SUCCESS;
289}
290
291DEFUN(cfg_mgcp_bind_early,
292 cfg_mgcp_bind_early_cmd,
293 "bind early (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100294 BIND_STR
295 "Bind local ports on start up\n"
296 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100297{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800298 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
299 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100300}
301
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800302static void parse_base(struct mgcp_port_range *range, const char **argv)
303{
304 unsigned int port = atoi(argv[0]);
305 range->mode = PORT_ALLOC_STATIC;
306 range->base_port = port;
307}
308
309static void parse_range(struct mgcp_port_range *range, const char **argv)
310{
311 range->mode = PORT_ALLOC_DYNAMIC;
312 range->range_start = atoi(argv[0]);
313 range->range_end = atoi(argv[1]);
314 range->last_port = g_cfg->bts_ports.range_start;
315}
316
317
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100318#define RTP_STR "RTP configuration\n"
319#define BTS_START_STR "First UDP port allocated for the BTS side\n"
320#define NET_START_STR "First UDP port allocated for the NET side\n"
321#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800322DEFUN(cfg_mgcp_rtp_bts_base_port,
323 cfg_mgcp_rtp_bts_base_port_cmd,
324 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100325 RTP_STR
326 BTS_START_STR
327 UDP_PORT_STR)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100328{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800329 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100330 return CMD_SUCCESS;
331}
332
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100333#define RANGE_START_STR "Start of the range of ports\n"
334#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800335DEFUN(cfg_mgcp_rtp_bts_range,
336 cfg_mgcp_rtp_bts_range_cmd,
337 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100338 RTP_STR "Range of ports to use for the BTS side\n"
339 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800340{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800341 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800342 return CMD_SUCCESS;
343}
344
345DEFUN(cfg_mgcp_rtp_net_range,
346 cfg_mgcp_rtp_net_range_cmd,
347 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100348 RTP_STR "Range of ports to use for the NET side\n"
349 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800350{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800351 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800352 return CMD_SUCCESS;
353}
354
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800355DEFUN(cfg_mgcp_rtp_net_base_port,
356 cfg_mgcp_rtp_net_base_port_cmd,
357 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100358 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800359{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800360 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800361 return CMD_SUCCESS;
362}
363
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800364ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100365 "rtp base <0-65534>",
366 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800367
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800368DEFUN(cfg_mgcp_rtp_transcoder_range,
369 cfg_mgcp_rtp_transcoder_range_cmd,
370 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100371 RTP_STR "Range of ports to use for the Transcoder\n"
372 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800373{
374 parse_range(&g_cfg->transcoder_ports, argv);
375 return CMD_SUCCESS;
376}
377
378DEFUN(cfg_mgcp_rtp_transcoder_base,
379 cfg_mgcp_rtp_transcoder_base_cmd,
380 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100381 RTP_STR "First UDP port allocated for the Transcoder side\n"
382 UDP_PORT_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800383{
384 parse_base(&g_cfg->transcoder_ports, argv);
385 return CMD_SUCCESS;
386}
387
Holger Hans Peter Freythere5899382015-08-20 15:15:50 +0200388DEFUN(cfg_mgcp_rtp_bts_bind_ip,
389 cfg_mgcp_rtp_bts_bind_ip_cmd,
390 "rtp bts-bind-ip A.B.C.D",
391 RTP_STR "Bind endpoints facing the BTS\n" "Address to bind to\n")
392{
393 bsc_replace_string(g_cfg, &g_cfg->bts_ports.bind_addr, argv[0]);
394 return CMD_SUCCESS;
395}
396
397DEFUN(cfg_mgcp_rtp_no_bts_bind_ip,
398 cfg_mgcp_rtp_no_bts_bind_ip_cmd,
399 "no rtp bts-bind-ip",
400 NO_STR RTP_STR "Bind endpoints facing the BTS\n" "Address to bind to\n")
401{
402 talloc_free(g_cfg->bts_ports.bind_addr);
403 g_cfg->bts_ports.bind_addr = NULL;
404 return CMD_SUCCESS;
405}
406
407DEFUN(cfg_mgcp_rtp_net_bind_ip,
408 cfg_mgcp_rtp_net_bind_ip_cmd,
409 "rtp net-bind-ip A.B.C.D",
410 RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
411{
412 bsc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr, argv[0]);
413 return CMD_SUCCESS;
414}
415
416DEFUN(cfg_mgcp_rtp_no_net_bind_ip,
417 cfg_mgcp_rtp_no_net_bind_ip_cmd,
418 "no rtp net-bind-ip",
419 NO_STR RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
420{
421 talloc_free(g_cfg->net_ports.bind_addr);
422 g_cfg->net_ports.bind_addr = NULL;
423 return CMD_SUCCESS;
424}
425
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800426DEFUN(cfg_mgcp_rtp_ip_dscp,
427 cfg_mgcp_rtp_ip_dscp_cmd,
428 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100429 RTP_STR
Holger Hans Peter Freytherc0c9ff02015-01-21 11:39:47 +0100430 "Apply IP_TOS to the audio stream (including Osmux)\n" "The DSCP value\n")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800431{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800432 int dscp = atoi(argv[0]);
433 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800434 return CMD_SUCCESS;
435}
436
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800437ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
438 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100439 RTP_STR
440 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800441
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200442#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
443DEFUN(cfg_mgcp_rtp_force_ptime,
444 cfg_mgcp_rtp_force_ptime_cmd,
445 "rtp force-ptime (10|20|40)",
446 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther7a4464e2014-07-04 20:11:11 +0200447 "The required ptime (packet duration) in ms\n"
448 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200449{
450 g_cfg->bts_force_ptime = atoi(argv[0]);
451 return CMD_SUCCESS;
452}
453
454DEFUN(cfg_mgcp_no_rtp_force_ptime,
455 cfg_mgcp_no_rtp_force_ptime_cmd,
456 "no rtp force-ptime",
457 NO_STR RTP_STR FORCE_PTIME_STR)
458{
459 g_cfg->bts_force_ptime = 0;
460 return CMD_SUCCESS;
461}
462
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200463DEFUN(cfg_mgcp_sdp_fmtp_extra,
464 cfg_mgcp_sdp_fmtp_extra_cmd,
465 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100466 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
467 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200468{
469 char *txt = argv_concat(argv, argc, 0);
470 if (!txt)
471 return CMD_WARNING;
472
473 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
474 talloc_free(txt);
475 return CMD_SUCCESS;
476}
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800477
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -0400478DEFUN(cfg_mgcp_allow_transcoding,
479 cfg_mgcp_allow_transcoding_cmd,
480 "allow-transcoding",
481 "Allow transcoding\n")
482{
483 g_cfg->trunk.no_audio_transcoding = 0;
484 return CMD_SUCCESS;
485}
486
487DEFUN(cfg_mgcp_no_allow_transcoding,
488 cfg_mgcp_no_allow_transcoding_cmd,
489 "no allow-transcoding",
490 NO_STR "Allow transcoding\n")
491{
492 g_cfg->trunk.no_audio_transcoding = 1;
493 return CMD_SUCCESS;
494}
495
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100496#define SDP_STR "SDP File related options\n"
497#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100498DEFUN(cfg_mgcp_sdp_payload_number,
499 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100500 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100501 SDP_STR AUDIO_STR
502 "Number\n" "Payload number\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100503{
504 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100505 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100506 return CMD_SUCCESS;
507}
508
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100509ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100510 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100511 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
512
513
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100514DEFUN(cfg_mgcp_sdp_payload_name,
515 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100516 "sdp audio-payload name NAME",
517 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100518{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100519 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100520 return CMD_SUCCESS;
521}
522
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100523ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
524 "sdp audio payload name NAME",
525 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
526
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100527DEFUN(cfg_mgcp_sdp_payload_send_ptime,
528 cfg_mgcp_sdp_payload_send_ptime_cmd,
529 "sdp audio-payload send-ptime",
530 SDP_STR AUDIO_STR
531 "Send SDP ptime (packet duration) attribute\n")
532{
533 g_cfg->trunk.audio_send_ptime = 1;
534 return CMD_SUCCESS;
535}
536
537DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
538 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
539 "no sdp audio-payload send-ptime",
540 NO_STR SDP_STR AUDIO_STR
541 "Send SDP ptime (packet duration) attribute\n")
542{
543 g_cfg->trunk.audio_send_ptime = 0;
544 return CMD_SUCCESS;
545}
546
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100547DEFUN(cfg_mgcp_sdp_payload_send_name,
548 cfg_mgcp_sdp_payload_send_name_cmd,
549 "sdp audio-payload send-name",
550 SDP_STR AUDIO_STR
551 "Send SDP rtpmap with the audio name\n")
552{
553 g_cfg->trunk.audio_send_name = 1;
554 return CMD_SUCCESS;
555}
556
557DEFUN(cfg_mgcp_no_sdp_payload_send_name,
558 cfg_mgcp_no_sdp_payload_send_name_cmd,
559 "no sdp audio-payload send-name",
560 NO_STR SDP_STR AUDIO_STR
561 "Send SDP rtpmap with the audio name\n")
562{
563 g_cfg->trunk.audio_send_name = 0;
564 return CMD_SUCCESS;
565}
566
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100567DEFUN(cfg_mgcp_loop,
568 cfg_mgcp_loop_cmd,
569 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100570 "Loop audio for all endpoints on main trunk\n"
571 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100572{
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100573 if (g_cfg->osmux) {
574 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
575 return CMD_WARNING;
576 }
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100577 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100578 return CMD_SUCCESS;
579}
580
581DEFUN(cfg_mgcp_number_endp,
582 cfg_mgcp_number_endp_cmd,
583 "number endpoints <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100584 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100585{
586 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100587 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100588 return CMD_SUCCESS;
589}
590
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200591DEFUN(cfg_mgcp_omit_rtcp,
592 cfg_mgcp_omit_rtcp_cmd,
593 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200594 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200595{
596 g_cfg->trunk.omit_rtcp = 1;
597 return CMD_SUCCESS;
598}
599
600DEFUN(cfg_mgcp_no_omit_rtcp,
601 cfg_mgcp_no_omit_rtcp_cmd,
602 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200603 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200604{
605 g_cfg->trunk.omit_rtcp = 0;
606 return CMD_SUCCESS;
607}
608
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100609DEFUN(cfg_mgcp_patch_rtp_ssrc,
610 cfg_mgcp_patch_rtp_ssrc_cmd,
611 "rtp-patch ssrc",
612 RTP_PATCH_STR
613 "Force a fixed SSRC\n"
614 )
615{
616 g_cfg->trunk.force_constant_ssrc = 1;
617 return CMD_SUCCESS;
618}
619
620DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
621 cfg_mgcp_no_patch_rtp_ssrc_cmd,
622 "no rtp-patch ssrc",
623 NO_STR RTP_PATCH_STR
624 "Force a fixed SSRC\n"
625 )
626{
627 g_cfg->trunk.force_constant_ssrc = 0;
628 return CMD_SUCCESS;
629}
630
631DEFUN(cfg_mgcp_patch_rtp_ts,
632 cfg_mgcp_patch_rtp_ts_cmd,
633 "rtp-patch timestamp",
634 RTP_PATCH_STR
635 "Adjust RTP timestamp\n"
636 )
637{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100638 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100639 return CMD_SUCCESS;
640}
641
642DEFUN(cfg_mgcp_no_patch_rtp_ts,
643 cfg_mgcp_no_patch_rtp_ts_cmd,
644 "no rtp-patch timestamp",
645 NO_STR RTP_PATCH_STR
646 "Adjust RTP timestamp\n"
647 )
648{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100649 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100650 return CMD_SUCCESS;
651}
652
653DEFUN(cfg_mgcp_no_patch_rtp,
654 cfg_mgcp_no_patch_rtp_cmd,
655 "no rtp-patch",
656 NO_STR RTP_PATCH_STR)
657{
658 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100659 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100660 return CMD_SUCCESS;
661}
662
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100663DEFUN(cfg_mgcp_rtp_keepalive,
664 cfg_mgcp_rtp_keepalive_cmd,
665 "rtp keep-alive <1-120>",
666 RTP_STR RTP_KEEPALIVE_STR
667 "Keep alive interval in secs\n"
668 )
669{
670 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
671 return CMD_SUCCESS;
672}
673
674DEFUN(cfg_mgcp_rtp_keepalive_once,
675 cfg_mgcp_rtp_keepalive_once_cmd,
676 "rtp keep-alive once",
677 RTP_STR RTP_KEEPALIVE_STR
678 "Send dummy packet only once after CRCX/MDCX\n"
679 )
680{
681 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
682 return CMD_SUCCESS;
683}
684
685DEFUN(cfg_mgcp_no_rtp_keepalive,
686 cfg_mgcp_no_rtp_keepalive_cmd,
687 "no rtp keep-alive",
688 NO_STR RTP_STR RTP_KEEPALIVE_STR
689 )
690{
691 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
692 return CMD_SUCCESS;
693}
694
695
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100696
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100697#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200698DEFUN(cfg_mgcp_agent_addr,
699 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100700 "call-agent ip A.B.C.D",
701 CALL_AGENT_STR IP_STR
702 "IPv4 Address of the callagent\n")
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200703{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200704 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200705 return CMD_SUCCESS;
706}
707
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100708ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
709 "call agent ip A.B.C.D",
710 CALL_AGENT_STR CALL_AGENT_STR IP_STR
711 "IPv4 Address of the callagent\n")
712
713
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800714DEFUN(cfg_mgcp_transcoder,
715 cfg_mgcp_transcoder_cmd,
716 "transcoder-mgw A.B.C.D",
717 "Use a MGW to detranscoder RTP\n"
718 "The IP address of the MGW")
719{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200720 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800721 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
722
723 return CMD_SUCCESS;
724}
725
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100726DEFUN(cfg_mgcp_no_transcoder,
727 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100728 "no transcoder-mgw",
729 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100730{
731 if (g_cfg->transcoder_ip) {
732 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
733 talloc_free(g_cfg->transcoder_ip);
734 g_cfg->transcoder_ip = NULL;
735 }
736
737 return CMD_SUCCESS;
738}
739
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800740DEFUN(cfg_mgcp_transcoder_remote_base,
741 cfg_mgcp_transcoder_remote_base_cmd,
742 "transcoder-remote-base <0-65534>",
743 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
744{
745 g_cfg->transcoder_remote_base = atoi(argv[0]);
746 return CMD_SUCCESS;
747}
748
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100749DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
750 "trunk <1-64>",
751 "Configure a SS7 trunk\n" "Trunk Nr\n")
752{
753 struct mgcp_trunk_config *trunk;
754 int index = atoi(argv[0]);
755
756 trunk = mgcp_trunk_num(g_cfg, index);
757 if (!trunk)
758 trunk = mgcp_trunk_alloc(g_cfg, index);
759
760 if (!trunk) {
761 vty_out(vty, "%%Unable to allocate trunk %u.%s",
762 index, VTY_NEWLINE);
763 return CMD_WARNING;
764 }
765
766 vty->node = TRUNK_NODE;
767 vty->index = trunk;
768 return CMD_SUCCESS;
769}
770
771static int config_write_trunk(struct vty *vty)
772{
773 struct mgcp_trunk_config *trunk;
774
775 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
776 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100777 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100778 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100779 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100780 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100781 vty_out(vty, " %ssdp audio-payload send-ptime%s",
782 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100783 vty_out(vty, " %ssdp audio-payload send-name%s",
784 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100785
786 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
787 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
788 else if (trunk->keepalive_interval)
789 vty_out(vty, " rtp keep-alive %d%s",
790 trunk->keepalive_interval, VTY_NEWLINE);
791 else
792 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
793
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100794 vty_out(vty, " loop %d%s",
795 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200796 if (trunk->omit_rtcp)
797 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
798 else
799 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100800 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100801 vty_out(vty, " %srtp-patch ssrc%s",
802 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
803 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100804 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100805 } else
806 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200807 if (trunk->audio_fmtp_extra)
808 vty_out(vty, " sdp audio fmtp-extra %s%s",
809 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -0400810 vty_out(vty, " %sallow-transcoding%s",
811 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100812 }
813
814 return CMD_SUCCESS;
815}
816
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200817DEFUN(cfg_trunk_sdp_fmtp_extra,
818 cfg_trunk_sdp_fmtp_extra_cmd,
819 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100820 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
821 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200822{
823 struct mgcp_trunk_config *trunk = vty->index;
824 char *txt = argv_concat(argv, argc, 0);
825 if (!txt)
826 return CMD_WARNING;
827
828 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
829 talloc_free(txt);
830 return CMD_SUCCESS;
831}
832
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100833DEFUN(cfg_trunk_payload_number,
834 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100835 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100836 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100837{
838 struct mgcp_trunk_config *trunk = vty->index;
839 unsigned int payload = atoi(argv[0]);
840
841 trunk->audio_payload = payload;
842 return CMD_SUCCESS;
843}
844
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100845ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100846 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100847 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
848
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100849DEFUN(cfg_trunk_payload_name,
850 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100851 "sdp audio-payload name NAME",
852 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100853{
854 struct mgcp_trunk_config *trunk = vty->index;
855
856 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
857 return CMD_SUCCESS;
858}
859
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100860ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
861 "sdp audio payload name NAME",
862 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
863
864
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100865DEFUN(cfg_trunk_loop,
866 cfg_trunk_loop_cmd,
867 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100868 "Loop audio for all endpoints on this trunk\n"
869 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100870{
871 struct mgcp_trunk_config *trunk = vty->index;
872
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100873 if (g_cfg->osmux) {
874 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
875 return CMD_WARNING;
876 }
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100877 trunk->audio_loop = atoi(argv[0]);
878 return CMD_SUCCESS;
879}
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800880
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100881DEFUN(cfg_trunk_sdp_payload_send_ptime,
882 cfg_trunk_sdp_payload_send_ptime_cmd,
883 "sdp audio-payload send-ptime",
884 SDP_STR AUDIO_STR
885 "Send SDP ptime (packet duration) attribute\n")
886{
887 struct mgcp_trunk_config *trunk = vty->index;
888 trunk->audio_send_ptime = 1;
889 return CMD_SUCCESS;
890}
891
892DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
893 cfg_trunk_no_sdp_payload_send_ptime_cmd,
894 "no sdp audio-payload send-ptime",
895 NO_STR SDP_STR AUDIO_STR
896 "Send SDP ptime (packet duration) attribute\n")
897{
898 struct mgcp_trunk_config *trunk = vty->index;
899 trunk->audio_send_ptime = 0;
900 return CMD_SUCCESS;
901}
902
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100903DEFUN(cfg_trunk_sdp_payload_send_name,
904 cfg_trunk_sdp_payload_send_name_cmd,
905 "sdp audio-payload send-name",
906 SDP_STR AUDIO_STR
907 "Send SDP rtpmap with the audio name\n")
908{
909 struct mgcp_trunk_config *trunk = vty->index;
910 trunk->audio_send_name = 1;
911 return CMD_SUCCESS;
912}
913
914DEFUN(cfg_trunk_no_sdp_payload_send_name,
915 cfg_trunk_no_sdp_payload_send_name_cmd,
916 "no sdp audio-payload send-name",
917 NO_STR SDP_STR AUDIO_STR
918 "Send SDP rtpmap with the audio name\n")
919{
920 struct mgcp_trunk_config *trunk = vty->index;
921 trunk->audio_send_name = 0;
922 return CMD_SUCCESS;
923}
924
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200925DEFUN(cfg_trunk_omit_rtcp,
926 cfg_trunk_omit_rtcp_cmd,
927 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200928 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200929{
930 struct mgcp_trunk_config *trunk = vty->index;
931 trunk->omit_rtcp = 1;
932 return CMD_SUCCESS;
933}
934
935DEFUN(cfg_trunk_no_omit_rtcp,
936 cfg_trunk_no_omit_rtcp_cmd,
937 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200938 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200939{
940 struct mgcp_trunk_config *trunk = vty->index;
941 trunk->omit_rtcp = 0;
942 return CMD_SUCCESS;
943}
944
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100945DEFUN(cfg_trunk_patch_rtp_ssrc,
946 cfg_trunk_patch_rtp_ssrc_cmd,
947 "rtp-patch ssrc",
948 RTP_PATCH_STR
949 "Force a fixed SSRC\n"
950 )
951{
952 struct mgcp_trunk_config *trunk = vty->index;
953 trunk->force_constant_ssrc = 1;
954 return CMD_SUCCESS;
955}
956
957DEFUN(cfg_trunk_no_patch_rtp_ssrc,
958 cfg_trunk_no_patch_rtp_ssrc_cmd,
959 "no rtp-patch ssrc",
960 NO_STR RTP_PATCH_STR
961 "Force a fixed SSRC\n"
962 )
963{
964 struct mgcp_trunk_config *trunk = vty->index;
965 trunk->force_constant_ssrc = 0;
966 return CMD_SUCCESS;
967}
968
969DEFUN(cfg_trunk_patch_rtp_ts,
970 cfg_trunk_patch_rtp_ts_cmd,
971 "rtp-patch timestamp",
972 RTP_PATCH_STR
973 "Adjust RTP timestamp\n"
974 )
975{
976 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100977 trunk->force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100978 return CMD_SUCCESS;
979}
980
981DEFUN(cfg_trunk_no_patch_rtp_ts,
982 cfg_trunk_no_patch_rtp_ts_cmd,
983 "no rtp-patch timestamp",
984 NO_STR RTP_PATCH_STR
985 "Adjust RTP timestamp\n"
986 )
987{
988 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100989 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100990 return CMD_SUCCESS;
991}
992
993DEFUN(cfg_trunk_no_patch_rtp,
994 cfg_trunk_no_patch_rtp_cmd,
995 "no rtp-patch",
996 NO_STR RTP_PATCH_STR)
997{
998 struct mgcp_trunk_config *trunk = vty->index;
999 trunk->force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +01001000 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001001 return CMD_SUCCESS;
1002}
1003
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001004DEFUN(cfg_trunk_rtp_keepalive,
1005 cfg_trunk_rtp_keepalive_cmd,
1006 "rtp keep-alive <1-120>",
1007 RTP_STR RTP_KEEPALIVE_STR
1008 "Keep-alive interval in secs\n"
1009 )
1010{
1011 struct mgcp_trunk_config *trunk = vty->index;
1012 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
1013 return CMD_SUCCESS;
1014}
1015
1016DEFUN(cfg_trunk_rtp_keepalive_once,
1017 cfg_trunk_rtp_keepalive_once_cmd,
1018 "rtp keep-alive once",
1019 RTP_STR RTP_KEEPALIVE_STR
1020 "Send dummy packet only once after CRCX/MDCX\n"
1021 )
1022{
1023 struct mgcp_trunk_config *trunk = vty->index;
1024 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
1025 return CMD_SUCCESS;
1026}
1027
1028DEFUN(cfg_trunk_no_rtp_keepalive,
1029 cfg_trunk_no_rtp_keepalive_cmd,
1030 "no rtp keep-alive",
1031 NO_STR RTP_STR RTP_KEEPALIVE_STR
1032 )
1033{
1034 struct mgcp_trunk_config *trunk = vty->index;
1035 mgcp_trunk_set_keepalive(trunk, 0);
1036 return CMD_SUCCESS;
1037}
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001038
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -04001039DEFUN(cfg_trunk_allow_transcoding,
1040 cfg_trunk_allow_transcoding_cmd,
1041 "allow-transcoding",
1042 "Allow transcoding\n")
1043{
1044 struct mgcp_trunk_config *trunk = vty->index;
1045 trunk->no_audio_transcoding = 0;
1046 return CMD_SUCCESS;
1047}
1048
1049DEFUN(cfg_trunk_no_allow_transcoding,
1050 cfg_trunk_no_allow_transcoding_cmd,
1051 "no allow-transcoding",
1052 NO_STR "Allow transcoding\n")
1053{
1054 struct mgcp_trunk_config *trunk = vty->index;
1055 trunk->no_audio_transcoding = 1;
1056 return CMD_SUCCESS;
1057}
1058
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001059DEFUN(loop_endp,
1060 loop_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001061 "loop-endpoint <0-64> NAME (0|1)",
1062 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +08001063 "The name in hex of the endpoint\n" "Disable the loop\n" "Enable the loop\n")
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001064{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001065 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001066 struct mgcp_endpoint *endp;
1067
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001068 trunk = find_trunk(g_cfg, atoi(argv[0]));
1069 if (!trunk) {
1070 vty_out(vty, "%%Trunk %d not found in the config.%s",
1071 atoi(argv[0]), VTY_NEWLINE);
1072 return CMD_WARNING;
1073 }
1074
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001075 if (!trunk->endpoints) {
1076 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1077 trunk->trunk_nr, VTY_NEWLINE);
1078 return CMD_WARNING;
1079 }
1080
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001081 int endp_no = strtoul(argv[1], NULL, 16);
1082 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001083 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001084 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001085 return CMD_WARNING;
1086 }
1087
1088
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001089 endp = &trunk->endpoints[endp_no];
1090 int loop = atoi(argv[2]);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001091
1092 if (loop)
1093 endp->conn_mode = MGCP_CONN_LOOPBACK;
1094 else
1095 endp->conn_mode = endp->orig_mode;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001096
1097 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1098 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
1099 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001100
1101 return CMD_SUCCESS;
1102}
1103
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001104DEFUN(tap_call,
1105 tap_call_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001106 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
1107 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001108 "The endpoint in hex\n"
1109 "Forward the data coming from the bts\n"
1110 "Forward the data coming from the bts leaving to the network\n"
1111 "Forward the data coming from the net\n"
1112 "Forward the data coming from the net leaving to the bts\n"
1113 "destination IP of the data\n" "destination port\n")
1114{
1115 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001116 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001117 struct mgcp_endpoint *endp;
1118 int port = 0;
1119
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001120 trunk = find_trunk(g_cfg, atoi(argv[0]));
1121 if (!trunk) {
1122 vty_out(vty, "%%Trunk %d not found in the config.%s",
1123 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001124 return CMD_WARNING;
1125 }
1126
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001127 if (!trunk->endpoints) {
1128 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1129 trunk->trunk_nr, VTY_NEWLINE);
1130 return CMD_WARNING;
1131 }
1132
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001133 int endp_no = strtoul(argv[1], NULL, 16);
1134 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1135 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1136 argv[1], endp_no, VTY_NEWLINE);
1137 return CMD_WARNING;
1138 }
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001139
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001140 endp = &trunk->endpoints[endp_no];
1141
1142 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001143 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001144 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001145 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001146 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001147 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001148 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001149 port = MGCP_TAP_NET_OUT;
1150 } else {
1151 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1152 return CMD_WARNING;
1153 }
1154
1155 tap = &endp->taps[port];
1156 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001157 inet_aton(argv[3], &tap->forward.sin_addr);
1158 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +08001159 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001160 return CMD_SUCCESS;
1161}
1162
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001163DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001164 "free-endpoint <0-64> NUMBER",
1165 "Free the given endpoint\n" "Trunk number\n"
1166 "Endpoint number in hex.\n")
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001167{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001168 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001169 struct mgcp_endpoint *endp;
1170
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001171 trunk = find_trunk(g_cfg, atoi(argv[0]));
1172 if (!trunk) {
1173 vty_out(vty, "%%Trunk %d not found in the config.%s",
1174 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001175 return CMD_WARNING;
1176 }
1177
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001178 if (!trunk->endpoints) {
1179 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1180 trunk->trunk_nr, VTY_NEWLINE);
1181 return CMD_WARNING;
1182 }
1183
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001184 int endp_no = strtoul(argv[1], NULL, 16);
1185 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1186 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1187 argv[1], endp_no, VTY_NEWLINE);
1188 return CMD_WARNING;
1189 }
1190
1191 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freytherbb8627a2014-07-22 15:00:52 +02001192 mgcp_release_endp(endp);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001193 return CMD_SUCCESS;
1194}
1195
Harald Welteba4f8b22012-01-27 00:41:39 +01001196DEFUN(reset_endp, reset_endp_cmd,
1197 "reset-endpoint <0-64> NUMBER",
1198 "Reset the given endpoint\n" "Trunk number\n"
1199 "Endpoint number in hex.\n")
1200{
1201 struct mgcp_trunk_config *trunk;
1202 struct mgcp_endpoint *endp;
1203 int endp_no, rc;
1204
1205 trunk = find_trunk(g_cfg, atoi(argv[0]));
1206 if (!trunk) {
1207 vty_out(vty, "%%Trunk %d not found in the config.%s",
1208 atoi(argv[0]), VTY_NEWLINE);
1209 return CMD_WARNING;
1210 }
1211
1212 if (!trunk->endpoints) {
1213 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1214 trunk->trunk_nr, VTY_NEWLINE);
1215 return CMD_WARNING;
1216 }
1217
1218 endp_no = strtoul(argv[1], NULL, 16);
1219 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1220 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1221 argv[1], endp_no, VTY_NEWLINE);
1222 return CMD_WARNING;
1223 }
1224
1225 endp = &trunk->endpoints[endp_no];
1226 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1227 if (rc < 0) {
1228 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1229 return CMD_WARNING;
1230 }
1231 return CMD_SUCCESS;
1232}
1233
1234DEFUN(reset_all_endp, reset_all_endp_cmd,
1235 "reset-all-endpoints",
1236 "Reset all endpoints\n")
1237{
1238 int rc;
1239
1240 rc = mgcp_send_reset_all(g_cfg);
1241 if (rc < 0) {
1242 vty_out(vty, "Error %d during endpoint reset.%s",
1243 rc, VTY_NEWLINE);
1244 return CMD_WARNING;
1245 }
1246 return CMD_SUCCESS;
1247}
1248
Holger Hans Peter Freytherea285e42014-06-03 13:36:42 +02001249#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001250DEFUN(cfg_mgcp_osmux,
1251 cfg_mgcp_osmux_cmd,
1252 "osmux (on|off)",
1253 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1254{
1255 if (strcmp(argv[0], "on") == 0) {
1256 g_cfg->osmux = 1;
1257 if (g_cfg->trunk.audio_loop) {
1258 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1259 VTY_NEWLINE);
1260 return CMD_WARNING;
1261 }
1262 } else if (strcmp(argv[0], "off") == 0)
1263 g_cfg->osmux = 0;
1264
1265 return CMD_SUCCESS;
1266}
1267
1268DEFUN(cfg_mgcp_osmux_batch_factor,
1269 cfg_mgcp_osmux_batch_factor_cmd,
Pablo Neira Ayuso9776fd02014-08-29 16:08:45 +02001270 "osmux batch-factor <1-8>",
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001271 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1272{
1273 g_cfg->osmux_batch = atoi(argv[0]);
1274 return CMD_SUCCESS;
1275}
Harald Welteba4f8b22012-01-27 00:41:39 +01001276
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001277DEFUN(cfg_mgcp_osmux_batch_size,
1278 cfg_mgcp_osmux_batch_size_cmd,
1279 "osmux batch-size <1-65535>",
1280 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1281{
1282 g_cfg->osmux_batch_size = atoi(argv[0]);
1283 return CMD_SUCCESS;
1284}
1285
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001286DEFUN(cfg_mgcp_osmux_port,
1287 cfg_mgcp_osmux_port_cmd,
1288 "osmux port <1-65535>",
1289 OSMUX_STR "port\n" "UDP port\n")
1290{
1291 g_cfg->osmux_port = atoi(argv[0]);
1292 return CMD_SUCCESS;
1293}
1294
Pablo Neira Ayuso644fdc22015-07-17 21:56:23 +02001295DEFUN(cfg_mgcp_osmux_dummy,
1296 cfg_mgcp_osmux_dummy_cmd,
1297 "osmux dummy (on|off)",
Pablo Neira Ayusoa35bda52015-09-07 11:22:04 +02001298 OSMUX_STR "Dummy padding\n" "Enable dummy padding\n" "Disable dummy padding\n")
Pablo Neira Ayuso644fdc22015-07-17 21:56:23 +02001299{
1300 if (strcmp(argv[0], "on") == 0)
1301 g_cfg->osmux_dummy = 1;
1302 else if (strcmp(argv[0], "off") == 0)
1303 g_cfg->osmux_dummy = 0;
1304
1305 return CMD_SUCCESS;
1306}
1307
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001308int mgcp_vty_init(void)
1309{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +08001310 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001311 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001312 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001313 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welteba4f8b22012-01-27 00:41:39 +01001314 install_element(ENABLE_NODE, &reset_endp_cmd);
1315 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001316
1317 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1318 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001319
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001320 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001321 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1322 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1323 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1324 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1325 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1326 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +08001327 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +08001328 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +08001329 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
Holger Hans Peter Freythere5899382015-08-20 15:15:50 +02001330 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_bind_ip_cmd);
1331 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bts_bind_ip_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +08001332 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freythere5899382015-08-20 15:15:50 +02001333 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
1334 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +08001335 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1336 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +08001337 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +08001338 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck16491a92014-04-14 10:31:47 +02001339 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1340 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001341 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1342 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1343 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +02001344 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001345 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +08001346 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +01001347 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +08001348 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001349 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1350 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001351 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1352 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001353 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1354 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001355 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1356 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001357 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1358 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1359 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1360 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1361 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001362 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001363 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1364 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +01001365 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1366 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001367 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1368 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001369 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001370 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Pablo Neira Ayuso644fdc22015-07-17 21:56:23 +02001371 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -04001372 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1373 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
1374
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001375
1376 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1377 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001378 vty_install_default(TRUNK_NODE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001379 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1380 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1381 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001382 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1383 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001384 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1385 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001386 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001387 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1388 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001389 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1390 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1391 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1392 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1393 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001394 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001395 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1396 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +01001397 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1398 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -04001399 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1400 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001401
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001402 return 0;
1403}
1404
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001405static int allocate_trunk(struct mgcp_trunk_config *trunk)
1406{
1407 int i;
1408 struct mgcp_config *cfg = trunk->cfg;
1409
1410 if (mgcp_endpoints_allocate(trunk) != 0) {
1411 LOGP(DMGCP, LOGL_ERROR,
1412 "Failed to allocate %d endpoints on trunk %d.\n",
1413 trunk->number_endpoints, trunk->trunk_nr);
1414 return -1;
1415 }
1416
1417 /* early bind */
1418 for (i = 1; i < trunk->number_endpoints; ++i) {
1419 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001420
1421 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001422 cfg->last_bts_port += 2;
1423 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1424 LOGP(DMGCP, LOGL_FATAL,
1425 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001426 return -1;
1427 }
1428 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1429 }
1430
1431 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001432 cfg->last_net_port += 2;
1433 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1434 LOGP(DMGCP, LOGL_FATAL,
1435 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001436 return -1;
1437 }
1438 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1439 }
1440
Holger Hans Peter Freyther1b8eaf42011-02-28 14:51:48 +01001441 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1442 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001443 int rtp_port;
1444
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001445 /* network side */
1446 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1447 cfg->transcoder_ports.base_port);
1448 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1449 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1450 return -1;
1451 }
1452 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1453
1454 /* bts side */
1455 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1456 cfg->transcoder_ports.base_port);
1457 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1458 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1459 return -1;
1460 }
1461 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1462 }
1463 }
1464
1465 return 0;
1466}
1467
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001468int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1469 enum mgcp_role role)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001470{
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001471 int rc;
1472 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001473
Pablo Neira Ayusofa422c52014-08-29 12:20:17 +02001474 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001475 cfg->osmux_batch = 4;
Pablo Neira Ayusoefb34f62014-08-29 15:31:55 +02001476 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001477
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001478 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +02001479 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001480 if (rc < 0) {
1481 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1482 return rc;
1483 }
1484
1485
1486 if (!g_cfg->bts_ip)
1487 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1488
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +02001489 if (!g_cfg->source_addr) {
1490 fprintf(stderr, "You need to specify a bind address.\n");
1491 return -1;
1492 }
1493
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001494 /* initialize the last ports */
1495 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1496 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1497
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001498 if (allocate_trunk(&g_cfg->trunk) != 0) {
1499 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001500 return -1;
1501 }
1502
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001503 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1504 if (allocate_trunk(trunk) != 0) {
1505 LOGP(DMGCP, LOGL_ERROR,
1506 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1507 return -1;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +08001508 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001509 }
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001510 cfg->role = role;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001511
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +08001512 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001513}
1514