From: Avraham Stern <avraham.stern@xxxxxxxxx> When an AP interface it created, it is also setup and subscribes for management frames etc. However, when the interface is added by wpa_supplicant, setting up for AP operations is redundant because it will be done by wpa_supplicant on wpa_drv_init() when setting the interface mode to AP. In addition, it may cause wpa_supplicant to fail initializing the interface as it will try to subscribe for management frames on this interface but the interface is already registered. Change this, so when adding an AP interface, make setting up the AP optional, and use it only when the interface is added by hostapd but not when it is added by wpa_supplicant. Signed-off-by: Avraham Stern <avraham.stern@xxxxxxxxx> --- src/ap/ap_drv_ops.c | 2 +- src/drivers/driver.h | 3 ++- src/drivers/driver_nl80211.c | 5 +++-- wpa_supplicant/driver_i.h | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index 656f0a7..b390450 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -468,7 +468,7 @@ int hostapd_if_add(struct hostapd_data *hapd, enum wpa_driver_if_type type, return -1; return hapd->driver->if_add(hapd->drv_priv, type, ifname, addr, bss_ctx, drv_priv, force_ifname, if_addr, - bridge, use_existing); + bridge, use_existing, 1); } diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 09c4fa1..7d7e503 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -2407,12 +2407,13 @@ struct wpa_driver_ops { * change interface address) * @bridge: Bridge interface to use or %NULL if no bridge configured * @use_existing: Whether to allow existing interface to be used + * @setup_ap: Whether to setup AP for %WPA_IF_AP_BSS interfaces * Returns: 0 on success, -1 on failure */ int (*if_add)(void *priv, enum wpa_driver_if_type type, const char *ifname, const u8 *addr, void *bss_ctx, void **drv_priv, char *force_ifname, u8 *if_addr, - const char *bridge, int use_existing); + const char *bridge, int use_existing, int setup_ap); /** * if_remove - Remove a virtual interface diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index e83a3df..43dd0b1 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -5903,7 +5903,8 @@ static int wpa_driver_nl80211_if_add(void *priv, enum wpa_driver_if_type type, const char *ifname, const u8 *addr, void *bss_ctx, void **drv_priv, char *force_ifname, u8 *if_addr, - const char *bridge, int use_existing) + const char *bridge, int use_existing, + int setup_ap) { enum nl80211_iftype nlmode; struct i802_bss *bss = priv; @@ -5987,7 +5988,7 @@ static int wpa_driver_nl80211_if_add(void *priv, enum wpa_driver_if_type type, os_memcpy(if_addr, new_addr, ETH_ALEN); } - if (type == WPA_IF_AP_BSS) { + if (type == WPA_IF_AP_BSS && setup_ap) { struct i802_bss *new_bss = os_zalloc(sizeof(*new_bss)); if (new_bss == NULL) { if (added) diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h index f325154..3c2d80b 100644 --- a/wpa_supplicant/driver_i.h +++ b/wpa_supplicant/driver_i.h @@ -401,7 +401,7 @@ static inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s, if (wpa_s->driver->if_add) return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname, addr, bss_ctx, NULL, force_ifname, - if_addr, bridge, 0); + if_addr, bridge, 0, 0); return -1; } -- 1.9.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap