// SPDX-License-Identifier: GPL-2.0+
/*
 * (C) Copyright 2019
 * Ramon Fried <rfried.dev@gmail.com>
 */

#include <command.h>
#include <vsprintf.h>
#include <net.h>
#include <net/pcap.h>

static int do_pcap_init(struct cmd_tbl *cmdtp, int flag, int argc,
			char *const argv[])
{
	phys_addr_t addr;
	unsigned int size;

	if (argc != 3)
		return CMD_RET_USAGE;

	addr = hextoul(argv[1], NULL);
	size = dectoul(argv[2], NULL);

	return pcap_init(addr, size) ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
}

static int do_pcap_start(struct cmd_tbl *cmdtp, int flag, int argc,
			 char *const argv[])
{
	return pcap_start_stop(true) ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
}

static int do_pcap_stop(struct cmd_tbl *cmdtp, int flag, int argc,
			char *const argv[])
{
	return pcap_start_stop(false) ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
}

static int do_pcap_status(struct cmd_tbl *cmdtp, int flag, int argc,
			  char *const argv[])
{
	return pcap_print_status() ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
}

static int do_pcap_clear(struct cmd_tbl *cmdtp, int flag, int argc,
			 char *const argv[])
{
	return pcap_clear() ? CMD_RET_FAILURE : CMD_RET_SUCCESS;
}

U_BOOT_LONGHELP(pcap,
	"- network packet capture\n\n"
	"pcap\n"
	"pcap init\t\t\t<addr> <max_size>\n"
	"pcap start\t\t\tstart capture\n"
	"pcap stop\t\t\tstop capture\n"
	"pcap status\t\t\tprint status\n"
	"pcap clear\t\t\tclear capture buffer\n"
	"\n"
	"With:\n"
	"\t<addr>: user address to which pcap will be stored (hexedcimal)\n"
	"\t<max_size>: Maximum size of pcap file (decimal)\n"
	"\n");

U_BOOT_CMD_WITH_SUBCMDS(pcap, "pcap", pcap_help_text,
			U_BOOT_SUBCMD_MKENT(init, 3, 0, do_pcap_init),
			U_BOOT_SUBCMD_MKENT(start, 1, 0, do_pcap_start),
			U_BOOT_SUBCMD_MKENT(stop, 1, 0, do_pcap_stop),
			U_BOOT_SUBCMD_MKENT(status, 1, 0, do_pcap_status),
			U_BOOT_SUBCMD_MKENT(clear, 1, 0, do_pcap_clear),
);
