1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* Copyright (C) 2018-2020, Intel Corporation. */ |
3 | |
4 | #ifndef _ICE_ARFS_H_ |
5 | #define _ICE_ARFS_H_ |
6 | |
7 | #include "ice_fdir.h" |
8 | |
9 | enum ice_arfs_fltr_state { |
10 | ICE_ARFS_INACTIVE, |
11 | ICE_ARFS_ACTIVE, |
12 | ICE_ARFS_TODEL, |
13 | }; |
14 | |
15 | struct ice_arfs_entry { |
16 | struct ice_fdir_fltr fltr_info; |
17 | struct hlist_node list_entry; |
18 | u64 time_activated; /* only valid for UDP flows */ |
19 | u32 flow_id; |
20 | /* fltr_state = 0 - ICE_ARFS_INACTIVE: |
21 | * filter needs to be updated or programmed in HW. |
22 | * fltr_state = 1 - ICE_ARFS_ACTIVE: |
23 | * filter is active and programmed in HW. |
24 | * fltr_state = 2 - ICE_ARFS_TODEL: |
25 | * filter has been deleted from HW and needs to be removed from |
26 | * the aRFS hash table. |
27 | */ |
28 | u8 fltr_state; |
29 | }; |
30 | |
31 | struct ice_arfs_entry_ptr { |
32 | struct ice_arfs_entry *arfs_entry; |
33 | struct hlist_node list_entry; |
34 | }; |
35 | |
36 | struct ice_arfs_active_fltr_cntrs { |
37 | atomic_t active_tcpv4_cnt; |
38 | atomic_t active_tcpv6_cnt; |
39 | atomic_t active_udpv4_cnt; |
40 | atomic_t active_udpv6_cnt; |
41 | }; |
42 | |
43 | #ifdef CONFIG_RFS_ACCEL |
44 | int |
45 | ice_rx_flow_steer(struct net_device *netdev, const struct sk_buff *skb, |
46 | u16 rxq_idx, u32 flow_id); |
47 | void ice_clear_arfs(struct ice_vsi *vsi); |
48 | void ice_free_cpu_rx_rmap(struct ice_vsi *vsi); |
49 | void ice_init_arfs(struct ice_vsi *vsi); |
50 | void ice_sync_arfs_fltrs(struct ice_pf *pf); |
51 | int ice_set_cpu_rx_rmap(struct ice_vsi *vsi); |
52 | void ice_remove_arfs(struct ice_pf *pf); |
53 | void ice_rebuild_arfs(struct ice_pf *pf); |
54 | bool |
55 | ice_is_arfs_using_perfect_flow(struct ice_hw *hw, |
56 | enum ice_fltr_ptype flow_type); |
57 | #else |
58 | static inline void ice_clear_arfs(struct ice_vsi *vsi) { } |
59 | static inline void ice_free_cpu_rx_rmap(struct ice_vsi *vsi) { } |
60 | static inline void ice_init_arfs(struct ice_vsi *vsi) { } |
61 | static inline void ice_sync_arfs_fltrs(struct ice_pf *pf) { } |
62 | static inline void ice_remove_arfs(struct ice_pf *pf) { } |
63 | static inline void ice_rebuild_arfs(struct ice_pf *pf) { } |
64 | |
65 | static inline int ice_set_cpu_rx_rmap(struct ice_vsi __always_unused *vsi) |
66 | { |
67 | return 0; |
68 | } |
69 | |
70 | static inline int |
71 | ice_rx_flow_steer(struct net_device __always_unused *netdev, |
72 | const struct sk_buff __always_unused *skb, |
73 | u16 __always_unused rxq_idx, u32 __always_unused flow_id) |
74 | { |
75 | return -EOPNOTSUPP; |
76 | } |
77 | |
78 | static inline bool |
79 | ice_is_arfs_using_perfect_flow(struct ice_hw __always_unused *hw, |
80 | enum ice_fltr_ptype __always_unused flow_type) |
81 | { |
82 | return false; |
83 | } |
84 | #endif /* CONFIG_RFS_ACCEL */ |
85 | #endif /* _ICE_ARFS_H_ */ |
86 | |