dst.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * net/dst.h Protocol independent destination cache definitions.
  3.  *
  4.  * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
  5.  *
  6.  */
  7. #ifndef _NET_DST_H
  8. #define _NET_DST_H
  9. #include <linux/config.h>
  10. #include <net/neighbour.h>
  11. /*
  12.  * 0 - no debugging messages
  13.  * 1 - rare events and bugs (default)
  14.  * 2 - trace mode.
  15.  */
  16. #define RT_CACHE_DEBUG 0
  17. #define DST_GC_MIN (1*HZ)
  18. #define DST_GC_INC (5*HZ)
  19. #define DST_GC_MAX (120*HZ)
  20. struct sk_buff;
  21. struct dst_entry
  22. {
  23. struct dst_entry        *next;
  24. atomic_t __refcnt; /* client references */
  25. int __use;
  26. struct net_device       *dev;
  27. int obsolete;
  28. int flags;
  29. #define DST_HOST 1
  30. unsigned long lastuse;
  31. unsigned long expires;
  32. unsigned mxlock;
  33. unsigned pmtu;
  34. unsigned window;
  35. unsigned rtt;
  36. unsigned rttvar;
  37. unsigned ssthresh;
  38. unsigned cwnd;
  39. unsigned advmss;
  40. unsigned reordering;
  41. unsigned long rate_last; /* rate limiting for ICMP */
  42. unsigned long rate_tokens;
  43. int error;
  44. struct neighbour *neighbour;
  45. struct hh_cache *hh;
  46. int (*input)(struct sk_buff*);
  47. int (*output)(struct sk_buff*);
  48. #ifdef CONFIG_NET_CLS_ROUTE
  49. __u32 tclassid;
  50. #endif
  51. struct  dst_ops         *ops;
  52. char info[0];
  53. };
  54. struct dst_ops
  55. {
  56. unsigned short family;
  57. unsigned short protocol;
  58. unsigned gc_thresh;
  59. int (*gc)(void);
  60. struct dst_entry * (*check)(struct dst_entry *, __u32 cookie);
  61. struct dst_entry * (*reroute)(struct dst_entry *,
  62.    struct sk_buff *);
  63. void (*destroy)(struct dst_entry *);
  64. struct dst_entry * (*negative_advice)(struct dst_entry *);
  65. void (*link_failure)(struct sk_buff *);
  66. int entry_size;
  67. atomic_t entries;
  68. kmem_cache_t  *kmem_cachep;
  69. };
  70. #ifdef __KERNEL__
  71. static inline void dst_hold(struct dst_entry * dst)
  72. {
  73. atomic_inc(&dst->__refcnt);
  74. }
  75. static inline
  76. struct dst_entry * dst_clone(struct dst_entry * dst)
  77. {
  78. if (dst)
  79. atomic_inc(&dst->__refcnt);
  80. return dst;
  81. }
  82. static inline
  83. void dst_release(struct dst_entry * dst)
  84. {
  85. if (dst)
  86. atomic_dec(&dst->__refcnt);
  87. }
  88. extern void * dst_alloc(struct dst_ops * ops);
  89. extern void __dst_free(struct dst_entry * dst);
  90. extern void dst_destroy(struct dst_entry * dst);
  91. static inline
  92. void dst_free(struct dst_entry * dst)
  93. {
  94. if (dst->obsolete > 1)
  95. return;
  96. if (!atomic_read(&dst->__refcnt)) {
  97. dst_destroy(dst);
  98. return;
  99. }
  100. __dst_free(dst);
  101. }
  102. static inline void dst_confirm(struct dst_entry *dst)
  103. {
  104. if (dst)
  105. neigh_confirm(dst->neighbour);
  106. }
  107. static inline void dst_negative_advice(struct dst_entry **dst_p)
  108. {
  109. struct dst_entry * dst = *dst_p;
  110. if (dst && dst->ops->negative_advice)
  111. *dst_p = dst->ops->negative_advice(dst);
  112. }
  113. static inline void dst_link_failure(struct sk_buff *skb)
  114. {
  115. struct dst_entry * dst = skb->dst;
  116. if (dst && dst->ops && dst->ops->link_failure)
  117. dst->ops->link_failure(skb);
  118. }
  119. static inline void dst_set_expires(struct dst_entry *dst, int timeout)
  120. {
  121. unsigned long expires = jiffies + timeout;
  122. if (expires == 0)
  123. expires = 1;
  124. if (dst->expires == 0 || (long)(dst->expires - expires) > 0)
  125. dst->expires = expires;
  126. }
  127. extern void dst_init(void);
  128. #endif
  129. #endif /* _NET_DST_H */