if (unlikely(rx->flags & IEEE80211_TXRXD_RXIN_SCAN)) {
                /* scanning finished during invoking of handlers */
                I802_DEBUG_INC(local->rx_handlers_drop_passive_scan);
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
        }
 
        return RX_CONTINUE;
                                rx->local->dot11FrameDuplicateCount++;
                                rx->sta->num_duplicates++;
                        }
-                       return RX_DROP;
+                       return RX_DROP_MONITOR;
                } else
                        rx->sta->last_seq_ctrl[rx->u.rx.queue] = hdr->seq_ctrl;
        }
 
        if (unlikely(rx->skb->len < 16)) {
                I802_DEBUG_INC(rx->local->rx_handlers_drop_short);
-               return RX_DROP;
+               return RX_DROP_MONITOR;
        }
 
        /* Drop disallowed frame classes based on STA auth/assoc state;
                    || !(rx->flags & IEEE80211_TXRXD_RXRA_MATCH)) {
                        /* Drop IBSS frames and frames for other hosts
                         * silently. */
-                       return RX_DROP;
+                       return RX_DROP_MONITOR;
                }
 
-               return RX_DROP;
+               return RX_DROP_MONITOR;
        }
 
        return RX_CONTINUE;
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
        int keyidx;
        int hdrlen;
-       ieee80211_rx_result result = RX_DROP;
+       ieee80211_rx_result result = RX_DROP_UNUSABLE;
        struct ieee80211_key *stakey = NULL;
 
        /*
                hdrlen = ieee80211_get_hdrlen(rx->fc);
 
                if (rx->skb->len < 8 + hdrlen)
-                       return RX_DROP; /* TODO: count this? */
+                       return RX_DROP_UNUSABLE; /* TODO: count this? */
 
                /*
                 * no need to call ieee80211_wep_get_keyidx,
                        printk(KERN_DEBUG "%s: RX protected frame,"
                               " but have no key\n", rx->dev->name);
 #endif /* CONFIG_MAC80211_DEBUG */
-               return RX_DROP;
+               return RX_DROP_MONITOR;
        }
 
        /* Check for weak IVs if possible */
                                          rx->u.rx.queue, hdr);
        if (!entry) {
                I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag);
-               return RX_DROP;
+               return RX_DROP_MONITOR;
        }
 
        /* Verify that MPDUs within one MSDU have sequential PN values.
                int i;
                u8 pn[CCMP_PN_LEN], *rpn;
                if (!rx->key || rx->key->conf.alg != ALG_CCMP)
-                       return RX_DROP;
+                       return RX_DROP_UNUSABLE;
                memcpy(pn, entry->last_pn, CCMP_PN_LEN);
                for (i = CCMP_PN_LEN - 1; i >= 0; i--) {
                        pn[i]++;
                                       rpn[0], rpn[1], rpn[2], rpn[3], rpn[4],
                                       rpn[5], pn[0], pn[1], pn[2], pn[3],
                                       pn[4], pn[5]);
-                       return RX_DROP;
+                       return RX_DROP_UNUSABLE;
                }
                memcpy(entry->last_pn, pn, CCMP_PN_LEN);
        }
                                              GFP_ATOMIC))) {
                        I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag);
                        __skb_queue_purge(&entry->skb_list);
-                       return RX_DROP;
+                       return RX_DROP_UNUSABLE;
                }
        }
        while ((skb = __skb_dequeue(&entry->skb_list))) {
 
        if ((sdata->vif.type != IEEE80211_IF_TYPE_AP) &&
            (sdata->vif.type != IEEE80211_IF_TYPE_VLAN))
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
 
        skb = skb_dequeue(&rx->sta->tx_filtered);
        if (!skb) {
                return RX_CONTINUE;
 
        if (unlikely(!WLAN_FC_DATA_PRESENT(fc)))
-               return RX_DROP;
+               return RX_DROP_MONITOR;
 
        if (!(rx->flags & IEEE80211_TXRXD_RX_AMSDU))
                return RX_CONTINUE;
 
        err = ieee80211_data_to_8023(rx);
        if (unlikely(err))
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
 
        skb->dev = dev;
 
        /* skip the wrapping header */
        eth = (struct ethhdr *) skb_pull(skb, sizeof(struct ethhdr));
        if (!eth)
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
 
        while (skb != frame) {
                u8 padding;
                /* the last MSDU has no padding */
                if (subframe_len > remaining) {
                        printk(KERN_DEBUG "%s: wrong buffer size", dev->name);
-                       return RX_DROP;
+                       return RX_DROP_UNUSABLE;
                }
 
                skb_pull(skb, sizeof(struct ethhdr));
                                              subframe_len);
 
                        if (frame == NULL)
-                               return RX_DROP;
+                               return RX_DROP_UNUSABLE;
 
                        skb_reserve(frame, local->hw.extra_tx_headroom +
                                    sizeof(struct ethhdr));
                                printk(KERN_DEBUG "%s: wrong buffer size ",
                                       dev->name);
                                dev_kfree_skb(frame);
