- 论坛徽章:
- 0
|
978计划工作组 2009-11-3
1函数源码
struct rtable
{
union
{
struct dst_entry dst;
} u;
/* Cache lookup keys */
struct flowi fl;
struct in_device *idev;
int rt_genid;
unsigned rt_flags;
__u16 rt_type;
__be32 rt_dst; /* Path destination */
__be32 rt_src; /* Path source */
int rt_iif;
/* Info on neighbour */
__be32 rt_gateway;
/* Miscellaneous cached information */
__be32 rt_spec_dst; /* RFC1122 specific destination */
struct inet_peer *peer; /* long-living peer info */
};
2结构用途
路由相关的信息。
3语句注释
3.1 成员注释
u :。
struct flowi fl :查找该路由节点的哈希值,该哈希值用源IP,目的地址,TOS一起确定。
struct in_device *idev:该指针指向egress设备的IP配置块。
int rt_genid:
unsigned rt_flags:一组标志位,按目的入口查询的执行顺序:如果路由使用本地环回接口,则rt_flags上加标志RTCF_LOCAL如果路由结果类型是广播,则加标志RTCF_BROADCAST和RTCF_LOCAL如果结果是组播,则加标志RTCF_MULTICAST和 RTCF_LOCAL,该标志最终决定了目的入口使用哪一个IP数据报输入函数和输出函数如果是RTCF_LOCAL,则使用输入函数ip_local_deliver()如果是RTCF_BROADCAST或RTCF_MULTICAST,并且带有RTCF_LOCAL标志,并且输出设备不是环回接口设备,则使用输出函数ip_mc_output(),否则使用输出函数ip_output()
__u16 rt_type:路由类型,如果路由是LOOPBACK,则置类型为RTN_LOCAL,单播路由类型为RTN_UNICAST,如果目的地址为 0xFFFFFFFF,则路由类型为RTN_BROADCAST,如果目的地址是组播地址,则路由类型为RTN_MULTICAST。rt_type跟 rt_flags关系比较密切。
__be32 rt_dst:路由的目的地址。
__be32 rt_src:路由的源地址。
int rt_iif:路由的输入设备接口的索引号。
__be32 rt_gateway:存放网关信息,用做下一跳的地址。
__be32 rt_spec_dst:首选源地址,首选源地址的选择:添加到路由缓存内的路由项是单向的,表示对于朝着被路由报文源IP地址的反方向上的流量,不能使用该路由项来进行路由。但是在一些情况下,接收到报文可能触发一个动作,要求本地主机选择一个源IP地址,以便在向发送方回送报文时使用。这个地址,即首选(preferred)源IP地址,必须与路由该ingress(接受包)报文的路由缓存表项保存在一起。首选源IP地址被保存在rt_spec_dst字段内,下面是使用该地址的两种情况:(1)ICMP:当一个主机接收到一个ICMP ECHO REQUEST消息时(人们常用的ping命令通常生成这种消息),如果主机没有明确配置为不作出回应,则该主机返回一个ICMPECHO REPLY消息。对该ingress ICMP ECHO REQUEST消息选择路由,路由项的rt_spec_dst被用作路由ICMP ECHO REPLY消息而进行路由查找的源地址。参见net/ipv4/icmp.c文件内的icmp_reply。在net/ipv4/ip_output.c文件内的ip_send_reply函数做法与之类似。(2)IP选项:一些IP选项要求源地址和目的地址中间的主机将它们接收该报文接口的IP地址写入IP头内,Linux写入的地址是rt_spec_dst。
struct inet_peer *peer:inet_peer结构存储有关IP peer的long-living信息,IP peer是该缓存路由项的目的IP地址对应的主机。与本地主机在最近一段时间通信的每个远端IP地址都有一个inet_peer结构。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/100948/showart_2085409.html |
|