/*
 **************************************************************************
 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all copies.
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 **************************************************************************
 */

/*
 * ovsmgr_debugfs.c
 *	Debugfs implementation for OVS datapath.
 */
#include <linux/debugfs.h>
#include <linux/list.h>
#include <linux/proc_fs.h>
#include <asm/atomic.h>
#include <datapath.h>

#include "ovsmgr.h"
#include "ovsmgr_priv.h"

static char *port_type[__OVS_VPORT_TYPE_MAX] = {
	"Unspecified Vport type",
	"Network device",
	"Internal device",
	"GRE device",
	"VxLAN device",
	"Geneve device",
};

/*
 * ovsmgr_debugfs_dp_info_show()
 */
static void ovsmgr_debugfs_dp_info_show(struct ovsmgr_dp *nod, struct seq_file *m)
{
	struct ovsmgr_dp_port *nodp;

	seq_printf(m, "Datapath Dev : %s \n", nod->dev->name);
	seq_printf(m, "datapath instance : %px\n", nod->dp);
	seq_printf(m, "Statistics:\n");

	list_for_each_entry(nodp, &nod->port_list, node) {
		seq_printf(m, "Port :\n");
		seq_printf(m, "\tdevice: %s\n", nodp->dev->name);
		seq_printf(m, "\tMaster device: %s\n", nodp->master_dev->name);
		seq_printf(m, "\tinstance : %px\n", nodp->vport);
		seq_printf(m, "\tport number : %d\n", nodp->vport_num);
		seq_printf(m, "\tport type : %s\n", port_type[nodp->vport_type]);
	}
}

/*
 * ovsmgr_debugfs_dp_show()
 */
static int ovsmgr_debugfs_dp_show(struct seq_file *m, void *p)
{
	struct ovsmgr_dp *nod;

	read_lock_bh(&ovsmgr_ctx.lock);

	seq_printf(m, "\tPackets received from DP: %llu\n", (u64)atomic64_read(&ovsmgr_ctx.stats.pkts_from_ovs_dp));
	seq_printf(m, "\tPacket forwarded to pre flow hooks : %llu\n", (u64)atomic64_read(&ovsmgr_ctx.stats.pkts_fwd_pre_flow));
	seq_printf(m, "\tPacket forwarded to post flow hooks : %llu\n", (u64)atomic64_read(&ovsmgr_ctx.stats.pkts_fwd_post_flow));

	list_for_each_entry(nod, &ovsmgr_ctx.dp_list, node) {
		ovsmgr_debugfs_dp_info_show(nod, m);
	}

	read_unlock_bh(&ovsmgr_ctx.lock);
	return 0;
}

/*
 * ovsmgr_debugfs_dp_open()
 */
static int ovsmgr_debugfs_dp_open(struct inode *inode, struct file *file)
{
	return single_open(file, ovsmgr_debugfs_dp_show, inode->i_private);
}

/*
 * Datapath file operation structure instance
 */
static const struct file_operations dp_op = {
	.open = ovsmgr_debugfs_dp_open,
	.read = seq_read,
	.llseek = seq_lseek,
	.release = seq_release
};

/*
 * ovsmgr_debugfs_cleanup()
 *	Cleanup the debugfs tree.
 */
void ovsmgr_debugfs_cleanup(void)
{
	debugfs_remove_recursive(ovsmgr_ctx.dentry);
}

/*
 * ovsmgr_debugfs_init()
 *	Initialize the debugfs tree.
 */
int ovsmgr_debugfs_init(void)
{
	/*
	 * initialize debugfs.
	 */
	ovsmgr_ctx.dentry = debugfs_create_dir("qca-ovsmgr", NULL);
	if (!ovsmgr_ctx.dentry) {
		ovsmgr_warn("Creating debug directory failed\n");
		return -1;
	}

	/*
	 * Create debugfs entries for datapath
	 */
	ovsmgr_ctx.dentry_file = debugfs_create_file("ovsdp", S_IRUGO, ovsmgr_ctx.dentry, NULL, &dp_op);
	if (!ovsmgr_ctx.dentry_file) {
		ovsmgr_warn("Debugfs file creation failed\n");
		debugfs_remove_recursive(ovsmgr_ctx.dentry);
		return -1;
	}

	return 0;
}
