1
2
3
4#ifndef __NFP_FLOWER_H__
5#define __NFP_FLOWER_H__ 1
6
7#include "cmsg.h"
8#include "../nfp_net.h"
9
10#include <linux/circ_buf.h>
11#include <linux/hashtable.h>
12#include <linux/rhashtable.h>
13#include <linux/time64.h>
14#include <linux/types.h>
15#include <net/pkt_cls.h>
16#include <net/tcp.h>
17#include <linux/workqueue.h>
18#include <linux/idr.h>
19
20struct nfp_fl_pre_lag;
21struct net_device;
22struct nfp_app;
23
24#define NFP_FL_STAT_ID_MU_NUM GENMASK(31, 22)
25#define NFP_FL_STAT_ID_STAT GENMASK(21, 0)
26
27#define NFP_FL_STATS_ELEM_RS sizeof_field(struct nfp_fl_stats_id, \
28 init_unalloc)
29#define NFP_FLOWER_MASK_ENTRY_RS 256
30#define NFP_FLOWER_MASK_ELEMENT_RS 1
31#define NFP_FLOWER_MASK_HASH_BITS 10
32
33#define NFP_FL_META_FLAG_MANAGE_MASK BIT(7)
34
35#define NFP_FL_MASK_REUSE_TIME_NS 40000
36#define NFP_FL_MASK_ID_LOCATION 1
37
38
39#define NFP_FL_FEATS_GENEVE BIT(0)
40#define NFP_FL_NBI_MTU_SETTING BIT(1)
41#define NFP_FL_FEATS_GENEVE_OPT BIT(2)
42#define NFP_FL_FEATS_VLAN_PCP BIT(3)
43#define NFP_FL_FEATS_VF_RLIM BIT(4)
44#define NFP_FL_FEATS_FLOW_MOD BIT(5)
45#define NFP_FL_FEATS_PRE_TUN_RULES BIT(6)
46#define NFP_FL_FEATS_IPV6_TUN BIT(7)
47#define NFP_FL_FEATS_FLOW_MERGE BIT(30)
48#define NFP_FL_FEATS_LAG BIT(31)
49
50struct nfp_fl_mask_id {
51 struct circ_buf mask_id_free_list;
52 ktime_t *last_used;
53 u8 init_unallocated;
54};
55
56struct nfp_fl_stats_id {
57 struct circ_buf free_list;
58 u32 init_unalloc;
59 u8 repeated_em_count;
60};
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76struct nfp_fl_tunnel_offloads {
77 struct rhashtable offloaded_macs;
78 struct list_head ipv4_off_list;
79 struct list_head ipv6_off_list;
80 struct list_head neigh_off_list_v4;
81 struct list_head neigh_off_list_v6;
82 struct mutex ipv4_off_lock;
83 struct mutex ipv6_off_lock;
84 spinlock_t neigh_off_lock_v4;
85 spinlock_t neigh_off_lock_v6;
86 struct ida mac_off_ids;
87 struct notifier_block neigh_nb;
88};
89
90
91
92
93
94
95
96
97
98struct nfp_mtu_conf {
99 u32 portnum;
100 unsigned int requested_val;
101 bool ack;
102 wait_queue_head_t wait_q;
103 spinlock_t lock;
104};
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119struct nfp_fl_lag {
120 struct delayed_work work;
121 struct mutex lock;
122 struct list_head group_list;
123 struct ida ida_handle;
124 unsigned int pkt_num;
125 unsigned int batch_ver;
126 u8 global_inst;
127 bool rst_cfg;
128 struct sk_buff_head retrans_skbs;
129};
130
131
132
133
134
135
136struct nfp_fl_internal_ports {
137 struct idr port_ids;
138 spinlock_t lock;
139};
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177struct nfp_flower_priv {
178 struct nfp_app *app;
179 struct nfp_net *nn;
180 u32 mask_id_seed;
181 u64 flower_version;
182 u64 flower_ext_feats;
183 struct nfp_fl_stats_id stats_ids;
184 struct nfp_fl_mask_id mask_ids;
185 DECLARE_HASHTABLE(mask_table, NFP_FLOWER_MASK_HASH_BITS);
186 u32 stats_ring_size;
187 struct rhashtable flow_table;
188 struct nfp_fl_stats *stats;
189 spinlock_t stats_lock;
190 struct rhashtable stats_ctx_table;
191 struct work_struct cmsg_work;
192 struct sk_buff_head cmsg_skbs_high;
193 struct sk_buff_head cmsg_skbs_low;
194 struct nfp_fl_tunnel_offloads tun;
195 atomic_t reify_replies;
196 wait_queue_head_t reify_wait_queue;
197 struct nfp_mtu_conf mtu_conf;
198 struct nfp_fl_lag nfp_lag;
199 struct list_head indr_block_cb_priv;
200 struct list_head non_repr_priv;
201 unsigned int active_mem_unit;
202 unsigned int total_mem_units;
203 struct nfp_fl_internal_ports internal_ports;
204 struct delayed_work qos_stats_work;
205 unsigned int qos_rate_limiters;
206 spinlock_t qos_stats_lock;
207 int pre_tun_rule_cnt;
208};
209
210
211
212
213
214
215
216
217struct nfp_fl_qos {
218 u32 netdev_port_id;
219 struct nfp_stat_pair curr_stats;
220 struct nfp_stat_pair prev_stats;
221 u64 last_update;
222};
223
224
225
226
227
228
229
230
231
232
233
234
235struct nfp_flower_repr_priv {
236 struct nfp_repr *nfp_repr;
237 unsigned long lag_port_flags;
238 bool mac_offloaded;
239 u8 offloaded_mac_addr[ETH_ALEN];
240 bool block_shared;
241 struct list_head mac_list;
242 struct nfp_fl_qos qos_table;
243 bool on_bridge;
244};
245
246
247
248
249
250
251
252
253
254struct nfp_flower_non_repr_priv {
255 struct list_head list;
256 struct net_device *netdev;
257 int ref_count;
258 bool mac_offloaded;
259 u8 offloaded_mac_addr[ETH_ALEN];
260};
261
262struct nfp_fl_key_ls {
263 u32 key_layer_two;
264 u8 key_layer;
265 int key_size;
266};
267
268struct nfp_fl_rule_metadata {
269 u8 key_len;
270 u8 mask_len;
271 u8 act_len;
272 u8 flags;
273 __be32 host_ctx_id;
274 __be64 host_cookie __packed;
275 __be64 flow_version __packed;
276 __be32 shortcut;
277};
278
279struct nfp_fl_stats {
280 u64 pkts;
281 u64 bytes;
282 u64 used;
283};
284
285
286
287
288
289
290
291struct nfp_ipv6_addr_entry {
292 struct in6_addr ipv6_addr;
293 int ref_count;
294 struct list_head list;
295};
296
297struct nfp_fl_payload {
298 struct nfp_fl_rule_metadata meta;
299 unsigned long tc_flower_cookie;
300 struct rhash_head fl_node;
301 struct rcu_head rcu;
302 __be32 nfp_tun_ipv4_addr;
303 struct nfp_ipv6_addr_entry *nfp_tun_ipv6;
304 struct net_device *ingress_dev;
305 char *unmasked_data;
306 char *mask_data;
307 char *action_data;
308 struct list_head linked_flows;
309 bool in_hw;
310 struct {
311 struct net_device *dev;
312 __be16 vlan_tci;
313 __be16 port_idx;
314 } pre_tun_rule;
315};
316
317struct nfp_fl_payload_link {
318
319
320
321
322
323
324
325
326
327
328 struct {
329 struct list_head list;
330 struct nfp_fl_payload *flow;
331 } merge_flow, sub_flow;
332};
333
334extern const struct rhashtable_params nfp_flower_table_params;
335
336struct nfp_fl_stats_frame {
337 __be32 stats_con_id;
338 __be32 pkt_count;
339 __be64 byte_count;
340 __be64 stats_cookie;
341};
342
343static inline bool
344nfp_flower_internal_port_can_offload(struct nfp_app *app,
345 struct net_device *netdev)
346{
347 struct nfp_flower_priv *app_priv = app->priv;
348
349 if (!(app_priv->flower_ext_feats & NFP_FL_FEATS_FLOW_MERGE))
350 return false;
351 if (!netdev->rtnl_link_ops)
352 return false;
353 if (!strcmp(netdev->rtnl_link_ops->kind, "openvswitch"))
354 return true;
355
356 return false;
357}
358
359
360
361
362
363static inline bool nfp_flower_is_merge_flow(struct nfp_fl_payload *flow_pay)
364{
365 return flow_pay->tc_flower_cookie == (unsigned long)flow_pay;
366}
367
368static inline bool nfp_flower_is_supported_bridge(struct net_device *netdev)
369{
370 return netif_is_ovs_master(netdev);
371}
372
373int nfp_flower_metadata_init(struct nfp_app *app, u64 host_ctx_count,
374 unsigned int host_ctx_split);
375void nfp_flower_metadata_cleanup(struct nfp_app *app);
376
377int nfp_flower_setup_tc(struct nfp_app *app, struct net_device *netdev,
378 enum tc_setup_type type, void *type_data);
379int nfp_flower_merge_offloaded_flows(struct nfp_app *app,
380 struct nfp_fl_payload *sub_flow1,
381 struct nfp_fl_payload *sub_flow2);
382int nfp_flower_compile_flow_match(struct nfp_app *app,
383 struct flow_cls_offload *flow,
384 struct nfp_fl_key_ls *key_ls,
385 struct net_device *netdev,
386 struct nfp_fl_payload *nfp_flow,
387 enum nfp_flower_tun_type tun_type,
388 struct netlink_ext_ack *extack);
389int nfp_flower_compile_action(struct nfp_app *app,
390 struct flow_cls_offload *flow,
391 struct net_device *netdev,
392 struct nfp_fl_payload *nfp_flow,
393 struct netlink_ext_ack *extack);
394int nfp_compile_flow_metadata(struct nfp_app *app,
395 struct flow_cls_offload *flow,
396 struct nfp_fl_payload *nfp_flow,
397 struct net_device *netdev,
398 struct netlink_ext_ack *extack);
399void __nfp_modify_flow_metadata(struct nfp_flower_priv *priv,
400 struct nfp_fl_payload *nfp_flow);
401int nfp_modify_flow_metadata(struct nfp_app *app,
402 struct nfp_fl_payload *nfp_flow);
403
404struct nfp_fl_payload *
405nfp_flower_search_fl_table(struct nfp_app *app, unsigned long tc_flower_cookie,
406 struct net_device *netdev);
407struct nfp_fl_payload *
408nfp_flower_get_fl_payload_from_ctx(struct nfp_app *app, u32 ctx_id);
409struct nfp_fl_payload *
410nfp_flower_remove_fl_table(struct nfp_app *app, unsigned long tc_flower_cookie);
411
412void nfp_flower_rx_flow_stats(struct nfp_app *app, struct sk_buff *skb);
413
414int nfp_tunnel_config_start(struct nfp_app *app);
415void nfp_tunnel_config_stop(struct nfp_app *app);
416int nfp_tunnel_mac_event_handler(struct nfp_app *app,
417 struct net_device *netdev,
418 unsigned long event, void *ptr);
419void nfp_tunnel_del_ipv4_off(struct nfp_app *app, __be32 ipv4);
420void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4);
421void
422nfp_tunnel_put_ipv6_off(struct nfp_app *app, struct nfp_ipv6_addr_entry *entry);
423struct nfp_ipv6_addr_entry *
424nfp_tunnel_add_ipv6_off(struct nfp_app *app, struct in6_addr *ipv6);
425void nfp_tunnel_request_route_v4(struct nfp_app *app, struct sk_buff *skb);
426void nfp_tunnel_request_route_v6(struct nfp_app *app, struct sk_buff *skb);
427void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb);
428void nfp_tunnel_keep_alive_v6(struct nfp_app *app, struct sk_buff *skb);
429void nfp_flower_lag_init(struct nfp_fl_lag *lag);
430void nfp_flower_lag_cleanup(struct nfp_fl_lag *lag);
431int nfp_flower_lag_reset(struct nfp_fl_lag *lag);
432int nfp_flower_lag_netdev_event(struct nfp_flower_priv *priv,
433 struct net_device *netdev,
434 unsigned long event, void *ptr);
435bool nfp_flower_lag_unprocessed_msg(struct nfp_app *app, struct sk_buff *skb);
436int nfp_flower_lag_populate_pre_action(struct nfp_app *app,
437 struct net_device *master,
438 struct nfp_fl_pre_lag *pre_act,
439 struct netlink_ext_ack *extack);
440int nfp_flower_lag_get_output_id(struct nfp_app *app,
441 struct net_device *master);
442void nfp_flower_qos_init(struct nfp_app *app);
443void nfp_flower_qos_cleanup(struct nfp_app *app);
444int nfp_flower_setup_qos_offload(struct nfp_app *app, struct net_device *netdev,
445 struct tc_cls_matchall_offload *flow);
446void nfp_flower_stats_rlim_reply(struct nfp_app *app, struct sk_buff *skb);
447int nfp_flower_reg_indir_block_handler(struct nfp_app *app,
448 struct net_device *netdev,
449 unsigned long event);
450
451void
452__nfp_flower_non_repr_priv_get(struct nfp_flower_non_repr_priv *non_repr_priv);
453struct nfp_flower_non_repr_priv *
454nfp_flower_non_repr_priv_get(struct nfp_app *app, struct net_device *netdev);
455void
456__nfp_flower_non_repr_priv_put(struct nfp_flower_non_repr_priv *non_repr_priv);
457void
458nfp_flower_non_repr_priv_put(struct nfp_app *app, struct net_device *netdev);
459u32 nfp_flower_get_port_id_from_netdev(struct nfp_app *app,
460 struct net_device *netdev);
461int nfp_flower_xmit_pre_tun_flow(struct nfp_app *app,
462 struct nfp_fl_payload *flow);
463int nfp_flower_xmit_pre_tun_del_flow(struct nfp_app *app,
464 struct nfp_fl_payload *flow);
465#endif
466