hostap: don't report useless WDS frames by default
PATCH 1/5 hostap: don't report useless WDS frames by default
DEBUG_EXTRA is reported to the kernel log by default, but DEBUG_EXTRA2 is not. Unrelated WDS frames pollute the log unnecessarily.
---
drivers/net/wireless/hostap/hostap_80211_rx.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/wireless/hostap/hostap_80211_rx.c +1 -1
@@ -551,7 +551,7 @@ hostap_rx_frame_wds(local_info_t *local, struct ieee80211_hdr_4addr *hdr, hdr->addr1[2] != 0xff || hdr->addr1[3] != 0xff || hdr->addr1[4] != 0xff || hdr->addr1[5] != 0xff)) {/* RA (or BSSID) is not ours - drop */ - PDEBUG(DEBUG_EXTRA, "%s: received WDS frame with " + PDEBUG(DEBUG_EXTRA2, "%s: received WDS frame with " "not own or broadcast %s=%s\n", local->dev->name, fc & IEEE80211_FCTL_FROMDS ? "RA" : "BSSID",
PATCH 2/5 hostap: fix sparse warnings
Rewrite AID calculation in handle_pspoll() to avoid truncating bits. Make hostap_80211_header_parse() static, don't export it. Avoid shadowing variables.
---
drivers/net/wireless/hostap/hostap_80211_rx.c | 6 +++--- drivers/net/wireless/hostap/hostap_ap.c | 2 +- drivers/net/wireless/hostap/hostap_cs.c | 8 ++++---- drivers/net/wireless/hostap/hostap_hw.c | 10 +++++----- drivers/net/wireless/hostap/hostap_main.c | 5 ++--- 5 files changed, 15 insertions(+), 16 deletions(-)
drivers/net/wireless/hostap/hostap_80211_rx.c +3 -3
@@ -64,7 +64,7 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb,int hdrlen, phdrlen, head_need, tail_need;u16 fc;int prism_header, ret; -struct ieee80211_hdr_4addr *hdr; +struct ieee80211_hdr_4addr *fhdr; iface =netdev_priv (dev); local = iface->local;
@@ -83,8 +83,8 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb, phdrlen =0 ; } - hdr = (struct ieee80211_hdr_4addr *) skb->data; - fc =le16_to_cpu (hdr->frame_ctl); + fhdr = (struct ieee80211_hdr_4addr *) skb->data; + fc =le16_to_cpu (fhdr->frame_ctl);if (type ==PRISM2_RX_MGMT && (fc &IEEE80211_FCTL_VERS )) { printk(KERN_DEBUG "%s: dropped management frame with header "
drivers/net/wireless/hostap/hostap_ap.c +1 -1
@@ -1930,7 +1930,7 @@ static void handle_pspoll(local_info_t *local,PDEBUG (DEBUG_PS ," PSPOLL and AID[15:14] not set\n" );return ; } - aid &= ~BIT (15 ) & ~BIT (14 ); + aid &= ~(BIT (15 ) |BIT (14 ));if (aid ==0 || aid >MAX_AID_TABLE_SIZE ) {PDEBUG (DEBUG_PS ," invalid aid=%d\n" , aid);return ;
drivers/net/wireless/hostap/hostap_cs.c +4 -4
@@ -533,10 +533,10 @@ static void prism2_detach(struct pcmcia_device *link) do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)#define CFG_CHECK2 (fn, retf) \ -do { int ret = (retf); \ -if (ret != 0) { \ - PDEBUG(DEBUG_EXTRA, "CardServices(" #fn ") returned %d\n", ret); \ - cs_error(link, fn, ret); \ +do { int _ret = (retf); \ +if (_ret != 0) { \ + PDEBUG(DEBUG_EXTRA, "CardServices(" #fn ") returned %d\n", _ret); \ + cs_error(link, fn, _ret); \ goto next_entry; \ } \ } while (0)
drivers/net/wireless/hostap/hostap_hw.c +5 -5
@@ -2835,7 +2835,7 @@ static void hostap_passive_scan(unsigned long data) {local_info_t *local = (local_info_t *) data;struct net_device *dev = local->dev; -u16 channel; +u16 chan;if (local->passive_scan_interval <=0 )return ;
@@ -2872,11 +2872,11 @@ static void hostap_passive_scan(unsigned long data)printk (KERN_DEBUG "%s: passive scan channel %d\n" , dev->name, local->passive_scan_channel); - channel = local->passive_scan_channel; + chan = local->passive_scan_channel; local->passive_scan_state =PASSIVE_SCAN_WAIT ; local->passive_scan_timer.expires = jiffies +HZ /10 ; }else { - channel = local->channel; + chan = local->channel; local->passive_scan_state =PASSIVE_SCAN_LISTEN ; local->passive_scan_timer.expires = jiffies + local->passive_scan_interval *HZ ;
@@ -2884,9 +2884,9 @@ static void hostap_passive_scan(unsigned long data)if (hfa384x_cmd_callback (dev,HFA384X_CMDCODE_TEST | (HFA384X_TEST_CHANGE_CHANNEL <<8 ), - channel,NULL ,0 )) + chan,NULL ,0 ))printk (KERN_ERR "%s: passive scan channel set %d " -"failed\n" , dev->name, channel); +"failed\n" , dev->name, chan);add_timer (&local->passive_scan_timer); }
drivers/net/wireless/hostap/hostap_main.c +2 -3
@@ -594,7 +594,8 @@ void hostap_dump_tx_header(const char *name, const struct hfa384x_tx_frame *tx) } -int hostap_80211_header_parse (const struct sk_buff *skb,unsigned char *haddr) +static int hostap_80211_header_parse (const struct sk_buff *skb, +unsigned char *haddr) {struct hostap_interface *iface =netdev_priv (skb->dev);local_info_t *local = iface->local;
@@ -857,7 +858,6 @@ const struct header_ops hostap_80211_ops = { .rebuild = eth_rebuild_header, .cache = eth_header_cache, .cache_update = eth_header_cache_update, - .parse = hostap_80211_header_parse, };EXPORT_SYMBOL (hostap_80211_ops);
@@ -1150,7 +1150,6 @@ EXPORT_SYMBOL(hostap_set_roaming);EXPORT_SYMBOL (hostap_set_auth_algs);EXPORT_SYMBOL (hostap_dump_rx_header);EXPORT_SYMBOL (hostap_dump_tx_header); -EXPORT_SYMBOL (hostap_80211_header_parse);EXPORT_SYMBOL (hostap_80211_get_hdrlen);EXPORT_SYMBOL (hostap_get_stats);EXPORT_SYMBOL (hostap_setup_dev);
PATCH 3/5 hostap: don't skip any headers in hostap_80211_header_parse()
In reply to Pavel RoskinDon't try to skip any headers in hostap_80211_header_parse(). We never use that function for interfaces affected by local->monitor_type. Both the master and the AP interface receive 802.11 frames without any additional headers.
---
drivers/net/wireless/hostap/hostap_main.c | 20 +------------------- 1 files changed, 1 insertions(+), 19 deletions(-)
drivers/net/wireless/hostap/hostap_main.c +1 -19
@@ -597,25 +597,7 @@ void hostap_dump_tx_header(const char *name, const struct hfa384x_tx_frame *tx)static int hostap_80211_header_parse (const struct sk_buff *skb,unsigned char *haddr) { -struct hostap_interface *iface =netdev_priv (skb->dev); -local_info_t *local = iface->local; - -if (local->monitor_type ==PRISM2_MONITOR_PRISM || - local->monitor_type ==PRISM2_MONITOR_CAPHDR ) { -const unsigned char *mac =skb_mac_header (skb); - -if (*(u32 *)mac ==LWNG_CAP_DID_BASE ) { -memcpy (haddr, - mac +sizeof (struct linux_wlan_ng_prism_hdr ) +10 , -ETH_ALEN );/* addr2 */ - }else {/* (*(u32 *)mac == htonl(LWNG_CAPHDR_VERSION)) */ -memcpy (haddr, - mac +sizeof (struct linux_wlan_ng_cap_hdr ) +10 , -ETH_ALEN );/* addr2 */ - } - }else -memcpy (haddr,skb_mac_header (skb) +10 ,ETH_ALEN );/* addr2 */ - +memcpy (haddr,skb_mac_header (skb) +10 ,ETH_ALEN );/* addr2 */ return ETH_ALEN ; }
PATCH 4/5 hostap: add radiotap support in monitor mode
In reply to Pavel RoskinProvide MAC time, rate, channel, signal and noise.
---
drivers/net/wireless/hostap/hostap_80211_rx.c | 21 +++++++++++++++++++++ drivers/net/wireless/hostap/hostap_ioctl.c | 5 ++++- drivers/net/wireless/hostap/hostap_wlan.h | 14 +++++++++++++- 3 files changed, 38 insertions(+), 2 deletions(-)
drivers/net/wireless/hostap/hostap_80211_rx.c +21 -0
@@ -78,6 +78,9 @@ int prism2_rx_80211(struct net_device *dev, struct sk_buff *skb, prism_header =2 ; phdrlen =sizeof (struct linux_wlan_ng_cap_hdr ); } + }else if (dev->type ==ARPHRD_IEEE80211_RADIOTAP ) { + prism_header =3 ; + phdrlen =sizeof (struct hostap_radiotap_rx ); }else { prism_header =0 ; phdrlen =0 ;
@@ -165,6 +168,24 @@ hdr->f.status = s; hdr->f.len = l; hdr->f.data = d hdr->ssi_noise =htonl (rx_stats->noise); hdr->preamble =htonl (0 );/* unknown */ hdr->encoding =htonl (1 );/* cck */ + }else if (prism_header ==3 ) { +struct hostap_radiotap_rx *hdr; + hdr = (struct hostap_radiotap_rx *)skb_push (skb, phdrlen); +memset (hdr,0 , phdrlen); + hdr->hdr.it_len =cpu_to_le16 (phdrlen); + hdr->hdr.it_present = +cpu_to_le32 ((1 <<IEEE80211_RADIOTAP_TSFT ) | + (1 <<IEEE80211_RADIOTAP_CHANNEL ) | + (1 <<IEEE80211_RADIOTAP_RATE ) | + (1 <<IEEE80211_RADIOTAP_DBM_ANTSIGNAL ) | + (1 <<IEEE80211_RADIOTAP_DBM_ANTNOISE )); + hdr->tsft =cpu_to_le64 (rx_stats->mac_time); + hdr->chan_freq =cpu_to_le16 (freq_list[local->channel -1 ]); + hdr->chan_flags =cpu_to_le16 (IEEE80211_CHAN_CCK | +IEEE80211_CHAN_2GHZ ); + hdr->rate = rx_stats->rate /5 ; + hdr->dbm_antsignal = rx_stats->signal; + hdr->dbm_antnoise = rx_stats->noise; } ret = skb->len - phdrlen;
drivers/net/wireless/hostap/hostap_ioctl.c +4 -1
@@ -897,6 +897,8 @@ static void hostap_monitor_set_type(local_info_t *local)if (local->monitor_type ==PRISM2_MONITOR_PRISM || local->monitor_type ==PRISM2_MONITOR_CAPHDR ) { dev->type =ARPHRD_IEEE80211_PRISM ; + }else if (local->monitor_type ==PRISM2_MONITOR_RADIOTAP ) { + dev->type =ARPHRD_IEEE80211_RADIOTAP ; }else { dev->type =ARPHRD_IEEE80211 ; }
@@ -2520,7 +2522,8 @@ static int prism2_ioctl_priv_prism2_param(struct net_device *dev,case PRISM2_PARAM_MONITOR_TYPE :if (value !=PRISM2_MONITOR_80211 && value !=PRISM2_MONITOR_CAPHDR && - value !=PRISM2_MONITOR_PRISM ) { + value !=PRISM2_MONITOR_PRISM && + value !=PRISM2_MONITOR_RADIOTAP ) { ret = -EINVAL ;break ; }
drivers/net/wireless/hostap/hostap_wlan.h +13 -1
@@ -5,6 +5,7 @@#include <linux/netdevice.h> #include <linux/mutex.h> #include <net/iw_handler.h> +#include <net/ieee80211_radiotap.h> #include "hostap_config.h" #include "hostap_common.h"
@@ -55,6 +56,17 @@ struct linux_wlan_ng_cap_hdr {__be32 encoding; } __attribute__ ((packed)); +struct hostap_radiotap_rx { +struct ieee80211_radiotap_header hdr; +__le64 tsft; +u8 rate; +u8 padding; +__le16 chan_freq; +__le16 chan_flags; +s8 dbm_antsignal; +s8 dbm_antnoise; +} __attribute__ ((packed)); +#define LWNG_CAP_DID_BASE (4 | (1 << 6))/* section 4, group 1 */ #define LWNG_CAPHDR_VERSION 0x80211001
@@ -734,7 +746,7 @@ struct local_info {unsigned long scan_timestamp;/* Time started to scan */ enum {PRISM2_MONITOR_80211 =0 ,PRISM2_MONITOR_PRISM =1 , -PRISM2_MONITOR_CAPHDR =2 +PRISM2_MONITOR_CAPHDR =2 ,PRISM2_MONITOR_RADIOTAP =3 } monitor_type;int monitor_allow_fcserr;
PATCH 5/5 hostap: use radiotap headers by default
In reply to Pavel Roskin---
drivers/net/wireless/hostap/hostap_hw.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/net/wireless/hostap/hostap_hw.c +1 -0
@@ -3204,6 +3204,7 @@ prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx, local->auth_algs =PRISM2_AUTH_OPEN |PRISM2_AUTH_SHARED_KEY ; local->sram_type =-1 ; local->scan_channel_mask =0xffff ; + local->monitor_type =PRISM2_MONITOR_RADIOTAP ;/* Initialize task queue structures */ INIT_WORK (&local->reset_queue, handle_reset_queue);