nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
/*
|
|
|
|
* cfg80211 MLME SAP interface
|
|
|
|
*
|
|
|
|
* Copyright (c) 2009, Jouni Malinen <j@w1.fi>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/netdevice.h>
|
|
|
|
#include <linux/nl80211.h>
|
|
|
|
#include <net/cfg80211.h>
|
|
|
|
#include "core.h"
|
|
|
|
#include "nl80211.h"
|
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
void cfg80211_send_rx_auth(struct net_device *dev, const u8 *buf, size_t len, gfp_t gfp)
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
{
|
|
|
|
struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
|
|
|
|
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
2009-07-02 15:13:27 +08:00
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
nl80211_send_rx_auth(rdev, dev, buf, len, gfp);
|
2009-07-02 15:13:27 +08:00
|
|
|
cfg80211_sme_rx_auth(dev, buf, len);
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(cfg80211_send_rx_auth);
|
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
void cfg80211_send_rx_assoc(struct net_device *dev, const u8 *buf, size_t len, gfp_t gfp)
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
{
|
2009-07-02 15:13:27 +08:00
|
|
|
u16 status_code;
|
|
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
|
|
struct wiphy *wiphy = wdev->wiphy;
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
2009-07-02 15:13:27 +08:00
|
|
|
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
|
|
|
|
u8 *ie = mgmt->u.assoc_resp.variable;
|
|
|
|
int ieoffs = offsetof(struct ieee80211_mgmt, u.assoc_resp.variable);
|
|
|
|
|
|
|
|
status_code = le16_to_cpu(mgmt->u.assoc_resp.status_code);
|
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
nl80211_send_rx_assoc(rdev, dev, buf, len, gfp);
|
2009-07-02 15:13:27 +08:00
|
|
|
|
|
|
|
cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, ie, len - ieoffs,
|
|
|
|
status_code, gfp);
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(cfg80211_send_rx_assoc);
|
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
void cfg80211_send_deauth(struct net_device *dev, const u8 *buf, size_t len, gfp_t gfp)
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
{
|
2009-07-02 15:13:27 +08:00
|
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
|
|
struct wiphy *wiphy = wdev->wiphy;
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
2009-07-02 15:13:27 +08:00
|
|
|
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
|
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
nl80211_send_deauth(rdev, dev, buf, len, gfp);
|
2009-07-02 15:13:27 +08:00
|
|
|
|
|
|
|
if (wdev->sme_state == CFG80211_SME_CONNECTED) {
|
|
|
|
u16 reason_code;
|
|
|
|
bool from_ap;
|
|
|
|
|
|
|
|
reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
|
|
|
|
|
|
|
|
from_ap = memcmp(mgmt->da, dev->dev_addr, ETH_ALEN) == 0;
|
|
|
|
__cfg80211_disconnected(dev, gfp, NULL, 0,
|
|
|
|
reason_code, from_ap);
|
|
|
|
|
|
|
|
wdev->sme_state = CFG80211_SME_IDLE;
|
|
|
|
} else if (wdev->sme_state == CFG80211_SME_CONNECTING) {
|
|
|
|
cfg80211_connect_result(dev, mgmt->bssid, NULL, 0, NULL, 0,
|
|
|
|
WLAN_STATUS_UNSPECIFIED_FAILURE, gfp);
|
|
|
|
}
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
}
|
2009-03-28 02:53:56 +08:00
|
|
|
EXPORT_SYMBOL(cfg80211_send_deauth);
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
void cfg80211_send_disassoc(struct net_device *dev, const u8 *buf, size_t len, gfp_t gfp)
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
{
|
2009-07-02 15:13:27 +08:00
|
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
|
|
struct wiphy *wiphy = wdev->wiphy;
|
nl80211: Event notifications for MLME events
Add new nl80211 event notifications (and a new multicast group, "mlme")
for informing user space about received and processed Authentication,
(Re)Association Response, Deauthentication, and Disassociation frames in
station and IBSS modes (i.e., MLME SAP interface primitives
MLME-AUTHENTICATE.confirm, MLME-ASSOCIATE.confirm,
MLME-REASSOCIATE.confirm, MLME-DEAUTHENTICATE.indicate, and
MLME-DISASSOCIATE.indication). The event data is encapsulated as the 802.11
management frame since we already have the frame in that format and it
includes all the needed information.
This is the initial step in providing MLME SAP interface for
authentication and association with nl80211. In other words, kernel code
will act as the MLME and a user space application can control it as the
SME.
Signed-off-by: Jouni Malinen <j@w1.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
2009-03-19 19:39:21 +08:00
|
|
|
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
2009-07-02 15:13:27 +08:00
|
|
|
struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)buf;
|
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
nl80211_send_disassoc(rdev, dev, buf, len, gfp);
|
2009-03-28 03:59:49 +08:00
|
|
|
|
2009-07-02 15:13:27 +08:00
|
|
|
if (wdev->sme_state == CFG80211_SME_CONNECTED) {
|
|
|
|
u16 reason_code;
|
|
|
|
bool from_ap;
|
|
|
|
|
|
|
|
reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
|
|
|
|
|
|
|
|
from_ap = memcmp(mgmt->da, dev->dev_addr, ETH_ALEN) == 0;
|
|
|
|
__cfg80211_disconnected(dev, gfp, NULL, 0,
|
|
|
|
reason_code, from_ap);
|
|
|
|
|
|
|
|
wdev->sme_state = CFG80211_SME_IDLE;
|
|
|
|
}
|
2009-04-23 02:38:25 +08:00
|
|
|
}
|
2009-07-02 15:13:27 +08:00
|
|
|
EXPORT_SYMBOL(cfg80211_send_disassoc);
|
2009-04-23 02:38:25 +08:00
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
void cfg80211_send_auth_timeout(struct net_device *dev, const u8 *addr, gfp_t gfp)
|
2009-04-23 02:38:25 +08:00
|
|
|
{
|
2009-07-02 15:13:27 +08:00
|
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
|
|
struct wiphy *wiphy = wdev->wiphy;
|
2009-04-23 02:38:25 +08:00
|
|
|
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
2009-07-02 03:26:47 +08:00
|
|
|
nl80211_send_auth_timeout(rdev, dev, addr, gfp);
|
2009-07-02 15:13:27 +08:00
|
|
|
if (wdev->sme_state == CFG80211_SME_CONNECTING)
|
|
|
|
cfg80211_connect_result(dev, addr, NULL, 0, NULL, 0,
|
|
|
|
WLAN_STATUS_UNSPECIFIED_FAILURE, gfp);
|
|
|
|
wdev->sme_state = CFG80211_SME_IDLE;
|
2009-04-23 02:38:25 +08:00
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(cfg80211_send_auth_timeout);
|
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
void cfg80211_send_assoc_timeout(struct net_device *dev, const u8 *addr, gfp_t gfp)
|
2009-04-23 02:38:25 +08:00
|
|
|
{
|
2009-07-02 15:13:27 +08:00
|
|
|
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
|
|
struct wiphy *wiphy = wdev->wiphy;
|
2009-04-23 02:38:25 +08:00
|
|
|
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
2009-07-02 03:26:47 +08:00
|
|
|
nl80211_send_assoc_timeout(rdev, dev, addr, gfp);
|
2009-07-02 15:13:27 +08:00
|
|
|
if (wdev->sme_state == CFG80211_SME_CONNECTING)
|
|
|
|
cfg80211_connect_result(dev, addr, NULL, 0, NULL, 0,
|
|
|
|
WLAN_STATUS_UNSPECIFIED_FAILURE, gfp);
|
|
|
|
wdev->sme_state = CFG80211_SME_IDLE;
|
2009-04-23 02:38:25 +08:00
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(cfg80211_send_assoc_timeout);
|
|
|
|
|
2009-03-28 03:59:49 +08:00
|
|
|
void cfg80211_michael_mic_failure(struct net_device *dev, const u8 *addr,
|
|
|
|
enum nl80211_key_type key_type, int key_id,
|
2009-07-02 03:26:47 +08:00
|
|
|
const u8 *tsc, gfp_t gfp)
|
2009-03-28 03:59:49 +08:00
|
|
|
{
|
|
|
|
struct wiphy *wiphy = dev->ieee80211_ptr->wiphy;
|
|
|
|
struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
|
2009-06-19 08:45:21 +08:00
|
|
|
#ifdef CONFIG_WIRELESS_EXT
|
|
|
|
union iwreq_data wrqu;
|
2009-07-02 03:26:47 +08:00
|
|
|
char *buf = kmalloc(128, gfp);
|
2009-06-19 08:45:21 +08:00
|
|
|
|
|
|
|
if (buf) {
|
|
|
|
sprintf(buf, "MLME-MICHAELMICFAILURE.indication("
|
|
|
|
"keyid=%d %scast addr=%pM)", key_id,
|
|
|
|
key_type == NL80211_KEYTYPE_GROUP ? "broad" : "uni",
|
|
|
|
addr);
|
|
|
|
memset(&wrqu, 0, sizeof(wrqu));
|
|
|
|
wrqu.data.length = strlen(buf);
|
|
|
|
wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
|
|
|
|
kfree(buf);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2009-07-02 03:26:47 +08:00
|
|
|
nl80211_michael_mic_failure(rdev, dev, addr, key_type, key_id, tsc, gfp);
|
2009-03-28 03:59:49 +08:00
|
|
|
}
|
|
|
|
EXPORT_SYMBOL(cfg80211_michael_mic_failure);
|