介绍
概览
该芯片包含三个内核:
LP: 低功耗处理器,KM0 和 Wi-Fi 固件在其上运行。
NP: 网络处理器、KM4 和 Wi-Fi 驱动程序可以在它上面工作。
AP: 应用处理器 CA32 和 FullMAC 可以在它上面工作。FullMAC 驱动程序是 Linux 内核中的 cfg80211 和 FreeRTOS 中的 Wi-Fi Driver 之间的自适应驱动程序。
架构
FullMAC 是基于 CFG80211 接口的新型 Wi-Fi 驱动程序。所以它支持 wpa_supplicant、hostapd、iwconfig 等。驱动程序使用 IPC 消息将命令发送到 KM4 上的 IPC INIC 设备,并从 IPC INIC 设备接收事件。因此,FullMAC 驱动程序会将命令和结构从 CFG80211 转换为 IPC INIC 命令和数据类型,来自 IPC INIC 设备的事件也会转换为 CFG80211 格式并报告给 Linux 内核。
FullMAC 驱动程序中有两条 IPC 消息。一个是 API 消息,另一个是数据消息。API 消息用于发送命令或接收事件以管理 Wi-Fi。数据消息用于发送或接收 Wi-Fi 的数据帧。所以前者是低速,后者是高速。
配置
内核配置
在 project 的 build 目录下执行以下命令,打开 kernel 的配置。
bitbake virtual/kernel -c menuconfig
启用 Ameba IPC
Linux 中的 Wi-Fi 驱动程序是基于 Ameba IPC 的驱动程序,因此必须为 IPC 的驱动程序启用 Wi-Fi 驱动程序。当然,如果您选择 Fullmac for rtl8730e
为 yes
,则此选项已启用。
Device Drivers --->
<*> Drivers for Realtek --->
[*] Ameba IPC
启用 CFG80211
此配置是基于 cfg80211 的 Wi-Fi 驱动程序的基础,默认情况下处于启用状态。
[*] Networking support --->
-*- Wireless --->
<*> cfg80211 - wireless configuration API
[*] enable powersave by default
[*] support CRDA
[*] cfg80211 wireless extensions compatibility
启用 FullMAC 驱动程序
该配置用于在 Linux 内核中开启 Wi-Fi 驱动,默认开启。
Device Drivers --->
<*> Drivers for Realtek --->
<*> CFG80211 WiFi FULLMAC drivers --->
<*> Fullmac for rtl8730e
函数
Wi-Fi 驱动程序中只有两个端口,wlan0
和 wlan1
。wlan0
必须仅在工作站模式下工作,并且 wlan1
必须仅在接入点 (AP) 模式下工作。
初始化
所有 API 在 Linux 中都有效的前提条件是 Wi-Fi IOCTL 和事件的初始化。
IOCTL 初始化
无。
事件初始化
无。
Wi-Fi 数据结构
数据结构 |
介绍 |
---|---|
<_cus_ie> |
结构用于设置 Wi-Fi 自定义 IE 列表,并且类型匹配 |
<rtw_ssid_t> |
该结构用于描述 SSID。 |
<rtw_mac_t> |
该结构用于描述唯一的 6 字节 MAC 地址。 |
<rtw_network_info_t> |
该结构用于描述连接到 AP 时使用的 SSID、安全类型和密码等的 station 模式设置。 |
<rtw_scan_param_t> |
该结构体用于描述用于扫描的扫描参数,包括 SSID、频道、用户回调等。 |
<rtw_scan_result_t> |
该结构用于描述 AP 的扫描结果。 |
<rtw_wifi_setting_t> |
该结构用于存储从 Wi-Fi 驱动程序获取的 Wi-Fi 设置。 |
<rtw_mac_filter_list_t> |
该结构用于描述 mac 过滤器列表。 |
<rtw_softap_info_t> |
该结构用于描述用于启动 AP 模式的 SSID、安全类型、密码和默认频道的设置。 |
<psk_info> |
该结构用于描述 SSID、密码和 PSK,用于在驱动程序中获取或存储 PSK 信息。 |
<rtw_sw_statistics_t> |
该结构用于描述 Wi-Fi 发送和接收数据包的软件统计信息。 |
<rtw_phy_statistics_t> |
该结构用于描述 PHY 统计信息,包括 RSSI、SNR、来自 PHY 层的误报、来自 MAC 层的 TRX 计数。 |
<raw_data_desc_t> |
该结构体用于描述用户发送的原始帧,包括原始帧的缓冲区地址和长度,以及该帧将使用的初始传输速率。 |
<wifi_user_conf> |
该结构用于描述一些可以由用户控制的 Wi-Fi 驱动程序的配置。 |
Wi-Fi APIs
系统 APIs
API |
介绍 |
---|---|
<wifi_on> |
启用 Wi-Fi. |
<wifi_off> |
停用 Wi-Fi. |
<wifi_is_running> |
检查指定的 WLAN 接口是否正在运行 |
<wifi_set_mode> |
用于切换 Wi-Fi 模式 |
wifi_on
启用 Wi-Fi:启动无线接口。
参数 |
类型 |
介绍 |
---|---|---|
<mode> |
rtw_mode_t |
决定在哪种模式下启用 Wi-Fi。
|
wifi_off
停用 Wi-Fi.
参数:无。
wifi_is_running
检查指定的接口是否正常运行。
参数 |
类型 |
介绍 |
---|---|---|
<wlan_idx> |
Unsigned char |
idx 可以设置为
|
wifi_set_mode
参数 |
类型 |
介绍 |
---|---|---|
<mode> |
int |
决定将 WiFi 切换到哪种模式,可选模式有:
|
扫描 API
API |
介绍 |
---|---|
<wifi_scan_networks> |
启动扫描以搜索 802.11 网络 |
<wifi_get_scan_records> |
用于在扫描参数中未配置 |
<wifi_scan_abort> |
放弃正在进行中的 Wi-Fi 扫描 |
wifi_scan_networks
启动扫描以搜索 802.11 网络。
参数 |
类型 |
介绍 |
---|---|---|
<scan_param> |
rtw_scan_param_t * |
指定扫描参数,包括扫描类型、特定SSID、特定信道列表、信道扫描时间和扫描回调函数。 一共有两类扫描回调函数:
如果已注册,扫描完成后将执行 scan_user_callback,并报告扫描到的AP总数。详细的扫描AP信息可以通过调用 wifi_get_scan_records 获取。此回调适用于正常的异步扫描。 如果已注册,当在 rtw_scan_param 的选项中配置 RTW_SCAN_REPORT_EACH 时,scan_report_each_mode_user_callback 会被使用,并且每次扫描到一个AP时都会执行此回调,该回调将直接报告AP信息。 |
<block> |
Unsigned char |
指定扫描为同步或异步。
|
备注
如果调用此 API,扫描到的 AP 会存储在 Wi-Fi 驱动程序动态分配的内存中,对于同步扫描或未使用
RTW_SCAN_REPORT_EACH
的异步扫描,这些内存在调用wifi_get_scan_records()
时将被释放。配置
RTW_SCAN_REPORT_EACH
时,scan_report_each_mode_user_callback()
将报告 NULL,以指示扫描完成。只能选择一个回调函数进行注册。在一次扫描中,
can_user_callback()
和scan_report_each_mode_user_callback()
无法同时注册。扫描回调函数将在 RTW 线程的上下文中执行。
当扫描特定频道时,可能会检测到在附近频道上具有强信号强度的设备。
wifi_get_scan_records
获取扫描结果。
参数 |
类型 |
介绍 |
---|---|---|
<AP_num> |
unsigned int * |
指向所需获取的已扫描AP信息数量的指针,最后将被设置为实际可以获取的已扫描AP信息数量。 |
<scan_buf> |
char * |
指向存储扫描结果的缓冲区的指针,扫描到的AP信息将以 struct rtw_scan_result_t 的形式逐个存储。 |
备注
对于配置了 RTW_SCAN_REPORT_EACH
的异步扫描,每扫描到一个 AP 时,AP 信息将通过 scan_report_each_mode_user_callback()
直接报告,并在用户回调执行后释放,因此不需要使用此函数来获取扫描结果。
wifi_scan_abort
放弃正在进行的扫描。
参数:无。
备注
这是一个异步函数,会立即返回。返回值仅表示中止扫描命令是否成功通知给驱动程序。当扫描实际中止时,将执行在
wifi_scan_networks()
中注册的用户回调。如果当前没有正在进行的 Wi-Fi 扫描,该函数将直接返回
RTW_SUCCESS
,且不会执行用户回调。
连接 API
API |
介绍 |
---|---|
<wifi_connect> |
加入具有指定SSID或BSSID的Wi-Fi网络。 |
<wifi_disconnect> |
断开与当前Wi-Fi网络的连接。 |
<wifi_is_connected_to_ap> |
检查Wi-Fi是否在DHCP之前已连接到AP。 |
<wifi_get_join_status> |
获取最新的Wi-Fi连接状态。 |
<wifi_get_disconn_reason_code> |
获取最近一次断开连接或取消认证的原因代码。 |
wifi_connect
加入具有指定 SSID 或 BSSID 的 Wi-Fi 网络。扫描、连接并认证 Wi-Fi 网络。成功返回后,系统准备好发送数据包。
参数 |
类型 |
介绍 |
---|---|---|
<connect_param> |
rtw_network_info_t * |
描述关于SSID或BSSID、加密类型、密码和扫描信道的连接设置。 |
<block> |
unsigned char |
确定连接是同步的还是异步的。
|
备注
确保在调用函数 (
wifi_on()
) 之前启用了 Wi-Fi。在 Wi-Fi 连接期间,connect_param 中的参数 channel 和 pscan_option 可以用于在指定信道上执行快速扫描。
当 channel 设置为指定信道并且 pscan_option 设置为
PSCAN_FAST_SURVEY
时,在 Wi-Fi 连接过程中,仅会在指定信道上执行主动扫描,主动扫描最多重试 8 次,每轮间隔为 25 毫秒。可以注册 connect_param 中的
joinstatus_user_callback()
以获取实时的连接状态变化,因为每次连接状态改变时都会执行此回调函数。
wifi_disconnect
从当前的 Wi-Fi 断开。
参数:无。
wifi_is_connected_to_ap
检查 Wi-Fi 是否在获取 DHCP 之前已连接到 AP。
参数:无。
wifi_get_join_status
获取最新的 Wi-Fi 连接状态。
参数:无。
备注
Wi-Fi 连接状态将在 Wi-Fi 连接和断开时设置。
wifi_get_disconn_reason_code
提供最近一次断开关联或取消认证的原因代码。
参数 |
类型 |
介绍 |
---|---|---|
<reason_code> |
unsigned short |
原因值代码的指针 |
信道 API
API |
介绍 |
---|---|
<wifi_set_channel> |
设置STA接口的监听信道。 |
<wifi_get_channel> |
获取STA接口的当前信道。 |
wifi_set_channel
设置 STA 接口的监听信道。
参数 |
类型 |
介绍 |
---|---|---|
<channel> |
int |
期望的信道。 |
备注
不需要为 STA 模式的 Wi-Fi 驱动调用此功能,因为信道将由接收到的信标确定。
wifi_get_channel
获取 STA 接口的当前信道。
参数 |
类型 |
介绍 |
---|---|---|
<channel> |
int * |
一个指向变量的指针,该变量用于存储信道值。 |
省电模式 API
API |
介绍 |
---|---|
<wifi_set_powersave_mode> |
设置Wi-Fi省电模式 |
wifi_set_powersave_mode
设置 Wi-Fi 省电模式,包括 IPS 模式和 LPS 模式。
IPS 是非活动省电模式(Inactive Power Save)的缩写。如果 Wi-Fi 没有连接到 AP,它会自动关闭射频。
LPS 是闲暇省电模式(Leisure Power Save)的缩写。在连接到 AP 时,如果数据流量不繁忙,Wi-Fi 会自动关闭射频;同时,它也会自动开启射频来监听已连接 AP 的信标。
参数 |
类型 |
介绍 |
---|---|---|
<ips_mode> |
u8 |
所需的ips模式,可以是:
|
<lps_mode> |
u8 |
所需的lps模式,可以是:
|
AP Mode APIs
API |
介绍 |
---|---|
<wifi_start_ap> |
触发Wi-Fi驱动程序启动一个基础架构Wi-Fi网络。 |
<wifi_get_associated_client_list> |
获取与SoftAP关联的客户端。 |
<wifi_del_station> |
删除一个STA(站点)。 |
wifi_start_ap
触发 Wi-Fi 驱动程序启动一个基础架构 Wi-Fi 网络。
参数 |
类型 |
介绍 |
---|---|---|
<softAP_config> |
rtw_softap_info_t * |
存储softAP配置的结构体指针。 |
备注
在调用此函数 (
wifi_on()
) 之前,确保 Wi-Fi 已启用。如果在调用此函数时 STA 接口是活动的,softAP 将会在与 STA 相同的频道上启动,而不会使用提供的频道。
wifi_get_associated_client_list
获取与 SoftAP 关联的客户端。
参数 |
类型 |
介绍 |
---|---|---|
<client_list_buffer> |
int * |
存储客户端列表的位置。 |
<buffer_length> |
unsigned short |
缓存长度。 |
wifi_del_station
在 AP 模式时删除一个站点(STA)。
参数 |
类型 |
介绍 |
---|---|---|
<wlan_idx> |
unsigned char |
AP运行所在的WLAN接口索引。 |
<hwaddr> |
unsigned char * |
STA的MAC地址指针。 |
原始帧 Tx API
API |
介绍 |
---|---|
<wifi_send_raw_frame> |
发送一个原始帧 |
wifi_send_raw_frame
参数 |
类型 |
介绍 |
---|---|---|
<raw_data_desc> |
raw_data_desc_t * |
关于原始帧的描述符指针,包括存储帧的缓冲区地址、帧长度、帧的初始发送速率(默认初始发送速率为1Mbps)。 |
自定义 IE APIs
API |
介绍 |
---|---|
<wifi_add_custom_ie> |
设置自定义IE列表。 |
<wifi_update_custom_ie> |
更新Wi-Fi自定义IE列表中的项目。 |
<wifi_del_custom_ie> |
删除Wi-Fi自定义IE列表。 |
备注
这三个 API 仅在信标、探测请求和探测响应帧上有效。
wifi_add_custom_ie
设置自定义 IE 列表。
参数 |
类型 |
介绍 |
---|---|---|
<cus_ie> |
void * |
指向Wi-Fi自定义IE列表的指针。 |
<ie_num> |
int |
Wi-Fi自定义IE列表的数量。 |
备注
在删除之前的自定义 IE 列表之前,此 API 不能被执行两次。
wifi_update_custom_ie
更新 Wi-Fi 自定义 IE 列表中的项目。
参数 |
类型 |
介绍 |
---|---|---|
<cus_ie> |
void * |
指向Wi-Fi自定义IE列表的指针。 |
<ie_index> |
int |
Wi-Fi自定义IE列表的数量。 |
wifi_del_custom_ie
删除 Wi-Fi 自定义 IE 列表。
参数:无。
Wi-Fi Setting APIs
API |
介绍 |
---|---|
<wifi_get_mac_address> |
检索802.11设备的当前媒体访问控制(MAC)地址(或以太网硬件地址) |
<wifi_get_setting> |
从驱动程序获取当前Wi-Fi设置 |
<wifi_set_network_mode> |
根据支持的数据速率设置网络模式 |
<wifi_set_mfp_support> |
设置管理帧保护支持能力 |
<wifi_set_group_id> |
为SAE事务设置有限循环组的组ID |
<wifi_set_pmk_cache_enable> |
启用或禁用PMK缓存 |
<wifi_psk_info_set> |
将与PSK相关的信息设置到驱动程序中,包括SSID、密码短语和PSK |
<wifi_psk_info_get> |
从驱动程序获取与PSK相关的信息,包括SSID、密码短语和PSK |
<wifi_get_ccmp_key> |
获取Wi-Fi使用的加密CCMP密钥(仅限STA模式) |
<wifi_get_sw_statistic> |
获取软件统计的Tx和Rx统计信息 |
<wifi_fetch_phy_statistic> |
获取有关Wi-Fi的统计信息,包括来自MAC层的RSSI、SNR和收发计数 |
<wifi_set_indicate_mgnt> |
配置硬件指示数据包(管理和数据帧)模式以及软件报告数据包到 wifi_indication() |
<wifi_get_antenna_info> |
获取天线信息 |
<wifi_get_auto_chl> |
使用NMH算法获取自动信道 |
<wifi_get_band_type> |
获取频段类型 |
<wifi_get_tsf_low> |
从Wi-Fi寄存器获取Wi-Fi TSF值 |
wifi_get_mac_address
检索 802.11 设备的当前媒体访问控制(MAC)地址(或以太网硬件地址)。
参数 |
类型 |
介绍 |
---|---|---|
<mac> |
char * |
指向将要获取的MAC地址的结果 |
wifi_get_setting
从驱动程序获取当前 Wi-Fi 设置。
参数 |
类型 |
介绍 |
---|---|---|
<wlan_idx> |
unsigned char |
WLAN接口名:
|
<pSetting> |
rtw_wifi_setting_t * |
指向rtw_wifi_setting_t结构体以存储从驱动程序获取的Wi-Fi设置 |
wifi_set_network_mode
根据支持的数据速率设置网络模式。驱动程序在初始化后默认在 BGN 模式下工作。此函数用于在连接到 AP 之前更改无线网络的工作模式为 station 模式。
参数 |
类型 |
介绍 |
---|---|---|
<mode> |
rtw_network_mode_t |
要设置的网络模式:
|
wifi_set_mfp_support
设置管理帧保护支持能力。
参数 |
类型 |
介绍 |
---|---|---|
<value> |
unsigned char |
其数值可以是:
|
wifi_get_group_id
设置用于 SAE 事务的有限循环组的组 ID。
参数 |
类型 |
介绍 |
---|---|---|
<value> |
unsigned char |
指定用于SAE事务的有限循环组的组ID。 |
wifi_set_pmk_cache_enable
启用或禁用 PMK 缓存。
参数 |
类型 |
介绍 |
---|---|---|
<value> |
unsigned char |
|
wifi_psk_info_set
将与 PSK(预共享密钥)相关的信息设置到驱动程序中,包括 SSID、密码短语和 PSK。
通常用于快速连接,在成功连接到 AP 后将 PSK 信息恢复到驱动程序中,以便在芯片重新上电并希望连接到同一个 AP 时缩短 PSK 计算时间。
参数 |
类型 |
介绍 |
---|---|---|
<psk_data> |
struct psk_info * |
指向将恢复PSK相关信息的结构的指针。 |
wifi_psk_info_get
从驱动程序中获取与 PSK 相关的信息,包括 SSID、密码短语和 PSK。
通常用于快速连接,从驱动程序中获取 PSK 信息,然后将这些信息存储到 Flash 中。
参数 |
类型 |
介绍 |
---|---|---|
<psk_data> |
struct psk_info * |
指向将恢复PSK相关信息的结构体的指针。 |
wifi_get_ccmp_key
获取 Wi-Fi 使用的加密 CCMP 密钥(仅限 STA 模式)。
参数 |
类型 |
介绍 |
---|---|---|
<uncst_key> |
unsigned char * |
存储CCMP TK(临时密钥)的位置。 |
<group_key> |
unsigned char * |
存储CCMP GTK(组密钥)的位置。 |
wifi_get_sw_statistic
显示由软件(Wi-Fi 驱动程序,而不是 PHY 层)统计的 Tx 和 Rx 统计信息。
参数 |
类型 |
介绍 |
---|---|---|
<idx> |
unsigned char |
指定将从哪个WLAN接口获取统计信息的WLAN接口索引 |
<sw_statistics> |
rtw_sw_statistics_t * |
指向存储软件统计信息的结构的指针 |
wifi_fetch_phy_statistic
从 WLAN 接口 0 获取统计信息,包括来自 MAC 层的 RSSI、SNR 和 TRX 计数。
参数 |
类型 |
介绍 |
---|---|---|
<phy_statistic> |
rtw_phy_statistics_t * |
指向存储PHY统计信息的结构的指针。 |
wifi_set_indicate_mgnt
配置硬件指示数据包(管理帧和数据帧)以及软件报告数据包的模式至 wifi_indication()
。
参数 |
类型 |
介绍 |
---|---|---|
<enable> |
int |
启用的值可以是:
|
wifi_get_antenna_info
获取天线信息。
参数 |
类型 |
介绍 |
---|---|---|
<antenna> |
unsigned char * |
用于存储从驱动程序获取的天线值的点。
|
wifi_get_auto_chl
通过 NMH 算法获得自动信道,所选择的信道在返回值中。
参数 |
类型 |
介绍 |
---|---|---|
<wlan_idx> |
unsigned char |
WLAN接口索引,可以是:
|
<channel_set> |
unsigned char * |
指向信道集合的指针,自动信道将从中选择。 |
<channel_num> |
unsigned char |
信道集合中的信道数量。 |
wifi_get_band_type
获取 Wi-Fi 频段类型,band_type 的值将存储在返回值中,可能是:
WL_BAND_2_4G
: 仅支持 2.4G。WL_BAND_5G
: 仅支持 5G。WL_BAND_2_4G_5G_BOTH
: 支持 2.4G 和 5G。
参数:无。
wifi_get_tsf_low
从 Wi-Fi 寄存器获取 TSF 值。
参数 |
类型 |
介绍 |
---|---|---|
<port> |
u32 |
指定 Wi-Fi 端口,可以是 0 或 1。
|
Wi-Fi Indication APIs
API |
介绍 |
---|---|
<init_event_callback_list> |
初始化事件回调列表。 |
<wifi_reg_event_handler> |
注册事件监听器。 |
<wifi_unreg_event_handler> |
注销事件监听器。 |
init_event_callback_list
初始化事件回调列表。
参数:无。
备注
确保在使用事件处理相关机制之前已经调用过该函数。
wifi_reg_event_handler
注册事件监听器。
参数 |
类型 |
介绍 |
---|---|---|
<event_cmds> |
unsigned int |
指示的事件命令编号。 |
<handler_func> |
rtw_event_handler_t |
将接收并处理事件的回调函数。 |
<handler_user_data> |
void * |
将直接传递给回调函数的用户特定数据。 |
备注
将相同的 event_cmds 设置为空的 handler_func 将取消注册这些 event_cmds。
wifi_unreg_event_handler
注销事件监听器。
参数 |
类型 |
介绍 |
---|---|---|
<event_cmds> |
unsigned int |
指示的事件命令编号。 |
<handler_func> |
rtw_event_handler_t |
将接收并处理事件的回调函数。 |
Promisc APIs
API |
介绍 |
---|---|
<wifi_enter_promisc_mode> |
将 Wi-Fi 设置为混杂模式。 |
<wifi_set_promisc> |
启用或禁用混杂模式回调。 |
<wifi_init_packet_filter> |
在混杂模式下初始化数据包过滤器。 |
<wifi_add_packet_filter> |
在混杂模式下添加数据包过滤器。 |
<wifi_enable_packet_filter> |
根据配置,启用混杂模式下的数据包过滤。 |
<wifi_remove_packet_filter> |
在混杂模式下移除指定的数据包过滤器。 |
<wifi_disable_packet_filter> |
根据配置,禁用混杂模式下的数据包过滤。 |
wifi_enter_promisc_mode
将 Wi-Fi 设置为混杂模式。
如果 Wi-Fi 原本处于并发模式或 SoftAP 模式,将执行模式切换;如果 Wi-Fi 原本处于 STA 模式且已连接到 AP,则与 AP 的连接将断开。
参数:无。
wifi_set_promisc
启用混杂模式回调,并让 Wi-Fi 驱动程序在混杂模式下接收数据包。
正常用法:使用 wifi_enter_promisc_mode()
确保 Wi-Fi 处于正确模式,然后使用 wifi_set_promisc()
启用混杂接收和混杂回调。
参数 |
类型 |
介绍 |
---|---|---|
<enabled> |
rtw_rcr_level_t |
启用的值可以是:
|
<callback> |
void(*callback)(unsigned char *,unsigned int, void *) |
用于接收和处理网络数据的回调函数 输入参数是 unsigned char *buf、unsigned int buf_len、void *userdata。
|
<len_used> |
unsigned char |
如果 len_used 被设置为 1,则可以从回调中的 userdata 获取加密类型。 此外,Wi-Fi 驱动程序中将收集 beacon 和 probersp,并记录 BSSID 的加密类型,这样当报告帧使用回调时,回调的用户数据参数可以将此加密信息传递给用户。 userdata 中携带的加密类型可能是:
|
wifi_init_packet_filter
在混杂模式下初始化数据包过滤器。
参数:无。
wifi_add_packet_filter
在混杂模式下将数据包过滤器添加到列表中。
参数 |
类型 |
介绍 |
---|---|---|
<filter_id> |
unsigned char |
用于识别过滤器的过滤器ID |
<patt> |
rtw_packet_filter_pattern_t * |
指向过滤器模式的指针 |
<rule> |
rtw_packet_filter_rule_t |
其数值可以是:
|
备注
这是混杂模式下的软件过滤器。
wifi_remove_packet_filter
从混杂模式下的列表中移除指定的数据包过滤器。
参数 |
类型 |
介绍 |
---|---|---|
<filter_id> |
unsigned char |
将从过滤器列表中移除的指定数据包过滤器的过滤器ID。 |
wifi_enable_packet_filter
在混杂模式下启用指定的数据包过滤器。
参数 |
类型 |
介绍 |
---|---|---|
<filter_id> |
unsigned char |
将启用的指定数据包过滤器的过滤器ID。 |
wifi_disable_packet_filter
在混杂模式下禁用指定的数据包过滤器。
参数 |
类型 |
介绍 |
---|---|---|
<filter_id> |
unsigned char |
将禁用的指定数据包过滤器的过滤器ID。 |
Mac filter APIs
API |
介绍 |
---|---|
<wifi_init_mac_filter> |
初始化MAC地址过滤器列表。 |
<wifi_add_mac_filter> |
将MAC地址添加到MAC过滤器列表中,该地址将在认证期间被拒绝。 |
<wifi_del_mac_filter> |
从MAC过滤器列表中移除MAC地址。 |
备注
这些 API 应仅在作为软 AP 操作时使用。
wifi_remove_packet_filter
初始化 MAC 地址过滤器列表。
参数:无。
wifi_add_packet_filter
将 MAC 地址添加到 MAC 过滤器列表中,该地址将在认证期间被拒绝。
参数 |
类型 |
介绍 |
---|---|---|
<hwaddr> |
unsigned char * |
指向将添加到MAC过滤器列表中的MAC地址,该MAC地址将在认证过程中被拒绝。 |
wifi_del_packet_filter
从 MAC 过滤器列表中移除 MAC 地址。
参数 |
类型 |
介绍 |
---|---|---|
<hwaddr> |
unsigned char * |
指向将从MAC过滤器列表中移除的MAC地址。 |
WPS API
API |
介绍 |
---|---|
<wps_start> |
启动WPS注册流程 |
<wps_stop> |
停止WPS注册流程 |
wps_start
启动 WPS 注册流程。
参数 |
Type |
介绍 |
---|---|---|
<wps_config> |
u16 |
WPS配置方法
|
<pin> |
char * |
PIN码。如果使用 WPS_CONFIG_PUSHBUTTON,可以设置为NULL。 |
<channel> |
u8 |
信道。当前未使用,可以设置为0。 |
<ssid> |
char * |
目标网络SSID,如果未指定目标网络,可以设置为NULL。 |
备注
在调用此函数之前,应通过调用
wifi_on()
来启用 Wi-Fi。请确保在
platform_opts.h
中启用了CONFIG_ENABLE_WPS
。调用wps_start()
后,WPS 的最长时间为 120 秒。您可以调用wps_stop()
以退出 WPS。
wps_stop
停止 WPS 注册流程。
参数:无。
备注
请确保在 platform_opts.h
中启用了 CONFIG_ENABLE_WPS
。
STD_WLAN
这是 NL80211 版本的驱动程序,支持 wpa_supplicant 和 hostapd。
站点模式
wpa_supplicant
wpa_supplicant 是一个跨平台的客户端程序,支持 WPA、WPA2 和 WPA3 (IEEE 802.11i)。它是用于客户端站点的 IEEE 802.1X/WPA 组件。该程序实现了与 WPA 认证服务器的密钥协商,控制无线驱动的漫游以及 IEEE 802.11 的认证/关联。
wpa_supplicant.conf
wpa_supplicant 的配置使用一个文本文件,该文件列出了所有可接受的网络和安全策略,包括预共享密钥。有关配置格式和支持的字段的详细信息,请参阅示例配置文件,文件可能位于 /etc/wifi
中。
该配置文件中的所有文件路径应使用完整(绝对路径,而不是相对于工作目录的路径),以便允许更改工作目录。如果 wpa_supplicant 在后台运行,这种情况可能会发生。
可以通过向 wpa_supplicant 发送 SIGHUP 信号(killall -HUP wpa_supplicant
)来重新加载配置文件的更改。同样,可以使用 wpa_cli 的 reconfigure 命令触发重新加载。
配置文件可以包含一个或多个网络块,例如,每个使用的 SSID 都对应一个网络块。wpa_supplicant 将根据配置文件中网络块的顺序、网络安全级别(优先选择 WPA/WPA2)和信号强度自动选择最佳网络。
下面的示例是两个网络配置示例:一个是家庭网络使用的 WPA-Personal(PSK),另一个是工作网络使用的 EAP-TLS 的 WPA-Enterprise。
# allow frontend (e.g., wpa_cli) to be used by all users in 'wheel' group
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel
#
# home network; allow all valid ciphers
update_config=1
wowlan_triggers=any
network={
ssid="home"
scan_ssid=1
key_mgmt=WPA-PSK
psk="very secret passphrase"
}
#
# work network; use EAP-TLS with WPA; allow only CCMP and TKIP ciphers
network={
ssid="work"
scan_ssid=1
key_mgmt=WPA-EAP
pairwise=CCMP TKIP
group=CCMP TKIP
eap=TLS
identity="user@example.com"
ca_cert="/etc/cert/ca.pem"
client_cert="/etc/cert/user.pem"
private_key="/etc/cert/user.prv"
private_key_passwd="password"
}
如果需要保存配置,应在 /etc/wifi/wpa_supplicant.conf
中添加 update_config=1
,或者使用命令 wpa_cli -i wlan0 set update_config 1
。
如果需要启用 wowlan 功能,应在 /etc/wifi/wpa_supplicant.conf
中添加 wowlan_triggers=any
,或者使用命令 wpa_cli -i wlan0 set wowlan_triggers any
。否则,客户端将在进入挂起状态时与 AP 断开连接。
执行 wpa_supplicant
以下命令可以在 nl80211 接口和 wlan0 端口上运行 wpa_supplicant。它将使用配置文件 /etc/wifi/wpa_supplicant.conf
并在后台运行。
wpa_supplicant -D nl80211 -i wlan0 -c /etc/wifi/wpa_supplicant.conf -B
更多细节,请参考 wpa_supplicant --help
或者 wpa_supplicant wiki 。
wpa_cli
wpa_cli 是一个用于与 wpa_supplicant 交互的基于文本的前端程序。它用于查询当前状态、更改配置、触发事件以及请求用户交互输入。
wpa_cli 可以显示当前的认证状态、选定的安全模式、dot11 和 dot1x MIB 等。此外,它还可以配置一些变量,如 EAPOL 状态机参数,并触发事件,如重新关联和 IEEE 802.1X 登出/登录。 wpa_cli 提供了一个用户界面,用于请求认证信息,如用户名和密码,如果这些信息未包含在配置中。可以使用它来实现一次性密码或通用令牌卡认证,其中认证基于质询-响应,并使用外部设备生成响应。
wpa_supplicant 的控制接口可以配置为允许非 root 用户访问(在配置文件中使用 ctrl_interface GROUP 参数)。这使得可以用普通用户账户运行 wpa_cli。
wpa_cli 支持两种模式:交互模式和命令行模式。两种模式使用相同的命令集,主要区别在于交互模式可以访问非请求消息(事件消息、用户名/密码请求)。
当不将命令作为命令行参数包含在内时, wpa_cli 会启动交互模式。此时,可以在 wpa_cli 提示符下输入命令。在命令行模式下,相同的命令被作为命令行参数输入给 wpa_cli。
更多细节请参考 wpa_cli 。
扫描
有两种基于 STA_WLAN 的扫描方式。
使用 iw 扫描
以下命令用于扫描 wlan0。
iw wlan0 scan
下图显示了上述命令的结果。它打印了扫描到的接入点的详细信息。

Scan with wpa_cli
以下命令用于扫描 wlan0 并获取扫描结果。
wpa_cli -i wlan0 scan
wpa_cli -i wlan0 scan_result
下图显示了上述命令的结果。它打印了扫描到的接入点的详细信息。

设置 ssid 与密码
以下命令用于在 wlan0 上设置 SSID 和密码。
wpa_cli -i wlan0
add_network
set_network <network_id> ssid "ssid"
set_network <network_id> psk "password"
如果接入点是隐藏的,则需要使用以下命令:
set_network <network_id> scan_ssid 1
或者,在隐藏接入点的 wpa_supplicant.conf
文件中添加 scan_ssid=1
。
下图展示了成功设置 SSID 为 MERCURY_1200_W6
和密码为 12345678
的过程。
备注
输入 wpa_cli -i wlan0
将进入 wpa_cli 的控制台,所有操作都将在 wlan0 上进行。使用 quit
命令可以退出 wpa_cli 的控制台。

连接
下面的命令用于启用网络并选择要连接的网络。
enable_network <network_id>
select_network <network_id>
备注
如果网络存储在 wpa_supplicant.conf
中,那么在运行 wpa_supplicant 后,WiFi 应自动连接到该网络。
连接到 WEP 接入点
wpa_supplicant
对于 WEP,可以使用以下命令配置 WEP SSID 并连接 WEP 接入点(AP)。
# Open WEP key connection (two-message auth; no WPA, no IEEE 802.1X)
set_network id key_mgmt NONE
set_network id wep_key0 "abcde" // ASCII 64bit
set_network id wep_key1 1234567890 // hex 64bit
set_network id wep_key2 "1234567890123" // ASCII 128bit
set_network id wep_tx_keyidx 0 // key id
# Shared WEP key connection (four-message auth; no WPA, no IEEE 802.1X)
set_network id key_mgmt NONE
set_network id wep_key0 "abcde" // ASCII 64bit
set_network id wep_key1 1234567890 // hex 64bit
set_network id wep_key2 "1234567890123" // ASCII 128bit
set_network id wep_tx_keyidx 0 // key id
set_network id auth_alg SHARED
另一方面,这些命令可以用 wpa_supplicant.conf
中的以下配置代替。
# Open WEP key connection (two-message auth; no WPA, no IEEE 802.1X)
network={
ssid="static-wep-test"
key_mgmt=NONE
wep_key0="abcde" #ASCII 64bit
wep_key1=1234567890 # hex 64bit
wep_key2="1234567890123" #ASCII 128bit
wep_tx_keyidx=0 #key id
priority=5
}
# Shared WEP key connection (four-message auth; no WPA, no IEEE 802.1X)
network={
ssid="static-wep-test"
key_mgmt=NONE
wep_key0="abcde" #ASCII 64bit
wep_key1=1234567890 # hex 64bit
wep_key2="1234567890123" #ASCII 128bit
wep_tx_keyidx=0 #key id
priority=5
auth_alg=SHARED
}
iwconfig
对于 WEP,可以使用以下命令连接 WEP 接入点(AP)。
iwconfig wlan0 key [id] hex //hex
iwconfig wlan0 key s:password [id] // ASCII
iwconfig wlan0 key [id] //choose psk id.
iwconfig wlan0 essid "ssid" //set ssid and connect
更多细节,请参考 iwconfig_8 。
使用 WPS 连接
对于 WPS,当接入点支持并启用相关功能时,可以使用以下命令。
备注
根据规范,WPS 不支持 WPA3 Wi-Fi 安全性。
WPS PBC
执行以下命令,并在两分钟内按下路由器上的按键,然后网络配置将从接入点接收并存储在 wpa_supplicant.conf
中。
wpa_cli -i wlan0 wps_pbc [BSSID]
备注
当有不止一个客户端或接入点处于 PBC 状态时,可能会失败。

