[PATCH] hostapd: nl80211 retry creating a interface if it fails the first time.

Karl Hiramoto karl at hiramoto.org
Fri May 15 06:36:08 EDT 2009


If hostapd segfaults, or is killed with -9, or the interface already exists, when the interface is created, it will fail.

A normal case with hostapd runing:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:01:02:03:04:05 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 8a:cb:b3:76:b0:5d brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 100
    link/ether d6:07:19:ee:b5:8d brd ff:ff:ff:ff:ff:ff
5: wmaster0: <UP,LOWER_UP> mtu 0 qdisc pfifo_fast qlen 1000
    link/ieee802.11 00:0e:8e:15:6e:0b brd 00:00:00:00:00:00
7: wlan0_0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:13:01:01:08:0a brd ff:ff:ff:ff:ff:ff
9: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 00:13:01:01:08:0a brd ff:ff:ff:ff:ff:ff
11: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 00:01:02:03:04:05 brd ff:ff:ff:ff:ff:ff
14: mon.wlan0_0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/[803] 00:0e:8e:15:6e:0b brd ff:ff:ff:ff:ff:ff
15: wlan0_1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:13:01:01:08:0b brd ff:ff:ff:ff:ff:ff

Then rudely kill hostapd.

Mon interface still exists, as well as second ap created by hostapd

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:01:02:03:04:05 brd ff:ff:ff:ff:ff:ff
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 100
    link/ether 8a:cb:b3:76:b0:5d brd ff:ff:ff:ff:ff:ff
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop qlen 100
    link/ether d6:07:19:ee:b5:8d brd ff:ff:ff:ff:ff:ff
5: wmaster0: <UP,LOWER_UP> mtu 0 qdisc pfifo_fast qlen 1000
    link/ieee802.11 00:0e:8e:15:6e:0b brd 00:00:00:00:00:00
7: wlan0_0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:13:01:01:08:0a brd ff:ff:ff:ff:ff:ff
9: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 00:13:01:01:08:0a brd ff:ff:ff:ff:ff:ff
11: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    link/ether 00:01:02:03:04:05 brd ff:ff:ff:ff:ff:ff
14: mon.wlan0_0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/[803] 00:0e:8e:15:6e:0b brd ff:ff:ff:ff:ff:ff
15: wlan0_1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:13:01:01:08:0b brd ff:ff:ff:ff:ff:ff

Hostapd will fail on startup.

Configuration file: /tmp/hostapd/hostapd.conf
Failed to create interface mon.wlan0_0.
Using interface wlan0_0 with hwaddr 00:13:01:01:08:0a and ssid 'IG_0405_LAN'
Failed to set beacon head/tail or DTIM period
Failed to create interface wlan0_1.

This patch solves this issue.

Signed-off-by: Karl Hiramoto <karl at hiramoto.org>
---
 src/drivers/driver_nl80211.c |   23 ++++++++++++++++++++++-
 1 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 79c7889..6e5f48e 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -2468,7 +2468,7 @@ static void nl80211_remove_iface(struct wpa_driver_nl80211_data *drv,
 }
 
 
-static int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
+static int nl80211_create_iface_once(struct wpa_driver_nl80211_data *drv,
 				const char *ifname, enum nl80211_iftype iftype,
 				const u8 *addr)
 {
@@ -2529,6 +2529,27 @@ static int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
 
 	return ifidx;
 }
+static int nl80211_create_iface(struct wpa_driver_nl80211_data *drv,
+				const char *ifname, enum nl80211_iftype iftype,
+				const u8 *addr)
+{
+	int ret;
+
+	ret = nl80211_create_iface_once(drv, ifname, iftype, addr);
+
+	/*if error occured and iterface already exists */
+	if (ret < 0 && if_nametoindex(ifname)) {
+		wpa_printf(MSG_INFO, "Retrying to create %s.", ifname);
+
+		/*remove iface that was already there. */
+		nl80211_remove_iface(drv, if_nametoindex(ifname));
+
+		/* retry to create iface*/
+		ret = nl80211_create_iface_once(drv, ifname, iftype, addr);
+	}
+
+	return ret;
+}
 
 #endif /* CONFIG_AP || HOSTAPD */
 
-- 
1.6.0.6



More information about the HostAP mailing list