xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* Broadcom NetXtreme-C/E network driver.
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright (c) 2017 Broadcom Limited
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify
6*4882a593Smuzhiyun  * it under the terms of the GNU General Public License as published by
7*4882a593Smuzhiyun  * the Free Software Foundation.
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef BNXT_TC_H
11*4882a593Smuzhiyun #define BNXT_TC_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #ifdef CONFIG_BNXT_FLOWER_OFFLOAD
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <net/ip_tunnels.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun /* Structs used for storing the filter/actions of the TC cmd.
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun struct bnxt_tc_l2_key {
20*4882a593Smuzhiyun 	u8		dmac[ETH_ALEN];
21*4882a593Smuzhiyun 	u8		smac[ETH_ALEN];
22*4882a593Smuzhiyun 	__be16		inner_vlan_tpid;
23*4882a593Smuzhiyun 	__be16		inner_vlan_tci;
24*4882a593Smuzhiyun 	__be16		ether_type;
25*4882a593Smuzhiyun 	u8		num_vlans;
26*4882a593Smuzhiyun 	u8		dir;
27*4882a593Smuzhiyun #define BNXT_DIR_RX	1
28*4882a593Smuzhiyun #define BNXT_DIR_TX	0
29*4882a593Smuzhiyun };
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun struct bnxt_tc_l3_key {
32*4882a593Smuzhiyun 	union {
33*4882a593Smuzhiyun 		struct {
34*4882a593Smuzhiyun 			struct in_addr daddr;
35*4882a593Smuzhiyun 			struct in_addr saddr;
36*4882a593Smuzhiyun 		} ipv4;
37*4882a593Smuzhiyun 		struct {
38*4882a593Smuzhiyun 			struct in6_addr daddr;
39*4882a593Smuzhiyun 			struct in6_addr saddr;
40*4882a593Smuzhiyun 		} ipv6;
41*4882a593Smuzhiyun 	};
42*4882a593Smuzhiyun };
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun struct bnxt_tc_l4_key {
45*4882a593Smuzhiyun 	u8  ip_proto;
46*4882a593Smuzhiyun 	union {
47*4882a593Smuzhiyun 		struct {
48*4882a593Smuzhiyun 			__be16 sport;
49*4882a593Smuzhiyun 			__be16 dport;
50*4882a593Smuzhiyun 		} ports;
51*4882a593Smuzhiyun 		struct {
52*4882a593Smuzhiyun 			u8 type;
53*4882a593Smuzhiyun 			u8 code;
54*4882a593Smuzhiyun 		} icmp;
55*4882a593Smuzhiyun 	};
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun struct bnxt_tc_tunnel_key {
59*4882a593Smuzhiyun 	struct bnxt_tc_l2_key	l2;
60*4882a593Smuzhiyun 	struct bnxt_tc_l3_key	l3;
61*4882a593Smuzhiyun 	struct bnxt_tc_l4_key	l4;
62*4882a593Smuzhiyun 	__be32			id;
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun #define bnxt_eth_addr_key_mask_invalid(eth_addr, eth_addr_mask)		\
66*4882a593Smuzhiyun 	((is_wildcard(&(eth_addr)[0], ETH_ALEN) &&			\
67*4882a593Smuzhiyun 	 is_wildcard(&(eth_addr)[ETH_ALEN / 2], ETH_ALEN)) ||		\
68*4882a593Smuzhiyun 	(is_wildcard(&(eth_addr_mask)[0], ETH_ALEN) &&			\
69*4882a593Smuzhiyun 	 is_wildcard(&(eth_addr_mask)[ETH_ALEN / 2], ETH_ALEN)))
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun struct bnxt_tc_actions {
72*4882a593Smuzhiyun 	u32				flags;
73*4882a593Smuzhiyun #define BNXT_TC_ACTION_FLAG_FWD			BIT(0)
74*4882a593Smuzhiyun #define BNXT_TC_ACTION_FLAG_FWD_VXLAN		BIT(1)
75*4882a593Smuzhiyun #define BNXT_TC_ACTION_FLAG_PUSH_VLAN		BIT(3)
76*4882a593Smuzhiyun #define BNXT_TC_ACTION_FLAG_POP_VLAN		BIT(4)
77*4882a593Smuzhiyun #define BNXT_TC_ACTION_FLAG_DROP		BIT(5)
78*4882a593Smuzhiyun #define BNXT_TC_ACTION_FLAG_TUNNEL_ENCAP	BIT(6)
79*4882a593Smuzhiyun #define BNXT_TC_ACTION_FLAG_TUNNEL_DECAP	BIT(7)
80*4882a593Smuzhiyun #define BNXT_TC_ACTION_FLAG_L2_REWRITE		BIT(8)
81*4882a593Smuzhiyun #define BNXT_TC_ACTION_FLAG_NAT_XLATE		BIT(9)
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	u16				dst_fid;
84*4882a593Smuzhiyun 	struct net_device		*dst_dev;
85*4882a593Smuzhiyun 	__be16				push_vlan_tpid;
86*4882a593Smuzhiyun 	__be16				push_vlan_tci;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	/* tunnel encap */
89*4882a593Smuzhiyun 	struct ip_tunnel_key		tun_encap_key;
90*4882a593Smuzhiyun #define	PEDIT_OFFSET_SMAC_LAST_4_BYTES		0x8
91*4882a593Smuzhiyun 	__be16				l2_rewrite_dmac[3];
92*4882a593Smuzhiyun 	__be16				l2_rewrite_smac[3];
93*4882a593Smuzhiyun 	struct {
94*4882a593Smuzhiyun 		bool src_xlate;  /* true => translate src,
95*4882a593Smuzhiyun 				  * false => translate dst
96*4882a593Smuzhiyun 				  * Mutually exclusive, i.e cannot set both
97*4882a593Smuzhiyun 				  */
98*4882a593Smuzhiyun 		bool l3_is_ipv4; /* false means L3 is ipv6 */
99*4882a593Smuzhiyun 		struct bnxt_tc_l3_key l3;
100*4882a593Smuzhiyun 		struct bnxt_tc_l4_key l4;
101*4882a593Smuzhiyun 	} nat;
102*4882a593Smuzhiyun };
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun struct bnxt_tc_flow {
105*4882a593Smuzhiyun 	u32				flags;
106*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_ETH_ADDRS		BIT(1)
107*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_IPV4_ADDRS		BIT(2)
108*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_IPV6_ADDRS		BIT(3)
109*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_PORTS		BIT(4)
110*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_ICMP			BIT(5)
111*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_TUNL_ETH_ADDRS	BIT(6)
112*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_TUNL_IPV4_ADDRS	BIT(7)
113*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_TUNL_IPV6_ADDRS	BIT(8)
114*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_TUNL_PORTS		BIT(9)
115*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_TUNL_ID		BIT(10)
116*4882a593Smuzhiyun #define BNXT_TC_FLOW_FLAGS_TUNNEL	(BNXT_TC_FLOW_FLAGS_TUNL_ETH_ADDRS | \
117*4882a593Smuzhiyun 					 BNXT_TC_FLOW_FLAGS_TUNL_IPV4_ADDRS | \
118*4882a593Smuzhiyun 					 BNXT_TC_FLOW_FLAGS_TUNL_IPV6_ADDRS |\
119*4882a593Smuzhiyun 					 BNXT_TC_FLOW_FLAGS_TUNL_PORTS |\
120*4882a593Smuzhiyun 					 BNXT_TC_FLOW_FLAGS_TUNL_ID)
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	/* flow applicable to pkts ingressing on this fid */
123*4882a593Smuzhiyun 	u16				src_fid;
124*4882a593Smuzhiyun 	struct bnxt_tc_l2_key		l2_key;
125*4882a593Smuzhiyun 	struct bnxt_tc_l2_key		l2_mask;
126*4882a593Smuzhiyun 	struct bnxt_tc_l3_key		l3_key;
127*4882a593Smuzhiyun 	struct bnxt_tc_l3_key		l3_mask;
128*4882a593Smuzhiyun 	struct bnxt_tc_l4_key		l4_key;
129*4882a593Smuzhiyun 	struct bnxt_tc_l4_key		l4_mask;
130*4882a593Smuzhiyun 	struct ip_tunnel_key		tun_key;
131*4882a593Smuzhiyun 	struct ip_tunnel_key		tun_mask;
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun 	struct bnxt_tc_actions		actions;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	/* updated stats accounting for hw-counter wrap-around */
136*4882a593Smuzhiyun 	struct bnxt_tc_flow_stats	stats;
137*4882a593Smuzhiyun 	/* previous snap-shot of stats */
138*4882a593Smuzhiyun 	struct bnxt_tc_flow_stats	prev_stats;
139*4882a593Smuzhiyun 	unsigned long			lastused; /* jiffies */
140*4882a593Smuzhiyun 	/* for calculating delta from prev_stats and
141*4882a593Smuzhiyun 	 * updating prev_stats atomically.
142*4882a593Smuzhiyun 	 */
143*4882a593Smuzhiyun 	spinlock_t			stats_lock;
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /* Tunnel encap/decap hash table
147*4882a593Smuzhiyun  * This table is used to maintain a list of flows that use
148*4882a593Smuzhiyun  * the same tunnel encap/decap params (ip_daddrs, vni, udp_dport)
149*4882a593Smuzhiyun  * and the FW returned handle.
150*4882a593Smuzhiyun  * A separate table is maintained for encap and decap
151*4882a593Smuzhiyun  */
152*4882a593Smuzhiyun struct bnxt_tc_tunnel_node {
153*4882a593Smuzhiyun 	struct ip_tunnel_key		key;
154*4882a593Smuzhiyun 	struct rhash_head		node;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	/* tunnel l2 info */
157*4882a593Smuzhiyun 	struct bnxt_tc_l2_key		l2_info;
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun #define	INVALID_TUNNEL_HANDLE		cpu_to_le32(0xffffffff)
160*4882a593Smuzhiyun 	/* tunnel handle returned by FW */
161*4882a593Smuzhiyun 	__le32				tunnel_handle;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	u32				refcount;
164*4882a593Smuzhiyun 	struct rcu_head			rcu;
165*4882a593Smuzhiyun };
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun /* L2 hash table
168*4882a593Smuzhiyun  * The same data-struct is used for L2-flow table and L2-tunnel table.
169*4882a593Smuzhiyun  * The L2 part of a flow or tunnel is stored in a hash table.
170*4882a593Smuzhiyun  * A flow that shares the same L2 key/mask with an
171*4882a593Smuzhiyun  * already existing flow/tunnel must refer to it's flow handle or
172*4882a593Smuzhiyun  * decap_filter_id respectively.
173*4882a593Smuzhiyun  */
174*4882a593Smuzhiyun struct bnxt_tc_l2_node {
175*4882a593Smuzhiyun 	/* hash key: first 16b of key */
176*4882a593Smuzhiyun #define BNXT_TC_L2_KEY_LEN			16
177*4882a593Smuzhiyun 	struct bnxt_tc_l2_key	key;
178*4882a593Smuzhiyun 	struct rhash_head	node;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	/* a linked list of flows that share the same l2 key */
181*4882a593Smuzhiyun 	struct list_head	common_l2_flows;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	/* number of flows/tunnels sharing the l2 key */
184*4882a593Smuzhiyun 	u16			refcount;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	struct rcu_head		rcu;
187*4882a593Smuzhiyun };
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun struct bnxt_tc_flow_node {
190*4882a593Smuzhiyun 	/* hash key: provided by TC */
191*4882a593Smuzhiyun 	unsigned long			cookie;
192*4882a593Smuzhiyun 	struct rhash_head		node;
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	struct bnxt_tc_flow		flow;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	__le64				ext_flow_handle;
197*4882a593Smuzhiyun 	__le16				flow_handle;
198*4882a593Smuzhiyun 	__le32				flow_id;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	/* L2 node in l2 hashtable that shares flow's l2 key */
201*4882a593Smuzhiyun 	struct bnxt_tc_l2_node		*l2_node;
202*4882a593Smuzhiyun 	/* for the shared_flows list maintained in l2_node */
203*4882a593Smuzhiyun 	struct list_head		l2_list_node;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	/* tunnel encap related */
206*4882a593Smuzhiyun 	struct bnxt_tc_tunnel_node	*encap_node;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	/* tunnel decap related */
209*4882a593Smuzhiyun 	struct bnxt_tc_tunnel_node	*decap_node;
210*4882a593Smuzhiyun 	/* L2 node in tunnel-l2 hashtable that shares flow's tunnel l2 key */
211*4882a593Smuzhiyun 	struct bnxt_tc_l2_node		*decap_l2_node;
212*4882a593Smuzhiyun 	/* for the shared_flows list maintained in tunnel decap l2_node */
213*4882a593Smuzhiyun 	struct list_head		decap_l2_list_node;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	struct rcu_head			rcu;
216*4882a593Smuzhiyun };
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,
219*4882a593Smuzhiyun 			 struct flow_cls_offload *cls_flower);
220*4882a593Smuzhiyun int bnxt_init_tc(struct bnxt *bp);
221*4882a593Smuzhiyun void bnxt_shutdown_tc(struct bnxt *bp);
222*4882a593Smuzhiyun void bnxt_tc_flow_stats_work(struct bnxt *bp);
223*4882a593Smuzhiyun 
bnxt_tc_flower_enabled(struct bnxt * bp)224*4882a593Smuzhiyun static inline bool bnxt_tc_flower_enabled(struct bnxt *bp)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun 	return bp->tc_info && bp->tc_info->enabled;
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun #else /* CONFIG_BNXT_FLOWER_OFFLOAD */
230*4882a593Smuzhiyun 
bnxt_tc_setup_flower(struct bnxt * bp,u16 src_fid,struct flow_cls_offload * cls_flower)231*4882a593Smuzhiyun static inline int bnxt_tc_setup_flower(struct bnxt *bp, u16 src_fid,
232*4882a593Smuzhiyun 				       struct flow_cls_offload *cls_flower)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun 	return -EOPNOTSUPP;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun 
bnxt_init_tc(struct bnxt * bp)237*4882a593Smuzhiyun static inline int bnxt_init_tc(struct bnxt *bp)
238*4882a593Smuzhiyun {
239*4882a593Smuzhiyun 	return 0;
240*4882a593Smuzhiyun }
241*4882a593Smuzhiyun 
bnxt_shutdown_tc(struct bnxt * bp)242*4882a593Smuzhiyun static inline void bnxt_shutdown_tc(struct bnxt *bp)
243*4882a593Smuzhiyun {
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun 
bnxt_tc_flow_stats_work(struct bnxt * bp)246*4882a593Smuzhiyun static inline void bnxt_tc_flow_stats_work(struct bnxt *bp)
247*4882a593Smuzhiyun {
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun 
bnxt_tc_flower_enabled(struct bnxt * bp)250*4882a593Smuzhiyun static inline bool bnxt_tc_flower_enabled(struct bnxt *bp)
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun 	return false;
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun #endif /* CONFIG_BNXT_FLOWER_OFFLOAD */
255*4882a593Smuzhiyun #endif /* BNXT_TC_H */
256