WPS PIN - 客户端 PIN 码
执行以下命令,你将获得一个 PIN 码,或者在这个命令中使用指定的 PIN 值。在路由器中输入该 PIN 码,然后网络配置将从接入点接收并存储在 wpa_supplicant.conf
中。
wpa_cli -i wlan0 wps_pin <BSSID | any> [pin_number]
备注
在命令中使用的指定 PIN 码必须通过界面处理,以去除非数字字符,并可能需要验证校验位。可以使用以下命令进行这样的处理。
wpa_cli wps_check_pin <PIN>


WPS PIN - Router pin
启用路由器的 PIN 功能,并从网页界面或路由器上的标签获取 BSSID 或路由器的 PIN 值,使用以下命令连接接入点。
wpa_cli -i wlan0 wps_reg <BSSID > <AP PIN>

更多细节,请参考 WPS 。
断开与重连
以下命令用于断开网络连接。
disconnect
以下命令用于重新连接网络。
reconnect
下图显示了先断开网络 1,然后成功重新连接它的流程。

DHCP
dhcpcd wlan0
用于从 AP 的 DHCP 服务器获取 IP 地址。下图显示了运行 DHCP 客户端并获取 IP 192.168.1.101
的示例。

SoftAP 模式
hostapd
hostapd(主机接入点守护进程)是一种用户空间守护进程软件,使网络接口卡能够充当接入点和认证服务器。
hostapd.conf
hostapd.conf
是 hostapd 的配置文件,通常存储在 /etc
目录中。它包含 SoftAP 的参数。
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
ctrl_interface=/var/run/hostapd
hw_mode=g
channel=1
ssid=sqb_test
beacon_int=100
dtim_period=1
max_num_sta=20
rts_threshold=2347
fragm_threshold=2346
ieee80211n=1
erp_send_reauth_start=1
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa_passphrase=12345678
上面的文件是 hostapd.conf
的一个示例,它设置了 SSID 为 sqb_test
和密码为 12345678
。有关更多详细信息,请参考 hostapd wiki 。
执行 hostapd
以下命令可以在后台运行 hostapd,并在 wlan1 上启动 softap。
hostapd /etc/hostapd.conf -B -i wlan1
下图显示了成功启动 softap。

