Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[pandora-kernel.git] / include / net / dst.h
index e9ff4a4..002500e 100644 (file)
@@ -50,14 +50,12 @@ struct dst_entry
        unsigned long           expires;
 
        unsigned short          header_len;     /* more space at head required */
-       unsigned short          nfheader_len;   /* more non-fragment space at head required */
        unsigned short          trailer_len;    /* space to reserve at tail */
 
-       u32                     metrics[RTAX_MAX];
-       struct dst_entry        *path;
-
+       unsigned int            rate_tokens;
        unsigned long           rate_last;      /* rate limiting for ICMP */
-       unsigned long           rate_tokens;
+
+       struct dst_entry        *path;
 
        struct neighbour        *neighbour;
        struct hh_cache         *hh;
@@ -66,22 +64,27 @@ struct dst_entry
        int                     (*input)(struct sk_buff*);
        int                     (*output)(struct sk_buff*);
 
+       struct  dst_ops         *ops;
+
+       u32                     metrics[RTAX_MAX];
+
 #ifdef CONFIG_NET_CLS_ROUTE
        __u32                   tclassid;
 #endif
 
-       struct  dst_ops         *ops;
-               
-       unsigned long           lastuse;
+       /*
+        * __refcnt wants to be on a different cache line from
+        * input/output/ops or performance tanks badly
+        */
        atomic_t                __refcnt;       /* client references    */
        int                     __use;
+       unsigned long           lastuse;
        union {
                struct dst_entry *next;
                struct rtable    *rt_next;
                struct rt6_info   *rt6_next;
                struct dn_route  *dn_next;
        };
-       char                    info[0];
 };
 
 
@@ -91,7 +94,7 @@ struct dst_ops
        __be16                  protocol;
        unsigned                gc_thresh;
 
-       int                     (*gc)(void);
+       int                     (*gc)(struct dst_ops *ops);
        struct dst_entry *      (*check)(struct dst_entry *, __u32 cookie);
        void                    (*destroy)(struct dst_entry *);
        void                    (*ifdown)(struct dst_entry *,
@@ -99,10 +102,12 @@ struct dst_ops
        struct dst_entry *      (*negative_advice)(struct dst_entry *);
        void                    (*link_failure)(struct sk_buff *);
        void                    (*update_pmtu)(struct dst_entry *dst, u32 mtu);
+       int                     (*local_out)(struct sk_buff *skb);
        int                     entry_size;
 
        atomic_t                entries;
        struct kmem_cache               *kmem_cachep;
+       struct net              *dst_net;
 };
 
 #ifdef __KERNEL__
@@ -143,6 +148,13 @@ static inline void dst_hold(struct dst_entry * dst)
        atomic_inc(&dst->__refcnt);
 }
 
+static inline void dst_use(struct dst_entry *dst, unsigned long time)
+{
+       dst_hold(dst);
+       dst->__use++;
+       dst->lastuse = time;
+}
+
 static inline
 struct dst_entry * dst_clone(struct dst_entry * dst)
 {
@@ -151,15 +163,7 @@ struct dst_entry * dst_clone(struct dst_entry * dst)
        return dst;
 }
 
-static inline
-void dst_release(struct dst_entry * dst)
-{
-       if (dst) {
-               WARN_ON(atomic_read(&dst->__refcnt) < 1);
-               smp_mb__before_atomic_dec();
-               atomic_dec(&dst->__refcnt);
-       }
-}
+extern void dst_release(struct dst_entry *dst);
 
 /* Children define the path of the packet through the
  * Linux networking.  Thus, destinations are stackable.
@@ -173,6 +177,7 @@ static inline struct dst_entry *dst_pop(struct dst_entry *dst)
        return child;
 }
 
+extern int dst_discard(struct sk_buff *skb);
 extern void * dst_alloc(struct dst_ops * ops);
 extern void __dst_free(struct dst_entry * dst);
 extern struct dst_entry *dst_destroy(struct dst_entry * dst);
@@ -257,6 +262,12 @@ static inline struct dst_entry *dst_check(struct dst_entry *dst, u32 cookie)
 
 extern void            dst_init(void);
 
+/* Flags for xfrm_lookup flags argument. */
+enum {
+       XFRM_LOOKUP_WAIT = 1 << 0,
+       XFRM_LOOKUP_ICMP = 1 << 1,
+};
+
 struct flowi;
 #ifndef CONFIG_XFRM
 static inline int xfrm_lookup(struct dst_entry **dst_p, struct flowi *fl,