Blame view
include/net/dst.h
6.96 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 |
/* * net/dst.h Protocol independent destination cache definitions. * * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> * */ #ifndef _NET_DST_H #define _NET_DST_H |
14c850212 [INET_SOCK]: Move... |
10 |
#include <linux/netdevice.h> |
1da177e4c Linux-2.6.12-rc2 |
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <linux/rtnetlink.h> #include <linux/rcupdate.h> #include <linux/jiffies.h> #include <net/neighbour.h> #include <asm/processor.h> /* * 0 - no debugging messages * 1 - rare events and bugs (default) * 2 - trace mode. */ #define RT_CACHE_DEBUG 0 #define DST_GC_MIN (HZ/10) #define DST_GC_INC (HZ/2) #define DST_GC_MAX (120*HZ) /* Each dst_entry has reference count and sits in some parent list(s). * When it is removed from parent list, it is "freed" (dst_free). * After this it enters dead state (dst->obsolete > 0) and if its refcnt * is zero, it can be destroyed immediately, otherwise it is added * to gc list and garbage collector periodically checks the refcnt. */ struct sk_buff; struct dst_entry { |
1e19e02ca [NET]: Reorder fi... |
39 |
struct rcu_head rcu_head; |
1da177e4c Linux-2.6.12-rc2 |
40 41 |
struct dst_entry *child; struct net_device *dev; |
c4d541106 [NET]: Shave size... |
42 43 |
short error; short obsolete; |
1da177e4c Linux-2.6.12-rc2 |
44 45 46 47 48 |
int flags; #define DST_HOST 1 #define DST_NOXFRM 2 #define DST_NOPOLICY 4 #define DST_NOHASH 8 |
1da177e4c Linux-2.6.12-rc2 |
49 50 51 52 |
unsigned long expires; unsigned short header_len; /* more space at head required */ unsigned short trailer_len; /* space to reserve at tail */ |
69a73829d [DST]: shrinks si... |
53 |
unsigned int rate_tokens; |
f1dd9c379 [NET]: Fix tbench... |
54 |
unsigned long rate_last; /* rate limiting for ICMP */ |
69a73829d [DST]: shrinks si... |
55 |
|
f1dd9c379 [NET]: Fix tbench... |
56 |
struct dst_entry *path; |
1da177e4c Linux-2.6.12-rc2 |
57 |
|
1da177e4c Linux-2.6.12-rc2 |
58 59 |
struct neighbour *neighbour; struct hh_cache *hh; |
def8b4faf net: reduce struc... |
60 |
#ifdef CONFIG_XFRM |
1da177e4c Linux-2.6.12-rc2 |
61 |
struct xfrm_state *xfrm; |
5635c10d9 net: make sure st... |
62 63 |
#else void *__pad1; |
def8b4faf net: reduce struc... |
64 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
65 66 |
int (*input)(struct sk_buff*); int (*output)(struct sk_buff*); |
1da177e4c Linux-2.6.12-rc2 |
67 |
struct dst_ops *ops; |
f1dd9c379 [NET]: Fix tbench... |
68 69 70 71 72 |
u32 metrics[RTAX_MAX]; #ifdef CONFIG_NET_CLS_ROUTE __u32 tclassid; |
5635c10d9 net: make sure st... |
73 74 |
#else __u32 __pad2; |
f1dd9c379 [NET]: Fix tbench... |
75 |
#endif |
5635c10d9 net: make sure st... |
76 77 78 79 80 81 82 83 84 85 |
/* * Align __refcnt to a 64 bytes alignment * (L1_CACHE_SIZE would be too much) */ #ifdef CONFIG_64BIT long __pad_to_align_refcnt[2]; #else long __pad_to_align_refcnt[1]; #endif |
f1dd9c379 [NET]: Fix tbench... |
86 87 88 89 |
/* * __refcnt wants to be on a different cache line from * input/output/ops or performance tanks badly */ |
1e19e02ca [NET]: Reorder fi... |
90 91 |
atomic_t __refcnt; /* client references */ int __use; |
f1dd9c379 [NET]: Fix tbench... |
92 |
unsigned long lastuse; |
1e19e02ca [NET]: Reorder fi... |
93 94 95 96 97 98 |
union { struct dst_entry *next; struct rtable *rt_next; struct rt6_info *rt6_next; struct dn_route *dn_next; }; |
1da177e4c Linux-2.6.12-rc2 |
99 100 101 102 103 104 |
}; struct dst_ops { unsigned short family; |
d77072ecf [NET]: Annotate d... |
105 |
__be16 protocol; |
1da177e4c Linux-2.6.12-rc2 |
106 |
unsigned gc_thresh; |
569d36452 [NETNS][DST] dst:... |
107 |
int (*gc)(struct dst_ops *ops); |
1da177e4c Linux-2.6.12-rc2 |
108 109 110 111 112 113 114 |
struct dst_entry * (*check)(struct dst_entry *, __u32 cookie); void (*destroy)(struct dst_entry *); void (*ifdown)(struct dst_entry *, struct net_device *dev, int how); struct dst_entry * (*negative_advice)(struct dst_entry *); void (*link_failure)(struct sk_buff *); void (*update_pmtu)(struct dst_entry *dst, u32 mtu); |
862b82c6f [IPSEC]: Merge mo... |
115 |
int (*local_out)(struct sk_buff *skb); |
1da177e4c Linux-2.6.12-rc2 |
116 117 |
atomic_t entries; |
e18b890bb [PATCH] slab: rem... |
118 |
struct kmem_cache *kmem_cachep; |
d4fa26ff4 [NETNS][DST]: Add... |
119 |
struct net *dst_net; |
1da177e4c Linux-2.6.12-rc2 |
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
}; #ifdef __KERNEL__ static inline u32 dst_metric(const struct dst_entry *dst, int metric) { return dst->metrics[metric-1]; } static inline u32 dst_mtu(const struct dst_entry *dst) { u32 mtu = dst_metric(dst, RTAX_MTU); /* * Alexey put it here, so ask him about it :) */ barrier(); return mtu; } |
c1e20f7c8 tcp: RTT metrics ... |
139 140 141 142 143 144 145 146 147 148 149 |
/* RTT metrics are stored in milliseconds for user ABI, but used as jiffies */ static inline unsigned long dst_metric_rtt(const struct dst_entry *dst, int metric) { return msecs_to_jiffies(dst_metric(dst, metric)); } static inline void set_dst_metric_rtt(struct dst_entry *dst, int metric, unsigned long rtt) { dst->metrics[metric-1] = jiffies_to_msecs(rtt); } |
1da177e4c Linux-2.6.12-rc2 |
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
static inline u32 dst_allfrag(const struct dst_entry *dst) { int ret = dst_metric(dst, RTAX_FEATURES) & RTAX_FEATURE_ALLFRAG; /* Yes, _exactly_. This is paranoia. */ barrier(); return ret; } static inline int dst_metric_locked(struct dst_entry *dst, int metric) { return dst_metric(dst, RTAX_LOCK) & (1<<metric); } static inline void dst_hold(struct dst_entry * dst) { |
5635c10d9 net: make sure st... |
167 168 169 170 171 |
/* * If your kernel compilation stops here, please check * __pad_to_align_refcnt declaration in struct dst_entry */ BUILD_BUG_ON(offsetof(struct dst_entry, __refcnt) & 63); |
1da177e4c Linux-2.6.12-rc2 |
172 173 |
atomic_inc(&dst->__refcnt); } |
03f49f345 [NET]: Make helpe... |
174 175 176 177 178 179 |
static inline void dst_use(struct dst_entry *dst, unsigned long time) { dst_hold(dst); dst->__use++; dst->lastuse = time; } |
1da177e4c Linux-2.6.12-rc2 |
180 181 182 183 184 185 186 |
static inline struct dst_entry * dst_clone(struct dst_entry * dst) { if (dst) atomic_inc(&dst->__refcnt); return dst; } |
8d3308687 [NET]: uninline d... |
187 |
extern void dst_release(struct dst_entry *dst); |
1da177e4c Linux-2.6.12-rc2 |
188 189 190 191 192 193 194 195 196 197 198 199 |
/* Children define the path of the packet through the * Linux networking. Thus, destinations are stackable. */ static inline struct dst_entry *dst_pop(struct dst_entry *dst) { struct dst_entry *child = dst_clone(dst->child); dst_release(dst); return child; } |
352e512c3 [NET]: Eliminate ... |
200 |
extern int dst_discard(struct sk_buff *skb); |
1da177e4c Linux-2.6.12-rc2 |
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 |
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); static inline void dst_free(struct dst_entry * dst) { if (dst->obsolete > 1) return; if (!atomic_read(&dst->__refcnt)) { dst = dst_destroy(dst); if (!dst) return; } __dst_free(dst); } static inline void dst_rcu_free(struct rcu_head *head) { struct dst_entry *dst = container_of(head, struct dst_entry, rcu_head); dst_free(dst); } static inline void dst_confirm(struct dst_entry *dst) { if (dst) neigh_confirm(dst->neighbour); } static inline void dst_negative_advice(struct dst_entry **dst_p) { struct dst_entry * dst = *dst_p; if (dst && dst->ops->negative_advice) *dst_p = dst->ops->negative_advice(dst); } static inline void dst_link_failure(struct sk_buff *skb) { struct dst_entry * dst = skb->dst; if (dst && dst->ops && dst->ops->link_failure) dst->ops->link_failure(skb); } static inline void dst_set_expires(struct dst_entry *dst, int timeout) { unsigned long expires = jiffies + timeout; if (expires == 0) expires = 1; if (dst->expires == 0 || time_before(expires, dst->expires)) dst->expires = expires; } /* Output packet to network from transport. */ static inline int dst_output(struct sk_buff *skb) { |
16a6677fd [XFRM]: Netfilter... |
257 |
return skb->dst->output(skb); |
1da177e4c Linux-2.6.12-rc2 |
258 259 260 261 262 |
} /* Input packet from network to transport. */ static inline int dst_input(struct sk_buff *skb) { |
cc6533e98 net: Kill plain N... |
263 |
return skb->dst->input(skb); |
1da177e4c Linux-2.6.12-rc2 |
264 265 266 267 268 269 270 271 272 273 |
} static inline struct dst_entry *dst_check(struct dst_entry *dst, u32 cookie) { if (dst->obsolete) dst = dst->ops->check(dst, cookie); return dst; } extern void dst_init(void); |
815f4e57e [IPSEC]: Make xfr... |
274 275 276 |
/* Flags for xfrm_lookup flags argument. */ enum { XFRM_LOOKUP_WAIT = 1 << 0, |
8b7817f3a [IPSEC]: Add ICMP... |
277 |
XFRM_LOOKUP_ICMP = 1 << 1, |
815f4e57e [IPSEC]: Make xfr... |
278 |
}; |
1da177e4c Linux-2.6.12-rc2 |
279 280 |
struct flowi; #ifndef CONFIG_XFRM |
52479b623 netns xfrm: looku... |
281 282 |
static inline int xfrm_lookup(struct net *net, struct dst_entry **dst_p, struct flowi *fl, struct sock *sk, int flags) |
1da177e4c Linux-2.6.12-rc2 |
283 284 285 |
{ return 0; } |
52479b623 netns xfrm: looku... |
286 287 |
static inline int __xfrm_lookup(struct net *net, struct dst_entry **dst_p, struct flowi *fl, struct sock *sk, int flags) |
14e50e57a [XFRM]: Allow pac... |
288 289 290 |
{ return 0; } |
1da177e4c Linux-2.6.12-rc2 |
291 |
#else |
52479b623 netns xfrm: looku... |
292 293 294 295 |
extern int xfrm_lookup(struct net *net, struct dst_entry **dst_p, struct flowi *fl, struct sock *sk, int flags); extern int __xfrm_lookup(struct net *net, struct dst_entry **dst_p, struct flowi *fl, struct sock *sk, int flags); |
1da177e4c Linux-2.6.12-rc2 |
296 297 298 299 |
#endif #endif #endif /* _NET_DST_H */ |