forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[MAC80211]: Add mac80211 wireless stack.
Add mac80211, the IEEE 802.11 software MAC layer. Signed-off-by: Jiri Benc <[email protected]> Signed-off-by: John W. Linville <[email protected]>
- Loading branch information
Showing
34 changed files
with
16,110 additions
and
2 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
config MAC80211 | ||
tristate "Generic IEEE 802.11 Networking Stack (mac80211)" | ||
depends on EXPERIMENTAL | ||
select CRYPTO | ||
select CRYPTO_ECB | ||
select CRYPTO_ARC4 | ||
select CRYPTO_AES | ||
select CRC32 | ||
select WIRELESS_EXT | ||
select CFG80211 | ||
select NET_SCH_FIFO | ||
---help--- | ||
This option enables the hardware independent IEEE 802.11 | ||
networking stack. | ||
|
||
config MAC80211_LEDS | ||
bool "Enable LED triggers" | ||
depends on MAC80211 && LEDS_TRIGGERS | ||
---help--- | ||
This option enables a few LED triggers for different | ||
packet receive/transmit events. | ||
|
||
config MAC80211_DEBUG | ||
bool "Enable debugging output" | ||
depends on MAC80211 | ||
---help--- | ||
This option will enable debug tracing output for the | ||
ieee80211 network stack. | ||
|
||
If you are not trying to debug or develop the ieee80211 | ||
subsystem, you most likely want to say N here. | ||
|
||
config MAC80211_VERBOSE_DEBUG | ||
bool "Verbose debugging output" | ||
depends on MAC80211_DEBUG | ||
|
||
config MAC80211_LOWTX_FRAME_DUMP | ||
bool "Debug frame dumping" | ||
depends on MAC80211_DEBUG | ||
---help--- | ||
Selecting this option will cause the stack to | ||
print a message for each frame that is handed | ||
to the lowlevel driver for transmission. This | ||
message includes all MAC addresses and the | ||
frame control field. | ||
|
||
If unsure, say N and insert the debugging code | ||
you require into the driver you are debugging. | ||
|
||
config TKIP_DEBUG | ||
bool "TKIP debugging" | ||
depends on MAC80211_DEBUG | ||
|
||
config MAC80211_DEBUG_COUNTERS | ||
bool "Extra statistics for TX/RX debugging" | ||
depends on MAC80211_DEBUG | ||
|
||
config MAC80211_IBSS_DEBUG | ||
bool "Support for IBSS testing" | ||
depends on MAC80211_DEBUG | ||
---help--- | ||
Say Y here if you intend to debug the IBSS code. | ||
|
||
config MAC80211_VERBOSE_PS_DEBUG | ||
bool "Verbose powersave mode debugging" | ||
depends on MAC80211_DEBUG | ||
---help--- | ||
Say Y here to print out verbose powersave | ||
mode debug messages. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
obj-$(CONFIG_MAC80211) += mac80211.o rc80211_simple.o | ||
|
||
mac80211-objs-$(CONFIG_MAC80211_LEDS) += ieee80211_led.o | ||
|
||
mac80211-objs := \ | ||
ieee80211.o \ | ||
ieee80211_ioctl.o \ | ||
sta_info.o \ | ||
wep.o \ | ||
wpa.o \ | ||
ieee80211_sta.o \ | ||
ieee80211_iface.o \ | ||
ieee80211_rate.o \ | ||
michael.o \ | ||
tkip.o \ | ||
aes_ccm.o \ | ||
wme.o \ | ||
ieee80211_cfg.o \ | ||
$(mac80211-objs-y) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
/* | ||
* Copyright 2003-2004, Instant802 Networks, Inc. | ||
* Copyright 2005-2006, Devicescape Software, Inc. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/types.h> | ||
#include <linux/crypto.h> | ||
#include <linux/err.h> | ||
#include <asm/scatterlist.h> | ||
|
||
#include <net/mac80211.h> | ||
#include "ieee80211_key.h" | ||
#include "aes_ccm.h" | ||
|
||
|
||
static void ieee80211_aes_encrypt(struct crypto_cipher *tfm, | ||
const u8 pt[16], u8 ct[16]) | ||
{ | ||
crypto_cipher_encrypt_one(tfm, ct, pt); | ||
} | ||
|
||
|
||
static inline void aes_ccm_prepare(struct crypto_cipher *tfm, u8 *b_0, u8 *aad, | ||
u8 *b, u8 *s_0, u8 *a) | ||
{ | ||
int i; | ||
|
||
ieee80211_aes_encrypt(tfm, b_0, b); | ||
|
||
/* Extra Authenticate-only data (always two AES blocks) */ | ||
for (i = 0; i < AES_BLOCK_LEN; i++) | ||
aad[i] ^= b[i]; | ||
ieee80211_aes_encrypt(tfm, aad, b); | ||
|
||
aad += AES_BLOCK_LEN; | ||
|
||
for (i = 0; i < AES_BLOCK_LEN; i++) | ||
aad[i] ^= b[i]; | ||
ieee80211_aes_encrypt(tfm, aad, a); | ||
|
||
/* Mask out bits from auth-only-b_0 */ | ||
b_0[0] &= 0x07; | ||
|
||
/* S_0 is used to encrypt T (= MIC) */ | ||
b_0[14] = 0; | ||
b_0[15] = 0; | ||
ieee80211_aes_encrypt(tfm, b_0, s_0); | ||
} | ||
|
||
|
||
void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch, | ||
u8 *b_0, u8 *aad, u8 *data, size_t data_len, | ||
u8 *cdata, u8 *mic) | ||
{ | ||
int i, j, last_len, num_blocks; | ||
u8 *pos, *cpos, *b, *s_0, *e; | ||
|
||
b = scratch; | ||
s_0 = scratch + AES_BLOCK_LEN; | ||
e = scratch + 2 * AES_BLOCK_LEN; | ||
|
||
num_blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; | ||
last_len = data_len % AES_BLOCK_LEN; | ||
aes_ccm_prepare(tfm, b_0, aad, b, s_0, b); | ||
|
||
/* Process payload blocks */ | ||
pos = data; | ||
cpos = cdata; | ||
for (j = 1; j <= num_blocks; j++) { | ||
int blen = (j == num_blocks && last_len) ? | ||
last_len : AES_BLOCK_LEN; | ||
|
||
/* Authentication followed by encryption */ | ||
for (i = 0; i < blen; i++) | ||
b[i] ^= pos[i]; | ||
ieee80211_aes_encrypt(tfm, b, b); | ||
|
||
b_0[14] = (j >> 8) & 0xff; | ||
b_0[15] = j & 0xff; | ||
ieee80211_aes_encrypt(tfm, b_0, e); | ||
for (i = 0; i < blen; i++) | ||
*cpos++ = *pos++ ^ e[i]; | ||
} | ||
|
||
for (i = 0; i < CCMP_MIC_LEN; i++) | ||
mic[i] = b[i] ^ s_0[i]; | ||
} | ||
|
||
|
||
int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch, | ||
u8 *b_0, u8 *aad, u8 *cdata, size_t data_len, | ||
u8 *mic, u8 *data) | ||
{ | ||
int i, j, last_len, num_blocks; | ||
u8 *pos, *cpos, *b, *s_0, *a; | ||
|
||
b = scratch; | ||
s_0 = scratch + AES_BLOCK_LEN; | ||
a = scratch + 2 * AES_BLOCK_LEN; | ||
|
||
num_blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN; | ||
last_len = data_len % AES_BLOCK_LEN; | ||
aes_ccm_prepare(tfm, b_0, aad, b, s_0, a); | ||
|
||
/* Process payload blocks */ | ||
cpos = cdata; | ||
pos = data; | ||
for (j = 1; j <= num_blocks; j++) { | ||
int blen = (j == num_blocks && last_len) ? | ||
last_len : AES_BLOCK_LEN; | ||
|
||
/* Decryption followed by authentication */ | ||
b_0[14] = (j >> 8) & 0xff; | ||
b_0[15] = j & 0xff; | ||
ieee80211_aes_encrypt(tfm, b_0, b); | ||
for (i = 0; i < blen; i++) { | ||
*pos = *cpos++ ^ b[i]; | ||
a[i] ^= *pos++; | ||
} | ||
|
||
ieee80211_aes_encrypt(tfm, a, a); | ||
} | ||
|
||
for (i = 0; i < CCMP_MIC_LEN; i++) { | ||
if ((mic[i] ^ s_0[i]) != a[i]) | ||
return -1; | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
|
||
struct crypto_cipher * ieee80211_aes_key_setup_encrypt(const u8 key[]) | ||
{ | ||
struct crypto_cipher *tfm; | ||
|
||
tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC); | ||
if (IS_ERR(tfm)) | ||
return NULL; | ||
|
||
crypto_cipher_setkey(tfm, key, ALG_CCMP_KEY_LEN); | ||
|
||
return tfm; | ||
} | ||
|
||
|
||
void ieee80211_aes_key_free(struct crypto_cipher *tfm) | ||
{ | ||
if (tfm) | ||
crypto_free_cipher(tfm); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
/* | ||
* Copyright 2003-2004, Instant802 Networks, Inc. | ||
* Copyright 2006, Devicescape Software, Inc. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#ifndef AES_CCM_H | ||
#define AES_CCM_H | ||
|
||
#include <linux/crypto.h> | ||
|
||
#define AES_BLOCK_LEN 16 | ||
|
||
struct crypto_cipher * ieee80211_aes_key_setup_encrypt(const u8 key[]); | ||
void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch, | ||
u8 *b_0, u8 *aad, u8 *data, size_t data_len, | ||
u8 *cdata, u8 *mic); | ||
int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch, | ||
u8 *b_0, u8 *aad, u8 *cdata, size_t data_len, | ||
u8 *mic, u8 *data); | ||
void ieee80211_aes_key_free(struct crypto_cipher *tfm); | ||
|
||
#endif /* AES_CCM_H */ |
Oops, something went wrong.