9e0297c4c11da8f1a1332f459c428c705c686bf0
[cascardo/linux.git] / include / net / flow.h
1 /*
2  *
3  *      Generic internet FLOW.
4  *
5  */
6
7 #ifndef _NET_FLOW_H
8 #define _NET_FLOW_H
9
10 #include <linux/socket.h>
11 #include <linux/in6.h>
12 #include <linux/atomic.h>
13
14 /*
15  * ifindex generation is per-net namespace, and loopback is
16  * always the 1st device in ns (see net_dev_init), thus any
17  * loopback device should get ifindex 1
18  */
19
20 #define LOOPBACK_IFINDEX        1
21
22 struct flowi_tunnel {
23         __be64                  tun_id;
24 };
25
26 struct flowi_common {
27         int     flowic_oif;
28         int     flowic_iif;
29         __u32   flowic_mark;
30         __u8    flowic_tos;
31         __u8    flowic_scope;
32         __u8    flowic_proto;
33         __u8    flowic_flags;
34 #define FLOWI_FLAG_ANYSRC               0x01
35 #define FLOWI_FLAG_KNOWN_NH             0x02
36 #define FLOWI_FLAG_VRFSRC               0x04
37         __u32   flowic_secid;
38         struct flowi_tunnel flowic_tun_key;
39 };
40
41 union flowi_uli {
42         struct {
43                 __be16  dport;
44                 __be16  sport;
45         } ports;
46
47         struct {
48                 __u8    type;
49                 __u8    code;
50         } icmpt;
51
52         struct {
53                 __le16  dport;
54                 __le16  sport;
55         } dnports;
56
57         __be32          spi;
58         __be32          gre_key;
59
60         struct {
61                 __u8    type;
62         } mht;
63 };
64
65 struct flowi4 {
66         struct flowi_common     __fl_common;
67 #define flowi4_oif              __fl_common.flowic_oif
68 #define flowi4_iif              __fl_common.flowic_iif
69 #define flowi4_mark             __fl_common.flowic_mark
70 #define flowi4_tos              __fl_common.flowic_tos
71 #define flowi4_scope            __fl_common.flowic_scope
72 #define flowi4_proto            __fl_common.flowic_proto
73 #define flowi4_flags            __fl_common.flowic_flags
74 #define flowi4_secid            __fl_common.flowic_secid
75 #define flowi4_tun_key          __fl_common.flowic_tun_key
76
77         /* (saddr,daddr) must be grouped, same order as in IP header */
78         __be32                  saddr;
79         __be32                  daddr;
80
81         union flowi_uli         uli;
82 #define fl4_sport               uli.ports.sport
83 #define fl4_dport               uli.ports.dport
84 #define fl4_icmp_type           uli.icmpt.type
85 #define fl4_icmp_code           uli.icmpt.code
86 #define fl4_ipsec_spi           uli.spi
87 #define fl4_mh_type             uli.mht.type
88 #define fl4_gre_key             uli.gre_key
89 } __attribute__((__aligned__(BITS_PER_LONG/8)));
90
91 static inline void flowi4_init_output(struct flowi4 *fl4, int oif,
92                                       __u32 mark, __u8 tos, __u8 scope,
93                                       __u8 proto, __u8 flags,
94                                       __be32 daddr, __be32 saddr,
95                                       __be16 dport, __be16 sport)
96 {
97         fl4->flowi4_oif = oif;
98         fl4->flowi4_iif = LOOPBACK_IFINDEX;
99         fl4->flowi4_mark = mark;
100         fl4->flowi4_tos = tos;
101         fl4->flowi4_scope = scope;
102         fl4->flowi4_proto = proto;
103         fl4->flowi4_flags = flags;
104         fl4->flowi4_secid = 0;
105         fl4->flowi4_tun_key.tun_id = 0;
106         fl4->daddr = daddr;
107         fl4->saddr = saddr;
108         fl4->fl4_dport = dport;
109         fl4->fl4_sport = sport;
110 }
111
112 /* Reset some input parameters after previous lookup */
113 static inline void flowi4_update_output(struct flowi4 *fl4, int oif, __u8 tos,
114                                         __be32 daddr, __be32 saddr)
115 {
116         fl4->flowi4_oif = oif;
117         fl4->flowi4_tos = tos;
118         fl4->daddr = daddr;
119         fl4->saddr = saddr;
120 }
121                                       
122
123 struct flowi6 {
124         struct flowi_common     __fl_common;
125 #define flowi6_oif              __fl_common.flowic_oif
126 #define flowi6_iif              __fl_common.flowic_iif
127 #define flowi6_mark             __fl_common.flowic_mark
128 #define flowi6_tos              __fl_common.flowic_tos
129 #define flowi6_scope            __fl_common.flowic_scope
130 #define flowi6_proto            __fl_common.flowic_proto
131 #define flowi6_flags            __fl_common.flowic_flags
132 #define flowi6_secid            __fl_common.flowic_secid
133 #define flowi6_tun_key          __fl_common.flowic_tun_key
134         struct in6_addr         daddr;
135         struct in6_addr         saddr;
136         __be32                  flowlabel;
137         union flowi_uli         uli;
138 #define fl6_sport               uli.ports.sport
139 #define fl6_dport               uli.ports.dport
140 #define fl6_icmp_type           uli.icmpt.type
141 #define fl6_icmp_code           uli.icmpt.code
142 #define fl6_ipsec_spi           uli.spi
143 #define fl6_mh_type             uli.mht.type
144 #define fl6_gre_key             uli.gre_key
145 } __attribute__((__aligned__(BITS_PER_LONG/8)));
146
147 struct flowidn {
148         struct flowi_common     __fl_common;
149 #define flowidn_oif             __fl_common.flowic_oif
150 #define flowidn_iif             __fl_common.flowic_iif
151 #define flowidn_mark            __fl_common.flowic_mark
152 #define flowidn_scope           __fl_common.flowic_scope
153 #define flowidn_proto           __fl_common.flowic_proto
154 #define flowidn_flags           __fl_common.flowic_flags
155         __le16                  daddr;
156         __le16                  saddr;
157         union flowi_uli         uli;
158 #define fld_sport               uli.ports.sport
159 #define fld_dport               uli.ports.dport
160 } __attribute__((__aligned__(BITS_PER_LONG/8)));
161
162 struct flowi {
163         union {
164                 struct flowi_common     __fl_common;
165                 struct flowi4           ip4;
166                 struct flowi6           ip6;
167                 struct flowidn          dn;
168         } u;
169 #define flowi_oif       u.__fl_common.flowic_oif
170 #define flowi_iif       u.__fl_common.flowic_iif
171 #define flowi_mark      u.__fl_common.flowic_mark
172 #define flowi_tos       u.__fl_common.flowic_tos
173 #define flowi_scope     u.__fl_common.flowic_scope
174 #define flowi_proto     u.__fl_common.flowic_proto
175 #define flowi_flags     u.__fl_common.flowic_flags
176 #define flowi_secid     u.__fl_common.flowic_secid
177 #define flowi_tun_key   u.__fl_common.flowic_tun_key
178 } __attribute__((__aligned__(BITS_PER_LONG/8)));
179
180 static inline struct flowi *flowi4_to_flowi(struct flowi4 *fl4)
181 {
182         return container_of(fl4, struct flowi, u.ip4);
183 }
184
185 static inline struct flowi *flowi6_to_flowi(struct flowi6 *fl6)
186 {
187         return container_of(fl6, struct flowi, u.ip6);
188 }
189
190 static inline struct flowi *flowidn_to_flowi(struct flowidn *fldn)
191 {
192         return container_of(fldn, struct flowi, u.dn);
193 }
194
195 typedef unsigned long flow_compare_t;
196
197 static inline size_t flow_key_size(u16 family)
198 {
199         switch (family) {
200         case AF_INET:
201                 BUILD_BUG_ON(sizeof(struct flowi4) % sizeof(flow_compare_t));
202                 return sizeof(struct flowi4) / sizeof(flow_compare_t);
203         case AF_INET6:
204                 BUILD_BUG_ON(sizeof(struct flowi6) % sizeof(flow_compare_t));
205                 return sizeof(struct flowi6) / sizeof(flow_compare_t);
206         case AF_DECnet:
207                 BUILD_BUG_ON(sizeof(struct flowidn) % sizeof(flow_compare_t));
208                 return sizeof(struct flowidn) / sizeof(flow_compare_t);
209         }
210         return 0;
211 }
212
213 #define FLOW_DIR_IN     0
214 #define FLOW_DIR_OUT    1
215 #define FLOW_DIR_FWD    2
216
217 struct net;
218 struct sock;
219 struct flow_cache_ops;
220
221 struct flow_cache_object {
222         const struct flow_cache_ops *ops;
223 };
224
225 struct flow_cache_ops {
226         struct flow_cache_object *(*get)(struct flow_cache_object *);
227         int (*check)(struct flow_cache_object *);
228         void (*delete)(struct flow_cache_object *);
229 };
230
231 typedef struct flow_cache_object *(*flow_resolve_t)(
232                 struct net *net, const struct flowi *key, u16 family,
233                 u8 dir, struct flow_cache_object *oldobj, void *ctx);
234
235 struct flow_cache_object *flow_cache_lookup(struct net *net,
236                                             const struct flowi *key, u16 family,
237                                             u8 dir, flow_resolve_t resolver,
238                                             void *ctx);
239 int flow_cache_init(struct net *net);
240 void flow_cache_fini(struct net *net);
241
242 void flow_cache_flush(struct net *net);
243 void flow_cache_flush_deferred(struct net *net);
244 extern atomic_t flow_cache_genid;
245
246 #endif