diff options
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 904aaea081c8..e0cb3357f79c 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -163,6 +163,9 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local, | |||
163 | if (status->band == IEEE80211_BAND_5GHZ) | 163 | if (status->band == IEEE80211_BAND_5GHZ) |
164 | put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ, | 164 | put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_5GHZ, |
165 | pos); | 165 | pos); |
166 | else if (status->flag & RX_FLAG_HT) | ||
167 | put_unaligned_le16(IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ, | ||
168 | pos); | ||
166 | else if (rate->flags & IEEE80211_RATE_ERP_G) | 169 | else if (rate->flags & IEEE80211_RATE_ERP_G) |
167 | put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ, | 170 | put_unaligned_le16(IEEE80211_CHAN_OFDM | IEEE80211_CHAN_2GHZ, |
168 | pos); | 171 | pos); |
@@ -1845,14 +1848,15 @@ static void ieee80211_rx_michael_mic_report(struct ieee80211_hdr *hdr, | |||
1845 | } | 1848 | } |
1846 | 1849 | ||
1847 | /* TODO: use IEEE80211_RX_FRAGMENTED */ | 1850 | /* TODO: use IEEE80211_RX_FRAGMENTED */ |
1848 | static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx) | 1851 | static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx, |
1852 | struct ieee80211_rate *rate) | ||
1849 | { | 1853 | { |
1850 | struct ieee80211_sub_if_data *sdata; | 1854 | struct ieee80211_sub_if_data *sdata; |
1851 | struct ieee80211_local *local = rx->local; | 1855 | struct ieee80211_local *local = rx->local; |
1852 | struct ieee80211_rtap_hdr { | 1856 | struct ieee80211_rtap_hdr { |
1853 | struct ieee80211_radiotap_header hdr; | 1857 | struct ieee80211_radiotap_header hdr; |
1854 | u8 flags; | 1858 | u8 flags; |
1855 | u8 rate; | 1859 | u8 rate_or_pad; |
1856 | __le16 chan_freq; | 1860 | __le16 chan_freq; |
1857 | __le16 chan_flags; | 1861 | __le16 chan_flags; |
1858 | } __attribute__ ((packed)) *rthdr; | 1862 | } __attribute__ ((packed)) *rthdr; |
@@ -1872,10 +1876,13 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx) | |||
1872 | rthdr->hdr.it_len = cpu_to_le16(sizeof(*rthdr)); | 1876 | rthdr->hdr.it_len = cpu_to_le16(sizeof(*rthdr)); |
1873 | rthdr->hdr.it_present = | 1877 | rthdr->hdr.it_present = |
1874 | cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | | 1878 | cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | |
1875 | (1 << IEEE80211_RADIOTAP_RATE) | | ||
1876 | (1 << IEEE80211_RADIOTAP_CHANNEL)); | 1879 | (1 << IEEE80211_RADIOTAP_CHANNEL)); |
1877 | 1880 | ||
1878 | rthdr->rate = rx->rate->bitrate / 5; | 1881 | if (rate) { |
1882 | rthdr->rate_or_pad = rate->bitrate / 5; | ||
1883 | rthdr->hdr.it_present |= | ||
1884 | cpu_to_le32(1 << IEEE80211_RADIOTAP_RATE); | ||
1885 | } | ||
1879 | rthdr->chan_freq = cpu_to_le16(status->freq); | 1886 | rthdr->chan_freq = cpu_to_le16(status->freq); |
1880 | 1887 | ||
1881 | if (status->band == IEEE80211_BAND_5GHZ) | 1888 | if (status->band == IEEE80211_BAND_5GHZ) |
@@ -1928,7 +1935,8 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx) | |||
1928 | 1935 | ||
1929 | static void ieee80211_invoke_rx_handlers(struct ieee80211_sub_if_data *sdata, | 1936 | static void ieee80211_invoke_rx_handlers(struct ieee80211_sub_if_data *sdata, |
1930 | struct ieee80211_rx_data *rx, | 1937 | struct ieee80211_rx_data *rx, |
1931 | struct sk_buff *skb) | 1938 | struct sk_buff *skb, |
1939 | struct ieee80211_rate *rate) | ||
1932 | { | 1940 | { |
1933 | ieee80211_rx_result res = RX_DROP_MONITOR; | 1941 | ieee80211_rx_result res = RX_DROP_MONITOR; |
1934 | 1942 | ||
@@ -1972,7 +1980,7 @@ static void ieee80211_invoke_rx_handlers(struct ieee80211_sub_if_data *sdata, | |||
1972 | rx->sta->rx_dropped++; | 1980 | rx->sta->rx_dropped++; |
1973 | /* fall through */ | 1981 | /* fall through */ |
1974 | case RX_CONTINUE: | 1982 | case RX_CONTINUE: |
1975 | ieee80211_rx_cooked_monitor(rx); | 1983 | ieee80211_rx_cooked_monitor(rx, rate); |
1976 | break; | 1984 | break; |
1977 | case RX_DROP_UNUSABLE: | 1985 | case RX_DROP_UNUSABLE: |
1978 | I802_DEBUG_INC(sdata->local->rx_handlers_drop); | 1986 | I802_DEBUG_INC(sdata->local->rx_handlers_drop); |
@@ -2095,7 +2103,6 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, | |||
2095 | memset(&rx, 0, sizeof(rx)); | 2103 | memset(&rx, 0, sizeof(rx)); |
2096 | rx.skb = skb; | 2104 | rx.skb = skb; |
2097 | rx.local = local; | 2105 | rx.local = local; |
2098 | rx.rate = rate; | ||
2099 | 2106 | ||
2100 | if (ieee80211_is_data(hdr->frame_control) || ieee80211_is_mgmt(hdr->frame_control)) | 2107 | if (ieee80211_is_data(hdr->frame_control) || ieee80211_is_mgmt(hdr->frame_control)) |
2101 | local->dot11ReceivedFragmentCount++; | 2108 | local->dot11ReceivedFragmentCount++; |
@@ -2167,11 +2174,11 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, | |||
2167 | prev->dev->name); | 2174 | prev->dev->name); |
2168 | continue; | 2175 | continue; |
2169 | } | 2176 | } |
2170 | ieee80211_invoke_rx_handlers(prev, &rx, skb_new); | 2177 | ieee80211_invoke_rx_handlers(prev, &rx, skb_new, rate); |
2171 | prev = sdata; | 2178 | prev = sdata; |
2172 | } | 2179 | } |
2173 | if (prev) | 2180 | if (prev) |
2174 | ieee80211_invoke_rx_handlers(prev, &rx, skb); | 2181 | ieee80211_invoke_rx_handlers(prev, &rx, skb, rate); |
2175 | else | 2182 | else |
2176 | dev_kfree_skb(skb); | 2183 | dev_kfree_skb(skb); |
2177 | } | 2184 | } |
@@ -2200,7 +2207,7 @@ static void ieee80211_release_reorder_frame(struct ieee80211_hw *hw, | |||
2200 | int index) | 2207 | int index) |
2201 | { | 2208 | { |
2202 | struct ieee80211_supported_band *sband; | 2209 | struct ieee80211_supported_band *sband; |
2203 | struct ieee80211_rate *rate; | 2210 | struct ieee80211_rate *rate = NULL; |
2204 | struct sk_buff *skb = tid_agg_rx->reorder_buf[index]; | 2211 | struct sk_buff *skb = tid_agg_rx->reorder_buf[index]; |
2205 | struct ieee80211_rx_status *status; | 2212 | struct ieee80211_rx_status *status; |
2206 | 2213 | ||
@@ -2211,9 +2218,7 @@ static void ieee80211_release_reorder_frame(struct ieee80211_hw *hw, | |||
2211 | 2218 | ||
2212 | /* release the reordered frames to stack */ | 2219 | /* release the reordered frames to stack */ |
2213 | sband = hw->wiphy->bands[status->band]; | 2220 | sband = hw->wiphy->bands[status->band]; |
2214 | if (status->flag & RX_FLAG_HT) | 2221 | if (!(status->flag & RX_FLAG_HT)) |
2215 | rate = sband->bitrates; /* TODO: HT rates */ | ||
2216 | else | ||
2217 | rate = &sband->bitrates[status->rate_idx]; | 2222 | rate = &sband->bitrates[status->rate_idx]; |
2218 | __ieee80211_rx_handle_packet(hw, skb, rate); | 2223 | __ieee80211_rx_handle_packet(hw, skb, rate); |
2219 | tid_agg_rx->stored_mpdu_num--; | 2224 | tid_agg_rx->stored_mpdu_num--; |
@@ -2460,10 +2465,6 @@ void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
2460 | status->rate_idx, | 2465 | status->rate_idx, |
2461 | status->rate_idx)) | 2466 | status->rate_idx)) |
2462 | goto drop; | 2467 | goto drop; |
2463 | /* HT rates are not in the table - use the highest legacy rate | ||
2464 | * for now since other parts of mac80211 may not yet be fully | ||
2465 | * MCS aware. */ | ||
2466 | rate = &sband->bitrates[sband->n_bitrates - 1]; | ||
2467 | } else { | 2468 | } else { |
2468 | if (WARN_ON(status->rate_idx < 0 || | 2469 | if (WARN_ON(status->rate_idx < 0 || |
2469 | status->rate_idx >= sband->n_bitrates)) | 2470 | status->rate_idx >= sband->n_bitrates)) |