memcg: fix race in file_mapped accounting
[safe/jmp/linux-2.6] / include / net / if_inet6.h
1 /*
2  *      inet6 interface/address list definitions
3  *      Linux INET6 implementation 
4  *
5  *      Authors:
6  *      Pedro Roque             <roque@di.fc.ul.pt>     
7  *
8  *
9  *      This program is free software; you can redistribute it and/or
10  *      modify it under the terms of the GNU General Public License
11  *      as published by the Free Software Foundation; either version
12  *      2 of the License, or (at your option) any later version.
13  */
14
15 #ifndef _NET_IF_INET6_H
16 #define _NET_IF_INET6_H
17
18 #include <net/snmp.h>
19 #include <linux/ipv6.h>
20
21 /* inet6_dev.if_flags */
22
23 #define IF_RA_OTHERCONF 0x80
24 #define IF_RA_MANAGED   0x40
25 #define IF_RA_RCVD      0x20
26 #define IF_RS_SENT      0x10
27 #define IF_READY        0x80000000
28
29 /* prefix flags */
30 #define IF_PREFIX_ONLINK        0x01
31 #define IF_PREFIX_AUTOCONF      0x02
32
33 #ifdef __KERNEL__
34
35 struct inet6_ifaddr {
36         struct in6_addr         addr;
37         __u32                   prefix_len;
38         
39         __u32                   valid_lft;
40         __u32                   prefered_lft;
41         atomic_t                refcnt;
42         spinlock_t              lock;
43
44         __u8                    probes;
45         __u8                    flags;
46
47         __u16                   scope;
48
49         unsigned long           cstamp; /* created timestamp */
50         unsigned long           tstamp; /* updated timestamp */
51
52         struct timer_list       timer;
53
54         struct inet6_dev        *idev;
55         struct rt6_info         *rt;
56
57         struct inet6_ifaddr     *lst_next;      /* next addr in addr_lst */
58         struct inet6_ifaddr     *if_next;       /* next addr in inet6_dev */
59
60 #ifdef CONFIG_IPV6_PRIVACY
61         struct inet6_ifaddr     *tmp_next;      /* next addr in tempaddr_lst */
62         struct inet6_ifaddr     *ifpub;
63         int                     regen_count;
64 #endif
65
66         int                     dead;
67 };
68
69 struct ip6_sf_socklist {
70         unsigned int            sl_max;
71         unsigned int            sl_count;
72         struct in6_addr         sl_addr[0];
73 };
74
75 #define IP6_SFLSIZE(count)      (sizeof(struct ip6_sf_socklist) + \
76         (count) * sizeof(struct in6_addr))
77
78 #define IP6_SFBLOCK     10      /* allocate this many at once */
79
80 struct ipv6_mc_socklist {
81         struct in6_addr         addr;
82         int                     ifindex;
83         struct ipv6_mc_socklist *next;
84         rwlock_t                sflock;
85         unsigned int            sfmode;         /* MCAST_{INCLUDE,EXCLUDE} */
86         struct ip6_sf_socklist  *sflist;
87 };
88
89 struct ip6_sf_list {
90         struct ip6_sf_list      *sf_next;
91         struct in6_addr         sf_addr;
92         unsigned long           sf_count[2];    /* include/exclude counts */
93         unsigned char           sf_gsresp;      /* include in g & s response? */
94         unsigned char           sf_oldin;       /* change state */
95         unsigned char           sf_crcount;     /* retrans. left to send */
96 };
97
98 #define MAF_TIMER_RUNNING       0x01
99 #define MAF_LAST_REPORTER       0x02
100 #define MAF_LOADED              0x04
101 #define MAF_NOREPORT            0x08
102 #define MAF_GSQUERY             0x10
103
104 struct ifmcaddr6 {
105         struct in6_addr         mca_addr;
106         struct inet6_dev        *idev;
107         struct ifmcaddr6        *next;
108         struct ip6_sf_list      *mca_sources;
109         struct ip6_sf_list      *mca_tomb;
110         unsigned int            mca_sfmode;
111         unsigned char           mca_crcount;
112         unsigned long           mca_sfcount[2];
113         struct timer_list       mca_timer;
114         unsigned                mca_flags;
115         int                     mca_users;
116         atomic_t                mca_refcnt;
117         spinlock_t              mca_lock;
118         unsigned long           mca_cstamp;
119         unsigned long           mca_tstamp;
120 };
121
122 /* Anycast stuff */
123
124 struct ipv6_ac_socklist {
125         struct in6_addr         acl_addr;
126         int                     acl_ifindex;
127         struct ipv6_ac_socklist *acl_next;
128 };
129
130 struct ifacaddr6 {
131         struct in6_addr         aca_addr;
132         struct inet6_dev        *aca_idev;
133         struct rt6_info         *aca_rt;
134         struct ifacaddr6        *aca_next;
135         int                     aca_users;
136         atomic_t                aca_refcnt;
137         spinlock_t              aca_lock;
138         unsigned long           aca_cstamp;
139         unsigned long           aca_tstamp;
140 };
141
142 #define IFA_HOST        IPV6_ADDR_LOOPBACK
143 #define IFA_LINK        IPV6_ADDR_LINKLOCAL
144 #define IFA_SITE        IPV6_ADDR_SITELOCAL
145
146 struct ipv6_devstat {
147         struct proc_dir_entry   *proc_dir_entry;
148         DEFINE_SNMP_STAT(struct ipstats_mib, ipv6);
149         DEFINE_SNMP_STAT(struct icmpv6_mib, icmpv6);
150         DEFINE_SNMP_STAT(struct icmpv6msg_mib, icmpv6msg);
151 };
152
153 struct inet6_dev {
154         struct net_device               *dev;
155
156         struct inet6_ifaddr     *addr_list;
157
158         struct ifmcaddr6        *mc_list;
159         struct ifmcaddr6        *mc_tomb;
160         spinlock_t              mc_lock;
161         unsigned char           mc_qrv;
162         unsigned char           mc_gq_running;
163         unsigned char           mc_ifc_count;
164         unsigned long           mc_v1_seen;
165         unsigned long           mc_maxdelay;
166         struct timer_list       mc_gq_timer;    /* general query timer */
167         struct timer_list       mc_ifc_timer;   /* interface change timer */
168
169         struct ifacaddr6        *ac_list;
170         rwlock_t                lock;
171         atomic_t                refcnt;
172         __u32                   if_flags;
173         int                     dead;
174
175 #ifdef CONFIG_IPV6_PRIVACY
176         u8                      rndid[8];
177         struct timer_list       regen_timer;
178         struct inet6_ifaddr     *tempaddr_list;
179 #endif
180
181         struct neigh_parms      *nd_parms;
182         struct inet6_dev        *next;
183         struct ipv6_devconf     cnf;
184         struct ipv6_devstat     stats;
185         unsigned long           tstamp; /* ipv6InterfaceTable update timestamp */
186         struct rcu_head         rcu;
187 };
188
189 static inline void ipv6_eth_mc_map(struct in6_addr *addr, char *buf)
190 {
191         /*
192          *      +-------+-------+-------+-------+-------+-------+
193          *      |   33  |   33  | DST13 | DST14 | DST15 | DST16 |
194          *      +-------+-------+-------+-------+-------+-------+
195          */
196
197         buf[0]= 0x33;
198         buf[1]= 0x33;
199
200         memcpy(buf + 2, &addr->s6_addr32[3], sizeof(__u32));
201 }
202
203 static inline void ipv6_tr_mc_map(struct in6_addr *addr, char *buf)
204 {
205         /* All nodes FF01::1, FF02::1, FF02::1:FFxx:xxxx */
206
207         if (((addr->s6_addr[0] == 0xFF) &&
208             ((addr->s6_addr[1] == 0x01) || (addr->s6_addr[1] == 0x02)) &&
209              (addr->s6_addr16[1] == 0) &&
210              (addr->s6_addr32[1] == 0) &&
211              (addr->s6_addr32[2] == 0) &&
212              (addr->s6_addr16[6] == 0) &&
213              (addr->s6_addr[15] == 1)) ||
214             ((addr->s6_addr[0] == 0xFF) &&
215              (addr->s6_addr[1] == 0x02) &&
216              (addr->s6_addr16[1] == 0) &&
217              (addr->s6_addr32[1] == 0) &&
218              (addr->s6_addr16[4] == 0) &&
219              (addr->s6_addr[10] == 0) &&
220              (addr->s6_addr[11] == 1) &&
221              (addr->s6_addr[12] == 0xff)))
222         {
223                 buf[0]=0xC0;
224                 buf[1]=0x00;
225                 buf[2]=0x01;
226                 buf[3]=0x00;
227                 buf[4]=0x00;
228                 buf[5]=0x00;
229         /* All routers FF0x::2 */
230         } else if ((addr->s6_addr[0] ==0xff) &&
231                 ((addr->s6_addr[1] & 0xF0) == 0) &&
232                 (addr->s6_addr16[1] == 0) &&
233                 (addr->s6_addr32[1] == 0) &&
234                 (addr->s6_addr32[2] == 0) &&
235                 (addr->s6_addr16[6] == 0) &&
236                 (addr->s6_addr[15] == 2))
237         {
238                 buf[0]=0xC0;
239                 buf[1]=0x00;
240                 buf[2]=0x02;
241                 buf[3]=0x00;
242                 buf[4]=0x00;
243                 buf[5]=0x00;
244         } else {
245                 unsigned char i ; 
246                 
247                 i = addr->s6_addr[15] & 7 ; 
248                 buf[0]=0xC0;
249                 buf[1]=0x00;
250                 buf[2]=0x00;
251                 buf[3]=0x01 << i ; 
252                 buf[4]=0x00;
253                 buf[5]=0x00;
254         }
255 }
256
257 static inline void ipv6_arcnet_mc_map(const struct in6_addr *addr, char *buf)
258 {
259         buf[0] = 0x00;
260 }
261
262 static inline void ipv6_ib_mc_map(const struct in6_addr *addr,
263                                   const unsigned char *broadcast, char *buf)
264 {
265         unsigned char scope = broadcast[5] & 0xF;
266
267         buf[0]  = 0;            /* Reserved */
268         buf[1]  = 0xff;         /* Multicast QPN */
269         buf[2]  = 0xff;
270         buf[3]  = 0xff;
271         buf[4]  = 0xff;
272         buf[5]  = 0x10 | scope; /* scope from broadcast address */
273         buf[6]  = 0x60;         /* IPv6 signature */
274         buf[7]  = 0x1b;
275         buf[8]  = broadcast[8]; /* P_Key */
276         buf[9]  = broadcast[9];
277         memcpy(buf + 10, addr->s6_addr + 6, 10);
278 }
279 #endif
280 #endif