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