/* E1 vty interface */
/* (C) 2011-2021 by Harald Welte <laforge@gnumonks.org>
 * All Rights Reserved
 *
 * SPDX-License-Identifier: AGPL-3.0+
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */
#include "internal.h"

#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/un.h>

#include <osmocom/core/linuxlist.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/utils.h>
#include <osmocom/gsm/gsm_utils.h>

#include <osmocom/vty/command.h>
#include <osmocom/vty/buffer.h>
#include <osmocom/vty/vty.h>
#include <osmocom/vty/logging.h>
#include <osmocom/vty/misc.h>
#include <osmocom/vty/telnet_interface.h>

#include <osmocom/abis/e1_input.h>
#include <osmocom/abis/ipa.h>

#define X(x) (1 << x)

/* CONFIG */

#define E1_DRIVER_NAMES		"(misdn|misdn_lapd|dahdi|e1d|ipa|unixsocket)"
#define E1_DRIVER_HELP		"mISDN supported E1 Card (kernel LAPD)\n" \
				"mISDN supported E1 Card (userspace LAPD)\n" \
				"DAHDI supported E1/T1/J1 Card\n" \
				"osmo-e1d supported E1 interface\n" \
				"IPA TCP/IP input\n" \
				"Unix socket input\n"

#define E1_LINE_HELP		"Configure E1/T1/J1 Line\n" "Line Number\n"

/* Note: This requires a full restart of the application, since once created
 * an E1 line can not be destroyed again. */
DEFUN(cfg_e1line_driver, cfg_e1_line_driver_cmd,
	"e1_line <0-255> driver " E1_DRIVER_NAMES,
	E1_LINE_HELP "Set driver for this line\n"
	E1_DRIVER_HELP)
{
	struct e1inp_line *line;
	int e1_nr = atoi(argv[0]);

	line = e1inp_line_find(e1_nr);
	if (line) {
		vty_out(vty, "%% Line %d already exists%s", e1_nr, VTY_NEWLINE);
		return CMD_WARNING;
	}
	line = e1inp_line_create(e1_nr, argv[1]);
	if (!line) {
		vty_out(vty, "%% Error creating line %d%s", e1_nr, VTY_NEWLINE);
		return CMD_WARNING;
	}

	return CMD_SUCCESS;
}

DEFUN_USRATTR(cfg_e1line_port, cfg_e1_line_port_cmd,
	      X(OSMO_ABIS_LIB_ATTR_LINE_UPD),
	      "e1_line <0-255> port <0-255>",
	      E1_LINE_HELP "Set physical port/span/card number\n"
	      "E1/T1 Port/Span/Card number\n")
{
	struct e1inp_line *line;
	int e1_nr = atoi(argv[0]);

	line = e1inp_line_find(e1_nr);
	if (!line) {
		vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
		return CMD_WARNING;
	}

	line->port_nr = atoi(argv[1]);

	return CMD_SUCCESS;
}

DEFUN_USRATTR(cfg_e1line_socket, cfg_e1_line_socket_cmd,
	      X(OSMO_ABIS_LIB_ATTR_LINE_UPD),
	      "e1_line <0-255> socket .SOCKET",
	      E1_LINE_HELP "Set socket path for unixsocket\n"
	      "socket path\n")
{
	struct e1inp_line *line;
	int e1_nr = atoi(argv[0]);
	struct sockaddr_un sun;

	/* Don't exceed the maximum unix socket path length, including a NUL byte. See the unix(7) man page.*/
	if (strlen(argv[1]) > sizeof(sun.sun_path) - 1) {
		vty_out(vty, "%% Socket path length exceeds %zd bytes: '%s'%s",
			sizeof(sun.sun_path) - 1, argv[1], VTY_NEWLINE);
		return CMD_WARNING;
	}

	line = e1inp_line_find(e1_nr);
	if (!line) {
		vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
		return CMD_WARNING;
	}

	line->sock_path = talloc_strdup(line, argv[1]);

	return CMD_SUCCESS;
}

#define KEEPALIVE_HELP "Enable keep-alive probing\n"
static int set_keepalive_params(struct vty *vty, int e1_nr,
				int idle, int num_probes, int probe_interval)
{
	struct e1inp_line *line = e1inp_line_find(e1_nr);

	if (!line) {
		vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
		return CMD_WARNING;
	}
	if (!line->driver->has_keepalive && num_probes != 0) {
		vty_out(vty, "%% Driver '%s' does not support keep alive%s",
			line->driver->name, VTY_NEWLINE);
		return CMD_WARNING;
	}

	line->keepalive_idle_timeout = idle;
	line->keepalive_num_probes = num_probes;
	line->keepalive_probe_interval = probe_interval;

	return CMD_SUCCESS;
}

