blob: 3f1ebeb2caa85bb80e502048b2063dbbd37380c8 [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 Freyther88ad7722011-02-28 00:56:17 +01005 * (C) 2009-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
6 * (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"
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +020035
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010036static struct mgcp_config *g_cfg = NULL;
37
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010038static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010039{
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010040 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010041
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010042 if (nr == 0)
43 trunk = &cfg->trunk;
44 else
45 trunk = mgcp_trunk_num(cfg, nr);
46
47 return trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010048}
49
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010050/*
51 * vty code for mgcp below
52 */
53struct cmd_node mgcp_node = {
54 MGCP_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020055 "%s(config-mgcp)# ",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010056 1,
57};
58
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010059struct cmd_node trunk_node = {
60 TRUNK_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020061 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010062 1,
63};
64
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010065static int config_write_mgcp(struct vty *vty)
66{
67 vty_out(vty, "mgcp%s", VTY_NEWLINE);
68 if (g_cfg->local_ip)
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020069 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
70 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010071 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
72 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
73 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080074
75 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
76 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 +080077 else
78 vty_out(vty, " rtp bts-range %u %u%s",
79 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
80
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080081 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
82 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 +080083 else
84 vty_out(vty, " rtp net-range %u %u%s",
85 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
86
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +080087 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +020088 if (g_cfg->trunk.omit_rtcp)
89 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
90 else
91 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +010092 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +010093 vty_out(vty, " %srtp-patch ssrc%s",
94 g_cfg->trunk.force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
95 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +010096 g_cfg->trunk.force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +010097 } else
98 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010099 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100100 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100101 g_cfg->trunk.audio_payload, VTY_NEWLINE);
102 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100103 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100104 g_cfg->trunk.audio_name, VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200105 if (g_cfg->trunk.audio_fmtp_extra)
106 vty_out(vty, " sdp audio fmtp-extra %s%s",
107 g_cfg->trunk.audio_fmtp_extra, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100108 vty_out(vty, " %ssdp audio-payload send-ptime%s",
109 g_cfg->trunk.audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100110 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
111 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200112 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100113 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800114 if (g_cfg->transcoder_ip)
115 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100116
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800117 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
118 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
119 else
120 vty_out(vty, " rtp transcoder-range %u %u%s",
121 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800122 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800123
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100124 return CMD_SUCCESS;
125}
126
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100127static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int verbose)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100128{
129 int i;
130
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100131 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
132 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
133 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
134
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100135 if (!cfg->endpoints) {
136 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
137 return;
138 }
139
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100140 for (i = 1; i < cfg->number_endpoints; ++i) {
141 struct mgcp_endpoint *endp = &cfg->endpoints[i];
142 vty_out(vty,
143 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200144 "traffic received bts: %u remote: %u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100145 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800146 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
147 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
148 inet_ntoa(endp->bts_end.addr),
Holger Hans Peter Freyther2a60a112012-09-12 11:30:41 +0200149 endp->bts_end.packets, endp->net_end.packets,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100150 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200151 VTY_NEWLINE);
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100152
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100153 if (verbose) {
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100154 vty_out(vty,
155 " Timestamp Errs: BTS %d->%d, Net %d->%d%s",
156 endp->bts_state.in_stream.err_ts_counter,
157 endp->bts_state.out_stream.err_ts_counter,
158 endp->net_state.in_stream.err_ts_counter,
159 endp->net_state.out_stream.err_ts_counter,
160 VTY_NEWLINE);
Jacob Erlbeck0970bab2013-12-19 12:13:32 +0100161 vty_out(vty,
162 " Dropped Packets: Net->BTS %d, BTS->Net %d%s",
163 endp->bts_end.dropped_packets,
164 endp->net_end.dropped_packets,
165 VTY_NEWLINE);
166 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100167 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100168}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100169
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100170DEFUN(show_mcgp, show_mgcp_cmd,
171 "show mgcp [stats]",
172 SHOW_STR
173 "Display information about the MGCP Media Gateway\n"
174 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100175{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100176 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100177 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100178
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100179 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100180
181 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100182 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100183
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100184 return CMD_SUCCESS;
185}
186
187DEFUN(cfg_mgcp,
188 cfg_mgcp_cmd,
189 "mgcp",
190 "Configure the MGCP")
191{
192 vty->node = MGCP_NODE;
193 return CMD_SUCCESS;
194}
195
196DEFUN(cfg_mgcp_local_ip,
197 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800198 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100199 "Local options for the SDP record\n"
200 IP_STR
201 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100202{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200203 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100204 return CMD_SUCCESS;
205}
206
207DEFUN(cfg_mgcp_bts_ip,
208 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800209 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100210 "BTS Audio source/destination options\n"
211 IP_STR
212 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100213{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200214 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100215 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
216 return CMD_SUCCESS;
217}
218
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100219#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100220DEFUN(cfg_mgcp_bind_ip,
221 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800222 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100223 BIND_STR
224 IP_STR
225 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100226{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200227 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100228 return CMD_SUCCESS;
229}
230
231DEFUN(cfg_mgcp_bind_port,
232 cfg_mgcp_bind_port_cmd,
233 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100234 BIND_STR
235 "Port information\n"
236 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100237{
238 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100239 g_cfg->source_port = port;
240 return CMD_SUCCESS;
241}
242
243DEFUN(cfg_mgcp_bind_early,
244 cfg_mgcp_bind_early_cmd,
245 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100246 BIND_STR
247 "Bind local ports on start up\n"
248 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100249{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800250 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
251 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100252}
253
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800254static void parse_base(struct mgcp_port_range *range, const char **argv)
255{
256 unsigned int port = atoi(argv[0]);
257 range->mode = PORT_ALLOC_STATIC;
258 range->base_port = port;
259}
260
261static void parse_range(struct mgcp_port_range *range, const char **argv)
262{
263 range->mode = PORT_ALLOC_DYNAMIC;
264 range->range_start = atoi(argv[0]);
265 range->range_end = atoi(argv[1]);
266 range->last_port = g_cfg->bts_ports.range_start;
267}
268
269
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100270#define RTP_STR "RTP configuration\n"
271#define BTS_START_STR "First UDP port allocated for the BTS side\n"
272#define NET_START_STR "First UDP port allocated for the NET side\n"
273#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800274DEFUN(cfg_mgcp_rtp_bts_base_port,
275 cfg_mgcp_rtp_bts_base_port_cmd,
276 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100277 RTP_STR
278 BTS_START_STR
279 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100280{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800281 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100282 return CMD_SUCCESS;
283}
284
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100285#define RANGE_START_STR "Start of the range of ports\n"
286#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800287DEFUN(cfg_mgcp_rtp_bts_range,
288 cfg_mgcp_rtp_bts_range_cmd,
289 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100290 RTP_STR "Range of ports to use for the BTS side\n"
291 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800292{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800293 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800294 return CMD_SUCCESS;
295}
296
297DEFUN(cfg_mgcp_rtp_net_range,
298 cfg_mgcp_rtp_net_range_cmd,
299 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100300 RTP_STR "Range of ports to use for the NET side\n"
301 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800302{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800303 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800304 return CMD_SUCCESS;
305}
306
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800307DEFUN(cfg_mgcp_rtp_net_base_port,
308 cfg_mgcp_rtp_net_base_port_cmd,
309 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100310 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800311{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800312 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800313 return CMD_SUCCESS;
314}
315
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800316ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100317 "rtp base <0-65534>",
318 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800319
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800320DEFUN(cfg_mgcp_rtp_transcoder_range,
321 cfg_mgcp_rtp_transcoder_range_cmd,
322 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100323 RTP_STR "Range of ports to use for the Transcoder\n"
324 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800325{
326 parse_range(&g_cfg->transcoder_ports, argv);
327 return CMD_SUCCESS;
328}
329
330DEFUN(cfg_mgcp_rtp_transcoder_base,
331 cfg_mgcp_rtp_transcoder_base_cmd,
332 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100333 RTP_STR "First UDP port allocated for the Transcoder side\n"
334 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800335{
336 parse_base(&g_cfg->transcoder_ports, argv);
337 return CMD_SUCCESS;
338}
339
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800340DEFUN(cfg_mgcp_rtp_ip_dscp,
341 cfg_mgcp_rtp_ip_dscp_cmd,
342 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100343 RTP_STR
344 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800345{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800346 int dscp = atoi(argv[0]);
347 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800348 return CMD_SUCCESS;
349}
350
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800351ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
352 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100353 RTP_STR
354 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800355
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200356DEFUN(cfg_mgcp_sdp_fmtp_extra,
357 cfg_mgcp_sdp_fmtp_extra_cmd,
358 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100359 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
360 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200361{
362 char *txt = argv_concat(argv, argc, 0);
363 if (!txt)
364 return CMD_WARNING;
365
366 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
367 talloc_free(txt);
368 return CMD_SUCCESS;
369}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800370
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100371#define SDP_STR "SDP File related options\n"
372#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100373DEFUN(cfg_mgcp_sdp_payload_number,
374 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100375 "sdp audio-payload number <1-255>",
376 SDP_STR AUDIO_STR
377 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100378{
379 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100380 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100381 return CMD_SUCCESS;
382}
383
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100384ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
385 "sdp audio payload number <1-255>",
386 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
387
388
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100389DEFUN(cfg_mgcp_sdp_payload_name,
390 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100391 "sdp audio-payload name NAME",
392 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100393{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100394 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100395 return CMD_SUCCESS;
396}
397
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100398ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
399 "sdp audio payload name NAME",
400 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
401
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100402DEFUN(cfg_mgcp_sdp_payload_send_ptime,
403 cfg_mgcp_sdp_payload_send_ptime_cmd,
404 "sdp audio-payload send-ptime",
405 SDP_STR AUDIO_STR
406 "Send SDP ptime (packet duration) attribute\n")
407{
408 g_cfg->trunk.audio_send_ptime = 1;
409 return CMD_SUCCESS;
410}
411
412DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
413 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
414 "no sdp audio-payload send-ptime",
415 NO_STR SDP_STR AUDIO_STR
416 "Send SDP ptime (packet duration) attribute\n")
417{
418 g_cfg->trunk.audio_send_ptime = 0;
419 return CMD_SUCCESS;
420}
421
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100422DEFUN(cfg_mgcp_loop,
423 cfg_mgcp_loop_cmd,
424 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100425 "Loop audio for all endpoints on main trunk\n"
426 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100427{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100428 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100429 return CMD_SUCCESS;
430}
431
432DEFUN(cfg_mgcp_number_endp,
433 cfg_mgcp_number_endp_cmd,
434 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100435 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100436{
437 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100438 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100439 return CMD_SUCCESS;
440}
441
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200442DEFUN(cfg_mgcp_omit_rtcp,
443 cfg_mgcp_omit_rtcp_cmd,
444 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200445 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200446{
447 g_cfg->trunk.omit_rtcp = 1;
448 return CMD_SUCCESS;
449}
450
451DEFUN(cfg_mgcp_no_omit_rtcp,
452 cfg_mgcp_no_omit_rtcp_cmd,
453 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200454 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200455{
456 g_cfg->trunk.omit_rtcp = 0;
457 return CMD_SUCCESS;
458}
459
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100460DEFUN(cfg_mgcp_patch_rtp_ssrc,
461 cfg_mgcp_patch_rtp_ssrc_cmd,
462 "rtp-patch ssrc",
463 RTP_PATCH_STR
464 "Force a fixed SSRC\n"
465 )
466{
467 g_cfg->trunk.force_constant_ssrc = 1;
468 return CMD_SUCCESS;
469}
470
471DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
472 cfg_mgcp_no_patch_rtp_ssrc_cmd,
473 "no rtp-patch ssrc",
474 NO_STR RTP_PATCH_STR
475 "Force a fixed SSRC\n"
476 )
477{
478 g_cfg->trunk.force_constant_ssrc = 0;
479 return CMD_SUCCESS;
480}
481
482DEFUN(cfg_mgcp_patch_rtp_ts,
483 cfg_mgcp_patch_rtp_ts_cmd,
484 "rtp-patch timestamp",
485 RTP_PATCH_STR
486 "Adjust RTP timestamp\n"
487 )
488{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100489 g_cfg->trunk.force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100490 return CMD_SUCCESS;
491}
492
493DEFUN(cfg_mgcp_no_patch_rtp_ts,
494 cfg_mgcp_no_patch_rtp_ts_cmd,
495 "no rtp-patch timestamp",
496 NO_STR RTP_PATCH_STR
497 "Adjust RTP timestamp\n"
498 )
499{
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100500 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100501 return CMD_SUCCESS;
502}
503
504DEFUN(cfg_mgcp_no_patch_rtp,
505 cfg_mgcp_no_patch_rtp_cmd,
506 "no rtp-patch",
507 NO_STR RTP_PATCH_STR)
508{
509 g_cfg->trunk.force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100510 g_cfg->trunk.force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100511 return CMD_SUCCESS;
512}
513
514
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100515#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200516DEFUN(cfg_mgcp_agent_addr,
517 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100518 "call-agent ip A.B.C.D",
519 CALL_AGENT_STR IP_STR
520 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200521{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200522 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200523 return CMD_SUCCESS;
524}
525
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100526ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
527 "call agent ip A.B.C.D",
528 CALL_AGENT_STR CALL_AGENT_STR IP_STR
529 "IPv4 Address of the callagent\n")
530
531
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800532DEFUN(cfg_mgcp_transcoder,
533 cfg_mgcp_transcoder_cmd,
534 "transcoder-mgw A.B.C.D",
535 "Use a MGW to detranscoder RTP\n"
536 "The IP address of the MGW")
537{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200538 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800539 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
540
541 return CMD_SUCCESS;
542}
543
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100544DEFUN(cfg_mgcp_no_transcoder,
545 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100546 "no transcoder-mgw",
547 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100548{
549 if (g_cfg->transcoder_ip) {
550 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
551 talloc_free(g_cfg->transcoder_ip);
552 g_cfg->transcoder_ip = NULL;
553 }
554
555 return CMD_SUCCESS;
556}
557
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800558DEFUN(cfg_mgcp_transcoder_remote_base,
559 cfg_mgcp_transcoder_remote_base_cmd,
560 "transcoder-remote-base <0-65534>",
561 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
562{
563 g_cfg->transcoder_remote_base = atoi(argv[0]);
564 return CMD_SUCCESS;
565}
566
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100567DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
568 "trunk <1-64>",
569 "Configure a SS7 trunk\n" "Trunk Nr\n")
570{
571 struct mgcp_trunk_config *trunk;
572 int index = atoi(argv[0]);
573
574 trunk = mgcp_trunk_num(g_cfg, index);
575 if (!trunk)
576 trunk = mgcp_trunk_alloc(g_cfg, index);
577
578 if (!trunk) {
579 vty_out(vty, "%%Unable to allocate trunk %u.%s",
580 index, VTY_NEWLINE);
581 return CMD_WARNING;
582 }
583
584 vty->node = TRUNK_NODE;
585 vty->index = trunk;
586 return CMD_SUCCESS;
587}
588
589static int config_write_trunk(struct vty *vty)
590{
591 struct mgcp_trunk_config *trunk;
592
593 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
594 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100595 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100596 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100597 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100598 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100599 vty_out(vty, " %ssdp audio-payload send-ptime%s",
600 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100601 vty_out(vty, " loop %d%s",
602 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200603 if (trunk->omit_rtcp)
604 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
605 else
606 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100607 if (trunk->force_constant_ssrc || trunk->force_aligned_timing) {
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100608 vty_out(vty, " %srtp-patch ssrc%s",
609 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
610 vty_out(vty, " %srtp-patch timestamp%s",
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100611 trunk->force_aligned_timing ? "" : "no ", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100612 } else
613 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200614 if (trunk->audio_fmtp_extra)
615 vty_out(vty, " sdp audio fmtp-extra %s%s",
616 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100617 }
618
619 return CMD_SUCCESS;
620}
621
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200622DEFUN(cfg_trunk_sdp_fmtp_extra,
623 cfg_trunk_sdp_fmtp_extra_cmd,
624 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100625 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
626 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200627{
628 struct mgcp_trunk_config *trunk = vty->index;
629 char *txt = argv_concat(argv, argc, 0);
630 if (!txt)
631 return CMD_WARNING;
632
633 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
634 talloc_free(txt);
635 return CMD_SUCCESS;
636}
637
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100638DEFUN(cfg_trunk_payload_number,
639 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100640 "sdp audio-payload number <1-255>",
641 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100642{
643 struct mgcp_trunk_config *trunk = vty->index;
644 unsigned int payload = atoi(argv[0]);
645
646 trunk->audio_payload = payload;
647 return CMD_SUCCESS;
648}
649
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100650ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
651 "sdp audio payload number <1-255>",
652 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
653
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100654DEFUN(cfg_trunk_payload_name,
655 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100656 "sdp audio-payload name NAME",
657 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100658{
659 struct mgcp_trunk_config *trunk = vty->index;
660
661 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
662 return CMD_SUCCESS;
663}
664
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100665ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
666 "sdp audio payload name NAME",
667 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
668
669
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100670DEFUN(cfg_trunk_loop,
671 cfg_trunk_loop_cmd,
672 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100673 "Loop audio for all endpoints on this trunk\n"
674 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100675{
676 struct mgcp_trunk_config *trunk = vty->index;
677
678 trunk->audio_loop = atoi(argv[0]);
679 return CMD_SUCCESS;
680}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800681
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100682DEFUN(cfg_trunk_sdp_payload_send_ptime,
683 cfg_trunk_sdp_payload_send_ptime_cmd,
684 "sdp audio-payload send-ptime",
685 SDP_STR AUDIO_STR
686 "Send SDP ptime (packet duration) attribute\n")
687{
688 struct mgcp_trunk_config *trunk = vty->index;
689 trunk->audio_send_ptime = 1;
690 return CMD_SUCCESS;
691}
692
693DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
694 cfg_trunk_no_sdp_payload_send_ptime_cmd,
695 "no sdp audio-payload send-ptime",
696 NO_STR SDP_STR AUDIO_STR
697 "Send SDP ptime (packet duration) attribute\n")
698{
699 struct mgcp_trunk_config *trunk = vty->index;
700 trunk->audio_send_ptime = 0;
701 return CMD_SUCCESS;
702}
703
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200704DEFUN(cfg_trunk_omit_rtcp,
705 cfg_trunk_omit_rtcp_cmd,
706 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200707 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200708{
709 struct mgcp_trunk_config *trunk = vty->index;
710 trunk->omit_rtcp = 1;
711 return CMD_SUCCESS;
712}
713
714DEFUN(cfg_trunk_no_omit_rtcp,
715 cfg_trunk_no_omit_rtcp_cmd,
716 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200717 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200718{
719 struct mgcp_trunk_config *trunk = vty->index;
720 trunk->omit_rtcp = 0;
721 return CMD_SUCCESS;
722}
723
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100724DEFUN(cfg_trunk_patch_rtp_ssrc,
725 cfg_trunk_patch_rtp_ssrc_cmd,
726 "rtp-patch ssrc",
727 RTP_PATCH_STR
728 "Force a fixed SSRC\n"
729 )
730{
731 struct mgcp_trunk_config *trunk = vty->index;
732 trunk->force_constant_ssrc = 1;
733 return CMD_SUCCESS;
734}
735
736DEFUN(cfg_trunk_no_patch_rtp_ssrc,
737 cfg_trunk_no_patch_rtp_ssrc_cmd,
738 "no rtp-patch ssrc",
739 NO_STR RTP_PATCH_STR
740 "Force a fixed SSRC\n"
741 )
742{
743 struct mgcp_trunk_config *trunk = vty->index;
744 trunk->force_constant_ssrc = 0;
745 return CMD_SUCCESS;
746}
747
748DEFUN(cfg_trunk_patch_rtp_ts,
749 cfg_trunk_patch_rtp_ts_cmd,
750 "rtp-patch timestamp",
751 RTP_PATCH_STR
752 "Adjust RTP timestamp\n"
753 )
754{
755 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100756 trunk->force_aligned_timing = 1;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100757 return CMD_SUCCESS;
758}
759
760DEFUN(cfg_trunk_no_patch_rtp_ts,
761 cfg_trunk_no_patch_rtp_ts_cmd,
762 "no rtp-patch timestamp",
763 NO_STR RTP_PATCH_STR
764 "Adjust RTP timestamp\n"
765 )
766{
767 struct mgcp_trunk_config *trunk = vty->index;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100768 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100769 return CMD_SUCCESS;
770}
771
772DEFUN(cfg_trunk_no_patch_rtp,
773 cfg_trunk_no_patch_rtp_cmd,
774 "no rtp-patch",
775 NO_STR RTP_PATCH_STR)
776{
777 struct mgcp_trunk_config *trunk = vty->index;
778 trunk->force_constant_ssrc = 0;
Jacob Erlbeck4bbddc62013-12-18 12:54:51 +0100779 trunk->force_aligned_timing = 0;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100780 return CMD_SUCCESS;
781}
782
783
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800784DEFUN(loop_endp,
785 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100786 "loop-endpoint <0-64> NAME (0|1)",
787 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800788 "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 +0800789{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100790 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800791 struct mgcp_endpoint *endp;
792
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100793 trunk = find_trunk(g_cfg, atoi(argv[0]));
794 if (!trunk) {
795 vty_out(vty, "%%Trunk %d not found in the config.%s",
796 atoi(argv[0]), VTY_NEWLINE);
797 return CMD_WARNING;
798 }
799
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100800 if (!trunk->endpoints) {
801 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
802 trunk->trunk_nr, VTY_NEWLINE);
803 return CMD_WARNING;
804 }
805
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100806 int endp_no = strtoul(argv[1], NULL, 16);
807 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800808 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100809 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800810 return CMD_WARNING;
811 }
812
813
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100814 endp = &trunk->endpoints[endp_no];
815 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800816
817 if (loop)
818 endp->conn_mode = MGCP_CONN_LOOPBACK;
819 else
820 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100821
822 /* Handle it like a MDCX, switch on SSRC patching if enabled */
823 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
824 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800825
826 return CMD_SUCCESS;
827}
828
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800829DEFUN(tap_call,
830 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100831 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
832 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800833 "The endpoint in hex\n"
834 "Forward the data coming from the bts\n"
835 "Forward the data coming from the bts leaving to the network\n"
836 "Forward the data coming from the net\n"
837 "Forward the data coming from the net leaving to the bts\n"
838 "destination IP of the data\n" "destination port\n")
839{
840 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100841 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800842 struct mgcp_endpoint *endp;
843 int port = 0;
844
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100845 trunk = find_trunk(g_cfg, atoi(argv[0]));
846 if (!trunk) {
847 vty_out(vty, "%%Trunk %d not found in the config.%s",
848 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800849 return CMD_WARNING;
850 }
851
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100852 if (!trunk->endpoints) {
853 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
854 trunk->trunk_nr, VTY_NEWLINE);
855 return CMD_WARNING;
856 }
857
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100858 int endp_no = strtoul(argv[1], NULL, 16);
859 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
860 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
861 argv[1], endp_no, VTY_NEWLINE);
862 return CMD_WARNING;
863 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800864
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100865 endp = &trunk->endpoints[endp_no];
866
867 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800868 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100869 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800870 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100871 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800872 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100873 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800874 port = MGCP_TAP_NET_OUT;
875 } else {
876 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
877 return CMD_WARNING;
878 }
879
880 tap = &endp->taps[port];
881 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100882 inet_aton(argv[3], &tap->forward.sin_addr);
883 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800884 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800885 return CMD_SUCCESS;
886}
887
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800888DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100889 "free-endpoint <0-64> NUMBER",
890 "Free the given endpoint\n" "Trunk number\n"
891 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800892{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100893 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800894 struct mgcp_endpoint *endp;
895
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100896 trunk = find_trunk(g_cfg, atoi(argv[0]));
897 if (!trunk) {
898 vty_out(vty, "%%Trunk %d not found in the config.%s",
899 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800900 return CMD_WARNING;
901 }
902
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100903 if (!trunk->endpoints) {
904 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
905 trunk->trunk_nr, VTY_NEWLINE);
906 return CMD_WARNING;
907 }
908
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100909 int endp_no = strtoul(argv[1], NULL, 16);
910 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
911 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
912 argv[1], endp_no, VTY_NEWLINE);
913 return CMD_WARNING;
914 }
915
916 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800917 mgcp_free_endp(endp);
918 return CMD_SUCCESS;
919}
920
Harald Welte6a857052012-01-27 00:41:39 +0100921DEFUN(reset_endp, reset_endp_cmd,
922 "reset-endpoint <0-64> NUMBER",
923 "Reset the given endpoint\n" "Trunk number\n"
924 "Endpoint number in hex.\n")
925{
926 struct mgcp_trunk_config *trunk;
927 struct mgcp_endpoint *endp;
928 int endp_no, rc;
929
930 trunk = find_trunk(g_cfg, atoi(argv[0]));
931 if (!trunk) {
932 vty_out(vty, "%%Trunk %d not found in the config.%s",
933 atoi(argv[0]), VTY_NEWLINE);
934 return CMD_WARNING;
935 }
936
937 if (!trunk->endpoints) {
938 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
939 trunk->trunk_nr, VTY_NEWLINE);
940 return CMD_WARNING;
941 }
942
943 endp_no = strtoul(argv[1], NULL, 16);
944 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
945 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
946 argv[1], endp_no, VTY_NEWLINE);
947 return CMD_WARNING;
948 }
949
950 endp = &trunk->endpoints[endp_no];
951 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
952 if (rc < 0) {
953 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
954 return CMD_WARNING;
955 }
956 return CMD_SUCCESS;
957}
958
959DEFUN(reset_all_endp, reset_all_endp_cmd,
960 "reset-all-endpoints",
961 "Reset all endpoints\n")
962{
963 int rc;
964
965 rc = mgcp_send_reset_all(g_cfg);
966 if (rc < 0) {
967 vty_out(vty, "Error %d during endpoint reset.%s",
968 rc, VTY_NEWLINE);
969 return CMD_WARNING;
970 }
971 return CMD_SUCCESS;
972}
973
974
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100975int mgcp_vty_init(void)
976{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800977 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800978 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800979 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800980 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +0100981 install_element(ENABLE_NODE, &reset_endp_cmd);
982 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100983
984 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
985 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800986
Jacob Erlbeck36722e12013-10-29 09:30:30 +0100987 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100988 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
989 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
990 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
991 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
992 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
993 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800994 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800995 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800996 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
997 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800998 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
999 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +08001000 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +08001001 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +02001002 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001003 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +08001004 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +01001005 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001006 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001007 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1008 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001009 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1010 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001011 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1012 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001013 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1014 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001015 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1016 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1017 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1018 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1019 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001020 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001021 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1022 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001023
1024 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1025 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001026 vty_install_default(TRUNK_NODE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001027 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1028 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001029 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1030 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001031 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001032 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1033 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001034 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1035 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1036 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1037 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1038 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001039 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001040 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1041 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001042
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001043 return 0;
1044}
1045
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001046static int allocate_trunk(struct mgcp_trunk_config *trunk)
1047{
1048 int i;
1049 struct mgcp_config *cfg = trunk->cfg;
1050
1051 if (mgcp_endpoints_allocate(trunk) != 0) {
1052 LOGP(DMGCP, LOGL_ERROR,
1053 "Failed to allocate %d endpoints on trunk %d.\n",
1054 trunk->number_endpoints, trunk->trunk_nr);
1055 return -1;
1056 }
1057
1058 /* early bind */
1059 for (i = 1; i < trunk->number_endpoints; ++i) {
1060 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001061
1062 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001063 cfg->last_bts_port += 2;
1064 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1065 LOGP(DMGCP, LOGL_FATAL,
1066 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001067 return -1;
1068 }
1069 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1070 }
1071
1072 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001073 cfg->last_net_port += 2;
1074 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1075 LOGP(DMGCP, LOGL_FATAL,
1076 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001077 return -1;
1078 }
1079 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1080 }
1081
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001082 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1083 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001084 int rtp_port;
1085
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001086 /* network side */
1087 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1088 cfg->transcoder_ports.base_port);
1089 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1090 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1091 return -1;
1092 }
1093 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1094
1095 /* bts side */
1096 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1097 cfg->transcoder_ports.base_port);
1098 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1099 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1100 return -1;
1101 }
1102 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1103 }
1104 }
1105
1106 return 0;
1107}
1108
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001109int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1110 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001111{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001112 int rc;
1113 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001114
1115 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001116 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001117 if (rc < 0) {
1118 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1119 return rc;
1120 }
1121
1122
1123 if (!g_cfg->bts_ip)
1124 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1125
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001126 if (!g_cfg->source_addr) {
1127 fprintf(stderr, "You need to specify a bind address.\n");
1128 return -1;
1129 }
1130
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001131 /* initialize the last ports */
1132 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1133 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1134
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001135 if (allocate_trunk(&g_cfg->trunk) != 0) {
1136 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001137 return -1;
1138 }
1139
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001140 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1141 if (allocate_trunk(trunk) != 0) {
1142 LOGP(DMGCP, LOGL_ERROR,
1143 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1144 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001145 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001146 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001147 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001148
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001149 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001150}
1151