Commit a90faa9d authored by Emmanuel Grumbach's avatar Emmanuel Grumbach Committed by Johannes Berg

mac80211: notify the driver about deauth

This can allow the driver to take action based on the reason
of the deauth.
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent d0d1a12f
...@@ -332,10 +332,14 @@ struct ieee80211_rssi_event { ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment