androidP wpa_supplicant启动参数以及过程介绍

大致的启动参数如下:

service wpa_supplicant /vendor/bin/hw/wpa_supplicant \
    -O/data/vendor/wifi/wpa/sockets \
    -ip2p0 -Dnl80211 -c/data/vendor/wifi/wpa/p2p_supplicant.conf \
    -e/data/misc/wifi/entropy.bin -N \         
    -iwlan0 -Dnl80211 -c/data/vendor/wifi/wpa/wpa_supplicant.conf \                                                   
    [email protected]:wpa_wlan0 -ddd       
    # we will start as root and wpa_supplicant will switch to user wifi                                             
    # after setting up the capabilities required for WEXT
    # user wifi                              
    # group wifi inet keystore                            
    interface [email protected]::ISupplicant default
    interface [email protected]::ISupplicant default
    class main                            
    socket wpa_wlan0 dgram 660 wifi wifi         
    disabled                                               
    oneshot

 

参数介绍如下:

  -b = optional bridge interface name
  -B = run daemon in the background
  -c = Configuration file
  -C = ctrl_interface parameter (only used if -c is not)
  -d = increase debugging verbosity (-dd even more)
  -D = driver name (can be multiple drivers: nl80211,wext)
  -e = entropy file
  -g = global ctrl_interface
  -G = global ctrl_interface group
  -h = show this help text
  -i = interface name
  -I = additional configuration file
  -K = include keys (passwords, etc.) in debug output
  -L = show license (BSD)
  -m = Configuration file for the P2P Device interface
  -N = start describing new interface
  -o = override driver parameter for new interfaces
  -O = override ctrl_interface parameter for new interfaces
  -p = driver parameters
  -P = PID file
  -q = decrease debugging verbosity (-qq even less)
  -t = include timestamp in debug messages
  -v = show version
  -W = wait for a control interface monitor before starting
 

启动过程介绍:

第一步:解析wpa_supplcant的启动参数

第二步:初始化global接口

第三步:添加wlan0和p2p0接口,这里有个坑,启动参数最好把p2p0接口放在前面,wlan0接口放在后面,不然可能出现如下错误:

01-01 07:13:22.610  5858  5858 D wpa_supplicant: Using existing control interface directory.
01-01 07:13:22.610  5858  5858 D wpa_supplicant: ctrl_iface bind(PF_UNIX) failed: Address already in use
01-01 07:13:22.610  5858  5858 I wpa_supplicant: ctrl_iface exists and seems to be in use - cannot override it
01-01 07:13:22.610  5858  5858 I wpa_supplicant: Delete '/data/vendor/wifi/wpa/sockets/wlan0' manually if it is not used anymore
01-01 07:13:22.610  5858  5858 E wpa_supplicant: Failed to initialize control interface '/data/vendor/wifi/wpa/sockets'.
01-01 07:13:22.610  5858  5858 E wpa_supplicant: You may have another wpa_supplicant process already running or the file was
01-01 07:13:22.610  5858  5858 E wpa_supplicant: left by an unclean termination of wpa_supplicant in which case you will need
01-01 07:13:22.610  5858  5858 E wpa_supplicant: to manually remove this file before starting wpa_supplicant again.
01-01 07:13:22.611  5858  5858 D wpa_supplicant: Failed to add interface wlan0

具体原因见wpa_supplicant:

androidP wpa_supplicant启动参数以及过程介绍

第四步:运行几个核心线程开始工作

 

第五步:初始化android hal:SupplicantStaIfaceHal(用来监听supplicant的变化),如下2行主要决定使用的工具以及对应的版本

interface [email protected]::ISupplicant default
interface [email protected]::ISupplicant default

如果没有上面的信息,运行的时候会报如下错误:

01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950): Failed to get ISupplicant
01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950): java.util.NoSuchElementException
01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950):     at android.os.HwBinder.getService(Native Method)
01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950):     at android.os.HwBinder.getService(HwBinder.java:91)
01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950):     at android.hardware.wifi.supplicant.V1_0.ISupplicant.getService(ISupplicant.java:48)
01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950):     at android.hardware.wifi.supplicant.V1_0.ISupplicant.getService(ISupplicant.java:52)
01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950):     at com.android.server.wifi.SupplicantStaIfaceHal.getSupplicantMockable(SupplicantStaIfaceHal.java:541)
01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950):     at com.android.server.wifi.SupplicantStaIfaceHal.initSupplicantService(SupplicantStaIfaceHal.java:244)
01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950):     at com.android.server.wifi.SupplicantStaIfaceHal.access$200(SupplicantStaIfaceHal.java:88)
01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950):     at com.android.server.wifi.SupplicantStaIfaceHal$1.onRegistration(SupplicantStaIfaceHal.java:120)
01-01 00:00:02.934 E/SupplicantStaIfaceHal( 1950):     at android.hidl.manager.V1_0.IServiceNotification$Stub.onTransact(IServiceNotification.java:389)
01-01 00:00:02.935 E/SupplicantStaIfaceHal( 1950): Got null ISupplicant service. Stopping supplicant HIDL startup
01-01 00:00:02.935 E/SupplicantStaIfaceHal( 1950): initalizing ISupplicant failed.