Connecting to WEP network via wpa_supplicant/dbus/python

James Rayner iphitus at iphitus.org
Tue Feb 17 04:17:46 EST 2009


I'm attempting to connect to a WEP network with wpa_supplicant via the
dbus interface with python.

wpa_supplication reports association status as complete, however it
does not seem to be connected correctly as dhcp cannot get an IP nor
does it work with static IP. I am however able to connect using a
regular wpa_supplicant.conf or iwconfig manually.

I'm fairly sure I'm passing the wep key incorrectly in the code as
incorrectly passing the key in quotes in the wpa_supplicant config
file gives _exactly_ the same result (same incorrect key in iwconfig
output and same behaviour). How should a hex WEP key be passed via
dbus?

Driver is ipw2100, rmmod and modprobed before each test, router is
wrt54gl. 2.6.28, wpa supplicant versions 0.5.11 and 0.6.7.

Outputs below, code at the bottom:

iwconfig output after wepcase.py connection
 - dhcp & manual IP fail
 - note the different key
ipw0      IEEE 802.11b  ESSID:"somenetwork"  Nickname:"ipw2100"
          Mode:Managed  Frequency:2.437 GHz  Access Point: 00:16:B6:46:3A:CA
          Bit Rate=11 Mb/s   Tx-Power:16 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:3031-3743-4633-4330-4545   Security mode:open
          Power Management:off
          Link Quality=88/100  Signal level=-70 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

iwconfig output after wpa_supplicant config file or manual iwconfig connection
 - dhcp & manual IP work
 - correct key shown
ipw0      IEEE 802.11b  ESSID:"somenetwork"  Nickname:"ipw2100"
          Mode:Managed  Frequency:2.437 GHz  Access Point: 00:16:B6:46:3A:CA
          Bit Rate=11 Mb/s   Tx-Power:16 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:017C-F3C0-EE   Security mode:open
          Power Management:off
          Link Quality=89/100  Signal level=-69 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

dhcp:
    dhcpcd ipw0

manual ip:
    ip addr add dev eth0 192.168.1.23/24 brd +
    ip route add default via 192.168.1.1

iwlist scan:
          Cell 02 - Address: 00:16:B6:46:3A:CA
                    ESSID:"somenetwork"
                    Protocol:IEEE 802.11bg
                    Mode:Master
                    Frequency:2.437 GHz (Channel 6)
                    Encryption key:on
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 6 Mb/s; 9 Mb/s
                              11 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s; 36 Mb/s
                              48 Mb/s; 54 Mb/s
                    Quality:55  Signal level:0  Noise level:0
                    Extra: Last beacon: 180ms ago

config file:
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
	ssid="rayner"
	key_mgmt=NONE
	wep_key0=017CF3C0EE
	wep_tx_keyidx=1
	group=WEP40
}


Code:
from time import sleep
import dbus
from os import system

# dbus constants.
WPAS_DBUS_SERVICE = "fi.epitest.hostap.WPASupplicant"
WPAS_DBUS_INTERFACE = "fi.epitest.hostap.WPASupplicant"
WPAS_DBUS_OPATH = "/fi/epitest/hostap/WPASupplicant"

WPAS_DBUS_INTERFACES_INTERFACE = "fi.epitest.hostap.WPASupplicant.Interface"
WPAS_DBUS_INTERFACES_OPATH = "/fi/epitest/hostap/WPASupplicant/Interfaces"
WPAS_DBUS_BSSID_INTERFACE = "fi.epitest.hostap.WPASupplicant.BSSID"
WPAS_DBUS_NETWORKS_INTERFACE = "fi.epitest.hostap.WPASupplicant.Network"

# Configuration
profile={"INTERFACE":"ipw0", "KEY":"017CF3C0EE", "ESSID":"somenetwork" }

# Start wpa_supplicant
system("wpa_supplicant -ud -P/var/run/wpa_supplicant.pid &")

# Connect to wpa_supplicant
bus = dbus.SystemBus()
wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_OPATH)
wpas = dbus.Interface(wpas_obj, WPAS_DBUS_INTERFACE)

# Add/Get interface path
try:
    path = wpas.getInterface(profile["INTERFACE"])
except dbus.exceptions.DBusException:
    path = wpas.addInterface(profile["INTERFACE"],
{"driver":dbus.String("wext",variant_level=1)})

# Get interface object
if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
iface = dbus.Interface(if_obj, WPAS_DBUS_INTERFACES_INTERFACE);

# Add network
path = iface.addNetwork()
net_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
rnet = dbus.Interface(net_obj, WPAS_DBUS_NETWORKS_INTERFACE)
iface.selectNetwork(rnet)

# This works for a WPA network
# opts = dbus.Dictionary({"ssid": dbus.ByteArray(profile['ESSID']),
"psk": dbus.String(profile['KEY'])}, signature="sv")

# This doesnt work for WEP networks
# For all except ssid, it makes no difference whether the type is
explicit or left to dbus-python
opts = dbus.Dictionary({"ssid": dbus.ByteArray(profile['ESSID']),
                        "wep_key0": dbus.ByteArray(profile['KEY']), #
Both String and ByteArray have the same result
                        "wep_tx_keyidx": dbus.Int32(0), # 1 or 0 make
no difference
                        "key_mgmt":dbus.String("NONE"),
                        # "group":"WEP40",             # makes no difference
                        }, signature="sv")

rnet.set(opts)

# Check every second for 15, then give up.
for n in range(15):
    sleep(1)
    if iface.state() == "COMPLETED":
        print "completed!"
        break
    elif n==14:
        print "fail" + iface.state()
        system("pkill wpa_supplicant")


More information about the HostAP mailing list