Android P - WiFi 国家码设置流程

在调试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中进行执行。

 

 

你可能感兴趣的:(wifi,linux)