This fixes deauth/disassoc frames in secondary BSSes when using
multi-BSSID. In addition, it reduces need to dereference
struct hostapd_data inside driver wrappers.
{
if (hapd->driver == NULL || hapd->driver->sta_deauth == NULL)
return 0;
{
if (hapd->driver == NULL || hapd->driver->sta_deauth == NULL)
return 0;
- return hapd->driver->sta_deauth(hapd->drv_priv, addr, reason);
+ return hapd->driver->sta_deauth(hapd->drv_priv, hapd->own_addr, addr,
+ reason);
{
if (hapd->driver == NULL || hapd->driver->sta_disassoc == NULL)
return 0;
{
if (hapd->driver == NULL || hapd->driver->sta_disassoc == NULL)
return 0;
- return hapd->driver->sta_disassoc(hapd->drv_priv, addr, reason);
+ return hapd->driver->sta_disassoc(hapd->drv_priv, hapd->own_addr, addr,
+ reason);
int (*hapd_send_eapol)(void *priv, const u8 *addr, const u8 *data,
size_t data_len, int encrypt,
const u8 *own_addr);
int (*hapd_send_eapol)(void *priv, const u8 *addr, const u8 *data,
size_t data_len, int encrypt,
const u8 *own_addr);
- int (*sta_deauth)(void *priv, const u8 *addr, int reason);
- int (*sta_disassoc)(void *priv, const u8 *addr, int reason);
+ int (*sta_deauth)(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason);
+ int (*sta_disassoc)(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason);
int (*sta_remove)(void *priv, const u8 *addr);
int (*hapd_get_ssid)(const char *ifname, void *priv, u8 *buf, int len);
int (*hapd_set_ssid)(const char *ifname, void *priv, const u8 *buf,
int (*sta_remove)(void *priv, const u8 *addr);
int (*hapd_get_ssid)(const char *ifname, void *priv, u8 *buf, int len);
int (*hapd_set_ssid)(const char *ifname, void *priv, const u8 *buf,
struct l2_packet_data *sock_raw; /* raw 802.11 management frames */
};
struct l2_packet_data *sock_raw; /* raw 802.11 management frames */
};
-static int madwifi_sta_deauth(void *priv, const u8 *addr, int reason_code);
+static int madwifi_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason_code);
static int
set80211priv(struct madwifi_driver_data *drv, int op, void *data, int len)
static int
set80211priv(struct madwifi_driver_data *drv, int op, void *data, int len)
{
u8 allsta[IEEE80211_ADDR_LEN];
memset(allsta, 0xff, IEEE80211_ADDR_LEN);
{
u8 allsta[IEEE80211_ADDR_LEN];
memset(allsta, 0xff, IEEE80211_ADDR_LEN);
- return madwifi_sta_deauth(priv, allsta, IEEE80211_REASON_AUTH_LEAVE);
+ return madwifi_sta_deauth(priv, NULL, allsta,
+ IEEE80211_REASON_AUTH_LEAVE);
-madwifi_sta_deauth(void *priv, const u8 *addr, int reason_code)
+madwifi_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason_code)
{
struct madwifi_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
{
struct madwifi_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
-madwifi_sta_disassoc(void *priv, const u8 *addr, int reason_code)
+madwifi_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason_code)
{
struct madwifi_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
{
struct madwifi_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
int wext_sock; /* socket for wireless events */
};
int wext_sock; /* socket for wireless events */
};
-static int bsd_sta_deauth(void *priv, const u8 *addr, int reason_code);
+static int bsd_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason_code);
static int
set80211var(struct bsd_driver_data *drv, int op, const void *arg, int arg_len)
static int
set80211var(struct bsd_driver_data *drv, int op, const void *arg, int arg_len)
u8 allsta[IEEE80211_ADDR_LEN];
memset(allsta, 0xff, IEEE80211_ADDR_LEN);
u8 allsta[IEEE80211_ADDR_LEN];
memset(allsta, 0xff, IEEE80211_ADDR_LEN);
- return bsd_sta_deauth(priv, allsta, IEEE80211_REASON_AUTH_LEAVE);
+ return bsd_sta_deauth(priv, NULL, allsta, IEEE80211_REASON_AUTH_LEAVE);
-bsd_sta_deauth(void *priv, const u8 *addr, int reason_code)
+bsd_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr, int reason_code)
{
struct bsd_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
{
struct bsd_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
-bsd_sta_disassoc(void *priv, const u8 *addr, int reason_code)
+bsd_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason_code)
{
struct bsd_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
{
struct bsd_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
static int hostapd_ioctl(void *priv, struct prism2_hostapd_param *param,
int len);
static int hostap_set_iface_flags(void *priv, int dev_up);
static int hostapd_ioctl(void *priv, struct prism2_hostapd_param *param,
int len);
static int hostap_set_iface_flags(void *priv, int dev_up);
-static int hostap_sta_disassoc(void *priv, const u8 *addr, int reason);
-static int hostap_sta_deauth(void *priv, const u8 *addr, int reason);
static void handle_data(struct hostap_driver_data *drv, u8 *buf, size_t len,
u16 stype)
static void handle_data(struct hostap_driver_data *drv, u8 *buf, size_t len,
u16 stype)
-static int hostap_sta_deauth(void *priv, const u8 *addr, int reason)
+static int hostap_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason)
{
struct hostap_driver_data *drv = priv;
struct ieee80211_mgmt mgmt;
{
struct hostap_driver_data *drv = priv;
struct ieee80211_mgmt mgmt;
mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
WLAN_FC_STYPE_DEAUTH);
memcpy(mgmt.da, addr, ETH_ALEN);
mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
WLAN_FC_STYPE_DEAUTH);
memcpy(mgmt.da, addr, ETH_ALEN);
- memcpy(mgmt.sa, drv->hapd->own_addr, ETH_ALEN);
- memcpy(mgmt.bssid, drv->hapd->own_addr, ETH_ALEN);
+ memcpy(mgmt.sa, own_addr, ETH_ALEN);
+ memcpy(mgmt.bssid, own_addr, ETH_ALEN);
mgmt.u.deauth.reason_code = host_to_le16(reason);
return hostap_send_mlme(drv, (u8 *) &mgmt, IEEE80211_HDRLEN +
sizeof(mgmt.u.deauth));
}
mgmt.u.deauth.reason_code = host_to_le16(reason);
return hostap_send_mlme(drv, (u8 *) &mgmt, IEEE80211_HDRLEN +
sizeof(mgmt.u.deauth));
}
-static int hostap_sta_disassoc(void *priv, const u8 *addr, int reason)
+static int hostap_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason)
{
struct hostap_driver_data *drv = priv;
struct ieee80211_mgmt mgmt;
{
struct hostap_driver_data *drv = priv;
struct ieee80211_mgmt mgmt;
mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
WLAN_FC_STYPE_DISASSOC);
memcpy(mgmt.da, addr, ETH_ALEN);
mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
WLAN_FC_STYPE_DISASSOC);
memcpy(mgmt.da, addr, ETH_ALEN);
- memcpy(mgmt.sa, drv->hapd->own_addr, ETH_ALEN);
- memcpy(mgmt.bssid, drv->hapd->own_addr, ETH_ALEN);
+ memcpy(mgmt.sa, own_addr, ETH_ALEN);
+ memcpy(mgmt.bssid, own_addr, ETH_ALEN);
mgmt.u.disassoc.reason_code = host_to_le16(reason);
return hostap_send_mlme(drv, (u8 *) &mgmt, IEEE80211_HDRLEN +
sizeof(mgmt.u.disassoc));
mgmt.u.disassoc.reason_code = host_to_le16(reason);
return hostap_send_mlme(drv, (u8 *) &mgmt, IEEE80211_HDRLEN +
sizeof(mgmt.u.disassoc));
struct l2_packet_data *sock_raw; /* raw 802.11 management frames */
};
struct l2_packet_data *sock_raw; /* raw 802.11 management frames */
};
-static int madwifi_sta_deauth(void *priv, const u8 *addr, int reason_code);
+static int madwifi_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason_code);
static int
set80211priv(struct madwifi_driver_data *drv, int op, void *data, int len)
static int
set80211priv(struct madwifi_driver_data *drv, int op, void *data, int len)
#ifdef MADWIFI_BSD
u8 allsta[IEEE80211_ADDR_LEN];
memset(allsta, 0xff, IEEE80211_ADDR_LEN);
#ifdef MADWIFI_BSD
u8 allsta[IEEE80211_ADDR_LEN];
memset(allsta, 0xff, IEEE80211_ADDR_LEN);
- return madwifi_sta_deauth(priv, allsta, IEEE80211_REASON_AUTH_LEAVE);
+ return madwifi_sta_deauth(priv, NULL, allsta,
+ IEEE80211_REASON_AUTH_LEAVE);
#else /* MADWIFI_BSD */
return 0; /* XXX */
#endif /* MADWIFI_BSD */
#else /* MADWIFI_BSD */
return 0; /* XXX */
#endif /* MADWIFI_BSD */
-madwifi_sta_deauth(void *priv, const u8 *addr, int reason_code)
+madwifi_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason_code)
{
struct madwifi_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
{
struct madwifi_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
-madwifi_sta_disassoc(void *priv, const u8 *addr, int reason_code)
+madwifi_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason_code)
{
struct madwifi_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
{
struct madwifi_driver_data *drv = priv;
struct ieee80211req_mlme mlme;
static const u8 rfc1042_header[6] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
static const u8 rfc1042_header[6] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
-static int i802_sta_deauth(void *priv, const u8 *addr, int reason);
-static int i802_sta_disassoc(void *priv, const u8 *addr, int reason);
-
static struct i802_bss * get_bss(struct wpa_driver_nl80211_data *drv,
int ifindex)
static struct i802_bss * get_bss(struct wpa_driver_nl80211_data *drv,
int ifindex)
-static int i802_sta_deauth(void *priv, const u8 *addr, int reason)
+static int i802_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason)
{
struct wpa_driver_nl80211_data *drv = priv;
struct ieee80211_mgmt mgmt;
{
struct wpa_driver_nl80211_data *drv = priv;
struct ieee80211_mgmt mgmt;
mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
WLAN_FC_STYPE_DEAUTH);
memcpy(mgmt.da, addr, ETH_ALEN);
mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
WLAN_FC_STYPE_DEAUTH);
memcpy(mgmt.da, addr, ETH_ALEN);
- memcpy(mgmt.sa, drv->hapd->own_addr, ETH_ALEN);
- memcpy(mgmt.bssid, drv->hapd->own_addr, ETH_ALEN);
+ memcpy(mgmt.sa, own_addr, ETH_ALEN);
+ memcpy(mgmt.bssid, own_addr, ETH_ALEN);
mgmt.u.deauth.reason_code = host_to_le16(reason);
return wpa_driver_nl80211_send_mlme(drv, (u8 *) &mgmt,
IEEE80211_HDRLEN +
mgmt.u.deauth.reason_code = host_to_le16(reason);
return wpa_driver_nl80211_send_mlme(drv, (u8 *) &mgmt,
IEEE80211_HDRLEN +
-static int i802_sta_disassoc(void *priv, const u8 *addr, int reason)
+static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason)
{
struct wpa_driver_nl80211_data *drv = priv;
struct ieee80211_mgmt mgmt;
{
struct wpa_driver_nl80211_data *drv = priv;
struct ieee80211_mgmt mgmt;
mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
WLAN_FC_STYPE_DISASSOC);
memcpy(mgmt.da, addr, ETH_ALEN);
mgmt.frame_control = IEEE80211_FC(WLAN_FC_TYPE_MGMT,
WLAN_FC_STYPE_DISASSOC);
memcpy(mgmt.da, addr, ETH_ALEN);
- memcpy(mgmt.sa, drv->hapd->own_addr, ETH_ALEN);
- memcpy(mgmt.bssid, drv->hapd->own_addr, ETH_ALEN);
+ memcpy(mgmt.sa, own_addr, ETH_ALEN);
+ memcpy(mgmt.bssid, own_addr, ETH_ALEN);
mgmt.u.disassoc.reason_code = host_to_le16(reason);
return wpa_driver_nl80211_send_mlme(drv, (u8 *) &mgmt,
IEEE80211_HDRLEN +
mgmt.u.disassoc.reason_code = host_to_le16(reason);
return wpa_driver_nl80211_send_mlme(drv, (u8 *) &mgmt,
IEEE80211_HDRLEN +
-static int prism54_sta_deauth(void *priv, const u8 *addr, int reason)
+static int prism54_sta_deauth(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason)
{
struct prism54_driver_data *drv = priv;
pimdev_hdr *hdr;
{
struct prism54_driver_data *drv = priv;
pimdev_hdr *hdr;
-static int prism54_sta_disassoc(void *priv, const u8 *addr, int reason)
+static int prism54_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,
+ int reason)
{
struct prism54_driver_data *drv = priv;
pimdev_hdr *hdr;
{
struct prism54_driver_data *drv = priv;
pimdev_hdr *hdr;
-static int test_driver_sta_deauth(void *priv, const u8 *addr, int reason)
+static int test_driver_sta_deauth(void *priv, const u8 *own_addr,
+ const u8 *addr, int reason)
{
struct test_driver_data *drv = priv;
struct test_client_socket *cli;
{
struct test_driver_data *drv = priv;
struct test_client_socket *cli;
-static int test_driver_sta_disassoc(void *priv, const u8 *addr, int reason)
+static int test_driver_sta_disassoc(void *priv, const u8 *own_addr,
+ const u8 *addr, int reason)
{
struct test_driver_data *drv = priv;
struct test_client_socket *cli;
{
struct test_driver_data *drv = priv;
struct test_client_socket *cli;