blob: 314faa809e0ad34879925104efa0064b5f8ef5b0 [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"
34
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010035static struct mgcp_config *g_cfg = NULL;
36
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010037static struct mgcp_trunk_config *find_trunk(struct mgcp_config *cfg, int nr)
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010038{
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010039 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010040
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +010041 if (nr == 0)
42 trunk = &cfg->trunk;
43 else
44 trunk = mgcp_trunk_num(cfg, nr);
45
46 return trunk;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +010047}
48
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010049/*
50 * vty code for mgcp below
51 */
52struct cmd_node mgcp_node = {
53 MGCP_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020054 "%s(config-mgcp)# ",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010055 1,
56};
57
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010058struct cmd_node trunk_node = {
59 TRUNK_NODE,
Harald Welte570ce242012-08-17 13:16:10 +020060 "%s(config-mgcp-trunk)# ",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +010061 1,
62};
63
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010064static int config_write_mgcp(struct vty *vty)
65{
66 vty_out(vty, "mgcp%s", VTY_NEWLINE);
67 if (g_cfg->local_ip)
Holger Hans Peter Freyther8d9833e2010-04-16 16:59:48 +020068 vty_out(vty, " local ip %s%s", g_cfg->local_ip, VTY_NEWLINE);
69 if (g_cfg->bts_ip && strlen(g_cfg->bts_ip) != 0)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +010070 vty_out(vty, " bts ip %s%s", g_cfg->bts_ip, VTY_NEWLINE);
71 vty_out(vty, " bind ip %s%s", g_cfg->source_addr, VTY_NEWLINE);
72 vty_out(vty, " bind port %u%s", g_cfg->source_port, VTY_NEWLINE);
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080073
74 if (g_cfg->bts_ports.mode == PORT_ALLOC_STATIC)
75 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 +080076 else
77 vty_out(vty, " rtp bts-range %u %u%s",
78 g_cfg->bts_ports.range_start, g_cfg->bts_ports.range_end, VTY_NEWLINE);
79
Holger Hans Peter Freyther15e73892010-08-05 07:10:56 +080080 if (g_cfg->net_ports.mode == PORT_ALLOC_STATIC)
81 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 +080082 else
83 vty_out(vty, " rtp net-range %u %u%s",
84 g_cfg->net_ports.range_start, g_cfg->net_ports.range_end, VTY_NEWLINE);
85
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +080086 vty_out(vty, " rtp ip-dscp %d%s", g_cfg->endp_dscp, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +020087 if (g_cfg->trunk.omit_rtcp)
88 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
89 else
90 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010091 if (g_cfg->trunk.audio_payload != -1)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +010092 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010093 g_cfg->trunk.audio_payload, VTY_NEWLINE);
94 if (g_cfg->trunk.audio_name)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +010095 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +010096 g_cfg->trunk.audio_name, VTY_NEWLINE);
97 vty_out(vty, " loop %u%s", !!g_cfg->trunk.audio_loop, VTY_NEWLINE);
98 vty_out(vty, " number endpoints %u%s", g_cfg->trunk.number_endpoints - 1, VTY_NEWLINE);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +020099 if (g_cfg->call_agent_addr)
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100100 vty_out(vty, " call-agent ip %s%s", g_cfg->call_agent_addr, VTY_NEWLINE);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800101 if (g_cfg->transcoder_ip)
102 vty_out(vty, " transcoder-mgw %s%s", g_cfg->transcoder_ip, VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100103
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800104 if (g_cfg->transcoder_ports.mode == PORT_ALLOC_STATIC)
105 vty_out(vty, " rtp transcoder-base %u%s", g_cfg->transcoder_ports.base_port, VTY_NEWLINE);
106 else
107 vty_out(vty, " rtp transcoder-range %u %u%s",
108 g_cfg->transcoder_ports.range_start, g_cfg->transcoder_ports.range_end, VTY_NEWLINE);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800109 vty_out(vty, " transcoder-remote-base %u%s", g_cfg->transcoder_remote_base, VTY_NEWLINE);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800110
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100111 return CMD_SUCCESS;
112}
113
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100114static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100115{
116 int i;
117
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100118 vty_out(vty, "%s trunk nr %d with %d endpoints:%s",
119 cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",
120 cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);
121
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100122 if (!cfg->endpoints) {
123 vty_out(vty, "No endpoints allocated yet.%s", VTY_NEWLINE);
124 return;
125 }
126
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100127 for (i = 1; i < cfg->number_endpoints; ++i) {
128 struct mgcp_endpoint *endp = &cfg->endpoints[i];
129 vty_out(vty,
130 " Endpoint 0x%.2x: CI: %d net: %u/%u bts: %u/%u on %s "
131 "traffic received bts: %u/%u remote: %u/%u transcoder: %u/%u%s",
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100132 i, endp->ci,
Holger Hans Peter Freythera17d7012010-08-05 01:34:51 +0800133 ntohs(endp->net_end.rtp_port), ntohs(endp->net_end.rtcp_port),
134 ntohs(endp->bts_end.rtp_port), ntohs(endp->bts_end.rtcp_port),
135 inet_ntoa(endp->bts_end.addr),
136 endp->bts_end.packets, endp->bts_state.lost_no,
137 endp->net_end.packets, endp->net_state.lost_no,
Holger Hans Peter Freytherbd7b3c52010-11-01 21:04:54 +0100138 endp->trans_net.packets, endp->trans_bts.packets,
Holger Hans Peter Freytherb4b135e2010-04-07 09:37:17 +0200139 VTY_NEWLINE);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100140 }
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100141}
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100142
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100143DEFUN(show_mcgp, show_mgcp_cmd, "show mgcp",
144 SHOW_STR "Display information about the MGCP Media Gateway")
145{
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100146 struct mgcp_trunk_config *trunk;
147
Holger Hans Peter Freytherd011c912011-02-28 01:12:33 +0100148 dump_trunk(vty, &g_cfg->trunk);
Holger Hans Peter Freythercdba0492011-02-28 12:27:47 +0100149
150 llist_for_each_entry(trunk, &g_cfg->trunks, entry)
151 dump_trunk(vty, trunk);
152
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100153 return CMD_SUCCESS;
154}
155
156DEFUN(cfg_mgcp,
157 cfg_mgcp_cmd,
158 "mgcp",
159 "Configure the MGCP")
160{
161 vty->node = MGCP_NODE;
162 return CMD_SUCCESS;
163}
164
165DEFUN(cfg_mgcp_local_ip,
166 cfg_mgcp_local_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800167 "local ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100168 "Local options for the SDP record\n"
169 IP_STR
170 "IPv4 Address to use in SDP record\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100171{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200172 bsc_replace_string(g_cfg, &g_cfg->local_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100173 return CMD_SUCCESS;
174}
175
176DEFUN(cfg_mgcp_bts_ip,
177 cfg_mgcp_bts_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800178 "bts ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100179 "BTS Audio source/destination options\n"
180 IP_STR
181 "IPv4 Address of the BTS\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100182{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200183 bsc_replace_string(g_cfg, &g_cfg->bts_ip, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100184 inet_aton(g_cfg->bts_ip, &g_cfg->bts_in);
185 return CMD_SUCCESS;
186}
187
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100188#define BIND_STR "Listen/Bind related socket option\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100189DEFUN(cfg_mgcp_bind_ip,
190 cfg_mgcp_bind_ip_cmd,
Holger Hans Peter Freyther1384af62010-05-14 02:27:50 +0800191 "bind ip A.B.C.D",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100192 BIND_STR
193 IP_STR
194 "IPv4 Address to bind to\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100195{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200196 bsc_replace_string(g_cfg, &g_cfg->source_addr, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100197 return CMD_SUCCESS;
198}
199
200DEFUN(cfg_mgcp_bind_port,
201 cfg_mgcp_bind_port_cmd,
202 "bind port <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100203 BIND_STR
204 "Port information\n"
205 "UDP port to listen for MGCP messages\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100206{
207 unsigned int port = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100208 g_cfg->source_port = port;
209 return CMD_SUCCESS;
210}
211
212DEFUN(cfg_mgcp_bind_early,
213 cfg_mgcp_bind_early_cmd,
214 "bind early (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100215 BIND_STR
216 "Bind local ports on start up\n"
217 "Bind on demand\n" "Bind on startup\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100218{
Holger Hans Peter Freytherf1a168d2010-08-05 03:22:24 +0800219 vty_out(vty, "bind early is deprecated, remove it from the config.\n");
220 return CMD_WARNING;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100221}
222
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800223static void parse_base(struct mgcp_port_range *range, const char **argv)
224{
225 unsigned int port = atoi(argv[0]);
226 range->mode = PORT_ALLOC_STATIC;
227 range->base_port = port;
228}
229
230static void parse_range(struct mgcp_port_range *range, const char **argv)
231{
232 range->mode = PORT_ALLOC_DYNAMIC;
233 range->range_start = atoi(argv[0]);
234 range->range_end = atoi(argv[1]);
235 range->last_port = g_cfg->bts_ports.range_start;
236}
237
238
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100239#define RTP_STR "RTP configuration\n"
240#define BTS_START_STR "First UDP port allocated for the BTS side\n"
241#define NET_START_STR "First UDP port allocated for the NET side\n"
242#define UDP_PORT_STR "UDP Port number\n"
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800243DEFUN(cfg_mgcp_rtp_bts_base_port,
244 cfg_mgcp_rtp_bts_base_port_cmd,
245 "rtp bts-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100246 RTP_STR
247 BTS_START_STR
248 UDP_PORT_STR)
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100249{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800250 parse_base(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100251 return CMD_SUCCESS;
252}
253
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100254#define RANGE_START_STR "Start of the range of ports\n"
255#define RANGE_END_STR "End of the range of ports\n"
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800256DEFUN(cfg_mgcp_rtp_bts_range,
257 cfg_mgcp_rtp_bts_range_cmd,
258 "rtp bts-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100259 RTP_STR "Range of ports to use for the BTS side\n"
260 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800261{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800262 parse_range(&g_cfg->bts_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800263 return CMD_SUCCESS;
264}
265
266DEFUN(cfg_mgcp_rtp_net_range,
267 cfg_mgcp_rtp_net_range_cmd,
268 "rtp net-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100269 RTP_STR "Range of ports to use for the NET side\n"
270 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800271{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800272 parse_range(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800273 return CMD_SUCCESS;
274}
275
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800276DEFUN(cfg_mgcp_rtp_net_base_port,
277 cfg_mgcp_rtp_net_base_port_cmd,
278 "rtp net-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100279 RTP_STR NET_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800280{
Holger Hans Peter Freytherc5f92482010-09-17 23:34:36 +0800281 parse_base(&g_cfg->net_ports, argv);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800282 return CMD_SUCCESS;
283}
284
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800285ALIAS_DEPRECATED(cfg_mgcp_rtp_bts_base_port, cfg_mgcp_rtp_base_port_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100286 "rtp base <0-65534>",
287 RTP_STR BTS_START_STR UDP_PORT_STR)
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800288
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800289DEFUN(cfg_mgcp_rtp_transcoder_range,
290 cfg_mgcp_rtp_transcoder_range_cmd,
291 "rtp transcoder-range <0-65534> <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100292 RTP_STR "Range of ports to use for the Transcoder\n"
293 RANGE_START_STR RANGE_END_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800294{
295 parse_range(&g_cfg->transcoder_ports, argv);
296 return CMD_SUCCESS;
297}
298
299DEFUN(cfg_mgcp_rtp_transcoder_base,
300 cfg_mgcp_rtp_transcoder_base_cmd,
301 "rtp transcoder-base <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100302 RTP_STR "First UDP port allocated for the Transcoder side\n"
303 UDP_PORT_STR)
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800304{
305 parse_base(&g_cfg->transcoder_ports, argv);
306 return CMD_SUCCESS;
307}
308
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800309DEFUN(cfg_mgcp_rtp_ip_dscp,
310 cfg_mgcp_rtp_ip_dscp_cmd,
311 "rtp ip-dscp <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100312 RTP_STR
313 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800314{
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800315 int dscp = atoi(argv[0]);
316 g_cfg->endp_dscp = dscp;
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800317 return CMD_SUCCESS;
318}
319
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800320ALIAS_DEPRECATED(cfg_mgcp_rtp_ip_dscp, cfg_mgcp_rtp_ip_tos_cmd,
321 "rtp ip-tos <0-255>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100322 RTP_STR
323 "Apply IP_TOS to the audio stream\n" "The DSCP value\n")
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800324
325
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100326#define SDP_STR "SDP File related options\n"
327#define AUDIO_STR "Audio payload options\n"
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100328DEFUN(cfg_mgcp_sdp_payload_number,
329 cfg_mgcp_sdp_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100330 "sdp audio-payload number <1-255>",
331 SDP_STR AUDIO_STR
332 "Number\n" "Payload number\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100333{
334 unsigned int payload = atoi(argv[0]);
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100335 g_cfg->trunk.audio_payload = payload;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100336 return CMD_SUCCESS;
337}
338
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100339ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_number, cfg_mgcp_sdp_payload_number_cmd_old,
340 "sdp audio payload number <1-255>",
341 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload number\n")
342
343
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100344DEFUN(cfg_mgcp_sdp_payload_name,
345 cfg_mgcp_sdp_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100346 "sdp audio-payload name NAME",
347 SDP_STR AUDIO_STR "Name\n" "Payload name\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100348{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100349 bsc_replace_string(g_cfg, &g_cfg->trunk.audio_name, argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100350 return CMD_SUCCESS;
351}
352
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100353ALIAS_DEPRECATED(cfg_mgcp_sdp_payload_name, cfg_mgcp_sdp_payload_name_cmd_old,
354 "sdp audio payload name NAME",
355 SDP_STR AUDIO_STR AUDIO_STR "Name\n" "Payload name\n")
356
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100357DEFUN(cfg_mgcp_loop,
358 cfg_mgcp_loop_cmd,
359 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100360 "Loop audio for all endpoints on main trunk\n"
361 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100362{
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100363 g_cfg->trunk.audio_loop = atoi(argv[0]);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100364 return CMD_SUCCESS;
365}
366
367DEFUN(cfg_mgcp_number_endp,
368 cfg_mgcp_number_endp_cmd,
369 "number endpoints <0-65534>",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100370 "Number options\n" "Endpoints available\n" "Number endpoints\n")
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100371{
372 /* + 1 as we start counting at one */
Holger Hans Peter Freyther88ad7722011-02-28 00:56:17 +0100373 g_cfg->trunk.number_endpoints = atoi(argv[0]) + 1;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100374 return CMD_SUCCESS;
375}
376
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200377DEFUN(cfg_mgcp_omit_rtcp,
378 cfg_mgcp_omit_rtcp_cmd,
379 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200380 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200381{
382 g_cfg->trunk.omit_rtcp = 1;
383 return CMD_SUCCESS;
384}
385
386DEFUN(cfg_mgcp_no_omit_rtcp,
387 cfg_mgcp_no_omit_rtcp_cmd,
388 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200389 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200390{
391 g_cfg->trunk.omit_rtcp = 0;
392 return CMD_SUCCESS;
393}
394
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100395#define CALL_AGENT_STR "Callagent information\n"
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200396DEFUN(cfg_mgcp_agent_addr,
397 cfg_mgcp_agent_addr_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100398 "call-agent ip A.B.C.D",
399 CALL_AGENT_STR IP_STR
400 "IPv4 Address of the callagent\n")
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200401{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200402 bsc_replace_string(g_cfg, &g_cfg->call_agent_addr, argv[0]);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200403 return CMD_SUCCESS;
404}
405
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100406ALIAS_DEPRECATED(cfg_mgcp_agent_addr, cfg_mgcp_agent_addr_cmd_old,
407 "call agent ip A.B.C.D",
408 CALL_AGENT_STR CALL_AGENT_STR IP_STR
409 "IPv4 Address of the callagent\n")
410
411
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800412DEFUN(cfg_mgcp_transcoder,
413 cfg_mgcp_transcoder_cmd,
414 "transcoder-mgw A.B.C.D",
415 "Use a MGW to detranscoder RTP\n"
416 "The IP address of the MGW")
417{
Holger Hans Peter Freyther3e9a7f82010-10-12 23:21:54 +0200418 bsc_replace_string(g_cfg, &g_cfg->transcoder_ip, argv[0]);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800419 inet_aton(g_cfg->transcoder_ip, &g_cfg->transcoder_in);
420
421 return CMD_SUCCESS;
422}
423
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100424DEFUN(cfg_mgcp_no_transcoder,
425 cfg_mgcp_no_transcoder_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100426 "no transcoder-mgw",
427 NO_STR "Disable the transcoding\n")
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100428{
429 if (g_cfg->transcoder_ip) {
430 LOGP(DMGCP, LOGL_NOTICE, "Disabling transcoding on future calls.\n");
431 talloc_free(g_cfg->transcoder_ip);
432 g_cfg->transcoder_ip = NULL;
433 }
434
435 return CMD_SUCCESS;
436}
437
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800438DEFUN(cfg_mgcp_transcoder_remote_base,
439 cfg_mgcp_transcoder_remote_base_cmd,
440 "transcoder-remote-base <0-65534>",
441 "Set the base port for the transcoder\n" "The RTP base port on the transcoder")
442{
443 g_cfg->transcoder_remote_base = atoi(argv[0]);
444 return CMD_SUCCESS;
445}
446
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100447DEFUN(cfg_mgcp_trunk, cfg_mgcp_trunk_cmd,
448 "trunk <1-64>",
449 "Configure a SS7 trunk\n" "Trunk Nr\n")
450{
451 struct mgcp_trunk_config *trunk;
452 int index = atoi(argv[0]);
453
454 trunk = mgcp_trunk_num(g_cfg, index);
455 if (!trunk)
456 trunk = mgcp_trunk_alloc(g_cfg, index);
457
458 if (!trunk) {
459 vty_out(vty, "%%Unable to allocate trunk %u.%s",
460 index, VTY_NEWLINE);
461 return CMD_WARNING;
462 }
463
464 vty->node = TRUNK_NODE;
465 vty->index = trunk;
466 return CMD_SUCCESS;
467}
468
469static int config_write_trunk(struct vty *vty)
470{
471 struct mgcp_trunk_config *trunk;
472
473 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
474 vty_out(vty, " trunk %d%s", trunk->trunk_nr, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100475 vty_out(vty, " sdp audio-payload number %d%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100476 trunk->audio_payload, VTY_NEWLINE);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100477 vty_out(vty, " sdp audio-payload name %s%s",
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100478 trunk->audio_name, VTY_NEWLINE);
479 vty_out(vty, " loop %d%s",
480 trunk->audio_loop, VTY_NEWLINE);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200481 if (trunk->omit_rtcp)
482 vty_out(vty, " rtcp-omit%s", VTY_NEWLINE);
483 else
484 vty_out(vty, " no rtcp-omit%s", VTY_NEWLINE);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100485 }
486
487 return CMD_SUCCESS;
488}
489
490DEFUN(cfg_trunk_payload_number,
491 cfg_trunk_payload_number_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100492 "sdp audio-payload number <1-255>",
493 SDP_STR AUDIO_STR "Number\n" "Payload Number\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100494{
495 struct mgcp_trunk_config *trunk = vty->index;
496 unsigned int payload = atoi(argv[0]);
497
498 trunk->audio_payload = payload;
499 return CMD_SUCCESS;
500}
501
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100502ALIAS_DEPRECATED(cfg_trunk_payload_number, cfg_trunk_payload_number_cmd_old,
503 "sdp audio payload number <1-255>",
504 SDP_STR AUDIO_STR AUDIO_STR "Number\n" "Payload Number\n")
505
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100506DEFUN(cfg_trunk_payload_name,
507 cfg_trunk_payload_name_cmd,
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100508 "sdp audio-payload name NAME",
509 SDP_STR AUDIO_STR "Payload\n" "Payload Name\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100510{
511 struct mgcp_trunk_config *trunk = vty->index;
512
513 bsc_replace_string(g_cfg, &trunk->audio_name, argv[0]);
514 return CMD_SUCCESS;
515}
516
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100517ALIAS_DEPRECATED(cfg_trunk_payload_name, cfg_trunk_payload_name_cmd_old,
518 "sdp audio payload name NAME",
519 SDP_STR AUDIO_STR AUDIO_STR "Payload\n" "Payload Name\n")
520
521
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100522DEFUN(cfg_trunk_loop,
523 cfg_trunk_loop_cmd,
524 "loop (0|1)",
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100525 "Loop audio for all endpoints on this trunk\n"
526 "Don't Loop\n" "Loop\n")
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100527{
528 struct mgcp_trunk_config *trunk = vty->index;
529
530 trunk->audio_loop = atoi(argv[0]);
531 return CMD_SUCCESS;
532}
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800533
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200534DEFUN(cfg_trunk_omit_rtcp,
535 cfg_trunk_omit_rtcp_cmd,
536 "rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200537 RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200538{
539 struct mgcp_trunk_config *trunk = vty->index;
540 trunk->omit_rtcp = 1;
541 return CMD_SUCCESS;
542}
543
544DEFUN(cfg_trunk_no_omit_rtcp,
545 cfg_trunk_no_omit_rtcp_cmd,
546 "no rtcp-omit",
Holger Hans Peter Freytherbc6a54d2012-07-28 15:46:45 +0200547 NO_STR RTCP_OMIT_STR)
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200548{
549 struct mgcp_trunk_config *trunk = vty->index;
550 trunk->omit_rtcp = 0;
551 return CMD_SUCCESS;
552}
553
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800554DEFUN(loop_endp,
555 loop_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100556 "loop-endpoint <0-64> NAME (0|1)",
557 "Loop a given endpoint\n" "Trunk number\n"
Holger Hans Peter Freytherebc824c2010-08-03 23:00:03 +0800558 "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 +0800559{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100560 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800561 struct mgcp_endpoint *endp;
562
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100563 trunk = find_trunk(g_cfg, atoi(argv[0]));
564 if (!trunk) {
565 vty_out(vty, "%%Trunk %d not found in the config.%s",
566 atoi(argv[0]), VTY_NEWLINE);
567 return CMD_WARNING;
568 }
569
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100570 if (!trunk->endpoints) {
571 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
572 trunk->trunk_nr, VTY_NEWLINE);
573 return CMD_WARNING;
574 }
575
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100576 int endp_no = strtoul(argv[1], NULL, 16);
577 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800578 vty_out(vty, "Loopback number %s/%d is invalid.%s",
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100579 argv[1], endp_no, VTY_NEWLINE);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800580 return CMD_WARNING;
581 }
582
583
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100584 endp = &trunk->endpoints[endp_no];
585 int loop = atoi(argv[2]);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800586
587 if (loop)
588 endp->conn_mode = MGCP_CONN_LOOPBACK;
589 else
590 endp->conn_mode = endp->orig_mode;
Holger Hans Peter Freyther6357a8e2010-08-05 12:07:00 +0000591 endp->allow_patch = 1;
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800592
593 return CMD_SUCCESS;
594}
595
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800596DEFUN(tap_call,
597 tap_call_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100598 "tap-call <0-64> ENDPOINT (bts-in|bts-out|net-in|net-out) A.B.C.D <0-65534>",
599 "Forward data on endpoint to a different system\n" "Trunk number\n"
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800600 "The endpoint in hex\n"
601 "Forward the data coming from the bts\n"
602 "Forward the data coming from the bts leaving to the network\n"
603 "Forward the data coming from the net\n"
604 "Forward the data coming from the net leaving to the bts\n"
605 "destination IP of the data\n" "destination port\n")
606{
607 struct mgcp_rtp_tap *tap;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100608 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800609 struct mgcp_endpoint *endp;
610 int port = 0;
611
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100612 trunk = find_trunk(g_cfg, atoi(argv[0]));
613 if (!trunk) {
614 vty_out(vty, "%%Trunk %d not found in the config.%s",
615 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800616 return CMD_WARNING;
617 }
618
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100619 if (!trunk->endpoints) {
620 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
621 trunk->trunk_nr, VTY_NEWLINE);
622 return CMD_WARNING;
623 }
624
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100625 int endp_no = strtoul(argv[1], NULL, 16);
626 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
627 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
628 argv[1], endp_no, VTY_NEWLINE);
629 return CMD_WARNING;
630 }
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800631
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100632 endp = &trunk->endpoints[endp_no];
633
634 if (strcmp(argv[2], "bts-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800635 port = MGCP_TAP_BTS_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100636 } else if (strcmp(argv[2], "bts-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800637 port = MGCP_TAP_BTS_OUT;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100638 } else if (strcmp(argv[2], "net-in") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800639 port = MGCP_TAP_NET_IN;
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100640 } else if (strcmp(argv[2], "net-out") == 0) {
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800641 port = MGCP_TAP_NET_OUT;
642 } else {
643 vty_out(vty, "Unknown mode... tricked vty?%s", VTY_NEWLINE);
644 return CMD_WARNING;
645 }
646
647 tap = &endp->taps[port];
648 memset(&tap->forward, 0, sizeof(tap->forward));
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100649 inet_aton(argv[3], &tap->forward.sin_addr);
650 tap->forward.sin_port = htons(atoi(argv[4]));
Holger Hans Peter Freyther0e01d092010-08-06 02:05:15 +0800651 tap->enabled = 1;
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800652 return CMD_SUCCESS;
653}
654
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800655DEFUN(free_endp, free_endp_cmd,
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100656 "free-endpoint <0-64> NUMBER",
657 "Free the given endpoint\n" "Trunk number\n"
658 "Endpoint number in hex.\n")
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800659{
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100660 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800661 struct mgcp_endpoint *endp;
662
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100663 trunk = find_trunk(g_cfg, atoi(argv[0]));
664 if (!trunk) {
665 vty_out(vty, "%%Trunk %d not found in the config.%s",
666 atoi(argv[0]), VTY_NEWLINE);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800667 return CMD_WARNING;
668 }
669
Holger Hans Peter Freyther6ea7e772011-02-28 12:32:18 +0100670 if (!trunk->endpoints) {
671 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
672 trunk->trunk_nr, VTY_NEWLINE);
673 return CMD_WARNING;
674 }
675
Holger Hans Peter Freytherab3bb9d2011-02-28 01:29:02 +0100676 int endp_no = strtoul(argv[1], NULL, 16);
677 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
678 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
679 argv[1], endp_no, VTY_NEWLINE);
680 return CMD_WARNING;
681 }
682
683 endp = &trunk->endpoints[endp_no];
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800684 mgcp_free_endp(endp);
685 return CMD_SUCCESS;
686}
687
Harald Welte6a857052012-01-27 00:41:39 +0100688DEFUN(reset_endp, reset_endp_cmd,
689 "reset-endpoint <0-64> NUMBER",
690 "Reset the given endpoint\n" "Trunk number\n"
691 "Endpoint number in hex.\n")
692{
693 struct mgcp_trunk_config *trunk;
694 struct mgcp_endpoint *endp;
695 int endp_no, rc;
696
697 trunk = find_trunk(g_cfg, atoi(argv[0]));
698 if (!trunk) {
699 vty_out(vty, "%%Trunk %d not found in the config.%s",
700 atoi(argv[0]), VTY_NEWLINE);
701 return CMD_WARNING;
702 }
703
704 if (!trunk->endpoints) {
705 vty_out(vty, "%%Trunk %d has no endpoints allocated.%s",
706 trunk->trunk_nr, VTY_NEWLINE);
707 return CMD_WARNING;
708 }
709
710 endp_no = strtoul(argv[1], NULL, 16);
711 if (endp_no < 1 || endp_no >= trunk->number_endpoints) {
712 vty_out(vty, "Endpoint number %s/%d is invalid.%s",
713 argv[1], endp_no, VTY_NEWLINE);
714 return CMD_WARNING;
715 }
716
717 endp = &trunk->endpoints[endp_no];
718 rc = mgcp_send_reset_ep(endp, ENDPOINT_NUMBER(endp));
719 if (rc < 0) {
720 vty_out(vty, "Error %d sending reset.%s", rc, VTY_NEWLINE);
721 return CMD_WARNING;
722 }
723 return CMD_SUCCESS;
724}
725
726DEFUN(reset_all_endp, reset_all_endp_cmd,
727 "reset-all-endpoints",
728 "Reset all endpoints\n")
729{
730 int rc;
731
732 rc = mgcp_send_reset_all(g_cfg);
733 if (rc < 0) {
734 vty_out(vty, "Error %d during endpoint reset.%s",
735 rc, VTY_NEWLINE);
736 return CMD_WARNING;
737 }
738 return CMD_SUCCESS;
739}
740
741
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100742int mgcp_vty_init(void)
743{
Holger Hans Peter Freytherb5be7ac2010-05-14 02:45:52 +0800744 install_element_ve(&show_mgcp_cmd);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800745 install_element(ENABLE_NODE, &loop_endp_cmd);
Holger Hans Peter Freyther260d6ed2010-08-06 01:12:21 +0800746 install_element(ENABLE_NODE, &tap_call_cmd);
Holger Hans Peter Freyther5508fe32010-08-08 16:39:57 +0800747 install_element(ENABLE_NODE, &free_endp_cmd);
Harald Welte6a857052012-01-27 00:41:39 +0100748 install_element(ENABLE_NODE, &reset_endp_cmd);
749 install_element(ENABLE_NODE, &reset_all_endp_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100750
751 install_element(CONFIG_NODE, &cfg_mgcp_cmd);
752 install_node(&mgcp_node, config_write_mgcp);
Holger Hans Peter Freytherc597a4e2010-08-03 02:57:02 +0800753
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100754 install_default(MGCP_NODE);
Harald Welte62ab20c2010-05-14 18:59:17 +0200755 install_element(MGCP_NODE, &ournode_exit_cmd);
Harald Welte54f74242010-05-14 19:11:04 +0200756 install_element(MGCP_NODE, &ournode_end_cmd);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100757 install_element(MGCP_NODE, &cfg_mgcp_local_ip_cmd);
758 install_element(MGCP_NODE, &cfg_mgcp_bts_ip_cmd);
759 install_element(MGCP_NODE, &cfg_mgcp_bind_ip_cmd);
760 install_element(MGCP_NODE, &cfg_mgcp_bind_port_cmd);
761 install_element(MGCP_NODE, &cfg_mgcp_bind_early_cmd);
762 install_element(MGCP_NODE, &cfg_mgcp_rtp_base_port_cmd);
Holger Hans Peter Freyther196349d2010-08-05 03:46:07 +0800763 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_base_port_cmd);
Holger Hans Peter Freyther314584a2010-08-05 04:10:21 +0800764 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_base_port_cmd);
Holger Hans Peter Freyther1be9f2f2010-08-05 07:20:09 +0800765 install_element(MGCP_NODE, &cfg_mgcp_rtp_bts_range_cmd);
766 install_element(MGCP_NODE, &cfg_mgcp_rtp_net_range_cmd);
Holger Hans Peter Freyther54aaa0f2010-09-17 23:35:53 +0800767 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_range_cmd);
768 install_element(MGCP_NODE, &cfg_mgcp_rtp_transcoder_base_cmd);
Holger Hans Peter Freytherd0c32292010-07-27 20:34:45 +0800769 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_dscp_cmd);
Holger Hans Peter Freyther75492e62010-05-31 10:22:00 +0800770 install_element(MGCP_NODE, &cfg_mgcp_rtp_ip_tos_cmd);
Holger Hans Peter Freytherb79994c2010-03-31 11:46:41 +0200771 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100772 install_element(MGCP_NODE, &cfg_mgcp_agent_addr_cmd_old);
Holger Hans Peter Freythera2a10eb2010-09-17 03:58:52 +0800773 install_element(MGCP_NODE, &cfg_mgcp_transcoder_cmd);
Holger Hans Peter Freyther88b597e2010-11-01 20:06:45 +0100774 install_element(MGCP_NODE, &cfg_mgcp_no_transcoder_cmd);
Holger Hans Peter Freytherb98ba722010-09-19 04:21:39 +0800775 install_element(MGCP_NODE, &cfg_mgcp_transcoder_remote_base_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100776 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd);
777 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100778 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_number_cmd_old);
779 install_element(MGCP_NODE, &cfg_mgcp_sdp_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100780 install_element(MGCP_NODE, &cfg_mgcp_loop_cmd);
781 install_element(MGCP_NODE, &cfg_mgcp_number_endp_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200782 install_element(MGCP_NODE, &cfg_mgcp_omit_rtcp_cmd);
783 install_element(MGCP_NODE, &cfg_mgcp_no_omit_rtcp_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100784
785 install_element(MGCP_NODE, &cfg_mgcp_trunk_cmd);
786 install_node(&trunk_node, config_write_trunk);
787 install_default(TRUNK_NODE);
788 install_element(TRUNK_NODE, &ournode_exit_cmd);
789 install_element(TRUNK_NODE, &ournode_end_cmd);
790 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd);
791 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd);
Holger Hans Peter Freyther3ffcf202011-11-05 14:59:41 +0100792 install_element(TRUNK_NODE, &cfg_trunk_payload_number_cmd_old);
793 install_element(TRUNK_NODE, &cfg_trunk_payload_name_cmd_old);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100794 install_element(TRUNK_NODE, &cfg_trunk_loop_cmd);
Holger Hans Peter Freythera8090d52012-05-11 13:00:45 +0200795 install_element(TRUNK_NODE, &cfg_trunk_omit_rtcp_cmd);
796 install_element(TRUNK_NODE, &cfg_trunk_no_omit_rtcp_cmd);
Holger Hans Peter Freyther0e939fe2011-02-28 12:11:02 +0100797
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100798 return 0;
799}
800
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100801static int allocate_trunk(struct mgcp_trunk_config *trunk)
802{
803 int i;
804 struct mgcp_config *cfg = trunk->cfg;
805
806 if (mgcp_endpoints_allocate(trunk) != 0) {
807 LOGP(DMGCP, LOGL_ERROR,
808 "Failed to allocate %d endpoints on trunk %d.\n",
809 trunk->number_endpoints, trunk->trunk_nr);
810 return -1;
811 }
812
813 /* early bind */
814 for (i = 1; i < trunk->number_endpoints; ++i) {
815 struct mgcp_endpoint *endp = &trunk->endpoints[i];
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100816
817 if (cfg->bts_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100818 cfg->last_bts_port += 2;
819 if (mgcp_bind_bts_rtp_port(endp, cfg->last_bts_port) != 0) {
820 LOGP(DMGCP, LOGL_FATAL,
821 "Failed to bind: %d\n", cfg->last_bts_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100822 return -1;
823 }
824 endp->bts_end.local_alloc = PORT_ALLOC_STATIC;
825 }
826
827 if (cfg->net_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100828 cfg->last_net_port += 2;
829 if (mgcp_bind_net_rtp_port(endp, cfg->last_net_port) != 0) {
830 LOGP(DMGCP, LOGL_FATAL,
831 "Failed to bind: %d\n", cfg->last_net_port);
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100832 return -1;
833 }
834 endp->net_end.local_alloc = PORT_ALLOC_STATIC;
835 }
836
Holger Hans Peter Freyther69906872011-02-28 14:51:48 +0100837 if (trunk->trunk_type == MGCP_TRUNK_VIRTUAL &&
838 cfg->transcoder_ip && cfg->transcoder_ports.mode == PORT_ALLOC_STATIC) {
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100839 int rtp_port;
840
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100841 /* network side */
842 rtp_port = rtp_calculate_port(ENDPOINT_NUMBER(endp),
843 cfg->transcoder_ports.base_port);
844 if (mgcp_bind_trans_net_rtp_port(endp, rtp_port) != 0) {
845 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
846 return -1;
847 }
848 endp->trans_net.local_alloc = PORT_ALLOC_STATIC;
849
850 /* bts side */
851 rtp_port = rtp_calculate_port(endp_back_channel(ENDPOINT_NUMBER(endp)),
852 cfg->transcoder_ports.base_port);
853 if (mgcp_bind_trans_bts_rtp_port(endp, rtp_port) != 0) {
854 LOGP(DMGCP, LOGL_FATAL, "Failed to bind: %d\n", rtp_port);
855 return -1;
856 }
857 endp->trans_bts.local_alloc = PORT_ALLOC_STATIC;
858 }
859 }
860
861 return 0;
862}
863
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100864int mgcp_parse_config(const char *config_file, struct mgcp_config *cfg)
865{
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100866 int rc;
867 struct mgcp_trunk_config *trunk;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100868
869 g_cfg = cfg;
Harald Weltedcccb182010-05-16 20:52:23 +0200870 rc = vty_read_config_file(config_file, NULL);
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100871 if (rc < 0) {
872 fprintf(stderr, "Failed to parse the config file: '%s'\n", config_file);
873 return rc;
874 }
875
876
877 if (!g_cfg->bts_ip)
878 fprintf(stderr, "No BTS ip address specified. This will allow everyone to connect.\n");
879
Holger Hans Peter Freyther95e4d342010-03-30 13:00:10 +0200880 if (!g_cfg->source_addr) {
881 fprintf(stderr, "You need to specify a bind address.\n");
882 return -1;
883 }
884
Holger Hans Peter Freyther44016fe2011-02-28 14:46:01 +0100885 /* initialize the last ports */
886 g_cfg->last_bts_port = rtp_calculate_port(0, g_cfg->bts_ports.base_port);
887 g_cfg->last_net_port = rtp_calculate_port(0, g_cfg->net_ports.base_port);
888
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100889 if (allocate_trunk(&g_cfg->trunk) != 0) {
890 LOGP(DMGCP, LOGL_ERROR, "Failed to initialize the virtual trunk.\n");
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100891 return -1;
892 }
893
Holger Hans Peter Freyther1f0c5b42011-02-28 14:37:03 +0100894 llist_for_each_entry(trunk, &g_cfg->trunks, entry) {
895 if (allocate_trunk(trunk) != 0) {
896 LOGP(DMGCP, LOGL_ERROR,
897 "Failed to initialize E1 trunk %d.\n", trunk->trunk_nr);
898 return -1;
Holger Hans Peter Freyther218f8562010-09-18 02:30:02 +0800899 }
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100900 }
901
Holger Hans Peter Freyther8b5772e2010-08-05 01:28:22 +0800902 return 0;
Holger Hans Peter Freyther7bdc6372010-02-20 21:21:02 +0100903}
904