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