DEFUN_USRATTR(cfg_e1line_keepalive, cfg_e1_line_keepalive_cmd,
	      X(OSMO_ABIS_LIB_ATTR_IPA_NEW_LNK),
	      "e1_line <0-255> keepalive",
	      E1_LINE_HELP KEEPALIVE_HELP)
{
	return set_keepalive_params(vty, atoi(argv[0]),
				    E1INP_USE_DEFAULT, E1INP_USE_DEFAULT,
				    E1INP_USE_DEFAULT);
}

DEFUN_USRATTR(cfg_e1line_keepalive_params, cfg_e1_line_keepalive_params_cmd,
	      X(OSMO_ABIS_LIB_ATTR_IPA_NEW_LNK),
	      "e1_line <0-255> keepalive <1-300> <1-20> <1-300>",
	      E1_LINE_HELP KEEPALIVE_HELP
	      "Idle interval in seconds before probes are sent\n"
	      "Number of probes to sent\n"
	      "Delay between probe packets in seconds\n")
{
	return set_keepalive_params(vty, atoi(argv[0]),
				    atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
}

DEFUN_USRATTR(cfg_e1line_no_keepalive, cfg_e1_line_no_keepalive_cmd,
	      X(OSMO_ABIS_LIB_ATTR_IPA_NEW_LNK),
	      "no e1_line <0-255> keepalive",
	      NO_STR E1_LINE_HELP KEEPALIVE_HELP)
{
	return set_keepalive_params(vty, atoi(argv[0]), 0, 0, 0);
}

#define IPA_KEEPALIVE_HELP "Enable IPA PING/PONG keep-alive\n"
static int set_ipa_keepalive_params(struct vty *vty, int e1_nr, int interval, int wait_for_resp)
{
	struct e1inp_line *line = e1inp_line_find(e1_nr);

	if (!line) {
		vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
		return CMD_WARNING;
	}

	if (strcmp(line->driver->name, "ipa") != 0) {
		vty_out(vty, "%% Line %d doesn't use the ipa driver%s", e1_nr, VTY_NEWLINE);
		return CMD_WARNING;
	}

	TALLOC_FREE(line->ipa_kap);
	if (interval) {
		line->ipa_kap = talloc_zero(line, struct ipa_keepalive_params);
		line->ipa_kap->wait_for_resp = wait_for_resp;
		line->ipa_kap->interval = interval;
	}

	return CMD_SUCCESS;
}

DEFUN_ATTR(cfg_e1line_ipa_keepalive, cfg_e1_line_ipa_keepalive_cmd,
	   "e1_line <0-255> ipa-keepalive <1-300> <1-300>",
	   E1_LINE_HELP IPA_KEEPALIVE_HELP
	   "Idle interval in seconds before probes are sent\n"
	   "Time to wait for PONG response\n", CMD_ATTR_IMMEDIATE)
{
	return set_ipa_keepalive_params(vty, atoi(argv[0]), atoi(argv[1]), atoi(argv[2]));
}

DEFUN_ATTR(cfg_e1line_no_ipa_keepalive, cfg_e1_line_no_ipa_keepalive_cmd,
	   "no e1_line <0-255> ipa-keepalive",
	   NO_STR E1_LINE_HELP IPA_KEEPALIVE_HELP, CMD_ATTR_IMMEDIATE)
{
	return set_ipa_keepalive_params(vty, atoi(argv[0]), 0, 0);
}

DEFUN_ATTR(cfg_e1line_name, cfg_e1_line_name_cmd,
	   "e1_line <0-255> name .LINE",
	   E1_LINE_HELP "Set name for this line\n" "Human readable name\n",
	   CMD_ATTR_IMMEDIATE)
{
	struct e1inp_line *line;
	int e1_nr = atoi(argv[0]);

	line = e1inp_line_find(e1_nr);
	if (!line) {
		vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
		return CMD_WARNING;
	}
	if (line->name) {
		talloc_free((void *)line->name);
		line->name = NULL;
	}
	line->name = talloc_strdup(line, argv[1]);

	return CMD_SUCCESS;
}

DEFUN_ATTR(cfg_e1line_pcap, cfg_e1line_pcap_cmd,
	   "e1_line <0-255> pcap .FILE",
	   E1_LINE_HELP "Setup a pcap recording of E1 traffic for line\n"
	   "Filename to save the packets to\n", CMD_ATTR_IMMEDIATE)
{
	struct e1inp_line *line;
	int fd;
	int rc;
	int e1_nr = atoi(argv[0]);

	line = e1inp_line_find(e1_nr);
	if (!line) {
		vty_out(vty, "%% Line %d doesn't exist%s", e1_nr, VTY_NEWLINE);
		return CMD_WARNING;
	}

	fd = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0660);
	if (fd < 0) {
		vty_out(vty, "Failed to setup E1 pcap recording to %s%s", argv[1], VTY_NEWLINE);
		return CMD_WARNING;
	}

	rc = e1_set_pcap_fd2(line, fd);
	if (rc < 0) {
		vty_out(vty, "Failed to write to E1 pcap file %s%s", argv[1], VTY_NEWLINE);
		close(fd);
		return CMD_WARNING;
	}

	osmo_talloc_replace_string(line, &line->pcap_file, argv[1]);
	return CMD_SUCCESS;
}

