⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 route.h

📁 GNU Mach 微内核源代码, 基于美国卡内基美隆大学的 Mach 研究项目
💻 H
字号:
/* * INET		An implementation of the TCP/IP protocol suite for the LINUX *		operating system.  INET  is implemented using the  BSD Socket *		interface as the means of communication with the user level. * *		Definitions for the IP router. * * Version:	@(#)route.h	1.0.4	05/27/93 * * Authors:	Ross Biro, <bir7@leland.Stanford.Edu> *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> * Fixes: *		Alan Cox	:	Reformatted. Added ip_rt_local() *		Alan Cox	:	Support for TCP parameters. *		Alexey Kuznetsov:	Major changes for new routing code. *              Elliot Poger    :       Added support for SO_BINDTODEVICE. *		Wolfgang Walter, *		Daniel Ryde, *		Ingo Molinar	:	fixed bug in ip_rt_put introduced *					by SO_BINDTODEVICE support causing *					a memory leak * *	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 *		2 of the License, or (at your option) any later version. */#ifndef _ROUTE_H#define _ROUTE_H#include <linux/config.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/* * Maximal time to live for unused entry. */#define RT_CACHE_TIMEOUT		(HZ*300)/* * 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)#include <linux/route.h>#ifdef __KERNEL__#define RTF_LOCAL 0x8000#endifstruct 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;};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, struct device *dev);extern struct device	*ip_rt_dev(__u32 addr);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);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];extern void	 	rt_free(struct rtable * rt);extern __inline__ void ip_rt_fast_lock(void){	atomic_inc(&ip_rt_lock);}extern __inline__ void ip_rt_fast_unlock(void){	atomic_dec(&ip_rt_lock);}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;}extern __inline__ void ip_rt_put(struct rtable * rt)#ifndef MODULE{	/* If this rtable entry is not in the cache, we'd better free	 * it once the refcnt goes to zero, because nobody else will.	 */	if (rt&&atomic_dec_and_test(&rt->rt_refcnt)&&(rt->rt_flags&RTF_NOTCACHED))		rt_free(rt);}#else;#endif#ifdef CONFIG_KERNELDextern struct rtable * ip_rt_route(__u32 daddr, int local, struct device *dev);#elseextern __inline__ struct rtable * ip_rt_route(__u32 daddr, int local, struct device *dev)#ifndef MODULE{	struct rtable * rth;	ip_rt_fast_lock();	for (rth=ip_rt_hash_table[ip_rt_hash_code(daddr)^local]; rth; rth=rth->rt_next)	{		/* If an interface is specified, make sure this route points to it. */		if ( (rth->rt_dst == daddr) && ((dev==NULL) || (dev==rth->rt_dev)) )		{			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, dev);}#else;#endif#endifextern __inline__ struct rtable * ip_check_route(struct rtable ** rp, __u32 daddr, 						 int local, struct device *dev){	struct rtable * rt = *rp;	if (!rt || rt->rt_dst != daddr || !(rt->rt_flags&RTF_UP) || (dev!=NULL)	    || ((local==1)^((rt->rt_flags&RTF_LOCAL) != 0)))	{		ip_rt_put(rt);		rt = ip_rt_route(daddr, local, dev);		*rp = rt;	}	return rt;}	#endif	/* _ROUTE_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -