关键词:PCI设备 Linux 通用网络实验设备
在网络技术快速发展的今天,根据用户特殊的需求,有时需要研发特殊的私有网络协议,以使网络的性能得到优化。研究新的网络协议,必须进行仿真以验证性能,但是网络结构复杂,性能指标多样,并且不同的协议需要的具体测试环境不同,因此很难用纯软件的方式(如NS2、OPNET)给出网络协议运行性能的有效描述。另一方面,如果针对每一种网络协议搭建专门的测试平台,则需要大量的人力、经费和时间。而采用中硬件相结合的方法搭建一种通用网络协议实验平台,既能很好地测试出整个设备的性能,又能大幅度节约开发成本,缩短开发时间,是一种切实可行的方法。
为此,本文提出一种通用网络协议实验平台的软硬件设计方案,并详细介绍该平台的中硬件设计方法。1 系统设计的思想
该网络实验平台设计的目的是:针对不同的私有网络协议,开发者可以根据协议标准有针对性地修改网络层和传输层的程序代码,然后通过本系统测试其协议的性能。所以,该系统应该是一个与协议无关且可程控的数据传输通道。数据包经过系统传输后,更多的工作由传输层、网络层和上层应用程序完成。该系统的整体框架结构如图1所示。
为了保证实验平台的通用性可操作性,采用PC机和与PCI总线接口的网络设备卡(以下简称PCI接口卡)组建该平台。
近年来,Linux操作系统获得了突飞猛进的发展,它强大的功能、良好的界面、高效率以及全开放的特性使其具有很强的吸引力。基于以上考虑,在PC机中采用Linux操作系统。按Linux操作系统的设计标准,私有网络协议软件需要包含传输层代码、网络层代码以及与设备相关的驱动程序,并运行在系统“核心态”中。在本实验平台中,不需要用户关心驱动程序的设计,但允许将网络层和传输层代码运行在Linux“用户态”中。 PCI接口卡是基于PCI总线的,它通过合理选择接口芯片屏蔽PCI总线协议的多余功能,并使用FPGA芯片把上层传输过来的数据包进行相应的处理(详见第2节),然后传递到物理层设备。
2 实验平台的硬件设计
2.1 PCI接口卡结构
PIC接口卡由PCI总线接口芯片、数据处理模块FPGA、数据缓存模块RAM和有线传输驱动模块LVDS(Low Voltage Differential Signaling Driver)等四部分组成,模块间的数据传输如图2所示。
2.2 芯片的选择
Winbond公司以太网控制芯片W89C840AF支持高达100Mbps的双向数据传输,该芯片不但具有良好的PCI总线接口设计,而且还有一整套的网络数据传输机制,技术成熟。所以在此选用W89C840AF,并借用该芯片的网络数据传输机制,通过对芯片合理配置,实现一条从驱动程序到物理层设备的透明数据传输通道,来满足设备要求。 FPGA芯片只要能够提供足够多的I/O口和内部硬件资源即可。RAM是为了满足不同网络协议以及算法对存储器的需要而设置的,对于不同的私有网络协议,根据实际需要选用适当容量的RAM即可,没有很荷刻的要求。本系统中FPGA芯片选用ACEX1K50TC144,RAM芯片选用CY7C006AC_PLCC,主要考虑的是芯片的速率高、使用简单并且价格低廉。
有线传输信号驱动模块选用LVDS芯片对(ds90c401,ds90c402),该芯片对的优点是速率高(155Mbps串行数据传输)、传输距离远、灵敏度高、功耗小。
2.3 PCI接口卡的功能
PCI总线接口芯片(W89C840AF)把从PCI总线上传输过来的数据封装成“以太帧”的格式,传递给FPGA(RAM可以对传输的数据进行缓冲),FPGA去掉前8byte的“以太帧头”从而获得数据包。然后根据不同网络协议的数据包格式,在FPGA中灵活地设备相应的逻辑功能。如作者目前在研的卫星ATM网络实验系统,定义了一种私有的ATM协议,数据处理单元将完成以下任务:识别信元头,按优先级对信元进行排队、存储、打包并转发等。
FPGA要完成以上功能,其内部模块需包括以下几个模块:“数据接口”、“控制接口”、“命令执行单元”、“实验网物理层访问控制单元”和“信道模拟单元”,如图3所示。
FPGA把打包后的串行数据传向LVDS,信号经过LVDS驱动后传到接收方。
在接收方,数据的处理与此相反,不再多述。 2.4 W89C840AF与FPGA之间的接口设计
在PCI接口卡电路板中,芯片之间的接口设计有三部分:FPGA与W89C840AF之间的接口;FPGA与RAM之间的接口;FPGA与LVDS之间的接口。后面两个接口比较简单,所以下面主要介绍FPGA与W89C840AF之间的接口设计。
W89C840AF与FPGA之间的数据接口如图4所示。MTXCLK和MRXCLK分别是发送数据和接收数据的参考时钟,必须设置为25MHz。MTXEN和MRXDV的数据帧传输的指示信号,TMXD[3:0]和MRXD[3:0]为4bit宽的数据传输接口。
W89C840AF芯片与FPGA之间除了传输数据外,还需要交换控制信息。由于W89C840AF芯片I/O接口有限,可以供暖和W89C840AF芯片的EECK、EEDI、EEDO三条控制线与FPGA交换控制信息。这里构建一个类似I2C串行总线协议的控制总线,其结构和工作时序如图5所示。
3 实验平台的软件设计
为了实现从处于“用户态”的应用程序到处于“核心态”的驱动程序间的双向数据传输通道,按照Linux操作系统的网络相关代码的划分规则,实验网络结构中用户层以下的代码需要嵌入到Linux操作系统的核心代码树中,经过对内核的重新编译,运行在Linux操作系统的“核心态”,这样做比较复杂。鉴于以上原因,在本设计中采用了以下处理方法:考虑到“用户态”内部所有软件模块的通信比较简单,通过调用UDP/IP协议的socket,在下层利用UDP/IP数据包拆解/封装程序,构造出一个如图6所示的数据传输通道。在这里,把“透明通道”定义为“过渡层”。 使用UDP/IP协议会涉及到Linux操作系统处理IP协议的相关内容,特别需要注意以下三个方面:(1)去掉系统中所有其它网络硬件设备,关闭所有Linux操作系统的网络服务,关闭Linux操作系统防火墙;(2)设备本设备的IP地址为192.168.0.1(实验专用IP地址),绑定实验网络设备为192.168.0.X子网网关,更改“/etc/network”文件设置为“可以转发IP包”;(3)调用一个IP Socket发送数据,在特定端口上监听数据包的到达。
3.1 “过渡层”的设计
对于上层传递过来的数据,“过渡层”要完成的任务是:去掉数据包前面的以太网帧头、IP数据包头、UDP数据包头,从而还原出原始数据包,然后传递给驱动部分。反之,下层传递过来的数据包经过相反的数据处理后向上层传递。
3.2 驱动程序的设计
由于W89C840AF是以太网控制芯片,因此可以把PCI接口卡看作网络设备。对于网络设备,Linux操作系统中有一套标准的驱动程序设计方法,所以在这里仅介绍驱动程序设计中的几个值得注意的事项。主要有:(1)PCI设备的探测和注册函数;(2)W89C840AF芯片的配置;(3)网络设备基本功能函数组。 PCI设备探测和注册函数可以建立网络设备对象,同时注册网络设备基本功能函数组,并参考W89C840AF芯片数据传输数据的说明赋予设备执行“DMA”能力。
关于W89C840AF芯片的配置,主要是C18/CNCR寄存器的配置。除了打开“传输允许”、“接收允许”、“全双工模式”和“100Mbps传输速率模式”等选项外,还要打开“Accept Error Packet”、“Accept Runt Packet”、“Accept Broadcast Packet”、“Accept Multicast Packet”和“Accept All Physical Packet”等选项,从而屏蔽所有与以太网协议相关的功能。
网络设备基本功能函数组的核心是“发送”、“接收”和“中断响应”这三个基本函数。“发送函数”将发送的数据存入W89C840AF芯片的内存空间,然后写C04/CTSD寄存器,请求芯片发送数据。W89C840AF芯片将接收到的数据包传递到系统内存后就会触发中断,中断处理函数响应中断并调用接收函数,将数据包和相应的参数向系统的上层传递。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』