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 FIELD_SIZEOF(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_FLOW_MERGE BIT(30)
47#define NFP_FL_FEATS_LAG BIT(31)
48
49struct nfp_fl_mask_id {
50 struct circ_buf mask_id_free_list;
51 ktime_t *last_used;
52 u8 init_unallocated;
53};
54
55struct nfp_fl_stats_id {
56 struct circ_buf free_list;
57 u32 init_unalloc;
58 u8 repeated_em_count;
59};
60
61
62
63
64
65
66
67
68
69
70
71struct nfp_fl_tunnel_offloads {
72 struct rhashtable offloaded_macs;
73 struct list_head ipv4_off_list;
74 struct list_head neigh_off_list;
75 struct mutex ipv4_off_lock;
76 spinlock_t neigh_off_lock;
77 struct ida mac_off_ids;
78 struct notifier_block neigh_nb;
79};
80
81
82
83
84
85
86
87
88
89struct nfp_mtu_conf {
90 u32 portnum;
91 unsigned int requested_val;
92 bool ack;
93 wait_queue_head_t wait_q;
94 spinlock_t lock;
95};
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110struct nfp_fl_lag {
111 struct delayed_work work;
112 struct mutex lock;
113 struct list_head group_list;
114 struct ida ida_handle;
115 unsigned int pkt_num;
116 unsigned int batch_ver;
117 u8 global_inst;
118 bool rst_cfg;
119 struct sk_buff_head retrans_skbs;
120};
121
122
123
124
125
126
127struct nfp_fl_internal_ports {
128 struct idr port_ids;
129 spinlock_t lock;
130};
131
132
133
134
135
136
137
138
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
168struct nfp_flower_priv {
169 struct nfp_app *app;
170 struct nfp_net *nn;
171 u32 mask_id_seed;
172 u64 flower_version;
173 u64 flower_ext_feats;
174 struct nfp_fl_stats_id stats_ids;
175 struct nfp_fl_mask_id mask_ids;
176 DECLARE_HASHTABLE(mask_table, NFP_FLOWER_MASK_HASH_BITS);
177 u32 stats_ring_size;
178 struct rhashtable flow_table;
179 struct nfp_fl_stats *stats;
180 spinlock_t stats_lock;
181 struct rhashtable stats_ctx_table;
182 struct work_struct cmsg_work;
183 struct sk_buff_head cmsg_skbs_high;
184 struct sk_buff_head cmsg_skbs_low;
185 struct nfp_fl_tunnel_offloads tun;
186 atomic_t reify_replies;
187 wait_queue_head_t reify_wait_queue;
188 struct nfp_mtu_conf mtu_conf;
189 struct nfp_fl_lag nfp_lag;
190 struct list_head indr_block_cb_priv;
191 struct list_head non_repr_priv;
192 unsigned int active_mem_unit;
193 unsigned int total_mem_units;
194 struct nfp_fl_internal_ports internal_ports;
195 struct delayed_work qos_stats_work;
196 unsigned int qos_rate_limiters;
197 spinlock_t qos_stats_lock;
198 int pre_tun_rule_cnt;
199};
200
201
202
203
204
205
206
207
208struct nfp_fl_qos {
209 u32 netdev_port_id;
210 struct nfp_stat_pair curr_stats;
211 struct nfp_stat_pair prev_stats;
212 u64 last_update;
213};
214
215
216
217
218
219
220
221
222
223
224
225
226struct nfp_flower_repr_priv {
227 struct nfp_repr *nfp_repr;
228 unsigned long lag_port_flags;
229 bool mac_offloaded;
230 u8 offloaded_mac_addr[ETH_ALEN];
231 bool block_shared;
232 struct list_head mac_list;
233 struct nfp_fl_qos qos_table;
234 bool on_bridge;
235};
236
237
238
239
240
241
242
243
244
245struct nfp_flower_non_repr_priv {
246 struct list_head list;
247 struct net_device *netdev;
248 int ref_count;
249 bool mac_offloaded;
250 u8 offloaded_mac_addr[ETH_ALEN];
251};
252
253struct nfp_fl_key_ls {
254 u32 key_layer_two;
255 u8 key_layer;
256 int key_size;
257};
258
259struct nfp_fl_rule_metadata {
260 u8 key_len;
261 u8 mask_len;
262 u8 act_len;
263 u8 flags;
264 __be32 host_ctx_id;
265 __be64 host_cookie __packed;
266 __be64 flow_version __packed;
267 __be32 shortcut;
268};
269
270struct nfp_fl_stats {
271 u64 pkts;
272 u64 bytes;
273 u64 used;
274};
275
276struct nfp_fl_payload {
277 struct nfp_fl_rule_metadata meta;
278 unsigned long tc_flower_cookie;
279 struct rhash_head fl_node;
280 struct rcu_head rcu;
281 __be32 nfp_tun_ipv4_addr;
282 struct net_device *ingress_dev;
283 char *unmasked_data;
284 char *mask_data;
285 char *action_data;
286 struct list_head linked_flows;
287 bool in_hw;
288 struct {
289 struct net_device *dev;
290 __be16 vlan_tci;
291 __be16 port_idx;
292 } pre_tun_rule;
293};
294
295struct nfp_fl_payload_link {
296
297
298
299
300
301
302
303
304
305
306 struct {
307 struct list_head list;
308 struct nfp_fl_payload *flow;
309 } merge_flow, sub_flow;
310};
311
312extern const struct rhashtable_params nfp_flower_table_params;
313
314struct nfp_fl_stats_frame {
315 __be32 stats_con_id;
316 __be32 pkt_count;
317 __be64 byte_count;
318 __be64 stats_cookie;
319};
320
321static inline bool
322nfp_flower_internal_port_can_offload(struct nfp_app *app,
323 struct net_device *netdev)
324{
325 struct nfp_flower_priv *app_priv = app->priv;
326
327 if (!(app_priv->flower_ext_feats & NFP_FL_FEATS_FLOW_MERGE))
328 return false;
329 if (!netdev->rtnl_link_ops)
330 return false;
331 if (!strcmp(netdev->rtnl_link_ops->kind, "openvswitch"))
332 return true;
333
334 return false;
335}
336
337
338
339
340
341static inline bool nfp_flower_is_merge_flow(struct nfp_fl_payload *flow_pay)
342{
343 return flow_pay->tc_flower_cookie == (unsigned long)flow_pay;
344}
345
346static inline bool nfp_flower_is_supported_bridge(struct net_device *netdev)
347{
348 return netif_is_ovs_master(netdev);
349}
350
351int nfp_flower_metadata_init(struct nfp_app *app, u64 host_ctx_count,
352 unsigned int host_ctx_split);
353void nfp_flower_metadata_cleanup(struct nfp_app *app);
354
355int nfp_flower_setup_tc(struct nfp_app *app, struct net_device *netdev,
356 enum tc_setup_type type, void *type_data);
357int nfp_flower_merge_offloaded_flows(struct nfp_app *app,
358 struct nfp_fl_payload *sub_flow1,
359 struct nfp_fl_payload *sub_flow2);
360int nfp_flower_compile_flow_match(struct nfp_app *app,
361 struct flow_cls_offload *flow,
362 struct nfp_fl_key_ls *key_ls,
363 struct net_device *netdev,
364 struct nfp_fl_payload *nfp_flow,
365 enum nfp_flower_tun_type tun_type,
366 struct netlink_ext_ack *extack);
367int nfp_flower_compile_action(struct nfp_app *app,
368 struct flow_cls_offload *flow,
369 struct net_device *netdev,
370 struct nfp_fl_payload *nfp_flow,
371 struct netlink_ext_ack *extack);
372int nfp_compile_flow_metadata(struct nfp_app *app,
373 struct flow_cls_offload *flow,
374 struct nfp_fl_payload *nfp_flow,
375 struct net_device *netdev,
376 struct netlink_ext_ack *extack);
377void __nfp_modify_flow_metadata(struct nfp_flower_priv *priv,
378 struct nfp_fl_payload *nfp_flow);
379int nfp_modify_flow_metadata(struct nfp_app *app,
380 struct nfp_fl_payload *nfp_flow);
381
382struct nfp_fl_payload *
383nfp_flower_search_fl_table(struct nfp_app *app, unsigned long tc_flower_cookie,
384 struct net_device *netdev);
385struct nfp_fl_payload *
386nfp_flower_get_fl_payload_from_ctx(struct nfp_app *app, u32 ctx_id);
387struct nfp_fl_payload *
388nfp_flower_remove_fl_table(struct nfp_app *app, unsigned long tc_flower_cookie);
389
390void nfp_flower_rx_flow_stats(struct nfp_app *app, struct sk_buff *skb);
391
392int nfp_tunnel_config_start(struct nfp_app *app);
393void nfp_tunnel_config_stop(struct nfp_app *app);
394int nfp_tunnel_mac_event_handler(struct nfp_app *app,
395 struct net_device *netdev,
396 unsigned long event, void *ptr);
397void nfp_tunnel_del_ipv4_off(struct nfp_app *app, __be32 ipv4);
398void nfp_tunnel_add_ipv4_off(struct nfp_app *app, __be32 ipv4);
399void nfp_tunnel_request_route(struct nfp_app *app, struct sk_buff *skb);
400void nfp_tunnel_keep_alive(struct nfp_app *app, struct sk_buff *skb);
401void nfp_flower_lag_init(struct nfp_fl_lag *lag);
402void nfp_flower_lag_cleanup(struct nfp_fl_lag *lag);
403int nfp_flower_lag_reset(struct nfp_fl_lag *lag);
404int nfp_flower_lag_netdev_event(struct nfp_flower_priv *priv,
405 struct net_device *netdev,
406 unsigned long event, void *ptr);
407bool nfp_flower_lag_unprocessed_msg(struct nfp_app *app, struct sk_buff *skb);
408int nfp_flower_lag_populate_pre_action(struct nfp_app *app,
409 struct net_device *master,
410 struct nfp_fl_pre_lag *pre_act,
411 struct netlink_ext_ack *extack);
412int nfp_flower_lag_get_output_id(struct nfp_app *app,
413 struct net_device *master);
414void nfp_flower_qos_init(struct nfp_app *app);
415void nfp_flower_qos_cleanup(struct nfp_app *app);
416int nfp_flower_setup_qos_offload(struct nfp_app *app, struct net_device *netdev,
417 struct tc_cls_matchall_offload *flow);
418void nfp_flower_stats_rlim_reply(struct nfp_app *app, struct sk_buff *skb);
419int nfp_flower_reg_indir_block_handler(struct nfp_app *app,
420 struct net_device *netdev,
421 unsigned long event);
422
423void
424__nfp_flower_non_repr_priv_get(struct nfp_flower_non_repr_priv *non_repr_priv);
425struct nfp_flower_non_repr_priv *
426nfp_flower_non_repr_priv_get(struct nfp_app *app, struct net_device *netdev);
427void
428__nfp_flower_non_repr_priv_put(struct nfp_flower_non_repr_priv *non_repr_priv);
429void
430nfp_flower_non_repr_priv_put(struct nfp_app *app, struct net_device *netdev);
431u32 nfp_flower_get_port_id_from_netdev(struct nfp_app *app,
432 struct net_device *netdev);
433int nfp_flower_xmit_pre_tun_flow(struct nfp_app *app,
434 struct nfp_fl_payload *flow);
435int nfp_flower_xmit_pre_tun_del_flow(struct nfp_app *app,
436 struct nfp_fl_payload *flow);
437#endif
438