我通过 wpa_supplicant 和一个调用 wpa_ctrl API [2] 的简单 C 程序 [1] 启用到 Linux 主机的 WiFi P2P 连接。通过 Nexus 7 Android 平板电脑连接然后断开连接后,Linux 主机从平板电脑的 P2P 对等点列表中消失,只有在重新启动主机后才会重新出现。我尝试过重新发布 p2p_ext_listen,重新启动 wpa_supplicant,并使用 modprobe 取消/重新加载 mwifiex_sdio 驱动程序。我相信这是我的代码之外的一个错误,但如果是这样,在哪里?
[1] https://github.com/networkimprov/p2p-host/blob/master/main.c
随意在 x86 linux 机器上构建和测试 :-)
[2] https://w1.fi/wpa_supplicant/devel/ctrl_iface_page.html
我的 Linux 主机:
- wpa_supplicant 2.5 与 -i p2p0 -D nl80211 -c /etc/wpa_supplicant/p2p0.conf
- 内核 4.7.2(主线)
- 发行版 Arch Linux ARM
- 收音机 Marvell sd8787
- 中央处理器 OMAP3
p2p0.conf:
ctrl_interface=/run/wpa_supplicant
ap_scan=1
device_name=mwifiex-p2p-device
device_type=1-0050F204-1
p2p_listen_reg_class=81
p2p_listen_channel=1
p2p_oper_reg_class=81
p2p_oper_channel=1
p2p_no_group_iface=1
p2p_go_intent=15
程序日志(>>> 将 msg 标记为 wpa_supplicant):
$ sudo p2p-host/p2phostd /run/wpa_supplicant/p2p0 75 1500 11111111
>>> P2P_EXT_LISTEN 75 1500
OK
<3>P2P-DEVICE-FOUND ae:22:0b:48:49:61 p2p_dev_addr=ae:22:0b:48:49:61 pri_dev_type=10-0050F204-5 name='Android_7326' config_methods=0x188 dev_capab=0x25 group_capab=0x0 new=1
<3>P2P-PROV-DISC-SHOW-PIN ae:22:0b:48:49:61 72764473 p2p_dev_addr=ae:22:0b:48:49:61 pri_dev_type=10-0050F204-5 name='Android_7326' config_methods=0x188 dev_capab=0x25 group_capab=0x0
>>> P2P_CONNECT ae:22:0b:48:49:61 11111111 display go_intent=0
OK
<3>P2P-GO-NEG-SUCCESS role=client freq=2417 ht40=0 peer_dev=ae:22:0b:48:49:61 peer_iface=ae:22:0b:48:c9:61 wps_method=Display
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-BSS-ADDED 0 20:4e:7f:92:63:d6
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-BSS-ADDED 1 ae:22:0b:48:c9:61
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-AUTH
<3>Trying to associate with ae:22:0b:48:c9:61 (SSID='DIRECT-Mw-Android_7326' freq=2417 MHz)
<3>Associated with ae:22:0b:48:c9:61
<3>CTRL-EVENT-EAP-STARTED EAP authentication started
<3>CTRL-EVENT-EAP-STATUS status='started' parameter=''
<3>CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=1
<3>CTRL-EVENT-EAP-STATUS status='accept proposed method' parameter='WSC'
<3>CTRL-EVENT-EAP-METHOD EAP vendor 14122 method 1 (WSC) selected
<3>WPS-CRED-RECEIVED
<3>WPS-SUCCESS
<3>P2P-GROUP-FORMATION-SUCCESS
<3>CTRL-EVENT-EAP-STATUS status='completion' parameter='failure'
<3>CTRL-EVENT-EAP-FAILURE EAP authentication failed
<3>CTRL-EVENT-DISCONNECTED bssid=ae:22:0b:48:c9:61 reason=3 locally_generated=1
<3>Trying to associate with ae:22:0b:48:c9:61 (SSID='DIRECT-Mw-Android_7326' freq=2417 MHz)
<3>Associated with ae:22:0b:48:c9:61
<3>WPA: Key negotiation completed with ae:22:0b:48:c9:61 [PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to ae:22:0b:48:c9:61 completed [id=0 id_str=]
<3>P2P-GROUP-STARTED p2p0 client ssid="DIRECT-Mw-Android_7326" freq=2417 psk=... go_dev_addr=ae:22:0b:48:49:61 [PERSISTENT]
...disconnect after a short while...
<3>CTRL-EVENT-BSS-REMOVED 0 20:4e:7f:92:63:d6
<3>CTRL-EVENT-DISCONNECTED bssid=ae:22:0b:48:c9:61 reason=3
<3>CTRL-EVENT-DISCONNECTED bssid=ae:22:0b:48:c9:61 reason=3 locally_generated=1
<3>P2P-GROUP-REMOVED p2p0 client reason=GO_ENDING_SESSION
...Linux host disappears from P2P list...
^C
$ wget help