三 代码基本结构(Code Base Structure)
本章节主要描述了代码相关的基本结构,并提供“代码目录”、“数据结构”、“分层”、“源代码分布树”、“编译选项”、“运行时的配置选项”等信息。
代码目录(Directory Structure)
下面是相关目录:
drivers/wlan /os /linux /win_nwf/ /darwin … /hal /ar9300 … /lmac /ath_dev /ratectrl /umac /mlme /txrx /crypto /qca_da
主要数据结构(Common Data Structure)
vap
- 针对每个接口的抽象(这里的接口指每个AP(作为AP模式时)、每个station(作为station时模式))。
- 在一个物理接口上,可以虚拟出多个VAP。
node
- 一个node对应一个连接。
- 每层都会维护node结构中的一部分。
ic
- 在网络以及更高层中的Device抽象
sc
- ath层的Device
ath_hal
- HAL层数据结构
分层(Layers)
host驱动架构包含OS 适配层、802.11协议层、device层、HAL层。下面是详细说明:
OS 适配层(OS Shim Layer)
OS 适配层提供下面功能:
- 驱动初始化和加载
- 中断申请和关联
- 接口适配和调用 每种操作系统都会有一个OS适配层。比如Native Wifi、NetBSD、Darwin、Linux、eCos、VxWorks等。OS适配层是系统函数和本代码之间的桥梁,同时还包含下面内容:
- 系统相关的初始化(如中断、buffer分配)
- 通用函数库(如locking/malloc)
- 传输和中断(包括接收)的OS层入口
OS 适配层函数(OS Shim Functions)
OS适配层函数参看文件osdep.h (wlan/os/darwin/include)和文件ath_osdep.c(wlan/os/darwin/src),同时还有一些系统接口:
- OS_SLEEP
- OS_GET_TIMESTAMP
- OS_TIMER
- spin_lock_init
- spin_lock
- spin_unlock
- Struct ath_reg_params ath_params = {};
- ath_driver_command – ioctl interface
- ath_dev_start
- ath_dev_stop
802.11协议层(802.11 Protocol Layer (net, UMAC))
802.11协议层(又叫做网络或UMAC层)包含了完整的链接控制。它是由分层状态机(比如connectionSM->AssocSM)实现的。 UMAC提供了包的封装/解封装功能(dot3<->dot11)。UMAC层负责多个VAP共享一个channel和HW情况下的资源管理。 同时UMAC层还提供下面的功能:
- 电源管理(Power Management)
- MLME
- Scanning
- Encryption
UMAC到LMAC接口函数(UMAC-to-LMAC interface)
UMAC到LMAC通过一个转换表来完成调用。这个表通过ath_attach()函数传递给UMAC。代码路径:lmac/ath_dev/ath_main.c
struct ath_ops {} ath_ar_ops = {};
Sample calls:
ath_vap_attach
ath_vap_detach
ath_tx_init
ath_rx_init
ath_tx_start_dma
ath_set_channel
ath_get_channel
ath_intr
ath_handle_intr
设备层(Device Layer (ath, LMAC))
设备层提供下面功能:
- Transmit
- Receive
- Interface between network and HAL (“pass-through” interface
- functions)
- Tx aggregation
- Rx reordering
- DMA
- Interrupt handling
LMAC到UMAC接口函数(LMAC-to-UMAC interface)
LMAC到UMAC也通过一个转换表来完成调用。这个表通过ath_attach()函数中的ath_dev_attach()传递给UMAC。代码路径:
struct ieee80211_ops net80211_ops = {};
Sample calls:
ath_net80211_tx_complete
ath_net80211_rx
ath_net80211_input
ath_net80211_set_countrycode
LMAC到HAL接口函数(LMAC-to-HAL interface)
LMAC到HAL的接口调用通过ath_hal_attach()函数中的ath_dev_attach()。代码路径:wlan/hal/ah.c
ath_hal_attach()通过传递device id来attach到相应的设备。
例如:ar9300Attach()是针对AR93xx芯片组的。代码路径在wlan/hal/ar9300/ar9300_attach.c 这个函数会返回一个AR93xx的函数表,包括:
ar9300EnableReceive
ar9300StartTxDma
ar9300SetTxDP
ar9300FillTxDesc
ar9300ProcRxDesc