1 #ifndef _NF_FLOW_TABLE_H
2 #define _NF_FLOW_TABLE_H
6 #include <linux/netdevice.h>
7 #include <linux/rhashtable-types.h>
8 #include <linux/rcupdate.h>
9 #include <linux/netfilter/nf_conntrack_tuple_common.h>
14 struct nf_flowtable_type
{
15 struct list_head list
;
17 int (*init
)(struct nf_flowtable
*ft
);
18 void (*free
)(struct nf_flowtable
*ft
);
24 struct list_head list
;
25 struct rhashtable rhashtable
;
26 const struct nf_flowtable_type
*type
;
27 struct delayed_work gc_work
;
30 enum flow_offload_tuple_dir
{
31 FLOW_OFFLOAD_DIR_ORIGINAL
= IP_CT_DIR_ORIGINAL
,
32 FLOW_OFFLOAD_DIR_REPLY
= IP_CT_DIR_REPLY
,
33 FLOW_OFFLOAD_DIR_MAX
= IP_CT_DIR_MAX
36 struct flow_offload_tuple
{
38 struct in_addr src_v4
;
39 struct in6_addr src_v6
;
42 struct in_addr dst_v4
;
43 struct in6_addr dst_v6
;
58 struct dst_entry
*dst_cache
;
61 struct flow_offload_tuple_rhash
{
62 struct rhash_head node
;
63 struct flow_offload_tuple tuple
;
66 #define FLOW_OFFLOAD_SNAT 0x1
67 #define FLOW_OFFLOAD_DNAT 0x2
68 #define FLOW_OFFLOAD_DYING 0x4
69 #define FLOW_OFFLOAD_TEARDOWN 0x8
72 struct flow_offload_tuple_rhash tuplehash
[FLOW_OFFLOAD_DIR_MAX
];
75 /* Your private driver data here. */
80 #define NF_FLOW_TIMEOUT (30 * HZ)
82 struct nf_flow_route
{
84 struct dst_entry
*dst
;
85 } tuple
[FLOW_OFFLOAD_DIR_MAX
];
88 struct flow_offload
*flow_offload_alloc(struct nf_conn
*ct
,
89 struct nf_flow_route
*route
);
90 void flow_offload_free(struct flow_offload
*flow
);
92 int flow_offload_add(struct nf_flowtable
*flow_table
, struct flow_offload
*flow
);
93 struct flow_offload_tuple_rhash
*flow_offload_lookup(struct nf_flowtable
*flow_table
,
94 struct flow_offload_tuple
*tuple
);
95 void nf_flow_table_cleanup(struct net_device
*dev
);
97 int nf_flow_table_init(struct nf_flowtable
*flow_table
);
98 void nf_flow_table_free(struct nf_flowtable
*flow_table
);
100 void flow_offload_teardown(struct flow_offload
*flow
);
101 static inline void flow_offload_dead(struct flow_offload
*flow
)
103 flow
->flags
|= FLOW_OFFLOAD_DYING
;
106 int nf_flow_snat_port(const struct flow_offload
*flow
,
107 struct sk_buff
*skb
, unsigned int thoff
,
108 u8 protocol
, enum flow_offload_tuple_dir dir
);
109 int nf_flow_dnat_port(const struct flow_offload
*flow
,
110 struct sk_buff
*skb
, unsigned int thoff
,
111 u8 protocol
, enum flow_offload_tuple_dir dir
);
117 unsigned int nf_flow_offload_ip_hook(void *priv
, struct sk_buff
*skb
,
118 const struct nf_hook_state
*state
);
119 unsigned int nf_flow_offload_ipv6_hook(void *priv
, struct sk_buff
*skb
,
120 const struct nf_hook_state
*state
);
122 #define MODULE_ALIAS_NF_FLOWTABLE(family) \
123 MODULE_ALIAS("nf-flowtable-" __stringify(family))
125 #endif /* _FLOW_OFFLOAD_H */