bonding: process the err returned by dev_set_allmulti properly in bond_enslave
[pandora-kernel.git] / include / net / dst.h
1 /*
2  * net/dst.h    Protocol independent destination cache definitions.
3  *
4  * Authors:     Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
5  *
6  */
7
8 #ifndef _NET_DST_H
9 #define _NET_DST_H
10
11 #include <net/dst_ops.h>
12 #include <linux/netdevice.h>
13 #include <linux/rtnetlink.h>
14 #include <linux/rcupdate.h>
15 #include <linux/jiffies.h>
16 #include <net/neighbour.h>
17 #include <asm/processor.h>
18
19 #define DST_GC_MIN      (HZ/10)
20 #define DST_GC_INC      (HZ/2)
21 #define DST_GC_MAX      (120*HZ)
22
23 /* Each dst_entry has reference count and sits in some parent list(s).
24  * When it is removed from parent list, it is "freed" (dst_free).
25  * After this it enters dead state (dst->obsolete > 0) and if its refcnt
26  * is zero, it can be destroyed immediately, otherwise it is added
27  * to gc list and garbage collector periodically checks the refcnt.
28  */
29
30 struct sk_buff;
31
32 struct dst_entry {
33         struct rcu_head         rcu_head;
34         struct dst_entry        *child;
35         struct net_device       *dev;
36         struct  dst_ops         *ops;
37         unsigned long           _metrics;
38         unsigned long           expires;
39         struct dst_entry        *path;
40         struct neighbour __rcu  *_neighbour;
41 #ifdef CONFIG_XFRM
42         struct xfrm_state       *xfrm;
43 #else
44         void                    *__pad1;
45 #endif
46         int                     (*input)(struct sk_buff*);
47         int                     (*output)(struct sk_buff*);
48
49         int                     flags;
50 #define DST_HOST                0x0001
51 #define DST_NOXFRM              0x0002
52 #define DST_NOPOLICY            0x0004
53 #define DST_NOHASH              0x0008
54 #define DST_NOCACHE             0x0010
55 #define DST_NOCOUNT             0x0020
56 #define DST_NOPEER              0x0040
57 #define DST_FAKE_RTABLE         0x0080
58 #define DST_XFRM_TUNNEL         0x0100
59
60         short                   error;
61         short                   obsolete;
62         unsigned short          header_len;     /* more space at head required */
63         unsigned short          trailer_len;    /* space to reserve at tail */
64 #ifdef CONFIG_IP_ROUTE_CLASSID
65         __u32                   tclassid;
66 #else
67         __u32                   __pad2;
68 #endif
69
70         /*
71          * Align __refcnt to a 64 bytes alignment
72          * (L1_CACHE_SIZE would be too much)
73          */
74 #ifdef CONFIG_64BIT
75         long                    __pad_to_align_refcnt[2];
76 #endif
77         /*
78          * __refcnt wants to be on a different cache line from
79          * input/output/ops or performance tanks badly
80          */
81         atomic_t                __refcnt;       /* client references    */
82         int                     __use;
83         unsigned long           lastuse;
84         union {
85                 struct dst_entry        *next;
86                 struct rtable __rcu     *rt_next;
87                 struct rt6_info         *rt6_next;
88                 struct dn_route __rcu   *dn_next;
89         };
90 };
91
92 static inline struct neighbour *dst_get_neighbour(struct dst_entry *dst)
93 {
94         return rcu_dereference(dst->_neighbour);
95 }
96
97 static inline struct neighbour *dst_get_neighbour_raw(struct dst_entry *dst)
98 {
99         return rcu_dereference_raw(dst->_neighbour);
100 }
101
102 static inline void dst_set_neighbour(struct dst_entry *dst, struct neighbour *neigh)
103 {
104         rcu_assign_pointer(dst->_neighbour, neigh);
105 }
106
107 extern u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old);
108 extern const u32 dst_default_metrics[RTAX_MAX];
109
110 #define DST_METRICS_READ_ONLY   0x1UL
111 #define __DST_METRICS_PTR(Y)    \
112         ((u32 *)((Y) & ~DST_METRICS_READ_ONLY))
113 #define DST_METRICS_PTR(X)      __DST_METRICS_PTR((X)->_metrics)
114
115 static inline bool dst_metrics_read_only(const struct dst_entry *dst)
116 {
117         return dst->_metrics & DST_METRICS_READ_ONLY;
118 }
119
120 extern void __dst_destroy_metrics_generic(struct dst_entry *dst, unsigned long old);
121
122 static inline void dst_destroy_metrics_generic(struct dst_entry *dst)
123 {
124         unsigned long val = dst->_metrics;
125         if (!(val & DST_METRICS_READ_ONLY))
126                 __dst_destroy_metrics_generic(dst, val);
127 }
128
129 static inline u32 *dst_metrics_write_ptr(struct dst_entry *dst)
130 {
131         unsigned long p = dst->_metrics;
132
133         BUG_ON(!p);
134
135         if (p & DST_METRICS_READ_ONLY)
136                 return dst->ops->cow_metrics(dst, p);
137         return __DST_METRICS_PTR(p);
138 }
139
140 /* This may only be invoked before the entry has reached global
141  * visibility.
142  */
143 static inline void dst_init_metrics(struct dst_entry *dst,
144                                     const u32 *src_metrics,
145                                     bool read_only)
146 {
147         dst->_metrics = ((unsigned long) src_metrics) |
148                 (read_only ? DST_METRICS_READ_ONLY : 0);
149 }
150
151 static inline void dst_copy_metrics(struct dst_entry *dest, const struct dst_entry *src)
152 {
153         u32 *dst_metrics = dst_metrics_write_ptr(dest);
154
155         if (dst_metrics) {
156                 u32 *src_metrics = DST_METRICS_PTR(src);
157
158                 memcpy(dst_metrics, src_metrics, RTAX_MAX * sizeof(u32));
159         }
160 }
161
162 static inline u32 *dst_metrics_ptr(struct dst_entry *dst)
163 {
164         return DST_METRICS_PTR(dst);
165 }
166
167 static inline u32
168 dst_metric_raw(const struct dst_entry *dst, const int metric)
169 {
170         u32 *p = DST_METRICS_PTR(dst);
171
172         return p[metric-1];
173 }
174
175 static inline u32
176 dst_metric(const struct dst_entry *dst, const int metric)
177 {
178         WARN_ON_ONCE(metric == RTAX_HOPLIMIT ||
179                      metric == RTAX_ADVMSS ||
180                      metric == RTAX_MTU);
181         return dst_metric_raw(dst, metric);
182 }
183
184 static inline u32
185 dst_metric_advmss(const struct dst_entry *dst)
186 {
187         u32 advmss = dst_metric_raw(dst, RTAX_ADVMSS);
188
189         if (!advmss)
190                 advmss = dst->ops->default_advmss(dst);
191
192         return advmss;
193 }
194
195 static inline void dst_metric_set(struct dst_entry *dst, int metric, u32 val)
196 {
197         u32 *p = dst_metrics_write_ptr(dst);
198
199         if (p)
200                 p[metric-1] = val;
201 }
202
203 static inline u32
204 dst_feature(const struct dst_entry *dst, u32 feature)
205 {
206         return dst_metric(dst, RTAX_FEATURES) & feature;
207 }
208
209 static inline u32 dst_mtu(const struct dst_entry *dst)
210 {
211         return dst->ops->mtu(dst);
212 }
213
214 /* RTT metrics are stored in milliseconds for user ABI, but used as jiffies */
215 static inline unsigned long dst_metric_rtt(const struct dst_entry *dst, int metric)
216 {
217         return msecs_to_jiffies(dst_metric(dst, metric));
218 }
219
220 static inline void set_dst_metric_rtt(struct dst_entry *dst, int metric,
221                                       unsigned long rtt)
222 {
223         dst_metric_set(dst, metric, jiffies_to_msecs(rtt));
224 }
225
226 static inline u32
227 dst_allfrag(const struct dst_entry *dst)
228 {
229         int ret = dst_feature(dst,  RTAX_FEATURE_ALLFRAG);
230         return ret;
231 }
232
233 static inline int
234 dst_metric_locked(const struct dst_entry *dst, int metric)
235 {
236         return dst_metric(dst, RTAX_LOCK) & (1<<metric);
237 }
238
239 static inline void dst_hold(struct dst_entry * dst)
240 {
241         /*
242          * If your kernel compilation stops here, please check
243          * __pad_to_align_refcnt declaration in struct dst_entry
244          */
245         BUILD_BUG_ON(offsetof(struct dst_entry, __refcnt) & 63);
246         atomic_inc(&dst->__refcnt);
247 }
248
249 static inline void dst_use(struct dst_entry *dst, unsigned long time)
250 {
251         dst_hold(dst);
252         dst->__use++;
253         dst->lastuse = time;
254 }
255
256 static inline void dst_use_noref(struct dst_entry *dst, unsigned long time)
257 {
258         dst->__use++;
259         dst->lastuse = time;
260 }
261
262 static inline
263 struct dst_entry * dst_clone(struct dst_entry * dst)
264 {
265         if (dst)
266                 atomic_inc(&dst->__refcnt);
267         return dst;
268 }
269
270 extern void dst_release(struct dst_entry *dst);
271
272 static inline void refdst_drop(unsigned long refdst)
273 {
274         if (!(refdst & SKB_DST_NOREF))
275                 dst_release((struct dst_entry *)(refdst & SKB_DST_PTRMASK));
276 }
277
278 /**
279  * skb_dst_drop - drops skb dst
280  * @skb: buffer
281  *
282  * Drops dst reference count if a reference was taken.
283  */
284 static inline void skb_dst_drop(struct sk_buff *skb)
285 {
286         if (skb->_skb_refdst) {
287                 refdst_drop(skb->_skb_refdst);
288                 skb->_skb_refdst = 0UL;
289         }
290 }
291
292 static inline void skb_dst_copy(struct sk_buff *nskb, const struct sk_buff *oskb)
293 {
294         nskb->_skb_refdst = oskb->_skb_refdst;
295         if (!(nskb->_skb_refdst & SKB_DST_NOREF))
296                 dst_clone(skb_dst(nskb));
297 }
298
299 /**
300  * skb_dst_force - makes sure skb dst is refcounted
301  * @skb: buffer
302  *
303  * If dst is not yet refcounted, let's do it
304  */
305 static inline void skb_dst_force(struct sk_buff *skb)
306 {
307         if (skb_dst_is_noref(skb)) {
308                 WARN_ON(!rcu_read_lock_held());
309                 skb->_skb_refdst &= ~SKB_DST_NOREF;
310                 dst_clone(skb_dst(skb));
311         }
312 }
313
314
315 /**
316  *      __skb_tunnel_rx - prepare skb for rx reinsert
317  *      @skb: buffer
318  *      @dev: tunnel device
319  *
320  *      After decapsulation, packet is going to re-enter (netif_rx()) our stack,
321  *      so make some cleanups. (no accounting done)
322  */
323 static inline void __skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev)
324 {
325         skb->dev = dev;
326
327         /*
328          * Clear rxhash so that we can recalulate the hash for the
329          * encapsulated packet, unless we have already determine the hash
330          * over the L4 4-tuple.
331          */
332         if (!skb->l4_rxhash)
333                 skb->rxhash = 0;
334         skb_set_queue_mapping(skb, 0);
335         skb_dst_drop(skb);
336         nf_reset(skb);
337 }
338
339 /**
340  *      skb_tunnel_rx - prepare skb for rx reinsert
341  *      @skb: buffer
342  *      @dev: tunnel device
343  *
344  *      After decapsulation, packet is going to re-enter (netif_rx()) our stack,
345  *      so make some cleanups, and perform accounting.
346  *      Note: this accounting is not SMP safe.
347  */
348 static inline void skb_tunnel_rx(struct sk_buff *skb, struct net_device *dev)
349 {
350         /* TODO : stats should be SMP safe */
351         dev->stats.rx_packets++;
352         dev->stats.rx_bytes += skb->len;
353         __skb_tunnel_rx(skb, dev);
354 }
355
356 /* Children define the path of the packet through the
357  * Linux networking.  Thus, destinations are stackable.
358  */
359
360 static inline struct dst_entry *skb_dst_pop(struct sk_buff *skb)
361 {
362         struct dst_entry *child = dst_clone(skb_dst(skb)->child);
363
364         skb_dst_drop(skb);
365         return child;
366 }
367
368 extern int dst_discard(struct sk_buff *skb);
369 extern void *dst_alloc(struct dst_ops * ops, struct net_device *dev,
370                        int initial_ref, int initial_obsolete, int flags);
371 extern void __dst_free(struct dst_entry * dst);
372 extern struct dst_entry *dst_destroy(struct dst_entry * dst);
373
374 static inline void dst_free(struct dst_entry * dst)
375 {
376         if (dst->obsolete > 1)
377                 return;
378         if (!atomic_read(&dst->__refcnt)) {
379                 dst = dst_destroy(dst);
380                 if (!dst)
381                         return;
382         }
383         __dst_free(dst);
384 }
385
386 static inline void dst_rcu_free(struct rcu_head *head)
387 {
388         struct dst_entry *dst = container_of(head, struct dst_entry, rcu_head);
389         dst_free(dst);
390 }
391
392 static inline void dst_confirm(struct dst_entry *dst)
393 {
394         if (dst) {
395                 struct neighbour *n;
396
397                 rcu_read_lock();
398                 n = dst_get_neighbour(dst);
399                 neigh_confirm(n);
400                 rcu_read_unlock();
401         }
402 }
403
404 static inline struct neighbour *dst_neigh_lookup(const struct dst_entry *dst, const void *daddr)
405 {
406         return dst->ops->neigh_lookup(dst, daddr);
407 }
408
409 static inline void dst_link_failure(struct sk_buff *skb)
410 {
411         struct dst_entry *dst = skb_dst(skb);
412         if (dst && dst->ops && dst->ops->link_failure)
413                 dst->ops->link_failure(skb);
414 }
415
416 static inline void dst_set_expires(struct dst_entry *dst, int timeout)
417 {
418         unsigned long expires = jiffies + timeout;
419
420         if (expires == 0)
421                 expires = 1;
422
423         if (dst->expires == 0 || time_before(expires, dst->expires))
424                 dst->expires = expires;
425 }
426
427 /* Output packet to network from transport.  */
428 static inline int dst_output(struct sk_buff *skb)
429 {
430         return skb_dst(skb)->output(skb);
431 }
432
433 /* Input packet from network to transport.  */
434 static inline int dst_input(struct sk_buff *skb)
435 {
436         return skb_dst(skb)->input(skb);
437 }
438
439 static inline struct dst_entry *dst_check(struct dst_entry *dst, u32 cookie)
440 {
441         if (dst->obsolete)
442                 dst = dst->ops->check(dst, cookie);
443         return dst;
444 }
445
446 extern void             dst_init(void);
447
448 /* Flags for xfrm_lookup flags argument. */
449 enum {
450         XFRM_LOOKUP_ICMP = 1 << 0,
451 };
452
453 struct flowi;
454 #ifndef CONFIG_XFRM
455 static inline struct dst_entry *xfrm_lookup(struct net *net,
456                                             struct dst_entry *dst_orig,
457                                             const struct flowi *fl, struct sock *sk,
458                                             int flags)
459 {
460         return dst_orig;
461
462
463 static inline struct xfrm_state *dst_xfrm(const struct dst_entry *dst)
464 {
465         return NULL;
466 }
467
468 #else
469 extern struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig,
470                                      const struct flowi *fl, struct sock *sk,
471                                      int flags);
472
473 /* skb attached with this dst needs transformation if dst->xfrm is valid */
474 static inline struct xfrm_state *dst_xfrm(const struct dst_entry *dst)
475 {
476         return dst->xfrm;
477 }
478 #endif
479
480 #endif /* _NET_DST_H */