aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/mac80211/ibss.c26
-rw-r--r--net/mac80211/ieee80211_i.h4
-rw-r--r--net/mac80211/mesh.c25
-rw-r--r--net/mac80211/mesh.h2
-rw-r--r--net/mac80211/mlme.c27
-rw-r--r--net/mac80211/rx.c61
6 files changed, 48 insertions, 97 deletions
diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c
index 982690af1f61..bfd7286488c7 100644
--- a/net/mac80211/ibss.c
+++ b/net/mac80211/ibss.c
@@ -847,32 +847,6 @@ void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local)
847 mutex_unlock(&local->iflist_mtx); 847 mutex_unlock(&local->iflist_mtx);
848} 848}
849 849
850ieee80211_rx_result
851ieee80211_ibss_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb)
852{
853 struct ieee80211_local *local = sdata->local;
854 struct ieee80211_mgmt *mgmt;
855 u16 fc;
856
857 if (skb->len < 24)
858 return RX_DROP_MONITOR;
859
860 mgmt = (struct ieee80211_mgmt *) skb->data;
861 fc = le16_to_cpu(mgmt->frame_control);
862
863 switch (fc & IEEE80211_FCTL_STYPE) {
864 case IEEE80211_STYPE_PROBE_RESP:
865 case IEEE80211_STYPE_BEACON:
866 case IEEE80211_STYPE_PROBE_REQ:
867 case IEEE80211_STYPE_AUTH:
868 skb_queue_tail(&sdata->skb_queue, skb);
869 ieee80211_queue_work(&local->hw, &sdata->work);
870 return RX_QUEUED;
871 }
872
873 return RX_DROP_MONITOR;
874}
875
876int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata, 850int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
877 struct cfg80211_ibss_params *params) 851 struct cfg80211_ibss_params *params)
878{ 852{
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index f8c8f101592b..a3bcaa3239d9 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -981,8 +981,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
981int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, 981int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
982 struct cfg80211_disassoc_request *req, 982 struct cfg80211_disassoc_request *req,
983 void *cookie); 983 void *cookie);
984ieee80211_rx_result ieee80211_sta_rx_mgmt(struct ieee80211_sub_if_data *sdata,
985 struct sk_buff *skb);
986void ieee80211_send_pspoll(struct ieee80211_local *local, 984void ieee80211_send_pspoll(struct ieee80211_local *local,
987 struct ieee80211_sub_if_data *sdata); 985 struct ieee80211_sub_if_data *sdata);
988void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency); 986void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency);
@@ -1002,8 +1000,6 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
1002/* IBSS code */ 1000/* IBSS code */
1003void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local); 1001void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local);
1004void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata); 1002void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata);
1005ieee80211_rx_result
1006ieee80211_ibss_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb);
1007struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, 1003struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
1008 u8 *bssid, u8 *addr, u32 supp_rates, 1004 u8 *bssid, u8 *addr, u32 supp_rates,
1009 gfp_t gfp); 1005 gfp_t gfp);
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
index 83b346cc4860..c8a4f19ed13b 100644
--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -702,28 +702,3 @@ void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
702 INIT_LIST_HEAD(&ifmsh->preq_queue.list); 702 INIT_LIST_HEAD(&ifmsh->preq_queue.list);
703 spin_lock_init(&ifmsh->mesh_preq_queue_lock); 703 spin_lock_init(&ifmsh->mesh_preq_queue_lock);
704} 704}
705
706ieee80211_rx_result
707ieee80211_mesh_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb)
708{
709 struct ieee80211_local *local = sdata->local;
710 struct ieee80211_mgmt *mgmt;
711 u16 fc;
712
713 if (skb->len < 24)
714 return RX_DROP_MONITOR;
715
716 mgmt = (struct ieee80211_mgmt *) skb->data;
717 fc = le16_to_cpu(mgmt->frame_control);
718
719 switch (fc & IEEE80211_FCTL_STYPE) {
720 case IEEE80211_STYPE_ACTION:
721 case IEEE80211_STYPE_PROBE_RESP:
722 case IEEE80211_STYPE_BEACON:
723 skb_queue_tail(&sdata->skb_queue, skb);
724 ieee80211_queue_work(&local->hw, &sdata->work);
725 return RX_QUEUED;
726 }
727
728 return RX_CONTINUE;
729}
diff --git a/net/mac80211/mesh.h b/net/mac80211/mesh.h
index c88087f1cd0f..ebd3f1d9d889 100644
--- a/net/mac80211/mesh.h
+++ b/net/mac80211/mesh.h
@@ -237,8 +237,6 @@ void ieee80211s_update_metric(struct ieee80211_local *local,
237 struct sta_info *stainfo, struct sk_buff *skb); 237 struct sta_info *stainfo, struct sk_buff *skb);
238void ieee80211s_stop(void); 238void ieee80211s_stop(void);
239void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata); 239void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata);
240ieee80211_rx_result
241ieee80211_mesh_rx_mgmt(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb);
242void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata); 240void ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata);
243void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata); 241void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata);
244void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh); 242void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh);
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 4a5b29dac9d0..036f1bfa7b05 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -1633,33 +1633,6 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
1633 ieee80211_bss_info_change_notify(sdata, changed); 1633 ieee80211_bss_info_change_notify(sdata, changed);
1634} 1634}
1635 1635
1636ieee80211_rx_result ieee80211_sta_rx_mgmt(struct ieee80211_sub_if_data *sdata,
1637 struct sk_buff *skb)
1638{
1639 struct ieee80211_local *local = sdata->local;
1640 struct ieee80211_mgmt *mgmt;
1641 u16 fc;
1642
1643 if (skb->len < 24)
1644 return RX_DROP_MONITOR;
1645
1646 mgmt = (struct ieee80211_mgmt *) skb->data;
1647 fc = le16_to_cpu(mgmt->frame_control);
1648
1649 switch (fc & IEEE80211_FCTL_STYPE) {
1650 case IEEE80211_STYPE_PROBE_RESP:
1651 case IEEE80211_STYPE_BEACON:
1652 case IEEE80211_STYPE_DEAUTH:
1653 case IEEE80211_STYPE_DISASSOC:
1654 case IEEE80211_STYPE_ACTION:
1655 skb_queue_tail(&sdata->skb_queue, skb);
1656 ieee80211_queue_work(&local->hw, &sdata->work);
1657 return RX_QUEUED;
1658 }
1659
1660 return RX_DROP_MONITOR;
1661}
1662
1663void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata, 1636void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
1664 struct sk_buff *skb) 1637 struct sk_buff *skb)
1665{ 1638{
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 3adcda502b7d..40fe2798cbf5 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1950,8 +1950,11 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
1950 if (len < IEEE80211_MIN_ACTION_SIZE + 1) 1950 if (len < IEEE80211_MIN_ACTION_SIZE + 1)
1951 break; 1951 break;
1952 1952
1953 if (sdata->vif.type == NL80211_IFTYPE_STATION) 1953 if (sdata->vif.type == NL80211_IFTYPE_STATION) {
1954 return ieee80211_sta_rx_mgmt(sdata, rx->skb); 1954 skb_queue_tail(&sdata->skb_queue, rx->skb);
1955 ieee80211_queue_work(&local->hw, &sdata->work);
1956 return RX_QUEUED;
1957 }
1955 1958
1956 switch (mgmt->u.action.u.addba_req.action_code) { 1959 switch (mgmt->u.action.u.addba_req.action_code) {
1957 case WLAN_ACTION_ADDBA_REQ: 1960 case WLAN_ACTION_ADDBA_REQ:
@@ -2003,7 +2006,9 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
2003 if (memcmp(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN)) 2006 if (memcmp(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN))
2004 break; 2007 break;
2005 2008
2006 return ieee80211_sta_rx_mgmt(sdata, rx->skb); 2009 skb_queue_tail(&sdata->skb_queue, rx->skb);
2010 ieee80211_queue_work(&local->hw, &sdata->work);
2011 return RX_QUEUED;
2007 } 2012 }
2008 break; 2013 break;
2009 case WLAN_CATEGORY_SA_QUERY: 2014 case WLAN_CATEGORY_SA_QUERY:
@@ -2021,9 +2026,11 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
2021 break; 2026 break;
2022 case WLAN_CATEGORY_MESH_PLINK: 2027 case WLAN_CATEGORY_MESH_PLINK:
2023 case WLAN_CATEGORY_MESH_PATH_SEL: 2028 case WLAN_CATEGORY_MESH_PATH_SEL:
2024 if (ieee80211_vif_is_mesh(&sdata->vif)) 2029 if (!ieee80211_vif_is_mesh(&sdata->vif))
2025 return ieee80211_mesh_rx_mgmt(sdata, rx->skb); 2030 break;
2026 break; 2031 skb_queue_tail(&sdata->skb_queue, rx->skb);
2032 ieee80211_queue_work(&local->hw, &sdata->work);
2033 return RX_QUEUED;
2027 } 2034 }
2028 2035
2029 /* 2036 /*
@@ -2080,10 +2087,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
2080{ 2087{
2081 struct ieee80211_sub_if_data *sdata = rx->sdata; 2088 struct ieee80211_sub_if_data *sdata = rx->sdata;
2082 ieee80211_rx_result rxs; 2089 ieee80211_rx_result rxs;
2090 struct ieee80211_mgmt *mgmt = (void *)rx->skb->data;
2091 __le16 stype;
2083 2092
2084 if (!(rx->flags & IEEE80211_RX_RA_MATCH)) 2093 if (!(rx->flags & IEEE80211_RX_RA_MATCH))
2085 return RX_DROP_MONITOR; 2094 return RX_DROP_MONITOR;
2086 2095
2096 if (rx->skb->len < 24)
2097 return RX_DROP_MONITOR;
2098
2087 if (ieee80211_drop_unencrypted_mgmt(rx)) 2099 if (ieee80211_drop_unencrypted_mgmt(rx))
2088 return RX_DROP_UNUSABLE; 2100 return RX_DROP_UNUSABLE;
2089 2101
@@ -2091,16 +2103,39 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
2091 if (rxs != RX_CONTINUE) 2103 if (rxs != RX_CONTINUE)
2092 return rxs; 2104 return rxs;
2093 2105
2094 if (ieee80211_vif_is_mesh(&sdata->vif)) 2106 stype = mgmt->frame_control & cpu_to_le16(IEEE80211_FCTL_STYPE);
2095 return ieee80211_mesh_rx_mgmt(sdata, rx->skb);
2096 2107
2097 if (sdata->vif.type == NL80211_IFTYPE_ADHOC) 2108 if (!ieee80211_vif_is_mesh(&sdata->vif) &&
2098 return ieee80211_ibss_rx_mgmt(sdata, rx->skb); 2109 sdata->vif.type != NL80211_IFTYPE_ADHOC &&
2110 sdata->vif.type != NL80211_IFTYPE_STATION)
2111 return RX_DROP_MONITOR;
2099 2112
2100 if (sdata->vif.type == NL80211_IFTYPE_STATION) 2113 switch (stype) {
2101 return ieee80211_sta_rx_mgmt(sdata, rx->skb); 2114 case cpu_to_le16(IEEE80211_STYPE_BEACON):
2115 case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP):
2116 /* process for all: mesh, mlme, ibss */
2117 break;
2118 case cpu_to_le16(IEEE80211_STYPE_DEAUTH):
2119 case cpu_to_le16(IEEE80211_STYPE_DISASSOC):
2120 /* process only for station */
2121 if (sdata->vif.type != NL80211_IFTYPE_STATION)
2122 return RX_DROP_MONITOR;
2123 break;
2124 case cpu_to_le16(IEEE80211_STYPE_PROBE_REQ):
2125 case cpu_to_le16(IEEE80211_STYPE_AUTH):
2126 /* process only for ibss */
2127 if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
2128 return RX_DROP_MONITOR;
2129 break;
2130 default:
2131 return RX_DROP_MONITOR;
2132 }
2102 2133
2103 return RX_DROP_MONITOR; 2134 /* queue up frame and kick off work to process it */
2135 skb_queue_tail(&sdata->skb_queue, rx->skb);
2136 ieee80211_queue_work(&rx->local->hw, &sdata->work);
2137
2138 return RX_QUEUED;
2104} 2139}
2105 2140
2106static void ieee80211_rx_michael_mic_report(struct ieee80211_hdr *hdr, 2141static void ieee80211_rx_michael_mic_report(struct ieee80211_hdr *hdr,