.. | .. |
---|
8 | 8 | #include <linux/string.h> |
---|
9 | 9 | #include <uapi/linux/if_ether.h> |
---|
10 | 10 | |
---|
| 11 | +struct bpf_prog; |
---|
| 12 | +struct net; |
---|
| 13 | +struct sk_buff; |
---|
| 14 | + |
---|
11 | 15 | /** |
---|
12 | 16 | * struct flow_dissector_key_control: |
---|
13 | 17 | * @thoff: Transport header offset |
---|
.. | .. |
---|
32 | 36 | |
---|
33 | 37 | /** |
---|
34 | 38 | * struct flow_dissector_key_basic: |
---|
35 | | - * @thoff: Transport header offset |
---|
36 | 39 | * @n_proto: Network header protocol (eg. IPv4/IPv6) |
---|
37 | 40 | * @ip_proto: Transport header protocol (eg. TCP/UDP) |
---|
38 | 41 | */ |
---|
.. | .. |
---|
47 | 50 | }; |
---|
48 | 51 | |
---|
49 | 52 | struct flow_dissector_key_vlan { |
---|
50 | | - u16 vlan_id:12, |
---|
51 | | - vlan_priority:3; |
---|
| 53 | + union { |
---|
| 54 | + struct { |
---|
| 55 | + u16 vlan_id:12, |
---|
| 56 | + vlan_dei:1, |
---|
| 57 | + vlan_priority:3; |
---|
| 58 | + }; |
---|
| 59 | + __be16 vlan_tci; |
---|
| 60 | + }; |
---|
52 | 61 | __be16 vlan_tpid; |
---|
| 62 | + __be16 vlan_eth_type; |
---|
| 63 | + u16 padding; |
---|
53 | 64 | }; |
---|
54 | 65 | |
---|
55 | | -struct flow_dissector_key_mpls { |
---|
| 66 | +struct flow_dissector_mpls_lse { |
---|
56 | 67 | u32 mpls_ttl:8, |
---|
57 | 68 | mpls_bos:1, |
---|
58 | 69 | mpls_tc:3, |
---|
59 | 70 | mpls_label:20; |
---|
60 | 71 | }; |
---|
| 72 | + |
---|
| 73 | +#define FLOW_DIS_MPLS_MAX 7 |
---|
| 74 | +struct flow_dissector_key_mpls { |
---|
| 75 | + struct flow_dissector_mpls_lse ls[FLOW_DIS_MPLS_MAX]; /* Label Stack */ |
---|
| 76 | + u8 used_lses; /* One bit set for each Label Stack Entry in use */ |
---|
| 77 | +}; |
---|
| 78 | + |
---|
| 79 | +static inline void dissector_set_mpls_lse(struct flow_dissector_key_mpls *mpls, |
---|
| 80 | + int lse_index) |
---|
| 81 | +{ |
---|
| 82 | + mpls->used_lses |= 1 << lse_index; |
---|
| 83 | +} |
---|
61 | 84 | |
---|
62 | 85 | #define FLOW_DIS_TUN_OPTS_MAX 255 |
---|
63 | 86 | /** |
---|
.. | .. |
---|
157 | 180 | |
---|
158 | 181 | /** |
---|
159 | 182 | * flow_dissector_key_icmp: |
---|
160 | | - * @ports: type and code of ICMP header |
---|
161 | | - * icmp: ICMP type (high) and code (low) |
---|
162 | 183 | * type: ICMP type |
---|
163 | 184 | * code: ICMP code |
---|
| 185 | + * id: session identifier |
---|
164 | 186 | */ |
---|
165 | 187 | struct flow_dissector_key_icmp { |
---|
166 | | - union { |
---|
167 | | - __be16 icmp; |
---|
168 | | - struct { |
---|
169 | | - u8 type; |
---|
170 | | - u8 code; |
---|
171 | | - }; |
---|
| 188 | + struct { |
---|
| 189 | + u8 type; |
---|
| 190 | + u8 code; |
---|
172 | 191 | }; |
---|
| 192 | + u16 id; |
---|
173 | 193 | }; |
---|
174 | 194 | |
---|
175 | 195 | /** |
---|
.. | .. |
---|
201 | 221 | __u8 ttl; |
---|
202 | 222 | }; |
---|
203 | 223 | |
---|
| 224 | +/** |
---|
| 225 | + * struct flow_dissector_key_meta: |
---|
| 226 | + * @ingress_ifindex: ingress ifindex |
---|
| 227 | + * @ingress_iftype: ingress interface type |
---|
| 228 | + */ |
---|
| 229 | +struct flow_dissector_key_meta { |
---|
| 230 | + int ingress_ifindex; |
---|
| 231 | + u16 ingress_iftype; |
---|
| 232 | +}; |
---|
| 233 | + |
---|
| 234 | +/** |
---|
| 235 | + * struct flow_dissector_key_ct: |
---|
| 236 | + * @ct_state: conntrack state after converting with map |
---|
| 237 | + * @ct_mark: conttrack mark |
---|
| 238 | + * @ct_zone: conntrack zone |
---|
| 239 | + * @ct_labels: conntrack labels |
---|
| 240 | + */ |
---|
| 241 | +struct flow_dissector_key_ct { |
---|
| 242 | + u16 ct_state; |
---|
| 243 | + u16 ct_zone; |
---|
| 244 | + u32 ct_mark; |
---|
| 245 | + u32 ct_labels[4]; |
---|
| 246 | +}; |
---|
| 247 | + |
---|
| 248 | +/** |
---|
| 249 | + * struct flow_dissector_key_hash: |
---|
| 250 | + * @hash: hash value |
---|
| 251 | + */ |
---|
| 252 | +struct flow_dissector_key_hash { |
---|
| 253 | + u32 hash; |
---|
| 254 | +}; |
---|
| 255 | + |
---|
204 | 256 | enum flow_dissector_key_id { |
---|
205 | 257 | FLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */ |
---|
206 | 258 | FLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */ |
---|
207 | 259 | FLOW_DISSECTOR_KEY_IPV4_ADDRS, /* struct flow_dissector_key_ipv4_addrs */ |
---|
208 | 260 | FLOW_DISSECTOR_KEY_IPV6_ADDRS, /* struct flow_dissector_key_ipv6_addrs */ |
---|
209 | 261 | FLOW_DISSECTOR_KEY_PORTS, /* struct flow_dissector_key_ports */ |
---|
| 262 | + FLOW_DISSECTOR_KEY_PORTS_RANGE, /* struct flow_dissector_key_ports */ |
---|
210 | 263 | FLOW_DISSECTOR_KEY_ICMP, /* struct flow_dissector_key_icmp */ |
---|
211 | 264 | FLOW_DISSECTOR_KEY_ETH_ADDRS, /* struct flow_dissector_key_eth_addrs */ |
---|
212 | 265 | FLOW_DISSECTOR_KEY_TIPC, /* struct flow_dissector_key_tipc */ |
---|
213 | 266 | FLOW_DISSECTOR_KEY_ARP, /* struct flow_dissector_key_arp */ |
---|
214 | | - FLOW_DISSECTOR_KEY_VLAN, /* struct flow_dissector_key_flow_vlan */ |
---|
215 | | - FLOW_DISSECTOR_KEY_FLOW_LABEL, /* struct flow_dissector_key_flow_tags */ |
---|
| 267 | + FLOW_DISSECTOR_KEY_VLAN, /* struct flow_dissector_key_vlan */ |
---|
| 268 | + FLOW_DISSECTOR_KEY_FLOW_LABEL, /* struct flow_dissector_key_tags */ |
---|
216 | 269 | FLOW_DISSECTOR_KEY_GRE_KEYID, /* struct flow_dissector_key_keyid */ |
---|
217 | 270 | FLOW_DISSECTOR_KEY_MPLS_ENTROPY, /* struct flow_dissector_key_keyid */ |
---|
218 | 271 | FLOW_DISSECTOR_KEY_ENC_KEYID, /* struct flow_dissector_key_keyid */ |
---|
.. | .. |
---|
223 | 276 | FLOW_DISSECTOR_KEY_MPLS, /* struct flow_dissector_key_mpls */ |
---|
224 | 277 | FLOW_DISSECTOR_KEY_TCP, /* struct flow_dissector_key_tcp */ |
---|
225 | 278 | FLOW_DISSECTOR_KEY_IP, /* struct flow_dissector_key_ip */ |
---|
226 | | - FLOW_DISSECTOR_KEY_CVLAN, /* struct flow_dissector_key_flow_vlan */ |
---|
| 279 | + FLOW_DISSECTOR_KEY_CVLAN, /* struct flow_dissector_key_vlan */ |
---|
227 | 280 | FLOW_DISSECTOR_KEY_ENC_IP, /* struct flow_dissector_key_ip */ |
---|
228 | 281 | FLOW_DISSECTOR_KEY_ENC_OPTS, /* struct flow_dissector_key_enc_opts */ |
---|
| 282 | + FLOW_DISSECTOR_KEY_META, /* struct flow_dissector_key_meta */ |
---|
| 283 | + FLOW_DISSECTOR_KEY_CT, /* struct flow_dissector_key_ct */ |
---|
| 284 | + FLOW_DISSECTOR_KEY_HASH, /* struct flow_dissector_key_hash */ |
---|
229 | 285 | |
---|
230 | 286 | FLOW_DISSECTOR_KEY_MAX, |
---|
231 | 287 | }; |
---|
232 | 288 | |
---|
233 | 289 | #define FLOW_DISSECTOR_F_PARSE_1ST_FRAG BIT(0) |
---|
234 | | -#define FLOW_DISSECTOR_F_STOP_AT_L3 BIT(1) |
---|
235 | | -#define FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL BIT(2) |
---|
236 | | -#define FLOW_DISSECTOR_F_STOP_AT_ENCAP BIT(3) |
---|
| 290 | +#define FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL BIT(1) |
---|
| 291 | +#define FLOW_DISSECTOR_F_STOP_AT_ENCAP BIT(2) |
---|
237 | 292 | |
---|
238 | 293 | struct flow_dissector_key { |
---|
239 | 294 | enum flow_dissector_key_id key_id; |
---|
.. | .. |
---|
260 | 315 | struct flow_dissector_key_vlan cvlan; |
---|
261 | 316 | struct flow_dissector_key_keyid keyid; |
---|
262 | 317 | struct flow_dissector_key_ports ports; |
---|
| 318 | + struct flow_dissector_key_icmp icmp; |
---|
| 319 | + /* 'addrs' must be the last member */ |
---|
263 | 320 | struct flow_dissector_key_addrs addrs; |
---|
264 | 321 | }; |
---|
265 | 322 | |
---|
.. | .. |
---|
293 | 350 | } |
---|
294 | 351 | |
---|
295 | 352 | u32 flow_hash_from_keys(struct flow_keys *keys); |
---|
| 353 | +void skb_flow_get_icmp_tci(const struct sk_buff *skb, |
---|
| 354 | + struct flow_dissector_key_icmp *key_icmp, |
---|
| 355 | + void *data, int thoff, int hlen); |
---|
296 | 356 | |
---|
297 | 357 | static inline bool dissector_uses_key(const struct flow_dissector *flow_dissector, |
---|
298 | 358 | enum flow_dissector_key_id key_id) |
---|
.. | .. |
---|
307 | 367 | return ((char *)target_container) + flow_dissector->offset[key_id]; |
---|
308 | 368 | } |
---|
309 | 369 | |
---|
| 370 | +struct bpf_flow_dissector { |
---|
| 371 | + struct bpf_flow_keys *flow_keys; |
---|
| 372 | + const struct sk_buff *skb; |
---|
| 373 | + void *data; |
---|
| 374 | + void *data_end; |
---|
| 375 | +}; |
---|
| 376 | + |
---|
310 | 377 | static inline void |
---|
311 | 378 | flow_dissector_init_keys(struct flow_dissector_key_control *key_control, |
---|
312 | 379 | struct flow_dissector_key_basic *key_basic) |
---|
.. | .. |
---|
315 | 382 | memset(key_basic, 0, sizeof(*key_basic)); |
---|
316 | 383 | } |
---|
317 | 384 | |
---|
| 385 | +#ifdef CONFIG_BPF_SYSCALL |
---|
| 386 | +int flow_dissector_bpf_prog_attach_check(struct net *net, |
---|
| 387 | + struct bpf_prog *prog); |
---|
| 388 | +#endif /* CONFIG_BPF_SYSCALL */ |
---|
| 389 | + |
---|
318 | 390 | #endif |
---|