blob: f6781d130a00141f0689e5a807c1f897a2eef176 [file] [log] [blame]
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +02001/* E1 vty interface */
Harald Welte41547552021-04-28 18:23:21 +02002/* (C) 2011-2021 by Harald Welte <laforge@gnumonks.org>
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +02003 * All Rights Reserved
4 *
Harald Welte323d39d2017-11-13 01:09:21 +09005 * SPDX-License-Identifier: AGPL-3.0+
6 *
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +02007 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
16 *
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 *
20 */
21#include "internal.h"
22
Sylvain Munauteb55e2f2020-05-08 09:42:51 +020023#include <fcntl.h>
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020024#include <stdlib.h>
25#include <unistd.h>
Harald Welted4f8f682011-08-19 13:28:48 +020026#include <string.h>
Sylvain Munauteb55e2f2020-05-08 09:42:51 +020027#include <sys/stat.h>
28#include <sys/types.h>
Stefan Sperlingb24efa52018-08-28 14:03:41 +020029#include <sys/un.h>
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020030
Harald Weltef2737fc2011-08-16 14:30:10 +020031#include <osmocom/core/linuxlist.h>
32#include <osmocom/core/talloc.h>
33#include <osmocom/core/utils.h>
34#include <osmocom/gsm/gsm_utils.h>
35
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020036#include <osmocom/vty/command.h>
37#include <osmocom/vty/buffer.h>
38#include <osmocom/vty/vty.h>
39#include <osmocom/vty/logging.h>
Harald Weltef2737fc2011-08-16 14:30:10 +020040#include <osmocom/vty/misc.h>
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020041#include <osmocom/vty/telnet_interface.h>
42
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020043#include <osmocom/abis/e1_input.h>
Eric Wildef1f3272019-07-10 18:10:31 +020044#include <osmocom/abis/ipa.h>
Harald Weltef2737fc2011-08-16 14:30:10 +020045
Philipp Maieref5b8392020-10-08 17:35:52 +020046#define X(x) (1 << x)
47
Harald Weltef2737fc2011-08-16 14:30:10 +020048/* CONFIG */
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020049
Sylvain Munautb559a532019-05-09 11:14:26 +020050#define E1_DRIVER_NAMES "(misdn|misdn_lapd|dahdi|e1d|ipa|unixsocket)"
Harald Weltece307b42011-08-21 01:18:05 +020051#define E1_DRIVER_HELP "mISDN supported E1 Card (kernel LAPD)\n" \
52 "mISDN supported E1 Card (userspace LAPD)\n" \
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020053 "DAHDI supported E1/T1/J1 Card\n" \
Harald Welte1f922842020-07-02 11:19:15 +020054 "osmo-e1d supported E1 interface\n" \
Holger Hans Peter Freyther36bac9a2012-07-20 23:49:52 +020055 "IPA TCP/IP input\n" \
Alexander Couzensbeb10ef2016-11-01 22:05:13 +010056 "Unix socket input\n"
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020057
Harald Welte601a9c72011-08-16 14:17:49 +020058#define E1_LINE_HELP "Configure E1/T1/J1 Line\n" "Line Number\n"
59
Philipp Maieref5b8392020-10-08 17:35:52 +020060/* Note: This requires a full restart of the application, since once created
61 * an E1 line can not be destroyed again. */
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020062DEFUN(cfg_e1line_driver, cfg_e1_line_driver_cmd,
63 "e1_line <0-255> driver " E1_DRIVER_NAMES,
Harald Welte601a9c72011-08-16 14:17:49 +020064 E1_LINE_HELP "Set driver for this line\n"
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020065 E1_DRIVER_HELP)
66{
67 struct e1inp_line *line;
68 int e1_nr = atoi(argv[0]);
69
Pablo Neira Ayuso3832c4f2011-07-07 17:47:26 +020070 line = e1inp_line_find(e1_nr);
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +020071 if (line) {
72 vty_out(vty, "%% Line %d already exists%s", e1_nr, VTY_NEWLINE);
73 return CMD_WARNING;
74 }
75 line = e1inp_line_create(e1_nr, argv[1]);
76 if (!line) {
77 vty_out(vty, "%% Error creating line %d%s", e1_nr, VTY_NEWLINE);
78 return CMD_WARNING;
79 }
80
81 return CMD_SUCCESS;
82}
83
Philipp Maieref5b8392020-10-08 17:35:52 +020084DEFUN_USRATTR(cfg_e1line_port, cfg_e1_line_port_cmd,
85 X(OSMO_ABIS_LIB_ATTR_LINE_UPD),
86 "e1_line <0-255> port <0-255>",
87 E1_LINE_HELP "Set physical port/span/card number\n"
88 "E1/T1 Port/Span/Card number\n")
Harald Weltec2889512011-09-13 23:49:04 +010089{
90 struct e1inp_line *line;
91 int e1_nr = atoi(argv[0]);
92
93 line = e1inp_line_find(e1_nr);
94 if (!line) {
95 vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
96 return CMD_WARNING;
97 }
98
99 line->port_nr = atoi(argv[1]);
100
101 return CMD_SUCCESS;
102}
103
Philipp Maieref5b8392020-10-08 17:35:52 +0200104DEFUN_USRATTR(cfg_e1line_socket, cfg_e1_line_socket_cmd,
105 X(OSMO_ABIS_LIB_ATTR_LINE_UPD),
106 "e1_line <0-255> socket .SOCKET",
107 E1_LINE_HELP "Set socket path for unixsocket\n"
108 "socket path\n")
Alexander Couzensbeb10ef2016-11-01 22:05:13 +0100109{
110 struct e1inp_line *line;
111 int e1_nr = atoi(argv[0]);
Stefan Sperlingb24efa52018-08-28 14:03:41 +0200112 struct sockaddr_un sun;
113
Stefan Sperling0d7d0b02018-09-20 17:34:31 +0200114 /* Don't exceed the maximum unix socket path length, including a NUL byte. See the unix(7) man page.*/
115 if (strlen(argv[1]) > sizeof(sun.sun_path) - 1) {
Stefan Sperlingb24efa52018-08-28 14:03:41 +0200116 vty_out(vty, "%% Socket path length exceeds %zd bytes: '%s'%s",
Stefan Sperling0d7d0b02018-09-20 17:34:31 +0200117 sizeof(sun.sun_path) - 1, argv[1], VTY_NEWLINE);
Stefan Sperlingb24efa52018-08-28 14:03:41 +0200118 return CMD_WARNING;
119 }
Alexander Couzensbeb10ef2016-11-01 22:05:13 +0100120
121 line = e1inp_line_find(e1_nr);
122 if (!line) {
123 vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
124 return CMD_WARNING;
125 }
126
127 line->sock_path = talloc_strdup(line, argv[1]);
128
129 return CMD_SUCCESS;
130}
131
Jacob Erlbeck86dae842014-01-16 18:10:37 +0100132#define KEEPALIVE_HELP "Enable keep-alive probing\n"
133static int set_keepalive_params(struct vty *vty, int e1_nr,
134 int idle, int num_probes, int probe_interval)
135{
136 struct e1inp_line *line = e1inp_line_find(e1_nr);
137
138 if (!line) {
139 vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
140 return CMD_WARNING;
141 }
142 if (!line->driver->has_keepalive && num_probes != 0) {
143 vty_out(vty, "%% Driver '%s' does not support keep alive%s",
144 line->driver->name, VTY_NEWLINE);
145 return CMD_WARNING;
146 }
147
148 line->keepalive_idle_timeout = idle;
149 line->keepalive_num_probes = num_probes;
150 line->keepalive_probe_interval = probe_interval;
151
152 return CMD_SUCCESS;
153}
154
Philipp Maieref5b8392020-10-08 17:35:52 +0200155DEFUN_USRATTR(cfg_e1line_keepalive, cfg_e1_line_keepalive_cmd,
156 X(OSMO_ABIS_LIB_ATTR_IPA_NEW_LNK),
157 "e1_line <0-255> keepalive",
158 E1_LINE_HELP KEEPALIVE_HELP)
Jacob Erlbeck86dae842014-01-16 18:10:37 +0100159{
160 return set_keepalive_params(vty, atoi(argv[0]),
161 E1INP_USE_DEFAULT, E1INP_USE_DEFAULT,
162 E1INP_USE_DEFAULT);
163}
164
Philipp Maieref5b8392020-10-08 17:35:52 +0200165DEFUN_USRATTR(cfg_e1line_keepalive_params, cfg_e1_line_keepalive_params_cmd,
166 X(OSMO_ABIS_LIB_ATTR_IPA_NEW_LNK),
167 "e1_line <0-255> keepalive <1-300> <1-20> <1-300>",
168 E1_LINE_HELP KEEPALIVE_HELP
169 "Idle interval in seconds before probes are sent\n"
170 "Number of probes to sent\n"
171 "Delay between probe packets in seconds\n")
Jacob Erlbeck86dae842014-01-16 18:10:37 +0100172{
173 return set_keepalive_params(vty, atoi(argv[0]),
174 atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
175}
176
Philipp Maieref5b8392020-10-08 17:35:52 +0200177DEFUN_USRATTR(cfg_e1line_no_keepalive, cfg_e1_line_no_keepalive_cmd,
178 X(OSMO_ABIS_LIB_ATTR_IPA_NEW_LNK),
179 "no e1_line <0-255> keepalive",
180 NO_STR E1_LINE_HELP KEEPALIVE_HELP)
Jacob Erlbeck86dae842014-01-16 18:10:37 +0100181{
182 return set_keepalive_params(vty, atoi(argv[0]), 0, 0, 0);
183}
184
Eric Wildef1f3272019-07-10 18:10:31 +0200185#define IPA_KEEPALIVE_HELP "Enable IPA PING/PONG keep-alive\n"
186static int set_ipa_keepalive_params(struct vty *vty, int e1_nr, int interval, int wait_for_resp)
187{
188 struct e1inp_line *line = e1inp_line_find(e1_nr);
189
190 if (!line) {
191 vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
192 return CMD_WARNING;
193 }
194
195 if (strcmp(line->driver->name, "ipa") != 0) {
196 vty_out(vty, "%% Line %d doesn't use the ipa driver%s", e1_nr, VTY_NEWLINE);
197 return CMD_WARNING;
198 }
199
200 TALLOC_FREE(line->ipa_kap);
201 if (interval) {
202 line->ipa_kap = talloc_zero(line, struct ipa_keepalive_params);
203 line->ipa_kap->wait_for_resp = wait_for_resp;
204 line->ipa_kap->interval = interval;
205 }
206
207 return CMD_SUCCESS;
208}
209
Philipp Maieref5b8392020-10-08 17:35:52 +0200210DEFUN_ATTR(cfg_e1line_ipa_keepalive, cfg_e1_line_ipa_keepalive_cmd,
211 "e1_line <0-255> ipa-keepalive <1-300> <1-300>",
212 E1_LINE_HELP IPA_KEEPALIVE_HELP
213 "Idle interval in seconds before probes are sent\n"
214 "Time to wait for PONG response\n", CMD_ATTR_IMMEDIATE)
Eric Wildef1f3272019-07-10 18:10:31 +0200215{
216 return set_ipa_keepalive_params(vty, atoi(argv[0]), atoi(argv[1]), atoi(argv[2]));
217}
218
Philipp Maieref5b8392020-10-08 17:35:52 +0200219DEFUN_ATTR(cfg_e1line_no_ipa_keepalive, cfg_e1_line_no_ipa_keepalive_cmd,
220 "no e1_line <0-255> ipa-keepalive",
221 NO_STR E1_LINE_HELP IPA_KEEPALIVE_HELP, CMD_ATTR_IMMEDIATE)
Eric Wildef1f3272019-07-10 18:10:31 +0200222{
223 return set_ipa_keepalive_params(vty, atoi(argv[0]), 0, 0);
224}
225
Philipp Maieref5b8392020-10-08 17:35:52 +0200226DEFUN_ATTR(cfg_e1line_name, cfg_e1_line_name_cmd,
227 "e1_line <0-255> name .LINE",
228 E1_LINE_HELP "Set name for this line\n" "Human readable name\n",
229 CMD_ATTR_IMMEDIATE)
Harald Welte601a9c72011-08-16 14:17:49 +0200230{
231 struct e1inp_line *line;
232 int e1_nr = atoi(argv[0]);
233
234 line = e1inp_line_find(e1_nr);
235 if (!line) {
236 vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
237 return CMD_WARNING;
238 }
239 if (line->name) {
240 talloc_free((void *)line->name);
241 line->name = NULL;
242 }
243 line->name = talloc_strdup(line, argv[1]);
244
245 return CMD_SUCCESS;
246}
247
Keith2672a2a2020-11-12 06:59:37 +0100248DEFUN_ATTR(cfg_e1line_pcap, cfg_e1line_pcap_cmd,
249 "e1_line <0-255> pcap .FILE",
250 E1_LINE_HELP "Setup a pcap recording of E1 traffic for line\n"
Philipp Maieref5b8392020-10-08 17:35:52 +0200251 "Filename to save the packets to\n", CMD_ATTR_IMMEDIATE)
Sylvain Munauteb55e2f2020-05-08 09:42:51 +0200252{
Keith2672a2a2020-11-12 06:59:37 +0100253 struct e1inp_line *line;
Sylvain Munauteb55e2f2020-05-08 09:42:51 +0200254 int fd;
Keith2672a2a2020-11-12 06:59:37 +0100255 int rc;
256 int e1_nr = atoi(argv[0]);
Sylvain Munauteb55e2f2020-05-08 09:42:51 +0200257
Keith2672a2a2020-11-12 06:59:37 +0100258 line = e1inp_line_find(e1_nr);
259 if (!line) {
260 vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
Sylvain Munauteb55e2f2020-05-08 09:42:51 +0200261 return CMD_WARNING;
262 }
263
Keith2672a2a2020-11-12 06:59:37 +0100264 fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0660);
265 if (fd < 0) {
266 vty_out(vty, "Failed to setup E1 pcap recording to %s%s", argv[1], VTY_NEWLINE);
267 return CMD_WARNING;
268 }
Sylvain Munauteb55e2f2020-05-08 09:42:51 +0200269
Keith2672a2a2020-11-12 06:59:37 +0100270 rc = e1_set_pcap_fd2(line, fd);
271 if (rc < 0) {
272 vty_out(vty, "Failed to write to E1 pcap file %s%s", argv[1], VTY_NEWLINE);
273 close(fd);
274 return CMD_WARNING;
275 }
276
277 osmo_talloc_replace_string(line, &line->pcap_file, argv[1]);
Sylvain Munauteb55e2f2020-05-08 09:42:51 +0200278 return CMD_SUCCESS;
279}
280
Keith2672a2a2020-11-12 06:59:37 +0100281DEFUN_ATTR(cfg_e1line_no_pcap, cfg_e1line_no_pcap_cmd,
282 "no e1_line <0-255> pcap",
283 NO_STR E1_LINE_HELP "Disable pcap recording of E1 traffic for line\n",
Philipp Maieref5b8392020-10-08 17:35:52 +0200284 CMD_ATTR_IMMEDIATE)
Sylvain Munauteb55e2f2020-05-08 09:42:51 +0200285{
Keith2672a2a2020-11-12 06:59:37 +0100286 struct e1inp_line *line;
287 int e1_nr = atoi(argv[0]);
288 line = e1inp_line_find(e1_nr);
289
290 e1_set_pcap_fd2(line, -1);
291 if (line->pcap_file) {
292 talloc_free(line->pcap_file);
293 line->pcap_file = NULL;
294 }
Sylvain Munauteb55e2f2020-05-08 09:42:51 +0200295 return CMD_SUCCESS;
296}
297
Keith2672a2a2020-11-12 06:59:37 +0100298DEFUN_DEPRECATED(cfg_e1_pcap_deprec, cfg_e1_pcap_deprec_cmd,
299 "pcap .FILE", "Legacy")
300{
301 vty_out(vty, "%% 'pcap' is deprecated and has no effect: use e1_line <0-255> pcap%s",
302 VTY_NEWLINE);
303 return CMD_WARNING;
304}
305
306ALIAS_DEPRECATED(cfg_e1_pcap_deprec, cfg_e1_pcap_deprec_no_cmd,
307 "no pcap", NO_STR);
308
Philipp Maieref5b8392020-10-08 17:35:52 +0200309DEFUN_ATTR(cfg_e1inp, cfg_e1inp_cmd,
310 "e1_input",
311 "Configure E1/T1/J1 TDM input\n", CMD_ATTR_IMMEDIATE)
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +0200312{
Harald Weltecc2241b2011-07-19 16:06:06 +0200313 vty->node = L_E1INP_NODE;
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +0200314
315 return CMD_SUCCESS;
316}
317
Philipp Maieref5b8392020-10-08 17:35:52 +0200318DEFUN_USRATTR(cfg_ipa_bind,
319 cfg_ipa_bind_cmd,
320 X(OSMO_ABIS_LIB_ATTR_LINE_UPD),
321 "ipa bind A.B.C.D",
322 "ipa driver config\n"
323 "Set ipa local bind address\n"
324 "Listen on this IP address (default 0.0.0.0)\n")
Neels Hofmeyr0db1d432016-02-22 13:29:09 +0100325{
326 e1inp_ipa_set_bind_addr(argv[0]);
327 return CMD_SUCCESS;
328}
329
Harald Welte41547552021-04-28 18:23:21 +0200330DEFUN_USRATTR(cfg_ipa_dscp, cfg_ipa_dscp_cmd,
331 X(OSMO_ABIS_LIB_ATTR_IPA_NEW_LNK),
332 "ipa ip-dscp (oml|rsl) <0-63>",
333 "ipa driver config\n"
334 "Set IP DSCP value for outbound packets\n"
335 "Set IP DSCP for OML link\n"
336 "Set IP DSCP for RSL link\n"
337 "IP DSCP Value to use\n")
338{
339 if (!strcmp(argv[0], "oml"))
340 g_e1inp_ipaccess_pars.oml.dscp = atoi(argv[1]);
341 else
342 g_e1inp_ipaccess_pars.rsl.dscp = atoi(argv[1]);
343 return CMD_SUCCESS;
344}
345
346DEFUN_USRATTR(cfg_ipa_priority, cfg_ipa_priority_cmd,
347 X(OSMO_ABIS_LIB_ATTR_IPA_NEW_LNK),
348 "ipa socket-priority (oml|rsl) <0-255>",
349 "ipa driver config\n"
350 "Set socket priority value for outbound packets\n"
351 "Set socket priority for OML link\n"
352 "Set socket priority for RSL link\n"
353 "socket priority value to use (>6 requires CAP_NET_ADMIN)\n")
354{
355 if (!strcmp(argv[0], "oml"))
356 g_e1inp_ipaccess_pars.oml.priority = atoi(argv[1]);
357 else
358 g_e1inp_ipaccess_pars.rsl.priority = atoi(argv[1]);
359 return CMD_SUCCESS;
360}
361
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +0200362static int e1inp_config_write(struct vty *vty)
363{
364 struct e1inp_line *line;
365
366 if (llist_empty(&e1inp_line_list))
367 return CMD_SUCCESS;
368
369 vty_out(vty, "e1_input%s", VTY_NEWLINE);
370
371 llist_for_each_entry(line, &e1inp_line_list, list) {
372 vty_out(vty, " e1_line %u driver %s%s", line->num,
373 line->driver->name, VTY_NEWLINE);
Harald Weltec2889512011-09-13 23:49:04 +0100374 vty_out(vty, " e1_line %u port %u%s", line->num,
375 line->port_nr, VTY_NEWLINE);
Harald Welte601a9c72011-08-16 14:17:49 +0200376 if (line->name)
377 vty_out(vty, " e1_line %u name %s%s", line->num,
378 line->name, VTY_NEWLINE);
Jacob Erlbeck86dae842014-01-16 18:10:37 +0100379 if (!line->keepalive_num_probes)
380 vty_out(vty, " no e1_line %u keepalive%s", line->num,
381 VTY_NEWLINE);
Oliver Smithef0f7c22022-11-23 12:32:36 +0100382 else if (line->keepalive_idle_timeout != E1INP_USE_DEFAULT ||
383 line->keepalive_num_probes != E1INP_USE_DEFAULT ||
384 line->keepalive_probe_interval != E1INP_USE_DEFAULT)
Jacob Erlbeck86dae842014-01-16 18:10:37 +0100385 vty_out(vty, " e1_line %u keepalive %d %d %d%s",
386 line->num,
387 line->keepalive_idle_timeout,
388 line->keepalive_num_probes,
389 line->keepalive_probe_interval,
390 VTY_NEWLINE);
Eric Wildef1f3272019-07-10 18:10:31 +0200391 if (line->ipa_kap)
392 vty_out(vty, " e1_line %u ipa-keepalive %d %d%s", line->num,
393 line->ipa_kap->interval, line->ipa_kap->wait_for_resp,
394 VTY_NEWLINE);
Keith2672a2a2020-11-12 06:59:37 +0100395 if (line->pcap_file)
396 vty_out(vty, " e1_line %u pcap %s%s", line->num,
397 line->pcap_file, VTY_NEWLINE);
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +0200398 }
Neels Hofmeyr0db1d432016-02-22 13:29:09 +0100399
400 const char *ipa_bind = e1inp_ipa_get_bind_addr();
401 if (ipa_bind && (strcmp(ipa_bind, "0.0.0.0") != 0))
402 vty_out(vty, " ipa bind %s%s",
403 ipa_bind, VTY_NEWLINE);
404
Harald Welte41547552021-04-28 18:23:21 +0200405 if (g_e1inp_ipaccess_pars.oml.dscp)
406 vty_out(vty, " ipa ip-dscp oml %u%s", g_e1inp_ipaccess_pars.oml.dscp, VTY_NEWLINE);
407 if (g_e1inp_ipaccess_pars.rsl.dscp)
408 vty_out(vty, " ipa ip-dscp rsl %u%s", g_e1inp_ipaccess_pars.rsl.dscp, VTY_NEWLINE);
409 if (g_e1inp_ipaccess_pars.oml.priority)
410 vty_out(vty, " ipa socket-priority oml %u%s", g_e1inp_ipaccess_pars.oml.priority, VTY_NEWLINE);
411 if (g_e1inp_ipaccess_pars.rsl.priority)
412 vty_out(vty, " ipa socket-priority rsl %u%s", g_e1inp_ipaccess_pars.rsl.priority, VTY_NEWLINE);
413
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +0200414 return CMD_SUCCESS;
415}
416
Harald Weltef2737fc2011-08-16 14:30:10 +0200417/* SHOW */
418
Harald Welte6e37c592011-08-11 12:43:31 +0200419static void e1drv_dump_vty(struct vty *vty, struct e1inp_driver *drv)
420{
421 vty_out(vty, "E1 Input Driver %s%s", drv->name, VTY_NEWLINE);
422}
423
424DEFUN(show_e1drv,
425 show_e1drv_cmd,
426 "show e1_driver",
427 SHOW_STR "Display information about available E1 drivers\n")
428{
429 struct e1inp_driver *drv;
430
431 llist_for_each_entry(drv, &e1inp_driver_list, list)
432 e1drv_dump_vty(vty, drv);
433
434 return CMD_SUCCESS;
435}
436
Harald Weltef2737fc2011-08-16 14:30:10 +0200437static void e1line_dump_vty(struct vty *vty, struct e1inp_line *line,
438 int stats)
Harald Welte6e37c592011-08-11 12:43:31 +0200439{
440 vty_out(vty, "E1 Line Number %u, Name %s, Driver %s%s",
441 line->num, line->name ? line->name : "",
442 line->driver->name, VTY_NEWLINE);
Keith2672a2a2020-11-12 06:59:37 +0100443 if (line->pcap_file)
444 vty_out(vty, "PCAP %s%s", line->pcap_file, VTY_NEWLINE);
Harald Weltefe05cf52011-09-26 23:18:41 +0200445 if (line->driver->vty_show)
446 line->driver->vty_show(vty, line);
Harald Weltef2737fc2011-08-16 14:30:10 +0200447 if (stats)
448 vty_out_rate_ctr_group(vty, " ", line->rate_ctr);
Harald Welte6e37c592011-08-11 12:43:31 +0200449}
450
451DEFUN(show_e1line,
452 show_e1line_cmd,
Keithdf088b02021-05-04 15:12:32 -0500453 "show e1_line [<0-255>] [stats]",
Harald Welte6e37c592011-08-11 12:43:31 +0200454 SHOW_STR "Display information about a E1 line\n"
Holger Hans Peter Freyther9e8f1c02012-07-21 00:09:52 +0200455 "E1 Line Number\n" "Include statistics\n")
Harald Welte6e37c592011-08-11 12:43:31 +0200456{
457 struct e1inp_line *line;
Harald Weltef2737fc2011-08-16 14:30:10 +0200458 int stats = 0;
Harald Welte6e37c592011-08-11 12:43:31 +0200459
Harald Weltef2737fc2011-08-16 14:30:10 +0200460 if (argc >= 1 && strcmp(argv[0], "stats")) {
Harald Welte6e37c592011-08-11 12:43:31 +0200461 int num = atoi(argv[0]);
Harald Weltef2737fc2011-08-16 14:30:10 +0200462 if (argc >= 2)
463 stats = 1;
Harald Welte6e37c592011-08-11 12:43:31 +0200464 llist_for_each_entry(line, &e1inp_line_list, list) {
465 if (line->num == num) {
Harald Weltef2737fc2011-08-16 14:30:10 +0200466 e1line_dump_vty(vty, line, stats);
Harald Welte6e37c592011-08-11 12:43:31 +0200467 return CMD_SUCCESS;
468 }
469 }
470 return CMD_WARNING;
471 }
472
Harald Weltef2737fc2011-08-16 14:30:10 +0200473 if (argc >= 1 && !strcmp(argv[0], "stats"))
474 stats = 1;
475
Harald Welte6e37c592011-08-11 12:43:31 +0200476 llist_for_each_entry(line, &e1inp_line_list, list)
Harald Weltef2737fc2011-08-16 14:30:10 +0200477 e1line_dump_vty(vty, line, stats);
Harald Welte6e37c592011-08-11 12:43:31 +0200478
479 return CMD_SUCCESS;
480}
481
482static void e1ts_dump_vty(struct vty *vty, struct e1inp_ts *ts)
483{
484 if (ts->type == E1INP_TS_TYPE_NONE)
485 return;
486 vty_out(vty, "E1 Timeslot %2u of Line %u is Type %s%s",
Keithdf088b02021-05-04 15:12:32 -0500487 ts->num-1, ts->line->num, e1inp_tstype_name(ts->type),
Harald Welte6e37c592011-08-11 12:43:31 +0200488 VTY_NEWLINE);
489}
490
491DEFUN(show_e1ts,
492 show_e1ts_cmd,
Keithdf088b02021-05-04 15:12:32 -0500493 "show e1_timeslot [<0-255>] [<0-31>]",
Harald Welte6e37c592011-08-11 12:43:31 +0200494 SHOW_STR "Display information about a E1 timeslot\n"
495 "E1 Line Number\n" "E1 Timeslot Number\n")
496{
497 struct e1inp_line *line = NULL;
498 struct e1inp_ts *ts;
499 int ts_nr;
500
Holger Hans Peter Freyther8cbd9f42013-07-04 20:00:33 +0200501 if (argc <= 0) {
Harald Welte6e37c592011-08-11 12:43:31 +0200502 llist_for_each_entry(line, &e1inp_line_list, list) {
Harald Weltec2889512011-09-13 23:49:04 +0100503 for (ts_nr = 0; ts_nr < line->num_ts; ts_nr++) {
Harald Welte6e37c592011-08-11 12:43:31 +0200504 ts = &line->ts[ts_nr];
505 e1ts_dump_vty(vty, ts);
506 }
507 }
508 return CMD_SUCCESS;
509 }
510 if (argc >= 1) {
511 int num = atoi(argv[0]);
512 struct e1inp_line *l;
513 llist_for_each_entry(l, &e1inp_line_list, list) {
514 if (l->num == num) {
515 line = l;
516 break;
517 }
518 }
519 if (!line) {
520 vty_out(vty, "E1 line %s is invalid%s",
521 argv[0], VTY_NEWLINE);
522 return CMD_WARNING;
523 }
524 }
525 if (argc >= 2) {
526 ts_nr = atoi(argv[1]);
Harald Weltec2889512011-09-13 23:49:04 +0100527 if (ts_nr >= line->num_ts) {
Harald Welte6e37c592011-08-11 12:43:31 +0200528 vty_out(vty, "E1 timeslot %s is invalid%s",
529 argv[1], VTY_NEWLINE);
530 return CMD_WARNING;
531 }
532 ts = &line->ts[ts_nr];
533 e1ts_dump_vty(vty, ts);
534 return CMD_SUCCESS;
535 } else {
Harald Weltec2889512011-09-13 23:49:04 +0100536 for (ts_nr = 0; ts_nr < line->num_ts; ts_nr++) {
Harald Welte6e37c592011-08-11 12:43:31 +0200537 ts = &line->ts[ts_nr];
538 e1ts_dump_vty(vty, ts);
539 }
540 return CMD_SUCCESS;
541 }
542 return CMD_SUCCESS;
543}
544
545
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +0200546struct cmd_node e1inp_node = {
Harald Weltecc2241b2011-07-19 16:06:06 +0200547 L_E1INP_NODE,
Jacob Erlbeck1c9dcc12013-11-11 14:13:13 +0100548 "%s(config-e1_input)# ",
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +0200549 1,
550};
551
552int e1inp_vty_init(void)
553{
Vadim Yanitskiy82ef2a22020-10-04 16:15:52 +0700554 install_lib_element(CONFIG_NODE, &cfg_e1inp_cmd);
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +0200555 install_node(&e1inp_node, e1inp_config_write);
Jacob Erlbeck37f06952013-11-11 14:13:12 +0100556
Keith2672a2a2020-11-12 06:59:37 +0100557 install_lib_element(L_E1INP_NODE, &cfg_e1line_pcap_cmd);
558 install_lib_element(L_E1INP_NODE, &cfg_e1line_no_pcap_cmd);
559 install_lib_element(L_E1INP_NODE, &cfg_e1_pcap_deprec_cmd);
560 install_lib_element(L_E1INP_NODE, &cfg_e1_pcap_deprec_no_cmd);
Sylvain Munauteb55e2f2020-05-08 09:42:51 +0200561
Vadim Yanitskiy82ef2a22020-10-04 16:15:52 +0700562 install_lib_element(L_E1INP_NODE, &cfg_e1_line_driver_cmd);
563 install_lib_element(L_E1INP_NODE, &cfg_e1_line_port_cmd);
564 install_lib_element(L_E1INP_NODE, &cfg_e1_line_socket_cmd);
565 install_lib_element(L_E1INP_NODE, &cfg_e1_line_name_cmd);
566 install_lib_element(L_E1INP_NODE, &cfg_e1_line_keepalive_cmd);
567 install_lib_element(L_E1INP_NODE, &cfg_e1_line_keepalive_params_cmd);
568 install_lib_element(L_E1INP_NODE, &cfg_e1_line_no_keepalive_cmd);
569 install_lib_element(L_E1INP_NODE, &cfg_e1_line_ipa_keepalive_cmd);
570 install_lib_element(L_E1INP_NODE, &cfg_e1_line_no_ipa_keepalive_cmd);
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +0200571
Vadim Yanitskiy82ef2a22020-10-04 16:15:52 +0700572 install_lib_element(L_E1INP_NODE, &cfg_ipa_bind_cmd);
Harald Welte41547552021-04-28 18:23:21 +0200573 install_lib_element(L_E1INP_NODE, &cfg_ipa_dscp_cmd);
574 install_lib_element(L_E1INP_NODE, &cfg_ipa_priority_cmd);
Neels Hofmeyr0db1d432016-02-22 13:29:09 +0100575
Vadim Yanitskiy82ef2a22020-10-04 16:15:52 +0700576 install_lib_element_ve(&show_e1drv_cmd);
577 install_lib_element_ve(&show_e1line_cmd);
578 install_lib_element_ve(&show_e1ts_cmd);
Harald Welte6e37c592011-08-11 12:43:31 +0200579
Pablo Neira Ayuso262aee82011-07-05 19:17:08 +0200580 return 0;
581}