18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
28c2ecf20Sopenharmony_ci/* Copyright (C) 2017-2018 Netronome Systems, Inc. */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#ifndef NFP_FLOWER_CMSG_H
58c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_H
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <linux/bitfield.h>
88c2ecf20Sopenharmony_ci#include <linux/skbuff.h>
98c2ecf20Sopenharmony_ci#include <linux/types.h>
108c2ecf20Sopenharmony_ci#include <net/geneve.h>
118c2ecf20Sopenharmony_ci#include <net/gre.h>
128c2ecf20Sopenharmony_ci#include <net/vxlan.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include "../nfp_app.h"
158c2ecf20Sopenharmony_ci#include "../nfpcore/nfp_cpp.h"
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_EXT_META	BIT(0)
188c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_PORT		BIT(1)
198c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_MAC		BIT(2)
208c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_TP		BIT(3)
218c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_IPV4		BIT(4)
228c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_IPV6		BIT(5)
238c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_CT		BIT(6)
248c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER_VXLAN		BIT(7)
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER2_GRE		BIT(0)
278c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER2_QINQ		BIT(4)
288c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER2_GENEVE	BIT(5)
298c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER2_GENEVE_OP	BIT(6)
308c2ecf20Sopenharmony_ci#define NFP_FLOWER_LAYER2_TUN_IPV6	BIT(7)
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_VLAN_PRIO	GENMASK(15, 13)
338c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_VLAN_PRESENT	BIT(12)
348c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_VLAN_VID	GENMASK(11, 0)
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_LB		GENMASK(31, 12)
378c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_TC		GENMASK(11, 9)
388c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_BOS	BIT(8)
398c2ecf20Sopenharmony_ci#define NFP_FLOWER_MASK_MPLS_Q		BIT(0)
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define NFP_FL_IP_FRAG_FIRST		BIT(7)
428c2ecf20Sopenharmony_ci#define NFP_FL_IP_FRAGMENTED		BIT(6)
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci/* GRE Tunnel flags */
458c2ecf20Sopenharmony_ci#define NFP_FL_GRE_FLAG_KEY		BIT(2)
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci/* Compressed HW representation of TCP Flags */
488c2ecf20Sopenharmony_ci#define NFP_FL_TCP_FLAG_URG		BIT(4)
498c2ecf20Sopenharmony_ci#define NFP_FL_TCP_FLAG_PSH		BIT(3)
508c2ecf20Sopenharmony_ci#define NFP_FL_TCP_FLAG_RST		BIT(2)
518c2ecf20Sopenharmony_ci#define NFP_FL_TCP_FLAG_SYN		BIT(1)
528c2ecf20Sopenharmony_ci#define NFP_FL_TCP_FLAG_FIN		BIT(0)
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci#define NFP_FL_SC_ACT_DROP		0x80000000
558c2ecf20Sopenharmony_ci#define NFP_FL_SC_ACT_USER		0x7D000000
568c2ecf20Sopenharmony_ci#define NFP_FL_SC_ACT_POPV		0x6A000000
578c2ecf20Sopenharmony_ci#define NFP_FL_SC_ACT_NULL		0x00000000
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci/* The maximum action list size (in bytes) supported by the NFP.
608c2ecf20Sopenharmony_ci */
618c2ecf20Sopenharmony_ci#define NFP_FL_MAX_A_SIZ		1216
628c2ecf20Sopenharmony_ci#define NFP_FL_LW_SIZ			2
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci/* Maximum allowed geneve options */
658c2ecf20Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_ACT	32
668c2ecf20Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_CNT	64
678c2ecf20Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_KEY	32
688c2ecf20Sopenharmony_ci#define NFP_FL_MAX_GENEVE_OPT_KEY_V6	8
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci/* Action opcodes */
718c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_OUTPUT		0
728c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PUSH_VLAN		1
738c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_POP_VLAN		2
748c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PUSH_MPLS		3
758c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_POP_MPLS		4
768c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_TUNNEL		6
778c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_ETHERNET	7
788c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_MPLS		8
798c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV4_ADDRS	9
808c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV4_TTL_TOS	10
818c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV6_SRC	11
828c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV6_DST	12
838c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_IPV6_TC_HL_FL	13
848c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_UDP		14
858c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_SET_TCP		15
868c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PRE_LAG		16
878c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PRE_TUNNEL		17
888c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_PUSH_GENEVE	26
898c2ecf20Sopenharmony_ci#define NFP_FL_ACTION_OPCODE_NUM		32
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ci#define NFP_FL_OUT_FLAGS_LAST		BIT(15)
928c2ecf20Sopenharmony_ci#define NFP_FL_OUT_FLAGS_USE_TUN	BIT(4)
938c2ecf20Sopenharmony_ci#define NFP_FL_OUT_FLAGS_TYPE_IDX	GENMASK(2, 0)
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci#define NFP_FL_PUSH_VLAN_PRIO		GENMASK(15, 13)
968c2ecf20Sopenharmony_ci#define NFP_FL_PUSH_VLAN_VID		GENMASK(11, 0)
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci#define IPV6_FLOW_LABEL_MASK		cpu_to_be32(0x000fffff)
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci/* LAG ports */
1018c2ecf20Sopenharmony_ci#define NFP_FL_LAG_OUT			0xC0DE0000
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci/* Tunnel ports */
1048c2ecf20Sopenharmony_ci#define NFP_FL_PORT_TYPE_TUN		0x50000000
1058c2ecf20Sopenharmony_ci#define NFP_FL_TUNNEL_TYPE		GENMASK(7, 4)
1068c2ecf20Sopenharmony_ci#define NFP_FL_PRE_TUN_INDEX		GENMASK(2, 0)
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci#define NFP_FLOWER_WORKQ_MAX_SKBS	30000
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci/* Cmesg reply (empirical) timeout*/
1118c2ecf20Sopenharmony_ci#define NFP_FL_REPLY_TIMEOUT		msecs_to_jiffies(40)
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci#define nfp_flower_cmsg_warn(app, fmt, args...)                         \
1148c2ecf20Sopenharmony_ci	do {                                                            \
1158c2ecf20Sopenharmony_ci		if (net_ratelimit())                                    \
1168c2ecf20Sopenharmony_ci			nfp_warn((app)->cpp, fmt, ## args);             \
1178c2ecf20Sopenharmony_ci	} while (0)
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_cienum nfp_flower_tun_type {
1208c2ecf20Sopenharmony_ci	NFP_FL_TUNNEL_NONE =	0,
1218c2ecf20Sopenharmony_ci	NFP_FL_TUNNEL_GRE =	1,
1228c2ecf20Sopenharmony_ci	NFP_FL_TUNNEL_VXLAN =	2,
1238c2ecf20Sopenharmony_ci	NFP_FL_TUNNEL_GENEVE =	4,
1248c2ecf20Sopenharmony_ci};
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_cistruct nfp_fl_act_head {
1278c2ecf20Sopenharmony_ci	u8 jump_id;
1288c2ecf20Sopenharmony_ci	u8 len_lw;
1298c2ecf20Sopenharmony_ci};
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_cistruct nfp_fl_set_eth {
1328c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
1338c2ecf20Sopenharmony_ci	__be16 reserved;
1348c2ecf20Sopenharmony_ci	u8 eth_addr_mask[ETH_ALEN * 2];
1358c2ecf20Sopenharmony_ci	u8 eth_addr_val[ETH_ALEN * 2];
1368c2ecf20Sopenharmony_ci};
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_cistruct nfp_fl_set_ip4_addrs {
1398c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
1408c2ecf20Sopenharmony_ci	__be16 reserved;
1418c2ecf20Sopenharmony_ci	__be32 ipv4_src_mask;
1428c2ecf20Sopenharmony_ci	__be32 ipv4_src;
1438c2ecf20Sopenharmony_ci	__be32 ipv4_dst_mask;
1448c2ecf20Sopenharmony_ci	__be32 ipv4_dst;
1458c2ecf20Sopenharmony_ci};
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_cistruct nfp_fl_set_ip4_ttl_tos {
1488c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
1498c2ecf20Sopenharmony_ci	u8 ipv4_ttl_mask;
1508c2ecf20Sopenharmony_ci	u8 ipv4_tos_mask;
1518c2ecf20Sopenharmony_ci	u8 ipv4_ttl;
1528c2ecf20Sopenharmony_ci	u8 ipv4_tos;
1538c2ecf20Sopenharmony_ci	__be16 reserved;
1548c2ecf20Sopenharmony_ci};
1558c2ecf20Sopenharmony_ci
1568c2ecf20Sopenharmony_cistruct nfp_fl_set_ipv6_tc_hl_fl {
1578c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
1588c2ecf20Sopenharmony_ci	u8 ipv6_tc_mask;
1598c2ecf20Sopenharmony_ci	u8 ipv6_hop_limit_mask;
1608c2ecf20Sopenharmony_ci	__be16 reserved;
1618c2ecf20Sopenharmony_ci	u8 ipv6_tc;
1628c2ecf20Sopenharmony_ci	u8 ipv6_hop_limit;
1638c2ecf20Sopenharmony_ci	__be32 ipv6_label_mask;
1648c2ecf20Sopenharmony_ci	__be32 ipv6_label;
1658c2ecf20Sopenharmony_ci};
1668c2ecf20Sopenharmony_ci
1678c2ecf20Sopenharmony_cistruct nfp_fl_set_ipv6_addr {
1688c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
1698c2ecf20Sopenharmony_ci	__be16 reserved;
1708c2ecf20Sopenharmony_ci	struct {
1718c2ecf20Sopenharmony_ci		__be32 mask;
1728c2ecf20Sopenharmony_ci		__be32 exact;
1738c2ecf20Sopenharmony_ci	} ipv6[4];
1748c2ecf20Sopenharmony_ci};
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_cistruct nfp_fl_set_tport {
1778c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
1788c2ecf20Sopenharmony_ci	__be16 reserved;
1798c2ecf20Sopenharmony_ci	u8 tp_port_mask[4];
1808c2ecf20Sopenharmony_ci	u8 tp_port_val[4];
1818c2ecf20Sopenharmony_ci};
1828c2ecf20Sopenharmony_ci
1838c2ecf20Sopenharmony_cistruct nfp_fl_output {
1848c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
1858c2ecf20Sopenharmony_ci	__be16 flags;
1868c2ecf20Sopenharmony_ci	__be32 port;
1878c2ecf20Sopenharmony_ci};
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_cistruct nfp_fl_push_vlan {
1908c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
1918c2ecf20Sopenharmony_ci	__be16 reserved;
1928c2ecf20Sopenharmony_ci	__be16 vlan_tpid;
1938c2ecf20Sopenharmony_ci	__be16 vlan_tci;
1948c2ecf20Sopenharmony_ci};
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_cistruct nfp_fl_pop_vlan {
1978c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
1988c2ecf20Sopenharmony_ci	__be16 reserved;
1998c2ecf20Sopenharmony_ci};
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_cistruct nfp_fl_pre_lag {
2028c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
2038c2ecf20Sopenharmony_ci	__be16 group_id;
2048c2ecf20Sopenharmony_ci	u8 lag_version[3];
2058c2ecf20Sopenharmony_ci	u8 instance;
2068c2ecf20Sopenharmony_ci};
2078c2ecf20Sopenharmony_ci
2088c2ecf20Sopenharmony_ci#define NFP_FL_PRE_LAG_VER_OFF	8
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_cistruct nfp_fl_pre_tunnel {
2118c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
2128c2ecf20Sopenharmony_ci	__be16 flags;
2138c2ecf20Sopenharmony_ci	union {
2148c2ecf20Sopenharmony_ci		__be32 ipv4_dst;
2158c2ecf20Sopenharmony_ci		struct in6_addr ipv6_dst;
2168c2ecf20Sopenharmony_ci	};
2178c2ecf20Sopenharmony_ci};
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_ci#define NFP_FL_PRE_TUN_IPV6	BIT(0)
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_cistruct nfp_fl_set_tun {
2228c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
2238c2ecf20Sopenharmony_ci	__be16 reserved;
2248c2ecf20Sopenharmony_ci	__be64 tun_id __packed;
2258c2ecf20Sopenharmony_ci	__be32 tun_type_index;
2268c2ecf20Sopenharmony_ci	__be16 tun_flags;
2278c2ecf20Sopenharmony_ci	u8 ttl;
2288c2ecf20Sopenharmony_ci	u8 tos;
2298c2ecf20Sopenharmony_ci	__be16 outer_vlan_tpid;
2308c2ecf20Sopenharmony_ci	__be16 outer_vlan_tci;
2318c2ecf20Sopenharmony_ci	u8 tun_len;
2328c2ecf20Sopenharmony_ci	u8 res2;
2338c2ecf20Sopenharmony_ci	__be16 tun_proto;
2348c2ecf20Sopenharmony_ci};
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_cistruct nfp_fl_push_geneve {
2378c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
2388c2ecf20Sopenharmony_ci	__be16 reserved;
2398c2ecf20Sopenharmony_ci	__be16 class;
2408c2ecf20Sopenharmony_ci	u8 type;
2418c2ecf20Sopenharmony_ci	u8 length;
2428c2ecf20Sopenharmony_ci	u8 opt_data[];
2438c2ecf20Sopenharmony_ci};
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_cistruct nfp_fl_push_mpls {
2468c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
2478c2ecf20Sopenharmony_ci	__be16 ethtype;
2488c2ecf20Sopenharmony_ci	__be32 lse;
2498c2ecf20Sopenharmony_ci};
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_cistruct nfp_fl_pop_mpls {
2528c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
2538c2ecf20Sopenharmony_ci	__be16 ethtype;
2548c2ecf20Sopenharmony_ci};
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_cistruct nfp_fl_set_mpls {
2578c2ecf20Sopenharmony_ci	struct nfp_fl_act_head head;
2588c2ecf20Sopenharmony_ci	__be16 reserved;
2598c2ecf20Sopenharmony_ci	__be32 lse_mask;
2608c2ecf20Sopenharmony_ci	__be32 lse;
2618c2ecf20Sopenharmony_ci};
2628c2ecf20Sopenharmony_ci
2638c2ecf20Sopenharmony_ci/* Metadata with L2 (1W/4B)
2648c2ecf20Sopenharmony_ci * ----------------------------------------------------------------
2658c2ecf20Sopenharmony_ci *    3                   2                   1
2668c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
2678c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2688c2ecf20Sopenharmony_ci * |    key_type   |    mask_id    | PCP |p|   vlan outermost VID  |
2698c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2708c2ecf20Sopenharmony_ci *                                 ^                               ^
2718c2ecf20Sopenharmony_ci *                           NOTE: |             TCI               |
2728c2ecf20Sopenharmony_ci *                                 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2738c2ecf20Sopenharmony_ci */
2748c2ecf20Sopenharmony_cistruct nfp_flower_meta_tci {
2758c2ecf20Sopenharmony_ci	u8 nfp_flow_key_layer;
2768c2ecf20Sopenharmony_ci	u8 mask_id;
2778c2ecf20Sopenharmony_ci	__be16 tci;
2788c2ecf20Sopenharmony_ci};
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_ci/* Extended metadata for additional key_layers (1W/4B)
2818c2ecf20Sopenharmony_ci * ----------------------------------------------------------------
2828c2ecf20Sopenharmony_ci *    3                   2                   1
2838c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
2848c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2858c2ecf20Sopenharmony_ci * |                      nfp_flow_key_layer2                      |
2868c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2878c2ecf20Sopenharmony_ci */
2888c2ecf20Sopenharmony_cistruct nfp_flower_ext_meta {
2898c2ecf20Sopenharmony_ci	__be32 nfp_flow_key_layer2;
2908c2ecf20Sopenharmony_ci};
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_ci/* Port details (1W/4B)
2938c2ecf20Sopenharmony_ci * ----------------------------------------------------------------
2948c2ecf20Sopenharmony_ci *    3                   2                   1
2958c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
2968c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2978c2ecf20Sopenharmony_ci * |                         port_ingress                          |
2988c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2998c2ecf20Sopenharmony_ci */
3008c2ecf20Sopenharmony_cistruct nfp_flower_in_port {
3018c2ecf20Sopenharmony_ci	__be32 in_port;
3028c2ecf20Sopenharmony_ci};
3038c2ecf20Sopenharmony_ci
3048c2ecf20Sopenharmony_ci/* L2 details (4W/16B)
3058c2ecf20Sopenharmony_ci *    3                   2                   1
3068c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
3078c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3088c2ecf20Sopenharmony_ci * |                     mac_addr_dst, 31 - 0                      |
3098c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3108c2ecf20Sopenharmony_ci * |      mac_addr_dst, 47 - 32    |     mac_addr_src, 15 - 0      |
3118c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3128c2ecf20Sopenharmony_ci * |                     mac_addr_src, 47 - 16                     |
3138c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3148c2ecf20Sopenharmony_ci * |       mpls outermost label            |  TC |B|   reserved  |q|
3158c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3168c2ecf20Sopenharmony_ci */
3178c2ecf20Sopenharmony_cistruct nfp_flower_mac_mpls {
3188c2ecf20Sopenharmony_ci	u8 mac_dst[6];
3198c2ecf20Sopenharmony_ci	u8 mac_src[6];
3208c2ecf20Sopenharmony_ci	__be32 mpls_lse;
3218c2ecf20Sopenharmony_ci};
3228c2ecf20Sopenharmony_ci
3238c2ecf20Sopenharmony_ci/* VLAN details (2W/8B)
3248c2ecf20Sopenharmony_ci *    3                   2                   1
3258c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
3268c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3278c2ecf20Sopenharmony_ci * |           outer_tpid          |           outer_tci           |
3288c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3298c2ecf20Sopenharmony_ci * |           inner_tpid          |           inner_tci           |
3308c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3318c2ecf20Sopenharmony_ci */
3328c2ecf20Sopenharmony_cistruct nfp_flower_vlan {
3338c2ecf20Sopenharmony_ci	__be16 outer_tpid;
3348c2ecf20Sopenharmony_ci	__be16 outer_tci;
3358c2ecf20Sopenharmony_ci	__be16 inner_tpid;
3368c2ecf20Sopenharmony_ci	__be16 inner_tci;
3378c2ecf20Sopenharmony_ci};
3388c2ecf20Sopenharmony_ci
3398c2ecf20Sopenharmony_ci/* L4 ports (for UDP, TCP, SCTP) (1W/4B)
3408c2ecf20Sopenharmony_ci *    3                   2                   1
3418c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
3428c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3438c2ecf20Sopenharmony_ci * |            port_src           |           port_dst            |
3448c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3458c2ecf20Sopenharmony_ci */
3468c2ecf20Sopenharmony_cistruct nfp_flower_tp_ports {
3478c2ecf20Sopenharmony_ci	__be16 port_src;
3488c2ecf20Sopenharmony_ci	__be16 port_dst;
3498c2ecf20Sopenharmony_ci};
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_cistruct nfp_flower_ip_ext {
3528c2ecf20Sopenharmony_ci	u8 tos;
3538c2ecf20Sopenharmony_ci	u8 proto;
3548c2ecf20Sopenharmony_ci	u8 ttl;
3558c2ecf20Sopenharmony_ci	u8 flags;
3568c2ecf20Sopenharmony_ci};
3578c2ecf20Sopenharmony_ci
3588c2ecf20Sopenharmony_ci/* L3 IPv4 details (3W/12B)
3598c2ecf20Sopenharmony_ci *    3                   2                   1
3608c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
3618c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3628c2ecf20Sopenharmony_ci * |    DSCP   |ECN|   protocol    |      ttl      |     flags     |
3638c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3648c2ecf20Sopenharmony_ci * |                        ipv4_addr_src                          |
3658c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3668c2ecf20Sopenharmony_ci * |                        ipv4_addr_dst                          |
3678c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3688c2ecf20Sopenharmony_ci */
3698c2ecf20Sopenharmony_cistruct nfp_flower_ipv4 {
3708c2ecf20Sopenharmony_ci	struct nfp_flower_ip_ext ip_ext;
3718c2ecf20Sopenharmony_ci	__be32 ipv4_src;
3728c2ecf20Sopenharmony_ci	__be32 ipv4_dst;
3738c2ecf20Sopenharmony_ci};
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_ci/* L3 IPv6 details (10W/40B)
3768c2ecf20Sopenharmony_ci *    3                   2                   1
3778c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
3788c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3798c2ecf20Sopenharmony_ci * |    DSCP   |ECN|   protocol    |      ttl      |     flags     |
3808c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3818c2ecf20Sopenharmony_ci * |   ipv6_exthdr   | res |            ipv6_flow_label            |
3828c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3838c2ecf20Sopenharmony_ci * |                  ipv6_addr_src,   31 - 0                      |
3848c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3858c2ecf20Sopenharmony_ci * |                  ipv6_addr_src,  63 - 32                      |
3868c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3878c2ecf20Sopenharmony_ci * |                  ipv6_addr_src,  95 - 64                      |
3888c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3898c2ecf20Sopenharmony_ci * |                  ipv6_addr_src, 127 - 96                      |
3908c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3918c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst,   31 - 0                      |
3928c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3938c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst,  63 - 32                      |
3948c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3958c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst,  95 - 64                      |
3968c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3978c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst, 127 - 96                      |
3988c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3998c2ecf20Sopenharmony_ci */
4008c2ecf20Sopenharmony_cistruct nfp_flower_ipv6 {
4018c2ecf20Sopenharmony_ci	struct nfp_flower_ip_ext ip_ext;
4028c2ecf20Sopenharmony_ci	__be32 ipv6_flow_label_exthdr;
4038c2ecf20Sopenharmony_ci	struct in6_addr ipv6_src;
4048c2ecf20Sopenharmony_ci	struct in6_addr ipv6_dst;
4058c2ecf20Sopenharmony_ci};
4068c2ecf20Sopenharmony_ci
4078c2ecf20Sopenharmony_cistruct nfp_flower_tun_ipv4 {
4088c2ecf20Sopenharmony_ci	__be32 src;
4098c2ecf20Sopenharmony_ci	__be32 dst;
4108c2ecf20Sopenharmony_ci};
4118c2ecf20Sopenharmony_ci
4128c2ecf20Sopenharmony_cistruct nfp_flower_tun_ipv6 {
4138c2ecf20Sopenharmony_ci	struct in6_addr src;
4148c2ecf20Sopenharmony_ci	struct in6_addr dst;
4158c2ecf20Sopenharmony_ci};
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_cistruct nfp_flower_tun_ip_ext {
4188c2ecf20Sopenharmony_ci	u8 tos;
4198c2ecf20Sopenharmony_ci	u8 ttl;
4208c2ecf20Sopenharmony_ci};
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_ci/* Flow Frame IPv4 UDP TUNNEL --> Tunnel details (4W/16B)
4238c2ecf20Sopenharmony_ci * -----------------------------------------------------------------
4248c2ecf20Sopenharmony_ci *    3                   2                   1
4258c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
4268c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4278c2ecf20Sopenharmony_ci * |                         ipv4_addr_src                         |
4288c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4298c2ecf20Sopenharmony_ci * |                         ipv4_addr_dst                         |
4308c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4318c2ecf20Sopenharmony_ci * |           Reserved            |      tos      |      ttl      |
4328c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4338c2ecf20Sopenharmony_ci * |                            Reserved                           |
4348c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4358c2ecf20Sopenharmony_ci * |                     VNI                       |   Reserved    |
4368c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4378c2ecf20Sopenharmony_ci */
4388c2ecf20Sopenharmony_cistruct nfp_flower_ipv4_udp_tun {
4398c2ecf20Sopenharmony_ci	struct nfp_flower_tun_ipv4 ipv4;
4408c2ecf20Sopenharmony_ci	__be16 reserved1;
4418c2ecf20Sopenharmony_ci	struct nfp_flower_tun_ip_ext ip_ext;
4428c2ecf20Sopenharmony_ci	__be32 reserved2;
4438c2ecf20Sopenharmony_ci	__be32 tun_id;
4448c2ecf20Sopenharmony_ci};
4458c2ecf20Sopenharmony_ci
4468c2ecf20Sopenharmony_ci/* Flow Frame IPv6 UDP TUNNEL --> Tunnel details (11W/44B)
4478c2ecf20Sopenharmony_ci * -----------------------------------------------------------------
4488c2ecf20Sopenharmony_ci *    3                   2                   1
4498c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
4508c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4518c2ecf20Sopenharmony_ci * |                  ipv6_addr_src,   31 - 0                      |
4528c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4538c2ecf20Sopenharmony_ci * |                  ipv6_addr_src,  63 - 32                      |
4548c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4558c2ecf20Sopenharmony_ci * |                  ipv6_addr_src,  95 - 64                      |
4568c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4578c2ecf20Sopenharmony_ci * |                  ipv6_addr_src, 127 - 96                      |
4588c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4598c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst,   31 - 0                      |
4608c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4618c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst,  63 - 32                      |
4628c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4638c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst,  95 - 64                      |
4648c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4658c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst, 127 - 96                      |
4668c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4678c2ecf20Sopenharmony_ci * |           Reserved            |      tos      |      ttl      |
4688c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4698c2ecf20Sopenharmony_ci * |                            Reserved                           |
4708c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4718c2ecf20Sopenharmony_ci * |                     VNI                       |   Reserved    |
4728c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4738c2ecf20Sopenharmony_ci */
4748c2ecf20Sopenharmony_cistruct nfp_flower_ipv6_udp_tun {
4758c2ecf20Sopenharmony_ci	struct nfp_flower_tun_ipv6 ipv6;
4768c2ecf20Sopenharmony_ci	__be16 reserved1;
4778c2ecf20Sopenharmony_ci	struct nfp_flower_tun_ip_ext ip_ext;
4788c2ecf20Sopenharmony_ci	__be32 reserved2;
4798c2ecf20Sopenharmony_ci	__be32 tun_id;
4808c2ecf20Sopenharmony_ci};
4818c2ecf20Sopenharmony_ci
4828c2ecf20Sopenharmony_ci/* Flow Frame GRE TUNNEL --> Tunnel details (6W/24B)
4838c2ecf20Sopenharmony_ci * -----------------------------------------------------------------
4848c2ecf20Sopenharmony_ci *    3                   2                   1
4858c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
4868c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4878c2ecf20Sopenharmony_ci * |                         ipv4_addr_src                         |
4888c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4898c2ecf20Sopenharmony_ci * |                         ipv4_addr_dst                         |
4908c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4918c2ecf20Sopenharmony_ci * |           tun_flags           |       tos     |       ttl     |
4928c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4938c2ecf20Sopenharmony_ci * |            Reserved           |           Ethertype           |
4948c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4958c2ecf20Sopenharmony_ci * |                              Key                              |
4968c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4978c2ecf20Sopenharmony_ci * |                           Reserved                            |
4988c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4998c2ecf20Sopenharmony_ci */
5008c2ecf20Sopenharmony_ci
5018c2ecf20Sopenharmony_cistruct nfp_flower_ipv4_gre_tun {
5028c2ecf20Sopenharmony_ci	struct nfp_flower_tun_ipv4 ipv4;
5038c2ecf20Sopenharmony_ci	__be16 tun_flags;
5048c2ecf20Sopenharmony_ci	struct nfp_flower_tun_ip_ext ip_ext;
5058c2ecf20Sopenharmony_ci	__be16 reserved1;
5068c2ecf20Sopenharmony_ci	__be16 ethertype;
5078c2ecf20Sopenharmony_ci	__be32 tun_key;
5088c2ecf20Sopenharmony_ci	__be32 reserved2;
5098c2ecf20Sopenharmony_ci};
5108c2ecf20Sopenharmony_ci
5118c2ecf20Sopenharmony_ci/* Flow Frame GRE TUNNEL V6 --> Tunnel details (12W/48B)
5128c2ecf20Sopenharmony_ci * -----------------------------------------------------------------
5138c2ecf20Sopenharmony_ci *    3                   2                   1
5148c2ecf20Sopenharmony_ci *  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
5158c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5168c2ecf20Sopenharmony_ci * |                  ipv6_addr_src,   31 - 0                      |
5178c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5188c2ecf20Sopenharmony_ci * |                  ipv6_addr_src,  63 - 32                      |
5198c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5208c2ecf20Sopenharmony_ci * |                  ipv6_addr_src,  95 - 64                      |
5218c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5228c2ecf20Sopenharmony_ci * |                  ipv6_addr_src, 127 - 96                      |
5238c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5248c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst,   31 - 0                      |
5258c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5268c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst,  63 - 32                      |
5278c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5288c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst,  95 - 64                      |
5298c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5308c2ecf20Sopenharmony_ci * |                  ipv6_addr_dst, 127 - 96                      |
5318c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5328c2ecf20Sopenharmony_ci * |           tun_flags           |       tos     |       ttl     |
5338c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5348c2ecf20Sopenharmony_ci * |            Reserved           |           Ethertype           |
5358c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5368c2ecf20Sopenharmony_ci * |                              Key                              |
5378c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5388c2ecf20Sopenharmony_ci * |                           Reserved                            |
5398c2ecf20Sopenharmony_ci * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5408c2ecf20Sopenharmony_ci */
5418c2ecf20Sopenharmony_cistruct nfp_flower_ipv6_gre_tun {
5428c2ecf20Sopenharmony_ci	struct nfp_flower_tun_ipv6 ipv6;
5438c2ecf20Sopenharmony_ci	__be16 tun_flags;
5448c2ecf20Sopenharmony_ci	struct nfp_flower_tun_ip_ext ip_ext;
5458c2ecf20Sopenharmony_ci	__be16 reserved1;
5468c2ecf20Sopenharmony_ci	__be16 ethertype;
5478c2ecf20Sopenharmony_ci	__be32 tun_key;
5488c2ecf20Sopenharmony_ci	__be32 reserved2;
5498c2ecf20Sopenharmony_ci};
5508c2ecf20Sopenharmony_ci
5518c2ecf20Sopenharmony_cistruct nfp_flower_geneve_options {
5528c2ecf20Sopenharmony_ci	u8 data[NFP_FL_MAX_GENEVE_OPT_KEY];
5538c2ecf20Sopenharmony_ci};
5548c2ecf20Sopenharmony_ci
5558c2ecf20Sopenharmony_ci#define NFP_FL_TUN_VNI_OFFSET 8
5568c2ecf20Sopenharmony_ci
5578c2ecf20Sopenharmony_ci/* The base header for a control message packet.
5588c2ecf20Sopenharmony_ci * Defines an 8-bit version, and an 8-bit type, padded
5598c2ecf20Sopenharmony_ci * to a 32-bit word. Rest of the packet is type-specific.
5608c2ecf20Sopenharmony_ci */
5618c2ecf20Sopenharmony_cistruct nfp_flower_cmsg_hdr {
5628c2ecf20Sopenharmony_ci	__be16 pad;
5638c2ecf20Sopenharmony_ci	u8 type;
5648c2ecf20Sopenharmony_ci	u8 version;
5658c2ecf20Sopenharmony_ci};
5668c2ecf20Sopenharmony_ci
5678c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_HLEN		sizeof(struct nfp_flower_cmsg_hdr)
5688c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_VER1		1
5698c2ecf20Sopenharmony_ci
5708c2ecf20Sopenharmony_ci/* Types defined for port related control messages  */
5718c2ecf20Sopenharmony_cienum nfp_flower_cmsg_type_port {
5728c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_FLOW_ADD =		0,
5738c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_FLOW_MOD =		1,
5748c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_FLOW_DEL =		2,
5758c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_LAG_CONFIG =	4,
5768c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_PORT_REIFY =	6,
5778c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_MAC_REPR =		7,
5788c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_PORT_MOD =		8,
5798c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_MERGE_HINT =	9,
5808c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_NO_NEIGH =		10,
5818c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_TUN_MAC =		11,
5828c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS =	12,
5838c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_TUN_NEIGH =	13,
5848c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_TUN_IPS =		14,
5858c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_FLOW_STATS =	15,
5868c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_PORT_ECHO =	16,
5878c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_QOS_MOD =		18,
5888c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_QOS_DEL =		19,
5898c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_QOS_STATS =	20,
5908c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_PRE_TUN_RULE =	21,
5918c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_TUN_IPS_V6 =	22,
5928c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_NO_NEIGH_V6 =	23,
5938c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6 =	24,
5948c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS_V6 =	25,
5958c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_TYPE_MAX =		32,
5968c2ecf20Sopenharmony_ci};
5978c2ecf20Sopenharmony_ci
5988c2ecf20Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_MAC_REPR */
5998c2ecf20Sopenharmony_cistruct nfp_flower_cmsg_mac_repr {
6008c2ecf20Sopenharmony_ci	u8 reserved[3];
6018c2ecf20Sopenharmony_ci	u8 num_ports;
6028c2ecf20Sopenharmony_ci	struct {
6038c2ecf20Sopenharmony_ci		u8 idx;
6048c2ecf20Sopenharmony_ci		u8 info;
6058c2ecf20Sopenharmony_ci		u8 nbi_port;
6068c2ecf20Sopenharmony_ci		u8 phys_port;
6078c2ecf20Sopenharmony_ci	} ports[];
6088c2ecf20Sopenharmony_ci};
6098c2ecf20Sopenharmony_ci
6108c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_MAC_REPR_NBI		GENMASK(1, 0)
6118c2ecf20Sopenharmony_ci
6128c2ecf20Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_PORT_MOD */
6138c2ecf20Sopenharmony_cistruct nfp_flower_cmsg_portmod {
6148c2ecf20Sopenharmony_ci	__be32 portnum;
6158c2ecf20Sopenharmony_ci	u8 reserved;
6168c2ecf20Sopenharmony_ci	u8 info;
6178c2ecf20Sopenharmony_ci	__be16 mtu;
6188c2ecf20Sopenharmony_ci};
6198c2ecf20Sopenharmony_ci
6208c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORTMOD_INFO_LINK	BIT(0)
6218c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORTMOD_MTU_CHANGE_ONLY	BIT(1)
6228c2ecf20Sopenharmony_ci
6238c2ecf20Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_PORT_REIFY */
6248c2ecf20Sopenharmony_cistruct nfp_flower_cmsg_portreify {
6258c2ecf20Sopenharmony_ci	__be32 portnum;
6268c2ecf20Sopenharmony_ci	u16 reserved;
6278c2ecf20Sopenharmony_ci	__be16 info;
6288c2ecf20Sopenharmony_ci};
6298c2ecf20Sopenharmony_ci
6308c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORTREIFY_INFO_EXIST	BIT(0)
6318c2ecf20Sopenharmony_ci
6328c2ecf20Sopenharmony_ci/* NFP_FLOWER_CMSG_TYPE_FLOW_MERGE_HINT */
6338c2ecf20Sopenharmony_cistruct nfp_flower_cmsg_merge_hint {
6348c2ecf20Sopenharmony_ci	u8 reserved[3];
6358c2ecf20Sopenharmony_ci	u8 count;
6368c2ecf20Sopenharmony_ci	struct {
6378c2ecf20Sopenharmony_ci		__be32 host_ctx;
6388c2ecf20Sopenharmony_ci		__be64 host_cookie;
6398c2ecf20Sopenharmony_ci	} __packed flow[];
6408c2ecf20Sopenharmony_ci};
6418c2ecf20Sopenharmony_ci
6428c2ecf20Sopenharmony_cienum nfp_flower_cmsg_port_type {
6438c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_PORT_TYPE_UNSPEC =	0x0,
6448c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT =	0x1,
6458c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT =	0x2,
6468c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT =  0x3,
6478c2ecf20Sopenharmony_ci};
6488c2ecf20Sopenharmony_ci
6498c2ecf20Sopenharmony_cienum nfp_flower_cmsg_port_vnic_type {
6508c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF =	0x0,
6518c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_PORT_VNIC_TYPE_PF =	0x1,
6528c2ecf20Sopenharmony_ci	NFP_FLOWER_CMSG_PORT_VNIC_TYPE_CTRL =	0x2,
6538c2ecf20Sopenharmony_ci};
6548c2ecf20Sopenharmony_ci
6558c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_TYPE		GENMASK(31, 28)
6568c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_SYS_ID		GENMASK(27, 24)
6578c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_NFP_ID		GENMASK(23, 22)
6588c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_PCI		GENMASK(15, 14)
6598c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_VNIC_TYPE		GENMASK(13, 12)
6608c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_VNIC		GENMASK(11, 6)
6618c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_PCIE_Q		GENMASK(5, 0)
6628c2ecf20Sopenharmony_ci#define NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM	GENMASK(7, 0)
6638c2ecf20Sopenharmony_ci
6648c2ecf20Sopenharmony_cistatic inline u32 nfp_flower_internal_port_get_port_id(u8 internal_port)
6658c2ecf20Sopenharmony_ci{
6668c2ecf20Sopenharmony_ci	return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM, internal_port) |
6678c2ecf20Sopenharmony_ci		FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE,
6688c2ecf20Sopenharmony_ci			   NFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT);
6698c2ecf20Sopenharmony_ci}
6708c2ecf20Sopenharmony_ci
6718c2ecf20Sopenharmony_cistatic inline u32 nfp_flower_cmsg_phys_port(u8 phys_port)
6728c2ecf20Sopenharmony_ci{
6738c2ecf20Sopenharmony_ci	return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM, phys_port) |
6748c2ecf20Sopenharmony_ci		FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE,
6758c2ecf20Sopenharmony_ci			   NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT);
6768c2ecf20Sopenharmony_ci}
6778c2ecf20Sopenharmony_ci
6788c2ecf20Sopenharmony_cistatic inline u32
6798c2ecf20Sopenharmony_cinfp_flower_cmsg_pcie_port(u8 nfp_pcie, enum nfp_flower_cmsg_port_vnic_type type,
6808c2ecf20Sopenharmony_ci			  u8 vnic, u8 q)
6818c2ecf20Sopenharmony_ci{
6828c2ecf20Sopenharmony_ci	return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PCI, nfp_pcie) |
6838c2ecf20Sopenharmony_ci		FIELD_PREP(NFP_FLOWER_CMSG_PORT_VNIC_TYPE, type) |
6848c2ecf20Sopenharmony_ci		FIELD_PREP(NFP_FLOWER_CMSG_PORT_VNIC, vnic) |
6858c2ecf20Sopenharmony_ci		FIELD_PREP(NFP_FLOWER_CMSG_PORT_PCIE_Q, q) |
6868c2ecf20Sopenharmony_ci		FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE,
6878c2ecf20Sopenharmony_ci			   NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT);
6888c2ecf20Sopenharmony_ci}
6898c2ecf20Sopenharmony_ci
6908c2ecf20Sopenharmony_cistatic inline void *nfp_flower_cmsg_get_data(struct sk_buff *skb)
6918c2ecf20Sopenharmony_ci{
6928c2ecf20Sopenharmony_ci	return (unsigned char *)skb->data + NFP_FLOWER_CMSG_HLEN;
6938c2ecf20Sopenharmony_ci}
6948c2ecf20Sopenharmony_ci
6958c2ecf20Sopenharmony_cistatic inline int nfp_flower_cmsg_get_data_len(struct sk_buff *skb)
6968c2ecf20Sopenharmony_ci{
6978c2ecf20Sopenharmony_ci	return skb->len - NFP_FLOWER_CMSG_HLEN;
6988c2ecf20Sopenharmony_ci}
6998c2ecf20Sopenharmony_ci
7008c2ecf20Sopenharmony_cistatic inline bool
7018c2ecf20Sopenharmony_cinfp_fl_netdev_is_tunnel_type(struct net_device *netdev,
7028c2ecf20Sopenharmony_ci			     enum nfp_flower_tun_type tun_type)
7038c2ecf20Sopenharmony_ci{
7048c2ecf20Sopenharmony_ci	if (netif_is_vxlan(netdev))
7058c2ecf20Sopenharmony_ci		return tun_type == NFP_FL_TUNNEL_VXLAN;
7068c2ecf20Sopenharmony_ci	if (netif_is_gretap(netdev))
7078c2ecf20Sopenharmony_ci		return tun_type == NFP_FL_TUNNEL_GRE;
7088c2ecf20Sopenharmony_ci	if (netif_is_geneve(netdev))
7098c2ecf20Sopenharmony_ci		return tun_type == NFP_FL_TUNNEL_GENEVE;
7108c2ecf20Sopenharmony_ci
7118c2ecf20Sopenharmony_ci	return false;
7128c2ecf20Sopenharmony_ci}
7138c2ecf20Sopenharmony_ci
7148c2ecf20Sopenharmony_cistatic inline bool nfp_fl_is_netdev_to_offload(struct net_device *netdev)
7158c2ecf20Sopenharmony_ci{
7168c2ecf20Sopenharmony_ci	if (!netdev->rtnl_link_ops)
7178c2ecf20Sopenharmony_ci		return false;
7188c2ecf20Sopenharmony_ci	if (!strcmp(netdev->rtnl_link_ops->kind, "openvswitch"))
7198c2ecf20Sopenharmony_ci		return true;
7208c2ecf20Sopenharmony_ci	if (netif_is_vxlan(netdev))
7218c2ecf20Sopenharmony_ci		return true;
7228c2ecf20Sopenharmony_ci	if (netif_is_geneve(netdev))
7238c2ecf20Sopenharmony_ci		return true;
7248c2ecf20Sopenharmony_ci	if (netif_is_gretap(netdev))
7258c2ecf20Sopenharmony_ci		return true;
7268c2ecf20Sopenharmony_ci
7278c2ecf20Sopenharmony_ci	return false;
7288c2ecf20Sopenharmony_ci}
7298c2ecf20Sopenharmony_ci
7308c2ecf20Sopenharmony_cistruct sk_buff *
7318c2ecf20Sopenharmony_cinfp_flower_cmsg_mac_repr_start(struct nfp_app *app, unsigned int num_ports);
7328c2ecf20Sopenharmony_civoid
7338c2ecf20Sopenharmony_cinfp_flower_cmsg_mac_repr_add(struct sk_buff *skb, unsigned int idx,
7348c2ecf20Sopenharmony_ci			     unsigned int nbi, unsigned int nbi_port,
7358c2ecf20Sopenharmony_ci			     unsigned int phys_port);
7368c2ecf20Sopenharmony_ciint nfp_flower_cmsg_portmod(struct nfp_repr *repr, bool carrier_ok,
7378c2ecf20Sopenharmony_ci			    unsigned int mtu, bool mtu_only);
7388c2ecf20Sopenharmony_ciint nfp_flower_cmsg_portreify(struct nfp_repr *repr, bool exists);
7398c2ecf20Sopenharmony_civoid nfp_flower_cmsg_process_rx(struct work_struct *work);
7408c2ecf20Sopenharmony_civoid nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb);
7418c2ecf20Sopenharmony_cistruct sk_buff *
7428c2ecf20Sopenharmony_cinfp_flower_cmsg_alloc(struct nfp_app *app, unsigned int size,
7438c2ecf20Sopenharmony_ci		      enum nfp_flower_cmsg_type_port type, gfp_t flag);
7448c2ecf20Sopenharmony_ci
7458c2ecf20Sopenharmony_ci#endif
746