在调试Android P WiFi功能时,尝试测试国家码时,却总是找不到正确的设置指令,尝试执行的指令有:
1、wpa_cli -i wlan0 set country CN
查看日志,发现supplicant中确实执行了该流程,但最终却没有下发到driver中,怀疑在kernel中就断掉了。原因未深入去梳理。
2、service call wifi 26 s16 CN
本指令也是进入supplicant,但没有正确下发到driver中。
最终采用修改当前产品prop的方式实现开机时自动设置国家码(device/***/***/***.mk文件):
PRODUCT_PROPERTY_OVERRIDES += \
ro.boot.wificountrycode=CN
进而跟踪调用路径(supplicant+kernel+driver):
setCountryCode sta_iface.cpp
setCountryCodeInternal sta_iface.cpp
doOneArgDriverCommand
doZeroArgDriverCommand
wpa_drv_driver_cmd
wpa_driver_nl80211_driver_cmd 该函数定义在在各个厂商自己的driver_cmd_nl80211.c文件中。
ioctl(drv->global->ioctl_sock, SIOCDEVPRIVATE + 1, &ifr) 将设置命令发送至内核,ifr参数中携带了设备的名称,内核将根据该值来定位执行此命令的设备驱动。
wpa_driver_notify_country_change
wpa_supplicant_event
wpa_supplicant_update_channel_list
内核中流程:
SYSCALL_DEFINE3
do_vfs_ioctl
vfs_ioctl
filp->f_op->unlocked_ioctl
sock_ioctl
dev_ioctl
dev_ifsioc
ops->ndo_do_ioctl 最终下发至driver中
而driver中需要事先实现struct net_device_ops结构体中的ndo_do_ioctl成员函数,下发的命令将会在该成员函数中被处理。
后续调试时发现,所有driver相关的private命令,需要按照如下方式进行下发:
wpa_cli driver country CN
如此才能正确走ioctl下发到driver中进行执行。