xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/netronome/nfp/flower/cmsg.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2*4882a593Smuzhiyun /* Copyright (C) 2017-2018 Netronome Systems, Inc. */
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #ifndef NFP_FLOWER_CMSG_H
5*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_H
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/bitfield.h>
8*4882a593Smuzhiyun #include <linux/skbuff.h>
9*4882a593Smuzhiyun #include <linux/types.h>
10*4882a593Smuzhiyun #include <net/geneve.h>
11*4882a593Smuzhiyun #include <net/gre.h>
12*4882a593Smuzhiyun #include <net/vxlan.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include "../nfp_app.h"
15*4882a593Smuzhiyun #include "../nfpcore/nfp_cpp.h"
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define NFP_FLOWER_LAYER_EXT_META	BIT(0)
18*4882a593Smuzhiyun #define NFP_FLOWER_LAYER_PORT		BIT(1)
19*4882a593Smuzhiyun #define NFP_FLOWER_LAYER_MAC		BIT(2)
20*4882a593Smuzhiyun #define NFP_FLOWER_LAYER_TP		BIT(3)
21*4882a593Smuzhiyun #define NFP_FLOWER_LAYER_IPV4		BIT(4)
22*4882a593Smuzhiyun #define NFP_FLOWER_LAYER_IPV6		BIT(5)
23*4882a593Smuzhiyun #define NFP_FLOWER_LAYER_CT		BIT(6)
24*4882a593Smuzhiyun #define NFP_FLOWER_LAYER_VXLAN		BIT(7)
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define NFP_FLOWER_LAYER2_GRE		BIT(0)
27*4882a593Smuzhiyun #define NFP_FLOWER_LAYER2_QINQ		BIT(4)
28*4882a593Smuzhiyun #define NFP_FLOWER_LAYER2_GENEVE	BIT(5)
29*4882a593Smuzhiyun #define NFP_FLOWER_LAYER2_GENEVE_OP	BIT(6)
30*4882a593Smuzhiyun #define NFP_FLOWER_LAYER2_TUN_IPV6	BIT(7)
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define NFP_FLOWER_MASK_VLAN_PRIO	GENMASK(15, 13)
33*4882a593Smuzhiyun #define NFP_FLOWER_MASK_VLAN_PRESENT	BIT(12)
34*4882a593Smuzhiyun #define NFP_FLOWER_MASK_VLAN_VID	GENMASK(11, 0)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define NFP_FLOWER_MASK_MPLS_LB		GENMASK(31, 12)
37*4882a593Smuzhiyun #define NFP_FLOWER_MASK_MPLS_TC		GENMASK(11, 9)
38*4882a593Smuzhiyun #define NFP_FLOWER_MASK_MPLS_BOS	BIT(8)
39*4882a593Smuzhiyun #define NFP_FLOWER_MASK_MPLS_Q		BIT(0)
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #define NFP_FL_IP_FRAG_FIRST		BIT(7)
42*4882a593Smuzhiyun #define NFP_FL_IP_FRAGMENTED		BIT(6)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /* GRE Tunnel flags */
45*4882a593Smuzhiyun #define NFP_FL_GRE_FLAG_KEY		BIT(2)
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun /* Compressed HW representation of TCP Flags */
48*4882a593Smuzhiyun #define NFP_FL_TCP_FLAG_URG		BIT(4)
49*4882a593Smuzhiyun #define NFP_FL_TCP_FLAG_PSH		BIT(3)
50*4882a593Smuzhiyun #define NFP_FL_TCP_FLAG_RST		BIT(2)
51*4882a593Smuzhiyun #define NFP_FL_TCP_FLAG_SYN		BIT(1)
52*4882a593Smuzhiyun #define NFP_FL_TCP_FLAG_FIN		BIT(0)
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #define NFP_FL_SC_ACT_DROP		0x80000000
55*4882a593Smuzhiyun #define NFP_FL_SC_ACT_USER		0x7D000000
56*4882a593Smuzhiyun #define NFP_FL_SC_ACT_POPV		0x6A000000
57*4882a593Smuzhiyun #define NFP_FL_SC_ACT_NULL		0x00000000
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun /* The maximum action list size (in bytes) supported by the NFP.
60*4882a593Smuzhiyun  */
61*4882a593Smuzhiyun #define NFP_FL_MAX_A_SIZ		1216
62*4882a593Smuzhiyun #define NFP_FL_LW_SIZ			2
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /* Maximum allowed geneve options */
65*4882a593Smuzhiyun #define NFP_FL_MAX_GENEVE_OPT_ACT	32
66*4882a593Smuzhiyun #define NFP_FL_MAX_GENEVE_OPT_CNT	64
67*4882a593Smuzhiyun #define NFP_FL_MAX_GENEVE_OPT_KEY	32
68*4882a593Smuzhiyun #define NFP_FL_MAX_GENEVE_OPT_KEY_V6	8
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun /* Action opcodes */
71*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_OUTPUT		0
72*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_PUSH_VLAN		1
73*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_POP_VLAN		2
74*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_PUSH_MPLS		3
75*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_POP_MPLS		4
76*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_SET_TUNNEL		6
77*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_SET_ETHERNET	7
78*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_SET_MPLS		8
79*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_SET_IPV4_ADDRS	9
80*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_SET_IPV4_TTL_TOS	10
81*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_SET_IPV6_SRC	11
82*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_SET_IPV6_DST	12
83*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_SET_IPV6_TC_HL_FL	13
84*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_SET_UDP		14
85*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_SET_TCP		15
86*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_PRE_LAG		16
87*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_PRE_TUNNEL		17
88*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_PUSH_GENEVE	26
89*4882a593Smuzhiyun #define NFP_FL_ACTION_OPCODE_NUM		32
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define NFP_FL_OUT_FLAGS_LAST		BIT(15)
92*4882a593Smuzhiyun #define NFP_FL_OUT_FLAGS_USE_TUN	BIT(4)
93*4882a593Smuzhiyun #define NFP_FL_OUT_FLAGS_TYPE_IDX	GENMASK(2, 0)
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define NFP_FL_PUSH_VLAN_PRIO		GENMASK(15, 13)
96*4882a593Smuzhiyun #define NFP_FL_PUSH_VLAN_VID		GENMASK(11, 0)
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun #define IPV6_FLOW_LABEL_MASK		cpu_to_be32(0x000fffff)
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun /* LAG ports */
101*4882a593Smuzhiyun #define NFP_FL_LAG_OUT			0xC0DE0000
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun /* Tunnel ports */
104*4882a593Smuzhiyun #define NFP_FL_PORT_TYPE_TUN		0x50000000
105*4882a593Smuzhiyun #define NFP_FL_TUNNEL_TYPE		GENMASK(7, 4)
106*4882a593Smuzhiyun #define NFP_FL_PRE_TUN_INDEX		GENMASK(2, 0)
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #define NFP_FLOWER_WORKQ_MAX_SKBS	30000
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /* Cmesg reply (empirical) timeout*/
111*4882a593Smuzhiyun #define NFP_FL_REPLY_TIMEOUT		msecs_to_jiffies(40)
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define nfp_flower_cmsg_warn(app, fmt, args...)                         \
114*4882a593Smuzhiyun 	do {                                                            \
115*4882a593Smuzhiyun 		if (net_ratelimit())                                    \
116*4882a593Smuzhiyun 			nfp_warn((app)->cpp, fmt, ## args);             \
117*4882a593Smuzhiyun 	} while (0)
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun enum nfp_flower_tun_type {
120*4882a593Smuzhiyun 	NFP_FL_TUNNEL_NONE =	0,
121*4882a593Smuzhiyun 	NFP_FL_TUNNEL_GRE =	1,
122*4882a593Smuzhiyun 	NFP_FL_TUNNEL_VXLAN =	2,
123*4882a593Smuzhiyun 	NFP_FL_TUNNEL_GENEVE =	4,
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun struct nfp_fl_act_head {
127*4882a593Smuzhiyun 	u8 jump_id;
128*4882a593Smuzhiyun 	u8 len_lw;
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun struct nfp_fl_set_eth {
132*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
133*4882a593Smuzhiyun 	__be16 reserved;
134*4882a593Smuzhiyun 	u8 eth_addr_mask[ETH_ALEN * 2];
135*4882a593Smuzhiyun 	u8 eth_addr_val[ETH_ALEN * 2];
136*4882a593Smuzhiyun };
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun struct nfp_fl_set_ip4_addrs {
139*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
140*4882a593Smuzhiyun 	__be16 reserved;
141*4882a593Smuzhiyun 	__be32 ipv4_src_mask;
142*4882a593Smuzhiyun 	__be32 ipv4_src;
143*4882a593Smuzhiyun 	__be32 ipv4_dst_mask;
144*4882a593Smuzhiyun 	__be32 ipv4_dst;
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun struct nfp_fl_set_ip4_ttl_tos {
148*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
149*4882a593Smuzhiyun 	u8 ipv4_ttl_mask;
150*4882a593Smuzhiyun 	u8 ipv4_tos_mask;
151*4882a593Smuzhiyun 	u8 ipv4_ttl;
152*4882a593Smuzhiyun 	u8 ipv4_tos;
153*4882a593Smuzhiyun 	__be16 reserved;
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun struct nfp_fl_set_ipv6_tc_hl_fl {
157*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
158*4882a593Smuzhiyun 	u8 ipv6_tc_mask;
159*4882a593Smuzhiyun 	u8 ipv6_hop_limit_mask;
160*4882a593Smuzhiyun 	__be16 reserved;
161*4882a593Smuzhiyun 	u8 ipv6_tc;
162*4882a593Smuzhiyun 	u8 ipv6_hop_limit;
163*4882a593Smuzhiyun 	__be32 ipv6_label_mask;
164*4882a593Smuzhiyun 	__be32 ipv6_label;
165*4882a593Smuzhiyun };
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun struct nfp_fl_set_ipv6_addr {
168*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
169*4882a593Smuzhiyun 	__be16 reserved;
170*4882a593Smuzhiyun 	struct {
171*4882a593Smuzhiyun 		__be32 mask;
172*4882a593Smuzhiyun 		__be32 exact;
173*4882a593Smuzhiyun 	} ipv6[4];
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun struct nfp_fl_set_tport {
177*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
178*4882a593Smuzhiyun 	__be16 reserved;
179*4882a593Smuzhiyun 	u8 tp_port_mask[4];
180*4882a593Smuzhiyun 	u8 tp_port_val[4];
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun struct nfp_fl_output {
184*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
185*4882a593Smuzhiyun 	__be16 flags;
186*4882a593Smuzhiyun 	__be32 port;
187*4882a593Smuzhiyun };
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun struct nfp_fl_push_vlan {
190*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
191*4882a593Smuzhiyun 	__be16 reserved;
192*4882a593Smuzhiyun 	__be16 vlan_tpid;
193*4882a593Smuzhiyun 	__be16 vlan_tci;
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun struct nfp_fl_pop_vlan {
197*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
198*4882a593Smuzhiyun 	__be16 reserved;
199*4882a593Smuzhiyun };
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun struct nfp_fl_pre_lag {
202*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
203*4882a593Smuzhiyun 	__be16 group_id;
204*4882a593Smuzhiyun 	u8 lag_version[3];
205*4882a593Smuzhiyun 	u8 instance;
206*4882a593Smuzhiyun };
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun #define NFP_FL_PRE_LAG_VER_OFF	8
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun struct nfp_fl_pre_tunnel {
211*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
212*4882a593Smuzhiyun 	__be16 flags;
213*4882a593Smuzhiyun 	union {
214*4882a593Smuzhiyun 		__be32 ipv4_dst;
215*4882a593Smuzhiyun 		struct in6_addr ipv6_dst;
216*4882a593Smuzhiyun 	};
217*4882a593Smuzhiyun };
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun #define NFP_FL_PRE_TUN_IPV6	BIT(0)
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun struct nfp_fl_set_tun {
222*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
223*4882a593Smuzhiyun 	__be16 reserved;
224*4882a593Smuzhiyun 	__be64 tun_id __packed;
225*4882a593Smuzhiyun 	__be32 tun_type_index;
226*4882a593Smuzhiyun 	__be16 tun_flags;
227*4882a593Smuzhiyun 	u8 ttl;
228*4882a593Smuzhiyun 	u8 tos;
229*4882a593Smuzhiyun 	__be16 outer_vlan_tpid;
230*4882a593Smuzhiyun 	__be16 outer_vlan_tci;
231*4882a593Smuzhiyun 	u8 tun_len;
232*4882a593Smuzhiyun 	u8 res2;
233*4882a593Smuzhiyun 	__be16 tun_proto;
234*4882a593Smuzhiyun };
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun struct nfp_fl_push_geneve {
237*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
238*4882a593Smuzhiyun 	__be16 reserved;
239*4882a593Smuzhiyun 	__be16 class;
240*4882a593Smuzhiyun 	u8 type;
241*4882a593Smuzhiyun 	u8 length;
242*4882a593Smuzhiyun 	u8 opt_data[];
243*4882a593Smuzhiyun };
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun struct nfp_fl_push_mpls {
246*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
247*4882a593Smuzhiyun 	__be16 ethtype;
248*4882a593Smuzhiyun 	__be32 lse;
249*4882a593Smuzhiyun };
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun struct nfp_fl_pop_mpls {
252*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
253*4882a593Smuzhiyun 	__be16 ethtype;
254*4882a593Smuzhiyun };
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun struct nfp_fl_set_mpls {
257*4882a593Smuzhiyun 	struct nfp_fl_act_head head;
258*4882a593Smuzhiyun 	__be16 reserved;
259*4882a593Smuzhiyun 	__be32 lse_mask;
260*4882a593Smuzhiyun 	__be32 lse;
261*4882a593Smuzhiyun };
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun /* Metadata with L2 (1W/4B)
264*4882a593Smuzhiyun  * ----------------------------------------------------------------
265*4882a593Smuzhiyun  *    3                   2                   1
266*4882a593Smuzhiyun  *  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
267*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
268*4882a593Smuzhiyun  * |    key_type   |    mask_id    | PCP |p|   vlan outermost VID  |
269*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
270*4882a593Smuzhiyun  *                                 ^                               ^
271*4882a593Smuzhiyun  *                           NOTE: |             TCI               |
272*4882a593Smuzhiyun  *                                 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
273*4882a593Smuzhiyun  */
274*4882a593Smuzhiyun struct nfp_flower_meta_tci {
275*4882a593Smuzhiyun 	u8 nfp_flow_key_layer;
276*4882a593Smuzhiyun 	u8 mask_id;
277*4882a593Smuzhiyun 	__be16 tci;
278*4882a593Smuzhiyun };
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun /* Extended metadata for additional key_layers (1W/4B)
281*4882a593Smuzhiyun  * ----------------------------------------------------------------
282*4882a593Smuzhiyun  *    3                   2                   1
283*4882a593Smuzhiyun  *  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
284*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
285*4882a593Smuzhiyun  * |                      nfp_flow_key_layer2                      |
286*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
287*4882a593Smuzhiyun  */
288*4882a593Smuzhiyun struct nfp_flower_ext_meta {
289*4882a593Smuzhiyun 	__be32 nfp_flow_key_layer2;
290*4882a593Smuzhiyun };
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun /* Port details (1W/4B)
293*4882a593Smuzhiyun  * ----------------------------------------------------------------
294*4882a593Smuzhiyun  *    3                   2                   1
295*4882a593Smuzhiyun  *  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
296*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
297*4882a593Smuzhiyun  * |                         port_ingress                          |
298*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
299*4882a593Smuzhiyun  */
300*4882a593Smuzhiyun struct nfp_flower_in_port {
301*4882a593Smuzhiyun 	__be32 in_port;
302*4882a593Smuzhiyun };
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun /* L2 details (4W/16B)
305*4882a593Smuzhiyun  *    3                   2                   1
306*4882a593Smuzhiyun  *  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
307*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
308*4882a593Smuzhiyun  * |                     mac_addr_dst, 31 - 0                      |
309*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
310*4882a593Smuzhiyun  * |      mac_addr_dst, 47 - 32    |     mac_addr_src, 15 - 0      |
311*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
312*4882a593Smuzhiyun  * |                     mac_addr_src, 47 - 16                     |
313*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
314*4882a593Smuzhiyun  * |       mpls outermost label            |  TC |B|   reserved  |q|
315*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
316*4882a593Smuzhiyun  */
317*4882a593Smuzhiyun struct nfp_flower_mac_mpls {
318*4882a593Smuzhiyun 	u8 mac_dst[6];
319*4882a593Smuzhiyun 	u8 mac_src[6];
320*4882a593Smuzhiyun 	__be32 mpls_lse;
321*4882a593Smuzhiyun };
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun /* VLAN details (2W/8B)
324*4882a593Smuzhiyun  *    3                   2                   1
325*4882a593Smuzhiyun  *  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
326*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
327*4882a593Smuzhiyun  * |           outer_tpid          |           outer_tci           |
328*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
329*4882a593Smuzhiyun  * |           inner_tpid          |           inner_tci           |
330*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
331*4882a593Smuzhiyun  */
332*4882a593Smuzhiyun struct nfp_flower_vlan {
333*4882a593Smuzhiyun 	__be16 outer_tpid;
334*4882a593Smuzhiyun 	__be16 outer_tci;
335*4882a593Smuzhiyun 	__be16 inner_tpid;
336*4882a593Smuzhiyun 	__be16 inner_tci;
337*4882a593Smuzhiyun };
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun /* L4 ports (for UDP, TCP, SCTP) (1W/4B)
340*4882a593Smuzhiyun  *    3                   2                   1
341*4882a593Smuzhiyun  *  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
342*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
343*4882a593Smuzhiyun  * |            port_src           |           port_dst            |
344*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
345*4882a593Smuzhiyun  */
346*4882a593Smuzhiyun struct nfp_flower_tp_ports {
347*4882a593Smuzhiyun 	__be16 port_src;
348*4882a593Smuzhiyun 	__be16 port_dst;
349*4882a593Smuzhiyun };
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun struct nfp_flower_ip_ext {
352*4882a593Smuzhiyun 	u8 tos;
353*4882a593Smuzhiyun 	u8 proto;
354*4882a593Smuzhiyun 	u8 ttl;
355*4882a593Smuzhiyun 	u8 flags;
356*4882a593Smuzhiyun };
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun /* L3 IPv4 details (3W/12B)
359*4882a593Smuzhiyun  *    3                   2                   1
360*4882a593Smuzhiyun  *  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
361*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
362*4882a593Smuzhiyun  * |    DSCP   |ECN|   protocol    |      ttl      |     flags     |
363*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
364*4882a593Smuzhiyun  * |                        ipv4_addr_src                          |
365*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
366*4882a593Smuzhiyun  * |                        ipv4_addr_dst                          |
367*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
368*4882a593Smuzhiyun  */
369*4882a593Smuzhiyun struct nfp_flower_ipv4 {
370*4882a593Smuzhiyun 	struct nfp_flower_ip_ext ip_ext;
371*4882a593Smuzhiyun 	__be32 ipv4_src;
372*4882a593Smuzhiyun 	__be32 ipv4_dst;
373*4882a593Smuzhiyun };
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun /* L3 IPv6 details (10W/40B)
376*4882a593Smuzhiyun  *    3                   2                   1
377*4882a593Smuzhiyun  *  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
378*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
379*4882a593Smuzhiyun  * |    DSCP   |ECN|   protocol    |      ttl      |     flags     |
380*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
381*4882a593Smuzhiyun  * |   ipv6_exthdr   | res |            ipv6_flow_label            |
382*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
383*4882a593Smuzhiyun  * |                  ipv6_addr_src,   31 - 0                      |
384*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
385*4882a593Smuzhiyun  * |                  ipv6_addr_src,  63 - 32                      |
386*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
387*4882a593Smuzhiyun  * |                  ipv6_addr_src,  95 - 64                      |
388*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
389*4882a593Smuzhiyun  * |                  ipv6_addr_src, 127 - 96                      |
390*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
391*4882a593Smuzhiyun  * |                  ipv6_addr_dst,   31 - 0                      |
392*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
393*4882a593Smuzhiyun  * |                  ipv6_addr_dst,  63 - 32                      |
394*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
395*4882a593Smuzhiyun  * |                  ipv6_addr_dst,  95 - 64                      |
396*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
397*4882a593Smuzhiyun  * |                  ipv6_addr_dst, 127 - 96                      |
398*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
399*4882a593Smuzhiyun  */
400*4882a593Smuzhiyun struct nfp_flower_ipv6 {
401*4882a593Smuzhiyun 	struct nfp_flower_ip_ext ip_ext;
402*4882a593Smuzhiyun 	__be32 ipv6_flow_label_exthdr;
403*4882a593Smuzhiyun 	struct in6_addr ipv6_src;
404*4882a593Smuzhiyun 	struct in6_addr ipv6_dst;
405*4882a593Smuzhiyun };
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun struct nfp_flower_tun_ipv4 {
408*4882a593Smuzhiyun 	__be32 src;
409*4882a593Smuzhiyun 	__be32 dst;
410*4882a593Smuzhiyun };
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun struct nfp_flower_tun_ipv6 {
413*4882a593Smuzhiyun 	struct in6_addr src;
414*4882a593Smuzhiyun 	struct in6_addr dst;
415*4882a593Smuzhiyun };
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun struct nfp_flower_tun_ip_ext {
418*4882a593Smuzhiyun 	u8 tos;
419*4882a593Smuzhiyun 	u8 ttl;
420*4882a593Smuzhiyun };
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun /* Flow Frame IPv4 UDP TUNNEL --> Tunnel details (4W/16B)
423*4882a593Smuzhiyun  * -----------------------------------------------------------------
424*4882a593Smuzhiyun  *    3                   2                   1
425*4882a593Smuzhiyun  *  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
426*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
427*4882a593Smuzhiyun  * |                         ipv4_addr_src                         |
428*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
429*4882a593Smuzhiyun  * |                         ipv4_addr_dst                         |
430*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
431*4882a593Smuzhiyun  * |           Reserved            |      tos      |      ttl      |
432*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
433*4882a593Smuzhiyun  * |                            Reserved                           |
434*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
435*4882a593Smuzhiyun  * |                     VNI                       |   Reserved    |
436*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
437*4882a593Smuzhiyun  */
438*4882a593Smuzhiyun struct nfp_flower_ipv4_udp_tun {
439*4882a593Smuzhiyun 	struct nfp_flower_tun_ipv4 ipv4;
440*4882a593Smuzhiyun 	__be16 reserved1;
441*4882a593Smuzhiyun 	struct nfp_flower_tun_ip_ext ip_ext;
442*4882a593Smuzhiyun 	__be32 reserved2;
443*4882a593Smuzhiyun 	__be32 tun_id;
444*4882a593Smuzhiyun };
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun /* Flow Frame IPv6 UDP TUNNEL --> Tunnel details (11W/44B)
447*4882a593Smuzhiyun  * -----------------------------------------------------------------
448*4882a593Smuzhiyun  *    3                   2                   1
449*4882a593Smuzhiyun  *  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
450*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
451*4882a593Smuzhiyun  * |                  ipv6_addr_src,   31 - 0                      |
452*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
453*4882a593Smuzhiyun  * |                  ipv6_addr_src,  63 - 32                      |
454*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
455*4882a593Smuzhiyun  * |                  ipv6_addr_src,  95 - 64                      |
456*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
457*4882a593Smuzhiyun  * |                  ipv6_addr_src, 127 - 96                      |
458*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
459*4882a593Smuzhiyun  * |                  ipv6_addr_dst,   31 - 0                      |
460*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
461*4882a593Smuzhiyun  * |                  ipv6_addr_dst,  63 - 32                      |
462*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
463*4882a593Smuzhiyun  * |                  ipv6_addr_dst,  95 - 64                      |
464*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
465*4882a593Smuzhiyun  * |                  ipv6_addr_dst, 127 - 96                      |
466*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
467*4882a593Smuzhiyun  * |           Reserved            |      tos      |      ttl      |
468*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
469*4882a593Smuzhiyun  * |                            Reserved                           |
470*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
471*4882a593Smuzhiyun  * |                     VNI                       |   Reserved    |
472*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
473*4882a593Smuzhiyun  */
474*4882a593Smuzhiyun struct nfp_flower_ipv6_udp_tun {
475*4882a593Smuzhiyun 	struct nfp_flower_tun_ipv6 ipv6;
476*4882a593Smuzhiyun 	__be16 reserved1;
477*4882a593Smuzhiyun 	struct nfp_flower_tun_ip_ext ip_ext;
478*4882a593Smuzhiyun 	__be32 reserved2;
479*4882a593Smuzhiyun 	__be32 tun_id;
480*4882a593Smuzhiyun };
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun /* Flow Frame GRE TUNNEL --> Tunnel details (6W/24B)
483*4882a593Smuzhiyun  * -----------------------------------------------------------------
484*4882a593Smuzhiyun  *    3                   2                   1
485*4882a593Smuzhiyun  *  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
486*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
487*4882a593Smuzhiyun  * |                         ipv4_addr_src                         |
488*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
489*4882a593Smuzhiyun  * |                         ipv4_addr_dst                         |
490*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
491*4882a593Smuzhiyun  * |           tun_flags           |       tos     |       ttl     |
492*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
493*4882a593Smuzhiyun  * |            Reserved           |           Ethertype           |
494*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
495*4882a593Smuzhiyun  * |                              Key                              |
496*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
497*4882a593Smuzhiyun  * |                           Reserved                            |
498*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
499*4882a593Smuzhiyun  */
500*4882a593Smuzhiyun 
501*4882a593Smuzhiyun struct nfp_flower_ipv4_gre_tun {
502*4882a593Smuzhiyun 	struct nfp_flower_tun_ipv4 ipv4;
503*4882a593Smuzhiyun 	__be16 tun_flags;
504*4882a593Smuzhiyun 	struct nfp_flower_tun_ip_ext ip_ext;
505*4882a593Smuzhiyun 	__be16 reserved1;
506*4882a593Smuzhiyun 	__be16 ethertype;
507*4882a593Smuzhiyun 	__be32 tun_key;
508*4882a593Smuzhiyun 	__be32 reserved2;
509*4882a593Smuzhiyun };
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun /* Flow Frame GRE TUNNEL V6 --> Tunnel details (12W/48B)
512*4882a593Smuzhiyun  * -----------------------------------------------------------------
513*4882a593Smuzhiyun  *    3                   2                   1
514*4882a593Smuzhiyun  *  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
515*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
516*4882a593Smuzhiyun  * |                  ipv6_addr_src,   31 - 0                      |
517*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
518*4882a593Smuzhiyun  * |                  ipv6_addr_src,  63 - 32                      |
519*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
520*4882a593Smuzhiyun  * |                  ipv6_addr_src,  95 - 64                      |
521*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
522*4882a593Smuzhiyun  * |                  ipv6_addr_src, 127 - 96                      |
523*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
524*4882a593Smuzhiyun  * |                  ipv6_addr_dst,   31 - 0                      |
525*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
526*4882a593Smuzhiyun  * |                  ipv6_addr_dst,  63 - 32                      |
527*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
528*4882a593Smuzhiyun  * |                  ipv6_addr_dst,  95 - 64                      |
529*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
530*4882a593Smuzhiyun  * |                  ipv6_addr_dst, 127 - 96                      |
531*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
532*4882a593Smuzhiyun  * |           tun_flags           |       tos     |       ttl     |
533*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
534*4882a593Smuzhiyun  * |            Reserved           |           Ethertype           |
535*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
536*4882a593Smuzhiyun  * |                              Key                              |
537*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
538*4882a593Smuzhiyun  * |                           Reserved                            |
539*4882a593Smuzhiyun  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
540*4882a593Smuzhiyun  */
541*4882a593Smuzhiyun struct nfp_flower_ipv6_gre_tun {
542*4882a593Smuzhiyun 	struct nfp_flower_tun_ipv6 ipv6;
543*4882a593Smuzhiyun 	__be16 tun_flags;
544*4882a593Smuzhiyun 	struct nfp_flower_tun_ip_ext ip_ext;
545*4882a593Smuzhiyun 	__be16 reserved1;
546*4882a593Smuzhiyun 	__be16 ethertype;
547*4882a593Smuzhiyun 	__be32 tun_key;
548*4882a593Smuzhiyun 	__be32 reserved2;
549*4882a593Smuzhiyun };
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun struct nfp_flower_geneve_options {
552*4882a593Smuzhiyun 	u8 data[NFP_FL_MAX_GENEVE_OPT_KEY];
553*4882a593Smuzhiyun };
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun #define NFP_FL_TUN_VNI_OFFSET 8
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun /* The base header for a control message packet.
558*4882a593Smuzhiyun  * Defines an 8-bit version, and an 8-bit type, padded
559*4882a593Smuzhiyun  * to a 32-bit word. Rest of the packet is type-specific.
560*4882a593Smuzhiyun  */
561*4882a593Smuzhiyun struct nfp_flower_cmsg_hdr {
562*4882a593Smuzhiyun 	__be16 pad;
563*4882a593Smuzhiyun 	u8 type;
564*4882a593Smuzhiyun 	u8 version;
565*4882a593Smuzhiyun };
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_HLEN		sizeof(struct nfp_flower_cmsg_hdr)
568*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_VER1		1
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun /* Types defined for port related control messages  */
571*4882a593Smuzhiyun enum nfp_flower_cmsg_type_port {
572*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_FLOW_ADD =		0,
573*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_FLOW_MOD =		1,
574*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_FLOW_DEL =		2,
575*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_LAG_CONFIG =	4,
576*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_PORT_REIFY =	6,
577*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_MAC_REPR =		7,
578*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_PORT_MOD =		8,
579*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_MERGE_HINT =	9,
580*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_NO_NEIGH =		10,
581*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_TUN_MAC =		11,
582*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS =	12,
583*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_TUN_NEIGH =	13,
584*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_TUN_IPS =		14,
585*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_FLOW_STATS =	15,
586*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_PORT_ECHO =	16,
587*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_QOS_MOD =		18,
588*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_QOS_DEL =		19,
589*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_QOS_STATS =	20,
590*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_PRE_TUN_RULE =	21,
591*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_TUN_IPS_V6 =	22,
592*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_NO_NEIGH_V6 =	23,
593*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_TUN_NEIGH_V6 =	24,
594*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_ACTIVE_TUNS_V6 =	25,
595*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_TYPE_MAX =		32,
596*4882a593Smuzhiyun };
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun /* NFP_FLOWER_CMSG_TYPE_MAC_REPR */
599*4882a593Smuzhiyun struct nfp_flower_cmsg_mac_repr {
600*4882a593Smuzhiyun 	u8 reserved[3];
601*4882a593Smuzhiyun 	u8 num_ports;
602*4882a593Smuzhiyun 	struct {
603*4882a593Smuzhiyun 		u8 idx;
604*4882a593Smuzhiyun 		u8 info;
605*4882a593Smuzhiyun 		u8 nbi_port;
606*4882a593Smuzhiyun 		u8 phys_port;
607*4882a593Smuzhiyun 	} ports[];
608*4882a593Smuzhiyun };
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_MAC_REPR_NBI		GENMASK(1, 0)
611*4882a593Smuzhiyun 
612*4882a593Smuzhiyun /* NFP_FLOWER_CMSG_TYPE_PORT_MOD */
613*4882a593Smuzhiyun struct nfp_flower_cmsg_portmod {
614*4882a593Smuzhiyun 	__be32 portnum;
615*4882a593Smuzhiyun 	u8 reserved;
616*4882a593Smuzhiyun 	u8 info;
617*4882a593Smuzhiyun 	__be16 mtu;
618*4882a593Smuzhiyun };
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORTMOD_INFO_LINK	BIT(0)
621*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORTMOD_MTU_CHANGE_ONLY	BIT(1)
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun /* NFP_FLOWER_CMSG_TYPE_PORT_REIFY */
624*4882a593Smuzhiyun struct nfp_flower_cmsg_portreify {
625*4882a593Smuzhiyun 	__be32 portnum;
626*4882a593Smuzhiyun 	u16 reserved;
627*4882a593Smuzhiyun 	__be16 info;
628*4882a593Smuzhiyun };
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORTREIFY_INFO_EXIST	BIT(0)
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun /* NFP_FLOWER_CMSG_TYPE_FLOW_MERGE_HINT */
633*4882a593Smuzhiyun struct nfp_flower_cmsg_merge_hint {
634*4882a593Smuzhiyun 	u8 reserved[3];
635*4882a593Smuzhiyun 	u8 count;
636*4882a593Smuzhiyun 	struct {
637*4882a593Smuzhiyun 		__be32 host_ctx;
638*4882a593Smuzhiyun 		__be64 host_cookie;
639*4882a593Smuzhiyun 	} __packed flow[];
640*4882a593Smuzhiyun };
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun enum nfp_flower_cmsg_port_type {
643*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_PORT_TYPE_UNSPEC =	0x0,
644*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT =	0x1,
645*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT =	0x2,
646*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT =  0x3,
647*4882a593Smuzhiyun };
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun enum nfp_flower_cmsg_port_vnic_type {
650*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_PORT_VNIC_TYPE_VF =	0x0,
651*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_PORT_VNIC_TYPE_PF =	0x1,
652*4882a593Smuzhiyun 	NFP_FLOWER_CMSG_PORT_VNIC_TYPE_CTRL =	0x2,
653*4882a593Smuzhiyun };
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORT_TYPE		GENMASK(31, 28)
656*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORT_SYS_ID		GENMASK(27, 24)
657*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORT_NFP_ID		GENMASK(23, 22)
658*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORT_PCI		GENMASK(15, 14)
659*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORT_VNIC_TYPE		GENMASK(13, 12)
660*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORT_VNIC		GENMASK(11, 6)
661*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORT_PCIE_Q		GENMASK(5, 0)
662*4882a593Smuzhiyun #define NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM	GENMASK(7, 0)
663*4882a593Smuzhiyun 
nfp_flower_internal_port_get_port_id(u8 internal_port)664*4882a593Smuzhiyun static inline u32 nfp_flower_internal_port_get_port_id(u8 internal_port)
665*4882a593Smuzhiyun {
666*4882a593Smuzhiyun 	return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM, internal_port) |
667*4882a593Smuzhiyun 		FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE,
668*4882a593Smuzhiyun 			   NFP_FLOWER_CMSG_PORT_TYPE_OTHER_PORT);
669*4882a593Smuzhiyun }
670*4882a593Smuzhiyun 
nfp_flower_cmsg_phys_port(u8 phys_port)671*4882a593Smuzhiyun static inline u32 nfp_flower_cmsg_phys_port(u8 phys_port)
672*4882a593Smuzhiyun {
673*4882a593Smuzhiyun 	return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PHYS_PORT_NUM, phys_port) |
674*4882a593Smuzhiyun 		FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE,
675*4882a593Smuzhiyun 			   NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT);
676*4882a593Smuzhiyun }
677*4882a593Smuzhiyun 
678*4882a593Smuzhiyun static inline u32
nfp_flower_cmsg_pcie_port(u8 nfp_pcie,enum nfp_flower_cmsg_port_vnic_type type,u8 vnic,u8 q)679*4882a593Smuzhiyun nfp_flower_cmsg_pcie_port(u8 nfp_pcie, enum nfp_flower_cmsg_port_vnic_type type,
680*4882a593Smuzhiyun 			  u8 vnic, u8 q)
681*4882a593Smuzhiyun {
682*4882a593Smuzhiyun 	return FIELD_PREP(NFP_FLOWER_CMSG_PORT_PCI, nfp_pcie) |
683*4882a593Smuzhiyun 		FIELD_PREP(NFP_FLOWER_CMSG_PORT_VNIC_TYPE, type) |
684*4882a593Smuzhiyun 		FIELD_PREP(NFP_FLOWER_CMSG_PORT_VNIC, vnic) |
685*4882a593Smuzhiyun 		FIELD_PREP(NFP_FLOWER_CMSG_PORT_PCIE_Q, q) |
686*4882a593Smuzhiyun 		FIELD_PREP(NFP_FLOWER_CMSG_PORT_TYPE,
687*4882a593Smuzhiyun 			   NFP_FLOWER_CMSG_PORT_TYPE_PCIE_PORT);
688*4882a593Smuzhiyun }
689*4882a593Smuzhiyun 
nfp_flower_cmsg_get_data(struct sk_buff * skb)690*4882a593Smuzhiyun static inline void *nfp_flower_cmsg_get_data(struct sk_buff *skb)
691*4882a593Smuzhiyun {
692*4882a593Smuzhiyun 	return (unsigned char *)skb->data + NFP_FLOWER_CMSG_HLEN;
693*4882a593Smuzhiyun }
694*4882a593Smuzhiyun 
nfp_flower_cmsg_get_data_len(struct sk_buff * skb)695*4882a593Smuzhiyun static inline int nfp_flower_cmsg_get_data_len(struct sk_buff *skb)
696*4882a593Smuzhiyun {
697*4882a593Smuzhiyun 	return skb->len - NFP_FLOWER_CMSG_HLEN;
698*4882a593Smuzhiyun }
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun static inline bool
nfp_fl_netdev_is_tunnel_type(struct net_device * netdev,enum nfp_flower_tun_type tun_type)701*4882a593Smuzhiyun nfp_fl_netdev_is_tunnel_type(struct net_device *netdev,
702*4882a593Smuzhiyun 			     enum nfp_flower_tun_type tun_type)
703*4882a593Smuzhiyun {
704*4882a593Smuzhiyun 	if (netif_is_vxlan(netdev))
705*4882a593Smuzhiyun 		return tun_type == NFP_FL_TUNNEL_VXLAN;
706*4882a593Smuzhiyun 	if (netif_is_gretap(netdev))
707*4882a593Smuzhiyun 		return tun_type == NFP_FL_TUNNEL_GRE;
708*4882a593Smuzhiyun 	if (netif_is_geneve(netdev))
709*4882a593Smuzhiyun 		return tun_type == NFP_FL_TUNNEL_GENEVE;
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 	return false;
712*4882a593Smuzhiyun }
713*4882a593Smuzhiyun 
nfp_fl_is_netdev_to_offload(struct net_device * netdev)714*4882a593Smuzhiyun static inline bool nfp_fl_is_netdev_to_offload(struct net_device *netdev)
715*4882a593Smuzhiyun {
716*4882a593Smuzhiyun 	if (!netdev->rtnl_link_ops)
717*4882a593Smuzhiyun 		return false;
718*4882a593Smuzhiyun 	if (!strcmp(netdev->rtnl_link_ops->kind, "openvswitch"))
719*4882a593Smuzhiyun 		return true;
720*4882a593Smuzhiyun 	if (netif_is_vxlan(netdev))
721*4882a593Smuzhiyun 		return true;
722*4882a593Smuzhiyun 	if (netif_is_geneve(netdev))
723*4882a593Smuzhiyun 		return true;
724*4882a593Smuzhiyun 	if (netif_is_gretap(netdev))
725*4882a593Smuzhiyun 		return true;
726*4882a593Smuzhiyun 
727*4882a593Smuzhiyun 	return false;
728*4882a593Smuzhiyun }
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun struct sk_buff *
731*4882a593Smuzhiyun nfp_flower_cmsg_mac_repr_start(struct nfp_app *app, unsigned int num_ports);
732*4882a593Smuzhiyun void
733*4882a593Smuzhiyun nfp_flower_cmsg_mac_repr_add(struct sk_buff *skb, unsigned int idx,
734*4882a593Smuzhiyun 			     unsigned int nbi, unsigned int nbi_port,
735*4882a593Smuzhiyun 			     unsigned int phys_port);
736*4882a593Smuzhiyun int nfp_flower_cmsg_portmod(struct nfp_repr *repr, bool carrier_ok,
737*4882a593Smuzhiyun 			    unsigned int mtu, bool mtu_only);
738*4882a593Smuzhiyun int nfp_flower_cmsg_portreify(struct nfp_repr *repr, bool exists);
739*4882a593Smuzhiyun void nfp_flower_cmsg_process_rx(struct work_struct *work);
740*4882a593Smuzhiyun void nfp_flower_cmsg_rx(struct nfp_app *app, struct sk_buff *skb);
741*4882a593Smuzhiyun struct sk_buff *
742*4882a593Smuzhiyun nfp_flower_cmsg_alloc(struct nfp_app *app, unsigned int size,
743*4882a593Smuzhiyun 		      enum nfp_flower_cmsg_type_port type, gfp_t flag);
744*4882a593Smuzhiyun 
745*4882a593Smuzhiyun #endif
746