备注
无论是 wlan0 还是 wlan1 都可以作为 softap 运行。如果一个端口作为 softap 工作,而另一个作为站点工作,则 WiFi 正在以并发模式运行。
DHCP 服务器
流程如下所示。
ifconfig wlan1 192.168.43.1
udhcpd -S /etc/udhcpd.conf
测试
环境
站点测试环境
备注
AP: 支持 11 a/b/g/n 的带有 WiFi AP 的路由器。
PC: 一台通过以太网线连接到 AP 的 LAN 端口的电脑。
DUT: 用于测试的设备应为 Ameba 智能板。它将通过无线连接到 AP,并通过串口线连接到电脑。
电脑可以通过串口线的控制台来控制被测设备(DUT)。
Softap 测试环境

备注
PC: 一台配备支持 11 a/b/g/n 的 WiFi 网卡的电脑。
DUT: 用于测试的设备应为 Ameba 智能板。它将通过无线和串口线连接到电脑。
电脑可以通过串口线的控制台来控制被测设备(DUT)。
Ping 测试
系统中的 ping
是 Linux 的经典 ping 工具,使用 ping -h
可以获取帮助信息。下图显示了对 192.168.39.2
的 ping 操作,没有出现数据包丢失。

吞吐量测试
该系统支持使用 iperf3
来测试 Wi-Fi 的吞吐量,而 iperf3
是 Linux 中的经典工具。可以使用 iperf3 -h
获取帮助信息。
# To run as a server, UPD or TCP:
iperf3 -s -i 1
# To run as a client of TCP:
iperf3 -c ip_of_server -i 1 -t count
# To run as a client of UDP:
iperf3 -c ip_of_server -i 1 -t count -u -b bandwidth
备注
ip_of_server 是服务器的 IP 地址。
计数的单位是秒。
带宽的单位应为 K、M 或 G。官方 Windows 版本的 iperf3 二进制文件存在一些错误,所以带宽应设置为 WiFi 实际带宽的限制。

TP for TCP TX

TP for TCP RX

TP for UDP TX

TP for UDP RX
DNS 测试
以下命令可以将 AP_IP 添加为 Linux 的 DNS 服务器。
echo "nameserver AP_IP" >> /etc/resolv.conf
下图展示了 ping www.baidu.com 的结果。

IP 转发
以下命令可以设置转发。连接到 SoftAP 的 DUT 可以 ping 通过 wlan0 连接的 AP。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Adb shell
如果要使用 adb 功能,则应在开发板上执行 usb.sh adb
以初始化 USB adb 功能。然后在 PC 上输入 adb shell 以连接到开发板。
下图显示成功连接开发板并进入 adb shell
。

调试
请参考 Trace Tool 的章节。