summaryrefslogtreecommitdiffstats
path: root/include/net/route.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/route.h
parent7206675c40394c78a90e74812bbdbf8cf3cca1be (diff)
Import of Linux/MIPS 2.1.36
Diffstat (limited to 'include/net/route.h')
-rw-r--r--include/net/route.h227
1 files changed, 112 insertions, 115 deletions
diff --git a/include/net/route.h b/include/net/route.h
index de59bda48..d309ab63f 100644
--- a/include/net/route.h
+++ b/include/net/route.h
@@ -14,9 +14,6 @@
* Alan Cox : Support for TCP parameters.
* Alexey Kuznetsov: Major changes for new routing code.
*
- * FIXME:
- * Make atomic ops more generic and hide them in asm/...
- *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
@@ -25,25 +22,12 @@
#ifndef _ROUTE_H
#define _ROUTE_H
-#include <linux/config.h>
+#include <net/ip_fib.h>
+#include <net/dst.h>
-/*
- * 0 - no debugging messages
- * 1 - rare events and bugs situations (default)
- * 2 - trace mode.
- */
-#define RT_CACHE_DEBUG 0
#define RT_HASH_DIVISOR 256
-#define RT_CACHE_SIZE_MAX 256
-
-#define RTZ_HASH_DIVISOR 256
-
-#if RT_CACHE_DEBUG >= 2
-#define RTZ_HASHING_LIMIT 0
-#else
-#define RTZ_HASHING_LIMIT 16
-#endif
+#define RT_CACHE_MAX_SIZE 256
/*
* Maximal time to live for unused entry.
@@ -51,127 +35,140 @@
#define RT_CACHE_TIMEOUT (HZ*300)
/*
+ * Cache invalidations can be delayed by:
+ */
+#define RT_FLUSH_DELAY (2*HZ)
+
+#define RT_REDIRECT_NUMBER 9
+#define RT_REDIRECT_LOAD (HZ/50) /* 20 msec */
+#define RT_REDIRECT_SILENCE (RT_REDIRECT_LOAD<<(RT_REDIRECT_NUMBER+1))
+ /* 20sec */
+
+#define RT_ERROR_LOAD (1*HZ)
+
+
+/*
* Prevents LRU trashing, entries considered equivalent,
* if the difference between last use times is less then this number.
*/
-#define RT_CACHE_BUBBLE_THRESHOLD (HZ*5)
+#define RT_CACHE_BUBBLE_THRESHOLD (5*HZ)
#include <linux/route.h>
-#ifdef __KERNEL__
-#define RTF_LOCAL 0x8000
-#endif
-
struct rtable
{
- struct rtable *rt_next;
- __u32 rt_dst;
- __u32 rt_src;
- __u32 rt_gateway;
- atomic_t rt_refcnt;
- atomic_t rt_use;
- unsigned long rt_window;
- atomic_t rt_lastuse;
- struct hh_cache *rt_hh;
- struct device *rt_dev;
- unsigned short rt_flags;
- unsigned short rt_mtu;
- unsigned short rt_irtt;
- unsigned char rt_tos;
-};
+ union
+ {
+ struct dst_entry dst;
+ struct rtable *rt_next;
+ } u;
-extern void ip_rt_flush(struct device *dev);
-extern void ip_rt_update(int event, struct device *dev);
-extern void ip_rt_redirect(__u32 src, __u32 dst, __u32 gw, struct device *dev);
-extern struct rtable *ip_rt_slow_route(__u32 daddr, int local);
-extern int rt_get_info(char * buffer, char **start, off_t offset, int length, int dummy);
-extern int rt_cache_get_info(char *buffer, char **start, off_t offset, int length, int dummy);
-extern int ip_rt_ioctl(unsigned int cmd, void *arg);
-extern int ip_rt_new(struct rtentry *rt);
-extern int ip_rt_kill(struct rtentry *rt);
-extern void ip_rt_check_expire(void);
-extern void ip_rt_advice(struct rtable **rp, int advice);
+ unsigned rt_flags;
-extern void ip_rt_run_bh(void);
-extern atomic_t ip_rt_lock;
-extern unsigned ip_rt_bh_mask;
-extern struct rtable *ip_rt_hash_table[RT_HASH_DIVISOR];
+ u32 rt_dst; /* Path destination */
+ u32 rt_src; /* Path source */
+ struct device *rt_src_dev; /* Path source device */
-extern __inline__ void ip_rt_fast_lock(void)
-{
- atomic_inc(&ip_rt_lock);
-}
+ /* Info on neighbour */
+ u32 rt_gateway;
-extern __inline__ void ip_rt_fast_unlock(void)
-{
- atomic_dec(&ip_rt_lock);
-}
+ /* Cache lookup keys */
+ struct
+ {
+ u32 dst;
+ u32 src;
+ struct device *src_dev;
+ struct device *dst_dev;
+ u8 tos;
+ } key;
+
+ /* Miscellaneous cached information */
+ u32 rt_spec_dst; /* RFC1122 specific destination */
+ u32 rt_src_map;
+ u32 rt_dst_map;
+
+ /* ICMP statistics */
+ unsigned long last_error;
+ unsigned long errors;
+};
-extern __inline__ void ip_rt_unlock(void)
-{
- if (atomic_dec_and_test(&ip_rt_lock) && ip_rt_bh_mask)
- ip_rt_run_bh();
-}
-extern __inline__ unsigned ip_rt_hash_code(__u32 addr)
-{
- unsigned tmp = addr + (addr>>16);
- return (tmp + (tmp>>8)) & 0xFF;
-}
+#define RTF_IFBRD (RTF_UP|RTF_MAGIC|RTF_LOCAL|RTF_BROADCAST)
+#define RTF_IFLOCAL (RTF_UP|RTF_MAGIC|RTF_LOCAL|RTF_INTERFACE)
+#define RTF_IFPREFIX (RTF_UP|RTF_MAGIC|RTF_INTERFACE)
+/*
+ * Flags not visible at user level.
+ */
+#define RTF_INTERNAL 0xFFFF8000 /* to get RTF_MAGIC as well... */
+
+/*
+ * Flags saved in FIB.
+ */
+#define RTF_FIB (RTF_UP|RTF_GATEWAY|RTF_REJECT|RTF_THROW|RTF_STATIC|\
+ RTF_XRESOLVE|RTF_NOPMTUDISC|RTF_NOFORWARD|RTF_INTERNAL)
-extern __inline__ void ip_rt_put(struct rtable * rt)
-#ifndef MODULE
+extern void ip_rt_init(void);
+extern void ip_rt_redirect(u32 old_gw, u32 dst, u32 new_gw,
+ u32 src, u8 tos, struct device *dev);
+extern void ip_rt_check_expire(void);
+extern void ip_rt_advice(struct rtable **rp, int advice);
+extern void rt_cache_flush(int how);
+extern int ip_route_output(struct rtable **, u32 dst, u32 src, u8 tos, struct device *devout);
+extern int ip_route_output_dev(struct rtable **, u32 dst, u32 src, u8 tos, int);
+extern int ip_route_input(struct sk_buff*, u32 dst, u32 src, u8 tos, struct device *devin);
+extern unsigned short ip_rt_frag_needed(struct iphdr *iph, unsigned short new_mtu);
+extern void ip_rt_send_redirect(struct sk_buff *skb);
+
+static __inline__ void ip_rt_put(struct rtable * rt)
{
if (rt)
- atomic_dec(&rt->rt_refcnt);
+ dst_release(&rt->u.dst);
}
-#else
-;
-#endif
-
-#ifdef CONFIG_KERNELD
-extern struct rtable * ip_rt_route(__u32 daddr, int local);
-#else
-extern __inline__ struct rtable * ip_rt_route(__u32 daddr, int local)
-#ifndef MODULE
+
+static __inline__ char rt_tos2priority(u8 tos)
{
- struct rtable * rth;
+ if (tos & IPTOS_LOWDELAY)
+ return SOPRI_INTERACTIVE;
+ if (tos & (IPTOS_THROUGHPUT|IPTOS_MINCOST))
+ return SOPRI_BACKGROUND;
+ return SOPRI_NORMAL;
+}
- ip_rt_fast_lock();
- for (rth=ip_rt_hash_table[ip_rt_hash_code(daddr)^local]; rth; rth=rth->rt_next)
- {
- if (rth->rt_dst == daddr)
- {
- rth->rt_lastuse = jiffies;
- atomic_inc(&rth->rt_use);
- atomic_inc(&rth->rt_refcnt);
- ip_rt_unlock();
- return rth;
- }
- }
- return ip_rt_slow_route (daddr, local);
+static __inline__ int ip_route_connect(struct rtable **rp, u32 dst, u32 src, u32 tos)
+{
+ int err;
+ err = ip_route_output(rp, dst, src, tos, NULL);
+ if (err || (dst && src))
+ return err;
+ dst = (*rp)->rt_dst;
+ src = (*rp)->rt_src;
+ ip_rt_put(*rp);
+ *rp = NULL;
+ return ip_route_output(rp, dst, src, tos, NULL);
}
-#else
-;
-#endif
-#endif
-extern __inline__ struct rtable * ip_check_route(struct rtable ** rp,
- __u32 daddr, int local)
+static __inline__ void ip_ll_header(struct sk_buff *skb)
{
- struct rtable * rt = *rp;
-
- if (!rt || rt->rt_dst != daddr || !(rt->rt_flags&RTF_UP)
- || ((local==1)^((rt->rt_flags&RTF_LOCAL) != 0)))
- {
- ip_rt_put(rt);
- rt = ip_rt_route(daddr, local);
- *rp = rt;
- }
- return rt;
-}
+ struct rtable *rt = (struct rtable*)skb->dst;
+ struct device *dev = rt->u.dst.dev;
+ struct hh_cache *hh = rt->u.dst.hh;
+ int hh_len = dev->hard_header_len;
+
+ skb->dev = dev;
+ skb->arp = 1;
+ skb->protocol = htons(ETH_P_IP);
+
+ if (hh) {
+ memcpy(skb_push(skb, hh_len), hh->hh_data, hh_len);
+ skb->arp = hh->hh_uptodate;
+ } else if (dev->hard_header &&
+ dev->hard_header(skb, dev, ETH_P_IP, NULL, NULL, 0)<0)
+ skb->arp = 0;
+
+ skb->mac.raw = skb->data;
+}
#endif /* _ROUTE_H */