1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* Copyright (c) 2021, Intel Corporation. */ |
3 | |
4 | #ifndef _IAVF_FDIR_H_ |
5 | #define _IAVF_FDIR_H_ |
6 | |
7 | struct iavf_adapter; |
8 | |
9 | /* State of Flow Director filter */ |
10 | enum iavf_fdir_fltr_state_t { |
11 | IAVF_FDIR_FLTR_ADD_REQUEST, /* User requests to add filter */ |
12 | IAVF_FDIR_FLTR_ADD_PENDING, /* Filter pending add by the PF */ |
13 | IAVF_FDIR_FLTR_DEL_REQUEST, /* User requests to delete filter */ |
14 | IAVF_FDIR_FLTR_DEL_PENDING, /* Filter pending delete by the PF */ |
15 | IAVF_FDIR_FLTR_ACTIVE, /* Filter is active */ |
16 | }; |
17 | |
18 | enum iavf_fdir_flow_type { |
19 | /* NONE - used for undef/error */ |
20 | IAVF_FDIR_FLOW_NONE = 0, |
21 | IAVF_FDIR_FLOW_IPV4_TCP, |
22 | IAVF_FDIR_FLOW_IPV4_UDP, |
23 | IAVF_FDIR_FLOW_IPV4_SCTP, |
24 | IAVF_FDIR_FLOW_IPV4_AH, |
25 | IAVF_FDIR_FLOW_IPV4_ESP, |
26 | IAVF_FDIR_FLOW_IPV4_OTHER, |
27 | IAVF_FDIR_FLOW_IPV6_TCP, |
28 | IAVF_FDIR_FLOW_IPV6_UDP, |
29 | IAVF_FDIR_FLOW_IPV6_SCTP, |
30 | IAVF_FDIR_FLOW_IPV6_AH, |
31 | IAVF_FDIR_FLOW_IPV6_ESP, |
32 | IAVF_FDIR_FLOW_IPV6_OTHER, |
33 | IAVF_FDIR_FLOW_NON_IP_L2, |
34 | /* MAX - this must be last and add anything new just above it */ |
35 | IAVF_FDIR_FLOW_PTYPE_MAX, |
36 | }; |
37 | |
38 | /* Must not exceed the array element number of '__be32 data[2]' in the ethtool |
39 | * 'struct ethtool_rx_flow_spec.m_ext.data[2]' to express the flex-byte (word). |
40 | */ |
41 | #define IAVF_FLEX_WORD_NUM 2 |
42 | |
43 | struct iavf_flex_word { |
44 | u16 offset; |
45 | u16 word; |
46 | }; |
47 | |
48 | struct iavf_ipv4_addrs { |
49 | __be32 src_ip; |
50 | __be32 dst_ip; |
51 | }; |
52 | |
53 | struct iavf_ipv6_addrs { |
54 | struct in6_addr src_ip; |
55 | struct in6_addr dst_ip; |
56 | }; |
57 | |
58 | struct iavf_fdir_eth { |
59 | __be16 etype; |
60 | }; |
61 | |
62 | struct iavf_fdir_ip { |
63 | union { |
64 | struct iavf_ipv4_addrs v4_addrs; |
65 | struct iavf_ipv6_addrs v6_addrs; |
66 | }; |
67 | __be16 src_port; |
68 | __be16 dst_port; |
69 | __be32 ; /* first 4 bytes of the layer 4 header */ |
70 | __be32 spi; /* security parameter index for AH/ESP */ |
71 | union { |
72 | u8 tos; |
73 | u8 tclass; |
74 | }; |
75 | u8 proto; |
76 | }; |
77 | |
78 | struct { |
79 | u32 [IAVF_FLEX_WORD_NUM]; |
80 | }; |
81 | |
82 | /* bookkeeping of Flow Director filters */ |
83 | struct iavf_fdir_fltr { |
84 | enum iavf_fdir_fltr_state_t state; |
85 | struct list_head list; |
86 | |
87 | enum iavf_fdir_flow_type flow_type; |
88 | |
89 | struct iavf_fdir_eth eth_data; |
90 | struct iavf_fdir_eth eth_mask; |
91 | |
92 | struct iavf_fdir_ip ip_data; |
93 | struct iavf_fdir_ip ip_mask; |
94 | |
95 | struct iavf_fdir_extra ext_data; |
96 | struct iavf_fdir_extra ext_mask; |
97 | |
98 | enum virtchnl_action action; |
99 | |
100 | /* flex byte filter data */ |
101 | u8 ip_ver; /* used to adjust the flex offset, 4 : IPv4, 6 : IPv6 */ |
102 | u8 flex_cnt; |
103 | struct iavf_flex_word flex_words[IAVF_FLEX_WORD_NUM]; |
104 | |
105 | u32 flow_id; |
106 | |
107 | u32 loc; /* Rule location inside the flow table */ |
108 | u32 q_index; |
109 | |
110 | struct virtchnl_fdir_add vc_add_msg; |
111 | }; |
112 | |
113 | int iavf_validate_fdir_fltr_masks(struct iavf_adapter *adapter, |
114 | struct iavf_fdir_fltr *fltr); |
115 | int iavf_fill_fdir_add_msg(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); |
116 | void iavf_print_fdir_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); |
117 | bool iavf_fdir_is_dup_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); |
118 | void iavf_fdir_list_add_fltr(struct iavf_adapter *adapter, struct iavf_fdir_fltr *fltr); |
119 | struct iavf_fdir_fltr *iavf_find_fdir_fltr_by_loc(struct iavf_adapter *adapter, u32 loc); |
120 | #endif /* _IAVF_FDIR_H_ */ |
121 | |