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