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