aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/rx.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2008-01-24 13:38:38 -0500
committerJohn W. Linville <linville@tuxdriver.com>2008-02-29 15:19:32 -0500
commit8318d78a44d49ac1edf2bdec7299de3617c4232e (patch)
treed434634418edd7399737801615d247be06616fdd /net/mac80211/rx.c
parent10b6b80145cc93887dd8aab99bfffa375e9add31 (diff)
cfg80211 API for channels/bitrates, mac80211 and driver conversion
This patch creates new cfg80211 wiphy API for channel and bitrate registration and converts mac80211 and drivers to the new API. The old mac80211 API is completely ripped out. All drivers (except ath5k) are updated to the new API, in many cases I expect that optimisations can be done. Along with the regulatory code I've also ripped out the IEEE80211_HW_DEFAULT_REG_DOMAIN_CONFIGURED flag, I believe it to be unnecessary if the hardware simply gives us whatever channels it wants to support and we then enable/disable them as required, which is pretty much required for travelling. Additionally, the patch adds proper "basic" rate handling for STA mode interface, AP mode interface will have to have new API added to allow userspace to set the basic rate set, currently it'll be empty... However, the basic rate handling will need to be moved to the BSS conf stuff. I do expect there to be bugs in this, especially wrt. transmit power handling where I'm basically clueless about how it should work. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r--net/mac80211/rx.c82
1 files changed, 47 insertions, 35 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 3aae8e9e4e0a..c9ff98a93211 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -82,10 +82,10 @@ static inline int should_drop_frame(struct ieee80211_rx_status *status,
82 */ 82 */
83static struct sk_buff * 83static struct sk_buff *
84ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb, 84ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,
85 struct ieee80211_rx_status *status) 85 struct ieee80211_rx_status *status,
86 struct ieee80211_rate *rate)
86{ 87{
87 struct ieee80211_sub_if_data *sdata; 88 struct ieee80211_sub_if_data *sdata;
88 struct ieee80211_rate *rate;
89 int needed_headroom = 0; 89 int needed_headroom = 0;
90 struct ieee80211_radiotap_header *rthdr; 90 struct ieee80211_radiotap_header *rthdr;
91 __le64 *rttsft = NULL; 91 __le64 *rttsft = NULL;
@@ -194,14 +194,11 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,
194 rtfixed->rx_flags |= 194 rtfixed->rx_flags |=
195 cpu_to_le16(IEEE80211_RADIOTAP_F_RX_BADFCS); 195 cpu_to_le16(IEEE80211_RADIOTAP_F_RX_BADFCS);
196 196
197 rate = ieee80211_get_rate(local, status->phymode, 197 rtfixed->rate = rate->bitrate / 5;
198 status->rate);
199 if (rate)
200 rtfixed->rate = rate->rate / 5;
201 198
202 rtfixed->chan_freq = cpu_to_le16(status->freq); 199 rtfixed->chan_freq = cpu_to_le16(status->freq);
203 200
204 if (status->phymode == MODE_IEEE80211A) 201 if (status->band == IEEE80211_BAND_5GHZ)
205 rtfixed->chan_flags = 202 rtfixed->chan_flags =
206 cpu_to_le16(IEEE80211_CHAN_OFDM | 203 cpu_to_le16(IEEE80211_CHAN_OFDM |
207 IEEE80211_CHAN_5GHZ); 204 IEEE80211_CHAN_5GHZ);
@@ -320,34 +317,21 @@ static void ieee80211_verify_ip_alignment(struct ieee80211_txrx_data *rx)
320 317
321 318
322static u32 ieee80211_rx_load_stats(struct ieee80211_local *local, 319static u32 ieee80211_rx_load_stats(struct ieee80211_local *local,
323 struct sk_buff *skb, 320 struct sk_buff *skb,
324 struct ieee80211_rx_status *status) 321 struct ieee80211_rx_status *status,
322 struct ieee80211_rate *rate)
325{ 323{
326 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; 324 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
327 u32 load = 0, hdrtime; 325 u32 load = 0, hdrtime;
328 struct ieee80211_rate *rate;
329 struct ieee80211_hw_mode *mode = local->hw.conf.mode;
330 int i;
331 326
332 /* Estimate total channel use caused by this frame */ 327 /* Estimate total channel use caused by this frame */
333 328
334 if (unlikely(mode->num_rates < 0))
335 return TXRX_CONTINUE;
336
337 rate = &mode->rates[0];
338 for (i = 0; i < mode->num_rates; i++) {
339 if (mode->rates[i].val == status->rate) {
340 rate = &mode->rates[i];
341 break;
342 }
343 }
344
345 /* 1 bit at 1 Mbit/s takes 1 usec; in channel_use values, 329 /* 1 bit at 1 Mbit/s takes 1 usec; in channel_use values,
346 * 1 usec = 1/8 * (1080 / 10) = 13.5 */ 330 * 1 usec = 1/8 * (1080 / 10) = 13.5 */
347 331
348 if (mode->mode == MODE_IEEE80211A || 332 if (status->band == IEEE80211_BAND_5GHZ ||
349 (mode->mode == MODE_IEEE80211G && 333 (status->band == IEEE80211_BAND_5GHZ &&
350 rate->flags & IEEE80211_RATE_ERP)) 334 rate->flags & IEEE80211_RATE_ERP_G))
351 hdrtime = CHAN_UTIL_HDR_SHORT; 335 hdrtime = CHAN_UTIL_HDR_SHORT;
352 else 336 else
353 hdrtime = CHAN_UTIL_HDR_LONG; 337 hdrtime = CHAN_UTIL_HDR_LONG;
@@ -356,7 +340,8 @@ static u32 ieee80211_rx_load_stats(struct ieee80211_local *local,
356 if (!is_multicast_ether_addr(hdr->addr1)) 340 if (!is_multicast_ether_addr(hdr->addr1))
357 load += hdrtime; 341 load += hdrtime;
358 342
359 load += skb->len * rate->rate_inv; 343 /* TODO: optimise again */
344 load += skb->len * CHAN_UTIL_RATE_LCM / rate->bitrate;
360 345
361 /* Divide channel_use by 8 to avoid wrapping around the counter */ 346 /* Divide channel_use by 8 to avoid wrapping around the counter */
362 load >>= CHAN_UTIL_SHIFT; 347 load >>= CHAN_UTIL_SHIFT;
@@ -1685,7 +1670,8 @@ static int prepare_for_handlers(struct ieee80211_sub_if_data *sdata,
1685static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, 1670static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
1686 struct sk_buff *skb, 1671 struct sk_buff *skb,
1687 struct ieee80211_rx_status *status, 1672 struct ieee80211_rx_status *status,
1688 u32 load) 1673 u32 load,
1674 struct ieee80211_rate *rate)
1689{ 1675{
1690 struct ieee80211_local *local = hw_to_local(hw); 1676 struct ieee80211_local *local = hw_to_local(hw);
1691 struct ieee80211_sub_if_data *sdata; 1677 struct ieee80211_sub_if_data *sdata;
@@ -1705,6 +1691,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
1705 1691
1706 rx.u.rx.status = status; 1692 rx.u.rx.status = status;
1707 rx.u.rx.load = load; 1693 rx.u.rx.load = load;
1694 rx.u.rx.rate = rate;
1708 rx.fc = le16_to_cpu(hdr->frame_control); 1695 rx.fc = le16_to_cpu(hdr->frame_control);
1709 type = rx.fc & IEEE80211_FCTL_FTYPE; 1696 type = rx.fc & IEEE80211_FCTL_FTYPE;
1710 1697
@@ -1837,6 +1824,8 @@ u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
1837 u16 head_seq_num, buf_size; 1824 u16 head_seq_num, buf_size;
1838 int index; 1825 int index;
1839 u32 pkt_load; 1826 u32 pkt_load;
1827 struct ieee80211_supported_band *sband;
1828 struct ieee80211_rate *rate;
1840 1829
1841 buf_size = tid_agg_rx->buf_size; 1830 buf_size = tid_agg_rx->buf_size;
1842 head_seq_num = tid_agg_rx->head_seq_num; 1831 head_seq_num = tid_agg_rx->head_seq_num;
@@ -1867,12 +1856,14 @@ u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
1867 memcpy(&status, 1856 memcpy(&status,
1868 tid_agg_rx->reorder_buf[index]->cb, 1857 tid_agg_rx->reorder_buf[index]->cb,
1869 sizeof(status)); 1858 sizeof(status));
1859 sband = local->hw.wiphy->bands[status.band];
1860 rate = &sband->bitrates[status.rate_idx];
1870 pkt_load = ieee80211_rx_load_stats(local, 1861 pkt_load = ieee80211_rx_load_stats(local,
1871 tid_agg_rx->reorder_buf[index], 1862 tid_agg_rx->reorder_buf[index],
1872 &status); 1863 &status, rate);
1873 __ieee80211_rx_handle_packet(hw, 1864 __ieee80211_rx_handle_packet(hw,
1874 tid_agg_rx->reorder_buf[index], 1865 tid_agg_rx->reorder_buf[index],
1875 &status, pkt_load); 1866 &status, pkt_load, rate);
1876 tid_agg_rx->stored_mpdu_num--; 1867 tid_agg_rx->stored_mpdu_num--;
1877 tid_agg_rx->reorder_buf[index] = NULL; 1868 tid_agg_rx->reorder_buf[index] = NULL;
1878 } 1869 }
@@ -1912,11 +1903,13 @@ u8 ieee80211_sta_manage_reorder_buf(struct ieee80211_hw *hw,
1912 /* release the reordered frame back to stack */ 1903 /* release the reordered frame back to stack */
1913 memcpy(&status, tid_agg_rx->reorder_buf[index]->cb, 1904 memcpy(&status, tid_agg_rx->reorder_buf[index]->cb,
1914 sizeof(status)); 1905 sizeof(status));
1906 sband = local->hw.wiphy->bands[status.band];
1907 rate = &sband->bitrates[status.rate_idx];
1915 pkt_load = ieee80211_rx_load_stats(local, 1908 pkt_load = ieee80211_rx_load_stats(local,
1916 tid_agg_rx->reorder_buf[index], 1909 tid_agg_rx->reorder_buf[index],
1917 &status); 1910 &status, rate);
1918 __ieee80211_rx_handle_packet(hw, tid_agg_rx->reorder_buf[index], 1911 __ieee80211_rx_handle_packet(hw, tid_agg_rx->reorder_buf[index],
1919 &status, pkt_load); 1912 &status, pkt_load, rate);
1920 tid_agg_rx->stored_mpdu_num--; 1913 tid_agg_rx->stored_mpdu_num--;
1921 tid_agg_rx->reorder_buf[index] = NULL; 1914 tid_agg_rx->reorder_buf[index] = NULL;
1922 tid_agg_rx->head_seq_num = seq_inc(tid_agg_rx->head_seq_num); 1915 tid_agg_rx->head_seq_num = seq_inc(tid_agg_rx->head_seq_num);
@@ -1997,6 +1990,25 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
1997{ 1990{
1998 struct ieee80211_local *local = hw_to_local(hw); 1991 struct ieee80211_local *local = hw_to_local(hw);
1999 u32 pkt_load; 1992 u32 pkt_load;
1993 struct ieee80211_rate *rate = NULL;
1994 struct ieee80211_supported_band *sband;
1995
1996 if (status->band < 0 ||
1997 status->band > IEEE80211_NUM_BANDS) {
1998 WARN_ON(1);
1999 return;
2000 }
2001
2002 sband = local->hw.wiphy->bands[status->band];
2003
2004 if (!sband ||
2005 status->rate_idx < 0 ||
2006 status->rate_idx >= sband->n_bitrates) {
2007 WARN_ON(1);
2008 return;
2009 }
2010
2011 rate = &sband->bitrates[status->rate_idx];
2000 2012
2001 /* 2013 /*
2002 * key references and virtual interfaces are protected using RCU 2014 * key references and virtual interfaces are protected using RCU
@@ -2011,17 +2023,17 @@ void __ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb,
2011 * if it was previously present. 2023 * if it was previously present.
2012 * Also, frames with less than 16 bytes are dropped. 2024 * Also, frames with less than 16 bytes are dropped.
2013 */ 2025 */
2014 skb = ieee80211_rx_monitor(local, skb, status); 2026 skb = ieee80211_rx_monitor(local, skb, status, rate);
2015 if (!skb) { 2027 if (!skb) {
2016 rcu_read_unlock(); 2028 rcu_read_unlock();
2017 return; 2029 return;
2018 } 2030 }
2019 2031
2020 pkt_load = ieee80211_rx_load_stats(local, skb, status); 2032 pkt_load = ieee80211_rx_load_stats(local, skb, status, rate);
2021 local->channel_use_raw += pkt_load; 2033 local->channel_use_raw += pkt_load;
2022 2034
2023 if (!ieee80211_rx_reorder_ampdu(local, skb)) 2035 if (!ieee80211_rx_reorder_ampdu(local, skb))
2024 __ieee80211_rx_handle_packet(hw, skb, status, pkt_load); 2036 __ieee80211_rx_handle_packet(hw, skb, status, pkt_load, rate);
2025 2037
2026 rcu_read_unlock(); 2038 rcu_read_unlock();
2027} 2039}