blob: 235b8bd6a20b60c9e63ad0f3706a98749cba96e5 [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 Erlbeckdb2d4312013-12-03 14:43:34 +010092 if (g_cfg->trunk.force_constant_ssrc || g_cfg->trunk.force_constant_timing) {
93 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",
96 g_cfg->trunk.force_constant_timing ? "" : "no ", VTY_NEWLINE);
97 } 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
153 if (verbose)
154 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);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100161 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100162}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100163
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100164DEFUN(show_mcgp, show_mgcp_cmd,
165 "show mgcp [stats]",
166 SHOW_STR
167 "Display information about the MGCP Media Gateway\n"
168 "Include Statistics\n")
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100169{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100170 struct mgcp_trunk_config *trunk;
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100171 int show_stats = argc >= 1;
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100172
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100173 dump_trunk(vty, &g_cfg->trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100174
175 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
Jacob Erlbeck50079a12013-11-25 12:53:28 +0100176 dump_trunk(vty, trunk, show_stats);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100177
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100178 return CMD_SUCCESS;
179}
180
181DEFUN(cfg_mgcp,
182 cfg_mgcp_cmd,
183 "mgcp",
184 "Configure the MGCP")
185{
186 vty->node = MGCP_NODE;
187 return CMD_SUCCESS;
188}
189
190DEFUN(cfg_mgcp_local_ip,
191 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800192 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100193 "Local options for the SDP record\n"
194 IP_STR
195 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100196{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200197 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100198 return CMD_SUCCESS;
199}
200
201DEFUN(cfg_mgcp_bts_ip,
202 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800203 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100204 "BTS Audio source/destination options\n"
205 IP_STR
206 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100207{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200208 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100209 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
210 return CMD_SUCCESS;
211}
212
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100213#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100214DEFUN(cfg_mgcp_bind_ip,
215 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800216 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100217 BIND_STR
218 IP_STR
219 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100220{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200221 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100222 return CMD_SUCCESS;
223}
224
225DEFUN(cfg_mgcp_bind_port,
226 cfg_mgcp_bind_port_cmd,
227 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100228 BIND_STR
229 "Port information\n"
230 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100231{
232 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100233 g_cfg->source_port = port;
234 return CMD_SUCCESS;
235}
236
237DEFUN(cfg_mgcp_bind_early,
238 cfg_mgcp_bind_early_cmd,
239 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100240 BIND_STR
241 "Bind local ports on start up\n"
242 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100243{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800244 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
245 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100246}
247
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800248static void parse_base(struct mgcp_port_range *range, const char **argv)
249{
250 unsigned int port = atoi(argv[0]);
251 range->mode = PORT_ALLOC_STATIC;
252 range->base_port = port;
253}
254
255static void parse_range(struct mgcp_port_range *range, const char **argv)
256{
257 range->mode = PORT_ALLOC_DYNAMIC;
258 range->range_start = atoi(argv[0]);
259 range->range_end = atoi(argv[1]);
260 range->last_port = g_cfg->bts_ports.range_start;
261}
262
263
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100264#define RTP_STR "RTP configuration\n"
265#define BTS_START_STR "First UDP port allocated for the BTS side\n"
266#define NET_START_STR "First UDP port allocated for the NET side\n"
267#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800268DEFUN(cfg_mgcp_rtp_bts_base_port,
269 cfg_mgcp_rtp_bts_base_port_cmd,
270 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100271 RTP_STR
272 BTS_START_STR
273 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100274{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800275 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100276 return CMD_SUCCESS;
277}
278
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100279#define RANGE_START_STR "Start of the range of ports\n"
280#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800281DEFUN(cfg_mgcp_rtp_bts_range,
282 cfg_mgcp_rtp_bts_range_cmd,
283 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100284 RTP_STR "Range of ports to use for the BTS side\n"
285 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800286{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800287 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800288 return CMD_SUCCESS;
289}
290
291DEFUN(cfg_mgcp_rtp_net_range,
292 cfg_mgcp_rtp_net_range_cmd,
293 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100294 RTP_STR "Range of ports to use for the NET side\n"
295 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800296{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800297 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800298 return CMD_SUCCESS;
299}
300
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800301DEFUN(cfg_mgcp_rtp_net_base_port,
302 cfg_mgcp_rtp_net_base_port_cmd,
303 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100304 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800305{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800306 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800307 return CMD_SUCCESS;
308}
309
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800310ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100311 "rtp base <0-65534>",
312 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800313
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800314DEFUN(cfg_mgcp_rtp_transcoder_range,
315 cfg_mgcp_rtp_transcoder_range_cmd,
316 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100317 RTP_STR "Range of ports to use for the Transcoder\n"
318 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800319{
320 parse_range(&g_cfg->transcoder_ports, argv);
321 return CMD_SUCCESS;
322}
323
324DEFUN(cfg_mgcp_rtp_transcoder_base,
325 cfg_mgcp_rtp_transcoder_base_cmd,
326 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100327 RTP_STR "First UDP port allocated for the Transcoder side\n"
328 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800329{
330 parse_base(&g_cfg->transcoder_ports, argv);
331 return CMD_SUCCESS;
332}
333
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800334DEFUN(cfg_mgcp_rtp_ip_dscp,
335 cfg_mgcp_rtp_ip_dscp_cmd,
336 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100337 RTP_STR
338 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800339{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800340 int dscp = atoi(argv[0]);
341 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800342 return CMD_SUCCESS;
343}
344
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800345ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
346 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100347 RTP_STR
348 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800349
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200350DEFUN(cfg_mgcp_sdp_fmtp_extra,
351 cfg_mgcp_sdp_fmtp_extra_cmd,
352 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100353 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
354 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200355{
356 char *txt = argv_concat(argv, argc, 0);
357 if (!txt)
358 return CMD_WARNING;
359
360 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_fmtp_extra, txt);
361 talloc_free(txt);
362 return CMD_SUCCESS;
363}
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800364
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100365#define SDP_STR "SDP File related options\n"
366#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100367DEFUN(cfg_mgcp_sdp_payload_number,
368 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100369 "sdp audio-payload number <1-255>",
370 SDP_STR AUDIO_STR
371 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100372{
373 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100374 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100375 return CMD_SUCCESS;
376}
377
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100378ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
379 "sdp audio payload number <1-255>",
380 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
381
382
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100383DEFUN(cfg_mgcp_sdp_payload_name,
384 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100385 "sdp audio-payload name NAME",
386 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100387{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100388 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100389 return CMD_SUCCESS;
390}
391
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100392ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
393 "sdp audio payload name NAME",
394 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
395
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100396DEFUN(cfg_mgcp_sdp_payload_send_ptime,
397 cfg_mgcp_sdp_payload_send_ptime_cmd,
398 "sdp audio-payload send-ptime",
399 SDP_STR AUDIO_STR
400 "Send SDP ptime (packet duration) attribute\n")
401{
402 g_cfg->trunk.audio_send_ptime = 1;
403 return CMD_SUCCESS;
404}
405
406DEFUN(cfg_mgcp_no_sdp_payload_send_ptime,
407 cfg_mgcp_no_sdp_payload_send_ptime_cmd,
408 "no sdp audio-payload send-ptime",
409 NO_STR SDP_STR AUDIO_STR
410 "Send SDP ptime (packet duration) attribute\n")
411{
412 g_cfg->trunk.audio_send_ptime = 0;
413 return CMD_SUCCESS;
414}
415
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100416DEFUN(cfg_mgcp_loop,
417 cfg_mgcp_loop_cmd,
418 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100419 "Loop audio for all endpoints on main trunk\n"
420 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100421{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100422 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100423 return CMD_SUCCESS;
424}
425
426DEFUN(cfg_mgcp_number_endp,
427 cfg_mgcp_number_endp_cmd,
428 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100429 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100430{
431 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100432 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100433 return CMD_SUCCESS;
434}
435
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200436DEFUN(cfg_mgcp_omit_rtcp,
437 cfg_mgcp_omit_rtcp_cmd,
438 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200439 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200440{
441 g_cfg->trunk.omit_rtcp = 1;
442 return CMD_SUCCESS;
443}
444
445DEFUN(cfg_mgcp_no_omit_rtcp,
446 cfg_mgcp_no_omit_rtcp_cmd,
447 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200448 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200449{
450 g_cfg->trunk.omit_rtcp = 0;
451 return CMD_SUCCESS;
452}
453
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100454DEFUN(cfg_mgcp_patch_rtp_ssrc,
455 cfg_mgcp_patch_rtp_ssrc_cmd,
456 "rtp-patch ssrc",
457 RTP_PATCH_STR
458 "Force a fixed SSRC\n"
459 )
460{
461 g_cfg->trunk.force_constant_ssrc = 1;
462 return CMD_SUCCESS;
463}
464
465DEFUN(cfg_mgcp_no_patch_rtp_ssrc,
466 cfg_mgcp_no_patch_rtp_ssrc_cmd,
467 "no rtp-patch ssrc",
468 NO_STR RTP_PATCH_STR
469 "Force a fixed SSRC\n"
470 )
471{
472 g_cfg->trunk.force_constant_ssrc = 0;
473 return CMD_SUCCESS;
474}
475
476DEFUN(cfg_mgcp_patch_rtp_ts,
477 cfg_mgcp_patch_rtp_ts_cmd,
478 "rtp-patch timestamp",
479 RTP_PATCH_STR
480 "Adjust RTP timestamp\n"
481 )
482{
483 g_cfg->trunk.force_constant_timing = 1;
484 return CMD_SUCCESS;
485}
486
487DEFUN(cfg_mgcp_no_patch_rtp_ts,
488 cfg_mgcp_no_patch_rtp_ts_cmd,
489 "no rtp-patch timestamp",
490 NO_STR RTP_PATCH_STR
491 "Adjust RTP timestamp\n"
492 )
493{
494 g_cfg->trunk.force_constant_timing = 0;
495 return CMD_SUCCESS;
496}
497
498DEFUN(cfg_mgcp_no_patch_rtp,
499 cfg_mgcp_no_patch_rtp_cmd,
500 "no rtp-patch",
501 NO_STR RTP_PATCH_STR)
502{
503 g_cfg->trunk.force_constant_ssrc = 0;
504 g_cfg->trunk.force_constant_timing = 0;
505 return CMD_SUCCESS;
506}
507
508
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100509#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200510DEFUN(cfg_mgcp_agent_addr,
511 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100512 "call-agent ip A.B.C.D",
513 CALL_AGENT_STR IP_STR
514 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200515{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200516 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200517 return CMD_SUCCESS;
518}
519
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100520ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
521 "call agent ip A.B.C.D",
522 CALL_AGENT_STR CALL_AGENT_STR IP_STR
523 "IPv4 Address of the callagent\n")
524
525
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800526DEFUN(cfg_mgcp_transcoder,
527 cfg_mgcp_transcoder_cmd,
528 "transcoder-mgw A.B.C.D",
529 "Use a MGW to detranscoder RTP\n"
530 "The IP address of the MGW")
531{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200532 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800533 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
534
535 return CMD_SUCCESS;
536}
537
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100538DEFUN(cfg_mgcp_no_transcoder,
539 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100540 "no transcoder-mgw",
541 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100542{
543 if (g_cfg->transcoder_ip) {
544 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
545 talloc_free(g_cfg->transcoder_ip);
546 g_cfg->transcoder_ip = NULL;
547 }
548
549 return CMD_SUCCESS;
550}
551
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800552DEFUN(cfg_mgcp_transcoder_remote_base,
553 cfg_mgcp_transcoder_remote_base_cmd,
554 "transcoder-remote-base <0-65534>",
555 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
556{
557 g_cfg->transcoder_remote_base = atoi(argv[0]);
558 return CMD_SUCCESS;
559}
560
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100561DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
562 "trunk <1-64>",
563 "Configure a SS7 trunk\n" "Trunk Nr\n")
564{
565 struct mgcp_trunk_config *trunk;
566 int index = atoi(argv[0]);
567
568 trunk = mgcp_trunk_num(g_cfg, index);
569 if (!trunk)
570 trunk = mgcp_trunk_alloc(g_cfg, index);
571
572 if (!trunk) {
573 vty_out(vty, "%%Unable to allocate trunk %u.%s",
574 index, VTY_NEWLINE);
575 return CMD_WARNING;
576 }
577
578 vty->node = TRUNK_NODE;
579 vty->index = trunk;
580 return CMD_SUCCESS;
581}
582
583static int config_write_trunk(struct vty *vty)
584{
585 struct mgcp_trunk_config *trunk;
586
587 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
588 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100589 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100590 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100591 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100592 trunk->audio_name, VTY_NEWLINE);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100593 vty_out(vty, " %ssdp audio-payload send-ptime%s",
594 trunk->audio_send_ptime ? "" : "no ", VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100595 vty_out(vty, " loop %d%s",
596 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200597 if (trunk->omit_rtcp)
598 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
599 else
600 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100601 if (trunk->force_constant_ssrc || trunk->force_constant_timing) {
602 vty_out(vty, " %srtp-patch ssrc%s",
603 trunk->force_constant_ssrc ? "" : "no ", VTY_NEWLINE);
604 vty_out(vty, " %srtp-patch timestamp%s",
605 trunk->force_constant_timing ? "" : "no ", VTY_NEWLINE);
606 } else
607 vty_out(vty, " no rtp-patch%s", VTY_NEWLINE);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200608 if (trunk->audio_fmtp_extra)
609 vty_out(vty, " sdp audio fmtp-extra %s%s",
610 trunk->audio_fmtp_extra, VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100611 }
612
613 return CMD_SUCCESS;
614}
615
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200616DEFUN(cfg_trunk_sdp_fmtp_extra,
617 cfg_trunk_sdp_fmtp_extra_cmd,
618 "sdp audio fmtp-extra .NAME",
Holger Hans Peter Freyther63b0e442013-03-03 09:32:08 +0100619 "Add extra fmtp for the SDP file\n" "Audio\n" "Fmtp-extra\n"
620 "Extra Information\n")
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +0200621{
622 struct mgcp_trunk_config *trunk = vty->index;
623 char *txt = argv_concat(argv, argc, 0);
624 if (!txt)
625 return CMD_WARNING;
626
627 bsc_replace_string(g_cfg, &trunk->audio_fmtp_extra, txt);
628 talloc_free(txt);
629 return CMD_SUCCESS;
630}
631
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100632DEFUN(cfg_trunk_payload_number,
633 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100634 "sdp audio-payload number <1-255>",
635 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100636{
637 struct mgcp_trunk_config *trunk = vty->index;
638 unsigned int payload = atoi(argv[0]);
639
640 trunk->audio_payload = payload;
641 return CMD_SUCCESS;
642}
643
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100644ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
645 "sdp audio payload number <1-255>",
646 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
647
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100648DEFUN(cfg_trunk_payload_name,
649 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100650 "sdp audio-payload name NAME",
651 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100652{
653 struct mgcp_trunk_config *trunk = vty->index;
654
655 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
656 return CMD_SUCCESS;
657}
658
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100659ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
660 "sdp audio payload name NAME",
661 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
662
663
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100664DEFUN(cfg_trunk_loop,
665 cfg_trunk_loop_cmd,
666 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100667 "Loop audio for all endpoints on this trunk\n"
668 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100669{
670 struct mgcp_trunk_config *trunk = vty->index;
671
672 trunk->audio_loop = atoi(argv[0]);
673 return CMD_SUCCESS;
674}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800675
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +0100676DEFUN(cfg_trunk_sdp_payload_send_ptime,
677 cfg_trunk_sdp_payload_send_ptime_cmd,
678 "sdp audio-payload send-ptime",
679 SDP_STR AUDIO_STR
680 "Send SDP ptime (packet duration) attribute\n")
681{
682 struct mgcp_trunk_config *trunk = vty->index;
683 trunk->audio_send_ptime = 1;
684 return CMD_SUCCESS;
685}
686
687DEFUN(cfg_trunk_no_sdp_payload_send_ptime,
688 cfg_trunk_no_sdp_payload_send_ptime_cmd,
689 "no sdp audio-payload send-ptime",
690 NO_STR SDP_STR AUDIO_STR
691 "Send SDP ptime (packet duration) attribute\n")
692{
693 struct mgcp_trunk_config *trunk = vty->index;
694 trunk->audio_send_ptime = 0;
695 return CMD_SUCCESS;
696}
697
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200698DEFUN(cfg_trunk_omit_rtcp,
699 cfg_trunk_omit_rtcp_cmd,
700 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200701 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200702{
703 struct mgcp_trunk_config *trunk = vty->index;
704 trunk->omit_rtcp = 1;
705 return CMD_SUCCESS;
706}
707
708DEFUN(cfg_trunk_no_omit_rtcp,
709 cfg_trunk_no_omit_rtcp_cmd,
710 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200711 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200712{
713 struct mgcp_trunk_config *trunk = vty->index;
714 trunk->omit_rtcp = 0;
715 return CMD_SUCCESS;
716}
717
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100718DEFUN(cfg_trunk_patch_rtp_ssrc,
719 cfg_trunk_patch_rtp_ssrc_cmd,
720 "rtp-patch ssrc",
721 RTP_PATCH_STR
722 "Force a fixed SSRC\n"
723 )
724{
725 struct mgcp_trunk_config *trunk = vty->index;
726 trunk->force_constant_ssrc = 1;
727 return CMD_SUCCESS;
728}
729
730DEFUN(cfg_trunk_no_patch_rtp_ssrc,
731 cfg_trunk_no_patch_rtp_ssrc_cmd,
732 "no rtp-patch ssrc",
733 NO_STR RTP_PATCH_STR
734 "Force a fixed SSRC\n"
735 )
736{
737 struct mgcp_trunk_config *trunk = vty->index;
738 trunk->force_constant_ssrc = 0;
739 return CMD_SUCCESS;
740}
741
742DEFUN(cfg_trunk_patch_rtp_ts,
743 cfg_trunk_patch_rtp_ts_cmd,
744 "rtp-patch timestamp",
745 RTP_PATCH_STR
746 "Adjust RTP timestamp\n"
747 )
748{
749 struct mgcp_trunk_config *trunk = vty->index;
750 trunk->force_constant_timing = 1;
751 return CMD_SUCCESS;
752}
753
754DEFUN(cfg_trunk_no_patch_rtp_ts,
755 cfg_trunk_no_patch_rtp_ts_cmd,
756 "no rtp-patch timestamp",
757 NO_STR RTP_PATCH_STR
758 "Adjust RTP timestamp\n"
759 )
760{
761 struct mgcp_trunk_config *trunk = vty->index;
762 trunk->force_constant_timing = 0;
763 return CMD_SUCCESS;
764}
765
766DEFUN(cfg_trunk_no_patch_rtp,
767 cfg_trunk_no_patch_rtp_cmd,
768 "no rtp-patch",
769 NO_STR RTP_PATCH_STR)
770{
771 struct mgcp_trunk_config *trunk = vty->index;
772 trunk->force_constant_ssrc = 0;
773 trunk->force_constant_timing = 0;
774 return CMD_SUCCESS;
775}
776
777
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800778DEFUN(loop_endp,
779 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100780 "loop-endpoint <0-64> NAME (0|1)",
781 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800782 "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 +0800783{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100784 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800785 struct mgcp_endpoint *endp;
786
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100787 trunk = find_trunk(g_cfg, atoi(argv[0]));
788 if (!trunk) {
789 vty_out(vty, "%%Trunk %d not found in the config.%s",
790 atoi(argv[0]), VTY_NEWLINE);
791 return CMD_WARNING;
792 }
793
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100794 if (!trunk->endpoints) {
795 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
796 trunk->trunk_nr, VTY_NEWLINE);
797 return CMD_WARNING;
798 }
799
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100800 int endp_no = strtoul(argv[1], NULL, 16);
801 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800802 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100803 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800804 return CMD_WARNING;
805 }
806
807
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100808 endp = &trunk->endpoints[endp_no];
809 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800810
811 if (loop)
812 endp->conn_mode = MGCP_CONN_LOOPBACK;
813 else
814 endp->conn_mode = endp->orig_mode;
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +0100815
816 /* Handle it like a MDCX, switch on SSRC patching if enabled */
817 mgcp_rtp_end_config(endp, 1, &endp->bts_end);
818 mgcp_rtp_end_config(endp, 1, &endp->net_end);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800819
820 return CMD_SUCCESS;
821}
822
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800823DEFUN(tap_call,
824 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100825 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
826 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800827 "The endpoint in hex\n"
828 "Forward the data coming from the bts\n"
829 "Forward the data coming from the bts leaving to the network\n"
830 "Forward the data coming from the net\n"
831 "Forward the data coming from the net leaving to the bts\n"
832 "destination IP of the data\n" "destination port\n")
833{
834 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100835 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800836 struct mgcp_endpoint *endp;
837 int port = 0;
838
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100839 trunk = find_trunk(g_cfg, atoi(argv[0]));
840 if (!trunk) {
841 vty_out(vty, "%%Trunk %d not found in the config.%s",
842 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800843 return CMD_WARNING;
844 }
845
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100846 if (!trunk->endpoints) {
847 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
848 trunk->trunk_nr, VTY_NEWLINE);
849 return CMD_WARNING;
850 }
851
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100852 int endp_no = strtoul(argv[1], NULL, 16);
853 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
854 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
855 argv[1], endp_no, VTY_NEWLINE);
856 return CMD_WARNING;
857 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800858
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100859 endp = &trunk->endpoints[endp_no];
860
861 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800862 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100863 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800864 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100865 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800866 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100867 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800868 port = MGCP_TAP_NET_OUT;
869 } else {
870 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
871 return CMD_WARNING;
872 }
873
874 tap = &endp->taps[port];
875 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100876 inet_aton(argv[3], &tap->forward.sin_addr);
877 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800878 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800879 return CMD_SUCCESS;
880}
881
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800882DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100883 "free-endpoint <0-64> NUMBER",
884 "Free the given endpoint\n" "Trunk number\n"
885 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800886{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100887 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800888 struct mgcp_endpoint *endp;
889
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100890 trunk = find_trunk(g_cfg, atoi(argv[0]));
891 if (!trunk) {
892 vty_out(vty, "%%Trunk %d not found in the config.%s",
893 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800894 return CMD_WARNING;
895 }
896
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100897 if (!trunk->endpoints) {
898 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
899 trunk->trunk_nr, VTY_NEWLINE);
900 return CMD_WARNING;
901 }
902
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100903 int endp_no = strtoul(argv[1], NULL, 16);
904 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
905 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
906 argv[1], endp_no, VTY_NEWLINE);
907 return CMD_WARNING;
908 }
909
910 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800911 mgcp_free_endp(endp);
912 return CMD_SUCCESS;
913}
914
Harald Welte6a857052012-01-27 00:41:39 +0100915DEFUN(reset_endp, reset_endp_cmd,
916 "reset-endpoint <0-64> NUMBER",
917 "Reset the given endpoint\n" "Trunk number\n"
918 "Endpoint number in hex.\n")
919{
920 struct mgcp_trunk_config *trunk;
921 struct mgcp_endpoint *endp;
922 int endp_no, rc;
923
924 trunk = find_trunk(g_cfg, atoi(argv[0]));
925 if (!trunk) {
926 vty_out(vty, "%%Trunk %d not found in the config.%s",
927 atoi(argv[0]), VTY_NEWLINE);
928 return CMD_WARNING;
929 }
930
931 if (!trunk->endpoints) {
932 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
933 trunk->trunk_nr, VTY_NEWLINE);
934 return CMD_WARNING;
935 }
936
937 endp_no = strtoul(argv[1], NULL, 16);
938 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
939 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
940 argv[1], endp_no, VTY_NEWLINE);
941 return CMD_WARNING;
942 }
943
944 endp = &trunk->endpoints[endp_no];
945 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
946 if (rc < 0) {
947 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
948 return CMD_WARNING;
949 }
950 return CMD_SUCCESS;
951}
952
953DEFUN(reset_all_endp, reset_all_endp_cmd,
954 "reset-all-endpoints",
955 "Reset all endpoints\n")
956{
957 int rc;
958
959 rc = mgcp_send_reset_all(g_cfg);
960 if (rc < 0) {
961 vty_out(vty, "Error %d during endpoint reset.%s",
962 rc, VTY_NEWLINE);
963 return CMD_WARNING;
964 }
965 return CMD_SUCCESS;
966}
967
968
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100969int mgcp_vty_init(void)
970{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800971 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800972 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800973 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800974 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +0100975 install_element(ENABLE_NODE, &reset_endp_cmd);
976 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100977
978 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
979 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800980
Jacob Erlbeck36722e12013-10-29 09:30:30 +0100981 vty_install_default(MGCP_NODE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100982 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
983 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
984 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
985 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
986 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
987 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800988 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800989 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800990 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
991 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800992 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
993 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800994 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800995 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200996 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100997 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800998 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100999 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +08001000 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001001 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
1002 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001003 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
1004 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001005 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
1006 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001007 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
1008 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001009 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ssrc_cmd);
1010 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ssrc_cmd);
1011 install_element(MGCP_NODE, &cfg_mgcp_patch_rtp_ts_cmd);
1012 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_ts_cmd);
1013 install_element(MGCP_NODE, &cfg_mgcp_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001014 install_element(MGCP_NODE, &cfg_mgcp_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001015 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_send_ptime_cmd);
1016 install_element(MGCP_NODE, &cfg_mgcp_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001017
1018 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
1019 install_node(&trunk_node, config_write_trunk);
Jacob Erlbeck36722e12013-10-29 09:30:30 +01001020 vty_install_default(TRUNK_NODE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001021 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
1022 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +01001023 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
1024 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001025 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +02001026 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
1027 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Jacob Erlbeckdb2d4312013-12-03 14:43:34 +01001028 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ssrc_cmd);
1029 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ssrc_cmd);
1030 install_element(TRUNK_NODE, &cfg_trunk_patch_rtp_ts_cmd);
1031 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_ts_cmd);
1032 install_element(TRUNK_NODE, &cfg_trunk_no_patch_rtp_cmd);
Holger Hans Peter Freyther5ea1bc72012-09-03 00:07:39 +02001033 install_element(TRUNK_NODE, &cfg_trunk_sdp_fmtp_extra_cmd);
Jacob Erlbeck0a1bc562013-12-10 13:09:37 +01001034 install_element(TRUNK_NODE, &cfg_trunk_sdp_payload_send_ptime_cmd);
1035 install_element(TRUNK_NODE, &cfg_trunk_no_sdp_payload_send_ptime_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +01001036
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001037 return 0;
1038}
1039
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001040static int allocate_trunk(struct mgcp_trunk_config *trunk)
1041{
1042 int i;
1043 struct mgcp_config *cfg = trunk->cfg;
1044
1045 if (mgcp_endpoints_allocate(trunk) != 0) {
1046 LOGP(DMGCP, LOGL_ERROR,
1047 "Failed to allocate %d endpoints on trunk %d.\n",
1048 trunk->number_endpoints, trunk->trunk_nr);
1049 return -1;
1050 }
1051
1052 /* early bind */
1053 for (i = 1; i < trunk->number_endpoints; ++i) {
1054 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001055
1056 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001057 cfg->last_bts_port += 2;
1058 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
1059 LOGP(DMGCP, LOGL_FATAL,
1060 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001061 return -1;
1062 }
1063 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
1064 }
1065
1066 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001067 cfg->last_net_port += 2;
1068 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
1069 LOGP(DMGCP, LOGL_FATAL,
1070 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001071 return -1;
1072 }
1073 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
1074 }
1075
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +01001076 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
1077 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001078 int rtp_port;
1079
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001080 /* network side */
1081 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
1082 cfg->transcoder_ports.base_port);
1083 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
1084 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1085 return -1;
1086 }
1087 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
1088
1089 /* bts side */
1090 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
1091 cfg->transcoder_ports.base_port);
1092 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
1093 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
1094 return -1;
1095 }
1096 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
1097 }
1098 }
1099
1100 return 0;
1101}
1102
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001103int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg,
1104 enum mgcp_role role)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001105{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001106 int rc;
1107 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001108
1109 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +02001110 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001111 if (rc < 0) {
1112 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
1113 return rc;
1114 }
1115
1116
1117 if (!g_cfg->bts_ip)
1118 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
1119
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +02001120 if (!g_cfg->source_addr) {
1121 fprintf(stderr, "You need to specify a bind address.\n");
1122 return -1;
1123 }
1124
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +01001125 /* initialize the last ports */
1126 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
1127 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
1128
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001129 if (allocate_trunk(&g_cfg->trunk) != 0) {
1130 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001131 return -1;
1132 }
1133
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +01001134 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
1135 if (allocate_trunk(trunk) != 0) {
1136 LOGP(DMGCP, LOGL_ERROR,
1137 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
1138 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +08001139 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001140 }
Pablo Neira Ayuso326b5d82013-08-02 21:14:14 +02001141 cfg->role = role;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001142
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +08001143 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +01001144}
1145