diff options
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 1327d424bf31..66f7ecf51b92 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -838,7 +838,7 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx) | |||
838 | if (rx->sdata->vif.type == NL80211_IFTYPE_ADHOC) { | 838 | if (rx->sdata->vif.type == NL80211_IFTYPE_ADHOC) { |
839 | u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len, | 839 | u8 *bssid = ieee80211_get_bssid(hdr, rx->skb->len, |
840 | NL80211_IFTYPE_ADHOC); | 840 | NL80211_IFTYPE_ADHOC); |
841 | if (compare_ether_addr(bssid, rx->sdata->u.sta.bssid) == 0) | 841 | if (compare_ether_addr(bssid, rx->sdata->u.ibss.bssid) == 0) |
842 | sta->last_rx = jiffies; | 842 | sta->last_rx = jiffies; |
843 | } else | 843 | } else |
844 | if (!is_multicast_ether_addr(hdr->addr1) || | 844 | if (!is_multicast_ether_addr(hdr->addr1) || |
@@ -1702,13 +1702,13 @@ static void ieee80211_process_sa_query_req(struct ieee80211_sub_if_data *sdata, | |||
1702 | return; | 1702 | return; |
1703 | } | 1703 | } |
1704 | 1704 | ||
1705 | if (compare_ether_addr(mgmt->sa, sdata->u.sta.bssid) != 0 || | 1705 | if (compare_ether_addr(mgmt->sa, sdata->u.mgd.bssid) != 0 || |
1706 | compare_ether_addr(mgmt->bssid, sdata->u.sta.bssid) != 0) { | 1706 | compare_ether_addr(mgmt->bssid, sdata->u.mgd.bssid) != 0) { |
1707 | /* Not from the current AP. */ | 1707 | /* Not from the current AP. */ |
1708 | return; | 1708 | return; |
1709 | } | 1709 | } |
1710 | 1710 | ||
1711 | if (sdata->u.sta.state == IEEE80211_STA_MLME_ASSOCIATE) { | 1711 | if (sdata->u.mgd.state == IEEE80211_STA_MLME_ASSOCIATE) { |
1712 | /* Association in progress; ignore SA Query */ | 1712 | /* Association in progress; ignore SA Query */ |
1713 | return; | 1713 | return; |
1714 | } | 1714 | } |
@@ -1727,7 +1727,7 @@ static void ieee80211_process_sa_query_req(struct ieee80211_sub_if_data *sdata, | |||
1727 | memset(resp, 0, 24); | 1727 | memset(resp, 0, 24); |
1728 | memcpy(resp->da, mgmt->sa, ETH_ALEN); | 1728 | memcpy(resp->da, mgmt->sa, ETH_ALEN); |
1729 | memcpy(resp->sa, sdata->dev->dev_addr, ETH_ALEN); | 1729 | memcpy(resp->sa, sdata->dev->dev_addr, ETH_ALEN); |
1730 | memcpy(resp->bssid, sdata->u.sta.bssid, ETH_ALEN); | 1730 | memcpy(resp->bssid, sdata->u.mgd.bssid, ETH_ALEN); |
1731 | resp->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 1731 | resp->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
1732 | IEEE80211_STYPE_ACTION); | 1732 | IEEE80211_STYPE_ACTION); |
1733 | skb_put(skb, 1 + sizeof(resp->u.action.u.sa_query)); | 1733 | skb_put(skb, 1 + sizeof(resp->u.action.u.sa_query)); |
@@ -1745,7 +1745,6 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx) | |||
1745 | { | 1745 | { |
1746 | struct ieee80211_local *local = rx->local; | 1746 | struct ieee80211_local *local = rx->local; |
1747 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev); | 1747 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev); |
1748 | struct ieee80211_if_sta *ifsta = &sdata->u.sta; | ||
1749 | struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; | 1748 | struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) rx->skb->data; |
1750 | struct ieee80211_bss *bss; | 1749 | struct ieee80211_bss *bss; |
1751 | int len = rx->skb->len; | 1750 | int len = rx->skb->len; |
@@ -1803,6 +1802,10 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx) | |||
1803 | case WLAN_CATEGORY_SPECTRUM_MGMT: | 1802 | case WLAN_CATEGORY_SPECTRUM_MGMT: |
1804 | if (local->hw.conf.channel->band != IEEE80211_BAND_5GHZ) | 1803 | if (local->hw.conf.channel->band != IEEE80211_BAND_5GHZ) |
1805 | return RX_DROP_MONITOR; | 1804 | return RX_DROP_MONITOR; |
1805 | |||
1806 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | ||
1807 | return RX_DROP_MONITOR; | ||
1808 | |||
1806 | switch (mgmt->u.action.u.measurement.action_code) { | 1809 | switch (mgmt->u.action.u.measurement.action_code) { |
1807 | case WLAN_ACTION_SPCT_MSR_REQ: | 1810 | case WLAN_ACTION_SPCT_MSR_REQ: |
1808 | if (len < (IEEE80211_MIN_ACTION_SIZE + | 1811 | if (len < (IEEE80211_MIN_ACTION_SIZE + |
@@ -1815,12 +1818,13 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx) | |||
1815 | sizeof(mgmt->u.action.u.chan_switch))) | 1818 | sizeof(mgmt->u.action.u.chan_switch))) |
1816 | return RX_DROP_MONITOR; | 1819 | return RX_DROP_MONITOR; |
1817 | 1820 | ||
1818 | if (memcmp(mgmt->bssid, ifsta->bssid, ETH_ALEN) != 0) | 1821 | if (memcmp(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN)) |
1819 | return RX_DROP_MONITOR; | 1822 | return RX_DROP_MONITOR; |
1820 | 1823 | ||
1821 | bss = ieee80211_rx_bss_get(local, ifsta->bssid, | 1824 | bss = ieee80211_rx_bss_get(local, sdata->u.mgd.bssid, |
1822 | local->hw.conf.channel->center_freq, | 1825 | local->hw.conf.channel->center_freq, |
1823 | ifsta->ssid, ifsta->ssid_len); | 1826 | sdata->u.mgd.ssid, |
1827 | sdata->u.mgd.ssid_len); | ||
1824 | if (!bss) | 1828 | if (!bss) |
1825 | return RX_DROP_MONITOR; | 1829 | return RX_DROP_MONITOR; |
1826 | 1830 | ||
@@ -1876,11 +1880,14 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx) | |||
1876 | sdata->vif.type != NL80211_IFTYPE_ADHOC) | 1880 | sdata->vif.type != NL80211_IFTYPE_ADHOC) |
1877 | return RX_DROP_MONITOR; | 1881 | return RX_DROP_MONITOR; |
1878 | 1882 | ||
1879 | if (sdata->flags & IEEE80211_SDATA_USERSPACE_MLME) | ||
1880 | return RX_DROP_MONITOR; | ||
1881 | 1883 | ||
1882 | ieee80211_sta_rx_mgmt(sdata, rx->skb, rx->status); | 1884 | if (sdata->vif.type == NL80211_IFTYPE_STATION) { |
1883 | return RX_QUEUED; | 1885 | if (sdata->flags & IEEE80211_SDATA_USERSPACE_MLME) |
1886 | return RX_DROP_MONITOR; | ||
1887 | return ieee80211_sta_rx_mgmt(sdata, rx->skb, rx->status); | ||
1888 | } | ||
1889 | |||
1890 | return ieee80211_ibss_rx_mgmt(sdata, rx->skb, rx->status); | ||
1884 | } | 1891 | } |
1885 | 1892 | ||
1886 | static void ieee80211_rx_michael_mic_report(struct net_device *dev, | 1893 | static void ieee80211_rx_michael_mic_report(struct net_device *dev, |
@@ -2083,7 +2090,7 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata, | |||
2083 | case NL80211_IFTYPE_STATION: | 2090 | case NL80211_IFTYPE_STATION: |
2084 | if (!bssid) | 2091 | if (!bssid) |
2085 | return 0; | 2092 | return 0; |
2086 | if (!ieee80211_bssid_match(bssid, sdata->u.sta.bssid)) { | 2093 | if (!ieee80211_bssid_match(bssid, sdata->u.mgd.bssid)) { |
2087 | if (!(rx->flags & IEEE80211_RX_IN_SCAN)) | 2094 | if (!(rx->flags & IEEE80211_RX_IN_SCAN)) |
2088 | return 0; | 2095 | return 0; |
2089 | rx->flags &= ~IEEE80211_RX_RA_MATCH; | 2096 | rx->flags &= ~IEEE80211_RX_RA_MATCH; |
@@ -2101,7 +2108,7 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata, | |||
2101 | if (ieee80211_is_beacon(hdr->frame_control)) { | 2108 | if (ieee80211_is_beacon(hdr->frame_control)) { |
2102 | return 1; | 2109 | return 1; |
2103 | } | 2110 | } |
2104 | else if (!ieee80211_bssid_match(bssid, sdata->u.sta.bssid)) { | 2111 | else if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) { |
2105 | if (!(rx->flags & IEEE80211_RX_IN_SCAN)) | 2112 | if (!(rx->flags & IEEE80211_RX_IN_SCAN)) |
2106 | return 0; | 2113 | return 0; |
2107 | rx->flags &= ~IEEE80211_RX_RA_MATCH; | 2114 | rx->flags &= ~IEEE80211_RX_RA_MATCH; |