blob: 4483f0242bfd7df768952c5a606ac6d33c230d6a [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 Freyther7bdc6372010-02-20 21:21:02 +010033static struct mgcp_config *g_cfg = NULL;
34
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010035static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010036{
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010037 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010038
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010039 if (nr == 0)
40 trunk = &cfg->trunk;
41 else
42 trunk = mgcp_trunk_num(cfg, nr);
43
44 return trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010045}
46
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010047/*
48 * vty code for mgcp below
49 */
50struct cmd_node mgcp_node = {
51 MGCP_NODE,
52 "%s(mgcp)#",
53 1,
54};
55
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010056struct cmd_node trunk_node = {
57 TRUNK_NODE,
58 "%s(trunk)#",
59 1,
60};
61
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010062static int config_write_mgcp(struct vty *vty)
63{
64 vty_out(vty, "mgcp%s", VTY_NEWLINE);
65 if (g_cfg->local_ip)
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020066 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
67 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010068 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
69 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
70 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080071
72 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
73 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 +080074 else
75 vty_out(vty, " rtp bts-range %u %u%s",
76 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
77
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080078 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
79 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 +080080 else
81 vty_out(vty, " rtp net-range %u %u%s",
82 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
83
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +080084 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010085 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +010086 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010087 g_cfg->trunk.audio_payload, VTY_NEWLINE);
88 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +010089 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010090 g_cfg->trunk.audio_name, VTY_NEWLINE);
91 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
92 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +020093 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +010094 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +080095 if (g_cfg->transcoder_ip)
96 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010097
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +080098 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
99 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
100 else
101 vty_out(vty, " rtp transcoder-range %u %u%s",
102 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800103 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800104
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100105 return CMD_SUCCESS;
106}
107
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100108static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100109{
110 int i;
111
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100112 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
113 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
114 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
115
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100116 if (!cfg->endpoints) {
117 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
118 return;
119 }
120
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100121 for (i = 1; i < cfg->number_endpoints; ++i) {
122 struct mgcp_endpoint *endp = &cfg->endpoints[i];
123 vty_out(vty,
124 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
125 "traffic received bts: %u/%u remote: %u/%u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100126 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800127 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
128 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
129 inet_ntoa(endp->bts_end.addr),
130 endp->bts_end.packets, endp->bts_state.lost_no,
131 endp->net_end.packets, endp->net_state.lost_no,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100132 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200133 VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100134 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100135}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100136
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100137DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
138 SHOW_STR "Display information about the MGCP Media Gateway")
139{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100140 struct mgcp_trunk_config *trunk;
141
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100142 dump_trunk(vty, &g_cfg->trunk);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100143
144 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
145 dump_trunk(vty, trunk);
146
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100147 return CMD_SUCCESS;
148}
149
150DEFUN(cfg_mgcp,
151 cfg_mgcp_cmd,
152 "mgcp",
153 "Configure the MGCP")
154{
155 vty->node = MGCP_NODE;
156 return CMD_SUCCESS;
157}
158
159DEFUN(cfg_mgcp_local_ip,
160 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800161 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100162 "Local options for the SDP record\n"
163 IP_STR
164 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100165{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200166 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100167 return CMD_SUCCESS;
168}
169
170DEFUN(cfg_mgcp_bts_ip,
171 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800172 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100173 "BTS Audio source/destination options\n"
174 IP_STR
175 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100176{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200177 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100178 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
179 return CMD_SUCCESS;
180}
181
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100182#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100183DEFUN(cfg_mgcp_bind_ip,
184 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800185 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100186 BIND_STR
187 IP_STR
188 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100189{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200190 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100191 return CMD_SUCCESS;
192}
193
194DEFUN(cfg_mgcp_bind_port,
195 cfg_mgcp_bind_port_cmd,
196 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100197 BIND_STR
198 "Port information\n"
199 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100200{
201 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100202 g_cfg->source_port = port;
203 return CMD_SUCCESS;
204}
205
206DEFUN(cfg_mgcp_bind_early,
207 cfg_mgcp_bind_early_cmd,
208 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100209 BIND_STR
210 "Bind local ports on start up\n"
211 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100212{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800213 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
214 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100215}
216
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800217static void parse_base(struct mgcp_port_range *range, const char **argv)
218{
219 unsigned int port = atoi(argv[0]);
220 range->mode = PORT_ALLOC_STATIC;
221 range->base_port = port;
222}
223
224static void parse_range(struct mgcp_port_range *range, const char **argv)
225{
226 range->mode = PORT_ALLOC_DYNAMIC;
227 range->range_start = atoi(argv[0]);
228 range->range_end = atoi(argv[1]);
229 range->last_port = g_cfg->bts_ports.range_start;
230}
231
232
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100233#define RTP_STR "RTP configuration\n"
234#define BTS_START_STR "First UDP port allocated for the BTS side\n"
235#define NET_START_STR "First UDP port allocated for the NET side\n"
236#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800237DEFUN(cfg_mgcp_rtp_bts_base_port,
238 cfg_mgcp_rtp_bts_base_port_cmd,
239 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100240 RTP_STR
241 BTS_START_STR
242 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100243{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800244 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100245 return CMD_SUCCESS;
246}
247
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100248#define RANGE_START_STR "Start of the range of ports\n"
249#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800250DEFUN(cfg_mgcp_rtp_bts_range,
251 cfg_mgcp_rtp_bts_range_cmd,
252 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100253 RTP_STR "Range of ports to use for the BTS side\n"
254 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800255{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800256 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800257 return CMD_SUCCESS;
258}
259
260DEFUN(cfg_mgcp_rtp_net_range,
261 cfg_mgcp_rtp_net_range_cmd,
262 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100263 RTP_STR "Range of ports to use for the NET side\n"
264 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800265{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800266 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800267 return CMD_SUCCESS;
268}
269
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800270DEFUN(cfg_mgcp_rtp_net_base_port,
271 cfg_mgcp_rtp_net_base_port_cmd,
272 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100273 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800274{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800275 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800276 return CMD_SUCCESS;
277}
278
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800279ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100280 "rtp base <0-65534>",
281 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800282
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800283DEFUN(cfg_mgcp_rtp_transcoder_range,
284 cfg_mgcp_rtp_transcoder_range_cmd,
285 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100286 RTP_STR "Range of ports to use for the Transcoder\n"
287 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800288{
289 parse_range(&g_cfg->transcoder_ports, argv);
290 return CMD_SUCCESS;
291}
292
293DEFUN(cfg_mgcp_rtp_transcoder_base,
294 cfg_mgcp_rtp_transcoder_base_cmd,
295 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100296 RTP_STR "First UDP port allocated for the Transcoder side\n"
297 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800298{
299 parse_base(&g_cfg->transcoder_ports, argv);
300 return CMD_SUCCESS;
301}
302
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800303DEFUN(cfg_mgcp_rtp_ip_dscp,
304 cfg_mgcp_rtp_ip_dscp_cmd,
305 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100306 RTP_STR
307 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800308{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800309 int dscp = atoi(argv[0]);
310 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800311 return CMD_SUCCESS;
312}
313
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800314ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
315 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100316 RTP_STR
317 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800318
319
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100320#define SDP_STR "SDP File related options\n"
321#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100322DEFUN(cfg_mgcp_sdp_payload_number,
323 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100324 "sdp audio-payload number <1-255>",
325 SDP_STR AUDIO_STR
326 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100327{
328 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100329 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100330 return CMD_SUCCESS;
331}
332
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100333ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
334 "sdp audio payload number <1-255>",
335 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
336
337
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100338DEFUN(cfg_mgcp_sdp_payload_name,
339 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100340 "sdp audio-payload name NAME",
341 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100342{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100343 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100344 return CMD_SUCCESS;
345}
346
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100347ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
348 "sdp audio payload name NAME",
349 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
350
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100351DEFUN(cfg_mgcp_loop,
352 cfg_mgcp_loop_cmd,
353 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100354 "Loop audio for all endpoints on main trunk\n"
355 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100356{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100357 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100358 return CMD_SUCCESS;
359}
360
361DEFUN(cfg_mgcp_number_endp,
362 cfg_mgcp_number_endp_cmd,
363 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100364 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100365{
366 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100367 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100368 return CMD_SUCCESS;
369}
370
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100371#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200372DEFUN(cfg_mgcp_agent_addr,
373 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100374 "call-agent ip A.B.C.D",
375 CALL_AGENT_STR IP_STR
376 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200377{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200378 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200379 return CMD_SUCCESS;
380}
381
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100382ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
383 "call agent ip A.B.C.D",
384 CALL_AGENT_STR CALL_AGENT_STR IP_STR
385 "IPv4 Address of the callagent\n")
386
387
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800388DEFUN(cfg_mgcp_transcoder,
389 cfg_mgcp_transcoder_cmd,
390 "transcoder-mgw A.B.C.D",
391 "Use a MGW to detranscoder RTP\n"
392 "The IP address of the MGW")
393{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200394 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800395 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
396
397 return CMD_SUCCESS;
398}
399
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100400DEFUN(cfg_mgcp_no_transcoder,
401 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100402 "no transcoder-mgw",
403 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100404{
405 if (g_cfg->transcoder_ip) {
406 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
407 talloc_free(g_cfg->transcoder_ip);
408 g_cfg->transcoder_ip = NULL;
409 }
410
411 return CMD_SUCCESS;
412}
413
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800414DEFUN(cfg_mgcp_transcoder_remote_base,
415 cfg_mgcp_transcoder_remote_base_cmd,
416 "transcoder-remote-base <0-65534>",
417 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
418{
419 g_cfg->transcoder_remote_base = atoi(argv[0]);
420 return CMD_SUCCESS;
421}
422
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100423DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
424 "trunk <1-64>",
425 "Configure a SS7 trunk\n" "Trunk Nr\n")
426{
427 struct mgcp_trunk_config *trunk;
428 int index = atoi(argv[0]);
429
430 trunk = mgcp_trunk_num(g_cfg, index);
431 if (!trunk)
432 trunk = mgcp_trunk_alloc(g_cfg, index);
433
434 if (!trunk) {
435 vty_out(vty, "%%Unable to allocate trunk %u.%s",
436 index, VTY_NEWLINE);
437 return CMD_WARNING;
438 }
439
440 vty->node = TRUNK_NODE;
441 vty->index = trunk;
442 return CMD_SUCCESS;
443}
444
445static int config_write_trunk(struct vty *vty)
446{
447 struct mgcp_trunk_config *trunk;
448
449 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
450 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100451 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100452 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100453 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100454 trunk->audio_name, VTY_NEWLINE);
455 vty_out(vty, " loop %d%s",
456 trunk->audio_loop, VTY_NEWLINE);
457 }
458
459 return CMD_SUCCESS;
460}
461
462DEFUN(cfg_trunk_payload_number,
463 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100464 "sdp audio-payload number <1-255>",
465 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100466{
467 struct mgcp_trunk_config *trunk = vty->index;
468 unsigned int payload = atoi(argv[0]);
469
470 trunk->audio_payload = payload;
471 return CMD_SUCCESS;
472}
473
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100474ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
475 "sdp audio payload number <1-255>",
476 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
477
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100478DEFUN(cfg_trunk_payload_name,
479 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100480 "sdp audio-payload name NAME",
481 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100482{
483 struct mgcp_trunk_config *trunk = vty->index;
484
485 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
486 return CMD_SUCCESS;
487}
488
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100489ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
490 "sdp audio payload name NAME",
491 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
492
493
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100494DEFUN(cfg_trunk_loop,
495 cfg_trunk_loop_cmd,
496 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100497 "Loop audio for all endpoints on this trunk\n"
498 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100499{
500 struct mgcp_trunk_config *trunk = vty->index;
501
502 trunk->audio_loop = atoi(argv[0]);
503 return CMD_SUCCESS;
504}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800505
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800506DEFUN(loop_endp,
507 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100508 "loop-endpoint <0-64> NAME (0|1)",
509 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800510 "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 +0800511{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100512 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800513 struct mgcp_endpoint *endp;
514
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100515 trunk = find_trunk(g_cfg, atoi(argv[0]));
516 if (!trunk) {
517 vty_out(vty, "%%Trunk %d not found in the config.%s",
518 atoi(argv[0]), VTY_NEWLINE);
519 return CMD_WARNING;
520 }
521
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100522 if (!trunk->endpoints) {
523 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
524 trunk->trunk_nr, VTY_NEWLINE);
525 return CMD_WARNING;
526 }
527
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100528 int endp_no = strtoul(argv[1], NULL, 16);
529 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800530 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100531 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800532 return CMD_WARNING;
533 }
534
535
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100536 endp = &trunk->endpoints[endp_no];
537 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800538
539 if (loop)
540 endp->conn_mode = MGCP_CONN_LOOPBACK;
541 else
542 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000543 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800544
545 return CMD_SUCCESS;
546}
547
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800548DEFUN(tap_call,
549 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100550 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
551 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800552 "The endpoint in hex\n"
553 "Forward the data coming from the bts\n"
554 "Forward the data coming from the bts leaving to the network\n"
555 "Forward the data coming from the net\n"
556 "Forward the data coming from the net leaving to the bts\n"
557 "destination IP of the data\n" "destination port\n")
558{
559 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100560 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800561 struct mgcp_endpoint *endp;
562 int port = 0;
563
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100564 trunk = find_trunk(g_cfg, atoi(argv[0]));
565 if (!trunk) {
566 vty_out(vty, "%%Trunk %d not found in the config.%s",
567 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800568 return CMD_WARNING;
569 }
570
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100571 if (!trunk->endpoints) {
572 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
573 trunk->trunk_nr, VTY_NEWLINE);
574 return CMD_WARNING;
575 }
576
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100577 int endp_no = strtoul(argv[1], NULL, 16);
578 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
579 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
580 argv[1], endp_no, VTY_NEWLINE);
581 return CMD_WARNING;
582 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800583
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100584 endp = &trunk->endpoints[endp_no];
585
586 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800587 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100588 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800589 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100590 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800591 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100592 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800593 port = MGCP_TAP_NET_OUT;
594 } else {
595 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
596 return CMD_WARNING;
597 }
598
599 tap = &endp->taps[port];
600 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100601 inet_aton(argv[3], &tap->forward.sin_addr);
602 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800603 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800604 return CMD_SUCCESS;
605}
606
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800607DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100608 "free-endpoint <0-64> NUMBER",
609 "Free the given endpoint\n" "Trunk number\n"
610 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800611{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100612 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800613 struct mgcp_endpoint *endp;
614
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100615 trunk = find_trunk(g_cfg, atoi(argv[0]));
616 if (!trunk) {
617 vty_out(vty, "%%Trunk %d not found in the config.%s",
618 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800619 return CMD_WARNING;
620 }
621
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100622 if (!trunk->endpoints) {
623 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
624 trunk->trunk_nr, VTY_NEWLINE);
625 return CMD_WARNING;
626 }
627
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100628 int endp_no = strtoul(argv[1], NULL, 16);
629 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
630 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
631 argv[1], endp_no, VTY_NEWLINE);
632 return CMD_WARNING;
633 }
634
635 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800636 mgcp_free_endp(endp);
637 return CMD_SUCCESS;
638}
639
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100640int mgcp_vty_init(void)
641{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800642 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800643 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800644 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800645 install_element(ENABLE_NODE, &free_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100646
647 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
648 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800649
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100650 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200651 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200652 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100653 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
654 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
655 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
656 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
657 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
658 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800659 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800660 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800661 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
662 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800663 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
664 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800665 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800666 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200667 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100668 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800669 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100670 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800671 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100672 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
673 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100674 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
675 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100676 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
677 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
678
679 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
680 install_node(&trunk_node, config_write_trunk);
681 install_default(TRUNK_NODE);
682 install_element(TRUNK_NODE, &ournode_exit_cmd);
683 install_element(TRUNK_NODE, &ournode_end_cmd);
684 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
685 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100686 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
687 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100688 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
689
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100690 return 0;
691}
692
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100693static int allocate_trunk(struct mgcp_trunk_config *trunk)
694{
695 int i;
696 struct mgcp_config *cfg = trunk->cfg;
697
698 if (mgcp_endpoints_allocate(trunk) != 0) {
699 LOGP(DMGCP, LOGL_ERROR,
700 "Failed to allocate %d endpoints on trunk %d.\n",
701 trunk->number_endpoints, trunk->trunk_nr);
702 return -1;
703 }
704
705 /* early bind */
706 for (i = 1; i < trunk->number_endpoints; ++i) {
707 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100708
709 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100710 cfg->last_bts_port += 2;
711 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
712 LOGP(DMGCP, LOGL_FATAL,
713 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100714 return -1;
715 }
716 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
717 }
718
719 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100720 cfg->last_net_port += 2;
721 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
722 LOGP(DMGCP, LOGL_FATAL,
723 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100724 return -1;
725 }
726 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
727 }
728
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +0100729 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
730 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100731 int rtp_port;
732
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100733 /* network side */
734 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
735 cfg->transcoder_ports.base_port);
736 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
737 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
738 return -1;
739 }
740 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
741
742 /* bts side */
743 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
744 cfg->transcoder_ports.base_port);
745 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
746 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
747 return -1;
748 }
749 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
750 }
751 }
752
753 return 0;
754}
755
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100756int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
757{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100758 int rc;
759 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100760
761 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200762 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100763 if (rc < 0) {
764 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
765 return rc;
766 }
767
768
769 if (!g_cfg->bts_ip)
770 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
771
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200772 if (!g_cfg->source_addr) {
773 fprintf(stderr, "You need to specify a bind address.\n");
774 return -1;
775 }
776
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100777 /* initialize the last ports */
778 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
779 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
780
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100781 if (allocate_trunk(&g_cfg->trunk) != 0) {
782 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100783 return -1;
784 }
785
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100786 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
787 if (allocate_trunk(trunk) != 0) {
788 LOGP(DMGCP, LOGL_ERROR,
789 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
790 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800791 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100792 }
793
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800794 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100795}
796