路由表(FIB)内容的生成(一)
来源:互联网 发布:新开淘宝店怎么装修 编辑:程序博客网 时间:2024/06/07 04:11
前面已经讲到过路由表的初始化,路由表是一个比较复杂的数据结构,一下子并不好理解。下面我们通过模块初始化时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地址,最多会向路由表加入五个路由项,第一个是主机地址,第二个是广播地址,后面三个暂时不是很清楚
每一个网络设备接口在启动时或者模块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地址,最多会向路由表加入五个路由项,第一个是主机地址,第二个是广播地址,后面三个暂时不是很清楚
- 路由表(FIB)内容的生成(一)
- 两张路由表(FIB)的内容
- 路由表(FIB)的初始化
- 路由表(FIB)详解
- 路由表 FIB表 快速转发表
- 路由表 (RIB) 与转发表 (FIB)
- linux内核 路由fib表之数据结构
- linux内核 路由fib表之初始化
- linux内核 路由fib表之创建
- linux内核 路由fib表之删除
- 路由表与FIB, arp fdb
- 9、路由表的内容
- linux内核 路由fib表之输入查找
- linux内核 路由fib表之输出查找
- 路由表的生成算法
- 路由表的生成算法
- FIB表
- 简要介绍路由表以及路由表的生成
- CC COUPON(Online Shopping-裸DP)
- (九)模板方法模式详解(包含与类加载器不得不说的故事)
- C++ 初始化列表
- 在hibernate中使用Oracle序列注意事项
- 更高效的加载大图片
- 路由表(FIB)内容的生成(一)
- (十)装饰器模式详解(与IO不解的情缘)
- 网摘列表
- 获取日程年份列表、日志年份列表所有的年份
- 【触发器和存储过程】
- jsp中将图片当作按钮提交表单
- pku 1742 Coins(多重背包dp)
- (十一)外观模式详解(Service第三者插足,让action与dao分手)
- 位运算实现两个值交换(swap)