git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git]
/
include
/
net
/
dst.h
diff --git
a/include/net/dst.h
b/include/net/dst.h
index
42dd8f5
..
5161e89
100644
(file)
--- a/
include/net/dst.h
+++ b/
include/net/dst.h
@@
-9,6
+9,7
@@
#define _NET_DST_H
#include <linux/config.h>
#define _NET_DST_H
#include <linux/config.h>
+#include <linux/netdevice.h>
#include <linux/rtnetlink.h>
#include <linux/rcupdate.h>
#include <linux/jiffies.h>
#include <linux/rtnetlink.h>
#include <linux/rcupdate.h>
#include <linux/jiffies.h>
@@
-42,12
+43,14
@@
struct dst_entry
int __use;
struct dst_entry *child;
struct net_device *dev;
int __use;
struct dst_entry *child;
struct net_device *dev;
- int obsolete;
+ short error;
+ short obsolete;
int flags;
#define DST_HOST 1
#define DST_NOXFRM 2
#define DST_NOPOLICY 4
#define DST_NOHASH 8
int flags;
#define DST_HOST 1
#define DST_NOXFRM 2
#define DST_NOPOLICY 4
#define DST_NOHASH 8
+#define DST_BALANCED 0x10
unsigned long lastuse;
unsigned long expires;
unsigned long lastuse;
unsigned long expires;
@@
-60,8
+63,6
@@
struct dst_entry
unsigned long rate_last; /* rate limiting for ICMP */
unsigned long rate_tokens;
unsigned long rate_last; /* rate limiting for ICMP */
unsigned long rate_tokens;
- int error;
-
struct neighbour *neighbour;
struct hh_cache *hh;
struct xfrm_state *xfrm;
struct neighbour *neighbour;
struct hh_cache *hh;
struct xfrm_state *xfrm;
@@
-89,10
+90,11
@@
struct dst_ops
int (*gc)(void);
struct dst_entry * (*check)(struct dst_entry *, __u32 cookie);
void (*destroy)(struct dst_entry *);
int (*gc)(void);
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);
struct dst_entry * (*negative_advice)(struct dst_entry *);
void (*link_failure)(struct sk_buff *);
void (*update_pmtu)(struct dst_entry *dst, u32 mtu);
- int (*get_mss)(struct dst_entry *dst, u32 mtu);
int entry_size;
atomic_t entries;
int entry_size;
atomic_t entries;
@@
-102,24
+104,28
@@
struct dst_ops
#ifdef __KERNEL__
static inline u32
#ifdef __KERNEL__
static inline u32
-dst_metric(struct dst_entry *dst, int metric)
+dst_metric(
const
struct dst_entry *dst, int metric)
{
return dst->metrics[metric-1];
}
{
return dst->metrics[metric-1];
}
-static inline u32
-dst_path_metric(struct dst_entry *dst, int metric)
+static inline u32 dst_mtu(const struct dst_entry *dst)
{
{
- return dst->path->metrics[metric-1];
+ u32 mtu = dst_metric(dst, RTAX_MTU);
+ /*
+ * Alexey put it here, so ask him about it :)
+ */
+ barrier();
+ return mtu;
}
static inline u32
}
static inline u32
-dst_
pmtu(
struct dst_entry *dst)
+dst_
allfrag(const
struct dst_entry *dst)
{
{
-
u32 mtu = dst_path_metric(dst, RTAX_MTU)
;
+
int ret = dst_metric(dst, RTAX_FEATURES) & RTAX_FEATURE_ALLFRAG
;
/* Yes, _exactly_. This is paranoia. */
barrier();
/* Yes, _exactly_. This is paranoia. */
barrier();
- return
mtu
;
+ return
ret
;
}
static inline int
}
static inline int
@@
-145,11
+151,8
@@
static inline
void dst_release(struct dst_entry * dst)
{
if (dst) {
void dst_release(struct dst_entry * dst)
{
if (dst) {
- if (atomic_read(&dst->__refcnt) < 1) {
- printk("BUG: dst underflow %d: %p\n",
- atomic_read(&dst->__refcnt),
- current_text_addr());
- }
+ WARN_ON(atomic_read(&dst->__refcnt) < 1);
+ smp_mb__before_atomic_dec();
atomic_dec(&dst->__refcnt);
}
}
atomic_dec(&dst->__refcnt);
}
}
@@
-182,6
+185,12
@@
static inline void dst_free(struct dst_entry * dst)
__dst_free(dst);
}
__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)
static inline void dst_confirm(struct dst_entry *dst)
{
if (dst)
@@
-216,16
+225,7
@@
static inline void dst_set_expires(struct dst_entry *dst, int timeout)
/* Output packet to network from transport. */
static inline int dst_output(struct sk_buff *skb)
{
/* Output packet to network from transport. */
static inline int dst_output(struct sk_buff *skb)
{
- int err;
-
- for (;;) {
- err = skb->dst->output(skb);
-
- if (likely(err == 0))
- return err;
- if (unlikely(err != NET_XMIT_BYPASS))
- return err;
- }
+ return skb->dst->output(skb);
}
/* Input packet from network to transport. */
}
/* Input packet from network to transport. */
@@
-244,6
+244,13
@@
static inline int dst_input(struct sk_buff *skb)
}
}
}
}
+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);
struct flowi;
extern void dst_init(void);
struct flowi;