blob: c478b0a7fa942cb51a44d1f034d9bf428f1b30d0 [file] [log] [blame]
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001/* A Media Gateway Control Protocol Media Gateway: RFC 3435 */
2/* The protocol implementation */
3
4/*
Holger Hans Peter Freyther8d998a72014-07-04 20:23:56 +02005 * (C) 2009-2014 by Holger Hans Peter Freyther <zecke@selfish.org>
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +01006 * (C) 2009-2011 by On-Waves
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01007 * All Rights Reserved
8 *
9 * This program is free software; you can redistribute it and/or modify
Harald Welte9af6ddf2011-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 Freyther7bdc6372010-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 Welte9af6ddf2011-01-01 15:25:50 +010017 * GNU Affero General Public License for more details.
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010018 *
Harald Welte9af6ddf2011-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 Freyther7bdc6372010-02-20 21:21:02 +010021 *
22 */
23
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010024
Pablo Neira Ayuso136f4532011-03-22 16:47:59 +010025#include <osmocom/core/talloc.h>
Holger Hans Peter Freyther1ebad742010-02-26 20:16:37 +010026
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010027#include <openbsc/mgcp.h>
28#include <openbsc/mgcp_internal.h>
Harald Welte62ab20c2010-05-14 18:59:17 +020029#include <openbsc/vty.h>
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010030
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020031#include <string.h>
32
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +020033#define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +010034#define RTP_PATCH_STR "Modify RTP packet header in both directions\n"
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +010035#define RTP_KEEPALIVE_STR "Send dummy UDP packet to net RTP destination\n"
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +020036
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010037static struct mgcp_config *g_cfg = NULL;
38
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010039static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010040{
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010041 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010042
Holger Hans Peter Freyther6ea7e772011-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 Freytherab3bb9d2011-02-28 01:29:02 +010049}
50
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010051/*
52 * vty code for mgcp below
53 */
54struct cmd_node mgcp_node = {
55 MGCP_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020056 "%s(config-mgcp)# ",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010057 1,
58};
59
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010060struct cmd_node trunk_node = {
61 TRUNK_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020062 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010063 1,
64};
65
Holger Hans Peter Freyther7bdc6372010-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 Freyther8d9833e2010-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 Freyther7bdc6372010-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 Freyther15e73892010-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 Freyther1be9f2f2010-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 Freytherc390ae82015-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 Freyther1be9f2f2010-08-05 07:20:09 +080083
Holger Hans Peter Freyther15e73892010-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 Freyther1be9f2f2010-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 Freytherc390ae82015-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 Freyther1be9f2f2010-08-05 07:20:09 +080091
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +080092 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-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 Freythera8090d52012-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 Erlbeck4bbddc62013-12-18 12:54:51 +0100105 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_aligned_timing) {
Jacob Erlbeckdb2d4312013-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 Erlbeck4bbddc62013-12-18 12:54:51 +0100109 g_cfg->trunk.force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100110 } else
111 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100112 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100113 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100114 g_cfg->trunk.audio_payload, VTY_NEWLINE);
115 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100116 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100117 g_cfg->trunk.audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-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 Erlbeck0a1bc562013-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 Freyther619b0142014-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 Freyther88ad7722011-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 Freythercb43a9a2015-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 Freytherb79994c2010-03-31 11:46:41 +0200129 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100130 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-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 Freyther7bdc6372010-02-20 21:21:02 +0100133
Holger Hans Peter Freyther54aaa0f2010-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 Freyther8d998a72014-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 Freytherb98ba722010-09-19 04:21:39 +0800141 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther6598ded2015-10-02 17:38:27 +0200142
143 switch (g_cfg->osmux) {
144 case OSMUX_USAGE_ON:
145 vty_out(vty, " osmux on%s", VTY_NEWLINE);
146 break;
147 case OSMUX_USAGE_ONLY:
148 vty_out(vty, " osmux only%s", VTY_NEWLINE);
149 break;
150 case OSMUX_USAGE_OFF:
151 default:
152 vty_out(vty, " osmux off%s", VTY_NEWLINE);
153 break;
154 }
Pablo Neira Ayusofcec6d82014-08-29 15:24:00 +0200155 if (g_cfg->osmux) {
156 vty_out(vty, " osmux batch-factor %d%s",
157 g_cfg->osmux_batch, VTY_NEWLINE);
158 vty_out(vty, " osmux batch-size %u%s",
159 g_cfg->osmux_batch_size, VTY_NEWLINE);
160 vty_out(vty, " osmux port %u%s",
161 g_cfg->osmux_port, VTY_NEWLINE);
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +0200162 vty_out(vty, " osmux dummy %s%s",
163 g_cfg->osmux_dummy ? "on" : "off", VTY_NEWLINE);
Pablo Neira Ayusofcec6d82014-08-29 15:24:00 +0200164 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100165 return CMD_SUCCESS;
166}
167
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200168static void dump_rtp_end(const char *end_name, struct vty *vty,
169 struct mgcp_rtp_state *state, struct mgcp_rtp_end *end)
170{
Holger Hans Peter Freythercac24382014-09-01 10:35:55 +0200171 struct mgcp_rtp_codec *codec = &end->codec;
172
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200173 vty_out(vty,
174 " %s%s"
175 " Timestamp Errs: %d->%d%s"
176 " Dropped Packets: %d%s"
177 " Payload Type: %d Rate: %u Channels: %d %s"
178 " Frame Duration: %u Frame Denominator: %u%s"
179 " FPP: %d Packet Duration: %u%s"
180 " FMTP-Extra: %s Audio-Name: %s Sub-Type: %s%s"
181 " Output-Enabled: %d Force-PTIME: %d%s",
182 end_name, VTY_NEWLINE,
183 state->in_stream.err_ts_counter,
184 state->out_stream.err_ts_counter, VTY_NEWLINE,
185 end->dropped_packets, VTY_NEWLINE,
Holger Hans Peter Freythercac24382014-09-01 10:35:55 +0200186 codec->payload_type, codec->rate, codec->channels, VTY_NEWLINE,
187 codec->frame_duration_num, codec->frame_duration_den, VTY_NEWLINE,
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200188 end->frames_per_packet, end->packet_duration_ms, VTY_NEWLINE,
Holger Hans Peter Freythercac24382014-09-01 10:35:55 +0200189 end->fmtp_extra, codec->audio_name, codec->subtype_name, VTY_NEWLINE,
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200190 end->output_enabled, end->force_output_ptime, VTY_NEWLINE);
191}
192
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100193static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100194{
195 int i;
196
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100197 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
198 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
199 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
200
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100201 if (!cfg->endpoints) {
202 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
203 return;
204 }
205
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100206 for (i = 1; i < cfg->number_endpoints; ++i) {
207 struct mgcp_endpoint *endp = &cfg->endpoints[i];
208 vty_out(vty,
209 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200210 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100211 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800212 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
213 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
214 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200215 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100216 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200217 VTY_NEWLINE);
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100218
Holger Hans Peter Freyther3d93d352014-07-02 19:36:12 +0200219 if (verbose && endp->allocated) {
220 dump_rtp_end("Net->BTS", vty, &endp->bts_state, &endp->bts_end);
221 dump_rtp_end("BTS->Net", vty, &endp->net_state, &endp->net_end);
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100222 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100223 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100224}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100225
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100226DEFUN(show_mcgp, show_mgcp_cmd,
227 "show mgcp [stats]",
228 SHOW_STR
229 "Display information about the MGCP Media Gateway\n"
230 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100231{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100232 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100233 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100234
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100235 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100236
237 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100238 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100239
Holger Hans Peter Freyther15a40db2015-10-02 16:25:21 +0200240 if (g_cfg->osmux)
241 vty_out(vty, "Osmux used CID: %d%s", osmux_used_cid(), VTY_NEWLINE);
242
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100243 return CMD_SUCCESS;
244}
245
246DEFUN(cfg_mgcp,
247 cfg_mgcp_cmd,
248 "mgcp",
249 "Configure the MGCP")
250{
251 vty->node = MGCP_NODE;
252 return CMD_SUCCESS;
253}
254
255DEFUN(cfg_mgcp_local_ip,
256 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800257 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100258 "Local options for the SDP record\n"
259 IP_STR
260 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100261{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200262 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100263 return CMD_SUCCESS;
264}
265
266DEFUN(cfg_mgcp_bts_ip,
267 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800268 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100269 "BTS Audio source/destination options\n"
270 IP_STR
271 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100272{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200273 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100274 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
275 return CMD_SUCCESS;
276}
277
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100278#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100279DEFUN(cfg_mgcp_bind_ip,
280 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800281 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100282 BIND_STR
283 IP_STR
284 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100285{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200286 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100287 return CMD_SUCCESS;
288}
289
290DEFUN(cfg_mgcp_bind_port,
291 cfg_mgcp_bind_port_cmd,
292 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100293 BIND_STR
294 "Port information\n"
295 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100296{
297 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100298 g_cfg->source_port = port;
299 return CMD_SUCCESS;
300}
301
302DEFUN(cfg_mgcp_bind_early,
303 cfg_mgcp_bind_early_cmd,
304 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100305 BIND_STR
306 "Bind local ports on start up\n"
307 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100308{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800309 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
310 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100311}
312
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800313static void parse_base(struct mgcp_port_range *range, const char **argv)
314{
315 unsigned int port = atoi(argv[0]);
316 range->mode = PORT_ALLOC_STATIC;
317 range->base_port = port;
318}
319
320static void parse_range(struct mgcp_port_range *range, const char **argv)
321{
322 range->mode = PORT_ALLOC_DYNAMIC;
323 range->range_start = atoi(argv[0]);
324 range->range_end = atoi(argv[1]);
325 range->last_port = g_cfg->bts_ports.range_start;
326}
327
328
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100329#define RTP_STR "RTP configuration\n"
330#define BTS_START_STR "First UDP port allocated for the BTS side\n"
331#define NET_START_STR "First UDP port allocated for the NET side\n"
332#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800333DEFUN(cfg_mgcp_rtp_bts_base_port,
334 cfg_mgcp_rtp_bts_base_port_cmd,
335 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100336 RTP_STR
337 BTS_START_STR
338 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100339{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800340 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100341 return CMD_SUCCESS;
342}
343
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100344#define RANGE_START_STR "Start of the range of ports\n"
345#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800346DEFUN(cfg_mgcp_rtp_bts_range,
347 cfg_mgcp_rtp_bts_range_cmd,
348 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100349 RTP_STR "Range of ports to use for the BTS side\n"
350 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800351{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800352 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800353 return CMD_SUCCESS;
354}
355
356DEFUN(cfg_mgcp_rtp_net_range,
357 cfg_mgcp_rtp_net_range_cmd,
358 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100359 RTP_STR "Range of ports to use for the NET side\n"
360 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800361{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800362 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800363 return CMD_SUCCESS;
364}
365
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800366DEFUN(cfg_mgcp_rtp_net_base_port,
367 cfg_mgcp_rtp_net_base_port_cmd,
368 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100369 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800370{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800371 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800372 return CMD_SUCCESS;
373}
374
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800375ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100376 "rtp base <0-65534>",
377 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800378
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800379DEFUN(cfg_mgcp_rtp_transcoder_range,
380 cfg_mgcp_rtp_transcoder_range_cmd,
381 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100382 RTP_STR "Range of ports to use for the Transcoder\n"
383 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800384{
385 parse_range(&g_cfg->transcoder_ports, argv);
386 return CMD_SUCCESS;
387}
388
389DEFUN(cfg_mgcp_rtp_transcoder_base,
390 cfg_mgcp_rtp_transcoder_base_cmd,
391 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100392 RTP_STR "First UDP port allocated for the Transcoder side\n"
393 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800394{
395 parse_base(&g_cfg->transcoder_ports, argv);
396 return CMD_SUCCESS;
397}
398
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +0200399DEFUN(cfg_mgcp_rtp_bts_bind_ip,
400 cfg_mgcp_rtp_bts_bind_ip_cmd,
401 "rtp bts-bind-ip A.B.C.D",
402 RTP_STR "Bind endpoints facing the BTS\n" "Address to bind to\n")
403{
404 bsc_replace_string(g_cfg, &g_cfg->bts_ports.bind_addr, argv[0]);
405 return CMD_SUCCESS;
406}
407
408DEFUN(cfg_mgcp_rtp_no_bts_bind_ip,
409 cfg_mgcp_rtp_no_bts_bind_ip_cmd,
410 "no rtp bts-bind-ip",
411 NO_STR RTP_STR "Bind endpoints facing the BTS\n" "Address to bind to\n")
412{
413 talloc_free(g_cfg->bts_ports.bind_addr);
414 g_cfg->bts_ports.bind_addr = NULL;
415 return CMD_SUCCESS;
416}
417
418DEFUN(cfg_mgcp_rtp_net_bind_ip,
419 cfg_mgcp_rtp_net_bind_ip_cmd,
420 "rtp net-bind-ip A.B.C.D",
421 RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
422{
423 bsc_replace_string(g_cfg, &g_cfg->net_ports.bind_addr, argv[0]);
424 return CMD_SUCCESS;
425}
426
427DEFUN(cfg_mgcp_rtp_no_net_bind_ip,
428 cfg_mgcp_rtp_no_net_bind_ip_cmd,
429 "no rtp net-bind-ip",
430 NO_STR RTP_STR "Bind endpoints facing the Network\n" "Address to bind to\n")
431{
432 talloc_free(g_cfg->net_ports.bind_addr);
433 g_cfg->net_ports.bind_addr = NULL;
434 return CMD_SUCCESS;
435}
436
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800437DEFUN(cfg_mgcp_rtp_ip_dscp,
438 cfg_mgcp_rtp_ip_dscp_cmd,
439 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100440 RTP_STR
Holger Hans Peter Freyther9be675e2015-01-21 11:39:47 +0100441 "Apply IP_TOS to the audio stream (including Osmux)\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800442{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800443 int dscp = atoi(argv[0]);
444 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800445 return CMD_SUCCESS;
446}
447
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800448ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
449 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100450 RTP_STR
451 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800452
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200453#define FORCE_PTIME_STR "Force a fixed ptime for packets sent to the BTS"
454DEFUN(cfg_mgcp_rtp_force_ptime,
455 cfg_mgcp_rtp_force_ptime_cmd,
456 "rtp force-ptime (10|20|40)",
457 RTP_STR FORCE_PTIME_STR
Holger Hans Peter Freyther29474112014-07-04 20:11:11 +0200458 "The required ptime (packet duration) in ms\n"
459 "10 ms\n20 ms\n40 ms\n")
Jacob Erlbeck42a833e2014-04-14 10:31:47 +0200460{
461 g_cfg->bts_force_ptime = atoi(argv[0]);
462 return CMD_SUCCESS;
463}
464
465DEFUN(cfg_mgcp_no_rtp_force_ptime,
466 cfg_mgcp_no_rtp_force_ptime_cmd,
467 "no rtp force-ptime",
468 NO_STR RTP_STR FORCE_PTIME_STR)
469{
470 g_cfg->bts_force_ptime = 0;
471 return CMD_SUCCESS;
472}
473
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200474DEFUN(cfg_mgcp_sdp_fmtp_extra,
475 cfg_mgcp_sdp_fmtp_extra_cmd,
476 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100477 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
478 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200479{
480 char *txt = argv_concat(argv, argc, 0);
481 if (!txt)
482 return CMD_WARNING;
483
484 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
485 talloc_free(txt);
486 return CMD_SUCCESS;
487}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800488
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -0400489DEFUN(cfg_mgcp_allow_transcoding,
490 cfg_mgcp_allow_transcoding_cmd,
491 "allow-transcoding",
492 "Allow transcoding\n")
493{
494 g_cfg->trunk.no_audio_transcoding = 0;
495 return CMD_SUCCESS;
496}
497
498DEFUN(cfg_mgcp_no_allow_transcoding,
499 cfg_mgcp_no_allow_transcoding_cmd,
500 "no allow-transcoding",
501 NO_STR "Allow transcoding\n")
502{
503 g_cfg->trunk.no_audio_transcoding = 1;
504 return CMD_SUCCESS;
505}
506
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100507#define SDP_STR "SDP File related options\n"
508#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100509DEFUN(cfg_mgcp_sdp_payload_number,
510 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100511 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100512 SDP_STR AUDIO_STR
513 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100514{
515 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100516 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100517 return CMD_SUCCESS;
518}
519
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100520ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100521 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100522 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
523
524
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100525DEFUN(cfg_mgcp_sdp_payload_name,
526 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100527 "sdp audio-payload name NAME",
528 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100529{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100530 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100531 return CMD_SUCCESS;
532}
533
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100534ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
535 "sdp audio payload name NAME",
536 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
537
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100538DEFUN(cfg_mgcp_sdp_payload_send_ptime,
539 cfg_mgcp_sdp_payload_send_ptime_cmd,
540 "sdp audio-payload send-ptime",
541 SDP_STR AUDIO_STR
542 "Send SDP ptime (packet duration) attribute\n")
543{
544 g_cfg->trunk.audio_send_ptime = 1;
545 return CMD_SUCCESS;
546}
547
548DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
549 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
550 "no sdp audio-payload send-ptime",
551 NO_STR SDP_STR AUDIO_STR
552 "Send SDP ptime (packet duration) attribute\n")
553{
554 g_cfg->trunk.audio_send_ptime = 0;
555 return CMD_SUCCESS;
556}
557
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100558DEFUN(cfg_mgcp_sdp_payload_send_name,
559 cfg_mgcp_sdp_payload_send_name_cmd,
560 "sdp audio-payload send-name",
561 SDP_STR AUDIO_STR
562 "Send SDP rtpmap with the audio name\n")
563{
564 g_cfg->trunk.audio_send_name = 1;
565 return CMD_SUCCESS;
566}
567
568DEFUN(cfg_mgcp_no_sdp_payload_send_name,
569 cfg_mgcp_no_sdp_payload_send_name_cmd,
570 "no sdp audio-payload send-name",
571 NO_STR SDP_STR AUDIO_STR
572 "Send SDP rtpmap with the audio name\n")
573{
574 g_cfg->trunk.audio_send_name = 0;
575 return CMD_SUCCESS;
576}
577
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100578DEFUN(cfg_mgcp_loop,
579 cfg_mgcp_loop_cmd,
580 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100581 "Loop audio for all endpoints on main trunk\n"
582 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100583{
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100584 if (g_cfg->osmux) {
585 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
586 return CMD_WARNING;
587 }
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100588 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100589 return CMD_SUCCESS;
590}
591
592DEFUN(cfg_mgcp_number_endp,
593 cfg_mgcp_number_endp_cmd,
594 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100595 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100596{
597 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100598 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100599 return CMD_SUCCESS;
600}
601
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200602DEFUN(cfg_mgcp_omit_rtcp,
603 cfg_mgcp_omit_rtcp_cmd,
604 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200605 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200606{
607 g_cfg->trunk.omit_rtcp = 1;
608 return CMD_SUCCESS;
609}
610
611DEFUN(cfg_mgcp_no_omit_rtcp,
612 cfg_mgcp_no_omit_rtcp_cmd,
613 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200614 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200615{
616 g_cfg->trunk.omit_rtcp = 0;
617 return CMD_SUCCESS;
618}
619
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100620DEFUN(cfg_mgcp_patch_rtp_ssrc,
621 cfg_mgcp_patch_rtp_ssrc_cmd,
622 "rtp-patch ssrc",
623 RTP_PATCH_STR
624 "Force a fixed SSRC\n"
625 )
626{
627 g_cfg->trunk.force_constant_ssrc = 1;
628 return CMD_SUCCESS;
629}
630
631DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
632 cfg_mgcp_no_patch_rtp_ssrc_cmd,
633 "no rtp-patch ssrc",
634 NO_STR RTP_PATCH_STR
635 "Force a fixed SSRC\n"
636 )
637{
638 g_cfg->trunk.force_constant_ssrc = 0;
639 return CMD_SUCCESS;
640}
641
642DEFUN(cfg_mgcp_patch_rtp_ts,
643 cfg_mgcp_patch_rtp_ts_cmd,
644 "rtp-patch timestamp",
645 RTP_PATCH_STR
646 "Adjust RTP timestamp\n"
647 )
648{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100649 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100650 return CMD_SUCCESS;
651}
652
653DEFUN(cfg_mgcp_no_patch_rtp_ts,
654 cfg_mgcp_no_patch_rtp_ts_cmd,
655 "no rtp-patch timestamp",
656 NO_STR RTP_PATCH_STR
657 "Adjust RTP timestamp\n"
658 )
659{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100660 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100661 return CMD_SUCCESS;
662}
663
664DEFUN(cfg_mgcp_no_patch_rtp,
665 cfg_mgcp_no_patch_rtp_cmd,
666 "no rtp-patch",
667 NO_STR RTP_PATCH_STR)
668{
669 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100670 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100671 return CMD_SUCCESS;
672}
673
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100674DEFUN(cfg_mgcp_rtp_keepalive,
675 cfg_mgcp_rtp_keepalive_cmd,
676 "rtp keep-alive <1-120>",
677 RTP_STR RTP_KEEPALIVE_STR
678 "Keep alive interval in secs\n"
679 )
680{
681 mgcp_trunk_set_keepalive(&g_cfg->trunk, atoi(argv[0]));
682 return CMD_SUCCESS;
683}
684
685DEFUN(cfg_mgcp_rtp_keepalive_once,
686 cfg_mgcp_rtp_keepalive_once_cmd,
687 "rtp keep-alive once",
688 RTP_STR RTP_KEEPALIVE_STR
689 "Send dummy packet only once after CRCX/MDCX\n"
690 )
691{
692 mgcp_trunk_set_keepalive(&g_cfg->trunk, MGCP_KEEPALIVE_ONCE);
693 return CMD_SUCCESS;
694}
695
696DEFUN(cfg_mgcp_no_rtp_keepalive,
697 cfg_mgcp_no_rtp_keepalive_cmd,
698 "no rtp keep-alive",
699 NO_STR RTP_STR RTP_KEEPALIVE_STR
700 )
701{
702 mgcp_trunk_set_keepalive(&g_cfg->trunk, 0);
703 return CMD_SUCCESS;
704}
705
706
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100707
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100708#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200709DEFUN(cfg_mgcp_agent_addr,
710 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100711 "call-agent ip A.B.C.D",
712 CALL_AGENT_STR IP_STR
713 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200714{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200715 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200716 return CMD_SUCCESS;
717}
718
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100719ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
720 "call agent ip A.B.C.D",
721 CALL_AGENT_STR CALL_AGENT_STR IP_STR
722 "IPv4 Address of the callagent\n")
723
724
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800725DEFUN(cfg_mgcp_transcoder,
726 cfg_mgcp_transcoder_cmd,
727 "transcoder-mgw A.B.C.D",
728 "Use a MGW to detranscoder RTP\n"
729 "The IP address of the MGW")
730{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200731 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800732 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
733
734 return CMD_SUCCESS;
735}
736
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100737DEFUN(cfg_mgcp_no_transcoder,
738 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100739 "no transcoder-mgw",
740 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100741{
742 if (g_cfg->transcoder_ip) {
743 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
744 talloc_free(g_cfg->transcoder_ip);
745 g_cfg->transcoder_ip = NULL;
746 }
747
748 return CMD_SUCCESS;
749}
750
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800751DEFUN(cfg_mgcp_transcoder_remote_base,
752 cfg_mgcp_transcoder_remote_base_cmd,
753 "transcoder-remote-base <0-65534>",
754 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
755{
756 g_cfg->transcoder_remote_base = atoi(argv[0]);
757 return CMD_SUCCESS;
758}
759
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100760DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
761 "trunk <1-64>",
762 "Configure a SS7 trunk\n" "Trunk Nr\n")
763{
764 struct mgcp_trunk_config *trunk;
765 int index = atoi(argv[0]);
766
767 trunk = mgcp_trunk_num(g_cfg, index);
768 if (!trunk)
769 trunk = mgcp_trunk_alloc(g_cfg, index);
770
771 if (!trunk) {
772 vty_out(vty, "%%Unable to allocate trunk %u.%s",
773 index, VTY_NEWLINE);
774 return CMD_WARNING;
775 }
776
777 vty->node = TRUNK_NODE;
778 vty->index = trunk;
779 return CMD_SUCCESS;
780}
781
782static int config_write_trunk(struct vty *vty)
783{
784 struct mgcp_trunk_config *trunk;
785
786 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
787 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100788 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100789 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100790 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100791 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100792 vty_out(vty, " %ssdp audio-payload send-ptime%s",
793 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100794 vty_out(vty, " %ssdp audio-payload send-name%s",
795 trunk->audio_send_name ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +0100796
797 if (trunk->keepalive_interval == MGCP_KEEPALIVE_ONCE)
798 vty_out(vty, " rtp keep-alive once%s", VTY_NEWLINE);
799 else if (trunk->keepalive_interval)
800 vty_out(vty, " rtp keep-alive %d%s",
801 trunk->keepalive_interval, VTY_NEWLINE);
802 else
803 vty_out(vty, " no rtp keep-alive%s", VTY_NEWLINE);
804
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100805 vty_out(vty, " loop %d%s",
806 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200807 if (trunk->omit_rtcp)
808 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
809 else
810 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100811 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100812 vty_out(vty, " %srtp-patch ssrc%s",
813 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
814 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100815 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100816 } else
817 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200818 if (trunk->audio_fmtp_extra)
819 vty_out(vty, " sdp audio fmtp-extra %s%s",
820 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -0400821 vty_out(vty, " %sallow-transcoding%s",
822 trunk->no_audio_transcoding ? "no " : "", VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100823 }
824
825 return CMD_SUCCESS;
826}
827
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200828DEFUN(cfg_trunk_sdp_fmtp_extra,
829 cfg_trunk_sdp_fmtp_extra_cmd,
830 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100831 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
832 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200833{
834 struct mgcp_trunk_config *trunk = vty->index;
835 char *txt = argv_concat(argv, argc, 0);
836 if (!txt)
837 return CMD_WARNING;
838
839 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
840 talloc_free(txt);
841 return CMD_SUCCESS;
842}
843
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100844DEFUN(cfg_trunk_payload_number,
845 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100846 "sdp audio-payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100847 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100848{
849 struct mgcp_trunk_config *trunk = vty->index;
850 unsigned int payload = atoi(argv[0]);
851
852 trunk->audio_payload = payload;
853 return CMD_SUCCESS;
854}
855
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100856ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
Holger Hans Peter Freytherf50f7042014-03-14 16:55:12 +0100857 "sdp audio payload number <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100858 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
859
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100860DEFUN(cfg_trunk_payload_name,
861 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100862 "sdp audio-payload name NAME",
863 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100864{
865 struct mgcp_trunk_config *trunk = vty->index;
866
867 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
868 return CMD_SUCCESS;
869}
870
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100871ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
872 "sdp audio payload name NAME",
873 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
874
875
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100876DEFUN(cfg_trunk_loop,
877 cfg_trunk_loop_cmd,
878 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100879 "Loop audio for all endpoints on this trunk\n"
880 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100881{
882 struct mgcp_trunk_config *trunk = vty->index;
883
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +0100884 if (g_cfg->osmux) {
885 vty_out(vty, "Cannot use `loop' with `osmux'.%s", VTY_NEWLINE);
886 return CMD_WARNING;
887 }
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100888 trunk->audio_loop = atoi(argv[0]);
889 return CMD_SUCCESS;
890}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800891
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100892DEFUN(cfg_trunk_sdp_payload_send_ptime,
893 cfg_trunk_sdp_payload_send_ptime_cmd,
894 "sdp audio-payload send-ptime",
895 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 = 1;
900 return CMD_SUCCESS;
901}
902
903DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
904 cfg_trunk_no_sdp_payload_send_ptime_cmd,
905 "no sdp audio-payload send-ptime",
906 NO_STR SDP_STR AUDIO_STR
907 "Send SDP ptime (packet duration) attribute\n")
908{
909 struct mgcp_trunk_config *trunk = vty->index;
910 trunk->audio_send_ptime = 0;
911 return CMD_SUCCESS;
912}
913
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +0100914DEFUN(cfg_trunk_sdp_payload_send_name,
915 cfg_trunk_sdp_payload_send_name_cmd,
916 "sdp audio-payload send-name",
917 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 = 1;
922 return CMD_SUCCESS;
923}
924
925DEFUN(cfg_trunk_no_sdp_payload_send_name,
926 cfg_trunk_no_sdp_payload_send_name_cmd,
927 "no sdp audio-payload send-name",
928 NO_STR SDP_STR AUDIO_STR
929 "Send SDP rtpmap with the audio name\n")
930{
931 struct mgcp_trunk_config *trunk = vty->index;
932 trunk->audio_send_name = 0;
933 return CMD_SUCCESS;
934}
935
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200936DEFUN(cfg_trunk_omit_rtcp,
937 cfg_trunk_omit_rtcp_cmd,
938 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200939 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200940{
941 struct mgcp_trunk_config *trunk = vty->index;
942 trunk->omit_rtcp = 1;
943 return CMD_SUCCESS;
944}
945
946DEFUN(cfg_trunk_no_omit_rtcp,
947 cfg_trunk_no_omit_rtcp_cmd,
948 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200949 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200950{
951 struct mgcp_trunk_config *trunk = vty->index;
952 trunk->omit_rtcp = 0;
953 return CMD_SUCCESS;
954}
955
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100956DEFUN(cfg_trunk_patch_rtp_ssrc,
957 cfg_trunk_patch_rtp_ssrc_cmd,
958 "rtp-patch ssrc",
959 RTP_PATCH_STR
960 "Force a fixed SSRC\n"
961 )
962{
963 struct mgcp_trunk_config *trunk = vty->index;
964 trunk->force_constant_ssrc = 1;
965 return CMD_SUCCESS;
966}
967
968DEFUN(cfg_trunk_no_patch_rtp_ssrc,
969 cfg_trunk_no_patch_rtp_ssrc_cmd,
970 "no rtp-patch ssrc",
971 NO_STR RTP_PATCH_STR
972 "Force a fixed SSRC\n"
973 )
974{
975 struct mgcp_trunk_config *trunk = vty->index;
976 trunk->force_constant_ssrc = 0;
977 return CMD_SUCCESS;
978}
979
980DEFUN(cfg_trunk_patch_rtp_ts,
981 cfg_trunk_patch_rtp_ts_cmd,
982 "rtp-patch timestamp",
983 RTP_PATCH_STR
984 "Adjust RTP timestamp\n"
985 )
986{
987 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100988 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100989 return CMD_SUCCESS;
990}
991
992DEFUN(cfg_trunk_no_patch_rtp_ts,
993 cfg_trunk_no_patch_rtp_ts_cmd,
994 "no rtp-patch timestamp",
995 NO_STR RTP_PATCH_STR
996 "Adjust RTP timestamp\n"
997 )
998{
999 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +01001000 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001001 return CMD_SUCCESS;
1002}
1003
1004DEFUN(cfg_trunk_no_patch_rtp,
1005 cfg_trunk_no_patch_rtp_cmd,
1006 "no rtp-patch",
1007 NO_STR RTP_PATCH_STR)
1008{
1009 struct mgcp_trunk_config *trunk = vty->index;
1010 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +01001011 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001012 return CMD_SUCCESS;
1013}
1014
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001015DEFUN(cfg_trunk_rtp_keepalive,
1016 cfg_trunk_rtp_keepalive_cmd,
1017 "rtp keep-alive <1-120>",
1018 RTP_STR RTP_KEEPALIVE_STR
1019 "Keep-alive interval in secs\n"
1020 )
1021{
1022 struct mgcp_trunk_config *trunk = vty->index;
1023 mgcp_trunk_set_keepalive(trunk, atoi(argv[0]));
1024 return CMD_SUCCESS;
1025}
1026
1027DEFUN(cfg_trunk_rtp_keepalive_once,
1028 cfg_trunk_rtp_keepalive_once_cmd,
1029 "rtp keep-alive once",
1030 RTP_STR RTP_KEEPALIVE_STR
1031 "Send dummy packet only once after CRCX/MDCX\n"
1032 )
1033{
1034 struct mgcp_trunk_config *trunk = vty->index;
1035 mgcp_trunk_set_keepalive(trunk, MGCP_KEEPALIVE_ONCE);
1036 return CMD_SUCCESS;
1037}
1038
1039DEFUN(cfg_trunk_no_rtp_keepalive,
1040 cfg_trunk_no_rtp_keepalive_cmd,
1041 "no rtp keep-alive",
1042 NO_STR RTP_STR RTP_KEEPALIVE_STR
1043 )
1044{
1045 struct mgcp_trunk_config *trunk = vty->index;
1046 mgcp_trunk_set_keepalive(trunk, 0);
1047 return CMD_SUCCESS;
1048}
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001049
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001050DEFUN(cfg_trunk_allow_transcoding,
1051 cfg_trunk_allow_transcoding_cmd,
1052 "allow-transcoding",
1053 "Allow transcoding\n")
1054{
1055 struct mgcp_trunk_config *trunk = vty->index;
1056 trunk->no_audio_transcoding = 0;
1057 return CMD_SUCCESS;
1058}
1059
1060DEFUN(cfg_trunk_no_allow_transcoding,
1061 cfg_trunk_no_allow_transcoding_cmd,
1062 "no allow-transcoding",
1063 NO_STR "Allow transcoding\n")
1064{
1065 struct mgcp_trunk_config *trunk = vty->index;
1066 trunk->no_audio_transcoding = 1;
1067 return CMD_SUCCESS;
1068}
1069
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001070DEFUN(loop_endp,
1071 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001072 "loop-endpoint <0-64> NAME (0|1)",
1073 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +08001074 "The name in hex of the endpoint\n" "Disable the loop\n" "Enable the loop\n")
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001075{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001076 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001077 struct mgcp_endpoint *endp;
1078
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001079 trunk = find_trunk(g_cfg, atoi(argv[0]));
1080 if (!trunk) {
1081 vty_out(vty, "%%Trunk %d not found in the config.%s",
1082 atoi(argv[0]), VTY_NEWLINE);
1083 return CMD_WARNING;
1084 }
1085
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001086 if (!trunk->endpoints) {
1087 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1088 trunk->trunk_nr, VTY_NEWLINE);
1089 return CMD_WARNING;
1090 }
1091
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001092 int endp_no = strtoul(argv[1], NULL, 16);
1093 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001094 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001095 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001096 return CMD_WARNING;
1097 }
1098
1099
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001100 endp = &trunk->endpoints[endp_no];
1101 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001102
1103 if (loop)
1104 endp->conn_mode = MGCP_CONN_LOOPBACK;
1105 else
1106 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001107
1108 /* Handle it like a MDCX, switch on SSRC patching if enabled */
1109 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
1110 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001111
1112 return CMD_SUCCESS;
1113}
1114
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001115DEFUN(tap_call,
1116 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001117 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
1118 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001119 "The endpoint in hex\n"
1120 "Forward the data coming from the bts\n"
1121 "Forward the data coming from the bts leaving to the network\n"
1122 "Forward the data coming from the net\n"
1123 "Forward the data coming from the net leaving to the bts\n"
1124 "destination IP of the data\n" "destination port\n")
1125{
1126 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001127 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001128 struct mgcp_endpoint *endp;
1129 int port = 0;
1130
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001131 trunk = find_trunk(g_cfg, atoi(argv[0]));
1132 if (!trunk) {
1133 vty_out(vty, "%%Trunk %d not found in the config.%s",
1134 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001135 return CMD_WARNING;
1136 }
1137
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001138 if (!trunk->endpoints) {
1139 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1140 trunk->trunk_nr, VTY_NEWLINE);
1141 return CMD_WARNING;
1142 }
1143
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001144 int endp_no = strtoul(argv[1], NULL, 16);
1145 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1146 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1147 argv[1], endp_no, VTY_NEWLINE);
1148 return CMD_WARNING;
1149 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001150
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001151 endp = &trunk->endpoints[endp_no];
1152
1153 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001154 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001155 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001156 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001157 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001158 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001159 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001160 port = MGCP_TAP_NET_OUT;
1161 } else {
1162 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
1163 return CMD_WARNING;
1164 }
1165
1166 tap = &endp->taps[port];
1167 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001168 inet_aton(argv[3], &tap->forward.sin_addr);
1169 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +08001170 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001171 return CMD_SUCCESS;
1172}
1173
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001174DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001175 "free-endpoint <0-64> NUMBER",
1176 "Free the given endpoint\n" "Trunk number\n"
1177 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001178{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001179 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001180 struct mgcp_endpoint *endp;
1181
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001182 trunk = find_trunk(g_cfg, atoi(argv[0]));
1183 if (!trunk) {
1184 vty_out(vty, "%%Trunk %d not found in the config.%s",
1185 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001186 return CMD_WARNING;
1187 }
1188
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +01001189 if (!trunk->endpoints) {
1190 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1191 trunk->trunk_nr, VTY_NEWLINE);
1192 return CMD_WARNING;
1193 }
1194
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +01001195 int endp_no = strtoul(argv[1], NULL, 16);
1196 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1197 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1198 argv[1], endp_no, VTY_NEWLINE);
1199 return CMD_WARNING;
1200 }
1201
1202 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freythercb6ad702014-07-22 15:00:52 +02001203 mgcp_release_endp(endp);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001204 return CMD_SUCCESS;
1205}
1206
Harald Welte6a857052012-01-27 00:41:39 +01001207DEFUN(reset_endp, reset_endp_cmd,
1208 "reset-endpoint <0-64> NUMBER",
1209 "Reset the given endpoint\n" "Trunk number\n"
1210 "Endpoint number in hex.\n")
1211{
1212 struct mgcp_trunk_config *trunk;
1213 struct mgcp_endpoint *endp;
1214 int endp_no, rc;
1215
1216 trunk = find_trunk(g_cfg, atoi(argv[0]));
1217 if (!trunk) {
1218 vty_out(vty, "%%Trunk %d not found in the config.%s",
1219 atoi(argv[0]), VTY_NEWLINE);
1220 return CMD_WARNING;
1221 }
1222
1223 if (!trunk->endpoints) {
1224 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
1225 trunk->trunk_nr, VTY_NEWLINE);
1226 return CMD_WARNING;
1227 }
1228
1229 endp_no = strtoul(argv[1], NULL, 16);
1230 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
1231 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
1232 argv[1], endp_no, VTY_NEWLINE);
1233 return CMD_WARNING;
1234 }
1235
1236 endp = &trunk->endpoints[endp_no];
1237 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
1238 if (rc < 0) {
1239 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
1240 return CMD_WARNING;
1241 }
1242 return CMD_SUCCESS;
1243}
1244
1245DEFUN(reset_all_endp, reset_all_endp_cmd,
1246 "reset-all-endpoints",
1247 "Reset all endpoints\n")
1248{
1249 int rc;
1250
1251 rc = mgcp_send_reset_all(g_cfg);
1252 if (rc < 0) {
1253 vty_out(vty, "Error %d during endpoint reset.%s",
1254 rc, VTY_NEWLINE);
1255 return CMD_WARNING;
1256 }
1257 return CMD_SUCCESS;
1258}
1259
Holger Hans Peter Freythercc84c952014-06-03 13:36:42 +02001260#define OSMUX_STR "RTP multiplexing\n"
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001261DEFUN(cfg_mgcp_osmux,
1262 cfg_mgcp_osmux_cmd,
Holger Hans Peter Freyther6598ded2015-10-02 17:38:27 +02001263 "osmux (on|off|only)",
1264 OSMUX_STR "Enable OSMUX\n" "Disable OSMUX\n" "Only use OSMUX\n")
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001265{
Holger Hans Peter Freyther6598ded2015-10-02 17:38:27 +02001266 if (strcmp(argv[0], "off") == 0) {
1267 g_cfg->osmux = OSMUX_USAGE_OFF;
1268 return CMD_SUCCESS;
1269 }
1270
1271 if (strcmp(argv[0], "on") == 0)
1272 g_cfg->osmux = OSMUX_USAGE_ON;
1273 else if (strcmp(argv[0], "only") == 0)
1274 g_cfg->osmux = OSMUX_USAGE_ONLY;
1275
1276 if (g_cfg->trunk.audio_loop) {
1277 vty_out(vty, "Cannot use `loop' with `osmux'.%s",
1278 VTY_NEWLINE);
1279 return CMD_WARNING;
1280 }
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001281
1282 return CMD_SUCCESS;
1283}
1284
1285DEFUN(cfg_mgcp_osmux_batch_factor,
1286 cfg_mgcp_osmux_batch_factor_cmd,
Pablo Neira Ayusoc20a6612014-08-29 16:08:45 +02001287 "osmux batch-factor <1-8>",
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001288 OSMUX_STR "Batching factor\n" "Number of messages in the batch\n")
1289{
1290 g_cfg->osmux_batch = atoi(argv[0]);
1291 return CMD_SUCCESS;
1292}
Harald Welte6a857052012-01-27 00:41:39 +01001293
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +02001294DEFUN(cfg_mgcp_osmux_batch_size,
1295 cfg_mgcp_osmux_batch_size_cmd,
1296 "osmux batch-size <1-65535>",
1297 OSMUX_STR "batch size\n" "Batch size in bytes\n")
1298{
1299 g_cfg->osmux_batch_size = atoi(argv[0]);
1300 return CMD_SUCCESS;
1301}
1302
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001303DEFUN(cfg_mgcp_osmux_port,
1304 cfg_mgcp_osmux_port_cmd,
1305 "osmux port <1-65535>",
1306 OSMUX_STR "port\n" "UDP port\n")
1307{
1308 g_cfg->osmux_port = atoi(argv[0]);
1309 return CMD_SUCCESS;
1310}
1311
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +02001312DEFUN(cfg_mgcp_osmux_dummy,
1313 cfg_mgcp_osmux_dummy_cmd,
1314 "osmux dummy (on|off)",
Pablo Neira Ayusod7215792015-09-07 11:22:04 +02001315 OSMUX_STR "Dummy padding\n" "Enable dummy padding\n" "Disable dummy padding\n")
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +02001316{
1317 if (strcmp(argv[0], "on") == 0)
1318 g_cfg->osmux_dummy = 1;
1319 else if (strcmp(argv[0], "off") == 0)
1320 g_cfg->osmux_dummy = 0;
1321
1322 return CMD_SUCCESS;
1323}
1324
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001325int mgcp_vty_init(void)
1326{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +08001327 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001328 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +08001329 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +08001330 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +01001331 install_element(ENABLE_NODE, &reset_endp_cmd);
1332 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001333
1334 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
1335 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +08001336
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001337 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001338 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
1339 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
1340 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
1341 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
1342 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
1343 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +08001344 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +08001345 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001346 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +02001347 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_bind_ip_cmd);
1348 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_bts_bind_ip_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +08001349 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freytherc390ae82015-08-20 15:15:50 +02001350 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_bind_ip_cmd);
1351 install_element(MGCP_NODE, &cfg_mgcp_rtp_no_net_bind_ip_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +08001352 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
1353 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001354 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001355 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Jacob Erlbeck42a833e2014-04-14 10:31:47 +02001356 install_element(MGCP_NODE, &cfg_mgcp_rtp_force_ptime_cmd);
1357 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_force_ptime_cmd);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001358 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_cmd);
1359 install_element(MGCP_NODE, &cfg_mgcp_rtp_keepalive_once_cmd);
1360 install_element(MGCP_NODE, &cfg_mgcp_no_rtp_keepalive_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001361 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001362 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001363 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001364 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001365 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001366 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1367 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001368 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1369 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001370 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1371 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001372 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1373 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001374 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1375 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1376 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1377 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1378 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001379 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001380 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1381 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +01001382 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_name_cmd);
1383 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_name_cmd);
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001384 install_element(MGCP_NODE, &cfg_mgcp_osmux_cmd);
1385 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_factor_cmd);
Pablo Neira Ayuso03ab79a2014-08-29 12:30:38 +02001386 install_element(MGCP_NODE, &cfg_mgcp_osmux_batch_size_cmd);
Pablo Neira Ayuso0fe78d32014-08-28 16:43:38 +02001387 install_element(MGCP_NODE, &cfg_mgcp_osmux_port_cmd);
Pablo Neira Ayuso57e95a22015-07-17 21:56:23 +02001388 install_element(MGCP_NODE, &cfg_mgcp_osmux_dummy_cmd);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001389 install_element(MGCP_NODE, &cfg_mgcp_allow_transcoding_cmd);
1390 install_element(MGCP_NODE, &cfg_mgcp_no_allow_transcoding_cmd);
1391
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001392
1393 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1394 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001395 vty_install_default(TRUNK_NODE);
Jacob Erlbeck075a9eb2013-12-19 18:53:07 +01001396 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_cmd);
1397 install_element(TRUNK_NODE, &cfg_trunk_rtp_keepalive_once_cmd);
1398 install_element(TRUNK_NODE, &cfg_trunk_no_rtp_keepalive_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001399 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1400 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001401 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1402 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001403 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001404 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1405 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001406 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1407 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1408 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1409 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1410 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001411 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001412 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1413 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther619b0142014-11-19 16:04:45 +01001414 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_name_cmd);
1415 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_name_cmd);
Holger Hans Peter Freythercb43a9a2015-04-24 16:03:55 -04001416 install_element(TRUNK_NODE, &cfg_trunk_allow_transcoding_cmd);
1417 install_element(TRUNK_NODE, &cfg_trunk_no_allow_transcoding_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001418
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001419 return 0;
1420}
1421
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001422static int allocate_trunk(struct mgcp_trunk_config *trunk)
1423{
1424 int i;
1425 struct mgcp_config *cfg = trunk->cfg;
1426
1427 if (mgcp_endpoints_allocate(trunk) != 0) {
1428 LOGP(DMGCP, LOGL_ERROR,
1429 "Failed to allocate %d endpoints on trunk %d.\n",
1430 trunk->number_endpoints, trunk->trunk_nr);
1431 return -1;
1432 }
1433
1434 /* early bind */
1435 for (i = 1; i < trunk->number_endpoints; ++i) {
1436 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001437
1438 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001439 cfg->last_bts_port += 2;
1440 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1441 LOGP(DMGCP, LOGL_FATAL,
1442 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001443 return -1;
1444 }
1445 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1446 }
1447
1448 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001449 cfg->last_net_port += 2;
1450 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1451 LOGP(DMGCP, LOGL_FATAL,
1452 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001453 return -1;
1454 }
1455 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1456 }
1457
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001458 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1459 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001460 int rtp_port;
1461
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001462 /* network side */
1463 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1464 cfg->transcoder_ports.base_port);
1465 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1466 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1467 return -1;
1468 }
1469 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1470
1471 /* bts side */
1472 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1473 cfg->transcoder_ports.base_port);
1474 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1475 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1476 return -1;
1477 }
1478 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1479 }
1480 }
1481
1482 return 0;
1483}
1484
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001485int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1486 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001487{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001488 int rc;
1489 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001490
Pablo Neira Ayuso308d5f82014-08-29 12:20:17 +02001491 cfg->osmux_port = OSMUX_PORT;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001492 cfg->osmux_batch = 4;
Pablo Neira Ayuso08726e22014-08-29 15:31:55 +02001493 cfg->osmux_batch_size = OSMUX_BATCH_DEFAULT_MAX;
Pablo Neira Ayusocab6e752014-02-05 18:56:17 +01001494
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001495 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001496 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001497 if (rc < 0) {
1498 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1499 return rc;
1500 }
1501
1502
1503 if (!g_cfg->bts_ip)
1504 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1505
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001506 if (!g_cfg->source_addr) {
1507 fprintf(stderr, "You need to specify a bind address.\n");
1508 return -1;
1509 }
1510
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001511 /* initialize the last ports */
1512 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1513 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1514
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001515 if (allocate_trunk(&g_cfg->trunk) != 0) {
1516 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001517 return -1;
1518 }
1519
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001520 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1521 if (allocate_trunk(trunk) != 0) {
1522 LOGP(DMGCP, LOGL_ERROR,
1523 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1524 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001525 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001526 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001527 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001528
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001529 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001530}
1531