介绍

概览

该芯片包含三个内核:

  • LP: 低功耗处理器,KM0 和 Wi-Fi 固件在其上运行。

  • NP: 网络处理器、KM4 和 Wi-Fi 驱动程序可以在它上面工作。

  • AP: 应用处理器 CA32 和 FullMAC 可以在它上面工作。FullMAC 驱动程序是 Linux 内核中的 cfg80211 和 FreeRTOS 中的 Wi-Fi Driver 之间的自适应驱动程序。

../../rst_linux/2_wifi/figures/three_cores.svg

架构

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 的数据帧。所以前者是低速,后者是高速。

../../rst_linux/2_wifi/figures/wifi_driver_arch.svg

配置

内核配置

在 project 的 build 目录下执行以下命令,打开 kernel 的配置。

bitbake virtual/kernel -c menuconfig

启用 Ameba IPC

Linux 中的 Wi-Fi 驱动程序是基于 Ameba IPC 的驱动程序,因此必须为 IPC 的驱动程序启用 Wi-Fi 驱动程序。当然,如果您选择 Fullmac for rtl8730eyes,则此选项已启用。

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 驱动程序中只有两个端口,wlan0wlan1wlan0 必须仅在工作站模式下工作,并且 wlan1 必须仅在接入点 (AP) 模式下工作。

初始化

所有 API 在 Linux 中都有效的前提条件是 Wi-Fi IOCTL 和事件的初始化。

IOCTL 初始化

无。

事件初始化

无。

Wi-Fi 数据结构

数据结构

介绍

<_cus_ie>

