2018-05-30
14:12:46
於深圳南山科技園
最近有個項目,客戶需要通過手機app通過機器wifi熱點連接,從而實現對機器的設置及視頻的實時預覽等各種功能。這兩天一直在搞rtl8188eu的wifi熱點,驅動服務都搭建好了,但是出現設置密碼后無法連接,折騰了好幾天也沒找到原因及解決辦法,
硬件平台:全志T3 + rtl8188euwifi模塊(usb連接)
系統:linux kernel-3.10
ap啟動腳本:ap-start.sh
hostapd版本:0.8x
DHCp版本:4.1.1-P1
ap-start.sh
ifconfig wlan0 192.168.1.24 netmask 255.255.255.0 sleep 1 hostapd /etc/hostapd.conf -B touch /var/lib/dhcp/dhcpd.leases dhcpd
/etc/hostapd.conf
##### hostapd configuration file ############################################## interface=wlan0 ctrl_interface=/var/run/hostapd ssid=carwifi channel=9 wpa=1 wpa_passphrase=88888888 # Device Name # User-friendly description of device; up to 32 octets encoded in UTF-8 device_name=RTL8192CU # Primary Device Type # Used format: <categ>-<OUI>-<subcateg> # categ = Category as an integer value # OUI = OUI and type octet as a 4-octet hex-encoded value; 0050F204 for # default WPS OUI # subcateg = OUI-specific Sub Category as an integer value # Examples: # 1-0050F204-1 (Computer / PC) # 1-0050F204-2 (Computer / Server) # 5-0050F204-1 (Storage / NAS) # 6-0050F204-1 (Network Infrastructure / AP) device_type=6-0050F204-1 ##### default configuration ####################################### driver=rtl871xdrv beacon_int=100 hw_mode=g ieee80211n=1 wme_enabled=1 wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP rsn_pairwise=TKIP CCMP max_num_sta=8 wpa_group_rekey=86400
/etc/dhcpd.conf
# # Sample configuration file # default-lease-time 600; max-lease-time 7200; # If this DHCP server is the official DHCP server for the local # network, the authoritative directive should be uncommented. #authoritative; # Use this to send dhcp log messages to a different log file (you also # have to hack syslog.conf to complete the redirection). log-facility local7; # No service will be given on this subnet, but declaring it helps the # DHCP server to understand the network topology. subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.8 192.168.1.128; }
開機啟動log如下
[ 5.600133] insmod_host_driver [ 5.600133] [ 5.606765] [ehci0-controller]: sunxi_usb_enable_ehci [ 5.609585] RTL871X: module init start [ 5.609593] RTL871X: rtl8188eu driver version = v4.2.5_9909.20131204_beta [ 5.609597] RTL871X: build time: May 21 2018 17:49:00 [ 5.630092] [sunxi-ehci0]: probe, pdev->name: 1c14000.ehci0-controller, sunxi_ehci: 0xc0a7a474, 0x:f1c14000, irq_no:47 [ 5.642162] sunxi-ehci 1c14000.ehci0-controller: SW USB2.0 'Enhanced' Host Controller (EHCI) Driver [ 5.652338] sunxi-ehci 1c14000.ehci0-controller: new USB bus registered, assigned bus number 1 [ 5.662652] sunxi-ehci 1c14000.ehci0-controller: irq 71, io mem 0xce0e21c0 [ 5.690130] sunxi-ehci 1c14000.ehci0-controller: USB 0.0 started, EHCI 1.00 [ 5.697960] ehci_irq: highspeed device connect [ 5.697961] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002 [ 5.697969] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 5.697976] usb usb1: Product: SW USB2.0 'Enhanced' Host Controller (EHCI) Driver [ 5.697981] usb usb1: Manufacturer: Linux 3.10.65 ehci_hcd [ 5.697987] usb usb1: SerialNumber: sunxi-ehci [ 5.739687] usbcore: registered new interface driver rtl8188eu [ 5.740200] hub 1-0:1.0: USB hub found [ 5.740248] hub 1-0:1.0: 1 port detected [ 5.740903] [ohci0-controller]: sunxi_usb_enable_ohci [ 5.740914] [sunxi-ohci0]: probe, pdev->name: 1c14000.ohci0-controller, sunxi_ohci: 0xc0a79c94 [ 5.740988] sunxi-ohci 1c14000.ohci0-controller: SW USB2.0 'Open' Host Controller (OHCI) Driver [ 5.741031] sunxi-ohci 1c14000.ohci0-controller: new USB bus registered, assigned bus number 2 [ 5.741124] sunxi-ohci 1c14000.ohci0-controller: irq 72, io mem 0xce0e21c0 [ 5.797124] RTL871X: module init ret=0 [ 5.804269] usb usb2: New USB device found, idVendor=1d6b, idProduct=0001 [ 5.811983] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1 [ 5.820065] usb usb2: Product: SW USB2.0 'Open' Host Controller (OHCI) Driver [ 5.827902] usb usb2: Manufacturer: Linux 3.10.65 ohci_hcd [ 5.834168] usb usb2: SerialNumber: sunxi-ohci [ 5.841066] hub 2-0:1.0: USB hub found [ 5.845235] hub 2-0:1.0: 1 port detected [ 6.050213] usb 1-1: new high-speed USB device number 2 using sunxi-ehci [ 6.203434] usb 1-1: New USB device found, idVendor=0bda, idProduct=8179 [ 6.210984] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 6.218838] usb 1-1: Product: 802.11n WLAN NIC [ 6.223950] usb 1-1: Manufacturer: Realtek [ 6.243032] bFWReady == _FALSE call reset 8051... [ 6.337470] RTL871X: rtw_ndev_init(wlan0) [ 6.353064] RTL871X: rtw_ndev_init(wlan1) [ 8.221550] ==> rtl8188e_iol_efuse_patch [ 8.677931] IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready Configuration file: /etc/hostapd.conf drv->ifindex=6 l2_sock_recv==l2_sock_xmit=0x0xb17648 +rtl871x_sta_deauth_ops, ff:ff:ff:ff:ff:ff is deauth, reason=2 rtl871x_set_key_ops rtl871x_set_key_ops rtl871x_set_key_ops rtl871x_set_key_ops Using interface wlan0 with hwaddr 14:6b:9c:08:f7:df and ssid 'carwifi' rtl871x_set_wps_assoc_resp_ie rtl871x_set_wps_beacon_ie rtl871x_set_wps_probe_resp_ie rtl871x_set_beacon_ops [ 10.490315] gpu cooling callback set freq limit 384 [ 10.894119] RTL871X: assoc success rtl871x_set_hidden_ssid ignore_b[ 10.898742] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready roadcast_ssid:0, carwifi,7 rtl871x_set_acl Internet Systems Consortium DHCP Server 4.1.1-P1 Copyright 2004-2010 Internet Systems Consortium. All rights reserved. For info, please visit https://www.isc.org/software/dhcp/ Wrote 0 leases to leases file. Listening on LPF/wlan0/14:6b:9c:08:f7:df/192.168.1.0/24 Sending on LPF/wlan0/14:6b:9c:08:f7:df/192.168.1.0/24 Sending on Socket/fallback/fallback-net
問題現象:
wifi熱點已經可以正常掃描識別,在設置wpa=0(不采用wpa加密,無需密碼可以直接連接)時候,設備可以正常連接到該熱點。
/var/run/hostapd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page. # This lease file was written by isc-dhcp-4.1.1-P1 lease 192.168.1.8 { starts 4 1970/01/01 04:30:12; ends 4 1970/01/01 04:40:12; cltt 4 1970/01/01 04:30:12; binding state active; next binding state free; hardware ethernet 2c:f0:a2:98:01:8d; uid "\001,\360\242\230\001\215"; client-hostname "iPhone-9S"; }
但是如果設置成1或者2、3設備都無法連接到改熱點,一直彈出密碼錯誤。同事內核輸出log
[ 59.865837] RTL871X: ap recv disassoc reason code(8) sta:2c:f0:a2:98:01:8d [ 59.876976] RTL871X: set pairwise key to hw: alg:0(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:0
根據log中提供的信息ap recv disassoc reason code(8)去網上搜索了一下提供的解釋如下。
https://blog.michaelfmcnamara.com/2007/11/80211-dissassociation-codes/
Value |
802.11 or Symbol/WPA Reason Code |
Description |
0 |
REASON_CODE_80211_SUCCESS |
Reserved internally to indicate success |
1. |
REASON_CODE_80211_UNSPECIFIED_ERROR |
Unspecified Reason |
3. |
DISASSOCIATION_REASON_CODE_STATION_LEAVING_ESS |
Deauthenticated because sending station has left or is leaving IBSS or ESS |
4. |
DISASSOCIATION_REASON_CODE_INACTIVITY |
Disassociated due to inactivity |
5. |
DISASSOCIATION_REASON_CODE_STATION_LIMIT_EXCEEDED |
Disassociated because AP is unable to handle all currently associated stations |
6. |
DISASSOCIATION_REASON_CODE_CLASS_2_PKT_FROM_NON_AUTH |
Class 2 frame received from non-authenticated station |
7. |
DISASSOCIATION_REASON_CODE_CLASS_3_PKT_FROM_NON_ASSOC |
Class 3 frame received from non-associated station |
8. |
DISASSOCIATION_REASON_CODE_STATION_LEAVING_BSS |
Disassociated because sending station has left or is leaving BSS |
9. |
DISASSOCIATION_REASON_CODE_STATION_NOT_AUTHENTICATED |
Station requesting re-association is not authenticated with responding station |
13. |
DISASSOCIATION_REASON_CODE_INVALID_INFORMATION_ELEMENT |
Invalid Information Element |
14. |
DISASSOCIATION_REASON_CODE_MIC_FAILURE |
Michael MIC failure |
15. |
DISASSOCIATION_REASON_CODE_4WAY_HANDSHAKE_TIMEOUT |
4-Way Handshake timeout |
16. |
DISASSOCIATION_REASON_CODE_GROUP_KEY_UPDATE_TIMEOUT |
Group key update timeout |
17. |
DISASSOCIATION_REASON_CODE_4WAY_IE_DIFFERENCE |
Information element in 4-Way Handshake different from Re-associated request/Proberesponse/Beacon |
18. |
DISASSOCIATION_REASON_CODE_MULTICAST_CIPHER_INVALID |
Multicast Cipher is not valid |
19. |
DISASSOCIATION_REASON_CODE_UNICAST_CIPHER_INVALID |
Unicast Cipher is not valid |
20. |
DISASSOCIATION_REASON_CODE_AKMP_NOT_VALID |
AKMP is not valid |
21. |
DISASSOCIATION_REASON_CODE_UNSUPPORTED_RSNE_VERSION |
Unsupported RSN IE version |
22. |
DISASSOCIATION_REASON_CODE_INVALID_RSNE_CAPABILITIES |
Invalid RSN IE Capabilities |
23. |
DISASSOCIATION_REASON_CODE_8021X_AUTHENTICATION_FAILED |
IEEE 802.1X Authentication failed |
44. |
DISASSOCIATION_REASON_CODE_PSP_TX_PKT_BUFFER_EXCEEDED |
Symbol defined (non 802.11 standard) code. The Wireless Switch has exceeded it’s time limit in attempting to deliver buffered PSP frames to the Mobile Unit without receiving a single 802.11 PS Poll or NULL data frame. The Wireless Switch begins the timer when it sets the Mobile Unit’s bit in the TIM section of the 802.11 beacon frame for the BSS. The time limit is at least 15 seconds. The Mobile Unit is probably gone (or may be faulty). |
77. |
DISASSOCIATION_REASON_CODE_TRANSMIT_RETRIES_EXCEEDED |
Symbol defined (non 802.11 standard) codes. The Wireless Switch has exceeded it’s retry limit in attempting to deliver a 802.1x EAP message to the Mobile Unit without receiving a single 802.11 ACK. The retry limit varies according to traffic type but is at least 64 times. The Mobile Unit is either gone or has incorrect 802.1x EAP authentication settings. |
但是依然找不到原因和解決辦法,繼續研究中。
用安卓手機或者thinkpad連接,客戶端一直在轉圈圈無法連接,但是server輸出如下log,與iphone連接失敗的有所不同。
[73684.499271] RTL871X: ap recv deauth reason code(3) sta:20:5d:47:63:75:30 [73684.510355] RTL871X: set pairwise key to hw: alg:0(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:0 [73699.455878] RTL871X: ap recv deauth reason code(3) sta:20:5d:47:63:75:30 [73699.466855] RTL871X: set pairwise key to hw: alg:0(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:0 [73714.509250] RTL871X: ap recv deauth reason code(3) sta:20:5d:47:63:75:30 [73714.520095] RTL871X: set pairwise key to hw: alg:0(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:0 [73726.111798] RTL871X: ap recv deauth reason code(3) sta:20:5d:47:63:75:30 [73726.122729] RTL871X: set pairwise key to hw: alg:0(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:0 [73732.809624] RTL871X: ap recv deauth reason code(3) sta:20:5d:47:63:75:30 [73732.820605] RTL871X: set pairwise key to hw: alg:0(WEP40-1 WEP104-5 TKIP-2 AES-4) camid:0
根據log提示log跟蹤驅動源碼,看看有什么有用的信息。
ap recv disassoc reason code(8)
linux-3.10/drivers/net/wireless/rtl8188eu$ /core/rtw_mlme_ext.c
unsigned int OnDisassoc(_adapter *padapter, union recv_frame *precv_frame) { unsigned short reason; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u8 *pframe = precv_frame->u.hdr.rx_data; #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo= &(padapter->wdinfo); #endif //CONFIG_P2P //check A3 if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) return _SUCCESS; #ifdef CONFIG_P2P if ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) { _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey ); _set_timer( &pwdinfo->reset_ch_sitesurvey, 10 ); } #endif //CONFIG_P2P reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason); rtw_lock_rx_suspend_timeout(8000); #ifdef CONFIG_AP_MODE if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { _irqL irqL; struct sta_info *psta; struct sta_priv *pstapriv = &padapter->stapriv; //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); //rtw_free_stainfo(padapter, psta); //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); DBG_871X_LEVEL(_drv_always_, "ap recv disassoc reason code(%d) sta:%pM\n", reason, GetAddr2Ptr(pframe)); psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); if(psta) { u8 updated = _FALSE; _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); if(rtw_is_list_empty(&psta->asoc_list)==_FALSE) { rtw_list_delete(&psta->asoc_list); pstapriv->asoc_list_cnt--; updated = ap_free_sta(padapter, psta, _FALSE, reason); } _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); associated_clients_update(padapter, updated); } return _SUCCESS; } else #endif { DBG_871X_LEVEL(_drv_always_, "sta recv disassoc reason code(%d) sta:%pM\n", reason, GetAddr3Ptr(pframe)); receive_disconnect(padapter, GetAddr3Ptr(pframe), reason); } pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; return _SUCCESS; }
ap recv deauth reason code(3)
unsigned int OnDeAuth(_adapter *padapter, union recv_frame *precv_frame) { unsigned short reason; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); u8 *pframe = precv_frame->u.hdr.rx_data; #ifdef CONFIG_P2P struct wifidirect_info *pwdinfo= &(padapter->wdinfo); #endif //CONFIG_P2P //check A3 if (!(_rtw_memcmp(GetAddr3Ptr(pframe), get_my_bssid(&pmlmeinfo->network), ETH_ALEN))) return _SUCCESS; #ifdef CONFIG_P2P if ( pwdinfo->rx_invitereq_info.scan_op_ch_only ) { _cancel_timer_ex( &pwdinfo->reset_ch_sitesurvey ); _set_timer( &pwdinfo->reset_ch_sitesurvey, 10 ); } #endif //CONFIG_P2P reason = le16_to_cpu(*(unsigned short *)(pframe + WLAN_HDR_A3_LEN)); DBG_871X("%s Reason code(%d)\n", __FUNCTION__,reason); rtw_lock_rx_suspend_timeout(8000); #ifdef CONFIG_AP_MODE if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) { _irqL irqL; struct sta_info *psta; struct sta_priv *pstapriv = &padapter->stapriv; //_enter_critical_bh(&(pstapriv->sta_hash_lock), &irqL); //rtw_free_stainfo(padapter, psta); //_exit_critical_bh(&(pstapriv->sta_hash_lock), &irqL); DBG_871X_LEVEL(_drv_always_, "ap recv deauth reason code(%d) sta:%pM\n", reason, GetAddr2Ptr(pframe)); psta = rtw_get_stainfo(pstapriv, GetAddr2Ptr(pframe)); if(psta) { u8 updated = _FALSE; _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL); if(rtw_is_list_empty(&psta->asoc_list)==_FALSE) { rtw_list_delete(&psta->asoc_list); pstapriv->asoc_list_cnt--; updated = ap_free_sta(padapter, psta, _FALSE, reason); } _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL); associated_clients_update(padapter, updated); } return _SUCCESS; } else #endif { int ignore_received_deauth = 0; // Commented by Albert 20130604 // Before sending the auth frame to start the STA/GC mode connection with AP/GO, // we will send the deauth first. // However, the Win8.1 with BRCM Wi-Fi will send the deauth with reason code 6 to us after receieving our deauth. // Added the following code to avoid this case. if ( ( pmlmeinfo->state & WIFI_FW_AUTH_STATE ) || ( pmlmeinfo->state & WIFI_FW_ASSOC_STATE ) ) { if ( reason == WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA ) { ignore_received_deauth = 1; } else if (WLAN_REASON_PREV_AUTH_NOT_VALID == reason) { // TODO: 802.11r ignore_received_deauth = 1; } } DBG_871X_LEVEL(_drv_always_, "sta recv deauth reason code(%d) sta:%pM, ignore = %d\n", reason, GetAddr3Ptr(pframe), ignore_received_deauth); if ( 0 == ignore_received_deauth ) { receive_disconnect(padapter, GetAddr3Ptr(pframe) ,reason); } } pmlmepriv->LinkDetectInfo.bBusyTraffic = _FALSE; return _SUCCESS; }
現在一個reason code(3) 解釋是Deauthenticated because sending station has left or is leaving IBSS or ESS
reason code(8) 解釋是Disassociated because sending station has left or is leaving BSS
百度來百度去一個星期沒找到靠譜有用的信息,周末把apn訪問的弄好了,於是google了一下,果斷找到了同病相憐之人
https://github.com/lwfinger/rtl8723bu/issues/26
按照Mh6的說法首更換hostapd版本,重新編譯打包,然后修改hostapd.conf配置文件。
driver=rtl871xdrv
改為
driver=nl80211
(事實上之前更改過這個driver驗證但是因為舊版本的hostapd不支持這個驅動的加載,所以放棄了。)
重新啟動后貌似看到了新的希望,但是又出現了新的問題
random種子不夠
Using interface wlan0 with hwaddr 28:f3:66:8d:f8:07 and ssid 'carwifi' random: Only 11/20 bytes of strong random data available from /dev/random random: Not enough entropy pool available for secure operations WPA: Not enough entropy in random pool for secure operations - update keys later when the first station connects Internet Systems Consortium DHCP Server 4.1.1-P1 Copyright 2004-2010 Internet Systems Consortium. All rights reserved. For info, please visit https://www.isc.org/software/dhcp/ Wrote 0 leases to leases file. Listening on LPF/wlan0/28:f3:66:8d:f8:07/192.168.1.0/24 Sending on LPF/wlan0/28:f3:66:8d:f8:07/192.168.1.0/24 Sending on Socket/fallback/fallback-net
[root@t3_p3 ~]# cat /proc/sys/kernel/random/entropy_avail 129
這個數值太小了,參考網上的說法至少要大於1000才能滿足。
切換到 /dev/urandom
mv /dev/random /dev/random.orig
ln -s /dev/urandom /dev/random
But 解決了隨機數的問題,然並卵,wifi還是連不上,一樣報錯,無可救葯。。。
============================
更新hostapd.conf
##### hostapd configuration file ############################################## interface=wlan0 driver=nl80211 ctrl_interface=/var/run/hostapd channel=9 ieee80211n=1 hw_mode=g ignore_broadcast_ssid=0 wpa=2 rsn_pairwise=CCMP ssid=test_ap wpa_passphrase=12345678