Skip to contentSkip to conversation

mac80211: tkip.c use get/put_unaligned helpers

PATCH In review Harvey Harrison 4 participants 5 messages Apr 16, 2008 – Apr 17, 2008 mac80211

lore
Share & tools
lore
#0 lore raw

PATCH 1/3 mac80211: tkip.c use get/put_unaligned helpers

---
This depends on the introduction of the new unaligned helpers, and applies on top of the cleanup patches already in -mm.

 net/mac80211/tkip.c |   62 +++++++++++++++++++--------------------------------
 1 files changed, 23 insertions(+), 39 deletions(-)
net/mac80211/tkip.c +23 -39
index 61c60d3..1c5a46a 100644
@@ -63,16 +63,6 @@ static const u16 tkip_sbox[256] =
 	0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
 };
 
-
-/*
- * Get a cpu-byteorder u16 from a u8 pointer fixing up possible unaligned
- * accesses.
- */
-static inline u16 getle16(const u8 *x)
-{
-	return le16_to_cpu(get_unaligned((__le16 *)x));
-}
-
 static inline u16 tkip_S(u16 val)
 {
 	return tkip_sbox[val & 0xff] ^ swab16(tkip_sbox[val >> 8]);
@@ -91,17 +81,17 @@ static void tkip_mixing_phase1(const u8 *ta, const u8 *tk, u32 tsc_IV32,
 
 	p1k[0] = tsc_IV32 & 0xFFFF;
 	p1k[1] = tsc_IV32 >> 16;
-	p1k[2] = getle16(ta + 0);
-	p1k[3] = getle16(ta + 2);
-	p1k[4] = getle16(ta + 4);
+	p1k[2] = get_unaligned_le16(ta + 0);
+	p1k[3] = get_unaligned_le16(ta + 2);
+	p1k[4] = get_unaligned_le16(ta + 4);
 
 	for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
 		j = 2 * (i & 1);
-		p1k[0] += tkip_S(p1k[4] ^ getle16(tk + 0 + j));
-		p1k[1] += tkip_S(p1k[0] ^ getle16(tk + 4 + j));
-		p1k[2] += tkip_S(p1k[1] ^ getle16(tk + 8 + j));
-		p1k[3] += tkip_S(p1k[2] ^ getle16(tk + 12 + j));
-		p1k[4] += tkip_S(p1k[3] ^ getle16(tk + 0 + j)) + i;
+		p1k[0] += tkip_S(p1k[4] ^ get_unaligned_le16(tk + 0 + j));
+		p1k[1] += tkip_S(p1k[0] ^ get_unaligned_le16(tk + 4 + j));
+		p1k[2] += tkip_S(p1k[1] ^ get_unaligned_le16(tk + 8 + j));
+		p1k[3] += tkip_S(p1k[2] ^ get_unaligned_le16(tk + 12 + j));
+		p1k[4] += tkip_S(p1k[3] ^ get_unaligned_le16(tk + 0 + j)) + i;
 	}
 }
 
@@ -119,14 +109,14 @@ static void tkip_mixing_phase2(const u16 *p1k, const u8 *tk, u16 tsc_IV16,
 	ppk[4] = p1k[4];
 	ppk[5] = p1k[4] + tsc_IV16;
 
-	ppk[0] += tkip_S(ppk[5] ^ getle16(tk + 0));
-	ppk[1] += tkip_S(ppk[0] ^ getle16(tk + 2));
-	ppk[2] += tkip_S(ppk[1] ^ getle16(tk + 4));
-	ppk[3] += tkip_S(ppk[2] ^ getle16(tk + 6));
-	ppk[4] += tkip_S(ppk[3] ^ getle16(tk + 8));
-	ppk[5] += tkip_S(ppk[4] ^ getle16(tk + 10));
-	ppk[0] +=  ror16(ppk[5] ^ getle16(tk + 12), 1);
-	ppk[1] +=  ror16(ppk[0] ^ getle16(tk + 14), 1);
+	ppk[0] += tkip_S(ppk[5] ^ get_unaligned_le16(tk + 0));
+	ppk[1] += tkip_S(ppk[0] ^ get_unaligned_le16(tk + 2));
+	ppk[2] += tkip_S(ppk[1] ^ get_unaligned_le16(tk + 4));
+	ppk[3] += tkip_S(ppk[2] ^ get_unaligned_le16(tk + 6));
+	ppk[4] += tkip_S(ppk[3] ^ get_unaligned_le16(tk + 8));
+	ppk[5] += tkip_S(ppk[4] ^ get_unaligned_le16(tk + 10));
+	ppk[0] +=  ror16(ppk[5] ^ get_unaligned_le16(tk + 12), 1);
+	ppk[1] +=  ror16(ppk[0] ^ get_unaligned_le16(tk + 14), 1);
 	ppk[2] +=  ror16(ppk[1], 1);
 	ppk[3] +=  ror16(ppk[2], 1);
 	ppk[4] +=  ror16(ppk[3], 1);
@@ -135,11 +125,11 @@ static void tkip_mixing_phase2(const u16 *p1k, const u8 *tk, u16 tsc_IV16,
 	rc4key[0] = tsc_IV16 >> 8;
 	rc4key[1] = ((tsc_IV16 >> 8) | 0x20) & 0x7f;
 	rc4key[2] = tsc_IV16 & 0xFF;
-	rc4key[3] = ((ppk[5] ^ getle16(tk)) >> 1) & 0xFF;
+	rc4key[3] = ((ppk[5] ^ get_unaligned_le16(tk)) >> 1) & 0xFF;
 
 	rc4key += 4;
-	for (i = 0; i < 6; i++)
-		put_unaligned(cpu_to_le16(ppk[i]), (__le16 *)rc4key + i);
+	for (i = 0; i < 12; i += 2)
+		put_unaligned_le16(ppk[i], rc4key + i);
 }
 
 
@@ -153,11 +143,8 @@ u8 * ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key,
 	*pos++ = iv1;
 	*pos++ = iv2;
 	*pos++ = (key->conf.keyidx << 6) | (1 << 5) /* Ext IV */;
-	*pos++ = key->u.tkip.iv32 & 0xff;
-	*pos++ = (key->u.tkip.iv32 >> 8) & 0xff;
-	*pos++ = (key->u.tkip.iv32 >> 16) & 0xff;
-	*pos++ = (key->u.tkip.iv32 >> 24) & 0xff;
-	return pos;
+	put_unaligned_le32(key->u.tkip.iv32, pos);
+	return pos + 4;
 }
 
 
@@ -200,10 +187,7 @@ void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf,
 
 	iv16 = data[hdr_len] << 8;
 	iv16 += data[hdr_len + 2];
-	iv32 = data[hdr_len + 4] +
-		(data[hdr_len + 5] >> 8) +
-		(data[hdr_len + 6] >> 16) +
-		(data[hdr_len + 7] >> 24);
+	iv32 = get_unaligned_le32(data + hdr_len + 4);
 
 #ifdef CONFIG_TKIP_DEBUG
 	printk(KERN_DEBUG "TKIP encrypt: iv16 = 0x%04x, iv32 = 0x%08x\n",
@@ -274,7 +258,7 @@ int ieee80211_tkip_decrypt_data(struct crypto_blkcipher *tfm,
 
 	iv16 = (pos[0] << 8) | pos[2];
 	keyid = pos[3];
-	iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24);
+	iv32 = get_unaligned_le32(pos + 4);
 	pos += 8;
 #ifdef CONFIG_TKIP_DEBUG
 	{
Signature · 1 line
1.5.5.144.g3e42
#1 lore raw
Quoted 4 lines · Harvey Harrison

---
This depends on the introduction of the new unaligned helpers, and applies on top of the cleanup patches already in -mm.

Please send all mac80211 patches to the linux-wireless mailing list and CC Johannes Berg. (It's a good idea to resend all of the mac80211 patches you sent.)

Thanks,

Jiri

Quoted 127 lines
 net/mac80211/tkip.c |   62 +++++++++++++++++++--------------------------------
 1 files changed, 23 insertions(+), 39 deletions(-)
net/mac80211/tkip.c +23 -39
index 61c60d3..1c5a46a 100644
@@ -63,16 +63,6 @@ static const u16 tkip_sbox[256] =
 	0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
 };
 
-
-/*
- * Get a cpu-byteorder u16 from a u8 pointer fixing up possible unaligned
- * accesses.
- */
-static inline u16 getle16(const u8 *x)
-{
-	return le16_to_cpu(get_unaligned((__le16 *)x));
-}
-
 static inline u16 tkip_S(u16 val)
 {
 	return tkip_sbox[val & 0xff] ^ swab16(tkip_sbox[val >> 8]);
@@ -91,17 +81,17 @@ static void tkip_mixing_phase1(const u8 *ta, const u8 *tk, u32 tsc_IV32,
 
 	p1k[0] = tsc_IV32 & 0xFFFF;
 	p1k[1] = tsc_IV32 >> 16;
-	p1k[2] = getle16(ta + 0);
-	p1k[3] = getle16(ta + 2);
-	p1k[4] = getle16(ta + 4);
+	p1k[2] = get_unaligned_le16(ta + 0);
+	p1k[3] = get_unaligned_le16(ta + 2);
+	p1k[4] = get_unaligned_le16(ta + 4);
 
 	for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
 		j = 2 * (i & 1);
-		p1k[0] += tkip_S(p1k[4] ^ getle16(tk + 0 + j));
-		p1k[1] += tkip_S(p1k[0] ^ getle16(tk + 4 + j));
-		p1k[2] += tkip_S(p1k[1] ^ getle16(tk + 8 + j));
-		p1k[3] += tkip_S(p1k[2] ^ getle16(tk + 12 + j));
-		p1k[4] += tkip_S(p1k[3] ^ getle16(tk + 0 + j)) + i;
+		p1k[0] += tkip_S(p1k[4] ^ get_unaligned_le16(tk + 0 + j));
+		p1k[1] += tkip_S(p1k[0] ^ get_unaligned_le16(tk + 4 + j));
+		p1k[2] += tkip_S(p1k[1] ^ get_unaligned_le16(tk + 8 + j));
+		p1k[3] += tkip_S(p1k[2] ^ get_unaligned_le16(tk + 12 + j));
+		p1k[4] += tkip_S(p1k[3] ^ get_unaligned_le16(tk + 0 + j)) + i;
 	}
 }
 
@@ -119,14 +109,14 @@ static void tkip_mixing_phase2(const u16 *p1k, const u8 *tk, u16 tsc_IV16,
 	ppk[4] = p1k[4];
 	ppk[5] = p1k[4] + tsc_IV16;
 
-	ppk[0] += tkip_S(ppk[5] ^ getle16(tk + 0));
-	ppk[1] += tkip_S(ppk[0] ^ getle16(tk + 2));
-	ppk[2] += tkip_S(ppk[1] ^ getle16(tk + 4));
-	ppk[3] += tkip_S(ppk[2] ^ getle16(tk + 6));
-	ppk[4] += tkip_S(ppk[3] ^ getle16(tk + 8));
-	ppk[5] += tkip_S(ppk[4] ^ getle16(tk + 10));
-	ppk[0] +=  ror16(ppk[5] ^ getle16(tk + 12), 1);
-	ppk[1] +=  ror16(ppk[0] ^ getle16(tk + 14), 1);
+	ppk[0] += tkip_S(ppk[5] ^ get_unaligned_le16(tk + 0));
+	ppk[1] += tkip_S(ppk[0] ^ get_unaligned_le16(tk + 2));
+	ppk[2] += tkip_S(ppk[1] ^ get_unaligned_le16(tk + 4));
+	ppk[3] += tkip_S(ppk[2] ^ get_unaligned_le16(tk + 6));
+	ppk[4] += tkip_S(ppk[3] ^ get_unaligned_le16(tk + 8));
+	ppk[5] += tkip_S(ppk[4] ^ get_unaligned_le16(tk + 10));
+	ppk[0] +=  ror16(ppk[5] ^ get_unaligned_le16(tk + 12), 1);
+	ppk[1] +=  ror16(ppk[0] ^ get_unaligned_le16(tk + 14), 1);
 	ppk[2] +=  ror16(ppk[1], 1);
 	ppk[3] +=  ror16(ppk[2], 1);
 	ppk[4] +=  ror16(ppk[3], 1);
@@ -135,11 +125,11 @@ static void tkip_mixing_phase2(const u16 *p1k, const u8 *tk, u16 tsc_IV16,
 	rc4key[0] = tsc_IV16 >> 8;
 	rc4key[1] = ((tsc_IV16 >> 8) | 0x20) & 0x7f;
 	rc4key[2] = tsc_IV16 & 0xFF;
-	rc4key[3] = ((ppk[5] ^ getle16(tk)) >> 1) & 0xFF;
+	rc4key[3] = ((ppk[5] ^ get_unaligned_le16(tk)) >> 1) & 0xFF;
 
 	rc4key += 4;
-	for (i = 0; i < 6; i++)
-		put_unaligned(cpu_to_le16(ppk[i]), (__le16 *)rc4key + i);
+	for (i = 0; i < 12; i += 2)
+		put_unaligned_le16(ppk[i], rc4key + i);
 }
 
 
@@ -153,11 +143,8 @@ u8 * ieee80211_tkip_add_iv(u8 *pos, struct ieee80211_key *key,
 	*pos++ = iv1;
 	*pos++ = iv2;
 	*pos++ = (key->conf.keyidx << 6) | (1 << 5) /* Ext IV */;
-	*pos++ = key->u.tkip.iv32 & 0xff;
-	*pos++ = (key->u.tkip.iv32 >> 8) & 0xff;
-	*pos++ = (key->u.tkip.iv32 >> 16) & 0xff;
-	*pos++ = (key->u.tkip.iv32 >> 24) & 0xff;
-	return pos;
+	put_unaligned_le32(key->u.tkip.iv32, pos);
+	return pos + 4;
 }
 
 
@@ -200,10 +187,7 @@ void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf,
 
 	iv16 = data[hdr_len] << 8;
 	iv16 += data[hdr_len + 2];
-	iv32 = data[hdr_len + 4] +
-		(data[hdr_len + 5] >> 8) +
-		(data[hdr_len + 6] >> 16) +
-		(data[hdr_len + 7] >> 24);
+	iv32 = get_unaligned_le32(data + hdr_len + 4);
 
 #ifdef CONFIG_TKIP_DEBUG
 	printk(KERN_DEBUG "TKIP encrypt: iv16 = 0x%04x, iv32 = 0x%08x\n",
@@ -274,7 +258,7 @@ int ieee80211_tkip_decrypt_data(struct crypto_blkcipher *tfm,
 
 	iv16 = (pos[0] << 8) | pos[2];
 	keyid = pos[3];
-	iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24);
+	iv32 = get_unaligned_le32(pos + 4);
 	pos += 8;
 #ifdef CONFIG_TKIP_DEBUG
 	{
Signature · 1 line
1.5.5.144.g3e42
Signature · 2 lines
Jiri Benc
SUSE Labs
#2 lore raw
Quoted 5 lines · Jiri Benc
Quoted 2 lines

This depends on the introduction of the new unaligned helpers, and applies on top of the cleanup patches already in -mm.

Please send all mac80211 patches to the linux-wireless mailing list and CC Johannes Berg. (It's a good idea to resend all of the mac80211 patches you sent.)

This patchset is quite special though, as it touches a lot of subsystems and depends on code not yet present in mainline ... quoting Andrew's reply to me:

==

Quoted 3 lines

I guess you are going to push this stuff through -mm altogether, right? I can hardly take this into my tree right now, as the helpers are not in Linus' tree yet.

yeah, sorry, that's been confusing a few people.

Strictly I'd merge the core infrastructure and then send the dependent patches into the relevant maintainers. But that can mean than we needlessly miss the merge window, so it's most parctical to send along an acked-by and I'll merge the dependent patch directly with the appropriate ordering.
==

Signature · 1 line
Jiri Kosina
maintainer
#3 lore raw
Quoted 5 lines
Quoted 4 lines

I guess you are going to push this stuff through -mm altogether, right? I can hardly take this into my tree right now, as the helpers are not in Linus' tree yet.

Quoted 7 lines

yeah, sorry, that's been confusing a few people.

Strictly I'd merge the core infrastructure and then send the dependent patches into the relevant maintainers. But that can mean than we needlessly miss the merge window, so it's most parctical to send along an acked-by and I'll merge the dependent patch directly with the appropriate ordering.

I guess what Jiri (Benc) is saying that *I* should ack them, not him. Jiri (Benc), maybe you care to move yourself down in the maintainers file?

johannes

#4 lore raw
Quoted 12 lines · Johannes Berg
Quoted 11 lines
Quoted 3 lines

I guess you are going to push this stuff through -mm altogether, right? I can hardly take this into my tree right now, as the helpers are not in Linus' tree yet.

yeah, sorry, that's been confusing a few people.

Strictly I'd merge the core infrastructure and then send the dependent patches into the relevant maintainers. But that can mean than we needlessly miss the merge window, so it's most parctical to send along an acked-by and I'll merge the dependent patch directly with the appropriate ordering.

Quoted 3 lines

I guess what Jiri (Benc) is saying that *I* should ack them, not him. Jiri (Benc), maybe you care to move yourself down in the maintainers file?

I'll resubmit a cleaned up series anyways once the unaligned access helpers get into mainline, so don't worry too much about this set I suppose.

Cheers,

Harvey