]>
Commit | Line | Data |
---|---|---|
c9626a2c PNA |
1 | #ifndef _NET_NF_TABLES_OFFLOAD_H |
2 | #define _NET_NF_TABLES_OFFLOAD_H | |
3 | ||
4 | #include <net/flow_offload.h> | |
5 | #include <net/netfilter/nf_tables.h> | |
6 | ||
7 | struct nft_offload_reg { | |
8 | u32 key; | |
9 | u32 len; | |
10 | u32 base_offset; | |
11 | u32 offset; | |
12 | struct nft_data mask; | |
13 | }; | |
14 | ||
15 | enum nft_offload_dep_type { | |
16 | NFT_OFFLOAD_DEP_UNSPEC = 0, | |
17 | NFT_OFFLOAD_DEP_NETWORK, | |
18 | NFT_OFFLOAD_DEP_TRANSPORT, | |
19 | }; | |
20 | ||
21 | struct nft_offload_ctx { | |
22 | struct { | |
23 | enum nft_offload_dep_type type; | |
24 | __be16 l3num; | |
25 | u8 protonum; | |
26 | } dep; | |
27 | unsigned int num_actions; | |
28 | struct nft_offload_reg regs[NFT_REG32_15 + 1]; | |
29 | }; | |
30 | ||
31 | void nft_offload_set_dependency(struct nft_offload_ctx *ctx, | |
32 | enum nft_offload_dep_type type); | |
33 | void nft_offload_update_dependency(struct nft_offload_ctx *ctx, | |
34 | const void *data, u32 len); | |
35 | ||
36 | struct nft_flow_key { | |
37 | struct flow_dissector_key_basic basic; | |
38 | union { | |
39 | struct flow_dissector_key_ipv4_addrs ipv4; | |
40 | struct flow_dissector_key_ipv6_addrs ipv6; | |
41 | }; | |
42 | struct flow_dissector_key_ports tp; | |
43 | struct flow_dissector_key_ip ip; | |
44 | struct flow_dissector_key_vlan vlan; | |
45 | struct flow_dissector_key_eth_addrs eth_addrs; | |
46 | } __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs. */ | |
47 | ||
48 | struct nft_flow_match { | |
49 | struct flow_dissector dissector; | |
50 | struct nft_flow_key key; | |
51 | struct nft_flow_key mask; | |
52 | }; | |
53 | ||
54 | struct nft_flow_rule { | |
55 | __be16 proto; | |
56 | struct nft_flow_match match; | |
57 | struct flow_rule *rule; | |
58 | }; | |
59 | ||
60 | #define NFT_OFFLOAD_F_ACTION (1 << 0) | |
61 | ||
62 | struct nft_rule; | |
63 | struct nft_flow_rule *nft_flow_rule_create(const struct nft_rule *rule); | |
64 | void nft_flow_rule_destroy(struct nft_flow_rule *flow); | |
65 | int nft_flow_rule_offload_commit(struct net *net); | |
66 | ||
67 | #define NFT_OFFLOAD_MATCH(__key, __base, __field, __len, __reg) \ | |
68 | (__reg)->base_offset = \ | |
69 | offsetof(struct nft_flow_key, __base); \ | |
70 | (__reg)->offset = \ | |
71 | offsetof(struct nft_flow_key, __base.__field); \ | |
72 | (__reg)->len = __len; \ | |
73 | (__reg)->key = __key; \ | |
74 | memset(&(__reg)->mask, 0xff, (__reg)->len); | |
75 | ||
76 | #endif |