1 #ifndef _NF_FLOW_TABLE_H
2 #define _NF_FLOW_TABLE_H
3
4 #include <linux/in.h>
5 #include <linux/in6.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>
10 #include <net/dst.h>
11
12 struct nf_flowtable;
13
14 struct nf_flowtable_type {
15 struct list_head list;
16 int family;
17 int (*init)(struct nf_flowtable *ft);
18 void (*free)(struct nf_flowtable *ft);
19 nf_hookfn *hook;
20 struct module *owner;
21 };
22
23 struct nf_flowtable {
24 struct list_head list;
25 struct rhashtable rhashtable;
26 const struct nf_flowtable_type *type;
27 struct delayed_work gc_work;
28 };
29
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
34 };
35
36 struct flow_offload_tuple {
37 union {
38 struct in_addr src_v4;
39 struct in6_addr src_v6;
40 };
41 union {
42 struct in_addr dst_v4;
43 struct in6_addr dst_v6;
44 };
45 struct {
46 __be16 src_port;
47 __be16 dst_port;
48 };
49
50 int iifidx;
51
52 u8 l3proto;
53 u8 l4proto;
54 u8 dir;
55
56 int oifidx;
57
58 u16 mtu;
59
60 struct dst_entry *dst_cache;
61 };
62
63 struct flow_offload_tuple_rhash {
64 struct rhash_head node;
65 struct flow_offload_tuple tuple;
66 };
67
68 #define FLOW_OFFLOAD_SNAT 0x1
69 #define FLOW_OFFLOAD_DNAT 0x2
70 #define FLOW_OFFLOAD_DYING 0x4
71 #define FLOW_OFFLOAD_TEARDOWN 0x8
72
73 struct flow_offload {
74 struct flow_offload_tuple_rhash tuplehash[FLOW_OFFLOAD_DIR_MAX];
75 u32 flags;
76 union {
77 /* Your private driver data here. */
78 u32 timeout;
79 };
80 };
81
82 #define NF_FLOW_TIMEOUT (30 * HZ)
83
84 struct nf_flow_route {
85 struct {
86 struct dst_entry *dst;
87 int ifindex;
88 } tuple[FLOW_OFFLOAD_DIR_MAX];
89 };
90
91 struct flow_offload *flow_offload_alloc(struct nf_conn *ct,
92 struct nf_flow_route *route);
93 void flow_offload_free(struct flow_offload *flow);
94
95 int flow_offload_add(struct nf_flowtable *flow_table, struct flow_offload *flow);
96 struct flow_offload_tuple_rhash *flow_offload_lookup(struct nf_flowtable *flow_table,
97 struct flow_offload_tuple *tuple);
98 int nf_flow_table_iterate(struct nf_flowtable *flow_table,
99 void (*iter)(struct flow_offload *flow, void *data),
100 void *data);
101
102 void nf_flow_table_cleanup(struct net *net, struct net_device *dev);
103
104 int nf_flow_table_init(struct nf_flowtable *flow_table);
105 void nf_flow_table_free(struct nf_flowtable *flow_table);
106
107 void flow_offload_teardown(struct flow_offload *flow);
flow_offload_dead(struct flow_offload * flow)108 static inline void flow_offload_dead(struct flow_offload *flow)
109 {
110 flow->flags |= FLOW_OFFLOAD_DYING;
111 }
112
113 int nf_flow_snat_port(const struct flow_offload *flow,
114 struct sk_buff *skb, unsigned int thoff,
115 u8 protocol, enum flow_offload_tuple_dir dir);
116 int nf_flow_dnat_port(const struct flow_offload *flow,
117 struct sk_buff *skb, unsigned int thoff,
118 u8 protocol, enum flow_offload_tuple_dir dir);
119
120 struct flow_ports {
121 __be16 source, dest;
122 };
123
124 unsigned int nf_flow_offload_ip_hook(void *priv, struct sk_buff *skb,
125 const struct nf_hook_state *state);
126 unsigned int nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,
127 const struct nf_hook_state *state);
128
129 #define MODULE_ALIAS_NF_FLOWTABLE(family) \
130 MODULE_ALIAS("nf-flowtable-" __stringify(family))
131
132 #endif /* _FLOW_OFFLOAD_H */
133