blob: 7309f502d49ee32796563204a202af48de6df378 [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
Harald Welte6a857052012-01-27 00:41:39 +0100640DEFUN(reset_endp, reset_endp_cmd,
641 "reset-endpoint <0-64> NUMBER",
642 "Reset the given endpoint\n" "Trunk number\n"
643 "Endpoint number in hex.\n")
644{
645 struct mgcp_trunk_config *trunk;
646 struct mgcp_endpoint *endp;
647 int endp_no, rc;
648
649 trunk = find_trunk(g_cfg, atoi(argv[0]));
650 if (!trunk) {
651 vty_out(vty, "%%Trunk %d not found in the config.%s",
652 atoi(argv[0]), VTY_NEWLINE);
653 return CMD_WARNING;
654 }
655
656 if (!trunk->endpoints) {
657 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
658 trunk->trunk_nr, VTY_NEWLINE);
659 return CMD_WARNING;
660 }
661
662 endp_no = strtoul(argv[1], NULL, 16);
663 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
664 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
665 argv[1], endp_no, VTY_NEWLINE);
666 return CMD_WARNING;
667 }
668
669 endp = &trunk->endpoints[endp_no];
670 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
671 if (rc < 0) {
672 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
673 return CMD_WARNING;
674 }
675 return CMD_SUCCESS;
676}
677
678DEFUN(reset_all_endp, reset_all_endp_cmd,
679 "reset-all-endpoints",
680 "Reset all endpoints\n")
681{
682 int rc;
683
684 rc = mgcp_send_reset_all(g_cfg);
685 if (rc < 0) {
686 vty_out(vty, "Error %d during endpoint reset.%s",
687 rc, VTY_NEWLINE);
688 return CMD_WARNING;
689 }
690 return CMD_SUCCESS;
691}
692
693
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100694int mgcp_vty_init(void)
695{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800696 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800697 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800698 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800699 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +0100700 install_element(ENABLE_NODE, &reset_endp_cmd);
701 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100702
703 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
704 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800705
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100706 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200707 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200708 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100709 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
710 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
711 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
712 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
713 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
714 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800715 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800716 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800717 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
718 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800719 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
720 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800721 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800722 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200723 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100724 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800725 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100726 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800727 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100728 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
729 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100730 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
731 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100732 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
733 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
734
735 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
736 install_node(&trunk_node, config_write_trunk);
737 install_default(TRUNK_NODE);
738 install_element(TRUNK_NODE, &ournode_exit_cmd);
739 install_element(TRUNK_NODE, &ournode_end_cmd);
740 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
741 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100742 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
743 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100744 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
745
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100746 return 0;
747}
748
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100749static int allocate_trunk(struct mgcp_trunk_config *trunk)
750{
751 int i;
752 struct mgcp_config *cfg = trunk->cfg;
753
754 if (mgcp_endpoints_allocate(trunk) != 0) {
755 LOGP(DMGCP, LOGL_ERROR,
756 "Failed to allocate %d endpoints on trunk %d.\n",
757 trunk->number_endpoints, trunk->trunk_nr);
758 return -1;
759 }
760
761 /* early bind */
762 for (i = 1; i < trunk->number_endpoints; ++i) {
763 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100764
765 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100766 cfg->last_bts_port += 2;
767 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
768 LOGP(DMGCP, LOGL_FATAL,
769 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100770 return -1;
771 }
772 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
773 }
774
775 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100776 cfg->last_net_port += 2;
777 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
778 LOGP(DMGCP, LOGL_FATAL,
779 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100780 return -1;
781 }
782 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
783 }
784
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +0100785 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
786 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100787 int rtp_port;
788
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100789 /* network side */
790 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
791 cfg->transcoder_ports.base_port);
792 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
793 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
794 return -1;
795 }
796 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
797
798 /* bts side */
799 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
800 cfg->transcoder_ports.base_port);
801 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
802 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
803 return -1;
804 }
805 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
806 }
807 }
808
809 return 0;
810}
811
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100812int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
813{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100814 int rc;
815 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100816
817 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200818 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100819 if (rc < 0) {
820 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
821 return rc;
822 }
823
824
825 if (!g_cfg->bts_ip)
826 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
827
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200828 if (!g_cfg->source_addr) {
829 fprintf(stderr, "You need to specify a bind address.\n");
830 return -1;
831 }
832
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100833 /* initialize the last ports */
834 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
835 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
836
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100837 if (allocate_trunk(&g_cfg->trunk) != 0) {
838 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100839 return -1;
840 }
841
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100842 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
843 if (allocate_trunk(trunk) != 0) {
844 LOGP(DMGCP, LOGL_ERROR,
845 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
846 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800847 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100848 }
849
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800850 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100851}
852