WLAN – Troubleshooting wpa_supplicant Issues

wlan

i have been fiddling with wpa supplicant for days now and i've finally come to the point where i can't find any new leads on google. so here is the problem: i just installed a new tp-link tl-wn881nd pci-e wifi card on my desktop pc running debian wheezy. wlan0 claims to be connected (ish? see below) to the access point, ifconfig reports the correct static ip address i have assigned it, however i cannot ping the access point and syslog says that there is an error with the handshake.

firstly, i have read that network-manager can mess with things. i'm fairly sure this is not a problem for me:

$ which NetworkManager
##### blank #####
$ dpkg -l | grep -i network-manager
rc network-manager           0.9.4.0-10    amd-64    network management framework (daemon and userspace tools)
ii network-manager-openvpn   0.9.4.0-1     amd-64    network management framework (OpenVPN plugin core)

my computer specs are:

$ uname -a
Linux mypc 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux
$ sudo dmidecode | grep -iA3 '^system information'
System Information
    Manufacturer: Dell Inc.                
    Product Name: OptiPlex 745                 
    Version: Not Specified

and the wifi card specs are:

$ lspci | grep -i wireless
02:00.0 Network controller: Atheros Communications Inc. AR9287 Wireless Network Adapter (PCI-Express) (rev 01)

i have made sure the wifi card is active:

$ sudo ip link set wlan0 up
$ sudo ip link show wlan0
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisk mq state DORMANT mode DORMANT qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

and the card is able to find my ssid:

$ sudo iw wlan0 scan
BSS xx:xx:xx:xx:xx:xx (on wlan0) -- associated
    TSF: 2639667559 ysec (0d, 00:43:59)
    freq:2412
    beacon interval: 100
    capability: ESS Privacy ShortSlotTime (0x0411)
    signal: -56.00 dBm
    last seen: 692 ms ago
    Information elements from Probe Response frame:
    SSID: aphanumeric_with_underscores
    Supported rates: 1.0* 2.0* 5.5* 11.0* 9.0 18.0 36.0 54.0
    DS Parameter set: channel 1
    ERP: Use_Protection Barker_Preamble_Mode
    Extended supported rates: 6.0 12.0 24.0 48.0
    HT capabilities:
        Capabilities: 0x106e
            HT20/HT40
            SM Power Save disabled
            RX HT20 SGI
            RX HT40 SGI
            No RX STBC
            Max AMSDU length: 3839 bytes
            DSSS/CCK HT40
        Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
        Minimum RX AMPDU time spacing: 4 usec (0x05)
        HT RX MCS rate indexes supported: 0-7, 32
        HT TX MCS rate indexes are undefined
    HT operation:
        * primary channel: 1
        * secondary channel offset: no secondary
        * STA channel width 20MHz
        * RIFS: 0
        * HT protection: non-HT mixed
        * non-GF present: 1
        * OBSS non-GF present: 0
        * dual beacon: 0
        * dual CTS protection: 0
        * STBC beacon: 0
        * L-SIG TXOP Prot: 0
        * PCO active: 0
        * PCO phase: 0
    RSN:* Version: 1
        * Group cipher: CCMP
        * Pairwise ciphers: CCMP
        * Authentication suites: PSK
        * Capabilities: (0x0000)
    WMM:* Parameter version 1
        * BE: CW 15-1023, AIFSN 3
        * BK: CW 15-1023, AIFSN 7
        * VI: CW 7-15, AIFSN 2, TXOP 3008 usec
        * VO: CW 3-7, AIFSN 2, TXOP 1504 usec
    Extended capabilities: HT Information Exchange Supported
    Country: AL Environment: Indoor/Outdoor
        Channels [1 - 13] @ 15 dBm

i read somewhere that you can put the wpa_supplicant options directly in /etc/network/interfaces, so here is mine:

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

# don't use `auto wlan0` since this will infinitely try to connect at
# boot time, and i will have to remove the hard drive, mount it on
# another pc and remove `auto wlan0` from this file just to get a
# command prompt again!
iface wlan0 inet static
    wpa-ssid "aphanumeric_with_underscores"
    wpa-psk "my wpa2 password"
    wpa-ap-scan 1
    wpa-proto WPA2
    wpa-pairwise CCMP
    wpa-group CCMP
    wpa-key-mgmt WPA-PSK
    address 192.168.1.50
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 8.8.4.4

and note that there is currently no wpa_supplicant.conf file:

$ ls /etc/wpa_supplicant.conf
ls: cannot access /etc/wpa_supplicant.conf: No such file or directory
$ ls /etc/wpa_supplicant/*
action_wpa.sh  functions.sh  ifupdown.sh    

now if restart the wlan0 interface:

$ sudo ifdown wlan0
$ sudo ifup wlan0

the ip address has been correctly assigned:

$ ifconfig
lo       ...

wlan0    Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
         inet addr 192.168.1.50  Bcast:192.168.1.255  Mask:255.255.255.0
         inet6 addr: fe80::16cc:20ff:feea:4578/64 Scope:Link
         UP BROADCAST MULTICAST  NTU:1500  Metric:1
         RX packets:3075 errors:0 dropped:0 overruns:0 frame:0
         TX packets:4028 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:347475 (339.3KiB)  TX bytes:586219 (572.4KiB)

but here's the problem: the wlan0 interface appears to be up, but i can't reach the internet and i can't even ping the access point:

$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
From 192.168.1.50 icmp_seq=2 Destination Host Unreachable
From 192.168.1.50 icmp_seq=3 Destination Host Unreachable
^C
--- 192.168.1.1 ping statistics ---
3 packets transmitted, 0 received, +2 errors, 100% packet loss, time 2015ms

and when i look in /var/log/syslog i see some nasty looking errors:

Mar 18 01:23:11 mypc kernel: [  148.242137] wlan0: authenticate with xx.xx.xx.xx.xx.xx (try 1)
Mar 18 01:23:11 mypc kernel: [  148.244009] wlan0: authenticated
Mar 18 01:23:11 mypc kernel: [  148.265967] wlan0: associate with xx.xx.xx.xx.xx.xx (try 1)
Mar 18 01:23:11 mypc kernel: [  148.287770] wlan0: RX AssocResp from xx.xx.xx.xx.xx.xx (capab=0x411 status=0 aid=1)
Mar 18 01:23:11 mypc kernel: [  148.287774] wlan0: associated
Mar 18 01:23:11 mypc kernel: [  148.287774] wlan0: associated
Mar 18 01:23:11 mypc wpa_supplicant[4473]: wlan0: Associated with xx.xx.xx.xx.xx.xx
Mar 18 01:23:11 mypc kernel: [  148.297421] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
Mar 18 01:23:11 mypc kernel: [  148.297651] cfg80211: Calling CRDA for country AL
Mar 18 01:23:11 mypc kernel: [  148.303008] cfg80211: Regulatory domain changed to country: AL
Mar 18 01:23:11 mypc kernel: [  148.303013] cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
Mar 18 01:23:11 mypc kernel: [  148.303018] cfg80211: (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
Mar 18 01:23:11 mypc kernel: [  148.303022] cfg80211: (5170000 KHz - 5250000 KHz @ 80000 KHz), (N/A, 2000 mBm)
Mar 18 01:23:11 mypc kernel: [  148.303026] cfg80211: (5250000 KHz - 5330000 KHz @ 80000 KHz), (N/A, 2000 mBm)
Mar 18 01:23:11 mypc kernel: [  148.303029] cfg80211: (5490000 KHz - 5710000 KHz @ 80000 KHz), (N/A, 2700 mBm)
Mar 18 01:23:19 mypc kernel: [  155.819739] wlan0: deauthenticated from xx:xx:xx:xx:xx:xx (Reason: 15)
Mar 18 01:23:19 mypc wpa_supplicant[4473]: wlan0: WPA: 4-Way Handshake failed - pre-shared key may be incorrect
Mar 18 01:23:19 mypc wpa_supplicant[4473]: wlan0: CTRL-EVENT-DISCONNECTED bssid=xx:xx:xx:xx:xx:xx reason=15

does anybody know how i can fix this and ping my access point via wlan0?


modification 1: trying dhcp instead of a static ip

i changed /etc/network/interfaces like so:

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

# don't use `auto wlan0` since this will infinitely try to connect at
# boot time, and i will have to remove the hard drive, mount it on
# another pc and remove `auto wlan0` from this file just to get a
# command prompt again!
iface wlan0 inet dhcp
    wpa-ssid "aphanumeric_with_underscores"
    wpa-psk "my wpa2 password"
    wpa-ap-scan 1
    wpa-proto WPA2
    wpa-pairwise CCMP
    wpa-group CCMP
    wpa-key-mgmt WPA-PSK

(note that wpa_supplicant.conf still does not exist in modification 1), and now i get some new errors on the commandline when i bring the interface up:

$ sudo ifup wlan0
Operation failed.
Failed to bring up wlan0

and syslog shows the same fail messages over and over again as before:

Mar 18 08:59:01 mypc kernel: [ 2493.163777] ADDRCONF(NETDEV_UP): wlan0: link is not ready
Mar 18 08:59:02 mypc wpa_supplicant[6151]: wlan0: SME: Trying to authenticate with xx:xx:xx:xx:xx:xx (SSID='alphanumeric_with_underscores' freq=2412 MHz)
Mar 18 08:59:02 mypc kernel: [ 2493.974111] wlan0: authenticate with xx:xx:xx:xx:xx:xx (try 1)
Mar 18 08:59:02 mypc kernel: [ 2493.976083] wlan0: authenticated         
Mar 18 08:59:02 mypc wpa_supplicant[6151]: wlan0: Trying to associate with xx:xx:xx:xx:xx:xx (SSID='aphanumeric_with_underscores' freq=2412 MHz)
Mar 18 08:59:02 mypc kernel: [ 2493.998016] wlan0: associate with xx:xx:xx:xx:xx:xx (try 1)
Mar 18 08:59:02 mypc kernel: [ 2494.019518] wlan0: RX ReassocResp from xx:xx:xx:xx:xx:xx (capab=0x411 status=0 aid=2)
Mar 18 08:59:02 mypc kernel: [ 2494.019523] wlan0: associated            
Mar 18 08:59:02 mypc wpa_supplicant[6151]: wlan0: Associated with xx:xx:xx:xx:xx:xx
Mar 18 08:59:02 mypc kernel: [ 2494.028721] ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
Mar 18 08:59:02 mypc kernel: [ 2494.028873] cfg80211: Calling CRDA for country: AL
Mar 18 08:59:02 mypc kernel: [ 2494.033830] cfg80211: Regulatory domain changed to country: AL
Mar 18 08:59:02 mypc kernel: [ 2494.033835] cfg80211:     (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
Mar 18 08:59:02 mypc kernel: [ 2494.033839] cfg80211:     (2402000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
Mar 18 08:59:02 mypc kernel: [ 2494.033843] cfg80211:     (5170000 KHz - 5250000 KHz @ 80000 KHz), (N/A, 2000 mBm)
Mar 18 08:59:02 mypc kernel: [ 2494.033846] cfg80211:     (5250000 KHz - 5330000 KHz @ 80000 KHz), (N/A, 2000 mBm)
Mar 18 08:59:02 mypc kernel: [ 2494.033849] cfg80211:     (5490000 KHz - 5710000 KHz @ 80000 KHz), (N/A, 2700 mBm)
Mar 18 08:59:09 mypc kernel: [ 2501.499716] wlan0: deauthenticated from xx:xx:xx:xx:xx:xx (Reason: 15)
Mar 18 08:59:09 mypc wpa_supplicant[6151]: wlan0: WPA: 4-Way Handshake failed - pre-shared key may be incorrect
Mar 18 08:59:09 mypc wpa_supplicant[6151]: wlan0: CTRL-EVENT-DISCONNECTED bssid=xx:xx:xx:xx:xx:xx reason=15
Mar 18 08:59:09 mypc kernel: [ 2501.536289] cfg80211: Calling CRDA to update world regulatory domain
Mar 18 08:59:09 mypc kernel: [ 2501.541764] cfg80211: World regulatory domain updated:
Mar 18 08:59:09 mypc kernel: [ 2501.541770] cfg80211:     (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
Mar 18 08:59:09 mypc kernel: [ 2501.541775] cfg80211:     (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm)
Mar 18 08:59:09 mypc kernel: [ 2501.541779] cfg80211:     (2457000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
Mar 18 08:59:09 mypc kernel: [ 2501.541782] cfg80211:     (2474000 KHz - 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm)
Mar 18 08:59:09 mypc kernel: [ 2501.541786] cfg80211:     (5170000 KHz - 5250000 KHz @ 80000 KHz), (N/A, 2000 mBm)
Mar 18 08:59:09 mypc kernel: [ 2501.541790] cfg80211:     (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm)
Mar 18 08:59:09 mypc kernel: [ 2501.541794] cfg80211:     (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm)
Mar 18 08:59:10 mypc wpa_supplicant[6151]: wlan0: SME: Trying to authenticate with xx:xx:xx:xx:xx:xx (SSID='aphanumeric_with_underscores' freq=2412 MHz)
Mar 18 08:59:10 mypc kernel: [ 2502.434112] wlan0: authenticate with xx:xx:xx:xx:xx:xx (try 1)
Mar 18 08:59:10 mypc kernel: [ 2502.436071] wlan0: authenticated
etc

and note that eth0 works fine with dhcp, so there is no issue with dhcp itself.


modification 2: try using the psk hash from wpa_passphrase

$ wpa_passphrase myssid mypassword
network={
    ssid="myssid"
    #psk="mypassword"
    psk=xxxxxxxxxxxx...
}

use this new psk in /etc/network/interfaces:

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback

# don't use `auto wlan0` since this will infinitely try to connect at
# boot time, and i will have to remove the hard drive, mount it on
# another pc and remove `auto wlan0` from this file just to get a
# command prompt again!
iface wlan0 inet dhcp
    wpa-ssid "aphanumeric_with_underscores"
    wpa-psk xxxxxxxxxxxxxxxx
    wpa-ap-scan 1
    wpa-proto WPA2
    wpa-pairwise CCMP
    wpa-group CCMP
    wpa-key-mgmt WPA-PSK

try again:

$ sudo iplink set wlan0 down
$ sudo iplink set wlan0 up
$ sudo ifup wlan0
cat: /var/run/wpa_supplicant.wlan0.pid: No such file or directory
Operation failed.
Failed to bring up wlan0.

hmm interesting error that time. investigate:

$ sudo su
# cd /var/run/wpa_supplicant/
# ls -l
total 0
srwxrwx--- 1 root root 0 Mar 18 09:26 wlan0
# cat wlan0 
cat: wlan0: No such device or address

/var/log/syslog is still showing the same errors though.


modification 3: set a very basic ssid and password

i set the ssid to abc and password to abcdefgh:

$ wpa_passphrase abc abcdefgh
network={
    ssid="abc"
    #psk="abcdefgh"
    psk=ba89407e92b8efec11c227e3cce9f25c8dcc4b3651fe2be02d91d9ebda96e913
}

but the results are the same as for modification 1 and modification 2 no matter which of these pre-shared keys i put in /etc/network/interfaces

$ sudo ip link set wlan0 down                                                   
$ sudo ip link set wlan0 up                                                     
$ sudo ip link show wlan0                                                       
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state DORMANT mode DEFAULT qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff                          
$ sudo ifdown wlan0                                                             
ifdown: interface wlan0 not configured                                          
$ sudo rm /var/run/wpa_supplicant/wlan0                                         
$ sudo ifup wlan0                                                               
wpa_supplicant: ctrl_interface socket not found at /var/run/wpa_supplicant/wlan0
run-parts: /etc/network/if-pre-up.d/wpasupplicant exited with return code 1     
Operation failed.                                                               
Failed to bring up wlan0.

modification 4: use wpa_supplicant in debug mode on the commandline

remove all wpa settings from /etc/network/interfaces:

$ cat /etc/network/interfaces
auto lo
iface lo inet loopback
iface wlan0 inet dhcp

now create the wpa_supplicant.conf file:

$ sudo sh -c 'wpa_passphrase abc abcdefgh > /etc/wpa_supplicant/wpa_supplicant.conf'

edit the file to contain the following information:

ap_scan=1
ctrl_interface=DIR=/var/run/wpa_supplicant
ctrl_interface_group=0
network={
    proto=WPA2
    pairwise=CCMP
    group=CCMP
    key_mgmt=WPA-PSK
    ssid="abc"
    #psk="abcdefgh"
    psk=ba89407e92b8efec11c227e3cce9f25c8dcc4b3651fe2be02d91d9ebda96e913
}

run wpa_supplicant directly:

$ sudo ip link show wlan0
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
$ sudo ip link set wlan0 up
$ sudo wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
wlan0: Trying to associate with xx:xx:xx:xx:xx:xx (SSID='abc' freq=2412 MHz)
wlan0: Associated with 00:00:00:00:00:00
wlan0: CTRL-EVENT-DISCONNECTED bssid=xx:xx:xx:xx:xx:xx reason=0
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
wlan0: Trying to associate with xx:xx:xx:xx:xx:xx (SSID='abc' freq=2412 MHz)
wlan0: Associated with 00:00:00:00:00:00
wlan0: CTRL-EVENT-DISCONNECTED bssid=xx:xx:xx:xx:xx:xx reason=0
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWSCAN]: Device or resource busy
wlan0: Failed to initiate AP scan
wlan0: Trying to associate with xx:xx:xx:xx:xx:xx (SSID='abc' freq=2412 MHz)
wlan0: Associated with 00:00:00:00:00:00
wlan0: CTRL-EVENT-DISCONNECTED bssid=xx:xx:xx:xx:xx:xx reason=0
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
^Cwlan0: CTRL-EVENT-TERMINATING - signal 2 received

and again, with a bit more debug verbosity:

$ sudo wpa_supplicant -d -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -f /tmp/wpa_supplicant.tl-wn881nd.errors

see the output here.

from ioctl[SIOCSIWENCODEEXT]: Invalid argument it looks like there may be an incompatibility between the wifi card and the kernel? if so then how can i diagnose and fix this?

Best Answer

I'd try using wpa_supplicant according to the UbuntuUsers wiki. That means: Put all your wpa-stuff into /etc/wpa_supplicant/wpa_supplicant.conf and modify /etc/network/interfaces to just contain

... auto wlan0 iface wlan0 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf ...

Further start wpa_supplicant manually (wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -d). If there's a problem with wpa_supplicant, it should be displayed.


edit: I further agree with @casey that there might be some error in the key

Related Question