mac80211: add rx status flag for short preamble
Subsystems (2)
PATCH 1/3 mac80211: add rx status flag for short preamble
and use it for the radiotap header
Signed-off-by Bruno Randolf <[email protected]>
---
include/net/mac80211.h | 2 ++ net/mac80211/rx.c | 2 ++ 2 files changed, 4 insertions(+), 0 deletions(-)
include/net/mac80211.h +2 -0
@@ -367,6 +367,7 @@ static inline struct ieee80211_tx_info *IEEE80211_SKB_CB(struct sk_buff *skb)* @RX_FLAG_TSFT: The timestamp passed in the RX status (@mactime field) * is valid. This is useful in monitor mode and necessary for beacon frames * to enable IBSS merging. +* @RX_FLAG_SHORTPRE: Short preamble was used for this frame */ enum mac80211_rx_flags {RX_FLAG_MMIC_ERROR =1 <<0 ,
@@ -377,6 +378,7 @@ enum mac80211_rx_flags {RX_FLAG_FAILED_FCS_CRC =1 <<5 ,RX_FLAG_FAILED_PLCP_CRC =1 <<6 ,RX_FLAG_TSFT =1 <<7 , + RX_FLAG_SHORTPRE = 1<<8 };/**
net/mac80211/rx.c +2 -0
@@ -143,6 +143,8 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,/* IEEE80211_RADIOTAP_FLAGS */ if (local->hw.flags &IEEE80211_HW_RX_INCLUDES_FCS ) *pos |=IEEE80211_RADIOTAP_F_FCS ; +if (status->flag &RX_FLAG_SHORTPRE ) + *pos |=IEEE80211_RADIOTAP_F_SHORTPRE ; pos++;/* IEEE80211_RADIOTAP_RATE */
PATCH 2/3 mac80211: radiotap: assume modulation from rates
use the rates ERP flag to derive CCK or OFDM modulation for the radiotap header.
(it might be more correct to get this information from the hardware itself, but it seems safe to assume this in most practical cases.)
Signed-off-by Bruno Randolf <[email protected]>
---
net/mac80211/rx.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-)
net/mac80211/rx.c +4 -1
@@ -157,8 +157,11 @@ ieee80211_add_rx_radiotap_header(struct ieee80211_local *local,if (status->band ==IEEE80211_BAND_5GHZ ) *(__le16 *)pos =cpu_to_le16 (IEEE80211_CHAN_OFDM |IEEE80211_CHAN_5GHZ ); +else if (rate->flags &IEEE80211_RATE_ERP_G ) + *(__le16 *)pos =cpu_to_le16 (IEEE80211_CHAN_OFDM | +IEEE80211_CHAN_2GHZ );else - *(__le16 *)pos =cpu_to_le16 (IEEE80211_CHAN_DYN | + *(__le16 *)pos =cpu_to_le16 (IEEE80211_CHAN_CCK |IEEE80211_CHAN_2GHZ ); pos +=2 ;
PATCH 3/3 iwlwifi: use generic mac80211 radiotap headers
In reply to Bruno Randolfremove drivers own implementation of radiotap in favor of the generic one provided by mac80211.
also remove priv->add_radiotap because it is not used any more.
Signed-off-by Bruno Randolf <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-3945.c | 104 +--------------------- drivers/net/wireless/iwlwifi/iwl-3945.h | 1 drivers/net/wireless/iwlwifi/iwl-dev.h | 1 drivers/net/wireless/iwlwifi/iwl-rx.c | 129 ++++----------------------- drivers/net/wireless/iwlwifi/iwl3945-base.c | 2 drivers/net/wireless/iwlwifi/iwl4965-base.c | 2 6 files changed, 27 insertions(+), 212 deletions(-)
drivers/net/wireless/iwlwifi/iwl-3945.c +7 -97
@@ -532,99 +532,6 @@ static int iwl3945_is_network_packet(struct iwl3945_priv *priv, } } -static void iwl3945_add_radiotap (struct iwl3945_priv *priv, -struct sk_buff *skb, -struct iwl3945_rx_frame_hdr *rx_hdr, -struct ieee80211_rx_status *stats) -{ -/* First cache any information we need before we overwrite -* the information provided in the skb from the hardware */ -s8 signal = stats->signal; -s8 noise =0 ; -int rate = stats->rate_idx; -u64 tsf = stats->mactime; -__le16 phy_flags_hw = rx_hdr->phy_flags, antenna; - -struct iwl3945_rt_rx_hdr { -struct ieee80211_radiotap_header rt_hdr; -__le64 rt_tsf;/* TSF */ -u8 rt_flags;/* radiotap packet flags */ -u8 rt_rate;/* rate in 500kb/s */ -__le16 rt_channelMHz;/* channel in MHz */ -__le16 rt_chbitmask;/* channel bitfield */ -s8 rt_dbmsignal;/* signal in dBm, kluged to signed */ -s8 rt_dbmnoise; -u8 rt_antenna;/* antenna number */ - } __attribute__ ((packed)) *iwl3945_rt; - -if (skb_headroom (skb) <sizeof (*iwl3945_rt)) { -if (net_ratelimit ()) -printk (KERN_ERR "not enough headroom [%d] for " -"radiotap head [%zd]\n" , -skb_headroom (skb),sizeof (*iwl3945_rt)); -return ; - } - -/* put radiotap header in front of 802.11 header and data */ - iwl3945_rt = (void *)skb_push (skb,sizeof (*iwl3945_rt)); - -/* initialise radiotap header */ - iwl3945_rt->rt_hdr.it_version =PKTHDR_RADIOTAP_VERSION ; - iwl3945_rt->rt_hdr.it_pad =0 ; - -/* total header + data */ -put_unaligned_le16 (sizeof (*iwl3945_rt), &iwl3945_rt->rt_hdr.it_len); - -/* Indicate all the fields we add to the radiotap header */ -put_unaligned_le32 ((1 <<IEEE80211_RADIOTAP_TSFT ) | - (1 <<IEEE80211_RADIOTAP_FLAGS ) | - (1 <<IEEE80211_RADIOTAP_RATE ) | - (1 <<IEEE80211_RADIOTAP_CHANNEL ) | - (1 <<IEEE80211_RADIOTAP_DBM_ANTSIGNAL ) | - (1 <<IEEE80211_RADIOTAP_DBM_ANTNOISE ) | - (1 <<IEEE80211_RADIOTAP_ANTENNA ), - &iwl3945_rt->rt_hdr.it_present); - -/* Zero the flags, we'll add to them as we go */ - iwl3945_rt->rt_flags =0 ; - -put_unaligned_le64 (tsf, &iwl3945_rt->rt_tsf); - - iwl3945_rt->rt_dbmsignal = signal; - iwl3945_rt->rt_dbmnoise = noise; - -/* Convert the channel frequency and set the flags */ -put_unaligned_le16 (stats->freq, &iwl3945_rt->rt_channelMHz); -if (!(phy_flags_hw &RX_RES_PHY_FLAGS_BAND_24_MSK )) -put_unaligned_le16 (IEEE80211_CHAN_OFDM |IEEE80211_CHAN_5GHZ , - &iwl3945_rt->rt_chbitmask); -else if (phy_flags_hw &RX_RES_PHY_FLAGS_MOD_CCK_MSK ) -put_unaligned_le16 (IEEE80211_CHAN_CCK |IEEE80211_CHAN_2GHZ , - &iwl3945_rt->rt_chbitmask); -else /* 802.11g */ -put_unaligned_le16 (IEEE80211_CHAN_OFDM |IEEE80211_CHAN_2GHZ , - &iwl3945_rt->rt_chbitmask); - -if (rate ==-1 ) - iwl3945_rt->rt_rate =0 ; -else { -if (stats->band ==IEEE80211_BAND_5GHZ ) - rate +=IWL_FIRST_OFDM_RATE ; - - iwl3945_rt->rt_rate = iwl3945_rates[rate].ieee; - } - -/* antenna number */ - antenna = phy_flags_hw &RX_RES_PHY_FLAGS_ANTENNA_MSK ; - iwl3945_rt->rt_antenna =le16_to_cpu (antenna) >>4 ; - -/* set the preamble flag if we have it */ -if (phy_flags_hw &RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK ) - iwl3945_rt->rt_flags |=IEEE80211_RADIOTAP_F_SHORTPRE ; - - stats->flag |=RX_FLAG_RADIOTAP ; -} -static void iwl3945_pass_packet_to_mac80211 (struct iwl3945_priv *priv,struct iwl3945_rx_mem_buffer *rxb,struct ieee80211_rx_status *stats)
@@ -656,9 +563,6 @@ static void iwl3945_pass_packet_to_mac80211(struct iwl3945_priv *priv,iwl3945_set_decrypted_flag (priv, rxb->skb,le32_to_cpu (rx_end->status), stats); -if (priv->add_radiotap) -iwl3945_add_radiotap (priv, rxb->skb, rx_hdr, stats); -#ifdef CONFIG_IWL3945_LEDS if (ieee80211_is_data (hdr->frame_control)) priv->rxtxpackets += len;
@@ -683,7 +587,6 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv,u16 rx_stats_noise_diff =le16_to_cpu (rx_stats->noise_diff);u8 network_packet; - rx_status.antenna =0 ; rx_status.flag =0 ; rx_status.mactime =le64_to_cpu (rx_end->timestamp); rx_status.freq =
@@ -695,6 +598,13 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv,if (rx_status.band ==IEEE80211_BAND_5GHZ ) rx_status.rate_idx -=IWL_FIRST_OFDM_RATE ; + rx_status.antenna =le16_to_cpu (rx_hdr->phy_flags & +RX_RES_PHY_FLAGS_ANTENNA_MSK ) >>4 ; + +/* set the preamble flag if appropriate */ +if (rx_hdr->phy_flags &RX_RES_PHY_FLAGS_SHORT_PREAMBLE_MSK ) + rx_status.flag |=RX_FLAG_SHORTPRE ; +if ((unlikely (rx_stats->phy_count >20 ))) {IWL_DEBUG_DROP ("dsp size out of range [0,20]: "
drivers/net/wireless/iwlwifi/iwl-3945.h +0 -1
@@ -707,7 +707,6 @@ struct iwl3945_priv {enum ieee80211_band band;int alloc_rxb_skb; -bool add_radiotap;void (*rx_handlers[REPLY_MAX ])(struct iwl3945_priv *priv,struct iwl3945_rx_mem_buffer *rxb);
drivers/net/wireless/iwlwifi/iwl-dev.h +0 -1
@@ -837,7 +837,6 @@ struct iwl_priv {enum ieee80211_band band;int alloc_rxb_skb; -bool add_radiotap;void (*rx_handlers[REPLY_MAX ])(struct iwl_priv *priv,struct iwl_rx_mem_buffer *rxb);
drivers/net/wireless/iwlwifi/iwl-rx.c +20 -109
153 lines not on this page · raw message
drivers/net/wireless/iwlwifi/iwl3945-base.c +0 -2
@@ -6656,8 +6656,6 @@ static int iwl3945_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *comutex_lock (&priv->mutex);IWL_DEBUG_MAC80211 ("enter to channel %d\n" , conf->channel->hw_value); - priv->add_radiotap = !!(conf->flags &IEEE80211_CONF_RADIOTAP ); -if (!iwl3945_is_ready (priv)) {IWL_DEBUG_MAC80211 ("leave - not ready\n" ); ret = -EIO ;
drivers/net/wireless/iwlwifi/iwl4965-base.c +0 -2
@@ -2731,8 +2731,6 @@ static int iwl4965_mac_config(struct ieee80211_hw *hw, struct ieee80211_conf *comutex_lock (&priv->mutex);IWL_DEBUG_MAC80211 ("enter to channel %d\n" , conf->channel->hw_value); - priv->add_radiotap = !!(conf->flags &IEEE80211_CONF_RADIOTAP ); -if (conf->radio_enabled &&iwl_radio_kill_sw_enable_radio (priv)) {IWL_DEBUG_MAC80211 ("leave - RF-KILL - waiting for uCode\n" ); goto out;