|
|
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:
1.1.1.2 ! root 108: static __inline__ void ip_rt_fast_lock(void)
1.1 root 109: {
110: atomic_inc(&ip_rt_lock);
111: }
112:
1.1.1.2 ! root 113: static __inline__ void ip_rt_fast_unlock(void)
1.1 root 114: {
115: atomic_dec(&ip_rt_lock);
116: }
117:
1.1.1.2 ! root 118: static __inline__ void ip_rt_unlock(void)
1.1 root 119: {
120: if (atomic_dec_and_test(&ip_rt_lock) && ip_rt_bh_mask)
121: ip_rt_run_bh();
122: }
123:
1.1.1.2 ! root 124: static __inline__ unsigned ip_rt_hash_code(__u32 addr)
1.1 root 125: {
126: unsigned tmp = addr + (addr>>16);
127: return (tmp + (tmp>>8)) & 0xFF;
128: }
129:
130:
1.1.1.2 ! root 131: static __inline__ void ip_rt_put(struct rtable * rt)
1.1 root 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
1.1.1.2 ! root 145: static struct rtable * ip_rt_route(__u32 daddr, int local, struct device *dev);
1.1 root 146: #else
1.1.1.2 ! root 147: static __inline__ struct rtable * ip_rt_route(__u32 daddr, int local, struct device *dev)
1.1 root 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:
1.1.1.2 ! root 173: static __inline__ struct rtable * ip_check_route(struct rtable ** rp, __u32 daddr,
1.1 root 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.