• 2.76 MB
  • 2022-04-22 11:37:54 发布

软件工程毕业设计论文-基于无线控制器的接口管理.doc

  • 77页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'XXX高级工程师XX教授软件工程题(中、英文)目企业指导教师姓名职称学校指导教师姓名职称XX工程领域作者姓名二XXX年二月提交论文日期BasedontheWirelessControllermInterfaceManagement基于无线控制器的接口管理企业指导教师姓名职称 摘要随着无线网络的不断发展,有线网络和无线网络的融合必将成为一种趋势,新型的网络设备的产生也将成为一种必然,有线无线一体化交换机就是这种设想的实现。接口管理作为交换机设计中的重要软件组成部分,它在交换机中抽象底层的硬件驱动,定义完备的接口,给上层管理提供接口,是交换机软件开发的主要内容,对于交换机的软硬件的管理和交换性能具有十分重要的意义。本文以某公司的AX7000有线无线一体化企业级交换机项目为背景,深入研究了Cisco、Juniper等公司的接口管理设计模式,提出了自己的设计方案。基于交换机的PORT和VLAN实现交换机的二层接口、三层接口、协议接口以及各种特性接口的定义,运用Port和VLAN之间的关系使接口之间相关联。实现虚拟网卡驱动以支持三层接口,完成交换机网关功能。添加ARP和路由信息学习管理模块,保证网络安全和数据转发的高效、畅通。最终根据定义的接口实现命令行的配置功能。关键词:接口管理无线控制器网络 AbstractWiththecontinuousdevelopmentofwirelessnetworks,theamalgamationofcableandwirelessnetworkswilldefinitelybecomeatrend,anditisinevitablethatalate-modelnetworkapparatus,suchastheWireandWirelessIntegrationSwitch,willcomeintobeing.AsanimportantsoftwarecomponentsoftheIntegrationSwitch,Interfacemanagementwhichabstractstheunderlyinghardwaredrive,definesthewholeInterfaceandprovidesinterfaceforthesuperiormanagement,hasgreatsignificanceforthemanagementofIntegrationSwitch’ssoftware&hardwareanditsperformance.Thisthesis,viaaAX7000WireandWirelessintegrationEnterprise-classSwitchprojectandthoroughlystudyingonCisco’s,Juniper’sandsomeothercompany’sInterfaceManagementdesignpattern,putsforwardmyowndesignpatterninwhichIeducedthedefinabilityofEthernetInterface,Layer3Interface,ProtocolInterfaceandavarietyofsomespecialinterfaceandidentifiedtheirrelationsviathePortandVLANofintreface,andachievedthevirtualnetworkcarddrivingwhichgivessupportforlayer3interface,andfulfilledthefunctionofinterface’sgateway.AndbyappendingARPandManagementModuleofRouterinformationlearning,sothatwecanensurenetwork’ssafetyanditsefficiencyandstabilizationofdatatransmitionandfinallyachievetheconfiguration’sfunctionofcommand-lineaccordingtoitsdefinitionofinterface.Keyword:InterfaceManagementWirelessControllerNetwork 目录第一章绪论11.1项目背景11.2项目来源21.3项目其间主要完成任务的工作41.4章节安排4第二章相关技术背景72.1TCP/IP及LinuxTCP/IP协议栈72.2Linux驱动92.3Linux开源项目132.3.1路由管理之Quagga132.3.2Linux逻辑总线之D-Bus14第三章无线控制器体系结构173.1无线控制器的功能173.2无线控制器的体系结构183.2.1功能体系结构模块183.2.2物理体系结构模块20第四章接口管理需求分析234.1接口管理概念234.2接口管理需求244.3接口管理建模27第五章接口管理设计实现315.1软件模块设计实现315.2基于接口的应用层设计实现345.2.1命令行模块设计实现345.2.2协议模块设计实现365.3接口底层驱动模块设计实现395.3.1虚拟网卡驱动模块设计实现395.3.2交换芯片驱动模块设计实现475.4接口管理设计实现48 5.4.1Port接口485.4.2VLAN接口555.4.3基于接口的ARP、Route学习605.5接口管理测试63第六章结束语676.1全文总结676.2工作展望67致谢69参考文献71 15第二章相关技术背景第一章绪论1.1项目背景上世纪九十年代以来,网络建设突飞猛进。我国的网络建设,包括企业网和广域网络,都实现质的飞跃。无线网络同期也得到广泛应用和发展。近两年来,无线网络有越来越加快发展的趋势。无线网络自诞生以来,表现了其独特灵活性、便利性及高效率的特点。无线网络的初步应用,可以追溯到第二次世界大战期间,美国陆军采用无线电信号作资料传输。1971年,夏威夷大学的研究员创造了第一个被称作ALOHNET的无线电通信网络。无线局域网(WLAN,WirelessLocalAreaNetwork)采用无线通信技术代替传统电缆网络。上世纪90年代初,无限局域网络设备相继出现。以900MHz、2.4MHz和5GHz为主要頻率。1997年6月,第一个无线局域网标准IEEE802.11正试颁布实施。1999年9月802.11b技术标准正式发布,802.11带来了网络建设的一场“革命”[1]。为无线局域网的物理层和MAC层提供了统一的标准,为无线网络市场迅速发展奠定基础。近年来,国际无线网络市场发展迅速。据市场调查,1998年美国无线网络服务的收入为300亿美元,收入主要还是来源于移动电话的无线语音服务。到1999年美国无线网络数据服务的收入达到6亿美元。预计2003年美国无线网络数据服务的收入可以达到40亿美元。到了2005年美国的无线服务收入将达到600亿美元,其中无线数据通信的收入达到84亿美元,将增长14倍。到2006年,全球无线网络设备的市场销售额将达到103亿美元。2001年全球无线上网人口总数已达3900万人,预计到2005年底可达到7.29亿人,并且全球将有36%的上网人口通过无线电子设备上网。无线网络的应用将持续高速发展。人们已经不满足原来的移动电话服务的内容,无线网络的语音服务必然向数据服务发展。特别是信息技术的广泛应用,移动办公和移动商务的要求,也必然推动无线网络应用的发展。无线网络补充延伸了有线网络,扩大了网络的覆盖率和提高了网络的应用范围[2]。到现在为止,无线局域网一般是由连接到接入点的客户机构成,而接入点要提供安全功能、管理功能和其他控制网络无线部分所需的智能性。由此带来的问题是,管理多个接入点,对于可能涉及几百或几千个接入点的网络来说是一种无法应付的局面。在这种情况下,一种新的产品——WLAN交换机应运而生。许多资深研究以太网技术及交换机技术的网络公司正投入大量研究力量从事无线交换机的研发,例如Cisco,H3C等等,这两家公司都已有自己成熟的产品,Cisco的Cisco4400 15第二章相关技术背景系列,H3C的WX5002系列,但这些都只停留在无线控制这一块,而没有把有线和无线完整的融合起来。无线交换所带来的,不仅是提升无线网络的可管理性、安全性和部署能力,还降低了组网成本,由此成为无线局域网领域一种新的发展趋势。传统的企业级无线局域网采用的是以太网交换机+企业级AP的2级模式,由AP来实现无线局域网和有线网络之间的桥接工作。整个网络的无线部分,是以AP为中心的一片片覆盖区域组合而成的。这些区域各自独立工作,AP作为该区域的中心节点,承担着数据的接收、转发、过滤、加密,客户端的接入、断开、认证等任务。所有的管理工作,比如channel管理和安全性设置,都必须针对每一台AP单独进行。当企业的无线局域网规模较大时,这就成了网络管理员相当繁重的负担。新出现的无线交换机通过集中管理、简化AP来解决这个问题。在这种构架中,无线交换机替代了原来二层交换机的位置,轻量级AP(Light-Weight AP)(也称智能天线)取代了原有的企业级AP[3]。通过这种方式,就可以在整个企业范围内把安全性、移动性、QoS和其他特性集中起来管理。虽然无线交换机采用和普通交换机类似的方式与AP实现连接。但在802.11帧处理上与传统方式不同:它不将802.11帧转换为以太帧,而是将其封装进802.3帧当中,然后通过专用隧道传输到无线交换机。从有线网的角度看,无线交换机加轻量级AP更像是一台伸展出很多外接天线的增强型AP。无线交换机的优势,在于三个主要方面:更高的安全性,更低的TCO,更有效率的管理。在新的AP与交换机之间的通信的隧道协议和管理协议(LWAPP)标准定制以后,不同厂家的无线交换机和AP不能通信的时代已成为过去,LWAPP在市场中得到广泛接受,减少了被迫锁定于一个厂商,即只有将接入点与同一厂商的WLAN系统设备共用,才能获得最优运行效果的现象。LWAPP还提供了一个开放标准解决方案,可在多厂商集中WLAN架构上提供安全的第二层和第三层网络服务。此外,凭借LWAPP,第三方厂商也可拥有一个用于部署应用的通用架构。无线交换机将会成为网络设备发展的主流。1.2项目来源本文作者实习公司是业界唯一一个有线无线一体化宽带网络解决方案提供商。依托它们的产品,用户可以基于单一平台部署有线网络、WLAN网络及企业统一安全策略。传统企业网络中,有线网络设备及管理系统、无线网络设备及管理系统、安全策略管理系统各自独立,分别维护,不但增加了IT人员的负担,而且大大增加了企业的 15第二章相关技术背景IT基础设施投资。傲天动联提供单一的有线无线一体化产品平台和管理平台,用户可以基于同一设备进行WLAN数据和有线数据的转发策略控制以及进行第七层安全策略部署,极大的简化了网络的部署和管理并大幅度节约网络基础设施投资。基于以上的市场需求,公司率先推出了业界领先、完全自主知识产权的有线无线一体化解决方案,包括业界最高转发性能和最具安全性的AX7000系列高端一体化安全交换机、适用于中小型企业的AX5000/3000系列一体化安全交换机、具有零配置自愈合功能的室外型无线接入点、基于开放式安全平台的AUTEWARE操作系统等,为客户提供安全、高速、统一管理、易于部署的整网多业务解决方案。而接口管理正是交换机的核心功能,同样有线无线一体化交换机也不例外。在现有的网络设备生产公司中,接口都没有十分统一的清晰定义,各有巧妙。但是从总体上说,其内容涵盖了系统中所有底层硬件驱动、上层应用,是软件层面上的一系列核心结构体,主要目的是为了高效合理的管理交换机,并且以它为核心进行软件开发,扩展功能,版本的移植。因此接口管理逻辑关系复杂,与系统软硬件功能模块紧密相关,也是中高端交换机管理方式的定义。不同的设计最终呈现给用户的时候,有很大的差别,从Cisco和Juniper设备配置文档中就可见一斑。从Cisco的配置手册[4]上可以看出,Cisco对接口定义最广泛,因此也最混乱,接口太多。在Cisco的8540配置文档中可以看出,接口与路由有很大的关系,路由是把包从一个链路传送到另外一个链路,而为了实现这个过程,就要定义数据包从接受到发送这一过程的接口特征。接口特征包括IP地址,端口地址,数据封装方法和介质类型,这些所说的只是其中的一部分。可以看出Cisco的接口定义更像一个面向对象程序中的类,当然把它们定义成可以独立出来的模式,可以很方便的把它们组织成一个树形结构,加快了包在三层交换机中的转发速度。Juniper公司的接口管理[5]相对要清晰一点,把接口的概念分层了,从物理层到链路层到网络层,逻辑上的可以有好几层接口,类似一个接口栈,完整的接口栈实现完整的报文从网络协议栈最底层到顶层的处理过程。例如:用户可以根据自己的需求配置T3和T1链路的物理和逻辑特征或根据中心交换机和OC3链路的物理和逻辑特点从网络的下层核心传出,这些物理和逻辑的特点就定义了一个接口。而接口的配置应该从低到高合理的配置,比如:原来的配置是IP运行在ATM上,现在想改变原来的模式,IP要运行在PPP上,PPP运行在ATM上,则就要先删除IP,再配置PPP,然后重新配置IP,才能正确的运行。从这些可以看出Juniper公司对接口定义比较严格。而接口的管理也更加的灵活。 15第二章相关技术背景在作者实习公司的有线无线一体化交换机中,接口管理吸收了Cisco和Juniper的优点,提出了自己相对简单但功能全面、灵活的接口管理方案。把接口管理规划入两个主要的逻辑结构中——Port、VLAN中,用这两个数据结构去定义各个接口功能。1.3项目其间的主要工作本次课题开发的内容是根据作者实习公司的产品AX7000和AX5000有限线无线一体化交换机的研发而来。这两款新产品给用户提供了无线网络管理和有线网络管理的一体化解决方案,最大化的减小了用户的投资,并使用户长期受益。新产品在设计研发过程中遵守IEEE的802等标准。系统采用MIPS架构,LINUX服务器平台,进行基于高速交换芯片的嵌入式开发。将优化过的一些相关理论方法应用到实际开发过程中去,保障了系统性能、特性的安全稳定。本论文的研究内容是实习公司AX7000和AX5000有线无线一体化交换机的核心功能接口管理模块,本文作者主要完成以下几个方面的工作:1.项目开始前期。阅读有关TCP/IP协议书籍、Socket编程书籍、线程管理和内存管理书籍,硬件芯片文档,产品设计架构文档,了解国内三层交换机框架的一些情况。阅读交换芯片的驱动源代码。2.对产品硬件结构进行培训,与硬件工程师一起对交换芯片的硬件转发能力进行测试验证。3.与交换项目组的开发人员和软件架构工程师进行接口管理方面的设计。4.完成接口管理的基础,Linux虚拟网卡驱动的设计、编码、测试。5.完成RSTP和MSTP的融合,为上层管理提供相应的接口。6.实现ARP,路由学习的软硬件控制,以及一些特色功能接口。7.调试报文收发流程的性能。1.4章节安排论文主要介绍了研究和实现基于无线控制器的接口管理。第一章:绪论本章介绍了论文研究背景、来源和组织安排。第二章:相关技术背景本章介绍了交换机软件开发中与接口管理相关关键技术。首先介绍了TCP/IP协议的基本信息,紧接着对Linux驱动做了总结,最后对公司使用的两个开源软件Quagga,D-Bus进行简单的介绍。第三章:无线控制器体系结构本章对实习公司的产品AX7000的各个功能做了概述,并从本产品的硬件架构和逻辑功能模块详细介绍它的软件结构和设计理念。 15第二章相关技术背景第四章:接口管理的需求分析本章论述了接口管理的概念,并分析了接口管理的需求,最终对系统和接口管理进行了功能建模。第五章:接口管理的设计实现本章详细论述了AX7000的软件总体设计以及各个模块的功能,然后对接口管理的上层应用命令行模块和协议模块和底层驱动模块的设计实现进行了详细阐述,最后具体的论述了接口管理的设计与实现,并且列出了测试结果。第六章:结束语本章主要总结了本篇论文的主要内容,介绍了AX7000投入市场后情况,展望了未来的工作。 15第二章相关技术背景 15第二章相关技术背景第二章相关技术背景2.1TCP/IP及LinuxTCP/IP协议栈网络发展最初可以追溯到20世纪50年代,当时人们尝试把分别独立发展的通信技术和计算机技术联系起来,使得在技术上为今后的计算机网络的出现做好了准备。同时建立了一些基础的理论性的概念。1983年出现了可用于异构网络的TCP/IP协议,并作为BSDUNIX操作系统的一部分,TCP/IP协议得到了认可,逐步流行起。从此真正意义上的Internet诞生了[6]。1991年,internet开始用于商业用途,internet的商业化,成为internet发展的催化剂,使得它以空前的速度迅速发展。Linux正是一个诞生于网络、成长于网络且成熟于网络的奇特的操作系统。1991年,芬兰大学生LinusTorvalds把自己开发了基于UNIX的开源操作系统Linux,为了不让这个羽毛未丰的操作系统矢折,Linus将自已的作品Linux通过Internet发布。从此一大批知名的、不知名的电脑黑客、编程人员加入到开发过程中来,Linux逐渐成长起来。现在Linux已经是一种自由的UNIX类多用户、多任务的操作系统,可运行在多种计算机平台,已成为应用广泛、可靠性高、功能强大的计算机操作系统。Linux具有内核小、效率高、源代码开放等优点,还内含了TCP/IP网络协议,很适合在服务器领域和嵌入式领域使用。而这两个领域主要用途之一就是进行网络通信。Linux支持TCP/IP,IPX,X.25,AppleTalk等协议,各种具体协议实现的源码见linux/net/目录下相应的名称[7]。与本文构件化相关的TCP/IP协议栈相关内容在linux/net/ipv4目录下,其中linux/net/ipv4/af_inet.c是主要的管理文件。与OSI模型一样,Linux的TCP/IP协议栈也是典型的层次架构,如图2.1所示。网卡驱动程序提供的I/O之上是地址解析协议和反向地址解析协议(ARP/RARP),主要功能为将网卡硬件设备号(MAC地址)与分配的IP地址连接起来,在Linuxkernel源码中的实现文件是arp.c及rarp.c。再向上是IP协议、ICMP协议和IGMP协议,该层实际完成功能与OSI模型中的网络层相似,其中以IP协议为核心,ICMP协议及IGMP协议协助IP协议以共同完成IP寻址、路由转发及简单的错误回报、流量控制等功能,在内核源码中的实现文件包含了以ip_为前缀的一系列文件及icmp.c、igmp.c。再上是两个传输层的协议,包括面向连接的TCP协议和无连接的UDP协议,在内核源码中的实现文件是以tcp_为前缀的一系列文件及udp.c。最上层是丰富的应用层协议,内核源码中并不包含此部 15第二章相关技术背景图2.1TCP/IP协议栈分内容的具体实现文件,而是由具体的应用程序根据RFC标准对其加以实现。所以对TCP/IP协议栈按层次构件化的任务主要集中在三层上:ARP/RARP层,IP/ICMP/IGMP层,TCP/UDP层。图2.2描述了Linux对TCP/IP协议族的实现机制。图2.2Linux对TCP/IP协议族实现Linux支持BSD的套接字和全部的TCP/IP协议,是通过网络协议将其视为一组相连的软件层来实现的,BSD套接字(BSDSocket)由通用的套接字管理软件支持,该软件是INET套接字层,用来管理基于IP的TCP与UDP端口到端口的互联问题[8]。从协议分层来看,IP是网络层协议,TCP是一个可靠的端口到端口的传输层协议,它 15第二章相关技术背景是利用IP层进行传接报文的,同时也是面向连接的,通过建立一条虚拟电路在不同的网路间传输报文,保证所传输报文的无丢失性和无重复性。用户数据报文协议(UserDatagramProtocol,UDP)也是利用IP层传输报文,但它是一个非面向连接的传输层协议,利用IP层传输报文时,当目的方网际协议层收到IP报文后,必须识别出该报文所使用的上层协议(即传输层协议),因此,在IP报头上中,设有一个“协议”域(Protocol)。通过该域的值,即可判别其上层协议类型。对于TCP传输,传输节点间先要建立连接,然后通过该连接传输已排好序的报文,以保证传输的正确性,IP层中的代码用于实现网际协议,这些代码将IP头增加到传输数据中,同时也把收到的IP报文正确的传送到TCP层或UDP层。TCP是一个面向连接协议,而UDP则是一个非面向连接协议,当一个UDP报文发送出去后,Linux并不知道也不去关心它是否成功地到达了目的主机。IP层之下,是支持所有Linux网络应用的网络设备层,例如点到点协议(PointtoPointProtocol,PPP)和以太网层。网络设备并非总代表物理设备,其中有一些(例如回送设备)则是纯粹的软件设备,网络设备与标准的Linux设备不同,它们不是通过mknod命令创建的,必须是底层软件找到并进行了初始化之后,这些设备才被创建并可用。因此只有当启动了正确设置的以太网设备驱动程序的内核后,才会有/dev/eth0文件,ARP协议位于IP层和支持地址解析的协议层之间。2.2Linux驱动Linux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。在Linux内核的不断升级过程中,驱动程序的结构还是相对稳定。在2.4.xx到2.6.xx的变动里,驱动程序的编写做了一些改变,但是从2.4.xx的驱动到2.6.xx的移植只需做少量的工作。Linux系统的设备分为字符设备(chardevice),块设备(blockdevice)和网络设备(networkdevice)三种。字符设备是指存取时没有缓存的设备。块设备的读写都有缓存来支持,并且块设备必须能够随机存取(randomaccess),字符设备则没有这个要求。典型的字符设备包括鼠标、键盘、串行口等。块设备主要包括硬盘软盘设备,CD-ROM等。一个文件系统要安装进入操作系统必须在块设备上[9]。每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是从设备号,标识使用同一个设备驱动程序的、不同的硬件设备。设备文件的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问驱动程序。系统调用时是操作系统内核与应用程序之间的接口,设备驱动程序是操作系统内核与机器硬件之间的接口[10] 15第二章相关技术背景。设备驱动程序是内核的一部分,它完成以下功能:1.对设备初始化和释放2.把数据从内核传送到硬件和从硬件读取数据3.读取应用程序传送给设备文件的数据和回送应用程序请求的数据4.检测和处理设备出现的错误图2.3完整地表现了Linux驱动和系统之间的关系。图2.3Linux设备驱动模块图Linux的设备驱动程序可以分为3个主要组成部分[11]:1.自动配置和初始化子程序,负责监测所有驱动的硬件设备是否存在和能否正常工作。如果该设备正常,则对这个设备及其相关的设备驱动程序需要的软件状态进行初始化。这部分驱动程序仅在初始化时被调用一次。2.服务于I/O请求的子程序,又称为驱动程序的上半部分。调用这部分程序是由于系统调用的结果。这部分程序在执行时,系统仍认为是与进行调用的进程属于同一个进程,只是由用户态变成了核心态,具有进行此系统调用的用户程序的运行环境,因而可以在其中调用sleep()等与进程运行环境有关的函数。3.中断服务子程序,又称为驱动程序的下半部分。在Linux系统中,并不是直接从中断向量表中调用设备驱动程序的中断服务子程序,而是由Linux系统来接收硬件中断,再由系统调用中断服务子程序。中断可以在任何一个进程运行时产生,因而在中断服务程序被调用时,不能依赖于任何进程的状态,也就不能调用任何与进程运行环境有关的函数。因为设备驱动程序一般支持同一类型的若干设备,所以一般在系统调用中断服务子程序时,都带有一个或多个参数,以唯一标识请求服务的设备。 15第二章相关技术背景在Linux中,几乎所有的内容都是文件,对设备驱动的访问也是以文件操作的方式实现[12]。无论是字符设备还是块设备,用户对设备的操作都是通过虚拟文件系统(VFS)转化为设备驱动与硬件操作程序的交互。即使是访问网络设备的socket接口,也是通过VFS实现的。Linux通过VFS为用户提供了一个统一的设备访问接口,使用户能够透明地访问设备驱动程序。所有的硬件设备都可以使用和操作系统调用接口来打开、关闭、读写和I/O控制,而驱动程序的主要任务就是实现这些系统调用函数。Linux系统中的所有硬件设备都使用一种特殊的设备文件来表示。每个设备文件都有两个设备号:一个是主设备号,它用来标识该设备的种类,也标识该设备使用的驱动程序;另一个是次设备号,用来标识使用同一设备驱动程序的不同硬件设备。实现一个嵌入式Linux设备驱动的大致流程如下:1.定义主、次设备号,也可以动态获取。2.实现驱动初始化和清除函数,如果驱动程序采用模块方式,则要实现模块初始化和清除函数。3.设计所要实现的文件操作,定义file_operations结构。4.实现所需的文件操作调用,如read、write等。5.实现中断服务函数,并用request_irq向内核注册。中断并不是每个设备驱动所需要。6.将驱动编译到内核或编译成模块,用insmod命令加载。7.生成设备节点文件。file_operation结构中的成员几乎全部是函数指针,它们是系统调用函数的真正处理函数,所以实质上就是函数跳转表。每个进程对设备的操作都会根据major、minor设备号,转换成对file_operation结构的访问。常用的操作包括以下几种:1.lseek,移动文件指针的位置,只能用于可以随机存取的设备。2.read,进行读操作,参数buf为存放读取结果的缓冲区,count为所要读取的数据长度。返回值为负表示读取操作发生错误;否则,返回实际读取的字节数。对于字符型,要求读取的字节数和返回的实际读取字节数都必须是inodei_blksize的倍数。3.write,进行写操作,与read类似。4.readdir,取得下一个目录入口点,只有与文件系统相关的设备程序才使用。5.select,进行选择操作。如果驱动程序没有提供select入口,select操作会认为设备已经准备好进行任何I/O操作。6.ioctl,进行读、写以外的其他操作,参数cmd为自定义的命令。7.mmap,用于把设备的内容映射到地址空间,一般只有块设备驱动程序使用。8.open, 15第二章相关技术背景打开设备准备进行I/O操作。返回0表示打开成功,返回负数表示失败。如果驱动程序没有提供open入口,则只要/dev/driver文件存在就认为打开成功。1.release,即close操作。在用户自己的驱动程序中,首先要根据驱动程序的功能,完成file_operation结构中函数实现。不需要的函数接口可以直接在file_operation结构中初始化为NULL。file_operation变量会在驱动程序初始化时注册到系统内部。当操作系统对设备操作时,会调用驱动程序注册的file_operation结构中的函数指针。对于网络设备来说在Linux里有专门的处理。Linux的网络系统主要是基于BSDunix的socket机制。在系统和驱动程序之间定义有专门的数据结构(sk_buff)进行数据的传递。系统里支持对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。所有的Linux网络驱动程序都遵循通用的接口。设计时采用的是面向对象的方法。一个设备就是一个对象(device结构),它内部有自己的数据和方法。每一个设备的方法被调用时的第一个参数都是这个设备对象本身。这样这个方法就可以存取自身的数据(类似面向对象程序设计时的this引用)。一个网络设备最基本的方法有初始化、发送和接收。网络驱动的收发报文流程图如图2.4。图2.4网络驱动收发报文流程图初始化程序完成硬件的初始化,完成device中变量的初始化和系统资源的申请。发送程序是在驱动程序的上层协议层有数据要发送时自动调用的。一般驱动程序中不对发送数据进行缓存,而是直接使用硬件的发送功能把数据发送出去。接收数据一般是通过硬件中断来通知的。在中断处理程序里,把硬件帧信息填入一个skbuff结构中,然后调用netif_rx()传递给上层处理。 15第二章相关技术背景2.3Linux开源项目1998年4月7日,由TimO`Reilly出面,组织并主持了一次“自由软件峰会”,讨论“自由软件”的称谓问题。最终使用“OpenSource”(“开源”)这个词。2008年Gartner发表一份研究报告,认为在未来几年,几乎所有企业都将使用开源软件。Gartner集团在一份名为“TheStateofOpenSource2008”的研究报告中预测:到2012年,(全球)90%以上的企业都将使用开源软件[13]。2.3.1路由管理之QuaggaQuagga[14]是开源的路由软件,为Linux平台上实现了OSPF版本2,OSPF本版3,RIP版本1和版本2,RIPng以及BGP-4等路由协议。Quagga是由KunihiroIshiguro开发的GNUZebra的衍生而来。Quagga树的目标是建立很多紧密联系在Quagga周围的组织,而不是像GNUZebra现在的集中控制处理一样。Quagga体系结构包括两个功能模块,一个是Vtysh,一个是Zebra。Zebra[15]。Zebra是一种TCP/IP路由软件,它支持BGP-4、BGP-4+、OSPFv2、OSPFv3、RIPv1、RIPv2和RIPng。它符合GNU的GPL标准,可以运行在Linux和其它Unix变体系统上。Zebra是最先进的路由软件之一,最新版本可以从GUNZebraWeb站点上下载。Zebra可以利用模块法对各种协议进行管理,这种设计是独一无二的。它可以根据用户的需要激活或者停止协议。除此以外,Quagga体系结构拥有丰富的库文件来支持协议的实现和客户端守护进程的开发,明确的配置和管理。Quaaga的守护进程都是可配置的,可利用Vtysh——Quagga的CLI。Vtysh作为所有守护进程的终端,组织对Quagga所有的命令节点。Quagga体系结构如下图所示[16]:图2.5Quagga结构图 15第二章相关技术背景2.3.2Linux逻辑总线之D-BusD-Bus[17](其中D原先是代表桌面“Desktop”的意思)是一个提供简单的应用程序互通讯的自由软件,它是作为freedesktop.org项目的一部分开发的。D-Bus深深地受到了DCOP系统的影响而且将在KDE4版本的release中取代DCOP。它已经被应用在Qt4,GNOME,WINDOWS以及Maemo等系统中。GNOME也逐渐用它来取代了大部分早期的Bonobo机制。D-Bus是相对来讲比较新的进程间通信(IPC)机制。在桌面操作系统中,扮演着一个统一中间层的一个角色。有很多的项目都用了D-Bus,比如:GNOME、Hildon等。相对于其它的IPC,D-Bus丢掉了一些不必要的、复杂的东西,也正是因为这个原因,D-Bus比较快、简单。D-Bus不和低层的IPC直接竞争,比如sockets,sharedmemoryormessagequeues。D-Bus的主要目的是提供如下的一些更高层的功能:1.结构化的名字空间2.独立于架构的数据格式3.支持消息中的大部分通用数据元素4.带有异常处理的通用远程调用接口5.支持广播类型的通信在系统和用户之间有明确的区分,这对于处理多用户系统非常重要不局限于任何特定的编程语言,同时提供了语言绑定方法,来和一些通用的高级语言绑定,比如C,C++,Python等。D-Bus的设计得益于在桌面系统中其它IPC的长期经验总结,正是有了这些丰富的经验,才使得D-Bus的设计得以优化。同时D-Bus也不会受累于缓慢的功能改进(creepingfeaturism)。D-Bus的架构以及一些术语[18]:在D-Bus中,“bus”是核心的概念,它是一个通道,不同的程序可以通过这个通道做些操作,比如方法调用、发送信号和监听特定的信号。通常情况下,只会存在一个系统通道,但是可以有不同的会话通道(每人一个桌面会话)。通过D-Bus发送消息通常包含如下步骤:创建和发送消息给后台busdaemon进程,这个过程中会有两个上下文的切换,后台busdaemon进程会处理该消息,并转发给目标进程。这也会引起上下文的切换目标程序接收到消息,然后根据消息的种类做不同的响应,要么给个确认、要么应答、还有就是忽略它。最后一种情况对于“通知”类型的消息而言,前两种都会引起进一步的上下文切换。如果准备使用D-Bus 15第二章相关技术背景在不同的进程之间传递大量的数据,D-Bus可能不是最有效的方法,最有效的方法是使用共享内存,但是对共享内存的管理也是相当复杂的。D-Bus的地址和名字是为了把消息正确的送给接收者[19],IPC机制需要具有某种或某些寻址能力。D-Bus所设计的寻址方案是非常灵活和高效的。每个通道(bus)都有它私人的名字空间,和别的通道区分开来。 15第二章相关技术背景 21第三章无线控制器体系结构第三章无线控制器体系结构3.1无线控制器的功能无线控制器从根本上说是一种企业级交换机。企业级交换机属于高端交换机,一般采用模块化的结构,可作为企业网络骨干构建高速局域网,所以它通常用于企业网络的最顶层。企业级交换机可以提供用户化定制、优先级队列服务和网络安全控制,并能很快适应数据增长和改变的需要,从而满足用户的需求。对于有更高需求的网络,企业级交换机不仅能传送海量数据和控制信息,更具有硬件冗余和软件可伸缩性特点,保证网络的可靠运行。从它所处的位置可以清楚地看出它自身的要求非同一般,起码在带宽、传输速率以背板容量上要比一般交换机要高出许多,所以企业级交换机一般都是千兆以上以太网交换机。企业级交换机所采用的端口一般都为光纤接口,这主要是为了保证交换机高的传输速率。现在通常这么认为,如果是作为企业的骨干交换机时,能支持500个信息点以上大型企业应用的交换机为企业级交换机[20]。无线控制器是对传统的企业级交换机的新的扩展,综合了无线交换与有线交换的两种功能。通过实现WLAN,无线控制器既提供有线用户的大量接入,同时又可提供多个AP及大量无线用户接入。无线控制器通过集中管理简化AP来解决无线网络和有线网络的无缝接入[21]。在这种构架中,无线交换机替代了原来二层交换机的位置,轻量级AP(Light-Weight AP)(也称智能天线IntelligentAntenna)取代了原有的企业级AP。通过这种方式,就可以在整个企业范围内把安全性、移动性、QoS和其他特性集中起来管理。无线交换机的应用使网络管理员在混合和匹配用户安全性能时变得更加灵活,无须再升级或重新配置AP。安全性能包括802.1x、WEP、TKI协议和AES等等[22],囊括了从第2层验证和加密到第3层VPN安全机制。无线LAN交换技术也可防止非法接入点的入侵。传统的交换机加企业级AP的做法是无法控制非法AP接入的,而且检查非法AP的接入也非常麻烦。而采用无线交换机时,当非法接入点连接到网络,WLAN 21第三章无线控制器体系结构交换机会验证它是否是被允许的设备或用户。如果交换机确定该设备是非法的,它将关闭非法接入点并自动告警。并且由于对于无线信号的调制、数据的转发、安全性控制和远程管理处理都是分布式的,每台AP都需要相当强的处理能力;而对于无线交换机加轻量级AP的方案,由于所有的处理能力都集中在一台无线交换机上,分布的轻量级AP只是非常简单的受控设备,只负责发送接收无线信号,因此无需很强的处理能力,也就大幅降低了成本,这样整个无线局域网的成本就大大降低了[23]。另一方面,无线交换机可以在轻量级AP开启的时候,自动给轻量级AP升级固件或更新配置,而不像普通的AP那样,需要由管理员来一台一台的进行固件升级或更新配置,大大减小了管理的重复劳动强度,减小了管理开支。无线交换机通过实时监控空间、网络增长和用户密度等,动态地调整带宽、接入控制、QoS和移动用户等参数,因而成为WLAN系统的大脑。无线交换机可以动态地智能地调整轻量级AP的信道和功率,这项突破性的技术是独一无二的。例如,当某个轻量级AP失效时,WLAN交换机将自动探测失败点,指导附近的轻量级AP调整功率和信道设置来进行补偿。当一个新的AP加入,无线交换机可自动探测,上载适当的功率和信道设置,并调整附近AP的信道和减小其功率,以免发生冲突。由于无线交换机是一种专用系统,AP和交换机之间需要专用的隧道协议和管理协议,无线交换机的标准化协议正在草拟之中,其核心是轻量接入点协议(LWAPP,Light-weightAccessPointProtocol),专门规范交换机和AP间的配置信息,以实现不同厂家WLAN交换机和AP之间的互联。3.2无线控制器的体系结构本文作者在实习中所参与的项目是公司开发的有线无线一体化交换机AX7000和AX5000的研发。这两款网络设备都是基于MIPS架构,使用Marvell公司的高速转发芯片,基于Linux的开发。此产品是市场上第一款集无线和有线一体化的企业级交换机,现已在很多单位使用,并获得了客户的好评。下面将以AX7000为主详细论述交换机的接口管理设计与实现。3.2.1功能体系结构模块首先是三层交换的概念。三层交换(也称多层交换技术,或IP交换技术)是相对于传统交换概念而提出的。众所周知,传统的交换技术是在OSI网络标准模型中的第二层――数据链路层进行操作的,而三层交换技术在网络模型中的第三层实现了分组的高速转发。简单的说,三层交换技术就是“二层交换技术加三层转发”。但它不是简单的二层交换设备硬件和三层路由交换硬件的叠加[24]。三层交换技术的出现,解决了局域网中网段划分之后网段中的子网必须依赖路由器进行管理的局面,解决了传统路由器低速、复杂所造成的网络瓶颈问题。从硬件的实现上看,目前第二层交换机的接口模块都是通过高速背板/ 21第三章无线控制器体系结构总线交换数据的。在第三层交换机中,与路由器有关的第三层路由硬件模块也插接在高速背板/总线上,这种方式使得路由模块可以与需要路由的其他模块间高速地交换数据,从而突破了传统的外接路由器接口速率的限制(10Mbit/s---100Mbit/s)。在软件方面,第三层交换机将传统的基于软件的路由器重新进行了界定:1.数据封包的转发:如IP封包的转发,这些有规律的过程通过硬件高速实现;2.第三层路由软件:如路由信息的更新、路由表维护、路由计算、路由的确定等功能,用优化、高效的软件实现。AX7000是实习公司研发的高端产品,在有线网络的基础上实现WLAN,通过AP和交换机的Capwap隧道协议实现无线网络的转发、控制、管理。当然此产品也可只用于有线网络就如同其他的高端三层交换机一样。AX7000的体系结构如下图所示:图3.1AX7000系统结构图如图3.1所示,AX7000功能模块主要有以下模块,1.硬件模块;硬件主要是指Marvell高速ASIC转发芯片和多核并行CPU。2.操作系统;使用Linux2.6内核。3.芯片驱动模块;使芯片在Linux系统上可正常运转。4.接口管理;管理Marvell高层驱动SDK,控制交换芯片,给用户交互的命令行,给应用层的协议提供接口函数。5.应用层;主要分为无线网络的协议和有线网络的桥协议和路由协议以及配置命令行。这些协议维持自己的状态机,处理分流给自己的报文,命令行模块则提供给用户对交换机进行配置的功能。 21第三章无线控制器体系结构针对AX7000的设计,对这些功能模块的抽象可以很好理解网络报文在AX7000中的处理流程。当报文通过硬件接口进入交换机,首先它被存储在交换芯片的存储单元中,然后报文根据硬件芯片中的表项,进行转发。如果是可以二层转发,则直接被交换芯片转发出去,这个报文的处理流程结束。如果报文要进行IP转发,则报文根据自己的目的IP在路由表中查找,如果找到本身对应的路由表项,则根据路由的下一条转发,报文到此处理结束。如果报文是特殊报文比如是CAPWAP或RIP或其他特殊报文,则报文通过接口管理模块分流到相应的应用协议处理,报文到此处理结束。当交换机处于不同的网络中时,给交换机配置VLAN、IP、QoS等等其他功能,则通过命令行功能来实现,而这些的设置最终都通过接口管理提供的函数,设置到硬件的相应寄存器中。3.2.2物理体系结构模块AX7000交换机CPU采用Caviumnetwork公司的CN38XX,这是一款多MIPS64核、集成多I/O,硬件加速器等功能的网络处理器。该处理器特点如下[25]:单芯片多核:最多16MIPS64cores/芯片。集成高性能网络接口:最大4×10/100/1000ethernetMACs(RGMII)或者SPI4.2接口。集成64bit133MPCI/PCI-X接口。数据加控制双平面支持。最多可处理30milion个包每秒。硬件包处理。硬件工作队列,调度,排序和同步。硬件TCP加速器,包括校验和和计数器。高带宽的L2catch。充分连贯的内存系统。72/144bitDDR2DRAM接口,最大800MHz。AX7000高速ASIC芯片采用Marvell公司的DX家族的275和804两块芯片。此类芯片为用户提供1G加密吞吐率和最多24GE/4SPF/2*10GE个端口,适用于部署中型企业。除普通的交换管理功能外,该处芯片有特点如下:无阻塞,全线速性能;最优的MAC地址配置空间;通过PCI或MII/RGMII管理;先进的QoS,提供4到8个优先级队列;PCL实现QoS和安全管理; 21第三章无线控制器体系结构动态管理片上存储单元。AX7000内存采用2-4GDDR667,使用冗余电源,支持业务板、风扇热插拔。AX7000的硬件架构图[26]如下:图3.2AX7000硬件架构图如上图所显示,AX7000的两块交换芯片引出了四个插槽。芯片作为CPU的外设,以两种方式连到CPU,一种是直接挂到PCI总线上,一种是通过MV82210芯片用SPI通道相连。CPU的板载网卡也提供4*GE/SPF口,这些口是通过CPU来进行转发,转发主要是通过Linux内核提供的LinuxTCP/IP协议栈来进行转发。这样就可以把CPU模块抽象为一个高速的与804、275级联的第三块交换芯片来看待,相应的通过一些特定的虚拟技术对CPU模块做一些性能的软件支持,就可以为整个系统提供统一的操作,而不是同一个系统上跑两套用户交互命令结构。这就是接口管理所要做的的一部分工作。最终AX7000所成型的产品如下图形所示。 21第三章无线控制器体系结构图3.3AX7000实图AX7000有线无线一体化交换机具有的特点:高度集成的有线无线一体化设计;灵活,强大的混合组网能力;集中式WLAN交换和智能RF管理;Triple-play(数据/音频/视频)实时支持;高达88G的数据交换。AX7000的各个物理硬件模块从底层对以上的特点进行了有力的支撑。而另一方面的主要支撑就是基于这些硬件的软件结构,接口管理就是这个架构中的核心。因此接口的定义、组织以及提供的操作函数都是这个软件设计中的重中之重。 29第四章接口管理需求分析第四章接口管理需求分析接口管理是交换机的核心软件模块。接口管理涉及到底层驱动和上层对用户交互的作用,同时要对TCP/IP各层的功能协议的控制提供接口。接口管理在交换机软件中与其他模块有很强的联系,所以对于接口管理的设计需要很好的包容性和稳定性。4.1接口管理概念接口模型体现了在许多工程设计中都具有的结构化思想。接口管理即对接口的管理,它包括了接口的定义,接口的组织,接口的操作等等。如第一章中所述接口管理从总体上说,其内容涵盖了系统中所有底层硬件驱动、上层应用,是软件层面上对系统的Port、VLAN两个核心结构体的操作,主要目的是为了高效合理的管理交换机,并且以它为核心进行软件开发,容易扩展功能,便于版本的移植。因此接口管理逻辑关系复杂,与系统软硬件功能模块紧密相关,也是中高端交换机管理方式的定义。在本文中接口的定义主要包括二层接口,三层接口,协议接口以及特性功能接口。接口最终从用户的角度来看,是无线控制器提供给用户的多个硬件网口,例如从转发流量上分析有GE和XG口,从介质上分就有Cooper口和Fiber口,用户通过配置这些网口上的一些硬件或逻辑信息来实现网络接入和数据转发。同时要让这些网口在不同的VLAN中,有不同的转发出口,又有不同的QoS以及管理监测,则需要对这些进行设置。以下便是是AX7000部分三层VLAN接口的配置命令:interfacevlan<1-4094>创建一个基于vlan的三层接口nointerfacevlan<1-4094>删除一个基于vlan的三层接口interfaceIFNAME进入配置接口的命令节点showinterface显示接口信息从以上命令上看这是一个三层接口,接口有创建、删除、配置、显示等普通的功能。它们的输入参数则是VLAN 29第四章接口管理需求分析ID,接口名称这些直观的东西。当然这只是命令行上对接口命令的一般设计标准,其次还有对端口的二层接口的配置,对VLAN的配置,对MSTP和IGMP等协议接口的配置以及对Route和ARP学习管理和显示等等。命令行给用户提供了一个管理、监测交换机内部原理的窗口,从而使网络的转发,交换机的行为可控,根据不同的网络拓扑实现不同的转发流程。当然这些配置命令是有层次的,从端口的物理特性,例如端口自协商、流控、MTU、双工/半双工模式等等,到端口的虚拟接口的IP地址以及它的ARP,路由信息。接口在设置上是一个从底层到高层的过程,报文在从进入到转发也是一个报文TCP/IP协议处理的流程。接口管理是交换机中的核心内容,更是有线无线一体化交换机的开发的重中之重。在一体化交换机中,不光要涉及到有线网络的处理流程,还要处理无线网络上来的报文。从横向上来说接口管理就是根据TCP/IP模型和交换机功能抽象出层次中的各个接口,并加以融合,实现不同接口之间的互访。有线二层接口到三层接口的融合,无线二层接口到三层接口之间的融合,以及有线到无线各层之间的融合,实现交换机内部的一种矩阵模型。TCP/IP的协议栈模型,在AX7000中是通过两块高速转发芯片实现。交换机在软件上对它们各层抽象出接口,解决同一端口对报文的不同处理。当报文从一个端口进入,在二层接口下会有特定的处理模式,在三层接口下又会有另外一种处理,到这时就有不同的分流,对于WLAN的报文或RIP、OSPF等的报文会送特定的协议去处理,对于多数的转发报文则进行路由查询,进入转发队列。而对于这些特定分流是要有配置去约束,这种约束最终保存在接口所定义的结构上,等报文来时,对其进行检查,最后做出正确的选择。正如前面所说的,命令行是接口管理提供给用户的一个界面,这也是接口管理最直观的体现。网络管理员根据网络拓扑配置交换机的物理属性,FDB表项,三层接口IP,无线网络和接口之间的绑定以及DHCP等其他协议。有了前面的配置,则报文从某个物理端口进入,就开始其在交换机的一个处理流程。4.2接口管理需求首先从AX7000交换机功能上来说,最重要的是保证基本功能——报文正确高速转发,它的实现需要从TCP/IP协议栈上去分析,有数据链路层的功能需要考虑,有网络层的功能需要考虑。还有无线网络的实现,路由的实现这些又需要传输层的功能,当然还有对网络的拓扑的管理以及其他种种特性功能,这么多的东西需要管理。因此衍生出接口管理,它也无可厚非的成为交换机软件的核心部分。它的设计必须要能很好的管理交换机,管理网络拓扑,保证数据高速正确转发。 29第四章接口管理需求分析如同第一章所说接口管理在不同的厂商设备中有不同的设计原则,通过各自的命令行可以体会到它们对接口的定义的方式。Cisco对接口定义最广泛,因此也最混乱,让用户很难进行配置,感觉什么都是接口。Juniper公司的接口管理相对要清晰一点,把接口的概念分层了,从物理层到链路层到网络层,逻辑上的可以有好几层接口,类似一个接口栈,完整的接口栈实现完整的报文从网络协议栈最底层到顶层的处理过程。从这些可以看出Juniper公司对接口定义比较严格。而接口的管理也更加的灵活。从上一节所引用的三层VLAN接口就可以看出。要配置一个VLAN接口首先得创建VLAN,有了VLAN就会有端口,同一个VLAN中的这些端口都共享这个三层接口,那么报文如何选择从正确的端口转发出去。还有就是端口从VLAN删除或添加到VLAN怎么处理以及这些个端口在MSTP和IGMP的状态迁移又会怎么影响VLAN转发。另一个重要的影响就是硬件,由于交换机的各自的硬件架构不同,导致软件对硬件的支持需要不同的软件设计结构。不同的设计结构,则影响了不同的接口设计思路。在AX7000中接口管理的设计综合了Cisco的多接口和Juniper的接口分层概念。并且以一种相对简洁的方法实现,减少了数据结构方面的存储要求,也减少了接口交互之间的简便。所以AX7000的接口管理的设计是基于PORT和VLAN。它们之间的关系如下图所示:图4.1Port和VLAN之间的关系综上所述,接口管理在交换机的设计中很重要,是不可或缺的部分。1.用户管理交换机需要接口管理,通过合适的接口提供给用户清晰的接口配置命令,使用户使用交互命令行很方便。接口命令应从以下这几个方面主要考虑:(1)SYSTEM(2)PORT(3)VLAN(4)INTERFACE(5)MIRROR(6)ACL(7)QoS等等。2.底层的多有三个不同的驱动,封装成一个相同的接口,以便上层应用的调用。(1)Marvell高速芯片驱动(2)Cavim网卡驱动(3)虚拟网卡驱动3.各个不同的协议收包、发包、控制需要接口管理。 29第四章接口管理需求分析(1)IGMP(2)RSTP/MSTP(3)DHCP(4)ARP等等2.交换机硬件和操作系统之间的同步需要接口管理。(1)ARP信息(2)ROUTE信息3.无线模块和有线模块之间需要接口管理,实现不同模块的融合。(1)WLAN(2)三层INTERFACE(3)Capwap协议从第一点可以得出用户需要系统整体信息,这些信息对于交换机管理方面来说不是主要的,所以它可以直接从CPLD读取。Port和VLAN是交换机的基础,通过对这两个方面的管理可以实现最简单的网络拓扑,所以AX7000以它们设计了接口管理方案。而INTERFACE主要针对三层接口,物理Port的提供从第二点上看有两种,一个是交换芯片,一个是Cavium网卡,那么针对不同的硬件就有两种不同的实现方式。对于简单的网卡只能基于Port,对于交换芯片则可以是基于Port或VLAN,所以最终的接口定义仍挂载在Port和VLAN上。MIRROR和QoS可以把它们看成一个特性功能集,从芯片手册上看,它们的实现仍然与Port和VLAN有关,最终这些特性集接口定义还是和Port或VLAN绑定。第三点是协议模块,协议RSTP/MSTP的作用是去除网络中的环形连接,IGMP是VLAN内的组播管理协议,它们作为桥协议,仍旧是Port和VLAN之上的接口,不过会有基于端口的部分,也有基于VLAN的部分。DHCP和ARP以及第五点中的路由都是基于三层接口的协议,所以最终还是归结到Port和VLAN上。无线模块在管理AP,和AP通信的过程,以及之间通信的协议都是基于TCP或UDP套接口,它是三层之上的功能,那么最终归结下来仍是三层接口如何给它提供服务,因此这些接口的管理仍是三层接口的管理。最终Port和VLAN与这些接口之间的关系就如同下面的4.2图所示。图4.2接口与Port和VLAN之间的关系图 29第四章接口管理需求分析4.3接口管理建模AX7000硬件结构如第三章所示,使用了16核的CPU,使用了两块高速转发芯片,使用了高速网卡,因此在硬件层面AX7000已经具有了超强的性能。傲天公司以自身的技术为基础,在项目研发中大量使用了开源软件。由于CPU是MIPS架构,Linux2.6内核完全可以支持这一架构,并且增强了对多核CPU的支持,修改了系统调度策略,而且是免费使用减小开发成本,所以选用它来说很适合。对于高端交换机,路由管理是一个很重要的方面。在Linux操作系统的前提下,最终选用开源并且比较稳定、安全的Quagga软件来完成这方面的功能。在Quagga软件中集成了两个主要功能,一个是路由管理,一个是命令解释,所以命令行模块的主体问题已经解决。命令行模块肯定要以一个独立的进程存在,那么命令行和接口管理方面的通信就是一个大问题,Linux下的D-Bus技术正好可以解决这个问题。AX7000的开发重点在于接口的设计。根据接口实现上层的命令行,接口管理函数,底层芯片操作,这是一个从上到下的纵向过程。还有横向的过程,就是报文在芯片中的转发。纵向功能就像是一个个的阀门,横向就如同一个管道。阀门控制管道里面的各种流量。因此在测试时分成两个步骤,首先是命令的纵向测试,看命令配置过程是否正确;其次是命令横向测试,这主要是命令效果的测试,也就是这个命令对转发的影响是否正确。AX7000的硬件是多核CPU加ASIC芯片的设计,则整体软件设计架构就体现了这个方面的设计,如图4.3所示[27]。图4.3AX7000软件总体架构 29第四章接口管理需求分析上图中可以看出,软件的设计主要集中在CPU的一个控制核上。控制核上有操作系统,基于操作系统运行网卡和芯片驱动,Web网管软件,无线模块,接口管理模块以及桥协议模块。其他核上有自己的转发软件和控制命令行。接口管理依托上面所述的软硬件以及上面所述的那些功能,它主要有以下三种业务处理情况:1.接口管理处理用户配置。AX7000要使用于各种网络拓扑,则它需要处理多种配置。配置的最终目的是设置到硬件或软件上,使报文能够按照用户的要求进行转发。根据不同的接口类型进行设置时,消息分发也是不同的,这期间有用户命令直接到协议,有通过接口管理进行转发到协议或直接到硬件网卡驱动和芯片。如图4.4所示。在这个业务处理过程中主要用到了D-Bus技术。D-Bus以它特有的通道建立机制和消息分发帮助接口管理方便实现用户配置处理业务。图4.4用户配置业务图2.接口管理处理报文。当报文从Cavium网卡或Marvell芯片收到后,它们的处理流程是不同的,但是两者之间是可以互通的。两个硬件在接口管理的软件设计中被封装成一个设备,给用户的感觉只是面板上的端口编号不同而已。报文的交互是CPU经过处理后根据相应的表项把报文从不同的通道送出去,有可能是PCI通道,有时候是SPI或其他通道,这些不同的通道连接了不同的硬件,最终报文从正确的端口转发出去。这一业务的实现主要是通过硬件驱动实现。Marvell有自己强大的驱动应用库函数,Linux虚拟驱动则是通过接口定义给Marvell芯片端口和VLAN虚拟Linux内核网络设备,使这一个业务流得以实现。详细的业务关系如图4.5所示。3.接口管理同步各个模块之间的信息。AX7000从根本上说只有应用、接口管理层面、Linux内核、硬件系统这四个方面。要使交换机正常用转则这四个方面的同步是必不可少,根据不同的特点这四方面的交互使用不同的方法。应用与应用这是进程或线程之间的通信多使用本地socket。 29第四章接口管理需求分析应用和接口管理之间是通过D-Bus这个软桌面总线实现。接口管理和Linux内核之间是通过虚拟网卡驱动或netlinksocket实现。接口和硬件是通过封装的接口函数。详细的业务关系如图4.6所示。图4.5报文处理业务图图4.6模块信息业务图 29第四章接口管理需求分析 65第五章接口管理设计实现第五章接口管理设计实现5.1软件模块设计实现接口管理从上面的需求来看,它几乎涉及了交换机所有的部分,从硬件到软件,从底层到应用,从有线到无线等等。所以对于AX7000设计,一定要体现实现它的功能,但也要体现出自己本身的特点,还要有很高的可扩展性。根据前面的需求分析,可以把软件设计为这么几个模块:命令行模块,协议模块,芯片操作模块,板载设备操作模块,芯片功能库模块,无线模块,虚拟网卡驱动模块,接口管理模块。1.命令行模块命令行模块主要是由Quagga开源软件中的Vtysh和Zebra实现。Vtysh是创建,管理,维护命令节点,分析命令字的模块,把命令传给接口管理模块。命令节点是一个结构体,里面最主要的有命令字,命令字的执行函数指针,命令字的逐个单词解释。DEFUN宏就是完完整整的定义这个结构体,并实现命令字函数体的定义。Dcli是开发人员根据定义的接口在vtysh中添加的新功能命令。而添加的新命令根据不同的接口则添加在相应的接口模块,使程序看着整齐,分明。通过DEFUN定义自己的命令后要调用相应的函数把自己的命令结构体挂在vtysh相应的节点下。这样命令才会显示在命令行上面,才能被用户使用。Zebra是路由模块,里面实现了各种路由协议,比如说rip,ospf。它还提供了一套Linux用户空间和内核空间交互的命令,比如命令ipaddressA.B.C.D/M就是其中一个。2.协议模块协议模块中主要就是桥协议的实现,现已实现两个协议RSTP/MSTP和IGMP。RSTP/MSTP协议即生成树协议,是一种二层管理协议,它通过有选择性地阻塞网络冗余链路来达到消除网络二层环路的目的,同时具备链路的备份功能。由于生成树协议本身比较小,并不像路由协议那样广为人知。但是它却掌管着端口的转发大权—“小树枝抖一抖,上层协议就得另谋生路”。STP在802.1d中定义,RSTP在802.1w中定义,MSTP在802.1s中定义。IGMP即Internet组管理协议。它让一个物理网络上的所有系统知道主机当前所在的多播组。多播路由器需要这些信息以便知道多播数据报应该向哪些接口转发。IGMP在RFC1112中定义[Deering1989][28]。IGMP是IP层的一部分。IGMP报文通过IP数据报进行传输。IGMP有固定的报文长度,没有可选数据。3.芯片管理模块 65第五章接口管理设计实现芯片管理模块主要是在nam中实现。nam里面包含了针对芯片各个功能的配置的函数。芯片功能配置主要有FDB,PORT,VLAN,ACL,MIRROR,ARP等等。芯片的配置功能的实现是靠封装芯片提供的驱动应用函数库,给npd的接口提供下层的芯片操作函数。1.芯片功能库模块芯片功能库模块主要是mcpss。mcpss是marvell提供的芯片驱动应用函数库。它里面主要包含了芯片的初始化,包含了从芯片到内存的收发包机制,还有就是对常见的芯片功能配置的函数。2.板载设备管理模块板载设备操作模块主要是nbm。nbm是对AX7000主板和Cavium网卡一些特性配置的功能函数。3.无线模块无线模块是wcpss。wcpss包含了实现WLAN的各个模块,capwap协议模块,wid,wtp,wsm等等,完成了无线控制器对无线网络的集中管理。4.虚拟驱动模块虚拟驱动模块是kap。kap是Linux的用户空间报文到内核或内核报文到用户空间的一个传递工具。它的功能就像是一个网卡一样,完成了报文送LinuxTCP/IP协议栈和协议栈发送报文的功能。5.接口管理模块接口管理模块在软件设计中是npd。npd是接口管理的主要实现模块。也就是npd里面定义了接口管理的核心数据结构,并且软件上保存了芯片里面的设置,同步芯片里面的表项,把芯片功能构建成一个易于理解的软件模型,上层的调用只要调用npd提供的相应接口就可以实现功能,而不用去关注底层的细节。这些模块的关系如图5.1所示。AX7000设备主要是转发报文,而不是产生报文。首先是交换机启动和初始化,首先启动的npd进程中的芯片初始化线程,接着是DMA收发包线程,MSTP,IGMP收发包线程,再就是路由学习等等线程。接下来启动协议进程和Quagga等多个进程恢复以前交换机配置准备转发报文。nam和nbm是作为两个函数库存在。报文从某一个网口传输进来到了芯片。首先芯片先做报文的解码(也就是物理层面上东西);接着是芯片的TCP/IP协议的数据链路层来做;分析报文的二层头,根据二层头的DMAC和报文进入时的网口的pvid(端口以untag形式加入的vlan的vlanid)在FDB表里面查询,如果查询到相应的表项,则根据表项的端口信息转发;如果没有查找到相应的表项,FDB就会自动学习这个报文的SMAC,进入设备时的端口号,pvid等,以便新的转发。当然没有找到不会就此把这个报文丢掉,芯片会在pvid这个vlan中广播此报文。当相应的表项被找到,但是表项 65第五章接口管理设计实现图5.1软件模块关系图的端口信息是63(cpu端口),而且isRoute[29]字段是真,则这个报文要送三层处理。三层处理就是路由表的查找,如果找到,根据路由表中的相应信息,更改报文的相应字段,转发此报文。如果没有找到则说明此报文的地址不可达,报文被丢弃。如果报文找到相应的表项,但是表项的命令字是traptocpu则报文就会被送到cpu处理。以上这些就是报文在硬件中的处理流程,全部由marvell芯片自己控制,不需要软件的干预,用户唯一要做的是在转发之前的正确配置,这也就是命令行模块的作用,这些设置中要对接口模块,要对协议模块以及无线模块进行设置。创建新的接口,配置新的VLAN参数等等。当报文要被送到CPU,这里完全就是npd模块进行管理了。首先是就是外设和内存的交互,这个交互是npd的DMA控制线程实现。芯片的DMA控制器把报文从外设的存储器中拷贝到内存。紧接着是对报文进行分类,去掉报文中的DSATag,然后封装上其他模块需要的信息,让其他模块处理。如果是ARP则npd中的ARP功能模块进行ARP学习做软件保存,并且把学到的ARP写到芯片的ARP表中。如果是BPDU报文则把这个报文送STP/MSTP协议处理进程。如果是IGMP报文,则送IGMP进程处理。同时ICMP,ARP,TCP,UDP,DHCP和无线报文等经过Linux虚拟网卡驱动送LinuxTCP/IP协议栈处理。处理完这些报文后,相应的应答报文会经过Linux虚拟网卡驱动被转发出来,则报文又从内存经DMA发给Marvell芯片的存储单元,芯片再把报文发送出去。 65第五章接口管理设计实现如果报文从板载网卡进入,则报文直接通过PCI被送到Linux内核TCP/IP协议栈,通过内核进行处理后再做相应的转发。当然还有很多报文转发的通道,比如通过SPI或其他芯片,而这些都是通过提供给用户的接口配置命令进行选择。mcpss模块和npd模块的关系是调用关系,mcpss作为一个库存在,npd在启动的时候,首先调用mcpss中的芯片初始化函数创建芯片初始化线程,紧接着启动报文收发线程,等等还有其他线程。mcpss还有一个重要的作用就是按功能提供底层硬件配置函数。5.2基于接口的应用层设计实现上一节主要综述了AX7000设备的软件设计的主要模块以及这些模块之间的联系与功能。在详细阐述接口管理的设计实现之前,先对它的上层进行详细的分析,以便后面对接口管理的设计实现的阐述能更清楚。5.2.1命令行模块设计实现命令行模块主要要完成的功能就是提供给用户配置命令,让用户方便对无线控制器进行配置管理。命令行模块使用的是Quagga开源软件中的Vtysh。Vtysh已经完全实现了命令组织,命令分析,命令格式设计,命令节点设置等等功能。而本文作者所要设计的就是在适当的时候挂载自己的命令节点,挂载自己的命令。Vtysh本身有一个根节点,在这个节点就是ENABLE节点。在这个节点下引申出CONFIG节点,这个节点下引申出很多配置节点。基于AX7000的接口设计,最主要的是INTERFACE,VLAN,ETH-PORT,IGMP,STP,ACL等等节点。当然这些子节点下面根据不同的需求又会添加子节点。一个命令的匹配就是查找最长的字符匹配的一个过程。以下是对Vtysh加载时的启动过程[30]:/*获得Quagga的默认配置文件*/get_default_config();/*建立Vty命令节点树*/vtysh_init_vty();/*初始化节点和功能模块之间的关系*/vtysh_config_init();/*添加开发人员所设计的命令*/dl_dcli_init();在Vtysh的启动过程中调用了dl_dcli_init()函数,这个函数调用加载所有开发人员添加的命令节点以及命令。Vtysh提供的命令行节点结构体如下:structcmd_node{enumnode_typenode;/*节点类型*/char*prompt;/*命令提示符*/ 65第五章接口管理设计实现intvtysh;/*是否可通过VTYSH配置*/int(*func)(structvty*);/*配置文件写函数*/vectorcmd_vector;/*命令节点序列向量*/};要创建一个新的命令节点则只需要定义一个上面的结构体,再使用下面的函数加载:voidinstall_node(structcmd_node*node,int(*func)(structvty*))定义新命令主要使用下面的命令结构体:structcmd_element{char*string;/*命令字符*//*命令响应函数*/int(*func)(structcmd_element*,structvty*,int,char**);char*doc;/*命令提示*/intdaemon;/*所属的守护进程*/vectorstrvec;/*命令描述符序列向量*/intcmdsize;/*命令序列索引*/char*config;/*配置说明*/};然后调用下面的宏实现对上面的命令结构体定义及赋值。最重要的是大括号中的内容,它是命令解析函数的函数体。DEFUN(……){/*命令处理函数*/}以上是在添加新的命令所用到的结构体和API函数。通过利用Vtysh的已经设计好的命令组织执行框架,开发人员只需要定义命令字,命令解析函数。无线控制器的研发是把所有的自定义命令定义在Dcli模块。Dcli中定义的这些函数只是解析命令中的参数,最终对这个命令的执行是在npd模块。npd根据不同的接口分别处理,然后返回给用户处理结果。而npd和Vtysh是两个不同的进程,则利用D-Bus来实现两个进程之间的通信。在AX7000中命令是以功能模块为单元,把各个功能模块的命令全部挂载在各自的命令节点下面。开发不同的功能模块则要开发人员自己添加对这个功能模块的控制函数。下面以一个命令的实现为例说明命令模块的设计与实现。showeth-portPORTNOattributes这个命令是显示端口的物理属性,PORTNO就如同一个变量一样,后面的参数解析就是解析命令字中的PORTNO部分的字符。 65第五章接口管理设计实现如上面设计所述,首先要用DEFUN宏来创建命令结构体,这个结构体如前所说主要是定义命令字,并且定义解析这个命令字的函数。show_ethport_cn_attr_cmd是定义的命令解析函数。这个函数调用parse_slotport_no函数把命令字的中的PORTNO解析出来,然后通过调用D-Bus的dbus_message_new_method_call和dbus_message_append_args函数把解析出来的端口索引发到npd的处理函数处,然后调用dbus_message_get_args函数得到npd端函数的处理结果并按照一定的格式输出。当定义完这个命令体后,要把这个命令结构体挂载到相应的命令节点:voidinstall_element(enumnode_typentype,structcmd_element*cmd)这样在用户命令行才能看见这个命令字。这是一个Vtysh端的新命令创建的过程,各个功能模块的命令都是以这种模式实现。npd端收到dcli传过来的参数,根据D-Bus的消息分发机制调用要对这个命令进行处理的接口管理函数(这就是在第二章中所介绍的D-Bus处理模式)。上面的命令对应npd端的处理函数是npd_dbus_ethports_interface_show_ethport_attr。此函数首先对参数检查,然后根据参数调用nam模块封装的硬件管理函数,读取当前此端口的信息,并且和接口中所保存的信息进行比较,把改变的信息保存到定义的接口中,然后把这些端口信息通过D-Bus通道传回到Dcli函数,Dcli函数用一定的格式把这些信息显示出来。以上只是根据一个接口命令来说明实现过程,当然还有其他的接口命令,只是这些都比较雷同。Dcli端根据接口定义命令,D-Bus根据通道分发消息,npd端的接口操作函数对传过来的参数进行处理,然后回显处理结果给用户,到真正起作用的是在报文转发流程中。一个接口可以对应很多的命令,例如一个三层接口的定义这有三个变量,但是对它的操作有创建,配置,显示,删除。而且命令不只是对交换芯片的控制,它还要对一些特殊协议进行控制,接口模块相应的定义了协议的各个管理接口,这些也都是依附于Port和VLAN。5.2.2协议模块设计实现协议模块主要在做的是STP/RSTP/MSTP——生成树协议。这个协议都作为独立的进程存在于系统中。STP内部只有一棵STPtree,因此必然有一条链路要被blocking,不会转发数据,只有另外一条链路出现问题时,这条被blocking的链路才会接替之前链路所承担的职责,做数据的转发。无论怎样,总会有一条链路处于不被使用的状态。随着网络的发展,发现传统的STP协议无法满足主备快速切换的需求,RSTP的出现解决了延时的问题,它的收敛速度很快[31]。RSTP在STP 65第五章接口管理设计实现基础上额外定义了两种portrole分别是alternate与backup。另外重新规定了portstate(端口状态),分别为Discarding、Learning、Forwarding。 STP和RSTP都采用了一棵STPtree,负载分担不可实现。这也正是MSTP[32]产生的原因,MSTP可以将多个VLAN的生成树映射为一个实例,即vlanmaptoainstance,并不需要那么多的生成树,只需要按照冗余链路的条数来得出需要几棵生成树。如果只有两条链路,并且有1-1000个VLAN,用户可以将1-500定义为instance1,将501-1000定义到instance2。只生成两棵树1和2,同样实现了冗余与负载分担。MSTP是基于RSTP的,MSTP模式下,交换机可支持65个MSTinstance,当然每个实例中的VLAN数目是无限的。下面是RSTP/MSTP两个主结构体:structstpm_t{……STATE_MACH_T*rolesel;/*端口角色选择状态机*//*映射在这个实例上的VLAN位图,用于MSTP*/VLAN_MAP_Tvlan_map;/*现在运行的协议版本*/PROTOCOL_VERSION_TForceVersion;……}另一个是端口结构体:structport_t{……STATE_MACH_T*info;/*BPDU报文信息状态机*/STATE_MACH_T*roletrns;/*端口角色切换状态机*/STATE_MACH_T*sttrans;/*端口状态切换状态机*/STATE_MACH_T*topoch;/*拓扑变化状态机*/STATE_MACH_T*transmit;/*发包状态机*/STATE_MACH_T*receive;/*收包状态机只用于MSTP*/……}在单独设计实现协议STP/RSTP、MSTP后,为了减少接口管理的复杂度,增加项目的稳定性,而且MSTP是兼容RSTP的,因此需要把这两个协议合二为一。设计思路是,在RSTP和MSTP中都有自己的一个变量ForceVersion,这个变量主要是配置协议运行版本,2代表RSTP,3代表MSTP,在协议启动之后通过配置这个变量就能解决这个问题。 65第五章接口管理设计实现融合以后还要涉及到命令的设计,两个版本虽然兼容,但是MSTP的一些参数在RSTP上没有的,还有MSTP的配置都要带上实例的ID。最重要的是MSTP的协议会受到VLAN的变化发生状态变迁,但是RSTP是一个静态的,它只与端口有关。针对这些问题的设计方案是把MSTP的instance0看成RSTP。在MSTP中所有的端口都会映射到instance0,这个是不会变化的,无论这个端口加入那个VLAN,这个VLAN被映射到其他的instance,instance0上的端口都不会改变,instance0是MSTP的常量,利用这一属性只要减少RSTP的配置命令就可以实现。而VLAN的变化会影响到MSTP的状态机,则通过定义npd端的管理接口并且建立接口管理模块和协议模块之间的进程通信通道来实现。在npd端定义的基于端口的协议接口如下:structstp_info_s{booleanstpEnable;enumstp_running_modemode;unsignedintmstid[MAX_MST_ID];unsignedintpathcost[MAX_MST_ID];unsignedintprio[MAX_MST_ID];unsignedintp2p;unsignedintedge;unsignedintnonstp;enumstp_state_ent_sstate;NPD_ETH_PORT_LINK_CHANGE_NOTIFIER_FUNCnpd_stp_port_notifier_func;};接口管理模块和协议模块之间的通信使用UNIXsocket实现。这种实现比较简单,比较安全,唯一的不足是比较慢。UNIXsocket通道的建立和网络编程上的socket建立是同样的,只是它在建立的时候两端各自绑定的地址是临时文件。发送端把所有的东西都写到和接收端绑定的文件上,然后接收端再读取。接口管理模块对socket控制的几个主要函数如下:npd_rstp_sock_ini();/*创建socket*/npd_read_stp_ports_state();/*读取协议端的信息*/npd_cmd_write_ro_rstp();/*向协议端发送信息*/协议端对socket控制的几个函数如下:npdSocketInit();/*创建socket*/npdSocketRecvfrom();/*读取接口管理端的信息*/ 65第五章接口管理设计实现npdSocketSendto();/*向接口管理端发送信息*/以配置MSTP协议的instance为例阐述它们之间的实现方式。Vtysh端的配置命是“configspanning-treemap<1-4094>instanceMSTID”,表示把某个VLAN映射到MSTID的instace上。首先npd端的npd_dbus_stp_set_stpid_for_vlan函数在接口上保存并写入到芯片上,同时协议端也会收到此消息在port_t,stpm_t中进行保存,然后刷新协议重新进行状态计算。当协议状态出现后,协议通过socket把相应Discarding,Learning,Forwarding信息发送到npd的协议管理模块,更新接口stp_info_s中的协议信息,再调用nam中的硬件操作函数写到转发芯片中,使芯片的报文转发作出相应硬件措施。当用户想看状态机的用行结果则,直接调要stp_info_s中的信息即可,它是硬件信息以及协议状态的备份。当修改添加删除VLAN或增删VLAN中的端口时都会影响MSTP,这些则是通过在改变VLAN或端口的时候调用如下函数实现:/*由于创建VLAN,则通知新VLAN映射到instance0*/npd_mstp_add_vlan_on_mst();/*由于删除VLAN,则通知把instancen上映射地这个VLAN删除*/npd_mstp_del_vlan_on_mst();/*由于VLAN上删除此端口,则把此端口加到VLAN所映射的instancen*/npd_mstp_add_port();/*由于VLAN上删除此端口,则把此端口从VLAN所映射的instancen删除并且加到instance0*/npd_mstp_del_port();当这些消息通过这四个函数发送到npd端,则分别解析它们穿过来的命令字以及VLANID或端口索引,调用协议特定的API改变MSTP的属性,从而影响状态机的变化。命令模块和协议模块只是接口管理上层应用的一小部分,但是仍可以说明接口管理的作用。接口管理对这些配置命令提供接口,抽象协议接口,使协议可以和硬件及其他接口相互平滑的通信。接口管理的设计实现还有一个很重要的模块就是驱动模块。5.3接口底层驱动模块设计实现5.3.1虚拟网卡驱动模块设计实现 65第五章接口管理设计实现在接口管理中除了要给上层用户提供应用接口,另一个作用就是抽象底层驱动功能,封装相应接口。虚拟网卡驱动在整个系统中有很重要的作用,它支持创建多个虚拟网络设备,使用户认为这个系统中存在多个网卡设备。每个虚拟网卡可以如同真实的网卡一样配置IP地址,查看网络状态。AX7000的硬件架构设计是通过Marvell高速转发芯片实现,但当是发给网关的报文,比如ICMP,ARP,DHCP报文等等,这种情况需要一个TCP/IP协议栈来处理这些报文。这种报文的产生首先要创建三层接口,或是基于端口或是基于VLAN,在同时对ASIC芯片进行了设置,也就是说在这个端口或VLAN中接收到的目的MAC是设备本身的报文,ASIC会不经处理把它们通过特殊端口传输到内存,让接口管理模块去处理。创建三层接口时不光是设置芯片,更重要的是调用虚拟网卡驱动在内核里创建虚拟网络设备,准备把发给网关的报文送到Linux内核的TCP/IP协议栈处理,处理完成后又通过虚拟网卡创建的虚拟网络设备把报文传回,再通过芯片把报文从正确的端口发送出去。根据上面所述,虚拟网卡驱动的作用有两个,一是用户空间和内核空间之间传送数据的手段;二是提供三层接口。在Linux中所有的虚拟空间被分为用户空间和内核空间,内核空间和用户空间不能直接互访的,要通过一定的地址转化或经过驱动程序提供工的read,write,ioctl等函数来实现。驱动的实质就是实现这些函数。报文要从用户空间到内核空间则就需要一个驱动,另外报文要被送到Linux内核的TCP/IP协议栈则需要网络设备来实现。由于在AX7000中有二十多个端口,可以配置4096个VLAN,用户可能创建基于这么多的端口,VLAN三层接口,给它们配置上IP,用硬件实现是不现实的,所以就需要随时可以创建或删除的虚拟网络设备供系统使用。三层接口的功能不只是顺利的让芯片中的报文传到内核,最重要的是内核的报文也能正确地传回,传回的时候带上正确的转发信息,比如转发的端口或VID。只有这样芯片才会做出正确的判断,发送正确的报文。图5.2是虚拟网卡驱动提供的三层接口和交换芯片的关系图。图5.2三层接口和交换芯片关系图虚拟网卡驱动特殊用途,决定了虚拟网卡设计的特殊性。从结构上来说,kap驱动并不单纯是实现网卡驱动,同时它还实现了字符设备驱动部分。以字符设备的方式连接用户态和核心态。图5.3是虚拟网卡和物理网卡对比图。 65第五章接口管理设计实现图5.3虚拟网卡和物理网卡对比图从上图可以看出,虚拟网卡和物理网卡主要就是虚拟网卡没有硬件支持,它的报文来去都是通过用户态程序,所以虚拟网卡驱动的设计必须根据前面所说的两个功能而来,首先要使用户态和内核态能通信,则字符设备驱动可以满足;另一个要用户态的报文能被Linux的TCP/IP协议栈所处理,则网络设备驱动可以满足。接下来的工作就是协调这两个驱动之间的关系。所以kap驱动实现方式是通过字符设备管理网络设备。也就是要创建网络设备,就要通过字符设备提供的ioctl函数去创建这个网络设备,创建以后,就能在shell命令行下使用ifconfig命令设置虚拟网络设备了,通过生成的字符设备描述符,在程序中使用read和write函数就能读取或发送给虚拟的网卡数据了。下面是定义的kap驱动中的主要结构体。每个设备都有自己的私有数据结构,这个里面保存了各自的一些私有数据。在kap驱动程序中,因为要通过一个字符设备控制所有的网络设备,则通过所有的设备共享一个私有数据,私有数据中有收发包队列,所有的网络设备表,网络设备的MAC地址等等。structkap_struct{……wait_queue_head_tread_wait;/*进程等待队列*/structsk_buff_headreadq;/*报文收发队列*/structuser_netdevice**udev_index;/*网络设备表*/structnet_device_statsstats;/*网络设备状态*/unsignedintif_flags;/*网络设备标志*//*网络设备MAC地址和系统MAC相同*/ 65第五章接口管理设计实现unsignedcharif_mac_addr[6];……};kap_struct代表的是一个字符设备的私有数据,它里面的udev_index中存储了所有的网络设备,它们两个之间的关系就说明了字符设备驱动和网络设备驱动之间的关系,也就是一对多的关系。这样的设计就是为了实现前面所提到的要创建基于Port和VLAN的多个三层接口。定义设备结构体structuser_netdevice其中就包含了网络设备类型,即接口类型,是Port模式还是VLAN模式。只有这样才能把芯片上的端口和三层接口之间的关系联系起来,更重要的作用是报文在LinuxTCP/IP协议栈进行处理的时候要和网络设备绑定,驱动就根据传入的报文属性选择对应的它所属的网络设备以及类型。同时当报文从内核协议栈出来的时候,也会根据和报文绑定的网络设备,查找出这个设备对应的设备类型,然后给报文封装上相应的Port或VLAN信息到用户态,然后用户态程序会根据这些信息给报文做一定的芯片可以认识的标记,来保证报文在芯片中的正确发送。下面是structuser_netdevice的具体定义。structuser_netdevice{structnet_device*dev;/*内核网络设备结构体*/KAP_DEV_TYPEdev_type;/*赋予网络设备的类型*/unsignedintl3_index;/*网络设备在内核中的索引*/unsignedintl2_index;/*端口模式的网络设备所对应的端口索引*/unsignedintvId;/*VLAN模式的网络设备所对应VLANID*/};structnet_device[33]结构是linux内核提供的统一网络设备结构,可以说在内核中它就代表了一个网络设备,而虚拟网卡就是利用了这一特点来实现想要的功能。Kap驱动中所涉及到这个结构体里面主要是有以下方面:1.标识变量intifindex全局唯一的设备ID。在每个设备注册时,调用dev_new_index生成。因此在kap字符设备驱动中的网络设备表是以它索引的,还有在npd中,对三层接口的表示也是通过它。2.配置变量有些参数可以在内核初始化此类设备时设置一个缺省值,而有些参数就需要留给设备驱动来填充。可以在运行时通过shell命令或ioctl来修改。在kap中最常设置的就是网络设备的flags,表示设备现在模式,主要有这几种:IFF_UP、IFF_DOWN、IFF_MULTICAST等。3.函数指针表 65第五章接口管理设计实现net_device结构中同样包括了许多函数指针。这些函数指针主要完成以下几个功能,收发数据帧,添加或分析链路层数据包头等。kap驱动中主要实现的结构体中的一些函数指针。open:kap_net_open(structnet_device*dev);close:kap_net_close(structnet_device*dev);/*数据包发送函数*/hard_start_xmit:kap_net_xmit(structsk_buff*skb,structnet_device*dev);/*得到网络接口的一些统计数据函数*/get_stats:kap_net_stats(structnet_device*dev);如第二章所说,无论是字符设备还是块设备,用户对设备的操作都是通过虚拟文件系统(VFS)转化为设备驱动与硬件操作程序交互。即使是访问网络设备的socket接口,也是通过VFS实现的。Linux通过VFS为用户提供了一个统一的设备访问接口,使用户能够透明地访问设备驱动程序。所有的硬件设备都可以使用操作系统的系统调用接口来打开、关闭、读写和I/O控制,而驱动程序的主要任务就是实现这些系统调用函数。在Linux中,字符设备和块设备统一以文件的方式访问,访问它们的接口是统一的,都是通过file_opreation结构体中定义的函数来访问。所以在驱动程序中,首先要根据驱动程序的功能,完成file_operation结构中函数实现。不需要的函数接口可以直接在file_operation结构中初始化为NULL。file_operation变量会在驱动程序初始化时注册到系统内部。当操作系统对设备操作时,会调用驱动程序注册的file_operation结构中的函数指针。虚拟网卡的字符设备的文件操作结构体如下:staticstructfile_operationskap_fops={.owner=THIS_MODULE,.read=kap_chr_read,.write=kap_chr_write,.ioctl=kap_chr_ioctl,.compat_ioctl=bm_compat_ioctl,.open=kap_chr_open,.release=kap_chr_close,};read,读操作,参数buf为存放读取结果的缓冲区,count为所要读取的数据长度。返回值为负表示读取操作发生错误;否则,返回实际读取的字节数。在虚拟网卡驱动中,read函数的主要功能就是用户进程从内核空间得到要发送的报文。write,写操作,与read类似,只是write是从用户空间把报文送到内核空间。ioctl,读、写以外的其他操作,参数cmd 65第五章接口管理设计实现为自定义的命令。在虚拟网卡驱动中,它的主要作用就是对网卡设备的控制,例如创建、删除、修改设备Link状态、IP和MAC地址等等。compat_ioctl,Linux2.6对64bitkernel在structfile_operation中增加的成员,如果compat收到的最后参数arg是一个用户态指针,它在用户态是32位的,在内核中为了保证安全,可以使用compat_ptr(art)宏将其安全的转化为一个64位的指针(仍然是用户指针)[34]。open,打开设备准备进行I/O操作。返回0表示打开成功,返回负数表示失败。release,即close操作。由于这是一个虚拟的网卡驱动,不是PCI设备,也没有硬件中断处理,所以在这个驱动中减少了注册中断和中断响应函数。以上是kap中所实现的字符驱动的函数。字符设备最主要的工作就是read,write,ioctl。在内核中利用misc_register()函数将该驱动注册为非标准字符设备驱动,提供字符设备具有的各种程序接口。在Linuxshell下输入下面的两个命令后就可以使用应用程序来调用驱动做用户和内核之间的交互。#modprobekap#mknod/net/dev/kapc10200通过上面的第一个命令在Linux操作系统上加载了这个虚拟网卡驱动[35],但是要让应用程序能调用驱动函数,需要在Linux的net/dev目录下创建一个字符设备的节点。第二个命令的意思是参数c表示是字符设备,10和200分别是主设备号和次设备号。当打开一个kap设备时,open函数将调用kap_chr_open()函数,其中将完成一些重要的初始化过程,包括设置网卡驱动部分的初始化函数及网络缓冲区链表的初始化和等待队列的初始化。kap驱动中网卡的注册被嵌入了字符驱动的ioctl程序中,它是通过对字符设备文件描述符利用自定义的ioctl设置标志KAPADDIFF完成网卡的注册的,KAPDELIFF完成网卡释放。图5.4是创建虚拟网络设备流程示意图。首先使用open函数打开在/net/dev/处注册的字符设备,返回设备描述符。如果需要创建三层接口则调用ioctl()函数操作字符设备文件描述符,命令标志为KAPADDIFF,传入参数structif_cfg_struct。这个结构中主要包含了这个三层接口的类型是Port或VLAN,还有端口索引和VLANID,当处理完后还要通过这个结构体把创建的网络设备在内核中的索引传到npd端进行保存。structif_cfg_struct{charif_name[16];/*ifname,e.g."en0"*/KAP_DEV_TYPEdev_type;KAP_DEV_LINK_STATUSdev_state; 65第五章接口管理设计实现unsignedintl3_index;unsignedintl2_index;unsignedintvId;unsignedintnetmask;unsignedcharmac_addr[6];};图5.4创建虚拟网络设备流程图到了内核态的驱动程序里,kap_chr_ioctl函数根据命令标志,找到相应的处理函数kap_create_iff创建网络设备。首先调用alloc_dev分配structnet_device,同时调用kap_setup给新的dev挂接网卡驱动的各个处理程序。最后此函数完成非常重要的一步操作,就是对网卡驱动进行注册register_netdev(),并且把传进来的接口信息和新的设备关联起来,后面的报文转发都要使用这些信息。kap设备提供的虚拟网卡驱动,从tcp/ip协议栈的角度而言,它和真实网卡驱动并没有差别。从驱动程序的角度来说,它和真实网卡的不同表现在目前kap设备获取的数据不是来自物理链路,而是来自用户区,kap 65第五章接口管理设计实现设备驱动通过字符设备文件来实现数据从用户区的获取。发送数据时kap设备也不是发送到物理链路,而是通过字符设备发送至用户区,再由用户区程序通过其他渠道发送。使用kap网卡的程序经过协议栈把数据传送给驱动程序,驱动程序调用注册好的hard_start_xmit函数发送,hard_start_xmit函数又会调用kap_net_xmit函数,其中skb将会被加入skb链表,然后唤醒被阻塞的使用kap设备字符驱动读数据的进程,接着kap设备的字符驱动部分调用其kap_chr_read()过程读取skb链表,并将每一个读到的skb发往用户区,完成虚拟网卡的数据发送。当使用write()系统调用向kap设备的字符设备文件写入数据时,kap_chr_write函数将被调用,它使用kap_get_user从用户区接受数据,其中将数据存入skb中,然后调用关键的函数netif_rx_ni(skb)将skb送给tcp/ip协议栈处理,完成虚拟网卡的数据接收。read和write的流程图如图5.5所示。图5.5虚拟网卡write、read流程图Linux虚拟网卡驱动实现了用户空间和内核空间的通信,让到达内存的报文可以进入内核协议栈处理。并且为交换机提供了三层接口使交换机能够自动处理三层转发。三层接口的类型有端口和VLAN之分,两种不同的接口为交换机提供了多种不同的功能。但是这些都是在有物理层支持和收发报文的基础下实现的。而Marvell高速转发芯片做了这个物理层的支持。相应的Marvell芯片驱动的实现在交换机的功能中起至关重要的作用。 65第五章接口管理设计实现5.3.2交换芯片驱动模块设计实现Marvell芯片是挂载在PCI总线上的CPU外设。虽然它和网卡有些相似,但是它本身有处理报文的能力,所以它在内核中注册不是以网络设备去注册,而是注册成字符设备。当有些报文的处理要到特定的协议去,则通过驱动的应用程序实现的DMA机制来完成报文从外设到用户空间的传递,更重要的是用户程序对芯片寄存器的操作。Marvell芯片的驱动是典型的字符设备驱动。设备驱动所实现的file_opreation结构体实现如下:staticstructfile_operationsprestera_fops={.llseek=prestera_lseek,.read=prestera_read,.write=prestera_write,.ioctl=prestera_ioctl,.compat_ioctl=prestera_compat_ioctl,.mmap=prestera_mmap,.open=prestera_open,.release=prestera_release};read,write,open,release,ioctl同一般字符设备的作用。lseek,移动文件指针的位置,只能用于可以随机存取的设备。mmap,用于把设备的内容映射到地址空间,一般只有块设备驱动程序使用compat_ioctl,Linux2.6对64bitkernel在structfile_operation中增加的成员,如果compat收到的最后参数arg是一个用户态指针,它在用户态是32位的,在内核中为了保证安全,可以使用compat_ptr(art)宏将其安全的转化为一个64位的指针(仍然是用户指针)。建立自己的私有数据,创建proc文件,可以在/proc/目录下对驱动的一些参数进行修改[36]。初始化驱动信号灯和时钟周期。Marvell芯片的驱动主要作用是提供read,write,mmap函数,让应用程序可以方便访问到芯片的内存空间。基于上面的驱动,Marvell厂商提供了很庞大的驱动应用开发包。从芯片的初始化,到芯片的DMA机制,还有很多的功能控制函数。在Marvell芯片和虚拟网卡之间还需要专门的收发报文线程,所以基于Marvell驱动应用开发包,在npd中创建两个线程一个收报文一个发送报文。收报文线程的主函数是cpssDxChPacketRxAdapterStartReceive 65第五章接口管理设计实现。首先此函数要做的是把Marvell芯片传来的报文中所带的特殊标记去掉,并且分析特殊标记。然后判断报文类型以决定是送协议模块还是调用虚拟网卡送内核。接着根据特殊标记中端口信息和VLANID查找对应的三层接口的索引,也就是虚拟网络设备的索引。如果找到则把这些信息和报文通过虚拟网卡传到内核中;如果没有则把报文丢弃。如果报文是ARP则首先要送ARP路由学习模块进行处理,最后才送内核。发送报文主线程的函数是appDemoPacketTxVirtNetIfTask。首先调用虚拟网的read函数读取报文,然后根据和报文一块传出来的虚拟网络设备属性,给这个报文建立特殊标记,然后发送到Marvell芯片中,让芯片把此报文发送出去。在系统中,还有主板上的Cavium网卡驱动,至此有了这三个驱动,通过接口管理模块对这三者的封装,配置,就可以实现第四章中数据流的处理业务。虚拟网卡驱动给接口管理提供的是两种模式的三层接口,而ASIC芯片和Cavium网卡则提供了相应的二层接口和不同的网络划分。接口管理就是使交换机经过配置后让这些二层三层的接口正确的串通,网络高速畅通,给用户的网络接入提供优质服务。5.4接口管理设计实现命令行模块,协议模块,驱动模块等等这些模块都是围绕在接口管理的周围。它们有的是给接口管理提供接口,有的在应用接口管理提供的服务。因此说接口管理的是一个错综复杂的软件。5.4.1Port接口AX7000上的端口就是所看到的网口。它的直观功能就是插上网线能上网。但是这种能上网是要经过物理层的协议,链路层,还有网络层甚至是传输层一直到应用层通力合作得以实现。AX7000中使用了两块硬件芯片,一块是275芯片,另一块是804芯片。这两个芯片都使用同一个驱动。所以在Marvell提供的开发包中,每个函数都有一个参数——devNum标识设备号。图5.6显示了硬件结构各种物理端口。从图中可以看出AX7000中的275和804芯片引出端口是24个GE和4个10GE口。这些端口提供给用户使用,就需要有相应的方法能管理它们。在软件中就需要相对应的接口去表征它,就如同网络设备的structnet_device一样。在交换机中最重要的两个功能就是Port和VLAN。后续的开发都是基于这两个功能实现其他功能。比如像三层接口,根据用户需求,它可以有两种类型,一 65第五章接口管理设计实现图5.6AX7000物理端口图种是基于端口的,一种是基于VLAN的;上一节所说的协议模块,当它运行在MSTP版本时,VLAN的改变就会影响到协议的状态机,还有FDB,QoS,ACL等等这些要么与Port有关,要么与VLAN有关。基于这一层考虑,无线控制器的接口管理是通过设计两个核心结构体eth_port_s和vlan_s来实现。接口管理模块设计的Port结构体如下:structeth_port_s{enumeth_port_type_eport_type;/*32bitsofattributes,definedinnpd_sysdef.hBits0~11tohave12kindsofbinaryattributesBits12~15torepresent4bits16kindsofspeed,Bits16~31reservedforfuturemoreattributes*/unsignedintattr_bitmap;unsignedintmtu;structeth_port_func_data_sfuncs;structeth_port_counter_scounters;}; 65第五章接口管理设计实现这个结构体中,枚举变量port_type标识这个物理端口的类型,是普通的电口,还是光口或者是10G口。attr_bitmap变量标识了现在这个端口所支持的物理属性。mtu标识这个端口现在所能支持的最大的二层报文字节。funcs标识端口所有的功能。counters是这个端口上所有流经报文的统计。Marvell芯片的端口物理属性是以下几种:1.端口管理,当端口进入管理状态后才能进行正常的报文收发,退出管理状态后,不能发包;收到的报文包被丢弃。2.端口速率,配置端口速率是10M/100M/1000M。3.端口自协商,端口自协商有速率,流控,双工自协商。4.端口双工模式,在不配置自协商的情况下,这个功能起效。5.端口流控,在不配置自协商的情况下,这个功能起效。6.端口背压,在半双工模式下,这个功能起效。7.端口连接状态,可以控制端口是否连接。8.端口MTU,端口的最大可传输报文长度,默认是1500。以上这些都是一个端口所对应的硬件属性,基于Port结构体就可以对它们进行管理。当别的模块需要读取端口属性,就可以直接在此结构体读取,结构体中保存的值与硬件是同步的,即每次设置时都设置attr_bitmap的相应位或mtu的值。在接口管理模块中对这些物理属性进行管理的有以下函数:npd_set_port_autoNego_status();/*设置自协商*/npd_get_port_autoNego_status();/*获得自协商状态*/npd_set_port_flowCtrl_state();/*设置流控*/npd_get_port_flowCtrl_state();/*获流控状态*/npd_set_port_backPressure_state();/*设置背压*/npd_get_port_backPressure_state();/*获得背压状态*/npd_set_port_admin_status();/*设置管理*/npd_get_port_admin_status();/*获得管理状态*/npd_set_port_link_status();/*设置Link状态*/npd_get_port_link_status();/*获得Link状态*/npd_set_port_mru();/*设置mtu*/npd_get_port_mru();/*获得mtu大小*/这些函数即是提供给命令行的接口处理函数,也是提供给其他模块的调用函数。当用户从命令行对端口的物理层设置后,报文的处理流程就如图5.7所示。这说明了在结构体中的attr_bitmap和mtu的作用,这些基本的物理层功能,是Marvell芯片端口所赋予的。这些接口管理函数对于报文流来说,是一个纵向的管理控制过程,通过设置这些功能,完成对无线控制器报文收发的控制。在AX7000的高速芯片中把报文处理分为ingresspipe和egresspipe。这两个管道上最重要的几个功能就是IngressPolicyEngine,BridgeEngine,Router 65第五章接口管理设计实现Engine,TransimitQueueScheduling以及EngressPolicyEngine。而这些归结起来就是TCP/IP网络模型的底下三层——物理层,数据链路层,网络层。在一个报文被无线控制器处理的过程中,为使这个横向的过程能受人控制,加入了物理层管理,数据链路层管理,网络层管理以及安全管理等等纵向的控制。前面设计实现的对attr_bitmap和mtu的管理就是对物理层的管理。图5.7物理层收发报文流程图如果要对后面的数据链路和网络层管理以及网络安全管理,则还要继续在端口上引申其他功能接口,则下面的结构体就是专为此目的而设计的。structeth_port_func_data_s{/*Bitmapoffunctionsthatisenabledonthisport,wesupportatmost32ethernetportfunctions.Thiscanbeexterndto64functionsinfuture.Thereisadefinitionofthesebitmapinnpd_sysdef.hfile*/unsignedintfuncs_cap_bitmap; 65第五章接口管理设计实现/*Portcapability,hardwaredependant,initializedinthebeginning*/unsignedintfuncs_run_bitmap;/*Portrunningfuncs,canbeconfiguredbyuserduringruntime*/void*func_data[ETH_PORT_FUNC_MAX];};funcs_cap_bitmap标识了端口所支持的功能位图,funcs_run_bitmap标识了端口现已运行的功能标识位图,指针数组func_data就是为扩展基于端口的功能接口而定义的。它是为了运行funcs_run_bitmap中标识的功能而准备的私有数据,也是一个功能接口的表征。有了端口上的各个接口从而使复杂的事情变的简单化。可根据不同的功能对这个接口去编程和应用,但归根结底是实现了Ingress和Egress的功能模块的管理。TCP/IP协议模型定义数据链路层是一根网线之间的传输,为网络层来服务的。这个服务体现在报文上就是每个IP报文多了14字节的链路层数据,目的MAC,源MAC,协议类型。两个相连设备之间的通信,MAC地址起到了决定性的作用。因此AX7000与其他直接相连设备的成功通信就要能很好的管理好自己的MAC地址表——FDB(BridgeForwardingDatabase)。对于数据链路的接口则定义在了FDB的控制和管理上。structeth_port_switch_s{/*二层接口信息*/intisSwitch;unsignedintfdbLimit;/*port-basedFDBprotectednumber*/unsignedintfdbCount;/*port-basedFDBprotectednumberlearnedcount*/NPD_ETH_PORT_LINK_CHANGE_NOTIFIER_FUNCnpd_switch_port_notifier_func;};structfdb_interface_info_s{/*接口上的FDB信息*/booleanisTrunk;union{struct{unsignedchardevNum;unsignedcharportNum;}port;struct{unsignedchartrunkId;}trunk;}intf; 65第五章接口管理设计实现};npd_switch_port_notifier_func是函数指针,这个函数主要作用是当端口出现Link状态变化时,对相应的功能disable或enable。其他功能接口都有这个函数。这是无线控制器上最经常出现的事件。TCP/IP协议模型定义的核心层是网络层。网络层实现了报文的广域传输,通过Internet远在地球两端的人可以视频,对话,共享文件等等。而这些的实现都是靠Route来完成。AX7000作为一个企业级的高层交换机,也具备这种路由功能。对路由功能的实现就是接口管理的三层接口。三层接口的实现是通过Linux虚拟网卡驱动。以下是网络层功能接口的定义:structeth_port_intf_s{/*基于端口的三层接口信息*/unsignedintifIndex;enumVLAN_PORT_SUBIF_FLAGflag;NPD_ETH_PORT_LINK_CHANGE_NOTIFIER_FUNCnpd_route_port_notifier_func;};structeth_port_promi_s{/*混杂三层接口,这是基于Cavium网卡驱动实现*/enumuplink_type_stype;unionuplink_portup;dot1q_vlan_list_ssubifList;NPD_ETH_PORT_LINK_CHANGE_NOTIFIER_FUNCnpd_promi_port_notifier_func;};如上所述端口有三种接口模式,一是switch接口,一是route接口,一是promisouse接口。这三个接口在每个端口上某一时刻只能存在一种方式,即三种接口是互斥的。switch模式下这个端口只能进行二层报文的转发;在route接口模式下只能转发三层的IP报文;在promisouse下端口是前两种的结合。这样就满足不同用户的需求。不过route接口的通道是PCI,而promisouse是通过SPI到CPU,三层接口的提供者是Cavium网卡驱动。这些接口的实现以及管理函数如下:npd_set_port_switch_mode();/*设置switch接口*/npd_set_port_route_mode();/*设置route接口*/npd_set_port_promi_mode();/*设置promi接口*/npd_del_port_switch_mode();/*删除switch接口*/npd_del_port_route_mode();/*删除route接口*/npd_del_port_promi_mode();/*删除promi接口*/ 65第五章接口管理设计实现npd_set_promi_attr();/*设置switch接口*/npd_port_type_deal();/*对三个接口互斥*/npd_check_port_switch_mode();/*检查是否switch接口*/npd_check_port_route_mode();/*检查是否route接口*/npd_check_port_promi_mode();/*检查是否promi接口*/用户通过这些的接口配置命令互斥设置某一阶段的端口的转发功能。最终报文在这些接口上的转发流程如图5.8所示。图5.8三层接口转发报文流程图当然以上这些接口只满足了用户最基本的需求,对于网络安全,网络监控也是无线控制器上很重要功能。而网络安全的实现主要就集中在策略引擎。对于策略引擎接口的定义如下:struct{/*安全接口信息*/unsignedintpolicerEnable;QOS_POLICER_COLOR_MODE_ENTmeterColorMode;unsignedlongcir;unsignedlongcbs;unsignedintcounterEnable;unsignedintcounterSetIndex;QOS_PROFILE_OUT_PROFILE_ACTION_Ecmd;unsignedintqosProfile; 65第五章接口管理设计实现QOS_NORMAL_ENABLE_EmodifyDscp;QOS_NORMAL_ENABLE_EmodifyUp;};AX7000对网络的协议模块的接口如前面协议模块设计实现小节所述。AX7000中接口不只是基于端口的,还有其他重要的基于VLAN的接口,现在困难的是如何让基于VLAN和基于PORT的接口关联则,设计的时候通过PORT和VLAN的关系来实现。详细的关系在下一节会阐述,反映在PORT结构中,就是下面的结构体:structeth_port_dot1q_list_s{/*针对Tagged端口*/unsignedshortvid;structlist_headlist;};structport_based_vlan_s{/*针对Untagged端口*/unsignedshortvid;NPD_ETH_PORT_LINK_CHANGE_NOTIFIER_FUNCnpd_vlan_untagports_notifier_func;};在AX7000中对端口的引用有三种方式,用户层面看到的是面板上的槽位号/端口号,接口管理层面用的是端口的索引值,在芯片中则是设备号/端口号。这三种不同的标识虽然值不同但是都表示了同一个端口。这种设计也是接口管理的一部分。这几种不同的方式之间的转换如图5.9所示。图5.9端口引用转化图5.4.2VLAN接口虚拟局域网(VirtualLocalAreaNetwork,VLAN)[37]:一种通过将局域网内的设备逻辑地而不是物理地划分成多个网段,从而实现虚拟工作组的技术。IEEE于1999年颁布了用以标准化VLAN实现方案的802.1Q协议标准草案。 65第五章接口管理设计实现VLAN技术允许网络管理者将一个物理的LAN逻辑地划分成不同的广播域(或称虚拟LAN,即VLAN),每一个VLAN都包含一组有着相同需求的计算机工作站,与物理上形成的LAN有着相同的属性。但由于它是逻辑地而不是物理地划分,所以同一个VLAN内的各个工作站无须被放置在同一个物理空间里,即这些工作站不一定属于同一个物理LAN网段。一个VLAN内部的广播和单播流量都不会转发到其他VLAN中,从而有助于控制流量、减少设备投资、简化网络管理、提高网络的安全性。VLAN是为解决以太网的广播问题和安全性而提出的一种协议,它在以太网帧的基础上增加了VLAN头,用VLANID把用户划分为更小的工作组,限制不同工作组间的用户二层互访,每个工作组就是一个虚拟局域网。VLAN在交换机上的实现方法,可以大致划分为4类:1.基于端口划分的VLAN2.基于MAC地址划分VLAN3.基于网络层划分VLAN4.根据IP组播划分VLAN在AX7000中对VLAN的实现采用的是第一种方案,这是IEEE802.1Q规定的依据以太网交换机的端口来划分VLAN的国际标准[38],而且也是最简单的一种。VLAN和端口的关系是一种多对多的关系。一个VLAN可以包含很多端口,一个端口也可以以tagged方式加入多个VLAN,以untagged方式加入一个VLAN,一个端口在VLAN中的形式只有一种,也就是在统一VLAN中一个端口不能tagged和untagged共存。每个端口都有自己的PVID,这个值是和这个端口以untagged形式加入的VLAN的VID相同。如上一节所述在AX7000中,绝大多数的功能除过与Port紧密相关外,另一个重要的是VLAN。VLAN从功能上说可以是二层VLAN,这个VLAN中只能进行二层转发;也可以是三层的,这个VLAN中既能进行二层转发也能进行三层转发。VLAN同样也是一个对TCP/IP网络模型的定义,同样要有网络安全和网络控制以及支持网络协议。基于上面对VLAN功能在AX7000中的分析,对VLAN结构体的设计如下:structvlan_s{/*VLANid*/unsignedshortvid;/*VLANname*/charvlanName[NPD_VLAN_IFNAME_SIZE];/*VLANIGMPsnoopingenableFlag*/unsignedcharigmpSnpEnDis; 65第五章接口管理设计实现/*VLANlayer2info*/structbrg_vlan_info_sbrgVlan;/*VLANlayer3info*/structvlan_intf_info_sintfVlan;/*VLANQ-in-Qinfo*/structvlan_stack_info_sqinq;/*untaggedportlisteth_global_indexlist*/vlan_port_list_s*untagPortList;/*taggedportlisteth_global_indexlist*/vlan_port_list_s*tagPortList;/*trunklist,trunkgroupidlist*/vlan_trunk_list_s*tagTrunkList;/*untagtrunklist*/vlan_trunk_list_s*unTagtrunkList;/*IGMPsnoopingcontrollist*/igmp_snooping_list_s*igmpList;/*DHCPsnoopingcontrollist*/structdhcp_snooping_list_s*dhcpList;/*ACLcontrollist*/structvlan_acl_info_s*aclList;/*QoSPolicycontrollist*/qos_policy_list_s*policyList;};这个结构体主要抽象出了VLAN接口,以及基于它本身的二层接口和三层接口。最更重要的是在它里面定义了VLAN和PORT之间的关系。在每个VLAN接口上,二层接口的设计如下:structbrg_vlan_info_s{unsignedintstate;/*vlanstate:upordown*/unsignedintfdbLimit;/*vlan-basedFDBprotectednumber*/unsignedintfdbCount;/*FDBlearnedonthisvlan*/structvlan_ports_bmpuntaggedPorts;/*untaggedportbitmap*/structvlan_ports_bmptaggedPorts;/*taggedportbitmap*/};下面这个结构体是基于VLAN的三层接口定义:structvlan_intf_info_s{ 65第五章接口管理设计实现unsignedintifIndex;/*vlanId*/enumVLAN_PORT_SUBIF_FLAGflag;};下面这些结构体定义了基于VLAN的协议接口:structdhcp_snooping_info_s{unsignedintitemId;unsignedlongipAddress;unsignedshortvid;unsignedintifindex;/*etherportglobalindex:caculatedbyslot/port*/};structigmp_snooping_info_s{unsignedintgroupId;unsignedintvid;};structigmp_snooping_list_node_s{structlist_headlist;unsignedintgroupIp;unsignedshortvidx;};在VLAN结构体中定义vlan_port_list_s定义了两个链表,一是所包含的untagged端口的端口链表,一是所包含的tagged端口的端口链表。这些和Port中对VLAN的链表形成了一个多对多的关系。通过这种设计使对接口的管理相对简单起来,而且可以把它们当作一个个功能来划分实现起来比较方便。这里只列出对VLAN三层接口的管理函数:npd_intf_create_vlan_l3intf();/*创建三层VLAN接口*/npd_intf_del_vlan_l3intf();/*删除三层VLAN接口*/npd_intf_vlan_check();/*检查是否VLAN接口*/npd_intf_set_vlan_attr();/*设置三层VLAN接口属性*/npd_intf_get_info();/*获得三层VLAN接口信息*/用户通过这些命令设置VLAN为三层接口,则这个VLNA就有了三层转发的功能。VLAN中处理报文还有特殊之处,根据802.1Q定义的一样,AX7000对VLAN的操作也分为三个层次。首先是用户对设备的VLAN配置;然后在通过接口管理模块把对VLAN的配置信息发送到其他模块;最后就是正常的转发报文。在网络中转发的报文都满足标准的802.1Q定义的报文格式。根据802.1Q分类的话,报文可分为VLANTag标记报文和普通二层报文。VLAN 65第五章接口管理设计实现Tag标记报文比普通报文多了4字节的VLANTag标记,加在二层报文头后面。这个标记是转发报文的这个设备根据报文的出端口的VLAN信息给报文打上的。AX7000设置三层VLAN接口后的报文转发流程如图5.10所示。图5.10AX7000VLAN中报文的处理流程接口管理总结起来就是对芯片的Port和VLAN的管理,从它们的本身又引出许多协议及功能接口。这些功能接口,完成了TCP/IP网络模型的物理层、数据链路层和网络层。这是从报文转发流程上来看这些接口功能。如果换一个角度从功能管理上来看,基于Port和VLAN设计这种接口管理就更清楚,这种设计也最简单,最容易扩展。后续开发如果要添加新的功能,只用把这些功能接口定义出来挂载到端口上或VLAN上,就可以很轻松的管理。 65第五章接口管理设计实现无线控制器中端口的拔插动作最频繁,这也是软件处理的一个比较难的问题,因为这个动作引起的处理范围太广,几乎所有的功能模块都可能涉及到。在设计时所有的功能接口都挂接在Port或VLAN上,因此这个操作只能通过遍历所有Port和VLAN接口,对每一种接口作出特定的处理。这个动作的实现是通过在npd中创建一个线程来实现。当Marvell驱动检测到有网线拔或插就会产生一个中断,最终这个中断的处理就是调用npd_eth_port_notifier函数。这个函数中根据传进来的Port索引在全局Port表中找到对应的Port结构体,然后遍历端口中的funs表,在这个表中有所有基于Port的接口,每个接口中都有了一个函数指针如上面的代码中所示,它指向不同的接口处理函数。以下是部分处理函数:/*route接口针对Link事件的处理函数*/npd_route_port_link_change();/*promi接口针对事件的处理函数*/npd_promi_port_link_change();/*VLAN根据VLAN中的untag端口状态对Link事件的处理函数*/npd_vlan_untag_port_link_change();/*VLAN根据VLAN中的tag端口状态对Link事件的处理函数*/npd_vlan_tag_port_link_change();/*RSTP/MSTP协议对Link事件的处理函数*/npd_rstp_link_change();由这些函数来实现网线的拔插对不同的接口所造成的结果。这些正好利用了Port和VLAN之间的关系,Port时刻都属于一个VLAN。所以当Port收到中断时,挨个处理完基于端口上的功能模块后,然后去检查自己加入的VLAN,如果自己是这个VLAN的唯一端口,那么这个VLAN也要跟着Port的状态而变化,基于VLAN的功能模块也要改变。接口管理总体设计思想就是以Port和VLAN为核心结构体,把其他的接口挂接在这两个结构体上,对于这些功能模块分而实现。5.4.3基于接口的ARP、Route学习地址解析协议(AddressResolutionProtocol,ARP)是在仅知道主机的IP地址时确定其物理地址的一种协议。因IPv4和以太网的广泛应用,其主要用作将IP地址翻译为以太网的MAC地址。从IP地址到物理地址的映射有两种方式:表格方式和非表格方式。ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据连接层(MAC层,也就是相当于OSI的第二层)的MAC地址。 65第五章接口管理设计实现路由就是现在广域网的一个核心技术,属于TCP/IP模型的IP层,也就是说路由是通过IP报文头来进行的一种转发技术。设备当要转发一个报文时,它会根据报文的IP头的目的IP地址到路由表中来查找,当找到下一跳表项后,报文会根据下一跳信息被转发出去;如果没有查找到,则报文会被丢弃掉。这些路由表项是通过RIP,OSPF,BGP,IGP等路由学习而来。但在最初的时候是当所有设备没有一条路由时,这些路由学习协议也就没有用武之地了。所以最初的路由有以下两种方式来实现,一是通过ARP协议来组织主机路由,一是通过人为配置得来网段路由。在AX7000中硬件芯片中集成了路由表。路由表不是一个表项,它是由三个表组成,路由TCAM[39]表,查找转换表,路由表。要查找一条路由首先要从TCAM表开始根据TCAM表中得到的索引,再到查找转换表中找到路由表的索引,则索引到路由表中的表项,最后把报文转发。一个完整的路由查找流程如下:图5.11AX7000路由表关系图在ARP表中又分为两个表一个是下一跳表和MAC表。查找方式如同上。因此ARP和路由的学习在AX7000中是一个很重要环节。在AX7000中把路由有分为三类,第一类是主机路由,第二类是网段路由,第三类是默认路由。ARP协议所引起的路由学习就是第一类的学习。第一类的学习是和三层接口紧密相连的一块。所以对于ARP的报文AX7000采取了特殊处理,当某个端口收到ARP报文后,如果这个端口是三层接口或者端口所属的VLAN创建了基于VLAN的三层接口,则ARP报文被mirror到芯片的63端口,让CPU处理这个报文。这时就会使用虚拟网卡把报文送到Linux内核协议栈处理,内核会在自己的内核路由表和ARP表进行学习。这个过程就是在前面所说的npd的两个专门的收发报文的线程中引起。当内核的这个表项经过一定的时间老化掉则内核会通过netlink向应用程序发送广播通知。接口管理的ARP和路由功能模块会对通知消息进行处理,首先会根据这个报文发送ARP请求,发送三次,如果没有响应,则这条ARP表项和相应的路由表项会被删除。在这个功能模块的设计是用两个hash表实现,一个表对应硬件的nexthop表,一个对应MAC表。下面是两个结构体的定义: 65第五章接口管理设计实现structarp_snooping_item_s{unsignedintifIndex;unsignedcharmac[MAC_ADDRESS_LEN];unsignedintipAddr;unsignedcharisTagged;unsignedshortvid;structfdb_interface_info_sdstIntf;unsignedshortvidx;booleanisStatic;};structroute_nexthop_brief_s{unsignedintifIndex;/*L3interfaceindex*/unsignedintipAddr;/*ipaddressassociatedwithL3interface*//*Next-HopTableindextoholdNext-Hopdetailinfo*/unsignedinttblIndex;/*counterforthisNext-HopusedbyRouteentry*/unsignedintrtUsedCnt;};如AX7000网关ARP,路由学习流程图图5.12和上面的程序所示,接口管理对ARP和路由管理是通过管理哈希表和交换芯片的硬件表实现。哈希表的信息是硬件表的备份,和内核中的路由表ARP表同步,给上层软件应用提供支持。AX7000上的这些表项的老化机制是借用Linux的内核老化来实现。在内核中ARP表项和路由表项是与某个特定的网络设备相关联的。因此对于ARP和路由的学习都是在创建三层接口的情况下实现,这些接口如前面所说是和不同的端口或VLAN来对应表示特定类型的网络设备,这就把相应的内核表项和外部的端口和VLAN相关联起来。在用户态要用到这个网络设备和内核同步时,就使用三层接口保存的虚拟网络设备内核索引。在虚拟网卡的实现时候有相应的VLAN模式和端口模式,VLAN模式保存VID,端口模式保存端口索引。有了这个相应的设备索引,通过驱动的ioctl就可找见相应的设备。在ARP的学习主要定义了以下三个函数:npd_arp_snooping_learning/*主要是对npd的hash表进行操作*/npd_arp_snooping_synchronize_item/*主要是内核和的hash表同步*/nam_arp_snooping_op_item/*主要是对芯片表项的操作*/ 65第五章接口管理设计实现AX7000的接口管理中对TCP/IP模型的抽象是软硬件的结合,二层的抽象主要是对硬件上的处理,三层的处理是软硬件结合的处理。二层功能主要集中在转发芯片的控制上,通过提供端口的switch接口,用户可以通过命令来对二层转发进行配置和控制。三层功能的实现是以软件为主导,通过创建基于端口或VLAN的三层的接口,实现给端口VLAN配置IP,使端口或VLAN成为接入的一个网关,从而在这些三层接口上进行启动DHCP、telnet、SSH等服务,最最主要的作用就是给无线协议的提供服务。图5.12AX7000ARP报文处理流程5.5接口管理测试接口管理是一个中间层面的东西,它的设计是一种开放式的设计,所以测试首先是代码走读,接着提交测试部进行单个功能方面的测试,最后进行流量测试。以下是部分接口的的测试用例列表[40]: 65第五章接口管理设计实现表5.1AX7000部分接口测试列表1.1.1可以成功创建三层vlan接口可以成功创建高No1.1.2可以成功实现端口route模式下的三层接口可以成功创建高No1.2.1可以成功删除三层vlan接口可以成功删除高No1.2.2可以将端口修改为一般的switch模式可以成功删除高No1.3.1在一个接口上可以配置不同网段的IP可以配置高No1.3.2不同接口不可以配置相同网段的IP不可以配置高No1.3.3可以ping通接口上其余ip地址可以ping通高No1.3.4通过其余ip可以进行ip报文转发可以进行报文转发高No1.3.5可以通过其余ip配置静态路由可以配置,并能正常工作高No1.3.6可以在其余ip上运行BGP路由协议可以正常运行高No1.3.7可以在其余ip上运行OSPF路由协议可以正常运行高No1.3.8可以在其余ip上运行RIP路由协议可以正常运行高No1.8.1可以通过三层物理接口互相ping通可以ping通高No1.8.2静态路由的出接口可以是三层物理接口,并可以根据该条路由完成三层转发可以完成三层转发高No2.3.1可以正确显示某个甚至所有接口信息showinterface[IFNAME]若不指定接口名,则显示当前系统所有接口信息中No4.4.1创建三层VLAN,并通过三层进行转发,反复向VLAN里添加端口交换机仍能正常工作,无内存泄漏等异常现象4.4.2通过三层物理口线速进行三层转发,报文源mac不断变化,同时用脚本使该物理口不断地进行二三层转发模式切换交换机仍能正常工作,无内存泄漏等异常现象中No5.2.1在vlan中添加trunk,然后进行三层转发可以正常进行三层转发低No 65第五章接口管理设计实现6.1.1端口在switch/route/promiscuous之间转换可以转换,实现功能正常高No部分接口流量测试Bug单:图5.13VLAN接口Bug单截图图5.14流量错误截图 65第五章接口管理设计实现图5.15AX7000控制APBug截图以上只是接口管理的部分测试用例和Bug单。经过测试部的测试,现在AX7000在接口管理的基本配置和虚拟网卡,以及ARP路由学习方面已经比较稳定,但是在流量控制上仍然有部分的Bug,网关流量的接收和发送上处理能力比较有限需要改进。总体上说AX7000接口管理的设计和实现是成功的,只有小的部分需要优化。 67第六章结束语第六章结束语6.1全文总结接口管理在有线无线一体化交换机起着决定性的作用,是交换机软件开发的核心内容。接口管理其内容包含了系统中所有底层硬件驱动、上层应用,是软件层面上的一系列核心结构体,主要目的是为了高效合理的管理交换机,并且以它为核心进行软件开发,扩展功能,版本的移植。因此接口管理逻辑关系复杂,与系统软硬件功能模块紧密相关,也是中高端交换机管理方式的定义。本文以某公司无线控制器的开发项目为背景,以作者所参与的实际工作为依据,着重论述了一下几个方面:1.AX7000的总体结构与无线控制器接口管理模块的需求;2.基于接口管理的命令行模块,协议模块的版本融合的设计实现;3.给接口管理提供接口的虚拟网卡驱动的设计实现;4.基于Port和VLAN对接口进行管理的设计实现,以及基于接口的ARP、Route学习的设计与实现;5.对接口管理的测试结果。6.2工作展望2008年8月AX7000在北京京广大酒店开通实验局,经过复杂网络环境和大流量测试,各项指标符合京广大酒店的要求,并在奥运会期间成功应对高客流量的网络使用问题,现在设备已被京广大酒店购入。2008年9月,一台AX7000,3台AX5000,20个AP在北京工业大学耿丹学院开通实验局。这些设备所组建的网络在大流量有线无线网络同时应用下,一直运行良好。虽然客户对AX7000的性能都比较满意,但是为了满足用户不断提高的需求,它的部分性能需要优化改进。从现有的测试来看,虽然虚拟网卡驱动在报文的传输时速率已经满足要求,但是仍有进一步提高可能。AX7000中的功能模块很多,为了提高程序的并发性,在软件实现上使用了多进程和多线程。并发性的提高能带来程序的效率和CPU的利用率,但是这样增加了进程间通信、同步的难度,在后续中最好能把一些功能相近的进程合并,以减少进程间通信的次数。现在这些功能,公司正在优化,新版本中性能会有很大的提升。 67第六章结束语 69致谢致谢至本文完成之际,谨向给予我指导、关心和帮助的人们表示衷心的感谢!深深感谢我的两位导师西安电子科技大学顾新教授、实习公司交换项目组项目经理秦华松,本课题的设计工作始终是在二位导师的悉心指导和热情鼓励下进行的,两位导师倾注了大量的心血,提出了很多重要的方案。他们渊博的知识、认真负责的工作精神、严谨的工作态度令我受益非浅。在此,谨向他们表示我最诚挚的敬意和感谢。感谢西电软件学院各位老师、同学和同事,你们给了我很多生活上的关心和帮助,知识上的指点迷津,学业上的促进与鼓励。特别要感谢实习公司范成龙、陈斌高级工程师,你们不仅教给我很多解决问题的方法,也给了我很多对待人生的启示。感谢我的家人,是他们的鼓励和支持激励我不断地努力。'