结构用于设置 Wi-Fi 自定义 IE 列表,并且类型匹配 CUSTOM_IE_TYPE。 信息元素(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。

rtw_mode_t 中列举了可选模式。

wifi_off

停用 Wi-Fi.

参数:无。

wifi_is_running

检查指定的接口是否正常运行。

参数

类型

介绍

<wlan_idx>

Unsigned char

idx 可以设置为 WLAN0_IDXWLAN1_IDX

  • 对于 STA 模式,仅使用 WLAN0_IDX

  • 对于 softAP 模式,请使用 WLAN1_IDX

  • 对于 concurrent 模式,STA时使用 WLAN0_IDX,AP时使用 WLAN1_IDX

wifi_set_mode

参数

类型

介绍

<mode>

int

决定将 WiFi 切换到哪种模式,可选模式有:

  • RTW_MODE_STA

  • RTW_MODE_AP

  • RTW_MODE_STA_AP

  • RTW_MODE_PROMISC

扫描 API

API

介绍

<wifi_scan_networks>

启动扫描以搜索 802.11 网络

<wifi_get_scan_records>

用于在扫描参数中未配置 RTW_SCAN_REPORT_EACH 模式时获取扫描结果

<wifi_scan_abort>

放弃正在进行中的 Wi-Fi 扫描

wifi_scan_networks

启动扫描以搜索 802.11 网络。

参数

类型

介绍

<scan_param>

rtw_scan_param_t *

指定扫描参数,包括扫描类型、特定SSID、特定信道列表、信道扫描时间和扫描回调函数。

一共有两类扫描回调函数:

  • scan_user_callback

  • scan_report_each_mode_user_callback

如果已注册,扫描完成后将执行 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

指定扫描为同步或异步。

  • 设置为1表示同步,这个API会在扫描完成后返回。

  • 设置为0表示异步,此API将立即返回。

备注

  • 如果调用此 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

确定连接是同步的还是异步的。

  • 设为1表示同步连接

  • 设为0表示异步连接

备注

  • 确保在调用函数 (wifi_on()) 之前启用了 Wi-Fi。

  • 在 Wi-Fi 连接期间,connect_param 中的参数 channelpscan_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模式,可以是:

  • IPS_MODE_NONE: 离开IPS

  • IPS_MODE_NORMAL: 可以进入IPS

  • IPS_MODE_RESUME: 恢复到Wi-Fi驱动程序中记录的上一个IPS模式

<lps_mode>

u8

所需的lps模式,可以是:

  • LPS_MODE_NONE: 离开LPS

  • LPS_MODE_NORMAL: 可以进入LPS

  • LPS_MODE_RESUME: 恢复到Wi-Fi驱动程序中记录的上一个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接口名:

  • WLAN0_IDX

  • WLAN1_IDX

<pSetting>

rtw_wifi_setting_t *

指向rtw_wifi_setting_t结构体以存储从驱动程序获取的Wi-Fi设置

wifi_set_network_mode

根据支持的数据速率设置网络模式。驱动程序在初始化后默认在 BGN 模式下工作。此函数用于在连接到 AP 之前更改无线网络的工作模式为 station 模式。

参数

类型

介绍

<mode>

rtw_network_mode_t

要设置的网络模式:

  • RTW_NETWORK_B

  • RTW_NETWORK_BG

  • RTW_NETWORK_BGN

wifi_set_mfp_support

设置管理帧保护支持能力。

参数

类型

介绍

<value>

unsigned char

其数值可以是:

  • NO_MGMT_FRAME_PROTECTION: 不支持

  • MGMT_FRAME_PROTECTION_OPTIONAL: 有能力的

  • MGMT_FRAME_PROTECTION_REQUIRED: 需要的

wifi_get_group_id

设置用于 SAE 事务的有限循环组的组 ID。

参数

类型

介绍

<value>

unsigned char

指定用于SAE事务的有限循环组的组ID。

wifi_set_pmk_cache_enable

启用或禁用 PMK 缓存。

参数

类型

介绍

<value>

unsigned char

  • 1: 启用

  • 0: 禁用

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_INDICATE_DISABLE: 禁用模式(默认),硬件仅指示与BSSID匹配的数据包,软件不报告。

  • WIFI_INDICATE_NORMAL: 硬件仅指示与BSSID匹配的数据包,并且软件会报告。

  • WIFI_INDICATE_WILD: 硬件指示所有数据包,并且软件会报告。

wifi_get_antenna_info

获取天线信息。

参数

类型

介绍

<antenna>

unsigned char *

用于存储从驱动程序获取的天线值的点。

  • 0: 主

  • 1: 辅

wifi_get_auto_chl

通过 NMH 算法获得自动信道,所选择的信道在返回值中。

参数

类型

介绍

<wlan_idx>

unsigned char

WLAN接口索引,可以是:

  • WLAN0_IDX

  • WLAN1_IDX

<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。

  • 对于 STA 模式和 SoftAP 模式,使用端口 0。

  • 对于并发模式,STA 使用端口 0,AP 使用端口 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

启用的值可以是:

  • RTW_PROMISC_DISABLE = 0, 禁用混杂接收

  • RTW_PROMISC_ENABLE = 1, 获取所有以太网数据包

  • RTW_PROMISC_ENABLE_1 = 2, 只获取B/M数据包

  • RTW_PROMISC_ENABLE_2 = 3, 获取所有的802.11数据包

  • RTW_PROMISC_ENABLE_3 = 4, 只获取B/M 802.11数据包

<callback>

void(*callback)(unsigned char *,unsigned int, void *)

用于接收和处理网络数据的回调函数

输入参数是 unsigned char *buf、unsigned int buf_len、void *userdata。

  • Buf: 指向该帧的指针

  • bul_len: 帧长度

  • userdata: 指向格式为 ieee80211_frame_info 结构的帧信息。

<len_used>

unsigned char

如果 len_used 被设置为 1,则可以从回调中的 userdata 获取加密类型。

此外,Wi-Fi 驱动程序中将收集 beacon 和 probersp,并记录 BSSID 的加密类型,这样当报告帧使用回调时,回调的用户数据参数可以将此加密信息传递给用户。

userdata 中携带的加密类型可能是:

  • RTW_ENCRYPTION_UNKNOWN = 0

  • RTW_ENCRYPTION_OPEN = 1

  • RTW_ENCRYPTION_WEP40 = 2

  • RTW_ENCRYPTION_WPA_TKIP = 3

  • RTW_ENCRYPTION_WPA_AES = 4

  • RTW_ENCRYPTION_WPA2_TKIP = 5

  • RTW_ENCRYPTION_WPA2_AES = 6

  • RTW_ENCRYPTION_WPA2_MIXED = 7

  • RTW_ENCRYPTION_WEP104 = 9

  • RTW_ENCRYPTION_UNDEF = 0Xff

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

其数值可以是:

  • RTW_POSITIVE_MATCHING = 0: 如果与此模式匹配,则接收帧,否则丢弃帧。

  • RTW_NEGATIVE_MATCHING = 1: 如果与此模式匹配,则丢弃帧,否则接收帧。

备注

这是混杂模式下的软件过滤器。

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配置方法

  • WPS_CONFIG_DISPLAY

  • WPS_CONFIG_KEYPAD

  • WPS_CONFIG_PUSHBUTTON

<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

下图显示了上述命令的结果。它打印了扫描到的接入点的详细信息。

../../rst_linux/2_wifi/figures/scanning_with_iw.png

Scan with wpa_cli

以下命令用于扫描 wlan0 并获取扫描结果。

wpa_cli -i wlan0 scan
wpa_cli -i wlan0 scan_result

下图显示了上述命令的结果。它打印了扫描到的接入点的详细信息。

../../rst_linux/2_wifi/figures/scanning_with_wpa_cli.png

设置 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 的控制台。

../../rst_linux/2_wifi/figures/set_ssid_password_and_connect.png

连接

下面的命令用于启用网络并选择要连接的网络。

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 状态时,可能会失败。

../../rst_linux/2_wifi/figures/wps_pbc_connect.png

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>
../../rst_linux/2_wifi/figures/wps_client_pin_cmd.png
../../rst_linux/2_wifi/figures/wps_client_pin_connect.png

WPS PIN - Router pin

启用路由器的 PIN 功能,并从网页界面或路由器上的标签获取 BSSID 或路由器的 PIN 值,使用以下命令连接接入点。

wpa_cli -i wlan0 wps_reg <BSSID > <AP PIN>
../../rst_linux/2_wifi/figures/wps_router_pin_connect.png

更多细节,请参考 WPS

断开与重连

以下命令用于断开网络连接。

disconnect

以下命令用于重新连接网络。

reconnect

下图显示了先断开网络 1,然后成功重新连接它的流程。

../../rst_linux/2_wifi/figures/disconnect_and_connect.png

DHCP

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

../../rst_linux/2_wifi/figures/dhcp_from_ap.png

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。

../../rst_linux/2_wifi/figures/start_softap.png

备注

无论是 wlan0 还是 wlan1 都可以作为 softap 运行。如果一个端口作为 softap 工作,而另一个作为站点工作,则 WiFi 正在以并发模式运行。

DHCP 服务器

流程如下所示。

ifconfig wlan1 192.168.43.1
udhcpd -S /etc/udhcpd.conf

测试

环境

站点测试环境

../../rst_linux/2_wifi/figures/environment_to_test_station.svg

备注

  • AP: 支持 11 a/b/g/n 的带有 WiFi AP 的路由器。

  • PC: 一台通过以太网线连接到 AP 的 LAN 端口的电脑。

  • DUT: 用于测试的设备应为 Ameba 智能板。它将通过无线连接到 AP,并通过串口线连接到电脑。

电脑可以通过串口线的控制台来控制被测设备(DUT)。

Softap 测试环境

../../rst_linux/2_wifi/figures/environment_to_test_softap.png

备注

  • PC: 一台配备支持 11 a/b/g/n 的 WiFi 网卡的电脑。

  • DUT: 用于测试的设备应为 Ameba 智能板。它将通过无线和串口线连接到电脑。

  • 电脑可以通过串口线的控制台来控制被测设备(DUT)。

Ping 测试

系统中的 ping 是 Linux 的经典 ping 工具,使用 ping -h 可以获取帮助信息。下图显示了对 192.168.39.2 的 ping 操作,没有出现数据包丢失。

../../rst_linux/2_wifi/figures/ping_test.png

吞吐量测试

该系统支持使用 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 实际带宽的限制。

../../rst_linux/2_wifi/figures/tp_for_tcp_tx.png

TP for TCP TX

../../rst_linux/2_wifi/figures/tp_for_tcp_rx.png

TP for TCP RX

../../rst_linux/2_wifi/figures/tp_for_udp_tx.png

TP for UDP TX

../../rst_linux/2_wifi/figures/tp_for_udp_rx.png

TP for UDP RX

DNS 测试

以下命令可以将 AP_IP 添加为 Linux 的 DNS 服务器。

echo "nameserver AP_IP" >> /etc/resolv.conf

下图展示了 ping www.baidu.com 的结果。

../../rst_linux/2_wifi/figures/dns_test.png

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

../../rst_linux/2_wifi/figures/adb_shell.png

调试

请参考 Trace Tool 的章节。