blob: a620a207887b44daa6936f98b388b6136fed55e7 [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 Freyther6f38c062010-02-20 21:21:02 +0100229 return CMD_SUCCESS;
230}
231
232DEFUN(cfg_mgcp,
233 cfg_mgcp_cmd,
234 "mgcp",
235 "Configure the MGCP")
236{
237 vty->node = MGCP_NODE;
238 return CMD_SUCCESS;
239}
240
241DEFUN(cfg_mgcp_local_ip,
242 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800243 "local ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100244 "Local options for the SDP record\n"
245 IP_STR
246 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100247{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200248 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100249 return CMD_SUCCESS;
250}
251
252DEFUN(cfg_mgcp_bts_ip,
253 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800254 "bts ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100255 "BTS Audio source/destination options\n"
256 IP_STR
257 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100258{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200259 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100260 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
261 return CMD_SUCCESS;
262}
263
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100264#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100265DEFUN(cfg_mgcp_bind_ip,
266 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther5c9a6452010-05-14 02:27:50 +0800267 "bind ip A.B.C.D",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100268 BIND_STR
269 IP_STR
270 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100271{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200272 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100273 return CMD_SUCCESS;
274}
275
276DEFUN(cfg_mgcp_bind_port,
277 cfg_mgcp_bind_port_cmd,
278 "bind port <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100279 BIND_STR
280 "Port information\n"
281 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100282{
283 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100284 g_cfg->source_port = port;
285 return CMD_SUCCESS;
286}
287
288DEFUN(cfg_mgcp_bind_early,
289 cfg_mgcp_bind_early_cmd,
290 "bind early (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100291 BIND_STR
292 "Bind local ports on start up\n"
293 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100294{
Holger Hans Peter Freyther7140dae2010-08-05 03:22:24 +0800295 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
296 return CMD_WARNING;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100297}
298
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800299static void parse_base(struct mgcp_port_range *range, const char **argv)
300{
301 unsigned int port = atoi(argv[0]);
302 range->mode = PORT_ALLOC_STATIC;
303 range->base_port = port;
304}
305
306static void parse_range(struct mgcp_port_range *range, const char **argv)
307{
308 range->mode = PORT_ALLOC_DYNAMIC;
309 range->range_start = atoi(argv[0]);
310 range->range_end = atoi(argv[1]);
311 range->last_port = g_cfg->bts_ports.range_start;
312}
313
314
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100315#define RTP_STR "RTP configuration\n"
316#define BTS_START_STR "First UDP port allocated for the BTS side\n"
317#define NET_START_STR "First UDP port allocated for the NET side\n"
318#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800319DEFUN(cfg_mgcp_rtp_bts_base_port,
320 cfg_mgcp_rtp_bts_base_port_cmd,
321 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100322 RTP_STR
323 BTS_START_STR
324 UDP_PORT_STR)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100325{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800326 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100327 return CMD_SUCCESS;
328}
329
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100330#define RANGE_START_STR "Start of the range of ports\n"
331#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800332DEFUN(cfg_mgcp_rtp_bts_range,
333 cfg_mgcp_rtp_bts_range_cmd,
334 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100335 RTP_STR "Range of ports to use for the BTS side\n"
336 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800337{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800338 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800339 return CMD_SUCCESS;
340}
341
342DEFUN(cfg_mgcp_rtp_net_range,
343 cfg_mgcp_rtp_net_range_cmd,
344 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100345 RTP_STR "Range of ports to use for the NET side\n"
346 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800347{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800348 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +0800349 return CMD_SUCCESS;
350}
351
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800352DEFUN(cfg_mgcp_rtp_net_base_port,
353 cfg_mgcp_rtp_net_base_port_cmd,
354 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100355 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800356{
Holger Hans Peter Freytherd3b7d772010-09-17 23:34:36 +0800357 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +0800358 return CMD_SUCCESS;
359}
360
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800361ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100362 "rtp base <0-65534>",
363 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +0800364
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800365DEFUN(cfg_mgcp_rtp_transcoder_range,
366 cfg_mgcp_rtp_transcoder_range_cmd,
367 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100368 RTP_STR "Range of ports to use for the Transcoder\n"
369 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800370{
371 parse_range(&g_cfg->transcoder_ports, argv);
372 return CMD_SUCCESS;
373}
374
375DEFUN(cfg_mgcp_rtp_transcoder_base,
376 cfg_mgcp_rtp_transcoder_base_cmd,
377 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100378 RTP_STR "First UDP port allocated for the Transcoder side\n"
379 UDP_PORT_STR)
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +0800380{
381 parse_base(&g_cfg->transcoder_ports, argv);
382 return CMD_SUCCESS;
383}
384
Holger Hans Peter Freythere5899382015-08-20 15:15:50 +0200385DEFUN(cfg_mgcp_rtp_bts_bind_ip,
386 cfg_mgcp_rtp_bts_bind_ip_cmd,
387 "rtp bts-bind-ip A.B.C.D",
388 RTP_STR "Bind endpoints facing the BTS\n" "Address to bind to\n")
389{
390 bsc_replace_string(g_cfg, &g_cfg->bts_ports.bind_addr, argv[0]);
391 return CMD_SUCCESS;
392}
393
394DEFUN(cfg_mgcp_rtp_no_bts_bind_ip,
395 cfg_mgcp_rtp_no_bts_bind_ip_cmd,
396 "no rtp bts-bind-ip",
397 NO_STR RTP_STR "Bind endpoints facing the BTS\n" "Address to bind to\n")
398{
399 talloc_free(g_cfg->bts_ports.bind_addr);
400 g_cfg->bts_ports.bind_addr = NULL;
401 return CMD_SUCCESS;
402}
403
404DEFUN(cfg_mgcp_rtp_net_bind_ip,
405 cfg_mgcp_rtp_net_bind_ip_cmd,
406 "rtp net-bind-ip A.B.C.D",
407 RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
408{
409 bsc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr, argv[0]);
410 return CMD_SUCCESS;
411}
412
413DEFUN(cfg_mgcp_rtp_no_net_bind_ip,
414 cfg_mgcp_rtp_no_net_bind_ip_cmd,
415 "no rtp net-bind-ip",
416 NO_STR RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
417{
418 talloc_free(g_cfg->net_ports.bind_addr);
419 g_cfg->net_ports.bind_addr = NULL;
420 return CMD_SUCCESS;
421}
422
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800423DEFUN(cfg_mgcp_rtp_ip_dscp,
424 cfg_mgcp_rtp_ip_dscp_cmd,
425 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100426 RTP_STR
Holger Hans Peter Freytherc0c9ff02015-01-21 11:39:47 +0100427 "Apply IP_TOS to the audio stream (including Osmux)\n" "The DSCP value\n")
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800428{
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800429 int dscp = atoi(argv[0]);
430 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +0800431 return CMD_SUCCESS;
432}
433
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800434ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
435 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100436 RTP_STR
437 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800438
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200439#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
440DEFUN(cfg_mgcp_rtp_force_ptime,
441 cfg_mgcp_rtp_force_ptime_cmd,
442 "rtp force-ptime (10|20|40)",
443 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther7a4464e2014-07-04 20:11:11 +0200444 "The required ptime (packet duration) in ms\n"
445 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck16491a92014-04-14 10:31:47 +0200446{
447 g_cfg->bts_force_ptime = atoi(argv[0]);
448 return CMD_SUCCESS;
449}
450
451DEFUN(cfg_mgcp_no_rtp_force_ptime,
452 cfg_mgcp_no_rtp_force_ptime_cmd,
453 "no rtp force-ptime",
454 NO_STR RTP_STR FORCE_PTIME_STR)
455{
456 g_cfg->bts_force_ptime = 0;
457 return CMD_SUCCESS;
458}
459
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200460DEFUN(cfg_mgcp_sdp_fmtp_extra,
461 cfg_mgcp_sdp_fmtp_extra_cmd,
462 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100463 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
464 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200465{
466 char *txt = argv_concat(argv, argc, 0);
467 if (!txt)
468 return CMD_WARNING;
469
470 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
471 talloc_free(txt);
472 return CMD_SUCCESS;
473}
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +0800474
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -0400475DEFUN(cfg_mgcp_allow_transcoding,
476 cfg_mgcp_allow_transcoding_cmd,
477 "allow-transcoding",
478 "Allow transcoding\n")
479{
480 g_cfg->trunk.no_audio_transcoding = 0;
481 return CMD_SUCCESS;
482}
483
484DEFUN(cfg_mgcp_no_allow_transcoding,
485 cfg_mgcp_no_allow_transcoding_cmd,
486 "no allow-transcoding",
487 NO_STR "Allow transcoding\n")
488{
489 g_cfg->trunk.no_audio_transcoding = 1;
490 return CMD_SUCCESS;
491}
492
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100493#define SDP_STR "SDP File related options\n"
494#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100495DEFUN(cfg_mgcp_sdp_payload_number,
496 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100497 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100498 SDP_STR AUDIO_STR
499 "Number\n" "Payload number\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100500{
501 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100502 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100503 return CMD_SUCCESS;
504}
505
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100506ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100507 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100508 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
509
510
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100511DEFUN(cfg_mgcp_sdp_payload_name,
512 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100513 "sdp audio-payload name NAME",
514 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100515{
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100516 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100517 return CMD_SUCCESS;
518}
519
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100520ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
521 "sdp audio payload name NAME",
522 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
523
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100524DEFUN(cfg_mgcp_sdp_payload_send_ptime,
525 cfg_mgcp_sdp_payload_send_ptime_cmd,
526 "sdp audio-payload send-ptime",
527 SDP_STR AUDIO_STR
528 "Send SDP ptime (packet duration) attribute\n")
529{
530 g_cfg->trunk.audio_send_ptime = 1;
531 return CMD_SUCCESS;
532}
533
534DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
535 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
536 "no sdp audio-payload send-ptime",
537 NO_STR SDP_STR AUDIO_STR
538 "Send SDP ptime (packet duration) attribute\n")
539{
540 g_cfg->trunk.audio_send_ptime = 0;
541 return CMD_SUCCESS;
542}
543
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100544DEFUN(cfg_mgcp_sdp_payload_send_name,
545 cfg_mgcp_sdp_payload_send_name_cmd,
546 "sdp audio-payload send-name",
547 SDP_STR AUDIO_STR
548 "Send SDP rtpmap with the audio name\n")
549{
550 g_cfg->trunk.audio_send_name = 1;
551 return CMD_SUCCESS;
552}
553
554DEFUN(cfg_mgcp_no_sdp_payload_send_name,
555 cfg_mgcp_no_sdp_payload_send_name_cmd,
556 "no sdp audio-payload send-name",
557 NO_STR SDP_STR AUDIO_STR
558 "Send SDP rtpmap with the audio name\n")
559{
560 g_cfg->trunk.audio_send_name = 0;
561 return CMD_SUCCESS;
562}
563
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100564DEFUN(cfg_mgcp_loop,
565 cfg_mgcp_loop_cmd,
566 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100567 "Loop audio for all endpoints on main trunk\n"
568 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100569{
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100570 if (g_cfg->osmux) {
571 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
572 return CMD_WARNING;
573 }
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100574 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100575 return CMD_SUCCESS;
576}
577
578DEFUN(cfg_mgcp_number_endp,
579 cfg_mgcp_number_endp_cmd,
580 "number endpoints <0-65534>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100581 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100582{
583 /* + 1 as we start counting at one */
Holger Hans Peter Freytherab56ce12011-02-28 00:56:17 +0100584 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +0100585 return CMD_SUCCESS;
586}
587
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200588DEFUN(cfg_mgcp_omit_rtcp,
589 cfg_mgcp_omit_rtcp_cmd,
590 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200591 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200592{
593 g_cfg->trunk.omit_rtcp = 1;
594 return CMD_SUCCESS;
595}
596
597DEFUN(cfg_mgcp_no_omit_rtcp,
598 cfg_mgcp_no_omit_rtcp_cmd,
599 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200600 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200601{
602 g_cfg->trunk.omit_rtcp = 0;
603 return CMD_SUCCESS;
604}
605
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100606DEFUN(cfg_mgcp_patch_rtp_ssrc,
607 cfg_mgcp_patch_rtp_ssrc_cmd,
608 "rtp-patch ssrc",
609 RTP_PATCH_STR
610 "Force a fixed SSRC\n"
611 )
612{
613 g_cfg->trunk.force_constant_ssrc = 1;
614 return CMD_SUCCESS;
615}
616
617DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
618 cfg_mgcp_no_patch_rtp_ssrc_cmd,
619 "no rtp-patch ssrc",
620 NO_STR RTP_PATCH_STR
621 "Force a fixed SSRC\n"
622 )
623{
624 g_cfg->trunk.force_constant_ssrc = 0;
625 return CMD_SUCCESS;
626}
627
628DEFUN(cfg_mgcp_patch_rtp_ts,
629 cfg_mgcp_patch_rtp_ts_cmd,
630 "rtp-patch timestamp",
631 RTP_PATCH_STR
632 "Adjust RTP timestamp\n"
633 )
634{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100635 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100636 return CMD_SUCCESS;
637}
638
639DEFUN(cfg_mgcp_no_patch_rtp_ts,
640 cfg_mgcp_no_patch_rtp_ts_cmd,
641 "no rtp-patch timestamp",
642 NO_STR RTP_PATCH_STR
643 "Adjust RTP timestamp\n"
644 )
645{
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100646 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100647 return CMD_SUCCESS;
648}
649
650DEFUN(cfg_mgcp_no_patch_rtp,
651 cfg_mgcp_no_patch_rtp_cmd,
652 "no rtp-patch",
653 NO_STR RTP_PATCH_STR)
654{
655 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100656 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100657 return CMD_SUCCESS;
658}
659
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100660DEFUN(cfg_mgcp_rtp_keepalive,
661 cfg_mgcp_rtp_keepalive_cmd,
662 "rtp keep-alive <1-120>",
663 RTP_STR RTP_KEEPALIVE_STR
664 "Keep alive interval in secs\n"
665 )
666{
667 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
668 return CMD_SUCCESS;
669}
670
671DEFUN(cfg_mgcp_rtp_keepalive_once,
672 cfg_mgcp_rtp_keepalive_once_cmd,
673 "rtp keep-alive once",
674 RTP_STR RTP_KEEPALIVE_STR
675 "Send dummy packet only once after CRCX/MDCX\n"
676 )
677{
678 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
679 return CMD_SUCCESS;
680}
681
682DEFUN(cfg_mgcp_no_rtp_keepalive,
683 cfg_mgcp_no_rtp_keepalive_cmd,
684 "no rtp keep-alive",
685 NO_STR RTP_STR RTP_KEEPALIVE_STR
686 )
687{
688 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
689 return CMD_SUCCESS;
690}
691
692
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100693
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100694#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200695DEFUN(cfg_mgcp_agent_addr,
696 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100697 "call-agent ip A.B.C.D",
698 CALL_AGENT_STR IP_STR
699 "IPv4 Address of the callagent\n")
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200700{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200701 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +0200702 return CMD_SUCCESS;
703}
704
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100705ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
706 "call agent ip A.B.C.D",
707 CALL_AGENT_STR CALL_AGENT_STR IP_STR
708 "IPv4 Address of the callagent\n")
709
710
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800711DEFUN(cfg_mgcp_transcoder,
712 cfg_mgcp_transcoder_cmd,
713 "transcoder-mgw A.B.C.D",
714 "Use a MGW to detranscoder RTP\n"
715 "The IP address of the MGW")
716{
Holger Hans Peter Freyther7c831f62010-10-12 23:21:54 +0200717 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +0800718 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
719
720 return CMD_SUCCESS;
721}
722
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100723DEFUN(cfg_mgcp_no_transcoder,
724 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100725 "no transcoder-mgw",
726 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +0100727{
728 if (g_cfg->transcoder_ip) {
729 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
730 talloc_free(g_cfg->transcoder_ip);
731 g_cfg->transcoder_ip = NULL;
732 }
733
734 return CMD_SUCCESS;
735}
736
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800737DEFUN(cfg_mgcp_transcoder_remote_base,
738 cfg_mgcp_transcoder_remote_base_cmd,
739 "transcoder-remote-base <0-65534>",
740 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
741{
742 g_cfg->transcoder_remote_base = atoi(argv[0]);
743 return CMD_SUCCESS;
744}
745
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100746DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
747 "trunk <1-64>",
748 "Configure a SS7 trunk\n" "Trunk Nr\n")
749{
750 struct mgcp_trunk_config *trunk;
751 int index = atoi(argv[0]);
752
753 trunk = mgcp_trunk_num(g_cfg, index);
754 if (!trunk)
755 trunk = mgcp_trunk_alloc(g_cfg, index);
756
757 if (!trunk) {
758 vty_out(vty, "%%Unable to allocate trunk %u.%s",
759 index, VTY_NEWLINE);
760 return CMD_WARNING;
761 }
762
763 vty->node = TRUNK_NODE;
764 vty->index = trunk;
765 return CMD_SUCCESS;
766}
767
768static int config_write_trunk(struct vty *vty)
769{
770 struct mgcp_trunk_config *trunk;
771
772 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
773 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100774 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100775 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100776 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100777 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100778 vty_out(vty, " %ssdp audio-payload send-ptime%s",
779 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100780 vty_out(vty, " %ssdp audio-payload send-name%s",
781 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +0100782
783 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
784 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
785 else if (trunk->keepalive_interval)
786 vty_out(vty, " rtp keep-alive %d%s",
787 trunk->keepalive_interval, VTY_NEWLINE);
788 else
789 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
790
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100791 vty_out(vty, " loop %d%s",
792 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200793 if (trunk->omit_rtcp)
794 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
795 else
796 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100797 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100798 vty_out(vty, " %srtp-patch ssrc%s",
799 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
800 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100801 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100802 } else
803 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200804 if (trunk->audio_fmtp_extra)
805 vty_out(vty, " sdp audio fmtp-extra %s%s",
806 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -0400807 vty_out(vty, " %sallow-transcoding%s",
808 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100809 }
810
811 return CMD_SUCCESS;
812}
813
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200814DEFUN(cfg_trunk_sdp_fmtp_extra,
815 cfg_trunk_sdp_fmtp_extra_cmd,
816 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freytherebe37252013-03-03 09:32:08 +0100817 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
818 "Extra Information\n")
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +0200819{
820 struct mgcp_trunk_config *trunk = vty->index;
821 char *txt = argv_concat(argv, argc, 0);
822 if (!txt)
823 return CMD_WARNING;
824
825 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
826 talloc_free(txt);
827 return CMD_SUCCESS;
828}
829
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100830DEFUN(cfg_trunk_payload_number,
831 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100832 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100833 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100834{
835 struct mgcp_trunk_config *trunk = vty->index;
836 unsigned int payload = atoi(argv[0]);
837
838 trunk->audio_payload = payload;
839 return CMD_SUCCESS;
840}
841
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100842ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherdfce0072014-03-14 16:55:12 +0100843 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100844 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
845
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100846DEFUN(cfg_trunk_payload_name,
847 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100848 "sdp audio-payload name NAME",
849 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100850{
851 struct mgcp_trunk_config *trunk = vty->index;
852
853 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
854 return CMD_SUCCESS;
855}
856
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100857ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
858 "sdp audio payload name NAME",
859 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
860
861
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100862DEFUN(cfg_trunk_loop,
863 cfg_trunk_loop_cmd,
864 "loop (0|1)",
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +0100865 "Loop audio for all endpoints on this trunk\n"
866 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100867{
868 struct mgcp_trunk_config *trunk = vty->index;
869
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +0100870 if (g_cfg->osmux) {
871 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
872 return CMD_WARNING;
873 }
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +0100874 trunk->audio_loop = atoi(argv[0]);
875 return CMD_SUCCESS;
876}
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +0800877
Jacob Erlbecke91324d2013-12-10 13:09:37 +0100878DEFUN(cfg_trunk_sdp_payload_send_ptime,
879 cfg_trunk_sdp_payload_send_ptime_cmd,
880 "sdp audio-payload send-ptime",
881 SDP_STR AUDIO_STR
882 "Send SDP ptime (packet duration) attribute\n")
883{
884 struct mgcp_trunk_config *trunk = vty->index;
885 trunk->audio_send_ptime = 1;
886 return CMD_SUCCESS;
887}
888
889DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
890 cfg_trunk_no_sdp_payload_send_ptime_cmd,
891 "no sdp audio-payload send-ptime",
892 NO_STR SDP_STR AUDIO_STR
893 "Send SDP ptime (packet duration) attribute\n")
894{
895 struct mgcp_trunk_config *trunk = vty->index;
896 trunk->audio_send_ptime = 0;
897 return CMD_SUCCESS;
898}
899
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +0100900DEFUN(cfg_trunk_sdp_payload_send_name,
901 cfg_trunk_sdp_payload_send_name_cmd,
902 "sdp audio-payload send-name",
903 SDP_STR AUDIO_STR
904 "Send SDP rtpmap with the audio name\n")
905{
906 struct mgcp_trunk_config *trunk = vty->index;
907 trunk->audio_send_name = 1;
908 return CMD_SUCCESS;
909}
910
911DEFUN(cfg_trunk_no_sdp_payload_send_name,
912 cfg_trunk_no_sdp_payload_send_name_cmd,
913 "no sdp audio-payload send-name",
914 NO_STR SDP_STR AUDIO_STR
915 "Send SDP rtpmap with the audio name\n")
916{
917 struct mgcp_trunk_config *trunk = vty->index;
918 trunk->audio_send_name = 0;
919 return CMD_SUCCESS;
920}
921
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200922DEFUN(cfg_trunk_omit_rtcp,
923 cfg_trunk_omit_rtcp_cmd,
924 "rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200925 RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200926{
927 struct mgcp_trunk_config *trunk = vty->index;
928 trunk->omit_rtcp = 1;
929 return CMD_SUCCESS;
930}
931
932DEFUN(cfg_trunk_no_omit_rtcp,
933 cfg_trunk_no_omit_rtcp_cmd,
934 "no rtcp-omit",
Holger Hans Peter Freyther1e49cc92012-07-28 15:46:45 +0200935 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +0200936{
937 struct mgcp_trunk_config *trunk = vty->index;
938 trunk->omit_rtcp = 0;
939 return CMD_SUCCESS;
940}
941
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100942DEFUN(cfg_trunk_patch_rtp_ssrc,
943 cfg_trunk_patch_rtp_ssrc_cmd,
944 "rtp-patch ssrc",
945 RTP_PATCH_STR
946 "Force a fixed SSRC\n"
947 )
948{
949 struct mgcp_trunk_config *trunk = vty->index;
950 trunk->force_constant_ssrc = 1;
951 return CMD_SUCCESS;
952}
953
954DEFUN(cfg_trunk_no_patch_rtp_ssrc,
955 cfg_trunk_no_patch_rtp_ssrc_cmd,
956 "no rtp-patch ssrc",
957 NO_STR RTP_PATCH_STR
958 "Force a fixed SSRC\n"
959 )
960{
961 struct mgcp_trunk_config *trunk = vty->index;
962 trunk->force_constant_ssrc = 0;
963 return CMD_SUCCESS;
964}
965
966DEFUN(cfg_trunk_patch_rtp_ts,
967 cfg_trunk_patch_rtp_ts_cmd,
968 "rtp-patch timestamp",
969 RTP_PATCH_STR
970 "Adjust RTP timestamp\n"
971 )
972{
973 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100974 trunk->force_aligned_timing = 1;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100975 return CMD_SUCCESS;
976}
977
978DEFUN(cfg_trunk_no_patch_rtp_ts,
979 cfg_trunk_no_patch_rtp_ts_cmd,
980 "no rtp-patch timestamp",
981 NO_STR RTP_PATCH_STR
982 "Adjust RTP timestamp\n"
983 )
984{
985 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100986 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100987 return CMD_SUCCESS;
988}
989
990DEFUN(cfg_trunk_no_patch_rtp,
991 cfg_trunk_no_patch_rtp_cmd,
992 "no rtp-patch",
993 NO_STR RTP_PATCH_STR)
994{
995 struct mgcp_trunk_config *trunk = vty->index;
996 trunk->force_constant_ssrc = 0;
Jacob Erlbeckf12c8492013-12-18 12:54:51 +0100997 trunk->force_aligned_timing = 0;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +0100998 return CMD_SUCCESS;
999}
1000
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001001DEFUN(cfg_trunk_rtp_keepalive,
1002 cfg_trunk_rtp_keepalive_cmd,
1003 "rtp keep-alive <1-120>",
1004 RTP_STR RTP_KEEPALIVE_STR
1005 "Keep-alive interval in secs\n"
1006 )
1007{
1008 struct mgcp_trunk_config *trunk = vty->index;
1009 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
1010 return CMD_SUCCESS;
1011}
1012
1013DEFUN(cfg_trunk_rtp_keepalive_once,
1014 cfg_trunk_rtp_keepalive_once_cmd,
1015 "rtp keep-alive once",
1016 RTP_STR RTP_KEEPALIVE_STR
1017 "Send dummy packet only once after CRCX/MDCX\n"
1018 )
1019{
1020 struct mgcp_trunk_config *trunk = vty->index;
1021 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
1022 return CMD_SUCCESS;
1023}
1024
1025DEFUN(cfg_trunk_no_rtp_keepalive,
1026 cfg_trunk_no_rtp_keepalive_cmd,
1027 "no rtp keep-alive",
1028 NO_STR RTP_STR RTP_KEEPALIVE_STR
1029 )
1030{
1031 struct mgcp_trunk_config *trunk = vty->index;
1032 mgcp_trunk_set_keepalive(trunk, 0);
1033 return CMD_SUCCESS;
1034}
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001035
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -04001036DEFUN(cfg_trunk_allow_transcoding,
1037 cfg_trunk_allow_transcoding_cmd,
1038 "allow-transcoding",
1039 "Allow transcoding\n")
1040{
1041 struct mgcp_trunk_config *trunk = vty->index;
1042 trunk->no_audio_transcoding = 0;
1043 return CMD_SUCCESS;
1044}
1045
1046DEFUN(cfg_trunk_no_allow_transcoding,
1047 cfg_trunk_no_allow_transcoding_cmd,
1048 "no allow-transcoding",
1049 NO_STR "Allow transcoding\n")
1050{
1051 struct mgcp_trunk_config *trunk = vty->index;
1052 trunk->no_audio_transcoding = 1;
1053 return CMD_SUCCESS;
1054}
1055
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001056DEFUN(loop_endp,
1057 loop_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001058 "loop-endpoint <0-64> NAME (0|1)",
1059 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freyther84d88992010-08-03 23:00:03 +08001060 "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 +08001061{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001062 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001063 struct mgcp_endpoint *endp;
1064
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001065 trunk = find_trunk(g_cfg, atoi(argv[0]));
1066 if (!trunk) {
1067 vty_out(vty, "%%Trunk %d not found in the config.%s",
1068 atoi(argv[0]), VTY_NEWLINE);
1069 return CMD_WARNING;
1070 }
1071
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001072 if (!trunk->endpoints) {
1073 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1074 trunk->trunk_nr, VTY_NEWLINE);
1075 return CMD_WARNING;
1076 }
1077
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001078 int endp_no = strtoul(argv[1], NULL, 16);
1079 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001080 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001081 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001082 return CMD_WARNING;
1083 }
1084
1085
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001086 endp = &trunk->endpoints[endp_no];
1087 int loop = atoi(argv[2]);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001088
1089 if (loop)
1090 endp->conn_mode = MGCP_CONN_LOOPBACK;
1091 else
1092 endp->conn_mode = endp->orig_mode;
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001093
1094 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1095 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
1096 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001097
1098 return CMD_SUCCESS;
1099}
1100
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001101DEFUN(tap_call,
1102 tap_call_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001103 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
1104 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001105 "The endpoint in hex\n"
1106 "Forward the data coming from the bts\n"
1107 "Forward the data coming from the bts leaving to the network\n"
1108 "Forward the data coming from the net\n"
1109 "Forward the data coming from the net leaving to the bts\n"
1110 "destination IP of the data\n" "destination port\n")
1111{
1112 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001113 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001114 struct mgcp_endpoint *endp;
1115 int port = 0;
1116
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001117 trunk = find_trunk(g_cfg, atoi(argv[0]));
1118 if (!trunk) {
1119 vty_out(vty, "%%Trunk %d not found in the config.%s",
1120 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001121 return CMD_WARNING;
1122 }
1123
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001124 if (!trunk->endpoints) {
1125 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1126 trunk->trunk_nr, VTY_NEWLINE);
1127 return CMD_WARNING;
1128 }
1129
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001130 int endp_no = strtoul(argv[1], NULL, 16);
1131 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1132 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1133 argv[1], endp_no, VTY_NEWLINE);
1134 return CMD_WARNING;
1135 }
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001136
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001137 endp = &trunk->endpoints[endp_no];
1138
1139 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001140 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001141 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001142 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001143 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001144 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001145 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001146 port = MGCP_TAP_NET_OUT;
1147 } else {
1148 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1149 return CMD_WARNING;
1150 }
1151
1152 tap = &endp->taps[port];
1153 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001154 inet_aton(argv[3], &tap->forward.sin_addr);
1155 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther079f0332010-08-06 02:05:15 +08001156 tap->enabled = 1;
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001157 return CMD_SUCCESS;
1158}
1159
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001160DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001161 "free-endpoint <0-64> NUMBER",
1162 "Free the given endpoint\n" "Trunk number\n"
1163 "Endpoint number in hex.\n")
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001164{
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001165 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001166 struct mgcp_endpoint *endp;
1167
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001168 trunk = find_trunk(g_cfg, atoi(argv[0]));
1169 if (!trunk) {
1170 vty_out(vty, "%%Trunk %d not found in the config.%s",
1171 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001172 return CMD_WARNING;
1173 }
1174
Holger Hans Peter Freyther1ca419d2011-02-28 12:32:18 +01001175 if (!trunk->endpoints) {
1176 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1177 trunk->trunk_nr, VTY_NEWLINE);
1178 return CMD_WARNING;
1179 }
1180
Holger Hans Peter Freyther75cf62d2011-02-28 01:29:02 +01001181 int endp_no = strtoul(argv[1], NULL, 16);
1182 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1183 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1184 argv[1], endp_no, VTY_NEWLINE);
1185 return CMD_WARNING;
1186 }
1187
1188 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freytherbb8627a2014-07-22 15:00:52 +02001189 mgcp_release_endp(endp);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001190 return CMD_SUCCESS;
1191}
1192
Harald Welteba4f8b22012-01-27 00:41:39 +01001193DEFUN(reset_endp, reset_endp_cmd,
1194 "reset-endpoint <0-64> NUMBER",
1195 "Reset the given endpoint\n" "Trunk number\n"
1196 "Endpoint number in hex.\n")
1197{
1198 struct mgcp_trunk_config *trunk;
1199 struct mgcp_endpoint *endp;
1200 int endp_no, rc;
1201
1202 trunk = find_trunk(g_cfg, atoi(argv[0]));
1203 if (!trunk) {
1204 vty_out(vty, "%%Trunk %d not found in the config.%s",
1205 atoi(argv[0]), VTY_NEWLINE);
1206 return CMD_WARNING;
1207 }
1208
1209 if (!trunk->endpoints) {
1210 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1211 trunk->trunk_nr, VTY_NEWLINE);
1212 return CMD_WARNING;
1213 }
1214
1215 endp_no = strtoul(argv[1], NULL, 16);
1216 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1217 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1218 argv[1], endp_no, VTY_NEWLINE);
1219 return CMD_WARNING;
1220 }
1221
1222 endp = &trunk->endpoints[endp_no];
1223 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1224 if (rc < 0) {
1225 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1226 return CMD_WARNING;
1227 }
1228 return CMD_SUCCESS;
1229}
1230
1231DEFUN(reset_all_endp, reset_all_endp_cmd,
1232 "reset-all-endpoints",
1233 "Reset all endpoints\n")
1234{
1235 int rc;
1236
1237 rc = mgcp_send_reset_all(g_cfg);
1238 if (rc < 0) {
1239 vty_out(vty, "Error %d during endpoint reset.%s",
1240 rc, VTY_NEWLINE);
1241 return CMD_WARNING;
1242 }
1243 return CMD_SUCCESS;
1244}
1245
Holger Hans Peter Freytherea285e42014-06-03 13:36:42 +02001246#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001247DEFUN(cfg_mgcp_osmux,
1248 cfg_mgcp_osmux_cmd,
1249 "osmux (on|off)",
1250 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n")
1251{
1252 if (strcmp(argv[0], "on") == 0) {
1253 g_cfg->osmux = 1;
1254 if (g_cfg->trunk.audio_loop) {
1255 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1256 VTY_NEWLINE);
1257 return CMD_WARNING;
1258 }
1259 } else if (strcmp(argv[0], "off") == 0)
1260 g_cfg->osmux = 0;
1261
1262 return CMD_SUCCESS;
1263}
1264
1265DEFUN(cfg_mgcp_osmux_batch_factor,
1266 cfg_mgcp_osmux_batch_factor_cmd,
Pablo Neira Ayuso9776fd02014-08-29 16:08:45 +02001267 "osmux batch-factor <1-8>",
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001268 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1269{
1270 g_cfg->osmux_batch = atoi(argv[0]);
1271 return CMD_SUCCESS;
1272}
Harald Welteba4f8b22012-01-27 00:41:39 +01001273
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001274DEFUN(cfg_mgcp_osmux_batch_size,
1275 cfg_mgcp_osmux_batch_size_cmd,
1276 "osmux batch-size <1-65535>",
1277 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1278{
1279 g_cfg->osmux_batch_size = atoi(argv[0]);
1280 return CMD_SUCCESS;
1281}
1282
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001283DEFUN(cfg_mgcp_osmux_port,
1284 cfg_mgcp_osmux_port_cmd,
1285 "osmux port <1-65535>",
1286 OSMUX_STR "port\n" "UDP port\n")
1287{
1288 g_cfg->osmux_port = atoi(argv[0]);
1289 return CMD_SUCCESS;
1290}
1291
Pablo Neira Ayuso644fdc22015-07-17 21:56:23 +02001292DEFUN(cfg_mgcp_osmux_dummy,
1293 cfg_mgcp_osmux_dummy_cmd,
1294 "osmux dummy (on|off)",
1295 OSMUX_STR "Enable dummy padding\n" "Disable dummy padding\n")
1296{
1297 if (strcmp(argv[0], "on") == 0)
1298 g_cfg->osmux_dummy = 1;
1299 else if (strcmp(argv[0], "off") == 0)
1300 g_cfg->osmux_dummy = 0;
1301
1302 return CMD_SUCCESS;
1303}
1304
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001305int mgcp_vty_init(void)
1306{
Holger Hans Peter Freyther8a223852010-05-14 02:45:52 +08001307 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001308 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther8fdb95e2010-08-06 01:12:21 +08001309 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther175b9a12010-08-08 16:39:57 +08001310 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welteba4f8b22012-01-27 00:41:39 +01001311 install_element(ENABLE_NODE, &reset_endp_cmd);
1312 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001313
1314 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1315 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherb33ded12010-08-03 02:57:02 +08001316
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001317 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001318 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1319 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1320 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1321 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1322 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1323 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freytheree4657c2010-08-05 03:46:07 +08001324 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther81938e92010-08-05 04:10:21 +08001325 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +08001326 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
Holger Hans Peter Freythere5899382015-08-20 15:15:50 +02001327 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_bind_ip_cmd);
1328 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bts_bind_ip_cmd);
Holger Hans Peter Freytherf3307292010-08-05 07:20:09 +08001329 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freythere5899382015-08-20 15:15:50 +02001330 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
1331 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Holger Hans Peter Freyther39f2f6d2010-09-17 23:35:53 +08001332 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1333 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freyther3140c4f2010-07-27 20:34:45 +08001334 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther489d0a62010-05-31 10:22:00 +08001335 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck16491a92014-04-14 10:31:47 +02001336 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1337 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001338 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1339 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1340 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther19ff6792010-03-31 11:46:41 +02001341 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001342 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythercab38342010-09-17 03:58:52 +08001343 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freythered1a5a52010-11-01 20:06:45 +01001344 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherd582b202010-09-19 04:21:39 +08001345 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001346 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1347 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001348 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1349 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001350 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1351 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001352 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1353 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001354 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1355 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1356 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1357 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1358 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001359 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001360 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1361 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +01001362 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1363 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001364 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1365 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayusoebaa2e12014-08-29 12:30:38 +02001366 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso1b135d42014-08-28 16:43:38 +02001367 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Pablo Neira Ayuso644fdc22015-07-17 21:56:23 +02001368 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -04001369 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1370 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
1371
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001372
1373 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1374 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeckf414e852013-10-29 09:30:30 +01001375 vty_install_default(TRUNK_NODE);
Jacob Erlbecke64bb122013-12-19 18:53:07 +01001376 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1377 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1378 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001379 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1380 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3763c232011-11-05 14:59:41 +01001381 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1382 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001383 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freyther51ade842012-05-11 13:00:45 +02001384 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1385 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbecke5546cd2013-12-03 14:43:34 +01001386 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1387 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1388 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1389 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1390 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther4928d1b2012-09-03 00:07:39 +02001391 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbecke91324d2013-12-10 13:09:37 +01001392 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1393 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther60e09922014-11-19 16:04:45 +01001394 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1395 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
Holger Hans Peter Freyther54da4c72015-04-24 16:03:55 -04001396 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1397 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Holger Hans Peter Freyther06bfe792011-02-28 12:11:02 +01001398
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001399 return 0;
1400}
1401
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001402static int allocate_trunk(struct mgcp_trunk_config *trunk)
1403{
1404 int i;
1405 struct mgcp_config *cfg = trunk->cfg;
1406
1407 if (mgcp_endpoints_allocate(trunk) != 0) {
1408 LOGP(DMGCP, LOGL_ERROR,
1409 "Failed to allocate %d endpoints on trunk %d.\n",
1410 trunk->number_endpoints, trunk->trunk_nr);
1411 return -1;
1412 }
1413
1414 /* early bind */
1415 for (i = 1; i < trunk->number_endpoints; ++i) {
1416 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001417
1418 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001419 cfg->last_bts_port += 2;
1420 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1421 LOGP(DMGCP, LOGL_FATAL,
1422 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001423 return -1;
1424 }
1425 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1426 }
1427
1428 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001429 cfg->last_net_port += 2;
1430 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1431 LOGP(DMGCP, LOGL_FATAL,
1432 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001433 return -1;
1434 }
1435 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1436 }
1437
Holger Hans Peter Freyther1b8eaf42011-02-28 14:51:48 +01001438 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1439 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001440 int rtp_port;
1441
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001442 /* network side */
1443 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1444 cfg->transcoder_ports.base_port);
1445 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1446 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1447 return -1;
1448 }
1449 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1450
1451 /* bts side */
1452 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1453 cfg->transcoder_ports.base_port);
1454 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1455 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1456 return -1;
1457 }
1458 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1459 }
1460 }
1461
1462 return 0;
1463}
1464
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001465int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1466 enum mgcp_role role)
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001467{
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001468 int rc;
1469 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001470
Pablo Neira Ayusofa422c52014-08-29 12:20:17 +02001471 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001472 cfg->osmux_batch = 4;
Pablo Neira Ayusoefb34f62014-08-29 15:31:55 +02001473 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
Pablo Neira Ayuso4a2f6592014-02-05 18:56:17 +01001474
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001475 g_cfg = cfg;
Harald Welte40152872010-05-16 20:52:23 +02001476 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001477 if (rc < 0) {
1478 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1479 return rc;
1480 }
1481
1482
1483 if (!g_cfg->bts_ip)
1484 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1485
Holger Hans Peter Freytherbdd3cc32010-03-30 13:00:10 +02001486 if (!g_cfg->source_addr) {
1487 fprintf(stderr, "You need to specify a bind address.\n");
1488 return -1;
1489 }
1490
Holger Hans Peter Freytherba9c7632011-02-28 14:46:01 +01001491 /* initialize the last ports */
1492 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1493 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1494
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001495 if (allocate_trunk(&g_cfg->trunk) != 0) {
1496 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001497 return -1;
1498 }
1499
Holger Hans Peter Freyther49e170b2011-02-28 14:37:03 +01001500 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1501 if (allocate_trunk(trunk) != 0) {
1502 LOGP(DMGCP, LOGL_ERROR,
1503 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1504 return -1;
Holger Hans Peter Freyther56ac2692010-09-18 02:30:02 +08001505 }
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001506 }
Pablo Neira Ayusoa4e36942013-08-02 21:14:14 +02001507 cfg->role = role;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001508
Holger Hans Peter Freyther64344522010-08-05 01:28:22 +08001509 return 0;
Holger Hans Peter Freyther6f38c062010-02-20 21:21:02 +01001510}
1511