DEFUN_ATTR(cfg_e1line_no_pcap, cfg_e1line_no_pcap_cmd,
	   "no e1_line <0-255> pcap",
	   NO_STR E1_LINE_HELP "Disable pcap recording of E1 traffic for line\n",
	   CMD_ATTR_IMMEDIATE)
{
	struct e1inp_line *line;
	int e1_nr = atoi(argv[0]);
	line = e1inp_line_find(e1_nr);

	e1_set_pcap_fd2(line, -1);
	if (line->pcap_file) {
		talloc_free(line->pcap_file);
		line->pcap_file = NULL;
	}
	return CMD_SUCCESS;
}

DEFUN_DEPRECATED(cfg_e1_pcap_deprec, cfg_e1_pcap_deprec_cmd,
	     "pcap .FILE", "Legacy")
{
	vty_out(vty, "%% 'pcap' is deprecated and has no effect: use e1_line <0-255> pcap%s",
		VTY_NEWLINE);
	return CMD_WARNING;
}

ALIAS_DEPRECATED(cfg_e1_pcap_deprec, cfg_e1_pcap_deprec_no_cmd,
	     "no pcap", NO_STR);

DEFUN_ATTR(cfg_e1inp, cfg_e1inp_cmd,
	   "e1_input",
	   "Configure E1/T1/J1 TDM input\n", CMD_ATTR_IMMEDIATE)
{
	vty->node = L_E1INP_NODE;

	return CMD_SUCCESS;
}

DEFUN_USRATTR(cfg_ipa_bind,
	      cfg_ipa_bind_cmd,
	      X(OSMO_ABIS_LIB_ATTR_LINE_UPD),
	      "ipa bind A.B.C.D",
	      "ipa driver config\n"
	      "Set ipa local bind address\n"
	      "Listen on this IP address (default 0.0.0.0)\n")
{
	e1inp_ipa_set_bind_addr(argv[0]);
	return CMD_SUCCESS;
}

DEFUN_USRATTR(cfg_ipa_dscp, cfg_ipa_dscp_cmd,
	      X(OSMO_ABIS_LIB_ATTR_IPA_NEW_LNK),
	      "ipa ip-dscp (oml|rsl) <0-63>",
	      "ipa driver config\n"
	      "Set IP DSCP value for outbound packets\n"
	      "Set IP DSCP for OML link\n"
	      "Set IP DSCP for RSL link\n"
	      "IP DSCP Value to use\n")
{
	if (!strcmp(argv[0], "oml"))
		g_e1inp_ipaccess_pars.oml.dscp = atoi(argv[1]);
	else
		g_e1inp_ipaccess_pars.rsl.dscp = atoi(argv[1]);
	return CMD_SUCCESS;
}

