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 core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
include
/
net
/
dst.h
diff --git
a/include/net/dst.h
b/include/net/dst.h
index
33fd866
..
62b7e75
100644
(file)
--- a/
include/net/dst.h
+++ b/
include/net/dst.h
@@
-8,7
+8,7
@@
#ifndef _NET_DST_H
#define _NET_DST_H
#ifndef _NET_DST_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,16
+42,19
@@
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 short header_len; /* more space at head required */
unsigned long lastuse;
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];
unsigned short trailer_len; /* space to reserve at tail */
u32 metrics[RTAX_MAX];
@@
-60,14
+63,12
@@
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;
int (*input)(struct sk_buff*);
struct neighbour *neighbour;
struct hh_cache *hh;
struct xfrm_state *xfrm;
int (*input)(struct sk_buff*);
- int (*output)(struct sk_buff*
*
);
+ int (*output)(struct sk_buff*);
#ifdef CONFIG_NET_CLS_ROUTE
__u32 tclassid;
#ifdef CONFIG_NET_CLS_ROUTE
__u32 tclassid;
@@
-83,44
+84,48
@@
struct dst_entry
struct dst_ops
{
unsigned short family;
struct dst_ops
{
unsigned short family;
-
unsigned short
protocol;
+
__be16
protocol;
unsigned gc_thresh;
int (*gc)(void);
struct dst_entry * (*check)(struct dst_entry *, __u32 cookie);
void (*destroy)(struct dst_entry *);
unsigned gc_thresh;
int (*gc)(void);
struct dst_entry * (*check)(struct dst_entry *, __u32 cookie);
void (*destroy)(struct dst_entry *);
- void (*ifdown)(struct dst_entry *, int how);
+ 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;
-
kmem_cache_t
*kmem_cachep;
+
struct kmem_cache
*kmem_cachep;
};
#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
@@
-142,16
+147,12
@@
struct dst_entry * dst_clone(struct dst_entry * dst)
return dst;
}
return dst;
}
-extern const char dst_underflow_bug_msg[];
-
static inline
void dst_release(struct dst_entry * dst)
{
if (dst) {
static inline
void dst_release(struct dst_entry * dst)
{
if (dst) {
- if (atomic_read(&dst->__refcnt) < 1)
- printk(dst_underflow_bug_msg,
- atomic_read(&dst->__refcnt),
- dst, current_text_addr());
+ WARN_ON(atomic_read(&dst->__refcnt) < 1);
+ smp_mb__before_atomic_dec();
atomic_dec(&dst->__refcnt);
}
}
atomic_dec(&dst->__refcnt);
}
}
@@
-224,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. */
@@
-252,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;