/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (c) 2023 MediaTek Inc. All Rights Reserved.
 *
 * Author: Ren-Ting Wang <ren-ting.wang@mediatek.com>
 */

#ifndef _TOPS_PARAMS_H_
#define _TOPS_PARAMS_H_

#include <linux/if_ether.h>
#include <linux/seq_file.h>
#include <linux/types.h>

#include "tops/protocol/network/ip_params.h"
#include "tops/protocol/transport/udp_params.h"
#include "tops/protocol/tunnel/l2tp/l2tp_params.h"

/* tunnel params flags */
#define TNL_DECAP_ENABLE	(BIT(TNL_PARAMS_DECAP_ENABLE_BIT))
#define TNL_ENCAP_ENABLE	(BIT(TNL_PARAMS_ENCAP_ENABLE_BIT))

#define DEBUG_PROTO_LEN		(21)
#define DEBUG_PROTO_ETH		"eth"
#define DEBUG_PROTO_IP		"ipv4"
#define DEBUG_PROTO_UDP		"udp"
#define DEBUG_PROTO_GRETAP	"gretap"
#define DEBUG_PROTO_L2TP_V2	"l2tpv2"

enum tops_mac_type {
	TOPS_MAC_NONE,
	TOPS_MAC_ETH,

	__TOPS_MAC_TYPE_MAX,
};

enum tops_network_type {
	TOPS_NETWORK_NONE,
	TOPS_NETWORK_IPV4,

	__TOPS_NETWORK_TYPE_MAX,
};

enum tops_transport_type {
	TOPS_TRANSPORT_NONE,
	TOPS_TRANSPORT_UDP,

	__TOPS_TRANSPORT_TYPE_MAX,
};

enum tops_tunnel_type {
	TOPS_TUNNEL_NONE = 0,
	TOPS_TUNNEL_GRETAP,
	TOPS_TUNNEL_PPTP,
	TOPS_TUNNEL_L2TP_V2,
	TOPS_TUNNEL_L2TP_V3 = 5,
	TOPS_TUNNEL_VXLAN,
	TOPS_TUNNEL_NATT,
	TOPS_TUNNEL_CAPWAP_CTRL,
	TOPS_TUNNEL_CAPWAP_DATA,
	TOPS_TUNNEL_CAPWAP_DTLS = 10,
	TOPS_TUNNEL_IPSEC_ESP,
	TOPS_TUNNEL_IPSEC_AH,

	__TOPS_TUNNEL_TYPE_MAX = CONFIG_TOPS_TNL_TYPE_NUM,
};

enum tops_tnl_params_flag {
	TNL_PARAMS_DECAP_ENABLE_BIT,
	TNL_PARAMS_ENCAP_ENABLE_BIT,
};

struct tops_mac_params {
	union {
		struct ethhdr eth;
	};
	enum tops_mac_type type;
};

struct tops_network_params {
	union {
		struct tops_ip_params ip;
	};
	enum tops_network_type type;
};

struct tops_transport_params {
	union {
		struct tops_udp_params udp;
	};
	enum tops_transport_type type;
};

struct tops_tunnel_params {
	union {
		struct tops_l2tp_params l2tp;
	};
	enum tops_tunnel_type type;
};

struct tops_params {
	struct tops_mac_params mac;
	struct tops_network_params network;
	struct tops_transport_params transport;
	struct tops_tunnel_params tunnel;
};

/* record outer tunnel header data for HW offloading */
struct tops_tnl_params {
	struct tops_params params;
	u8 tops_entry_proto;
	u8 cls_entry;
	u8 cdrt;
	u8 flag; /* bit: enum tops_tnl_params_flag */
} __packed __aligned(16);

int
mtk_tops_encap_param_setup(struct sk_buff *skb,
			   struct tops_params *params,
			   int (*tnl_encap_param_setup)(struct sk_buff *skb,
							struct tops_params *params));
int
mtk_tops_decap_param_setup(struct sk_buff *skb,
			   struct tops_params *params,
			   int (*tnl_decap_param_setup)(struct sk_buff *skb,
							struct tops_params *params));

int mtk_tops_transport_decap_param_setup(struct sk_buff *skb,
					 struct tops_params *params);
int mtk_tops_network_decap_param_setup(struct sk_buff *skb,
				       struct tops_params *params);
int mtk_tops_mac_decap_param_setup(struct sk_buff *skb,
				       struct tops_params *params);

int mtk_tops_debug_param_proto_peek(const char *buf, int ofs, char *out);
int mtk_tops_debug_param_setup(const char *buf, int *ofs,
				   struct tops_params *params);
void mtk_tops_mac_param_dump(struct seq_file *s, struct tops_params *params);
void mtk_tops_network_param_dump(struct seq_file *s, struct tops_params *params);
void mtk_tops_transport_param_dump(struct seq_file *s, struct tops_params *params);

bool mtk_tops_params_match(struct tops_params *p1, struct tops_params *p2);
#endif /* _TOPS_PARAMS_H_ */
