diff options
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 66f7ecf51b92..64ebe664effc 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -142,6 +142,8 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, | |||
142 | /* IEEE80211_RADIOTAP_FLAGS */ | 142 | /* IEEE80211_RADIOTAP_FLAGS */ |
143 | if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS) | 143 | if (local->hw.flags & IEEE80211_HW_RX_INCLUDES_FCS) |
144 | *pos |= IEEE80211_RADIOTAP_F_FCS; | 144 | *pos |= IEEE80211_RADIOTAP_F_FCS; |
145 | if (status->flag & (RX_FLAG_FAILED_FCS_CRC | RX_FLAG_FAILED_PLCP_CRC)) | ||
146 | *pos |= IEEE80211_RADIOTAP_F_BADFCS; | ||
145 | if (status->flag & RX_FLAG_SHORTPRE) | 147 | if (status->flag & RX_FLAG_SHORTPRE) |
146 | *pos |= IEEE80211_RADIOTAP_F_SHORTPRE; | 148 | *pos |= IEEE80211_RADIOTAP_F_SHORTPRE; |
147 | pos++; | 149 | pos++; |
@@ -204,9 +206,8 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, | |||
204 | /* ensure 2 byte alignment for the 2 byte field as required */ | 206 | /* ensure 2 byte alignment for the 2 byte field as required */ |
205 | if ((pos - (unsigned char *)rthdr) & 1) | 207 | if ((pos - (unsigned char *)rthdr) & 1) |
206 | pos++; | 208 | pos++; |
207 | /* FIXME: when radiotap gets a 'bad PLCP' flag use it here */ | 209 | if (status->flag & RX_FLAG_FAILED_PLCP_CRC) |
208 | if (status->flag & (RX_FLAG_FAILED_FCS_CRC | RX_FLAG_FAILED_PLCP_CRC)) | 210 | *(__le16 *)pos |= cpu_to_le16(IEEE80211_RADIOTAP_F_RX_BADPLCP); |
209 | *(__le16 *)pos |= cpu_to_le16(IEEE80211_RADIOTAP_F_RX_BADFCS); | ||
210 | pos += 2; | 211 | pos += 2; |
211 | } | 212 | } |
212 | 213 | ||
@@ -849,12 +850,19 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx) | |||
849 | * Mesh beacons will update last_rx when if they are found to | 850 | * Mesh beacons will update last_rx when if they are found to |
850 | * match the current local configuration when processed. | 851 | * match the current local configuration when processed. |
851 | */ | 852 | */ |
852 | sta->last_rx = jiffies; | 853 | if (rx->sdata->vif.type == NL80211_IFTYPE_STATION && |
854 | ieee80211_is_beacon(hdr->frame_control)) { | ||
855 | rx->sdata->u.mgd.last_beacon = jiffies; | ||
856 | } else | ||
857 | sta->last_rx = jiffies; | ||
853 | } | 858 | } |
854 | 859 | ||
855 | if (!(rx->flags & IEEE80211_RX_RA_MATCH)) | 860 | if (!(rx->flags & IEEE80211_RX_RA_MATCH)) |
856 | return RX_CONTINUE; | 861 | return RX_CONTINUE; |
857 | 862 | ||
863 | if (rx->sdata->vif.type == NL80211_IFTYPE_STATION) | ||
864 | ieee80211_sta_rx_notify(rx->sdata, hdr); | ||
865 | |||
858 | sta->rx_fragments++; | 866 | sta->rx_fragments++; |
859 | sta->rx_bytes += rx->skb->len; | 867 | sta->rx_bytes += rx->skb->len; |
860 | sta->last_signal = rx->status->signal; | 868 | sta->last_signal = rx->status->signal; |
@@ -1876,18 +1884,13 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx) | |||
1876 | if (ieee80211_vif_is_mesh(&sdata->vif)) | 1884 | if (ieee80211_vif_is_mesh(&sdata->vif)) |
1877 | return ieee80211_mesh_rx_mgmt(sdata, rx->skb, rx->status); | 1885 | return ieee80211_mesh_rx_mgmt(sdata, rx->skb, rx->status); |
1878 | 1886 | ||
1879 | if (sdata->vif.type != NL80211_IFTYPE_STATION && | 1887 | if (sdata->vif.type == NL80211_IFTYPE_ADHOC) |
1880 | sdata->vif.type != NL80211_IFTYPE_ADHOC) | 1888 | return ieee80211_ibss_rx_mgmt(sdata, rx->skb, rx->status); |
1881 | return RX_DROP_MONITOR; | ||
1882 | |||
1883 | 1889 | ||
1884 | if (sdata->vif.type == NL80211_IFTYPE_STATION) { | 1890 | if (sdata->vif.type == NL80211_IFTYPE_STATION) |
1885 | if (sdata->flags & IEEE80211_SDATA_USERSPACE_MLME) | ||
1886 | return RX_DROP_MONITOR; | ||
1887 | return ieee80211_sta_rx_mgmt(sdata, rx->skb, rx->status); | 1891 | return ieee80211_sta_rx_mgmt(sdata, rx->skb, rx->status); |
1888 | } | ||
1889 | 1892 | ||
1890 | return ieee80211_ibss_rx_mgmt(sdata, rx->skb, rx->status); | 1893 | return RX_DROP_MONITOR; |
1891 | } | 1894 | } |
1892 | 1895 | ||
1893 | static void ieee80211_rx_michael_mic_report(struct net_device *dev, | 1896 | static void ieee80211_rx_michael_mic_report(struct net_device *dev, |