Commit 358c8d9d authored by Harvey Harrison's avatar Harvey Harrison Committed by John W. Linville

mac80211: use ieee80211 frame control directly

Remove the last users of the rx/tx_data->fc data members and use the
le16 frame_control from the header directly.
Signed-off-by: default avatarHarvey Harrison <harvey.harrison@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent e7827a70
...@@ -867,16 +867,18 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) ...@@ -867,16 +867,18 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
{ {
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
u16 sc; u16 sc;
__le16 fc;
unsigned int frag, seq; unsigned int frag, seq;
struct ieee80211_fragment_entry *entry; struct ieee80211_fragment_entry *entry;
struct sk_buff *skb; struct sk_buff *skb;
DECLARE_MAC_BUF(mac); DECLARE_MAC_BUF(mac);
hdr = (struct ieee80211_hdr *)rx->skb->data; hdr = (struct ieee80211_hdr *)rx->skb->data;
fc = hdr->frame_control;
sc = le16_to_cpu(hdr->seq_ctrl); sc = le16_to_cpu(hdr->seq_ctrl);
frag = sc & IEEE80211_SCTL_FRAG; frag = sc & IEEE80211_SCTL_FRAG;
if (likely((!ieee80211_has_morefrags(hdr->frame_control) && frag == 0) || if (likely((!ieee80211_has_morefrags(fc) && frag == 0) ||
(rx->skb)->len < 24 || (rx->skb)->len < 24 ||
is_multicast_ether_addr(hdr->addr1))) { is_multicast_ether_addr(hdr->addr1))) {
/* not fragmented */ /* not fragmented */
...@@ -891,7 +893,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) ...@@ -891,7 +893,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
entry = ieee80211_reassemble_add(rx->sdata, frag, seq, entry = ieee80211_reassemble_add(rx->sdata, frag, seq,
rx->queue, &(rx->skb)); rx->queue, &(rx->skb));
if (rx->key && rx->key->conf.alg == ALG_CCMP && if (rx->key && rx->key->conf.alg == ALG_CCMP &&
ieee80211_has_protected(hdr->frame_control)) { ieee80211_has_protected(fc)) {
/* Store CCMP PN so that we can verify that the next /* Store CCMP PN so that we can verify that the next
* fragment has a sequential PN value. */ * fragment has a sequential PN value. */
entry->ccmp = 1; entry->ccmp = 1;
...@@ -930,11 +932,11 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) ...@@ -930,11 +932,11 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx)
memcpy(entry->last_pn, pn, CCMP_PN_LEN); memcpy(entry->last_pn, pn, CCMP_PN_LEN);
} }
skb_pull(rx->skb, ieee80211_hdrlen(hdr->frame_control)); skb_pull(rx->skb, ieee80211_hdrlen(fc));
__skb_queue_tail(&entry->skb_list, rx->skb); __skb_queue_tail(&entry->skb_list, rx->skb);
entry->last_frag = frag; entry->last_frag = frag;
entry->extra_len += rx->skb->len; entry->extra_len += rx->skb->len;
if (rx->fc & IEEE80211_FCTL_MOREFRAGS) { if (ieee80211_has_morefrags(fc)) {
rx->skb = NULL; rx->skb = NULL;
return RX_QUEUED; return RX_QUEUED;
} }
...@@ -974,10 +976,9 @@ ieee80211_rx_h_ps_poll(struct ieee80211_rx_data *rx) ...@@ -974,10 +976,9 @@ ieee80211_rx_h_ps_poll(struct ieee80211_rx_data *rx)
struct sk_buff *skb; struct sk_buff *skb;
int no_pending_pkts; int no_pending_pkts;
DECLARE_MAC_BUF(mac); DECLARE_MAC_BUF(mac);
__le16 fc = ((struct ieee80211_hdr *)rx->skb->data)->frame_control;
if (likely(!rx->sta || if (likely(!rx->sta || !ieee80211_is_pspoll(fc) ||
(rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_CTL ||
(rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_PSPOLL ||
!(rx->flags & IEEE80211_RX_RA_MATCH))) !(rx->flags & IEEE80211_RX_RA_MATCH)))
return RX_CONTINUE; return RX_CONTINUE;
...@@ -1073,7 +1074,7 @@ ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx) ...@@ -1073,7 +1074,7 @@ ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx)
} }
static int static int
ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx) ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
{ {
/* /*
* Pass through unencrypted frames if the hardware has * Pass through unencrypted frames if the hardware has
...@@ -1083,9 +1084,8 @@ ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx) ...@@ -1083,9 +1084,8 @@ ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx)
return 0; return 0;
/* Drop unencrypted frames if key is set. */ /* Drop unencrypted frames if key is set. */
if (unlikely(!(rx->fc & IEEE80211_FCTL_PROTECTED) && if (unlikely(!ieee80211_has_protected(fc) &&
(rx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA && !ieee80211_is_nullfunc(fc) &&
(rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_NULLFUNC &&
(rx->key || rx->sdata->drop_unencrypted))) (rx->key || rx->sdata->drop_unencrypted)))
return -EACCES; return -EACCES;
...@@ -1184,7 +1184,7 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx) ...@@ -1184,7 +1184,7 @@ ieee80211_data_to_8023(struct ieee80211_rx_data *rx)
/* /*
* requires that rx->skb is a frame with ethernet header * requires that rx->skb is a frame with ethernet header
*/ */
static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx) static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc)
{ {
static const u8 pae_group_addr[ETH_ALEN] __aligned(2) static const u8 pae_group_addr[ETH_ALEN] __aligned(2)
= { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x03 }; = { 0x01, 0x80, 0xC2, 0x00, 0x00, 0x03 };
...@@ -1200,7 +1200,7 @@ static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx) ...@@ -1200,7 +1200,7 @@ static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx)
return true; return true;
if (ieee80211_802_1x_port_control(rx) || if (ieee80211_802_1x_port_control(rx) ||
ieee80211_drop_unencrypted(rx)) ieee80211_drop_unencrypted(rx, fc))
return false; return false;
return true; return true;
...@@ -1270,20 +1270,21 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx) ...@@ -1270,20 +1270,21 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
{ {
struct net_device *dev = rx->dev; struct net_device *dev = rx->dev;
struct ieee80211_local *local = rx->local; struct ieee80211_local *local = rx->local;
u16 fc, ethertype; u16 ethertype;
u8 *payload; u8 *payload;
struct sk_buff *skb = rx->skb, *frame = NULL; struct sk_buff *skb = rx->skb, *frame = NULL;
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
__le16 fc = hdr->frame_control;
const struct ethhdr *eth; const struct ethhdr *eth;
int remaining, err; int remaining, err;
u8 dst[ETH_ALEN]; u8 dst[ETH_ALEN];
u8 src[ETH_ALEN]; u8 src[ETH_ALEN];
DECLARE_MAC_BUF(mac); DECLARE_MAC_BUF(mac);
fc = rx->fc; if (unlikely(!ieee80211_is_data(fc)))
if (unlikely((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA))
return RX_CONTINUE; return RX_CONTINUE;
if (unlikely(!WLAN_FC_DATA_PRESENT(fc))) if (unlikely(!ieee80211_is_data_present(fc)))
return RX_DROP_MONITOR; return RX_DROP_MONITOR;
if (!(rx->flags & IEEE80211_RX_AMSDU)) if (!(rx->flags & IEEE80211_RX_AMSDU))
...@@ -1365,7 +1366,7 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx) ...@@ -1365,7 +1366,7 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN); memcpy(skb_push(frame, ETH_ALEN), dst, ETH_ALEN);
} }
if (!ieee80211_frame_allowed(rx)) { if (!ieee80211_frame_allowed(rx, fc)) {
if (skb == frame) /* last frame */ if (skb == frame) /* last frame */
return RX_DROP_UNUSABLE; return RX_DROP_UNUSABLE;
dev_kfree_skb(frame); dev_kfree_skb(frame);
...@@ -1439,21 +1440,21 @@ static ieee80211_rx_result debug_noinline ...@@ -1439,21 +1440,21 @@ static ieee80211_rx_result debug_noinline
ieee80211_rx_h_data(struct ieee80211_rx_data *rx) ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
{ {
struct net_device *dev = rx->dev; struct net_device *dev = rx->dev;
u16 fc; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
__le16 fc = hdr->frame_control;
int err; int err;
fc = rx->fc; if (unlikely(!ieee80211_is_data(hdr->frame_control)))
if (unlikely((fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA))
return RX_CONTINUE; return RX_CONTINUE;
if (unlikely(!WLAN_FC_DATA_PRESENT(fc))) if (unlikely(!ieee80211_is_data_present(hdr->frame_control)))
return RX_DROP_MONITOR; return RX_DROP_MONITOR;
err = ieee80211_data_to_8023(rx); err = ieee80211_data_to_8023(rx);
if (unlikely(err)) if (unlikely(err))
return RX_DROP_UNUSABLE; return RX_DROP_UNUSABLE;
if (!ieee80211_frame_allowed(rx)) if (!ieee80211_frame_allowed(rx, fc))
return RX_DROP_MONITOR; return RX_DROP_MONITOR;
rx->skb->dev = dev; rx->skb->dev = dev;
...@@ -1818,13 +1819,12 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, ...@@ -1818,13 +1819,12 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
struct ieee80211_rx_data rx; struct ieee80211_rx_data rx;
u16 type;
int prepares; int prepares;
struct ieee80211_sub_if_data *prev = NULL; struct ieee80211_sub_if_data *prev = NULL;
struct sk_buff *skb_new; struct sk_buff *skb_new;
u8 *bssid; u8 *bssid;
hdr = (struct ieee80211_hdr *) skb->data; hdr = (struct ieee80211_hdr *)skb->data;
memset(&rx, 0, sizeof(rx)); memset(&rx, 0, sizeof(rx));
rx.skb = skb; rx.skb = skb;
rx.local = local; rx.local = local;
...@@ -1832,9 +1832,8 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, ...@@ -1832,9 +1832,8 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
rx.status = status; rx.status = status;
rx.rate = rate; rx.rate = rate;
rx.fc = le16_to_cpu(hdr->frame_control); rx.fc = le16_to_cpu(hdr->frame_control);
type = rx.fc & IEEE80211_FCTL_FTYPE;
if (type == IEEE80211_FTYPE_DATA || type == IEEE80211_FTYPE_MGMT) if (ieee80211_is_data(hdr->frame_control) || ieee80211_is_mgmt(hdr->frame_control))
local->dot11ReceivedFragmentCount++; local->dot11ReceivedFragmentCount++;
rx.sta = sta_info_get(local, hdr->addr2); rx.sta = sta_info_get(local, hdr->addr2);
......
...@@ -82,6 +82,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr, ...@@ -82,6 +82,7 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr,
struct ieee80211_rate *txrate; struct ieee80211_rate *txrate;
struct ieee80211_local *local = tx->local; struct ieee80211_local *local = tx->local;
struct ieee80211_supported_band *sband; struct ieee80211_supported_band *sband;
struct ieee80211_hdr *hdr;
sband = local->hw.wiphy->bands[tx->channel->band]; sband = local->hw.wiphy->bands[tx->channel->band];
txrate = &sband->bitrates[tx->rate_idx]; txrate = &sband->bitrates[tx->rate_idx];
...@@ -107,8 +108,8 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr, ...@@ -107,8 +108,8 @@ static __le16 ieee80211_duration(struct ieee80211_tx_data *tx, int group_addr,
* at the highest possible rate belonging to the PHY rates in the * at the highest possible rate belonging to the PHY rates in the
* BSSBasicRateSet * BSSBasicRateSet
*/ */
hdr = (struct ieee80211_hdr *)tx->skb->data;
if ((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_CTL) { if (ieee80211_is_ctl(hdr->frame_control)) {
/* TODO: These control frames are not currently sent by /* TODO: These control frames are not currently sent by
* 80211.o, but should they be implemented, this function * 80211.o, but should they be implemented, this function
* needs to be updated to support duration field calculation. * needs to be updated to support duration field calculation.
...@@ -213,9 +214,8 @@ static int inline is_ieee80211_device(struct net_device *dev, ...@@ -213,9 +214,8 @@ static int inline is_ieee80211_device(struct net_device *dev,
static ieee80211_tx_result debug_noinline static ieee80211_tx_result debug_noinline
ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
{ {
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
#endif /* CONFIG_MAC80211_VERBOSE_DEBUG */
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
u32 sta_flags; u32 sta_flags;
...@@ -223,8 +223,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) ...@@ -223,8 +223,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
return TX_CONTINUE; return TX_CONTINUE;
if (unlikely(tx->local->sta_sw_scanning) && if (unlikely(tx->local->sta_sw_scanning) &&
((tx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT || !ieee80211_is_probe_req(hdr->frame_control))
(tx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_PROBE_REQ))
return TX_DROP; return TX_DROP;
if (tx->sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT) if (tx->sdata->vif.type == IEEE80211_IF_TYPE_MESH_POINT)
...@@ -238,7 +237,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) ...@@ -238,7 +237,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
if (likely(tx->flags & IEEE80211_TX_UNICAST)) { if (likely(tx->flags & IEEE80211_TX_UNICAST)) {
if (unlikely(!(sta_flags & WLAN_STA_ASSOC) && if (unlikely(!(sta_flags & WLAN_STA_ASSOC) &&
tx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS && tx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS &&
(tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)) { ieee80211_is_data(hdr->frame_control))) {
#ifdef CONFIG_MAC80211_VERBOSE_DEBUG #ifdef CONFIG_MAC80211_VERBOSE_DEBUG
DECLARE_MAC_BUF(mac); DECLARE_MAC_BUF(mac);
printk(KERN_DEBUG "%s: dropped data frame to not " printk(KERN_DEBUG "%s: dropped data frame to not "
...@@ -249,7 +248,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx) ...@@ -249,7 +248,7 @@ ieee80211_tx_h_check_assoc(struct ieee80211_tx_data *tx)
return TX_DROP; return TX_DROP;
} }
} else { } else {
if (unlikely((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA && if (unlikely(ieee80211_is_data(hdr->frame_control) &&
tx->local->num_sta == 0 && tx->local->num_sta == 0 &&
tx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS)) { tx->sdata->vif.type != IEEE80211_IF_TYPE_IBSS)) {
/* /*
...@@ -315,6 +314,7 @@ static ieee80211_tx_result ...@@ -315,6 +314,7 @@ static ieee80211_tx_result
ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
{ {
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
/* /*
* broadcast/multicast frame * broadcast/multicast frame
...@@ -329,7 +329,7 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx) ...@@ -329,7 +329,7 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
return TX_CONTINUE; return TX_CONTINUE;
/* no buffering for ordered frames */ /* no buffering for ordered frames */
if (tx->fc & IEEE80211_FCTL_ORDER) if (ieee80211_has_order(hdr->frame_control))
return TX_CONTINUE; return TX_CONTINUE;
/* no stations in PS mode */ /* no stations in PS mode */
...@@ -367,12 +367,11 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) ...@@ -367,12 +367,11 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
{ {
struct sta_info *sta = tx->sta; struct sta_info *sta = tx->sta;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
u32 staflags; u32 staflags;
DECLARE_MAC_BUF(mac); DECLARE_MAC_BUF(mac);
if (unlikely(!sta || if (unlikely(!sta || ieee80211_is_probe_resp(hdr->frame_control)))
((tx->fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_MGMT &&
(tx->fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PROBE_RESP)))
return TX_CONTINUE; return TX_CONTINUE;
staflags = get_sta_flags(sta); staflags = get_sta_flags(sta);
...@@ -437,7 +436,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) ...@@ -437,7 +436,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
{ {
struct ieee80211_key *key; struct ieee80211_key *key;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
u16 fc = tx->fc; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
if (unlikely(tx->skb->do_not_encrypt)) if (unlikely(tx->skb->do_not_encrypt))
tx->key = NULL; tx->key = NULL;
...@@ -454,22 +453,16 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) ...@@ -454,22 +453,16 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
tx->key = NULL; tx->key = NULL;
if (tx->key) { if (tx->key) {
u16 ftype, stype;
tx->key->tx_rx_count++; tx->key->tx_rx_count++;
/* TODO: add threshold stuff again */ /* TODO: add threshold stuff again */
switch (tx->key->conf.alg) { switch (tx->key->conf.alg) {
case ALG_WEP: case ALG_WEP:
ftype = fc & IEEE80211_FCTL_FTYPE; if (ieee80211_is_auth(hdr->frame_control))
stype = fc & IEEE80211_FCTL_STYPE;
if (ftype == IEEE80211_FTYPE_MGMT &&
stype == IEEE80211_STYPE_AUTH)
break; break;
case ALG_TKIP: case ALG_TKIP:
case ALG_CCMP: case ALG_CCMP:
if (!WLAN_FC_DATA_PRESENT(fc)) if (!ieee80211_is_data_present(hdr->frame_control))
tx->key = NULL; tx->key = NULL;
break; break;
} }
......
...@@ -291,9 +291,10 @@ u8 * ieee80211_wep_is_weak_iv(struct sk_buff *skb, struct ieee80211_key *key) ...@@ -291,9 +291,10 @@ u8 * ieee80211_wep_is_weak_iv(struct sk_buff *skb, struct ieee80211_key *key)
ieee80211_rx_result ieee80211_rx_result
ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx) ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx)
{ {
if ((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_DATA && struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)rx->skb->data;
((rx->fc & IEEE80211_FCTL_FTYPE) != IEEE80211_FTYPE_MGMT ||
(rx->fc & IEEE80211_FCTL_STYPE) != IEEE80211_STYPE_AUTH)) if (!ieee80211_is_data(hdr->frame_control) &&
!ieee80211_is_auth(hdr->frame_control))
return RX_CONTINUE; return RX_CONTINUE;
if (!(rx->status->flag & RX_FLAG_DECRYPTED)) { if (!(rx->status->flag & RX_FLAG_DECRYPTED)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment