Chinaunix首页 | 论坛 | 博客
  • 博客访问: 536593
  • 博文数量: 120
  • 博客积分: 3030
  • 博客等级: 中校
  • 技术积分: 1445
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-05 01:00
文章存档

2011年(1)

2009年(2)

2008年(32)

2007年(33)

2006年(52)

我的朋友

分类: 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   |  
                            |                                   |                                               |           |  
                            +-----+-----+-----+-----+-----+-----+-----+-----+  
   
  PRECEDENCE是优先级,没有使用。MBZ("must   be   zero")始终为0;真正的tos就在3~7位存放。这里用11100来与tos来得到tos的内容可能是根据81年版的RFC791,在那个版本(RFC791)中tos只用了3~6位,最后面的两位都是置0,符合这里的用11100的掩码来得到tos的做法。或者就是说不考虑最小费用这个域,也可以用11100的掩码来得到tos的内容。  

 

 

 

 

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

阅读(5891) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~