linux路由表生成,路由表(FIB)内容的生成(一)

前面已经讲到过路由表的初始化,路由表是一个比较复杂的数据结构,一下子并不好理解。下面我们通过模块初始化时Linux的notify机制所触发的网络设备事件回调myfib_netdev_event,来逐步分析如何向FIB插入路由项,来进一步理解FIB。

每一个网络设备接口在启动时或者模块my_inet被插入到内核空间时,都会有NETDEV_UP事件发生,通知内核,设备启动。

myfib_netdev_event函数处理该事件,对该网络设备接口上的每一个IP地址调用myfib_add_ifaddr函数,向路由表插入路由

项。

比如网络设备接口eth0上有一个IP地址172.16.48.11,为从属地址,其子网掩码是255.255.255.0(注:这是一个B类地址,子网号和主机号都是8bit宽)。那么代表该IP地址的结构体struct in_ifaddr的内容如下所示:

struct in_ifaddr

{

struct in_ifaddr    *ifa_next;

struct in_device    *ifa_dev;

struct rcu_head     rcu_head;

u32         ifa_local = 172.16.48.11;

u32         ifa_address =172.16.48.11;

u32         ifa_mask = 255.255.255.0;

u32         ifa_broadcast = 172.16.48.255;

u32         ifa_anycast = 0;

unsigned char       ifa_scope = RT_SCOPE_UNIVERSE;

unsigned char       ifa_flags = IFA_F_SECONDARY;

unsigned char       ifa_prefixlen = 24;

char            ifa_label[IFNAMSIZ] = "eth0";

};

myfib_add_ifaddr函数首先要确保在eth0接口上至少有一个跟其同类型的primary地址。否则出错,因为在插入路由表时,该primary地址是有用的。然后,将该地址加入路由表,类型为RTN_LOCAL。

如果该网络设备没有开启,我们到此结束,返回,否则继续。

如果有广播地址,并且不是受限的广播地址(发向255.255.255.255广播地址的数据包永远不会被转发,称为受限的广播),则将广播地址加入路由表(172.16.48.255),类型为RTN_BROADCAST。

如果网络号不为零(网络号为零,用于BOOTTP协议),并且是primary地址,并且主机号不为零或者子网掩码不为255.255.255.255。

则把172.16.48.0(去掉主机号)加入FIB,如果为环回地址,则类型为RTN_LOCAL,否则为RTN_UNICAST。

如果子网掩码不为255.255.255.255,则再加入两个类型为RTN_BROADCAST的地址172.16.48.255, 172.16.48.0。

这样一来,对于网络设备接口上的一个IP地址,最多会向路由表加入五个路由项,第一个是主机地址,第二个是广播地址,后面三个暂时不是很清楚。

阅读(2221) | 评论(0) | 转发(1) |

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值