DEFUN_USRATTR(cfg_ipa_priority, cfg_ipa_priority_cmd,
	      X(OSMO_ABIS_LIB_ATTR_IPA_NEW_LNK),
	      "ipa socket-priority (oml|rsl) <0-255>",
	      "ipa driver config\n"
	      "Set socket priority value for outbound packets\n"
	      "Set socket priority for OML link\n"
	      "Set socket priority for RSL link\n"
	      "socket priority value to use (>6 requires CAP_NET_ADMIN)\n")
{
	if (!strcmp(argv[0], "oml"))
		g_e1inp_ipaccess_pars.oml.priority = atoi(argv[1]);
	else
		g_e1inp_ipaccess_pars.rsl.priority = atoi(argv[1]);
	return CMD_SUCCESS;
}

static int e1inp_config_write(struct vty *vty)
{
	struct e1inp_line *line;

	if (llist_empty(&e1inp_line_list))
		return CMD_SUCCESS;

	vty_out(vty, "e1_input%s", VTY_NEWLINE);

	llist_for_each_entry(line, &e1inp_line_list, list) {
		vty_out(vty, " e1_line %u driver %s%s", line->num,
			line->driver->name, VTY_NEWLINE);
		vty_out(vty, " e1_line %u port %u%s", line->num,
			line->port_nr, VTY_NEWLINE);
		if (line->name)
			vty_out(vty, " e1_line %u name %s%s", line->num,
				line->name, VTY_NEWLINE);
		if (!line->keepalive_num_probes)
			vty_out(vty, " no e1_line %u keepalive%s", line->num,
				VTY_NEWLINE);
		else if (line->keepalive_idle_timeout != E1INP_USE_DEFAULT ||
			 line->keepalive_num_probes != E1INP_USE_DEFAULT ||
			 line->keepalive_probe_interval != E1INP_USE_DEFAULT)
			vty_out(vty, " e1_line %u keepalive %d %d %d%s",
				line->num,
				line->keepalive_idle_timeout,
				line->keepalive_num_probes,
				line->keepalive_probe_interval,
				VTY_NEWLINE);
		if (line->ipa_kap)
			vty_out(vty, " e1_line %u ipa-keepalive %d %d%s", line->num,
				line->ipa_kap->interval, line->ipa_kap->wait_for_resp,
				VTY_NEWLINE);
		if (line->pcap_file)
			vty_out(vty, " e1_line %u pcap %s%s", line->num,
				line->pcap_file, VTY_NEWLINE);
	}

	const char *ipa_bind = e1inp_ipa_get_bind_addr();
	if (ipa_bind && (strcmp(ipa_bind, "0.0.0.0") != 0))
		vty_out(vty, " ipa bind %s%s",
			ipa_bind, VTY_NEWLINE);

	if (g_e1inp_ipaccess_pars.oml.dscp)
		vty_out(vty, " ipa ip-dscp oml %u%s", g_e1inp_ipaccess_pars.oml.dscp, VTY_NEWLINE);
	if (g_e1inp_ipaccess_pars.rsl.dscp)
		vty_out(vty, " ipa ip-dscp rsl %u%s", g_e1inp_ipaccess_pars.rsl.dscp, VTY_NEWLINE);
	if (g_e1inp_ipaccess_pars.oml.priority)
		vty_out(vty, " ipa socket-priority oml %u%s", g_e1inp_ipaccess_pars.oml.priority, VTY_NEWLINE);
	if (g_e1inp_ipaccess_pars.rsl.priority)
		vty_out(vty, " ipa socket-priority rsl %u%s", g_e1inp_ipaccess_pars.rsl.priority, VTY_NEWLINE);

	return CMD_SUCCESS;
}

/* SHOW */

static void e1drv_dump_vty(struct vty *vty, struct e1inp_driver *drv)
{
	vty_out(vty, "E1 Input Driver %s%s", drv->name, VTY_NEWLINE);
}

DEFUN(show_e1drv,
      show_e1drv_cmd,
      "show e1_driver",
	SHOW_STR "Display information about available E1 drivers\n")
{
	struct e1inp_driver *drv;

	llist_for_each_entry(drv, &e1inp_driver_list, list)
		e1drv_dump_vty(vty, drv);

	return CMD_SUCCESS;
}

static void e1line_dump_vty(struct vty *vty, struct e1inp_line *line,
			    int stats)
{
	vty_out(vty, "E1 Line Number %u, Name %s, Driver %s%s",
		line->num, line->name ? line->name : "",
		line->driver->name, VTY_NEWLINE);
	if (line->pcap_file)
		vty_out(vty, "PCAP %s%s", line->pcap_file, VTY_NEWLINE);
	if (line->driver->vty_show)
		line->driver->vty_show(vty, line);
	if (stats)
		vty_out_rate_ctr_group(vty, " ", line->rate_ctr);
}

DEFUN(show_e1line,
      show_e1line_cmd,
      "show e1_line [<0-255>] [stats]",
	SHOW_STR "Display information about a E1 line\n"
	"E1 Line Number\n" "Include statistics\n")
{
	struct e1inp_line *line;
	int stats = 0;

	if (argc >= 1 && strcmp(argv[0], "stats")) {
		int num = atoi(argv[0]);
		if (argc >= 2)
			stats = 1;
		llist_for_each_entry(line, &e1inp_line_list, list) {
			if (line->num == num) {
				e1line_dump_vty(vty, line, stats);
				return CMD_SUCCESS;
			}
		}
		return CMD_WARNING;
	}

	if (argc >= 1 && !strcmp(argv[0], "stats"))
		stats = 1;

	llist_for_each_entry(line, &e1inp_line_list, list)
		e1line_dump_vty(vty, line, stats);

	return CMD_SUCCESS;
}

static void e1ts_dump_vty(struct vty *vty, struct e1inp_ts *ts)
{
	if (ts->type == E1INP_TS_TYPE_NONE)
		return;
	vty_out(vty, "E1 Timeslot %2u of Line %u is Type %s%s",
		ts->num-1, ts->line->num, e1inp_tstype_name(ts->type),
		VTY_NEWLINE);
}

DEFUN(show_e1ts,
      show_e1ts_cmd,
      "show e1_timeslot [<0-255>] [<0-31>]",
	SHOW_STR "Display information about a E1 timeslot\n"
	"E1 Line Number\n" "E1 Timeslot Number\n")
{
	struct e1inp_line *line = NULL;
	struct e1inp_ts *ts;
	int ts_nr;

	if (argc <= 0) {
		llist_for_each_entry(line, &e1inp_line_list, list) {
			for (ts_nr = 0; ts_nr < line->num_ts; ts_nr++) {
				ts = &line->ts[ts_nr];
				e1ts_dump_vty(vty, ts);
			}
		}
		return CMD_SUCCESS;
	}
	if (argc >= 1) {
		int num = atoi(argv[0]);
		struct e1inp_line *l;
		llist_for_each_entry(l, &e1inp_line_list, list) {
			if (l->num == num) {
				line = l;
				break;
			}
		}
		if (!line) {
			vty_out(vty, "E1 line %s is invalid%s",
				argv[0], VTY_NEWLINE);
			return CMD_WARNING;
		}
	}
	if (argc >= 2) {
		ts_nr = atoi(argv[1]);
		if (ts_nr >= line->num_ts) {
			vty_out(vty, "E1 timeslot %s is invalid%s",
				argv[1], VTY_NEWLINE);
			return CMD_WARNING;
		}
		ts = &line->ts[ts_nr];
		e1ts_dump_vty(vty, ts);
		return CMD_SUCCESS;
	} else {
		for (ts_nr = 0; ts_nr < line->num_ts; ts_nr++) {
			ts = &line->ts[ts_nr];
			e1ts_dump_vty(vty, ts);
		}
		return CMD_SUCCESS;
	}
	return CMD_SUCCESS;
}


struct cmd_node e1inp_node = {
	L_E1INP_NODE,
	"%s(config-e1_input)# ",
	1,
};

int e1inp_vty_init(void)
{
	install_lib_element(CONFIG_NODE, &cfg_e1inp_cmd);
	install_node(&e1inp_node, e1inp_config_write);

	install_lib_element(L_E1INP_NODE, &cfg_e1line_pcap_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1line_no_pcap_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1_pcap_deprec_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1_pcap_deprec_no_cmd);

	install_lib_element(L_E1INP_NODE, &cfg_e1_line_driver_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1_line_port_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1_line_socket_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1_line_name_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1_line_keepalive_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1_line_keepalive_params_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1_line_no_keepalive_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1_line_ipa_keepalive_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_e1_line_no_ipa_keepalive_cmd);

	install_lib_element(L_E1INP_NODE, &cfg_ipa_bind_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_ipa_dscp_cmd);
	install_lib_element(L_E1INP_NODE, &cfg_ipa_priority_cmd);

	install_lib_element_ve(&show_e1drv_cmd);
	install_lib_element_ve(&show_e1line_cmd);
	install_lib_element_ve(&show_e1ts_cmd);

	return 0;
}
