Merge tag 'f2fs-for-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk...
[sfrench/cifs-2.6.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/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 void nf_flow_table_cleanup(struct net_device *dev);
99
100 int nf_flow_table_init(struct nf_flowtable *flow_table);
101 void nf_flow_table_free(struct nf_flowtable *flow_table);
102
103 void flow_offload_teardown(struct flow_offload *flow);
104 static inline void flow_offload_dead(struct flow_offload *flow)
105 {
106         flow->flags |= FLOW_OFFLOAD_DYING;
107 }
108
109 int nf_flow_snat_port(const struct flow_offload *flow,
110                       struct sk_buff *skb, unsigned int thoff,
111                       u8 protocol, enum flow_offload_tuple_dir dir);
112 int nf_flow_dnat_port(const struct flow_offload *flow,
113                       struct sk_buff *skb, unsigned int thoff,
114                       u8 protocol, enum flow_offload_tuple_dir dir);
115
116 struct flow_ports {
117         __be16 source, dest;
118 };
119
120 unsigned int nf_flow_offload_ip_hook(void *priv, struct sk_buff *skb,
121                                      const struct nf_hook_state *state);
122 unsigned int nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb,
123                                        const struct nf_hook_state *state);
124
125 #define MODULE_ALIAS_NF_FLOWTABLE(family)       \
126         MODULE_ALIAS("nf-flowtable-" __stringify(family))
127
128 #endif /* _FLOW_OFFLOAD_H */