|
|
1.1 ! root 1: /* ! 2: * INET An implementation of the TCP/IP protocol suite for the LINUX ! 3: * operating system. INET is implemented using the BSD Socket ! 4: * interface as the means of communication with the user level. ! 5: * ! 6: * Definitions for the IP router. ! 7: * ! 8: * Version: @(#)route.h 1.0.4 05/27/93 ! 9: * ! 10: * Authors: Ross Biro, <[email protected]> ! 11: * Fred N. van Kempen, <[email protected]> ! 12: * Fixes: ! 13: * Alan Cox : Reformatted. Added ip_rt_local() ! 14: * Alan Cox : Support for TCP parameters. ! 15: * Alexey Kuznetsov: Major changes for new routing code. ! 16: * Elliot Poger : Added support for SO_BINDTODEVICE. ! 17: * Wolfgang Walter, ! 18: * Daniel Ryde, ! 19: * Ingo Molinar : fixed bug in ip_rt_put introduced ! 20: * by SO_BINDTODEVICE support causing ! 21: * a memory leak ! 22: * ! 23: * FIXME: ! 24: * Make atomic ops more generic and hide them in asm/... ! 25: * ! 26: * This program is free software; you can redistribute it and/or ! 27: * modify it under the terms of the GNU General Public License ! 28: * as published by the Free Software Foundation; either version ! 29: * 2 of the License, or (at your option) any later version. ! 30: */ ! 31: #ifndef _ROUTE_H ! 32: #define _ROUTE_H ! 33: ! 34: #include <linux/config.h> ! 35: ! 36: /* ! 37: * 0 - no debugging messages ! 38: * 1 - rare events and bugs situations (default) ! 39: * 2 - trace mode. ! 40: */ ! 41: #define RT_CACHE_DEBUG 0 ! 42: ! 43: #define RT_HASH_DIVISOR 256 ! 44: #define RT_CACHE_SIZE_MAX 256 ! 45: ! 46: #define RTZ_HASH_DIVISOR 256 ! 47: ! 48: #if RT_CACHE_DEBUG >= 2 ! 49: #define RTZ_HASHING_LIMIT 0 ! 50: #else ! 51: #define RTZ_HASHING_LIMIT 16 ! 52: #endif ! 53: ! 54: /* ! 55: * Maximal time to live for unused entry. ! 56: */ ! 57: #define RT_CACHE_TIMEOUT (HZ*300) ! 58: ! 59: /* ! 60: * Prevents LRU trashing, entries considered equivalent, ! 61: * if the difference between last use times is less then this number. ! 62: */ ! 63: #define RT_CACHE_BUBBLE_THRESHOLD (HZ*5) ! 64: ! 65: #include <linux/route.h> ! 66: ! 67: #ifdef __KERNEL__ ! 68: #define RTF_LOCAL 0x8000 ! 69: #endif ! 70: ! 71: struct rtable ! 72: { ! 73: struct rtable *rt_next; ! 74: __u32 rt_dst; ! 75: __u32 rt_src; ! 76: __u32 rt_gateway; ! 77: atomic_t rt_refcnt; ! 78: atomic_t rt_use; ! 79: unsigned long rt_window; ! 80: atomic_t rt_lastuse; ! 81: struct hh_cache *rt_hh; ! 82: struct device *rt_dev; ! 83: unsigned short rt_flags; ! 84: unsigned short rt_mtu; ! 85: unsigned short rt_irtt; ! 86: unsigned char rt_tos; ! 87: }; ! 88: ! 89: extern void ip_rt_flush(struct device *dev); ! 90: extern void ip_rt_update(int event, struct device *dev); ! 91: extern void ip_rt_redirect(__u32 src, __u32 dst, __u32 gw, struct device *dev); ! 92: extern struct rtable *ip_rt_slow_route(__u32 daddr, int local, struct device *dev); ! 93: extern struct device *ip_rt_dev(__u32 addr); ! 94: extern int rt_get_info(char * buffer, char **start, off_t offset, int length, int dummy); ! 95: extern int rt_cache_get_info(char *buffer, char **start, off_t offset, int length, int dummy); ! 96: extern int ip_rt_ioctl(unsigned int cmd, void *arg); ! 97: extern int ip_rt_new(struct rtentry *rt); ! 98: extern int ip_rt_kill(struct rtentry *rt); ! 99: extern void ip_rt_check_expire(void); ! 100: extern void ip_rt_advice(struct rtable **rp, int advice); ! 101: ! 102: extern void ip_rt_run_bh(void); ! 103: extern atomic_t ip_rt_lock; ! 104: extern unsigned ip_rt_bh_mask; ! 105: extern struct rtable *ip_rt_hash_table[RT_HASH_DIVISOR]; ! 106: extern void rt_free(struct rtable * rt); ! 107: ! 108: extern __inline__ void ip_rt_fast_lock(void) ! 109: { ! 110: atomic_inc(&ip_rt_lock); ! 111: } ! 112: ! 113: extern __inline__ void ip_rt_fast_unlock(void) ! 114: { ! 115: atomic_dec(&ip_rt_lock); ! 116: } ! 117: ! 118: extern __inline__ void ip_rt_unlock(void) ! 119: { ! 120: if (atomic_dec_and_test(&ip_rt_lock) && ip_rt_bh_mask) ! 121: ip_rt_run_bh(); ! 122: } ! 123: ! 124: extern __inline__ unsigned ip_rt_hash_code(__u32 addr) ! 125: { ! 126: unsigned tmp = addr + (addr>>16); ! 127: return (tmp + (tmp>>8)) & 0xFF; ! 128: } ! 129: ! 130: ! 131: extern __inline__ void ip_rt_put(struct rtable * rt) ! 132: #ifndef MODULE ! 133: { ! 134: /* If this rtable entry is not in the cache, we'd better free ! 135: * it once the refcnt goes to zero, because nobody else will. ! 136: */ ! 137: if (rt&&atomic_dec_and_test(&rt->rt_refcnt)&&(rt->rt_flags&RTF_NOTCACHED)) ! 138: rt_free(rt); ! 139: } ! 140: #else ! 141: ; ! 142: #endif ! 143: ! 144: #ifdef CONFIG_KERNELD ! 145: extern struct rtable * ip_rt_route(__u32 daddr, int local, struct device *dev); ! 146: #else ! 147: extern __inline__ struct rtable * ip_rt_route(__u32 daddr, int local, struct device *dev) ! 148: #ifndef MODULE ! 149: { ! 150: struct rtable * rth; ! 151: ! 152: ip_rt_fast_lock(); ! 153: ! 154: for (rth=ip_rt_hash_table[ip_rt_hash_code(daddr)^local]; rth; rth=rth->rt_next) ! 155: { ! 156: /* If an interface is specified, make sure this route points to it. */ ! 157: if ( (rth->rt_dst == daddr) && ((dev==NULL) || (dev==rth->rt_dev)) ) ! 158: { ! 159: rth->rt_lastuse = jiffies; ! 160: atomic_inc(&rth->rt_use); ! 161: atomic_inc(&rth->rt_refcnt); ! 162: ip_rt_unlock(); ! 163: return rth; ! 164: } ! 165: } ! 166: return ip_rt_slow_route (daddr, local, dev); ! 167: } ! 168: #else ! 169: ; ! 170: #endif ! 171: #endif ! 172: ! 173: extern __inline__ struct rtable * ip_check_route(struct rtable ** rp, __u32 daddr, ! 174: int local, struct device *dev) ! 175: { ! 176: struct rtable * rt = *rp; ! 177: ! 178: if (!rt || rt->rt_dst != daddr || !(rt->rt_flags&RTF_UP) || (dev!=NULL) ! 179: || ((local==1)^((rt->rt_flags&RTF_LOCAL) != 0))) ! 180: { ! 181: ip_rt_put(rt); ! 182: rt = ip_rt_route(daddr, local, dev); ! 183: *rp = rt; ! 184: } ! 185: return rt; ! 186: } ! 187: ! 188: ! 189: #endif /* _ROUTE_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.