mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
mwifiex: add AP event handling framework
Added logic to handle AP event that are generated by the firmware. As MLME/SME is implemented in the firmware, events such as station association and deauthentication, must be sent to userspace (hostapd) for creating and deleting station database. Signed-off-by: Avinash Patil <patila@marvell.com> Signed-off-by: Yogesh Powar <yogeshp@marvell.com> Signed-off-by: Kiran Divekar <dkiran@marvell.com> Signed-off-by: Bing Zhao <bzhao@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
12190c5d80
commit
e568634ae7
|
|
@ -1237,6 +1237,11 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (priv->bss_mode == NL80211_IFTYPE_AP) {
|
||||||
|
wiphy_err(wiphy, "skip association request for AP interface\n");
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
wiphy_dbg(wiphy, "info: Trying to associate to %s and bssid %pM\n",
|
wiphy_dbg(wiphy, "info: Trying to associate to %s and bssid %pM\n",
|
||||||
(char *) sme->ssid, sme->bssid);
|
(char *) sme->ssid, sme->bssid);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
|
||||||
#define TLV_TYPE_POWER_GROUP (PROPRIETARY_TLV_BASE_ID + 84)
|
#define TLV_TYPE_POWER_GROUP (PROPRIETARY_TLV_BASE_ID + 84)
|
||||||
#define TLV_TYPE_UAP_RETRY_LIMIT (PROPRIETARY_TLV_BASE_ID + 93)
|
#define TLV_TYPE_UAP_RETRY_LIMIT (PROPRIETARY_TLV_BASE_ID + 93)
|
||||||
#define TLV_TYPE_WAPI_IE (PROPRIETARY_TLV_BASE_ID + 94)
|
#define TLV_TYPE_WAPI_IE (PROPRIETARY_TLV_BASE_ID + 94)
|
||||||
|
#define TLV_TYPE_UAP_MGMT_FRAME (PROPRIETARY_TLV_BASE_ID + 104)
|
||||||
#define TLV_TYPE_MGMT_IE (PROPRIETARY_TLV_BASE_ID + 105)
|
#define TLV_TYPE_MGMT_IE (PROPRIETARY_TLV_BASE_ID + 105)
|
||||||
#define TLV_TYPE_AUTO_DS_PARAM (PROPRIETARY_TLV_BASE_ID + 113)
|
#define TLV_TYPE_AUTO_DS_PARAM (PROPRIETARY_TLV_BASE_ID + 113)
|
||||||
#define TLV_TYPE_PS_PARAM (PROPRIETARY_TLV_BASE_ID + 114)
|
#define TLV_TYPE_PS_PARAM (PROPRIETARY_TLV_BASE_ID + 114)
|
||||||
|
|
@ -324,15 +325,20 @@ enum ENH_PS_MODES {
|
||||||
#define EVENT_DATA_SNR_HIGH 0x00000027
|
#define EVENT_DATA_SNR_HIGH 0x00000027
|
||||||
#define EVENT_LINK_QUALITY 0x00000028
|
#define EVENT_LINK_QUALITY 0x00000028
|
||||||
#define EVENT_PORT_RELEASE 0x0000002b
|
#define EVENT_PORT_RELEASE 0x0000002b
|
||||||
|
#define EVENT_UAP_STA_DEAUTH 0x0000002c
|
||||||
|
#define EVENT_UAP_STA_ASSOC 0x0000002d
|
||||||
|
#define EVENT_UAP_BSS_START 0x0000002e
|
||||||
#define EVENT_PRE_BEACON_LOST 0x00000031
|
#define EVENT_PRE_BEACON_LOST 0x00000031
|
||||||
#define EVENT_ADDBA 0x00000033
|
#define EVENT_ADDBA 0x00000033
|
||||||
#define EVENT_DELBA 0x00000034
|
#define EVENT_DELBA 0x00000034
|
||||||
#define EVENT_BA_STREAM_TIEMOUT 0x00000037
|
#define EVENT_BA_STREAM_TIEMOUT 0x00000037
|
||||||
#define EVENT_AMSDU_AGGR_CTRL 0x00000042
|
#define EVENT_AMSDU_AGGR_CTRL 0x00000042
|
||||||
|
#define EVENT_UAP_BSS_IDLE 0x00000043
|
||||||
|
#define EVENT_UAP_BSS_ACTIVE 0x00000044
|
||||||
#define EVENT_WEP_ICV_ERR 0x00000046
|
#define EVENT_WEP_ICV_ERR 0x00000046
|
||||||
#define EVENT_HS_ACT_REQ 0x00000047
|
#define EVENT_HS_ACT_REQ 0x00000047
|
||||||
#define EVENT_BW_CHANGE 0x00000048
|
#define EVENT_BW_CHANGE 0x00000048
|
||||||
|
#define EVENT_UAP_MIC_COUNTERMEASURES 0x0000004c
|
||||||
#define EVENT_HOSTWAKE_STAIE 0x0000004d
|
#define EVENT_HOSTWAKE_STAIE 0x0000004d
|
||||||
|
|
||||||
#define EVENT_ID_MASK 0xffff
|
#define EVENT_ID_MASK 0xffff
|
||||||
|
|
@ -1119,6 +1125,16 @@ struct host_cmd_tlv {
|
||||||
__le16 len;
|
__le16 len;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
struct mwifiex_assoc_event {
|
||||||
|
u8 sta_addr[ETH_ALEN];
|
||||||
|
__le16 type;
|
||||||
|
__le16 len;
|
||||||
|
__le16 frame_control;
|
||||||
|
__le16 cap_info;
|
||||||
|
__le16 listen_interval;
|
||||||
|
u8 data[0];
|
||||||
|
} __packed;
|
||||||
|
|
||||||
struct host_cmd_ds_sys_config {
|
struct host_cmd_ds_sys_config {
|
||||||
__le16 action;
|
__le16 action;
|
||||||
u8 tlv[0];
|
u8 tlv[0];
|
||||||
|
|
|
||||||
|
|
@ -116,6 +116,7 @@ enum {
|
||||||
#define MAX_FREQUENCY_BAND_BG 2484
|
#define MAX_FREQUENCY_BAND_BG 2484
|
||||||
|
|
||||||
#define MWIFIEX_EVENT_HEADER_LEN 4
|
#define MWIFIEX_EVENT_HEADER_LEN 4
|
||||||
|
#define MWIFIEX_UAP_EVENT_EXTRA_HEADER 2
|
||||||
|
|
||||||
#define MWIFIEX_TYPE_LEN 4
|
#define MWIFIEX_TYPE_LEN 4
|
||||||
#define MWIFIEX_USB_TYPE_CMD 0xF00DFACE
|
#define MWIFIEX_USB_TYPE_CMD 0xF00DFACE
|
||||||
|
|
|
||||||
|
|
@ -184,8 +184,10 @@ mwifiex_reset_connect_state(struct mwifiex_private *priv)
|
||||||
int mwifiex_process_sta_event(struct mwifiex_private *priv)
|
int mwifiex_process_sta_event(struct mwifiex_private *priv)
|
||||||
{
|
{
|
||||||
struct mwifiex_adapter *adapter = priv->adapter;
|
struct mwifiex_adapter *adapter = priv->adapter;
|
||||||
int ret = 0;
|
int len, ret = 0;
|
||||||
u32 eventcause = adapter->event_cause;
|
u32 eventcause = adapter->event_cause;
|
||||||
|
struct station_info sinfo;
|
||||||
|
struct mwifiex_assoc_event *event;
|
||||||
|
|
||||||
switch (eventcause) {
|
switch (eventcause) {
|
||||||
case EVENT_DUMMY_HOST_WAKEUP_SIGNAL:
|
case EVENT_DUMMY_HOST_WAKEUP_SIGNAL:
|
||||||
|
|
@ -402,6 +404,53 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
|
||||||
case EVENT_HOSTWAKE_STAIE:
|
case EVENT_HOSTWAKE_STAIE:
|
||||||
dev_dbg(adapter->dev, "event: HOSTWAKE_STAIE %d\n", eventcause);
|
dev_dbg(adapter->dev, "event: HOSTWAKE_STAIE %d\n", eventcause);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case EVENT_UAP_STA_ASSOC:
|
||||||
|
skb_pull(adapter->event_skb, MWIFIEX_UAP_EVENT_EXTRA_HEADER);
|
||||||
|
memset(&sinfo, 0, sizeof(sinfo));
|
||||||
|
event = (struct mwifiex_assoc_event *)adapter->event_skb->data;
|
||||||
|
if (le16_to_cpu(event->type) == TLV_TYPE_UAP_MGMT_FRAME) {
|
||||||
|
len = -1;
|
||||||
|
|
||||||
|
if (ieee80211_is_assoc_req(event->frame_control))
|
||||||
|
len = 0;
|
||||||
|
else if (ieee80211_is_reassoc_req(event->frame_control))
|
||||||
|
/* There will be ETH_ALEN bytes of
|
||||||
|
* current_ap_addr before the re-assoc ies.
|
||||||
|
*/
|
||||||
|
len = ETH_ALEN;
|
||||||
|
|
||||||
|
if (len != -1) {
|
||||||
|
sinfo.filled = STATION_INFO_ASSOC_REQ_IES;
|
||||||
|
sinfo.assoc_req_ies = (u8 *)&event->data[len];
|
||||||
|
len = (u8 *)sinfo.assoc_req_ies -
|
||||||
|
(u8 *)&event->frame_control;
|
||||||
|
sinfo.assoc_req_ies_len =
|
||||||
|
le16_to_cpu(event->len) - (u16)len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cfg80211_new_sta(priv->netdev, event->sta_addr, &sinfo,
|
||||||
|
GFP_KERNEL);
|
||||||
|
break;
|
||||||
|
case EVENT_UAP_STA_DEAUTH:
|
||||||
|
skb_pull(adapter->event_skb, MWIFIEX_UAP_EVENT_EXTRA_HEADER);
|
||||||
|
cfg80211_del_sta(priv->netdev, adapter->event_skb->data,
|
||||||
|
GFP_KERNEL);
|
||||||
|
break;
|
||||||
|
case EVENT_UAP_BSS_IDLE:
|
||||||
|
priv->media_connected = false;
|
||||||
|
break;
|
||||||
|
case EVENT_UAP_BSS_ACTIVE:
|
||||||
|
priv->media_connected = true;
|
||||||
|
break;
|
||||||
|
case EVENT_UAP_BSS_START:
|
||||||
|
dev_dbg(adapter->dev, "AP EVENT: event id: %#x\n", eventcause);
|
||||||
|
memcpy(priv->netdev->dev_addr, adapter->event_body+2, ETH_ALEN);
|
||||||
|
break;
|
||||||
|
case EVENT_UAP_MIC_COUNTERMEASURES:
|
||||||
|
/* For future development */
|
||||||
|
dev_dbg(adapter->dev, "AP EVENT: event id: %#x\n", eventcause);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
dev_dbg(adapter->dev, "event: unknown event id: %#x\n",
|
dev_dbg(adapter->dev, "event: unknown event id: %#x\n",
|
||||||
eventcause);
|
eventcause);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user