diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-3945.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.c | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index 94e177a9f51c..c2a76785b665 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -514,6 +514,23 @@ static inline void iwl3945_dbg_report_frame(struct iwl3945_priv *priv, | |||
514 | } | 514 | } |
515 | #endif | 515 | #endif |
516 | 516 | ||
517 | /* This is necessary only for a number of statistics, see the caller. */ | ||
518 | static int iwl3945_is_network_packet(struct iwl3945_priv *priv, | ||
519 | struct ieee80211_hdr *header) | ||
520 | { | ||
521 | /* Filter incoming packets to determine if they are targeted toward | ||
522 | * this network, discarding packets coming from ourselves */ | ||
523 | switch (priv->iw_mode) { | ||
524 | case IEEE80211_IF_TYPE_IBSS: /* Header: Dest. | Source | BSSID */ | ||
525 | /* packets to our IBSS update information */ | ||
526 | return !compare_ether_addr(header->addr3, priv->bssid); | ||
527 | case IEEE80211_IF_TYPE_STA: /* Header: Dest. | AP{BSSID} | Source */ | ||
528 | /* packets to our IBSS update information */ | ||
529 | return !compare_ether_addr(header->addr2, priv->bssid); | ||
530 | default: | ||
531 | return 1; | ||
532 | } | ||
533 | } | ||
517 | 534 | ||
518 | static void iwl3945_add_radiotap(struct iwl3945_priv *priv, | 535 | static void iwl3945_add_radiotap(struct iwl3945_priv *priv, |
519 | struct sk_buff *skb, | 536 | struct sk_buff *skb, |
@@ -608,12 +625,12 @@ static void iwl3945_add_radiotap(struct iwl3945_priv *priv, | |||
608 | stats->flag |= RX_FLAG_RADIOTAP; | 625 | stats->flag |= RX_FLAG_RADIOTAP; |
609 | } | 626 | } |
610 | 627 | ||
611 | static void iwl3945_handle_data_packet(struct iwl3945_priv *priv, int is_data, | 628 | static void iwl3945_pass_packet_to_mac80211(struct iwl3945_priv *priv, |
612 | struct iwl3945_rx_mem_buffer *rxb, | 629 | struct iwl3945_rx_mem_buffer *rxb, |
613 | struct ieee80211_rx_status *stats) | 630 | struct ieee80211_rx_status *stats) |
614 | { | 631 | { |
615 | struct ieee80211_hdr *hdr; | ||
616 | struct iwl3945_rx_packet *pkt = (struct iwl3945_rx_packet *)rxb->skb->data; | 632 | struct iwl3945_rx_packet *pkt = (struct iwl3945_rx_packet *)rxb->skb->data; |
633 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)IWL_RX_DATA(pkt); | ||
617 | struct iwl3945_rx_frame_hdr *rx_hdr = IWL_RX_HDR(pkt); | 634 | struct iwl3945_rx_frame_hdr *rx_hdr = IWL_RX_HDR(pkt); |
618 | struct iwl3945_rx_frame_end *rx_end = IWL_RX_END(pkt); | 635 | struct iwl3945_rx_frame_end *rx_end = IWL_RX_END(pkt); |
619 | short len = le16_to_cpu(rx_hdr->len); | 636 | short len = le16_to_cpu(rx_hdr->len); |
@@ -635,8 +652,6 @@ static void iwl3945_handle_data_packet(struct iwl3945_priv *priv, int is_data, | |||
635 | /* Set the size of the skb to the size of the frame */ | 652 | /* Set the size of the skb to the size of the frame */ |
636 | skb_put(rxb->skb, le16_to_cpu(rx_hdr->len)); | 653 | skb_put(rxb->skb, le16_to_cpu(rx_hdr->len)); |
637 | 654 | ||
638 | hdr = (void *)rxb->skb->data; | ||
639 | |||
640 | if (iwl3945_param_hwcrypto) | 655 | if (iwl3945_param_hwcrypto) |
641 | iwl3945_set_decrypted_flag(priv, rxb->skb, | 656 | iwl3945_set_decrypted_flag(priv, rxb->skb, |
642 | le32_to_cpu(rx_end->status), stats); | 657 | le32_to_cpu(rx_end->status), stats); |
@@ -645,7 +660,7 @@ static void iwl3945_handle_data_packet(struct iwl3945_priv *priv, int is_data, | |||
645 | iwl3945_add_radiotap(priv, rxb->skb, rx_hdr, stats); | 660 | iwl3945_add_radiotap(priv, rxb->skb, rx_hdr, stats); |
646 | 661 | ||
647 | #ifdef CONFIG_IWL3945_LEDS | 662 | #ifdef CONFIG_IWL3945_LEDS |
648 | if (is_data) | 663 | if (ieee80211_is_data(hdr->frame_control)) |
649 | priv->rxtxpackets += len; | 664 | priv->rxtxpackets += len; |
650 | #endif | 665 | #endif |
651 | ieee80211_rx_irqsafe(priv->hw, rxb->skb, stats); | 666 | ieee80211_rx_irqsafe(priv->hw, rxb->skb, stats); |
@@ -694,7 +709,7 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
694 | } | 709 | } |
695 | 710 | ||
696 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { | 711 | if (priv->iw_mode == IEEE80211_IF_TYPE_MNTR) { |
697 | iwl3945_handle_data_packet(priv, 1, rxb, &rx_status); | 712 | iwl3945_pass_packet_to_mac80211(priv, rxb, &rx_status); |
698 | return; | 713 | return; |
699 | } | 714 | } |
700 | 715 | ||
@@ -842,27 +857,12 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
842 | } | 857 | } |
843 | } | 858 | } |
844 | 859 | ||
845 | iwl3945_handle_data_packet(priv, 0, rxb, &rx_status); | 860 | case IEEE80211_FTYPE_DATA: |
846 | break; | 861 | /* fall through */ |
847 | 862 | default: | |
848 | case IEEE80211_FTYPE_CTL: | 863 | iwl3945_pass_packet_to_mac80211(priv, rxb, &rx_status); |
849 | break; | ||
850 | |||
851 | case IEEE80211_FTYPE_DATA: { | ||
852 | DECLARE_MAC_BUF(mac1); | ||
853 | DECLARE_MAC_BUF(mac2); | ||
854 | DECLARE_MAC_BUF(mac3); | ||
855 | |||
856 | if (unlikely(iwl3945_is_duplicate_packet(priv, header))) | ||
857 | IWL_DEBUG_DROP("Dropping (dup): %s, %s, %s\n", | ||
858 | print_mac(mac1, header->addr1), | ||
859 | print_mac(mac2, header->addr2), | ||
860 | print_mac(mac3, header->addr3)); | ||
861 | else | ||
862 | iwl3945_handle_data_packet(priv, 1, rxb, &rx_status); | ||
863 | break; | 864 | break; |
864 | } | 865 | } |
865 | } | ||
866 | } | 866 | } |
867 | 867 | ||
868 | int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl3945_priv *priv, void *ptr, | 868 | int iwl3945_hw_txq_attach_buf_to_tfd(struct iwl3945_priv *priv, void *ptr, |