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 data;
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;
29 	struct net				*net;
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;
48 	struct flow_dissector_key_meta			meta;
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;
66 struct nft_flow_rule *nft_flow_rule_create(struct net *net, const struct nft_rule *rule);
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 
79 int nft_chain_offload_priority(struct nft_base_chain *basechain);
80 
81 int nft_offload_init(void);
82 void nft_offload_exit(void);
83 
84 #endif
85