hostapd: add ifname to the sta_set_flags callback
This fixes multi-BSS STA operations (e.g., setting AUTHORIZED flag) with nl80211-based drivers.
This commit is contained in:
		
							parent
							
								
									23e2550c0e
								
							
						
					
					
						commit
						4c32757d22
					
				
					 8 changed files with 18 additions and 15 deletions
				
			
		|  | @ -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) | 	if (hapd->driver == NULL || hapd->driver->sta_set_flags == NULL) | ||||||
| 		return 0; | 		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); | 					   flags_or, flags_and); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1419,6 +1419,7 @@ struct wpa_driver_ops { | ||||||
| 
 | 
 | ||||||
| 	/**
 | 	/**
 | ||||||
| 	 * sta_set_flags - Set station flags (AP only) | 	 * sta_set_flags - Set station flags (AP only) | ||||||
|  | 	 * @ifname: Interface name (for multi-SSID/VLAN support) | ||||||
| 	 * @priv: Private driver interface data | 	 * @priv: Private driver interface data | ||||||
| 	 * @addr: Station address | 	 * @addr: Station address | ||||||
| 	 * @total_flags: Bitmap of all WPA_STA_* flags currently set | 	 * @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 | 	 * @flags_and: Bitmap of WPA_STA_* flags to us as a mask | ||||||
| 	 * Returns: 0 on success, -1 on failure | 	 * 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); | 			     int total_flags, int flags_or, int flags_and); | ||||||
| 
 | 
 | ||||||
| 	/**
 | 	/**
 | ||||||
|  |  | ||||||
|  | @ -339,8 +339,8 @@ madwifi_set_sta_authorized(void *priv, const u8 *addr, int authorized) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
| madwifi_sta_set_flags(void *priv, const u8 *addr, int total_flags, | madwifi_sta_set_flags(const char *ifname, void *priv, const u8 *addr, | ||||||
| 		      int flags_or, int flags_and) | 		      int total_flags, int flags_or, int flags_and) | ||||||
| { | { | ||||||
| 	/* For now, only support setting Authorized flag */ | 	/* For now, only support setting Authorized flag */ | ||||||
| 	if (flags_or & WPA_STA_AUTHORIZED) | 	if (flags_or & WPA_STA_AUTHORIZED) | ||||||
|  |  | ||||||
|  | @ -468,8 +468,8 @@ bsd_set_ieee8021x(void *priv, struct wpa_bss_params *params) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
| bsd_set_sta_authorized(void *priv, const u8 *addr, int total_flags, | bsd_set_sta_authorized(const char *ifname, void *priv, const u8 *addr, | ||||||
| 		       int flags_or, int flags_and) | 		       int total_flags, int flags_or, int flags_and) | ||||||
| { | { | ||||||
| 	int authorized = -1; | 	int authorized = -1; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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) | 				int total_flags, int flags_or, int flags_and) | ||||||
| { | { | ||||||
| 	struct hostap_driver_data *drv = priv; | 	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 hostap_driver_data *drv = priv; | ||||||
| 	struct prism2_hostapd_param param; | 	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(¶m, 0, sizeof(param)); | 	memset(¶m, 0, sizeof(param)); | ||||||
| 	param.cmd = PRISM2_HOSTAPD_REMOVE_STA; | 	param.cmd = PRISM2_HOSTAPD_REMOVE_STA; | ||||||
|  |  | ||||||
|  | @ -384,8 +384,8 @@ madwifi_set_sta_authorized(void *priv, const u8 *addr, int authorized) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int | static int | ||||||
| madwifi_sta_set_flags(void *priv, const u8 *addr, int total_flags, | madwifi_sta_set_flags(const char *ifname, void *priv, const u8 *addr, | ||||||
| 		      int flags_or, int flags_and) | 		      int total_flags, int flags_or, int flags_and) | ||||||
| { | { | ||||||
| 	/* For now, only support setting Authorized flag */ | 	/* For now, only support setting Authorized flag */ | ||||||
| 	if (flags_or & WPA_STA_AUTHORIZED) | 	if (flags_or & WPA_STA_AUTHORIZED) | ||||||
|  |  | ||||||
|  | @ -3409,9 +3409,9 @@ static u32 sta_flags_nl80211(int flags) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static int wpa_driver_nl80211_sta_set_flags(void *priv, const u8 *addr, | static int wpa_driver_nl80211_sta_set_flags(const char *ifname, void *priv, | ||||||
| 					    int total_flags, int flags_or, | 					    const u8 *addr, int total_flags, | ||||||
| 					    int flags_and) | 					    int flags_or, int flags_and) | ||||||
| { | { | ||||||
| 	struct wpa_driver_nl80211_data *drv = priv; | 	struct wpa_driver_nl80211_data *drv = priv; | ||||||
| 	struct nl_msg *msg, *flags = NULL; | 	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); | 		    0, NL80211_CMD_SET_STATION, 0); | ||||||
| 
 | 
 | ||||||
| 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, | 	NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, | ||||||
| 		    if_nametoindex(drv->ifname)); | 		    if_nametoindex(ifname)); | ||||||
| 	NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr); | 	NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr); | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
|  |  | ||||||
|  | @ -367,7 +367,8 @@ static inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s, | ||||||
| 					int flags_or, int flags_and) | 					int flags_or, int flags_and) | ||||||
| { | { | ||||||
| 	if (wpa_s->driver->sta_set_flags) | 	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, | 						    total_flags, flags_or, | ||||||
| 						    flags_and); | 						    flags_and); | ||||||
| 	return -1; | 	return -1; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Felix Fietkau
						Felix Fietkau