net: Put flowi_* prefix on AF independent members of struct flowi
[linux-3.10.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/in6.h>
11 #include <asm/atomic.h>
12
13 struct flowi {
14         int     flowi_oif;
15         int     flowi_iif;
16         __u32   flowi_mark;
17         __u8    flowi_tos;
18         __u8    flowi_scope;
19         __u8    flowi_proto;
20         __u8    flowi_flags;
21 #define FLOWI_FLAG_ANYSRC               0x01
22 #define FLOWI_FLAG_PRECOW_METRICS       0x02
23 #define FLOWI_FLAG_CAN_SLEEP            0x04
24         __u32   flowi_secid;
25
26         union {
27                 struct {
28                         __be32                  daddr;
29                         __be32                  saddr;
30                 } ip4_u;
31                 
32                 struct {
33                         struct in6_addr         daddr;
34                         struct in6_addr         saddr;
35                         __be32                  flowlabel;
36                 } ip6_u;
37
38                 struct {
39                         __le16                  daddr;
40                         __le16                  saddr;
41                         __u8                    scope;
42                 } dn_u;
43         } nl_u;
44 #define fld_dst         nl_u.dn_u.daddr
45 #define fld_src         nl_u.dn_u.saddr
46 #define fld_scope       nl_u.dn_u.scope
47 #define fl6_dst         nl_u.ip6_u.daddr
48 #define fl6_src         nl_u.ip6_u.saddr
49 #define fl6_flowlabel   nl_u.ip6_u.flowlabel
50 #define fl4_dst         nl_u.ip4_u.daddr
51 #define fl4_src         nl_u.ip4_u.saddr
52 #define fl4_tos         flowi_tos
53 #define fl4_scope       flowi_scope
54
55         union {
56                 struct {
57                         __be16  sport;
58                         __be16  dport;
59                 } ports;
60
61                 struct {
62                         __u8    type;
63                         __u8    code;
64                 } icmpt;
65
66                 struct {
67                         __le16  sport;
68                         __le16  dport;
69                 } dnports;
70
71                 __be32          spi;
72                 __be32          gre_key;
73
74                 struct {
75                         __u8    type;
76                 } mht;
77         } uli_u;
78 #define fl_ip_sport     uli_u.ports.sport
79 #define fl_ip_dport     uli_u.ports.dport
80 #define fl_icmp_type    uli_u.icmpt.type
81 #define fl_icmp_code    uli_u.icmpt.code
82 #define fl_ipsec_spi    uli_u.spi
83 #define fl_mh_type      uli_u.mht.type
84 #define fl_gre_key      uli_u.gre_key
85 } __attribute__((__aligned__(BITS_PER_LONG/8)));
86
87 #define FLOW_DIR_IN     0
88 #define FLOW_DIR_OUT    1
89 #define FLOW_DIR_FWD    2
90
91 struct net;
92 struct sock;
93 struct flow_cache_ops;
94
95 struct flow_cache_object {
96         const struct flow_cache_ops *ops;
97 };
98
99 struct flow_cache_ops {
100         struct flow_cache_object *(*get)(struct flow_cache_object *);
101         int (*check)(struct flow_cache_object *);
102         void (*delete)(struct flow_cache_object *);
103 };
104
105 typedef struct flow_cache_object *(*flow_resolve_t)(
106                 struct net *net, const struct flowi *key, u16 family,
107                 u8 dir, struct flow_cache_object *oldobj, void *ctx);
108
109 extern struct flow_cache_object *flow_cache_lookup(
110                 struct net *net, const struct flowi *key, u16 family,
111                 u8 dir, flow_resolve_t resolver, void *ctx);
112
113 extern void flow_cache_flush(void);
114 extern atomic_t flow_cache_genid;
115
116 static inline int flow_cache_uli_match(const struct flowi *fl1,
117                                        const struct flowi *fl2)
118 {
119         return (fl1->flowi_proto == fl2->flowi_proto &&
120                 !memcmp(&fl1->uli_u, &fl2->uli_u, sizeof(fl1->uli_u)));
121 }
122
123 #endif