Linux 内核路由发现演变
发布时间:2021-11-24 19:07:12 所属栏目:教程 来源:互联网
导读:简单来讲fn_hash_lookup这个函数通过在一张路由表(struct fib_table)中,根据查询路由的目的IP地址(key)在其路由哈希表(struct fn_hash)中找到一个路由域(struct fn_zone),并在路由域中匹配到一个key相等的路由节点(struct fib_node),取其路由别名(struct
|
简单来讲fn_hash_lookup这个函数通过在一张路由表(struct fib_table)中,根据查询路由的目的IP地址(key)在其路由哈希表(struct fn_hash)中找到一个路由域(struct fn_zone),并在路由域中匹配到一个key相等的路由节点(struct fib_node),取其路由别名(struct fib_alias)和路由信息(struct fib_info),生成一个路由查询结果(struct fib_result)。 路由查询结果还不能直接供发送IP数据报使用,接下来,还必须根据这个查询结果生成一个路由目的入口(dst_entry),根据目的入口才可以发送IP数据报,目的入口用结构体struct dst_entry表示,在实际使用时,还在它的外面包装了一层,形成一个结构体struct rtable。 struct rtable的定义如下: struct rtable { union{ struct dst_entry dst; struct rtable *rt_next; }u; struct in_device *idev; unsigned rt_flags; __u16 rt_type; __u16 rt_multipath_alg; __u32 rt_dst; __u32 rt_src; int rt_iif; __u32 rt_gateway; struct flowi fl; __u32 rt_spec_dst; struct inet_peer *peer; }; 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。 rt_type是路由类型,如果路由是LOOPBACK,则置类型为RTN_LOCAL,单播路由类型为RTN_UNICAST,如果目的地址为0xFFFFFFFF,则路由类型为RTN_BROADCAST,如果目的地址是组播地址,则路由类型为RTN_MULTICAST。rt_type跟rt_flags关系比较密切。 rt_multipath_alg跟路由多路径相关,暂时略过。rt_dst是路由的目的地址,rt_src是路由的源地址,rt_iif是路由的输入设备接口的索引号。rt_gateway是路由网关的IP地址。 在试验环境中,网络设备接口mylo的IP地址是127.10.0.1,它在内核中的表示是struct net_device myloopback_dev,测试程序往IP地址127.10.0.1发送DUMMY协议的数据报,协议栈为其生成的路由目的入口如下: the dst_entry: the dev name: mylo the error: 0 the obsolete: 0 the flag: DST_HOST expires: 0, now: 110343 header len: 0 rt_flag: RTCF_LOCAL rt_type: RTN_LOCAL rt_dst: 127.10.0.1 rt_src: 127.10.0.1 rt_iif: 4 rt_gateway: 127.10.0.1 rt_spec_dst: 127.10.0.1 试验环境中的网络设备接口eth0的IP地址是172.16.48.2,测试程序往该IP地址所在子网内的IP地址172.16.48.1发送DUMMY协议的数据报,协议栈为其生成的路由目的入口如下: the dst_entry: the dev name: eth0 the error: 0 the obsolete: 0 the flag: DST_HOST expires: 0, now: 850858 header len: 0 rt_flag: 0 rt_type: RTN_UNICAST rt_dst: 172.16.48.1 rt_src: 172.16.48.2 rt_iif: 2 rt_gateway: 172.16.48.1 rt_spec_dst: 172.16.48.2 ![]() (编辑:济南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |





