Skip to contentSkip to conversation

mac80211: Defer setting of RX_FLAG_DECRYPTED.

PATCH In review Mattias Nissler 3 participants 7 messages Oct 7, 2007 – Oct 10, 2007 mac80211

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mac80211: Defer setting of RX_FLAG_DECRYPTED.

The decryption handlers will skip the frame if the RX_FLAG_DECRYPTED flag is set, so the early flag setting introduced by Johannes breaks decryption. To work around this, call the handlers first and then set the flag.

---
 net/mac80211/rx.c |   20 +++++++++++---------
 1 files changed, 11 insertions(+), 9 deletions(-)
net/mac80211/rx.c +11 -9
index de3f7ae..34699a1 100644
@@ -424,6 +424,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx)
 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
 	int keyidx;
 	int hdrlen;
+	ieee80211_txrx_result result = TXRX_DROP;
 	struct ieee80211_key *stakey = NULL;
 
 	/*
@@ -522,21 +523,22 @@ ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx)
 	    ieee80211_wep_is_weak_iv(rx->skb, rx->key))
 		rx->sta->wep_weak_iv_count++;
 
-	/* either the frame will be decrypted or dropped */
-	rx->u.rx.status->flag |= RX_FLAG_DECRYPTED;
-
 	switch (rx->key->conf.alg) {
 	case ALG_WEP:
-		return ieee80211_crypto_wep_decrypt(rx);
+		result = ieee80211_crypto_wep_decrypt(rx);
+		break;
 	case ALG_TKIP:
-		return ieee80211_crypto_tkip_decrypt(rx);
+		result = ieee80211_crypto_tkip_decrypt(rx);
+		break;
 	case ALG_CCMP:
-		return ieee80211_crypto_ccmp_decrypt(rx);
+		result = ieee80211_crypto_ccmp_decrypt(rx);
+		break;
 	}
 
-	/* not reached */
-	WARN_ON(1);
-	return TXRX_DROP;
+	/* either the frame will be decrypted or dropped */
+	rx->u.rx.status->flag |= RX_FLAG_DECRYPTED;
+
+	return result;
 }
 
 static void ap_sta_ps_start(struct net_device *dev, struct sta_info *sta)
Signature · 1 line
1.5.3
#1 lore raw
Quoted 38 lines · On Sunday 07 October 2007 16:35:31 Mattias Nissler wrote:

The decryption handlers will skip the frame if the RX_FLAG_DECRYPTED flag is set, so the early flag setting introduced by Johannes breaks decryption. To work around this, call the handlers first and then set the flag.

---
 net/mac80211/rx.c |   20 +++++++++++---------
 1 files changed, 11 insertions(+), 9 deletions(-)
net/mac80211/rx.c +5 -5
index de3f7ae..34699a1 100644
@@ -424,6 +424,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx)
 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) rx->skb->data;
 	int keyidx;
 	int hdrlen;
+	ieee80211_txrx_result result = TXRX_DROP;
 	struct ieee80211_key *stakey = NULL;
 
 	/*
@@ -522,21 +523,22 @@ ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx)
 	    ieee80211_wep_is_weak_iv(rx->skb, rx->key))
 		rx->sta->wep_weak_iv_count++;
 
-	/* either the frame will be decrypted or dropped */
-	rx->u.rx.status->flag |= RX_FLAG_DECRYPTED;
-
 	switch (rx->key->conf.alg) {
 	case ALG_WEP:
-		return ieee80211_crypto_wep_decrypt(rx);
+		result = ieee80211_crypto_wep_decrypt(rx);
+		break;
 	case ALG_TKIP:
-		return ieee80211_crypto_tkip_decrypt(rx);
+		result = ieee80211_crypto_tkip_decrypt(rx);
+		break;

net/mac80211/rx.c ieee80211_rx_h_decrypt(struct ieee80211_txrx_data *rx) · line 538

Quoted 10 lines
net/mac80211/rx.c +3 -4
 	case ALG_CCMP:
-		return ieee80211_crypto_ccmp_decrypt(rx);
+		result = ieee80211_crypto_ccmp_decrypt(rx);
+		break;
 	}
 
-	/* not reached */
-	WARN_ON(1);
-	return TXRX_DROP;
+	/* either the frame will be decrypted or dropped */

I think this comment doesn't apply then anymore, eh?

Quoted 6 lines
net/mac80211/rx.c +3 -0
+	rx->u.rx.status->flag |= RX_FLAG_DECRYPTED;
+
+	return result;
 }
 
 static void ap_sta_ps_start(struct net_device *dev, struct sta_info *sta)
Signature · 1 line
Greetings Michael.
#2 lore raw
Quoted 4 lines · Michael Buesch

Review

Quoted 1 line · On Sunday 07 October 2007 16:35:31 Mattias Nissler wrote:
(quoted diff) +1 -0
+	/* either the frame will be decrypted or dropped */

I think this comment doesn't apply then anymore, eh?

Well, I changed the wording to "has been decrypted or will be dropped".

Mattias

The decryption handlers will skip the frame if the RX_FLAG_DECRYPTED flag is set, so the early flag setting introduced by Johannes breaks decryption. To work around this, call the handlers first and then set the flag.

---
 net/mac80211/rx.c |   20 +++++++++++---------
 1 files changed, 11 insertions(+), 9 deletions(-)
net/mac80211/rx.c +0 -0
index de3f7ae..34699a1 100644
@@ -424,6 +424,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_txrx_data

*rx)

        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)
rx->skb->data;
        int keyidx;
        int hdrlen;
+       ieee80211_txrx_result result = TXRX_DROP;
        struct ieee80211_key *stakey = NULL;
 
        /*
@@ -522,21 +523,22 @@ ieee80211_rx_h_decrypt(struct ieee80211_txrx_data
*rx)
            ieee80211_wep_is_weak_iv(rx->skb, rx->key))
                rx->sta->wep_weak_iv_count++;

- /* either the frame will be decrypted or dropped */
- rx->u.rx.status->flag |= RX_FLAG_DECRYPTED;
-

        switch (rx->key->conf.alg) {
        case ALG_WEP:
-               return ieee80211_crypto_wep_decrypt(rx);
+               result = ieee80211_crypto_wep_decrypt(rx);
+               break;
        case ALG_TKIP:
-               return ieee80211_crypto_tkip_decrypt(rx);
+               result = ieee80211_crypto_tkip_decrypt(rx);
+               break;
        case ALG_CCMP:
-               return ieee80211_crypto_ccmp_decrypt(rx);
+               result = ieee80211_crypto_ccmp_decrypt(rx);
+               break;
        }
-       /* not reached */
-       WARN_ON(1);
-       return TXRX_DROP;
+       /* either the frame has been decrypted or will be dropped */
+       rx->u.rx.status->flag |= RX_FLAG_DECRYPTED;

+
+ return result;
}

static void ap_sta_ps_start(struct net_device *dev, struct sta_info
*sta)

Signature · 1 line
1.5.3
maintainer Reviewed-by
#3 lore raw
Quoted 6 lines · Mattias Nissler

The decryption handlers will skip the frame if the RX_FLAG_DECRYPTED flag is set, so the early flag setting introduced by Johannes breaks decryption. To work around this, call the handlers first and then set the flag.

However, the patch is mangled (line-wrapped)

Quoted 52 lines
---
 net/mac80211/rx.c |   20 +++++++++++---------
 1 files changed, 11 insertions(+), 9 deletions(-)
net/mac80211/rx.c +1 -0
index de3f7ae..34699a1 100644
@@ -424,6 +424,7 @@ ieee80211_rx_h_decrypt(struct ieee80211_txrx_data
 *rx)
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)
 rx->skb->data;
        int keyidx;
        int hdrlen;
+       ieee80211_txrx_result result = TXRX_DROP;
        struct ieee80211_key *stakey = NULL;
 
        /*
net/mac80211/rx.c +10 -9
@@ -522,21 +523,22 @@ ieee80211_rx_h_decrypt(struct ieee80211_txrx_data
 *rx)
            ieee80211_wep_is_weak_iv(rx->skb, rx->key))
                rx->sta->wep_weak_iv_count++;
 
-       /* either the frame will be decrypted or dropped */
-       rx->u.rx.status->flag |= RX_FLAG_DECRYPTED;
-
        switch (rx->key->conf.alg) {
        case ALG_WEP:
-               return ieee80211_crypto_wep_decrypt(rx);
+               result = ieee80211_crypto_wep_decrypt(rx);
+               break;
        case ALG_TKIP:
-               return ieee80211_crypto_tkip_decrypt(rx);
+               result = ieee80211_crypto_tkip_decrypt(rx);
+               break;
        case ALG_CCMP:
-               return ieee80211_crypto_ccmp_decrypt(rx);
+               result = ieee80211_crypto_ccmp_decrypt(rx);
+               break;
        }
 
-       /* not reached */
-       WARN_ON(1);
-       return TXRX_DROP;
+       /* either the frame has been decrypted or will be dropped */
+       rx->u.rx.status->flag |= RX_FLAG_DECRYPTED;
+
+       return result;
 }
 

static void ap_sta_ps_start(struct net_device *dev, struct sta_info
*sta)

#4 lore raw
Quoted 7 lines · Johannes Berg
Quoted 5 lines · Mattias Nissler

The decryption handlers will skip the frame if the RX_FLAG_DECRYPTED flag is set, so the early flag setting introduced by Johannes breaks decryption. To work around this, call the handlers first and then set the flag.

Quoted 5 lines
Quoted 1 line

However, the patch is mangled (line-wrapped)

Sorry. Comes from editing patches manually. I see John already took care of it ;-)

Mattias

maintainer
#5 lore raw
In reply to Mattias Nissler
Quoted 4 lines · Mattias Nissler

The decryption handlers will skip the frame if the RX_FLAG_DECRYPTED flag is set, so the early flag setting introduced by Johannes breaks decryption. To work around this, call the handlers first and then set the flag.

Huh. Sorry about that. I had a patch like this initially but then wanted to not clutter the code. I think we should instead remove the checks from the actual decryption functions though. Mind making a patch for that?

johannes

maintainer
#6 lore raw
Quoted 4 lines · Johannes Berg

Huh. Sorry about that. I had a patch like this initially but then wanted to not clutter the code. I think we should instead remove the checks from the actual decryption functions though. Mind making a patch for that?

Never mind. This looks better since it doesn't require rewriting half the crypto code.

johannes