Browse Source

hostapd: add ifname to the sta_set_flags callback

This fixes multi-BSS STA operations (e.g., setting AUTHORIZED flag) with
nl80211-based drivers.
Felix Fietkau 15 years ago
parent
commit
4c32757d22

+ 1 - 1
src/ap/ap_drv_ops.c

@@ -490,7 +490,7 @@ int hostapd_sta_set_flags(struct hostapd_data *hapd, u8 *addr,
 {
 	if (hapd->driver == NULL || hapd->driver->sta_set_flags == NULL)
 		return 0;
-	return hapd->driver->sta_set_flags(hapd->drv_priv, addr, total_flags,
+	return hapd->driver->sta_set_flags(hapd->conf->iface, hapd->drv_priv, addr, total_flags,
 					   flags_or, flags_and);
 }
 

+ 2 - 1
src/drivers/driver.h

@@ -1419,6 +1419,7 @@ struct wpa_driver_ops {
 
 	/**
 	 * sta_set_flags - Set station flags (AP only)
+	 * @ifname: Interface name (for multi-SSID/VLAN support)
 	 * @priv: Private driver interface data
 	 * @addr: Station address
 	 * @total_flags: Bitmap of all WPA_STA_* flags currently set
@@ -1426,7 +1427,7 @@ struct wpa_driver_ops {
 	 * @flags_and: Bitmap of WPA_STA_* flags to us as a mask
 	 * Returns: 0 on success, -1 on failure
 	 */
-	int (*sta_set_flags)(void *priv, const u8 *addr,
+	int (*sta_set_flags)(const char *ifname, void *priv, const u8 *addr,
 			     int total_flags, int flags_or, int flags_and);
 
 	/**

+ 2 - 2
src/drivers/driver_atheros.c

@@ -339,8 +339,8 @@ madwifi_set_sta_authorized(void *priv, const u8 *addr, int authorized)
 }
 
 static int
-madwifi_sta_set_flags(void *priv, const u8 *addr, int total_flags,
-		      int flags_or, int flags_and)
+madwifi_sta_set_flags(const char *ifname, void *priv, const u8 *addr,
+		      int total_flags, int flags_or, int flags_and)
 {
 	/* For now, only support setting Authorized flag */
 	if (flags_or & WPA_STA_AUTHORIZED)

+ 2 - 2
src/drivers/driver_bsd.c

@@ -468,8 +468,8 @@ bsd_set_ieee8021x(void *priv, struct wpa_bss_params *params)
 }
 
 static int
-bsd_set_sta_authorized(void *priv, const u8 *addr, int total_flags,
-		       int flags_or, int flags_and)
+bsd_set_sta_authorized(const char *ifname, void *priv, const u8 *addr,
+		       int total_flags, int flags_or, int flags_and)
 {
 	int authorized = -1;
 

+ 3 - 2
src/drivers/driver_hostap.c

@@ -333,7 +333,7 @@ static int hostap_send_eapol(void *priv, const u8 *addr, const u8 *data,
 }
 
 
-static int hostap_sta_set_flags(void *priv, const u8 *addr,
+static int hostap_sta_set_flags(const char *ifname, void *priv, const u8 *addr,
 				int total_flags, int flags_or, int flags_and)
 {
 	struct hostap_driver_data *drv = priv;
@@ -664,7 +664,8 @@ static int hostap_sta_remove(void *priv, const u8 *addr)
 	struct hostap_driver_data *drv = priv;
 	struct prism2_hostapd_param param;
 
-	hostap_sta_set_flags(drv, addr, 0, 0, ~WPA_STA_AUTHORIZED);
+	hostap_sta_set_flags(drv->iface, drv, addr, 0, 0,
+			     ~WPA_STA_AUTHORIZED);
 
 	memset(&param, 0, sizeof(param));
 	param.cmd = PRISM2_HOSTAPD_REMOVE_STA;

+ 2 - 2
src/drivers/driver_madwifi.c

@@ -384,8 +384,8 @@ madwifi_set_sta_authorized(void *priv, const u8 *addr, int authorized)
 }
 
 static int
-madwifi_sta_set_flags(void *priv, const u8 *addr, int total_flags,
-		      int flags_or, int flags_and)
+madwifi_sta_set_flags(const char *ifname, void *priv, const u8 *addr,
+		      int total_flags, int flags_or, int flags_and)
 {
 	/* For now, only support setting Authorized flag */
 	if (flags_or & WPA_STA_AUTHORIZED)

+ 4 - 4
src/drivers/driver_nl80211.c

@@ -3409,9 +3409,9 @@ static u32 sta_flags_nl80211(int flags)
 }
 
 
-static int wpa_driver_nl80211_sta_set_flags(void *priv, const u8 *addr,
-					    int total_flags, int flags_or,
-					    int flags_and)
+static int wpa_driver_nl80211_sta_set_flags(const char *ifname, void *priv,
+					    const u8 *addr, int total_flags,
+					    int flags_or, int flags_and)
 {
 	struct wpa_driver_nl80211_data *drv = priv;
 	struct nl_msg *msg, *flags = NULL;
@@ -3431,7 +3431,7 @@ static int wpa_driver_nl80211_sta_set_flags(void *priv, const u8 *addr,
 		    0, NL80211_CMD_SET_STATION, 0);
 
 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX,
-		    if_nametoindex(drv->ifname));
+		    if_nametoindex(ifname));
 	NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
 
 	/*

+ 2 - 1
wpa_supplicant/driver_i.h

@@ -367,7 +367,8 @@ static inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
 					int flags_or, int flags_and)
 {
 	if (wpa_s->driver->sta_set_flags)
-		return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
+		return wpa_s->driver->sta_set_flags(wpa_s->ifname,
+						    wpa_s->drv_priv, addr,
 						    total_flags, flags_or,
 						    flags_and);
 	return -1;