Linux桥接功能的分析_第1页
Linux桥接功能的分析_第2页
Linux桥接功能的分析_第3页
Linux桥接功能的分析_第4页
Linux桥接功能的分析_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

桥梁设计和实施方面的知识文件编号:00-6201-100当前版本:1.0.0.0创建日期:2011-8-17建立作者:ganjingwei桥梁知识摘要序言2关于本文档2参考资料3第一章桥的基本概念41.1桥梁的作用41.2桥梁工作方式4第二章Linux桥功能52.1封包程序52.2相关代码62.2.1 br_handle_frame函数62.2.2 br_handle_frame_finish函数6序言关于此文档本文是本人在此期间学习、总结和整理Linux网络堆栈桥功能的文档。提供大家的参考。本文档介绍有关Linux的知识,本章包括以下内容:1前言,即本章;双桥理论知识;3重要数据结构4桥和端口创建过程5 Linux网桥实施和数据包流程;参考资料网络资源。本文中的所有代码均基于broadcom4.12L.01,内核代码为2.6。第一章桥梁的基本概念1.1桥梁的作用网桥在ISO分层结构的两层工作,通过使用MAC地址分隔来实现多个网络或主机之间的互连。1.2桥梁工作原理网桥的工作方式非常简单,因为主机的消息来自哪个端口,此主机必须与此端口位于同一侧,并且可以在此端口找到主机,有关此主机的消息也必须从此端口转发。例如,网桥连接主机a和主机b。主机a连接到网桥时,通知网桥它位于端口a。网桥会维护映射表,以便端口a映射到主机a的MAC地址。如果有其他主机尝试通过网桥转发目标MAC地址为主机a的MAC地址的消息,网桥会通过查找表引导端口a进行转发。同样,当网桥连接由多个主机或主机组成的网络时,根据此原则,它会维护一个记录端口和MAC地址的映射表,并在需要传递消息时查找该表,以查找应该去的地址。当然,如果收到的消息发送到桥本身,则应交给上层协议。这是桥的工作原理。第二章数据结构2.1 net_bridge此结构描述桥。Dev是与这座桥相对应的设备。Port_list是net_bridge_port的关联列表头。散列br _ hash _ size是net_bridge_fdb_entry的分布式列表,也是桥MAC地址和端口的映射表CAM。Struct net_bridgeSpinlock _ t lockStruct list _ headport _ listStruct net _ device * devstruct net _ device _ stats statistics;Spinlock _ t hash _ lockstructh list _ head hashbr _ hash _ size;Structlist _ headhage _ listUnsigned longfeature _ maskUnsigned longflagsBridge _ id designated _ rootBridge _ id bridge _ idU32 root _ path _ costUnsigned longmax _ ageUnsigned longhello _ timeUnsigned longforward _ delayUnsigned longbridge _ max _ ageUnsigned longageing _ timeUnsigned longbridge _ hello _ timeunsigned long bridge _ forward _ delay;u8 group _ addrETH _ ALEN;U16 root _ portEnumBR_NO_STP,/* no spanning tree */Br _ kernel _ STP,/* old STP in kernel */Br _ user _ STP,/* new rstp in user space */ stp _ enabledUnsigned chartopology _ changeunsigned char topology _ change _ detected;Struct timer _ listhello _ timerStruct timer _ listtcn _ timerstructtimer _ list topology _ change _ timer;Struct timer _ listgc _ timerStruct kobject * ifobj2.2 net_bridge_port布里奇波特的结构。指向Br所属的桥。Port_no是端口ID,是唯一标识的。Struct net_bridge_portStruct net _ bridge * brStruct net _ device * devStruct list _ headlistU8 priorityU8状态;U16 port _ nounsigned char topology _ change _ ack;Unsigned charconfig _ pendingPort _ id port _ idPort _ id designated _ portBridge _ id designated _ rootBridge _ id designated _ bridgeU32 path _ costU32 designated _ coststructtimer _ list forward _ delay _ timer;Struct timer _ listhold _ timerstructtimer _ list message _ age _ timer;Struct kobjectkobjStruct rcu _ headrcu2.3 net_bridge_fdb_entry从net _ bridge到散列、net _ bridge _ port的中间链接结构。包含有关端口的一些信息,最重要的是local,它可以让您知道此端口信息是本地的,还是连接的其他主机的。Struct net_bridge_fdb_entryStruct hlist _ nodehlistStruct net _ bridge _ port * dstStruct rcu _ headrcuAtomic _ t use _ countUnsigned longageing _ timerMac _ addr addrUnsigned charis _ localUnsigned charis _ static第三章桥梁的建立3.1 br _ add _ bridgenet bridge br _ if . c使用SIOCBRADDBR调用ioctl时,将通过br_add_bridge函数创建新桥。在此函数中配置新桥接设备的初始参数。此函数位于br_if.c中。请在这里申请一个桥梁设备。Dev=new_bridge_dev(net,name);然后为设备指定名称,并注册设备和设备文件。Ret=dev _ alloc _ name (dev,dev-name);ret=register _ net device(dev);ret=br _ sysfs _ addbr(dev);3.2 br _ add _ if()net bridge br _ if . c使用SIOCBRADDIF调用ioctl时,调用br_add_if将新端口添加到网卡。创建新的net_bridge_port p时,将在br-port_list中分配未使用的port_no,p-br指br,p-state设置为BR_STATE_DISABLED。其中p实际上表示网卡设备。P=new_nbp(br,dev);将新创建的p添加到记录MAC地址和物理端口匹配的凸轮表中。由于我们刚创建了p,因此还必须包括CAM表格,并且表格条目必须为local,如图3-1所示。其中,CAM表在实施中是net_bridge的散列表,addr是散列值,链是net_bridge_fdb_entry,dst是通过net_bridge_port连接的。Err=br _ fdb _ insert (br,p,dev-dev _ addr);图3-1桥映射表结构如果Br_fdb_insert函数中已存在此物理地址的记录,请删除原始记录,然后保存新记录。但是,如果是本地地址,则直接返回。Fdb=fdb_find(head,addr);If (fdb) If (fdb-is_local)return 0;printk(kern _ warning % s adding interface with same address as a received packet n ,source-dev-)Fdb_delete(br,fdb);If(!Fdb _ create (br、head、source、addr、1、1)return-ENOMEM;return 0;设备的br_port指向p。这里您可以看到,net_bridge是全局卷、网桥,net_bridge_port是网卡对应的端口,因此每个设备dev都有指向该端口的指针br_port。Rcu _ assign _ pointer (dev-br _ port,p);将新创建的net_bridge_port添加到br的linktable port_list中,以便在创建新net_bridge_port时分配未使用的port_no,并且此port_no是br-port具体流程如图3-2所示。List _ add _ rcu (p-list,br-port _ list);图3-2端口链接列表重新计算桥的ID。桥的ID基于br-port_list链接列表中net_bridge_port的最小addr。br _ STP _ recalculate _ bridge _ id(br);到此为止,新桥的创建完成了。第4章Linux桥接功能4.1数据包进程图4-1 Linux桥接数据包函数调用过程如图4-1所示,netif_receive_skb是由网卡驱动调用并接收网卡,从而将初始处理的数据包转发到链路层的数据包的基本接收函数。此函数首先根据设备类型确定类型,其中类型主要取决于是否有主设备。如果找到匹配项,则将其移交给相应的协议进行处理。如果Handle_bridge是循环类型的包或br_port是空包,请直接返回netif_receive_skb函数,然后调用deliver_skb作为以太网帧的协议类型匹配,将其提交给父作业。否则,继续执行桥的下一步。如果设备未用作网桥,则还将调用deliver_skb并将其提交到更高层。Deliver_skb通过不同的协议类型提交给其他传入函数。Br_handle_frame函数首先确定数据包的目标地址是否是多播组地址,输入BR_LOCAL_IN,然后更新网桥以发布CAM。如果确定为否,则进入桥接的route阶段,BR_PRE_ROUTING移动到HOOK点,然后调用br_handle_frame_finish。Br_handle_frame_finish首先调用整个目标地址的查找_br_fdb_get函数。如果目标地址本身,则调用br_pass_frame_up函数,然后调用netif_receive_skb。但是,此时skb上的设备不再是以前的端口设备,变为br0,br_port也为空,因此根据以前的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论