|
@@ -61,8 +61,10 @@ static inline int should_drop_frame(struct ieee80211_rx_status *status,
|
|
|
return 1;
|
|
|
if (unlikely(skb->len < 16 + present_fcs_len + radiotap_len))
|
|
|
return 1;
|
|
|
- if ((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
|
|
|
- cpu_to_le16(IEEE80211_FTYPE_CTL))
|
|
|
+ if (((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_FTYPE)) ==
|
|
|
+ cpu_to_le16(IEEE80211_FTYPE_CTL)) &&
|
|
|
+ ((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_STYPE)) !=
|
|
|
+ cpu_to_le16(IEEE80211_STYPE_PSPOLL)))
|
|
|
return 1;
|
|
|
return 0;
|
|
|
}
|
|
@@ -896,6 +898,7 @@ ieee80211_rx_h_defragment(struct ieee80211_txrx_data *rx)
|
|
|
static ieee80211_txrx_result
|
|
|
ieee80211_rx_h_ps_poll(struct ieee80211_txrx_data *rx)
|
|
|
{
|
|
|
+ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev);
|
|
|
struct sk_buff *skb;
|
|
|
int no_pending_pkts;
|
|
|
DECLARE_MAC_BUF(mac);
|
|
@@ -906,6 +909,10 @@ ieee80211_rx_h_ps_poll(struct ieee80211_txrx_data *rx)
|
|
|
!(rx->flags & IEEE80211_TXRXD_RXRA_MATCH)))
|
|
|
return TXRX_CONTINUE;
|
|
|
|
|
|
+ if ((sdata->type != IEEE80211_IF_TYPE_AP) &&
|
|
|
+ (sdata->type != IEEE80211_IF_TYPE_VLAN))
|
|
|
+ return TXRX_DROP;
|
|
|
+
|
|
|
skb = skb_dequeue(&rx->sta->tx_filtered);
|
|
|
if (!skb) {
|
|
|
skb = skb_dequeue(&rx->sta->ps_tx_buf);
|