linux-old/include/net/dst.h
<<
>>
Prefs
   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 <linux/config.h>
  12#include <net/neighbour.h>
  13
  14/*
  15 * 0 - no debugging messages
  16 * 1 - rare events and bugs (default)
  17 * 2 - trace mode.
  18 */
  19#define RT_CACHE_DEBUG          0
  20
  21#define DST_GC_MIN      (HZ/10)
  22#define DST_GC_INC      (HZ/2)
  23#define DST_GC_MAX      (120*HZ)
  24
  25struct sk_buff;
  26
  27struct dst_entry
  28{
  29        struct dst_entry        *next;
  30        atomic_t                __refcnt;       /* client references    */
  31        int                     __use;
  32        struct net_device       *dev;
  33        int                     obsolete;
  34        int                     flags;
  35#define DST_HOST                1
  36        unsigned long           lastuse;
  37        unsigned long           expires;
  38
  39        unsigned                mxlock;
  40        unsigned                pmtu;
  41        unsigned                window;
  42        unsigned                rtt;
  43        unsigned                rttvar;
  44        unsigned                ssthresh;
  45        unsigned                cwnd;
  46        unsigned                advmss;
  47        unsigned                reordering;
  48
  49        unsigned long           rate_last;      /* rate limiting for ICMP */
  50        unsigned long           rate_tokens;
  51
  52        int                     error;
  53
  54        struct neighbour        *neighbour;
  55        struct hh_cache         *hh;
  56
  57        int                     (*input)(struct sk_buff*);
  58        int                     (*output)(struct sk_buff*);
  59
  60#ifdef CONFIG_NET_CLS_ROUTE
  61        __u32                   tclassid;
  62#endif
  63
  64        struct  dst_ops         *ops;
  65                
  66        char                    info[0];
  67};
  68
  69
  70struct dst_ops
  71{
  72        unsigned short          family;
  73        unsigned short          protocol;
  74        unsigned                gc_thresh;
  75
  76        int                     (*gc)(void);
  77        struct dst_entry *      (*check)(struct dst_entry *, __u32 cookie);
  78        struct dst_entry *      (*reroute)(struct dst_entry *,
  79                                           struct sk_buff *);
  80        void                    (*destroy)(struct dst_entry *);
  81        struct dst_entry *      (*negative_advice)(struct dst_entry *);
  82        void                    (*link_failure)(struct sk_buff *);
  83        int                     entry_size;
  84
  85        atomic_t                entries;
  86        kmem_cache_t            *kmem_cachep;
  87};
  88
  89#ifdef __KERNEL__
  90
  91static inline void dst_hold(struct dst_entry * dst)
  92{
  93        atomic_inc(&dst->__refcnt);
  94}
  95
  96static inline
  97struct dst_entry * dst_clone(struct dst_entry * dst)
  98{
  99        if (dst)
 100                atomic_inc(&dst->__refcnt);
 101        return dst;
 102}
 103
 104static inline
 105void dst_release(struct dst_entry * dst)
 106{
 107        if (dst)
 108                atomic_dec(&dst->__refcnt);
 109}
 110
 111extern void * dst_alloc(struct dst_ops * ops);
 112extern void __dst_free(struct dst_entry * dst);
 113extern void dst_destroy(struct dst_entry * dst);
 114
 115static inline
 116void dst_free(struct dst_entry * dst)
 117{
 118        if (dst->obsolete > 1)
 119                return;
 120        if (!atomic_read(&dst->__refcnt)) {
 121                dst_destroy(dst);
 122                return;
 123        }
 124        __dst_free(dst);
 125}
 126
 127static inline void dst_confirm(struct dst_entry *dst)
 128{
 129        if (dst)
 130                neigh_confirm(dst->neighbour);
 131}
 132
 133static inline void dst_negative_advice(struct dst_entry **dst_p)
 134{
 135        struct dst_entry * dst = *dst_p;
 136        if (dst && dst->ops->negative_advice)
 137                *dst_p = dst->ops->negative_advice(dst);
 138}
 139
 140static inline void dst_link_failure(struct sk_buff *skb)
 141{
 142        struct dst_entry * dst = skb->dst;
 143        if (dst && dst->ops && dst->ops->link_failure)
 144                dst->ops->link_failure(skb);
 145}
 146
 147static inline void dst_set_expires(struct dst_entry *dst, int timeout)
 148{
 149        unsigned long expires = jiffies + timeout;
 150
 151        if (expires == 0)
 152                expires = 1;
 153
 154        if (dst->expires == 0 || (long)(dst->expires - expires) > 0)
 155                dst->expires = expires;
 156}
 157
 158extern void             dst_init(void);
 159
 160#endif
 161
 162#endif /* _NET_DST_H */
 163
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.