/* 解析:xie_minix */
[color=green]/* 概述:
* 该代码在FB中提供桥接功能,不过他只是在以太网接口上工作,能提供多个逻辑桥
* ,我们称为组,组是由一组有相同组ID的接口组成,组ID的范围在1到2^16-1之间.
* 打开桥的功能是通过sysctl net.link.ether.bridge=1来启动的.
* 而sysctl net.link.ether.bridge_cfg是把以太网接口进行分组的命令,如:
* sysctl net.link.ether.bridge_cfg="vr0:1,vr1:1,fxp0:2,fxp1:2" 该命令的结果
* 为网卡vr0和vr1可以进行相互通信,fxp0和fxp1之间可以互相转发,等于是分为俩组了.
* 但目前的该项设置还不能进行多组成员和单向控制,即一块卡可以为多个组的成员和某卡
* 与另外卡的数据单向流动.在本文中,我将结合代码来讲解如何实现以上的功能.
* 在本代码中,重要的数据结构是cluster_softc,他主要是记录一个组的接口所连接的机器
* 的硬件地址,该地址数组存储采用HASH算法,据我所知,4.4版和OpenBSD版的HASH函数算法根本不同,
* 我们在下面的代码分析过程中将看到,我也将讲解两个版本的不同之处,说实话,该算法我根本看
* 不懂(OpenBSD),估计该算法应该有相关的论文描述.
* 代码的学习顺序:
* 由于在if_ethersubr.c中的ether_input函数接到一数据包后,先查看bridge功能是否打开,
* 即判断全局变量do_bridge是否为1(该变量是由上面讲的sysctl来控制的),为真的话就调用
* 本文中的函数bridge_in(详细可看我写的"ethernet网络驱动代码详解"),所以在本文中的
* bridge_in函数是第一个被调用的.该函数的作用是在上面讲的哪个重要的数据结构中查找
* 目标地址要通过本机的哪块卡发送,当然其中还涉及到多播,广播和是否将网卡进行分组以
* 及是否发送方,目的方经过的本机网卡是否被分在同组中等,在完成后,如果成功找到了发送
* 到目的地机器和本机直接相连的网卡就返回该网卡的ifnet结构指针(该结构可连接所描述的卡
* 的所有信息,见我所写的"关于FreeBSD4.4网络源代码接口层数据结构ifnet分析说明"),然后
* if_ethersubr.c中的ether_input函数还要查看是否是发给本机的包,如果不是则调用本文的
* bridge_forward函数进行数据的转发,这就是本文的主要功能.和交换机的原理有点类似.
* 性能分析:
* 由于在进行桥转发的过程中,是一定要使网卡工作在混杂模式的,所以进行网桥工作的卡要选购
* 性能好的网卡,我个人觉得intel,3com等比较适合,其他的如rtl8139卡最好只用来做实验,不要
* 用于实际的工作中(如果要我说明原因,请看看他的驱动程序你就知道了,但单机上网没关系),另
* 外,PCI漕内不要其他的卡(如声卡等),我们知道,网卡驱动程序目前在BSD中工作于中断驱动模式,
* 也就是说,进来一个包就能产生一个中断,而中断的系统开销有多达大家可以查看内核代码,总之
* 是非常大,如果你是四块卡,而且担任网桥及一些过滤功能的话,肯定数据包通过量会比较大,那么
* 中断产生的频率是平常一块卡的十几甚至是几十倍(平常的卡一个是数据量不大,另一个是不在混
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 详解 源代码 原理 if 函数 NULL ifp 指针 网卡 结构 地址 |
注册
个人空间
