《1 引言》
1 引言
随着网络、通信、芯片等技术的发展, 嵌入式应用设备的数据处理、信息传递、用户交互等都对操作系统的网络功能提出越来越高的要求。现在流行的嵌入式操作系统主要有VxWorks, WindowsCE, QNX Nutrino等, 但大多数只有简单的网络通信功能。Linux操作系统作为遵循GPL, 源代码开放, 专门为网络环境编制的操作系统, 广泛应用于嵌入式系统开发领域。Linux将通信和网络功能和系统内核紧密结合, 内置灵活的联网特性, 是当前对网络协议支持最全面的操作系统之一。因此, 网络设备驱动程序的开发是嵌入式Linux系统设计与开发的重要部分。
网络设备驱动是整个网络体系结构的基础, 它通过物理设备读取和发送报文, 为上层网络协议和物理设备间架设桥梁。笔者结合嵌入式设备无线接入点 (access point) 的开发, 介绍嵌入式Linux网络设备驱动程序的设计和实现, 以及基于PCMCIA接口的AP系统网络驱动开发流程。
《2 Linux网络驱动体系结构及PCMCIA网卡驱动接口》
2 Linux网络驱动体系结构及PCMCIA网卡驱动接口
Linux网络设备驱动体系结构
Linux内核中PCMCIA驱动
《3 AP系统网络驱动的设计与实现》
3 AP系统网络驱动的设计与实现
无线接入点 (access point, 简称AP)
AP实际上是一种网桥, 作为无线局域网的中心, 实现无线网络和以太网的有机结合, 负责数据的接收和转发。嵌入式Linux实现了完善的TCP/IP协议, 因此, AP网络驱动开发的根本是基于PCMCIA接口建立标准无线网络设备wlan0。AP驱动程序的实现采用Linux特有的、非常灵活的模块加载, 将PCMCIA网络驱动 (ap-cs.o) 和IEEE802.11b MAC层协议栈 (ap.o) 以及数据加解密 (ap-crypt-wep.o) 分别作为独立的模块, 动态加载。下面分别对AP网络驱动功能实现进行深入分析。
1) 初始化模块
当用户插入网卡, 系统动态加载ap-cs.o模块, 模块初始化流程如图2所示。通过register-pccard-driver注册对应的client-reg-t结构, 并定义事件处理句柄apClient-event 负责处理网卡由Event Mask预定义的触发事件, 句柄处理函数调用apClient-config, 读取CIS (card information structure) 信息, 校验、配置资源, 根据配置属性申请中断线, 注册中断句柄, 分配IO端口等初始化历程。如图1所示的网络驱动体系结构定义并初始化结构dev, 探测物理硬件接口, 用探测到的设备值填充dev结构成员 (open、do-ioctl、hard-start-xmit等) , 完成建立标准无线设备wlan0。同时为无线网卡接收、发送数据做好准备。
2) 数据接收、发送模块
嵌入式Linux系统中, 网络设备接口以中断处理程序的方式控制, 网络设备数据接收函数就是网络驱动程序的中断处理函数 (即初始化时注册的中断句柄函数) 。无线设备驱动中, 当数据到达引起中断时, 主机通过BAP (buffer access path) 读取数据, 调用处理程序ap-rx-tasklet进行处理, 再根据中断类型, 调用相应子处理程序做相应处理。如图3所示, 在接收到完整的MSDU (MAC Service Data Unit) 后, 经校验无误, 交由MAC层协议栈分析IEEE802.11帧头, 根据源地址, 建立或查询客户端sta对应信息的hash列表, 如数据加密则根据对应加密算法和密钥解密数据, 同时填充待转发的skb结构信息。如目的地址为该AP连接中的客户端时, 则填充skb结构后直接调用dev-queue-xmit处理, 调度schedule-task, 最终从无线设备接口发出。否则调用netif-rx转发上层, 最终根据目的地址将数据包从以太网发到网络上。为了提高数据传输效率, 普通数据帧都由内核直接处理, 但为了便于用户态对系统认证和加密的管理, 可将802.1x等特殊数据帧或管理帧转发至用户态, 再由用户态分析处理, 通过TCP/UDP预定端口发送到指定认证服务器。
无线网络设备发送数据包过程则相对简单, 系统定期调度tx-exc-tasklet ( ) , 接收数据经合法化分析, 查找客户端hash列表信息后, dev?hard-start-xmit函数将间接字缓冲区链入网络设备结构管理的发送队列, 唤醒网络设备, 通过无线设备将队列中的数据包分别发送至对应的客户端。
3) 有线与无线链路桥接模块
在Kernel 2.4及其更高版本的Linux内核中, 以太网网桥模块有了较完善的支持。网桥在整个桥接局域网中的作用是有目的地转发数据帧。网桥数据库反映桥接局域网的拓扑结构, 把从一个端口收到的数据帧按照一定的原则进行转交或过滤操作。转交过程 (forwarding process) 、学习过程 (learning process) 和相关的过滤数据库 (filtering database) 完成后, 无线接入点成功采用网桥设备br0将以太网设备eth0/eth1和无线网络设备wlan0进行桥接, 而以网桥设备br0作为与其他网络设备进行通信的唯一网络地址。
《4 AP网络驱动性能测试》
4 AP网络驱动性能测试
由于嵌入式系统运行环境所限, 必须要求系统能够稳定高效的长时间运行。为了测试基于PCMCIA接口开发的AP系统网络驱动性能, 在系统开发完成后期, 采用Charito网络战车进行了点对点/点对多点、长时间、大量重负荷的系统测试。Charito网络战车是一个由Chariot控制台和Endpoint组成的优秀软件测试工具。它具有灵活的设计测试结构, 对网络全方位进行测试。通过对测试环境、测试拓扑、运行参数等设置, 分别最终得出了对无线接入点吞吐量、响应时间的测试结果, 如图4所示。其中数据通信平均吞吐量达到5.5 Mb/s, 平均测试响应时间为0.145 s, 性能均优越于市场同类产品。该无线接入点在多终端、 数据加密通信的环境下仍然保持其优越性能, 其各项良好的性能进一步肯定了嵌入式网络驱动的成功开发。
《5 结语》
5 结语
系统地分析了Linux网络设备驱动的结构体系和系统内核PCMCIA API接口, 结合实际项目并利用目前国际上最新的和最流行的主流测试工具, 论述了基于嵌入式Linux操作系统的无线接入点网络驱动的设计、实现和测试结果。所开发的无线接入点已经通过验收, 成功地投入生产, 并且运行良好。所介绍的网络驱动软件开发模块、流程和测试工具对其他设备的网络驱动开发和测试也具有一定的参考价值。