-                               return RX_DROP;
+                               return RX_DROP_UNUSABLE;
                        }
                }
 
 
                if (!ieee80211_frame_allowed(rx)) {
                        if (skb == frame) /* last frame */
-                               return RX_DROP;
+                               return RX_DROP_UNUSABLE;
                        dev_kfree_skb(frame);
                        continue;
                }
                return RX_CONTINUE;
 
        if (unlikely(!WLAN_FC_DATA_PRESENT(fc)))
-               return RX_DROP;
+               return RX_DROP_MONITOR;
 
        err = ieee80211_data_to_8023(rx);
        if (unlikely(err))
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
 
        if (!ieee80211_frame_allowed(rx))
-               return RX_DROP;
+               return RX_DROP_MONITOR;
 
        rx->skb->dev = dev;
 
                ieee80211_sta_manage_reorder_buf(hw, tid_agg_rx, NULL,
                                                 start_seq_num, 1);
                rcu_read_unlock();
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
        }
 
        return RX_CONTINUE;
        struct ieee80211_sub_if_data *sdata;
 
        if (!(rx->flags & IEEE80211_TXRXD_RXRA_MATCH))
-               return RX_DROP;
+               return RX_DROP_MONITOR;
 
        sdata = IEEE80211_DEV_TO_SUB_IF(rx->dev);
        if ((sdata->vif.type == IEEE80211_IF_TYPE_STA ||
            !(sdata->flags & IEEE80211_SDATA_USERSPACE_MLME))
                ieee80211_sta_rx_mgmt(rx->dev, rx->skb, rx->u.rx.status);
        else
-               return RX_DROP;
+               return RX_DROP_MONITOR;
 
        return RX_QUEUED;
 }
                                struct sta_info *sta)
 {
        ieee80211_rx_handler *handler;
-       ieee80211_rx_result res = RX_DROP;
+       ieee80211_rx_result res = RX_DROP_MONITOR;
 
        for (handler = handlers; *handler != NULL; handler++) {
                res = (*handler)(rx);
                switch (res) {
                case RX_CONTINUE:
                        continue;
-               case RX_DROP:
+               case RX_DROP_UNUSABLE:
+               case RX_DROP_MONITOR:
                        I802_DEBUG_INC(local->rx_handlers_drop);
                        if (sta)
                                sta->rx_dropped++;
                break;
        }
 
-       if (res == RX_DROP)
+       if (res == RX_DROP_UNUSABLE || res == RX_DROP_MONITOR)
                dev_kfree_skb(rx->skb);
        return res;
 }
 
 
        if (ieee80211_get_hdr_info(skb, &sa, &da, &qos_tid, &data, &data_len)
            || data_len < MICHAEL_MIC_LEN)
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
 
        data_len -= MICHAEL_MIC_LEN;
 
        michael_mic(key, da, sa, qos_tid & 0x0f, data, data_len, mic);
        if (memcmp(mic, data + data_len, MICHAEL_MIC_LEN) != 0 || wpa_test) {
                if (!(rx->flags & IEEE80211_TXRXD_RXRA_MATCH))
-                       return RX_DROP;
+                       return RX_DROP_UNUSABLE;
 
                printk(KERN_DEBUG "%s: invalid Michael MIC in data frame from "
                       "%s\n", rx->dev->name, print_mac(mac, sa));
 
                mac80211_ev_michael_mic_failure(rx->dev, rx->key->conf.keyidx,
                                                (void *) skb->data);
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
        }
 
        /* remove Michael MIC from payload */
                return RX_CONTINUE;
 
        if (!rx->sta || skb->len - hdrlen < 12)
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
 
        if (rx->u.rx.status->flag & RX_FLAG_DECRYPTED) {
                if (rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED) {
                               "frame from %s (res=%d)\n", rx->dev->name,
                               print_mac(mac, rx->sta->addr), res);
 #endif /* CONFIG_MAC80211_DEBUG */
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
        }
 
        /* Trim ICV */
 
        data_len = skb->len - hdrlen - CCMP_HDR_LEN - CCMP_MIC_LEN;
        if (!rx->sta || data_len < 0)
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
 
        if ((rx->u.rx.status->flag & RX_FLAG_DECRYPTED) &&
            (rx->u.rx.status->flag & RX_FLAG_IV_STRIPPED))
                       ppn[0], ppn[1], ppn[2], ppn[3], ppn[4], ppn[5]);
 #endif /* CONFIG_MAC80211_DEBUG */
                key->u.ccmp.replays++;
-               return RX_DROP;
+               return RX_DROP_UNUSABLE;
        }
 
        if (!(rx->u.rx.status->flag & RX_FLAG_DECRYPTED)) {
                                       "for RX frame from %s\n", rx->dev->name,
                                       print_mac(mac, rx->sta->addr));
 #endif /* CONFIG_MAC80211_DEBUG */
-                       return RX_DROP;
+                       return RX_DROP_UNUSABLE;
                }
        }