summaryrefslogtreecommitdiffstats
path: root/include/net/dst.h
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-04-29 21:13:14 +0000
committer <ralf@linux-mips.org>1997-04-29 21:13:14 +0000
commit19c9bba94152148523ba0f7ef7cffe3d45656b11 (patch)
tree40b1cb534496a7f1ca0f5c314a523c69f1fee464 /include/net/dst.h
parent7206675c40394c78a90e74812bbdbf8cf3cca1be (diff)
Import of Linux/MIPS 2.1.36
Diffstat (limited to 'include/net/dst.h')
-rw-r--r--include/net/dst.h126
1 files changed, 126 insertions, 0 deletions
diff --git a/include/net/dst.h b/include/net/dst.h
new file mode 100644
index 000000000..9d2a69100
--- /dev/null
+++ b/include/net/dst.h
@@ -0,0 +1,126 @@
+/*
+ * net/dst.h Protocol independent destination cache definitions.
+ *
+ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
+ *
+ */
+
+#ifndef _NET_DST_H
+#define _NET_DST_H
+
+#include <net/neighbour.h>
+
+/*
+ * 0 - no debugging messages
+ * 1 - rare events and bugs (default)
+ * 2 - trace mode.
+ */
+#ifdef NO_ANK_FIX
+#define RT_CACHE_DEBUG 0
+#else
+#define RT_CACHE_DEBUG 1
+#endif
+
+#define DST_GC_MIN (1*HZ)
+#define DST_GC_INC (5*HZ)
+#define DST_GC_MAX (120*HZ)
+
+struct sk_buff;
+
+struct dst_entry
+{
+ struct dst_entry *next;
+ atomic_t refcnt; /* tree/hash references */
+ atomic_t use; /* client references */
+ struct device *dev;
+ char obsolete;
+ char priority;
+ char __pad1, __pad2;
+ unsigned long lastuse;
+ unsigned window;
+ unsigned pmtu;
+ unsigned rtt;
+ int error;
+
+ struct neighbour *neighbour;
+ struct hh_cache *hh;
+
+ int (*input)(struct sk_buff*);
+ int (*output)(struct sk_buff*);
+
+ struct dst_ops *ops;
+
+ char info[0];
+};
+
+
+struct dst_ops
+{
+ unsigned short family;
+ struct dst_entry * (*check)(struct dst_entry *, u32 cookie);
+ struct dst_entry * (*reroute)(struct dst_entry *,
+ struct sk_buff *);
+ void (*destroy)(struct dst_entry *);
+};
+
+extern struct dst_entry * dst_garbage_list;
+extern atomic_t dst_total;
+
+static __inline__
+struct dst_entry * dst_clone(struct dst_entry * dst)
+{
+ if (dst)
+ atomic_inc(&dst->use);
+ return dst;
+}
+
+static __inline__
+void dst_release(struct dst_entry * dst)
+{
+ if (dst)
+ atomic_dec(&dst->use);
+}
+
+static __inline__
+struct dst_entry * dst_check(struct dst_entry ** dst_p, u32 cookie)
+{
+ struct dst_entry * dst = *dst_p;
+ if (dst && dst->obsolete)
+ dst = dst->ops->check(dst, cookie);
+ return (*dst_p = dst);
+}
+
+static __inline__
+struct dst_entry * dst_reroute(struct dst_entry ** dst_p, struct sk_buff *skb)
+{
+ struct dst_entry * dst = *dst_p;
+ if (dst && dst->obsolete)
+ dst = dst->ops->reroute(dst, skb);
+ return (*dst_p = dst);
+}
+
+static __inline__
+void dst_destroy(struct dst_entry * dst)
+{
+ if (dst->neighbour)
+ neigh_release(dst->neighbour);
+ if (dst->ops->destroy)
+ dst->ops->destroy(dst);
+ kfree(dst);
+ atomic_dec(&dst_total);
+}
+
+extern void * dst_alloc(int size, struct dst_ops * ops);
+extern void __dst_free(struct dst_entry * dst);
+
+static __inline__
+void dst_free(struct dst_entry * dst)
+{
+ if (!atomic_read(&dst->use)) {
+ dst_destroy(dst);
+ return;
+ }
+ __dst_free(dst);
+}
+
+#endif /* _NET_DST_H */