[NET]: Reduce sizeof(struct flowi) by 20 bytes.
[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 {
14         int     oif;
15         int     iif;
16
17         union {
18                 struct {
19                         __be32                  daddr;
20                         __be32                  saddr;
21                         __u32                   fwmark;
22                         __u8                    tos;
23                         __u8                    scope;
24                 } ip4_u;
25                 
26                 struct {
27                         struct in6_addr         daddr;
28                         struct in6_addr         saddr;
29                         __u32                   fwmark;
30                         __u32                   flowlabel;
31                 } ip6_u;
32
33                 struct {
34                         __le16                  daddr;
35                         __le16                  saddr;
36                         __u32                   fwmark;
37                         __u8                    scope;
38                 } dn_u;
39         } nl_u;
40 #define fld_dst         nl_u.dn_u.daddr
41 #define fld_src         nl_u.dn_u.saddr
42 #define fld_fwmark      nl_u.dn_u.fwmark
43 #define fld_scope       nl_u.dn_u.scope
44 #define fl6_dst         nl_u.ip6_u.daddr
45 #define fl6_src         nl_u.ip6_u.saddr
46 #define fl6_fwmark      nl_u.ip6_u.fwmark
47 #define fl6_flowlabel   nl_u.ip6_u.flowlabel
48 #define fl4_dst         nl_u.ip4_u.daddr
49 #define fl4_src         nl_u.ip4_u.saddr
50 #define fl4_fwmark      nl_u.ip4_u.fwmark
51 #define fl4_tos         nl_u.ip4_u.tos
52 #define fl4_scope       nl_u.ip4_u.scope
53
54         __u8    proto;
55         __u8    flags;
56 #define FLOWI_FLAG_MULTIPATHOLDROUTE 0x01
57         union {
58                 struct {
59                         __be16  sport;
60                         __be16  dport;
61                 } ports;
62
63                 struct {
64                         __u8    type;
65                         __u8    code;
66                 } icmpt;
67
68                 struct {
69                         __le16  sport;
70                         __le16  dport;
71                 } dnports;
72
73                 __be32          spi;
74
75 #ifdef CONFIG_IPV6_MIP6
76                 struct {
77                         __u8    type;
78                 } mht;
79 #endif
80         } uli_u;
81 #define fl_ip_sport     uli_u.ports.sport
82 #define fl_ip_dport     uli_u.ports.dport
83 #define fl_icmp_type    uli_u.icmpt.type
84 #define fl_icmp_code    uli_u.icmpt.code
85 #define fl_ipsec_spi    uli_u.spi
86 #ifdef CONFIG_IPV6_MIP6
87 #define fl_mh_type      uli_u.mht.type
88 #endif
89         __u32           secid;  /* used by xfrm; see secid.txt */
90 } __attribute__((__aligned__(BITS_PER_LONG/8)));
91
92 #define FLOW_DIR_IN     0
93 #define FLOW_DIR_OUT    1
94 #define FLOW_DIR_FWD    2
95
96 struct sock;
97 typedef int (*flow_resolve_t)(struct flowi *key, u16 family, u8 dir,
98                                void **objp, atomic_t **obj_refp);
99
100 extern void *flow_cache_lookup(struct flowi *key, u16 family, u8 dir,
101                                flow_resolve_t resolver);
102 extern void flow_cache_flush(void);
103 extern atomic_t flow_cache_genid;
104
105 #endif