[百度分享]Bonding 模块代码及主要工作模式分析(2)解决办法
发布时间:2011-06-27 17:47:01 文章来源:www.iduyao.cn 采编人员:星星草
[百度分享]Bonding 模块代码及主要工作模式分析(2)
5. 代码分析
1. 关键数据结构
1. struct bond_params
文件:driver/net/bonding/Bonding.h
该结构是全局结构(每系统一个),对应于加载bonding模块时传入的各个参数
主要成员:
名称 类型 含义
mode int Bonding模块工作模式
BOND_MODE_ROUNDROBIN balance-rr模式
BOND_MODE_ACTIVEBACKUP active-backup模式
BOND_MODE_XOR balance-xor模式
BOND_MODE_BROADCAST broadcast模式
BOND_MODE_8023AD IEEE 802.3ad动态链路聚合模式
BOND_MODE_TLB 自适应传输负载均衡模式
BOND_MODE_ALB 自适应负载均衡模式
miimon int 使用MII链路状态监控时的时间间隔(ms)
arp_interval int 使用arp链路状态监控时的时间间隔(ms)
use_carrier int 使用MII链路状态监控时是否使用更新的carrier调用
updelay int 使用MII链路状态监控时从BACK状态切换到UP状态的时延(ms)
downdelay int 使用MII链路状态监控时从FAIL状态切换到DOWN状态的时延(ms)
primary char[] 用来在active-backup、balance-tlb和balance-alb模式中指定主网卡
arp_targets u32[] 在ARP链路状态监控中将向这些IP地址发送ARP请求。
2. struct slave
文件:driver/net/bonding/Bonding.h
每一个被管辖的物理网卡对应一个该数据结构的实例
主要成员:
名称 类型 含义
dev struct net_device* 指向被绑定的物理网卡
next,prev struct slave * 所有的slave数据结构通过这两个指针双向链接到一起形成*循环*链表
delay s16 用于保存MII链路状态监控和ARP链路状态监控的时延值。
jiffies u32 用于active-backup模式下的ARP状态监控
link s8 表示对应网卡的链路状态,取下列四个值之一:
BOND_LINK_UP 上线状态
BOND_LINK_DOWN 故障状态
BOND_LINK_FAIL 网卡出现故障,状态BOND_LINK_DOWN切换中
BOND_LINK_BACK 网卡恢复,状态BOND_LINK_UP切换中
state s8 表示对应网卡活动状态,取下列两个值之一:
BOND_STATE_ACTIVE 活动状态
BOND_STATE_BACKUP 后备状态
original_flags u32 保存被绑定物理网卡原来的flags
perm_hwaddr u8[] 保存被绑定物理网卡原来的MAC地址
ad_info struct
ad_slave_info
记录IEEE 802.3ad动态链路聚合模式下的“每网卡”相关状态信息
tlb_info struct tlb_slave_info 记录自适应传输负载均衡模式下的“每网卡”相关状态信息
link_failure_count u32 网卡从BOND_LINK_FAIL切换到BOND_LINK_DOWN的次数
speed u16 记录网卡的传输速度(10M/100M/1000G)
duplex u8 网卡工作模式(全双工?)
3. struct bonding
文件:driver/net/bonding/Bonding.h
每一个虚拟网卡对应一个该数据结构的实例。
主要成员:
名称 类型 含义
dev struct net_device* 指向虚拟网卡(例如bond0、bond1等等)
first_slave struct slave * 指向被绑定的第一个物理网卡对应的slave结构。
curr_active_slave struct slave * 指向当前活动的网卡对应的slave结构,在不同的工作模式下有不同的含义。
current_arp_slave struct slave * 用于ARP状态监控(只用于bond_activebackup_arp_mon)
primary_slave struct slave * 如果使用BOND_MODE_ACTIVEBACKUP、BOND_MODE_TLB或者BOND_MODE_ALB模式,则指向主物理网卡对应的slave结构(primary_slave)
slave_cnt s32 虚拟网卡所管辖的物理网络接口的个数
lock rwlock_t 每一个虚拟网卡管辖一系列物理网卡,每一个物理网卡对应一个slave结构,所有的slave被放在一个链表中,这个读写锁用来保护该链表。
curr_slave_lock rwlock_t 用来保护curr_active_slave的读写锁。
mii_timer struct timer_list 用于MII链路状态监控的定时器
arp_timer struct timer_list 用于ARP链路状态监控的定时器
kill_timers s8 如果该标志置位,所有的计时器超时后就不再重新设置,从而可以被安全删除
bond_list struct list_head 通过该结构,所有的bonding数据结构被连接为双向链表,链表头是全局变量bond_dev_list。
2. 关键函数
本节描述了bonding模块关键函数的操作流程,这些函数是基本的原子模块,其他没有被列举的函数仅仅是对这些函数的简单包装。
1. 模块初始化/释放
1. 初始化
* bonding_init
原型:
static int __init bonding_init(void)
bonding_init作为bonging模块的初始化函数,在模块被加载时被调用。它主要做如下工作:
1. 调用函数bond_check_params解析传入模块的参数并检查其合法性,结果放入数据结构params中。其中params是一个类型为bond_params的全局变量。
2. 如果内核支持proc文件系统,调用bond_create_proc_dir在/proc/net下创建目录/proc/net/bonding。
3. 如果传入参数指定了bond设备的个数(通过参数max_bonds),则通过下列步骤创建max_bonds个bond设备(从bond0到bondN)
1. 调用alloc_netdev和dev_alloc_name创建网络设备,指定每一个设备的私有数据是一个bonding结构(dev->priv)。
2. 为每一个新创建的虚拟网络设备调用bond_init函数。
3. 调用register_netdevice注册这个新创建的网络设备。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
在ubuntu下怎么播放swf 和csf 文件?
虽然,firefox 可以播放swf文件,但是没有托动条。
在ubuntu下怎么播放swf和 csf文件?
哪个高...
-
2011年最新录制的Linux(CentOS)视频教程
电驴地址:http://www.verycd.com/topics/2875873/
------解决方案--------------------
l...
-
求《操作系统:设计与实现》pdf
A.S.Tanenbaum写的《操作系统设计与实现》,有上下册,谁有的,帮个忙,非常感谢。qifeifei@live.cn
----...
-
linux用户态内存的物理地址问题?
小弟我看linux内存管理一段时间了。有一个问题一直不解。 linux用户态进程使用0—3G的线性地址...
-
安装linux chm阅读器 xchm
[root@localhost ~]# yum install chmlib
[root@localhost ~]# yum install wxGTK
[root@localhost ~]...
-
都说Linux是开源的,在哪可以找到Linux的源码?
都说Linux是开源的,在哪可以找到Linux的源码?
烦请各位高手指点一二,谢谢。
------解决...
-
求解2个概念,书上没找到,急用,谢谢大家
1.Unix中磁盘文件和设备文件的异同点。
2.Unix中原子和竞争的概念。
求正解,因为考试可能会考...
-
有人在fedora 10下安装 oracle database 11g,没有呀?提供个安装步骤
有人在fedora 10下安装 oracle database 11g,没有呀?提供个安装...
-
用什么学习函数库?
我们现在学习LINUX 编程,读程序时候有很多头文件,代码中有许多库函数。
#include <sys/types.h>
#include <wait....
-
linux下c语言写的shell,花了不少时间写得 有兴趣的可以看看,本人linux初学者
http://download.csdn.net/source/2799757
------解...