mac80211: notify the driver about deauth
This can allow the driver to take action based on the reason of the deauth. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
d0d1a12f9c
commit
a90faa9d64
|
@ -332,10 +332,14 @@ struct ieee80211_rssi_event {
|
||||||
* enum ieee80211_mlme_event_data - relevant when event type is %MLME_EVENT
|
* enum ieee80211_mlme_event_data - relevant when event type is %MLME_EVENT
|
||||||
* @AUTH_EVENT: the MLME operation is authentication
|
* @AUTH_EVENT: the MLME operation is authentication
|
||||||
* @ASSOC_EVENT: the MLME operation is association
|
* @ASSOC_EVENT: the MLME operation is association
|
||||||
|
* @DEAUTH_RX_EVENT: deauth received..
|
||||||
|
* @DEAUTH_TX_EVENT: deauth sent.
|
||||||
*/
|
*/
|
||||||
enum ieee80211_mlme_event_data {
|
enum ieee80211_mlme_event_data {
|
||||||
AUTH_EVENT,
|
AUTH_EVENT,
|
||||||
ASSOC_EVENT,
|
ASSOC_EVENT,
|
||||||
|
DEAUTH_RX_EVENT,
|
||||||
|
DEAUTH_TX_EVENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2345,6 +2345,24 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ieee80211_ap_probereq_get);
|
EXPORT_SYMBOL(ieee80211_ap_probereq_get);
|
||||||
|
|
||||||
|
static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata,
|
||||||
|
const u8 *buf, size_t len, bool tx,
|
||||||
|
u16 reason)
|
||||||
|
{
|
||||||
|
struct ieee80211_event event = {
|
||||||
|
.type = MLME_EVENT,
|
||||||
|
.u.mlme.data = tx ? DEAUTH_TX_EVENT : DEAUTH_RX_EVENT,
|
||||||
|
.u.mlme.reason = reason,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (tx)
|
||||||
|
cfg80211_tx_mlme_mgmt(sdata->dev, buf, len);
|
||||||
|
else
|
||||||
|
cfg80211_rx_mlme_mgmt(sdata->dev, buf, len);
|
||||||
|
|
||||||
|
drv_event_callback(sdata->local, sdata, &event);
|
||||||
|
}
|
||||||
|
|
||||||
static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
|
static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
@ -2370,8 +2388,9 @@ static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
|
||||||
}
|
}
|
||||||
mutex_unlock(&local->mtx);
|
mutex_unlock(&local->mtx);
|
||||||
|
|
||||||
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
|
||||||
IEEE80211_DEAUTH_FRAME_LEN);
|
WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY);
|
||||||
|
|
||||||
sdata_unlock(sdata);
|
sdata_unlock(sdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2676,7 +2695,7 @@ static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
|
ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
|
||||||
|
|
||||||
cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
|
ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2702,7 +2721,7 @@ static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
|
ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
|
||||||
|
|
||||||
cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
|
ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
|
static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
|
||||||
|
@ -3509,8 +3528,9 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
||||||
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
|
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
|
||||||
WLAN_REASON_DEAUTH_LEAVING,
|
WLAN_REASON_DEAUTH_LEAVING,
|
||||||
true, deauth_buf);
|
true, deauth_buf);
|
||||||
cfg80211_tx_mlme_mgmt(sdata->dev, deauth_buf,
|
ieee80211_report_disconnect(sdata, deauth_buf,
|
||||||
sizeof(deauth_buf));
|
sizeof(deauth_buf), true,
|
||||||
|
WLAN_REASON_DEAUTH_LEAVING);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3628,8 +3648,8 @@ static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
|
||||||
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason,
|
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason,
|
||||||
tx, frame_buf);
|
tx, frame_buf);
|
||||||
|
|
||||||
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
|
||||||
IEEE80211_DEAUTH_FRAME_LEN);
|
reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
|
static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
|
||||||
|
@ -4507,8 +4527,9 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
||||||
WLAN_REASON_UNSPECIFIED,
|
WLAN_REASON_UNSPECIFIED,
|
||||||
false, frame_buf);
|
false, frame_buf);
|
||||||
|
|
||||||
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
ieee80211_report_disconnect(sdata, frame_buf,
|
||||||
sizeof(frame_buf));
|
sizeof(frame_buf), true,
|
||||||
|
WLAN_REASON_UNSPECIFIED);
|
||||||
}
|
}
|
||||||
|
|
||||||
sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid);
|
sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid);
|
||||||
|
@ -4608,8 +4629,9 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
|
||||||
WLAN_REASON_UNSPECIFIED,
|
WLAN_REASON_UNSPECIFIED,
|
||||||
false, frame_buf);
|
false, frame_buf);
|
||||||
|
|
||||||
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
ieee80211_report_disconnect(sdata, frame_buf,
|
||||||
sizeof(frame_buf));
|
sizeof(frame_buf), true,
|
||||||
|
WLAN_REASON_UNSPECIFIED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ifmgd->auth_data && !ifmgd->auth_data->done) {
|
if (ifmgd->auth_data && !ifmgd->auth_data->done) {
|
||||||
|
@ -4899,8 +4921,9 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||||
req->reason_code, tx,
|
req->reason_code, tx,
|
||||||
frame_buf);
|
frame_buf);
|
||||||
ieee80211_destroy_auth_data(sdata, false);
|
ieee80211_destroy_auth_data(sdata, false);
|
||||||
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
ieee80211_report_disconnect(sdata, frame_buf,
|
||||||
IEEE80211_DEAUTH_FRAME_LEN);
|
sizeof(frame_buf), true,
|
||||||
|
req->reason_code);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -4914,8 +4937,9 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
|
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
|
||||||
req->reason_code, tx, frame_buf);
|
req->reason_code, tx, frame_buf);
|
||||||
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
ieee80211_report_disconnect(sdata, frame_buf,
|
||||||
IEEE80211_DEAUTH_FRAME_LEN);
|
sizeof(frame_buf), true,
|
||||||
|
req->reason_code);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4947,8 +4971,8 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
|
||||||
req->reason_code, !req->local_state_change,
|
req->reason_code, !req->local_state_change,
|
||||||
frame_buf);
|
frame_buf);
|
||||||
|
|
||||||
cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
|
ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
|
||||||
IEEE80211_DEAUTH_FRAME_LEN);
|
req->reason_code);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue