分类: LINUX
2008-04-08 09:34:21
ip_route_input 相关的理解
ToS (RFC 1349)
要实现QoS,首先就要对数据进行分类,而且分类标志就要在IP头的字段中,方便路由设备识别。对于
IPv4包来说,有一个字段是用于描述数据包服务类型的,就是ToS(Type of Service)字段,8位,在
RFC791中,该字段几乎还没有很明确的功能描述,可能是太超前了吧,当时还想不到会有扫描用。真
正开始描述ToS字段的是RFC1349。
ToS的取值不是任意的,在RFC1349中定义如下:
76543210
00010000 -- minimize delay 0x10
00001000 -- maximize throughput 0x08
00000100 -- maximize reliability 0x04
00000010 -- minimize monetary cost 0x02
00000000 -- normal service 0x00
minimize delay:最小延迟,如telnet,FTP等
maximize throughput:最大吞吐量,如FTP的数据通道等
maximize reliability:最大可靠性,如SNMP等
minimize monetary cost:最小费用,如NNTP等
上面这4位最多只能有一位为1,最后一位必须为0。前3位用来表示数据优先级,但在一般网络实现中很
少用,也一般为0,而在NetScreen防火墙中,使用ToS的前3位作为数据优先权的表示,所以可以设置0
~7共8个优先级。
RFC1349定义的ToS功能相对较弱,不过不少路由协议如OSPF都可以根据ToS进行路由决策。
在IPv6(RFC2460)中,也有一个8位字段Traffic Class,用于区分数据优先级,但功能定义不遵守
RFC1349。
IPTOS_TOS_MASK 定义为0x1E IPTOS_TOS_MASK & ~3后,IPTOS_TOS_MASK = 11100
在RFC 1349中规定的tos域的结构如下:
0 1 2 3 4 5 6 7 8
+-----+-----+-----+-----+-----+-----+-----+-----+
| | | |
| PRECEDENCE | TOS | MBZ |
| | | |
+-----+-----+-----+-----+-----+-----+-----+-----+
1. Route Cache Hash结构定义如下:
struct rt_hash_bucket {
struct rtable *chain;
/* lock用来并发访问用*/
rwlock_t lock;
} __attribute__((__aligned__(8)));
在对Hash进行并发写操作时, write_lock_bh(&rt_hash_table[hash].lock);
对Route Cache Hash初始化是如下代码:
goal = num_physpages >> (26 - PAGE_SHIFT);
for (order = 0; (1UL << order) < goal; order++)
/* NOTHING */;
do {
/*rt_hash_mask代表分配的rt_hash_bucket的数*/
rt_hash_mask = (1UL << order) * PAGE_SIZE /
sizeof(struct rt_hash_bucket);
while (rt_hash_mask & (rt_hash_mask - 1))
rt_hash_mask--;
rt_hash_table = (struct rt_hash_bucket *)
__get_free_pages(GFP_ATOMIC, order);
/*如果无法分配预期的内存空间,则递减要申请的内存页*/
} while (rt_hash_table == NULL && --order > 0);
if (!rt_hash_table)
panic("Failed to allocate IP route cache hash table\n");
printk(KERN_INFO "IP: routing cache hash table of %u buckets, %ldKbytes\n",
rt_hash_mask,
(long) (rt_hash_mask * sizeof(struct rt_hash_bucket)) / 1024);
for (rt_hash_log = 0; (1 << rt_hash_log) != rt_hash_mask; rt_hash_log++)
/* NOTHING */;
rt_hash_mask--;
for (i = 0; i <= rt_hash_mask; i++) {
rt_hash_table[i].lock = RW_LOCK_UNLOCKED;
rt_hash_table[i].chain = NULL;
}
初始化分配的hash entry number (假设为N)系统物理内存大小分配.则N个hash entry总共占用系统内存的1/16384
因此在4G内存下初始化分配route cache为256k.dmesg可以看到有如下:
IP: routing cache hash table of 4096 buckets, 64Kbytes
而在1G内存情况下,则应该为64k