(BCM方案)Linux网桥的实现分析与使用.doc
-
资源ID:78781300
资源大小:909KB
全文页数:33页
- 资源格式: DOC
下载积分:20金币
快捷下载
![游客一键下载](/images/hot.gif)
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
(BCM方案)Linux网桥的实现分析与使用.doc
Linux网桥的实现和在BCM中的应用深圳市共进电子有限公司版权所有 不得复制2007年10月作者:陈万里目录简介21、LINUX桥的概念41.1、生成树算法和协议(翻译802.1D)41.1.1、拓扑信息的传播61.1.2、拓扑结构的改变导致重配71.1.3、通知拓扑改变71.1.4、端口状态(Port States)81.1.5、STP协议参数和时间值91.1.6、STP协议例子121.2、理解生成树(STP)协议121.2.1、以太网交换机在MAC层的体系结构121.2.2、生成树协议141.2.3结论171.3、桥用到的LINUX网络通知链171.4、生成树协议在LINUX中的实现172、桥代码中的重要数据结构182.1、BR_CONFIG_BPDU结构182.2、NET_BRIDGE结构192.3、NET_BRIDGE_PORT结构202.4、NET_DEVICE结构212.5、NET_BRIDGE、NET_BRIDGE_PORT、NET_DEVICE三个数据结构之间的关联25简介Linux网桥的实现和在BCM中的应用主要分析了linux2.4.x内核的网桥的实现方法,并且结合实际描述了Broadcom方案如何利用linux网桥,因为Broadcom方案用的是linux2.6.x内核,但是linux2.6.x内核在桥代码中只是多了Ebtables应用,其它并无变化,所以对于桥的研究在linux2.4.x内核中和linux2.6.x内核中并无差别。桥代码中很大一部分是STP(spanning-tree protocol)协议的实现,此文档也把STP协议(IEEE 802.1D)重要的部分翻译成了中文,并且也写了一些一步一步帮助读者去理解STP协议的文档,相信结合原版协议能很快理解STP协议的工作方式和它在linux操作系统中怎样和桥其它相关代码结合在一起使用的。桥代码是在linux操作系统中实现的,所以用到了一些和linux操作系统结合的很紧密的操作系统相关的知识,本文也有相应的描述。网桥,类似于中继器,连接局域网中两个或者多个网段。它与中继器的不同之处就在于它能够解析它收发的数据,读取目标地址信息(以太网头中的MAC数据),并决定是否向所连接网络的其他网段转发数据包。为了能够决策向那个网段发送数据包,网桥学习(learning)接收到的数据包的源MAC地址,在本地建立一个以MAC和端口为记录项的信息数据库,这就是网桥的工作原理。1、 LINUX桥的概念1.1 、生成树算法和协议(翻译802.1D)这章描述的配置算法和协议将一个由多个桥连接的局域网(LAN)的拓扑结构缩减成一棵生成树。Figure 8-1是一个普通的多个桥连接的局域网的例子,Figure 8-2是它的逻辑拓扑结构。Figure 8-1其中的一个桥作为根桥(Root Bridge)。每个LAN有一个桥的端口向根桥转发数据并接收根桥发送的数据,这个端口就是这个LAN的指定端口(Designated Port),且这个桥也作为这个LAN的指定桥(Designated Bridge)。根桥是整个拓扑结构的指定桥。如果桥的端口在转发状态那么距离根桥最近的就是根端口,其它的是指定端口,如果在桥上即不是作为根端口又不是作为指定端口的桥端口不能进入转发状态。稳定的拓扑结构由以下的条件决定a)每一个桥的桥ID(Bridge Identifiers)。b)每一个桥的端口的路径价值(Path Identifier)。c)每一个端口的端口ID(Port Identifier)。有最高优先级的桥ID作为根桥(数值越低优先级越高),每个桥端口都有一个指定的路径价值,指定端口是到根桥路径价值最低的端口:如果两个端口路径价值一样,桥ID最小的就作为指定端口。1.1.1 、拓扑信息的传播桥和桥之间发送一种叫做配置桥协议数据单元(Configuration BPDU)的帧来计算拓扑结构。一个含有BPDU信息的MAC帧发送它的信息到这个拓扑结构中的每个桥。BPDU信息是不会被桥直接转发的,但是收到BPDU信息的桥能用它来和自己的相关数据做比较并激励数据传输。每一个BPDU信息包括传输BPDU信息的桥认为的根桥的桥ID,从传输端口到根桥的路径价值,传输BPDU信息的桥的ID,传输BPDU信息的端口ID,这些信息允许一个收到信息的桥来决定是否这个传输端口能有更好的条件成为指定端口和接收端口应该成为根端口。如下三个条件可以触发及时的传输信息到整个网络拓扑,以便决定桥端口的状态:a)所有桥开始都认为自己是根桥,并在固定的时间间隔发送配置BPDU信息。b)桥收到了一个认为它自己的根端口具有更好传输性能的配置信息,它会传输这个信息到这个网路拓扑中。c)桥收到了次一等的配置消息,它会传输它自己的信息回复这条配置消息,并让整个拓扑都收到这个消息。1.1.2 、拓扑结构的改变导致重配为了允许拓扑结构的重新配置,在整个LAN的网络拓扑中传输的拓扑信息有一个有限的时间生命。配置信息从根发出来以后时间就开始递减。每个桥存储这个信息并监视它的变化。在一个稳定的拓扑结构中根桥在固定的一个时间间隔传输配置BPDU以致于拓扑信息不会超时而导致重配。1.1.3 、通知拓扑改变拓扑结构在一些情况下有可能重新配置,这样桥可能需要更新它的FDB(Filtering Database)信息。生成树算法和协议提供了一种机制来检查拓扑改变并通知根桥,并且根桥在收到拓扑改变通知后也会通知网络拓扑中的所有桥。当所有桥收到了网络拓扑改变通知以后它们会缩短FDB(Filtering Database)中动态项的超时时间。如下两图所示:1.1.4 、端口状态(Port States)端口状态改变的另一种表示方法:1.1.5 、STP协议参数和时间值这章讲解在桥之间传输的BPDU信息的各个参数和时间值,这些参数主要被包含在两类BPDU中:配置BPDU和拓扑改变BPDU,而各个参数的维护分别在桥和桥的端口中。1.1.5.1 、配置BPDU参数a)Root IdentifierSTP网络拓扑中的根桥的唯一身份(根桥ID)b)Root Path Cost到根桥的路径价值c)Bridge IdentifierSTP网络拓扑中的桥的唯一身份(桥ID)d)Port Identifier在每个桥中端口的编号e)Message Age非根桥记录的收到根桥发送的BPDU信息到再一次收到根桥发送BPDU信息的这段时间。如果Message Age超过了Max Age(看下面介绍)桥将丢弃先前的配置信息,并进行重配。f)Max Age这个值被根桥设置。表示各个桥存储配置信息的最长时间。g)Hello Time根桥产生配置BPDU信息的时间间隔。h)Forward Delay端口状态到转发态所经历的时间。这个参数也被用来作为FDB超时的时间。i)Topology Change Acknowledgment响应拓扑改变通知。j)Topology Change为了通知所有桥这个网络拓扑结构有变化。1.1.5.2 、拓扑改变通知BPDU参数拓扑改变通知没有任何参数。1.1.5.3 、桥参数a)Designated Root被桥认为是根桥的桥ID。b)Root Path Cost从非根桥到根桥的路径价值的总和。c)Root Port从非根桥到根桥路径价值最低的端口成为根端口,如果几个端口路径价值一样则优先级越高的端口成为根端口。d)Max Age在协议的配置信息被丢弃之前收到的配置信息保留的时间。e)Hello Time对一个想变成桥或者是根桥的桥在固定的时间发送的配置BPDU信息。f)Forward Delay从Listening状态到Learning状态和从Learning状态到Forwarding状态花费的时间。g)Bridge Identifier网络中传输的配置BPDU的桥的唯一编号。h)Bridge Max Age桥作为根或想成为根桥的桥标识的它作为根桥的最大年龄。i)Bridge Hello Time非根桥向根桥发送TCN(Topology Change Notification)BPDU的时间间隔。j)Bridge Forward Delay和上面介绍的Forward Delay值一样。k)Topology Change Detected用来标识网络拓扑结构改变的布尔变量。l)Topology Change参数设置表示拓扑改变。m)Topology Change Time根桥产生配置消息指明拓扑改变的时间间隔。n)Hold Time在这个时间间隔至少应该收到一个配置BPDU信息。1.1.5.4 、桥时间参数a)Hello Timer根桥定时传输配置BPDU信息的时间间隔。b)Topology Change Notification Timer如果没收到拓扑改变回应消息便会定时发送拓扑改变通知。c)Topology Change Time定时发送拓扑改变通知来通知桥进行重配。1.1.5.5 、端口参数a)Port Identifier桥的端口的编号。b)Port State标识各个端口行为的参数。c)Path Cost从这个端口到根桥的路径价值。d)Designated Root根桥的桥ID。e)Designated Cost从这个端口到根桥的路径价值。f)Designated Bridge表示相对于这个端口的指定桥的桥ID。g)Designated Port指定桥中和它交互的端口的ID。h)Topology Change Acknowledge参数设置来回应拓扑改变通知。i)Configuration Pending参数设置表示在Holdtimer超时后应该传输配置BPDU性息。j)Change Detection Enabled表示是否理会拓扑改变通知。1.1.5.6 、端口时间参数a)Message Age Timer表示超时丢弃协议信息的时间。b)Forward Delay Timer和端口状态改变的时间值有关。c)Hold Timer在这个时间间隔至少应该收到一个配置BPDU信息。1.1.6 、STP协议例子1.2 、理解生成树(STP)协议生成树算法和协议是自动生成网络拓扑结构的基础,本节只阐述了生成树算法和协议的内容,主要是帮助读者理解协议的原理。以太网交换机在第二层即MAC层必须具有路由功能。目前普遍使用的MAC层路由方式是IEEE802.1组织发布的标准:基于生成树算法的路由。在局域网内的交换机执行了生成树算法以后,会组成一个生成树动态拓扑结构,该拓扑结构使局域网内任意两个工作站之间不存在环路(也可以称做回路),以防止由此产生的局域网广播风暴。同时,生成树算法还负责监测物理拓扑结构的变化,并能在拓扑结构发生变化之后建立新的生成树。例如当一个交换机坏了或某一条数据通路断了后,能提供一定的容错能力而重新配置生成树的拓扑结构。交换机根据生成树动态拓扑结构的状态信息来维护和更新MAC路由表,最终实现MAC层的路由。1.2.1 、以太网交换机在MAC层的体系结构以太网交换机在MAC层的功能主要是实现LAN的互连。根据IEEE802.1D协议的规定,在MAC层工作的体系结构必须包含以下内容:(1)一个用于连接交换机端口的MAC转发实体;(2)至少两个端口;(3)高层协议实体(逻辑链路控制(Logical Link Control或简称LLC)是局域网中数据链路层的上层部分,IEEE 802.2中定义了逻辑链路控制协议)。如图1所示。MAC转发实体主要实现交换机不同端口间的内部通信。该实体存储各个端口的工作状态并维护一个过滤数据库。数据库中存放了一张MAC地址表(端口和mac的对应关系),用以实现MAC层的路由。当数据帧从一个端口的底层服务进程传上来时,MAC实体首先判断目的端口的工作状态,如果目的端口没有被阻塞或不是在DISABLE状态,MAC转发实体将依据MAC地址表的对应关系将该帧从目的端口转发出去。同时MAC转发实体还可以进行过滤、记录MAC地址等操作。交换机端口的功能是从与其相连的LAN上接收或传送数据。端口的状态由生成树算法规定,包括转发(FORWARDING)、学习(LEARNING)、监听(LISTENING)、阻塞(BLOCKING)和禁止(DISABLED)状态。(阻塞:所有端口以阻塞状态启动以防止回路,由生成树确定哪个端口转换到转发状态,处于阻塞状态的端口不转发数据但可接受BPDU;监听:不发送接收数据,接收并发送bpdu,不进行地址学习(临时状态);学习:不接收或转发数据,接收并发送bpdu,开始地址学习MAC地址和端口对应表(临时状态);转发:端口能转送和接受数据)高层协议实体位于LLC(逻辑链路控制Logical Link Control)层,主要用于计算和配置LAN的拓扑结构。代码实现的生成树协议算法就是运行在该协议实体内,用来实现MAC层的路由。在运行生成树算法时,高层协议实体可以直接调用MAC转发实体提供的服务,并能读取或更改MAC实体数据库中维护的信息,如从MAC实体中读取或更改某端口的状态信息等。在运行生成树算法时,交换机的高层协议实体将使用一个统一的组地址01-80-C2-00-00-00(全部多播地址从01-00-5e-00-00-00到01-00-5e-7f-ff-ff)作为目的MAC地址,该数据被称为BPDU(桥协议数据单元)。BPDU中携带了实现生成树算法的有关信息。在实现生成树算法时,从端口接收上来BPDU,由LLC层的服务进程将其传给交换机协议实体。在执行了生成树算法以后,交换机的协议实体将根据算法的结果更新端口的状态信息并更新过滤数据库,以决定交换机端口的工作状态(阻塞或转发等),从而建立生成树拓扑结构。1.2.2 、生成树协议1.2.2.1 、生成树协议介绍生成树协议基于以下几点:(1)有一个唯一的组地址(01-80-C2-00-00-00)标识一个特定LAN上的所有的交换机。这个组地址能被所有的交换机识别;(2)每个交换机有一个唯一的标识(Brideg Identifier);(3)每个交换机的端口有一个唯一的端口标识(Port Identifier)。对生成树的配置进行管理还需要:对每个交换机分配一个相对的优先级;对每个交换机的每个端口分配一个相对的优先级;对每个端口分配一个路径花费。具有最高优先级的交换机被称为根(root)交换机。每个交换机端口都有一个根路径花费,根路径花费是该交换机到根交换机所经过的各个跳段的路径花费的总和。一个交换机中根路径花费的值为最低的端口称为根端口,若有多个端口具有相同的根路径花费,则具有最高优先级(数值较低)的端口为根端口。在每个LAN中都有一个交换机被称为指定(designated)交换机,它属于该LAN中根路径花费最少的交换机。把LAN和指定交换机连接起来的端口就是LAN的指定端口(designated port)。如果指定交换机中有两个以上的端口连在这个LAN上,则具有最高优先级的端口被选为指定端口。拓扑结构如图2所示。由于交换机A具有最高优先级(桥标识最低),被选为根交换机,所以交换机A是LAN A和LAN B的指定交换机;假设交换机B的根路径花费为6,交换机C的根路径花费为4,那么交换机C被选为LAN C的指定交换机,亦即LAN C与交换机A之间的消息通过交换机C转发,而不是通过交换机B。LAN C与交换机B之间的链路是一条冗余链路。1.2.2.2 、BPDU编码交换机之间定期(默认2秒)发送BPDU包,交换生成树配置信息,以便能够对网络的拓扑、花费或优先级的变化做出及时的响应。BPDU分为两种类型,包含配置信息的BPDU包称为配置BPDU(Configuration BPDU),当检测到网络拓扑结构变化时则要发送拓扑变化通知BPDU(Topology Change Notificationn BPDU)。配置BPDU编码如图3所示。拓扑变化通知BPDU编码如图4所示。对于配置BPDU,超过35个字节以外的字节将被忽略掉;对于拓扑变化通知BPDU,超过4个字节以外的字节将被忽略掉。1.2.2.3 、形成一棵生成树的决定要素1.2.2.3.1 、决定根交换机a、最开始所有的交换机都认为自己是根交换机;b、交换机向与之相连的LAN广播发送配置BPDU,其root_id与bridge_id的值相同;c、当交换机收到另一个交换机发来的配置BPDU后,若发现收到的配置BPDU中root_id字段的值大于该交换机中root_id参数的值,则丢弃该帧,否则更新该交换机的root_id、根路径花费root_path_cost等参数的值,该交换机将以新值继续广播发送配置BPDU。1.2.2.3.2 、决定根端口a、一个交换机中根路径花费的值为最低的端口称为根端口。b、若有多个端口具有相同的最低根路径花费,则具有最高优先级的端口为根端口。若有两个或多个端口具有相同的最低根路径花费和最高优先级,则端口号最小的端口为默认的根端口。1.2.2.3.3 、决定LAN的指定交换机a、开始时,所有的交换机都认为自己是LAN的指定交换机。b、当交换机接收到具有更低根路径花费的(同一个LAN中)其他交换机发来的BPDU,该交换机就不再宣称自己是指定交换机。如果在一个LAN中,有两个或多个交换机具有同样的根路径花费,具有最高优先级的交换机被先定为指定交换机。在一个LAN中,只有指定交换机可以接收和转发帧,其它交换机的所有端口都被置为阻塞状态。c、如果指定交换机在某个时刻收一了LAN上其他交换机因竞争指定交换机而发来的配置BPDU,该指定交换机将发送一个回应的配置BPDU,以重新确定指定交换机。1.2.2.3.4 、决定指定端口a、LAN的指定交换机中与该LAN相连的端口为指定端口。若指定交换机有两个或多个端口与该LAN相连,那么具有最低标识的端口为指定端口。b、除了根端口和指定端口外,其他端口都将置为阻塞状态。这样,在决定了根交换机、交换机的根端口、以及每个LAN的指定交换机和指定端口后,一个生成树的拓扑结构也就决定了。1.2.2.3.5 、拓扑变化a、拓扑信息在网络上的传播有一个时间限制,这个时间信息包含在每个配置BPDU中,即为消息时限。每个交换机存储来自LAN指定端口的协议信息,并监视这些信息存储的时间。在正常稳定状态下,根交换机定期发送配置消息以保证拓扑信息不超时。如果根交换机失效了,其他交换机中的协议信息就会超时,新的拓扑结构很快在网络中传播。b、当某个交换机检测到拓扑变化,它将向根交换机方向的指定交换机发送拓扑变化通知BPDU,以拓扑变化通知定时器的时间间隔定期发送拓扑变化通知BPDU,直到收到了指定交换机发来的确认拓扑变化信息(这个确认信号在配置BPDU中,即拓扑变化标志位置位),同时指定交换机重复以上过程,继续向根交换机方向的交换机发送拓扑变化通知BPDU。这样,拓扑变化的通知最终传到根交换机。根交换机收到了这样一个通知,或其自身改变了拓扑结构,它将发送一段时间的配置BPDU,在配置BPDU中拓扑变化标志位被置位。所有的交换机将会收到一个或多个配置消息,并使用转发延迟参数的值来老化过滤数据库中的地址。所有的交换机将重新决定根交换机、交换机的根端口、以及每个LAN的选取交换机和选取端口,这样生成树的拓扑结构也就重新决定了。1.2.3 结论按照如上的算法描述能很快理解Linux操作系统生成树协议的源代码实现,并且能理解生成树协议的工作原理。想要更全面的了解生成树协议必须去阅读802.1D协议文档。1.3 、桥用到的LINUX网络通知链在Linux内核中,大多数内核子系统都是相互独立的,但是,某个子系统可能对其他子系统产生或者检测到的事件感兴趣,为了满足Linux内核子系统之间交互的需求,linux使用了通知链表机制Linux Notifer。Linux桥的代码中就注册了一个br_device_event()函数来得知它感兴趣的事件并做相应的处理,注册事件如下描述:NETDEV_CHANGEMTU:表示MTU(Maximum Transfer Unit,最大传输单元)已经改变。NETDEV_CHANGEADDR:表示网络设备硬件地址已经改变。NETDEV_CHANGE:通知网络设备已改变其状态。NETDEV_DOWN:停止网络设备,作为该消息的结果,所有对网络设备的引用都必须删除。NETDEV_UP:激活网络设备(通过dev_open()函数)。NETDEV_UNREGISTER:通知网络驱动程序已经被删除。1.4 、生成树协议在LINUX中的实现生成树协议的核心:remember that the spanning tree is calculated based on the selection of the tree's root。在linux操作系统中,桥是一个虚拟设备。除非它绑定了一个或多个真实的设备,否则它不能接收和转发数据。因此在创建桥的时候,必须告诉桥那个真实的设备从属于这个桥。桥就类似于一个管理工具,管理着从属于它的真实接口。1.4.1 、桥使用的重要数据结构:struct mac_addr桥的唯一身份,mac地址。struct bridge_id生成树对桥的一个编号。struct net_bridge_mc_fdb_entry转发数据库中的一项。这是被桥学习到的mac地址。struct net_bridge_port一个从属于桥的真实设备在这里被定义为桥端口。struct net_bridge桥设备信息。这个结构会附加在linux系统中的net_device网络管理设备数据结构上。这个结构保存了桥的一些私有信息。struct br_config_bpdu一种bpdu数据类型。1.4.2 、桥代码初始化桥代码作为模块被编译进内核,因为桥的创建和端口的绑定都是在应用层完成的,所有内核桥代码的初始化只注册桥的回调函数和为转发表分配内存空间,并描述如下:· 为转发数据库创建一个slab cache(一块内存区)。· 初始化br_ioctl_hook函数指针,为应用层输入的各种ioctl命令做解释。· 初始化handle_frame_hook函数指针,为处理驱动进来的BPDU包。· 注册网络通知链,并对感兴趣的事件做相应的处理。· 我们的系统支持Bridging-Firewalling,所以由br_netfilter_init完成相应的Ebtables初始化工作。1.4.3 、桥代码中的重要数据结构1.4.3.1 、BR_CONFIG_BPDU结构struct br_config_bpduunsignedtopology_change:1;/拓朴改变标志unsignedtopology_change_ack:1;/拓朴改变回应标志bridge_idroot;/根ID,用于会聚后的网桥网络中,所有配置BPDU中的该字段都应该具有相同值(同VLAN),又可分为两个BID子字段:网桥优先级和网桥 MAC 地址int root_path_cost;/路径开销,通向有根网桥(Root Bridge)的所有链路的积累资本bridge_id bridge_id;/创建当前BPDU的网桥BID。对于单交换机(单个 VLAN)发送的所有BPDU而言,该字段值都相同,而对于交换机与交换机之间发送的BPDU而言,该字段值不同)port_idport_id;/端口ID,每个端口值都是唯一的。端口1/1值为0×8001,而端口1/2值为0×8002intmessage_age;/记录Root Bridge生成当前BPDU起源信息的所消耗时间intmax_age;/保存BPDU的最长时间,也反映了拓朴变化通知(Topology Change Notification)过程中的网桥表生存时间情况inthello_time;/指周期性配置BPDU间的时间intforward_delay;/用于在Listening和Learning状态的时间,也反映了拓朴变化通知(Topology Change Notification)过程中的时间情况1.4.3.2 、NET_BRIDGE结构struct net_bridgerwlock_tlock;struct net_bridge_port*port_list;struct net_devicedev;struct net_device_statsstatistics;rwlock_thash_lock;struct net_bridge_fdb_entry*hashBR_HASH_SIZE;struct timer_listtick;/* STP */bridge_iddesignated_root;/初始化时候因为每一个桥都认为自己是根桥,所以这个值在初始化时候被赋值成当前网桥结构的网桥ID;最终它被赋值成此桥根端口所指向的根桥。introot_path_cost;/初始化时候因为每一个桥都认为自己是根桥,所以这时候到根桥的路径价值为0;最终它被赋值成?introot_port;/初始化时候因为每一个桥都认为自己是根桥(根桥是没有根端口的),所以这个根端口被赋值成0(0表示没有对应端口,因为桥的端口是从1开始编号);最终它被赋值成此桥根端口的port_no。intmax_age;/初始化时候被赋值成20*HZinthello_time;/初始化时候被赋值成2*HZintforward_delay;/初始化时候被赋值成15*HZbridge_idbridge_id;/初始化时候初始化成创建当前网桥结构的网桥ID,初始化时候桥优先级默认为32768,mac地址为全0intbridge_max_age;/初始化时候被赋值成20*HZintbridge_hello_time;/初始化时候被赋值成2*HZintbridge_forward_delay;/初始化时候被赋值成15*HZunsignedstp_enabled:1;/初始化时候被赋值成0unsignedtopology_change:1;/初始化时候被赋值成0unsignedtopology_change_detected:1;/初始化时候被赋值成0struct br_timerhello_timer;struct br_timertcn_timer;struct br_timertopology_change_timer;struct br_timergc_timer;intageing_time;/初始化时候被赋值成300*HZintgc_interval;/初始化时候被赋值成4*HZ1.4.3.3 、NET_BRIDGE_PORT结构struct net_bridge_portstruct net_bridge_port*next;struct net_bridge*br;struct net_device*dev;intport_no;/桥端口在桥设备中的编号,port_no编号是从1-254/* STP */(注意:初始化时候因为每一个桥都认为自己是根桥,所以桥的每一个端口都被认为是指定端口)port_idport_id;/初始化时候初始化成高8位是priority,低8位是port_nointstate;/初始化时候状态是BR_STATE_DISABLEDintpath_cost;/初始化时候初始化以太网的路径价值是100bridge_iddesignated_root;/初始化时候初始化成此端口对应的桥的designated_root(初始化时候因为每一个桥都认为自己是根桥,所以这个值在初始化时候被赋值成当前网桥结构的网桥ID);最终它被赋值成根桥ID。intdesignated_cost;/初始化时候初始化成此端口对应的桥的designated_cost(初始化时候因为每一个桥都认为自己是根桥,所以这时候到根桥的路径价值为0)bridge_iddesignated_bridge;/初始化时候初始化成此端口对应的桥的bridge_id(初始化成创建当前网桥结构的网桥ID,初始化时候桥优先级默认为32768,mac地址为全0);最终它被赋值成拓扑图中指定桥的ID。port_iddesignated_port;/初始化时候初始化成此端口的port_id;最终它被赋值成指定桥中和它交互的端口的ID,那个端口被此端口认为是指定端口。unsignedtopology_change_ack:1;/初始化时候被赋值成0unsignedconfig_pending:1;/初始化时候被赋值成0intpriority;/初始化时候端口优先级是128(0x80)struct br_timerforward_delay_timer;struct br_timerhold_timer;struct br_timermessage_age_timer;1.5 、NET_DEVICE结构结构所在的目录:includelinuxnetdevice.hstruct net_device/设备的名称,例如常见的“eth0”等charnameIFNAMSIZ;/共享内存的起始,结束地址unsigned longrmem_end;unsigned longrmem_start;unsigned longmem_end;unsigned longmem_start;/网络设备的I/O基地址unsigned longbase_addr;/被赋予的中断号unsigned intirq;/在多端口设备上使用哪一个端口unsigned charif_port;/为设备分配的DMA通道unsigned chardma;/设备的状态unsigned longstate;/ 下一个net_devicestruct net_device*next;/初始化函数/*The device initialization function.Called only once.*/int(*init)(struct net_device *dev);/* - Fields preinitialized in Space.c finish here - */struct net_device*next_sched;/* Interface index. Unique device identifier*/设备在内核中对应的序号intifindex;intiflink;/获得接口状态的函数指针struct net_device_stats* (*get_stats)(struct net_device *dev);struct iw_statistics*(*get_wireless_stats)(struct net_device *dev);/* List of functions to handle Wireless Extensions (instead of ioctl). * See <net/iw_handler.h> for details. Jean II */struct iw_handler_def *wireless_handlers;struct ethtool_ops *ethtool_ops;/* * This marks the end of the "visible" part of the structure. All * fields hereafter are internal to the system, and may change at * will (read: may be cleaned up at will). */* These may be needed for future network-power-down code. */传输状态。检查传输是否被锁住unsigned longtrans_start;/* Time (in jiffies) of last Tx*/unsigned longlast_rx;/* Time of last Rx*/unsigned shortflags;/* interface flags (a la BSD)*/unsigned shortgflags; unsigned short priv_flags; /* Like 'flags' but invisible to userspace. */ unsigned short unused_alignment_fixer; /* Because we need priv_flags, * and we want to be 32-bit aligned.