aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@pobox.com>2005-10-04 08:22:13 -0400
committerJeff Garzik <jgarzik@pobox.com>2005-10-04 08:22:13 -0400
commit13d1ef29bc5125d7b77c5f6cdfde5ed31226005c (patch)
treefdab36f463a248d5be3bd46a5ad181f6d354ddde
parente2608361be343e6220e0a87e04ff224eb037df31 (diff)
parentff0037b259e8b47843176142131844bc80fd2887 (diff)
Merge rsync://bughost.org/repos/ieee80211-delta/
-rw-r--r--include/net/ieee80211.h30
-rw-r--r--include/net/ieee80211_crypt.h6
-rw-r--r--net/ieee80211/ieee80211_rx.c314
3 files changed, 166 insertions, 184 deletions
diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h
index 4851756202c5..58f62224e7ea 100644
--- a/include/net/ieee80211.h
+++ b/include/net/ieee80211.h
@@ -613,7 +613,7 @@ struct ieee80211_disassoc {
613} __attribute__ ((packed)); 613} __attribute__ ((packed));
614 614
615/* Alias deauth for disassoc */ 615/* Alias deauth for disassoc */
616#define ieee82011_deauth ieee80211_disassoc 616#define ieee80211_deauth ieee80211_disassoc
617 617
618struct ieee80211_probe_request { 618struct ieee80211_probe_request {
619 struct ieee80211_hdr_3addr header; 619 struct ieee80211_hdr_3addr header;
@@ -1045,6 +1045,34 @@ static inline u8 *ieee80211_get_payload(struct ieee80211_hdr *hdr)
1045 1045
1046} 1046}
1047 1047
1048static inline int ieee80211_is_ofdm_rate(u8 rate)
1049{
1050 switch (rate & ~IEEE80211_BASIC_RATE_MASK) {
1051 case IEEE80211_OFDM_RATE_6MB:
1052 case IEEE80211_OFDM_RATE_9MB:
1053 case IEEE80211_OFDM_RATE_12MB:
1054 case IEEE80211_OFDM_RATE_18MB:
1055 case IEEE80211_OFDM_RATE_24MB:
1056 case IEEE80211_OFDM_RATE_36MB:
1057 case IEEE80211_OFDM_RATE_48MB:
1058 case IEEE80211_OFDM_RATE_54MB:
1059 return 1;
1060 }
1061 return 0;
1062}
1063
1064static inline int ieee80211_is_cck_rate(u8 rate)
1065{
1066 switch (rate & ~IEEE80211_BASIC_RATE_MASK) {
1067 case IEEE80211_CCK_RATE_1MB:
1068 case IEEE80211_CCK_RATE_2MB:
1069 case IEEE80211_CCK_RATE_5MB:
1070 case IEEE80211_CCK_RATE_11MB:
1071 return 1;
1072 }
1073 return 0;
1074}
1075
1048/* ieee80211.c */ 1076/* ieee80211.c */
1049extern void free_ieee80211(struct net_device *dev); 1077extern void free_ieee80211(struct net_device *dev);
1050extern struct net_device *alloc_ieee80211(int sizeof_priv); 1078extern struct net_device *alloc_ieee80211(int sizeof_priv);
diff --git a/include/net/ieee80211_crypt.h b/include/net/ieee80211_crypt.h
index 0c9d859d912e..0a1c2d82ca4b 100644
--- a/include/net/ieee80211_crypt.h
+++ b/include/net/ieee80211_crypt.h
@@ -26,7 +26,7 @@
26#include <linux/skbuff.h> 26#include <linux/skbuff.h>
27 27
28enum { 28enum {
29 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES = (1<<0), 29 IEEE80211_CRYPTO_TKIP_COUNTERMEASURES = (1 << 0),
30}; 30};
31 31
32struct ieee80211_crypto_ops { 32struct ieee80211_crypto_ops {
@@ -65,8 +65,8 @@ struct ieee80211_crypto_ops {
65 char *(*print_stats) (char *p, void *priv); 65 char *(*print_stats) (char *p, void *priv);
66 66
67 /* Crypto specific flag get/set for configuration settings */ 67 /* Crypto specific flag get/set for configuration settings */
68 unsigned long (*get_flags)(void *priv); 68 unsigned long (*get_flags) (void *priv);
69 unsigned long (*set_flags)(unsigned long flags, void *priv); 69 unsigned long (*set_flags) (unsigned long flags, void *priv);
70 70
71 /* maximum number of bytes added by encryption; encrypt buf is 71 /* maximum number of bytes added by encryption; encrypt buf is
72 * allocated with extra_prefix_len bytes, copy of in_buf, and 72 * allocated with extra_prefix_len bytes, copy of in_buf, and
diff --git a/net/ieee80211/ieee80211_rx.c b/net/ieee80211/ieee80211_rx.c
index fcf05bf677b8..6b005cb0caa0 100644
--- a/net/ieee80211/ieee80211_rx.c
+++ b/net/ieee80211/ieee80211_rx.c
@@ -917,174 +917,24 @@ static int ieee80211_parse_qos_info_param_IE(struct ieee80211_info_element
917 return rc; 917 return rc;
918} 918}
919 919
920static int ieee80211_handle_assoc_resp(struct ieee80211_device *ieee, struct ieee80211_assoc_response 920static int ieee80211_parse_info_param(struct ieee80211_info_element
921 *frame, struct ieee80211_rx_stats *stats) 921 *info_element, u16 length,
922{ 922 struct ieee80211_network *network)
923 struct ieee80211_network network_resp;
924 struct ieee80211_network *network = &network_resp;
925 struct ieee80211_info_element *info_element;
926 struct net_device *dev = ieee->dev;
927 u16 left;
928
929 network->flags = 0;
930 network->qos_data.active = 0;
931 network->qos_data.supported = 0;
932 network->qos_data.param_count = 0;
933 network->qos_data.old_param_count = 0;
934
935 //network->atim_window = le16_to_cpu(frame->aid) & (0x3FFF);
936 network->atim_window = le16_to_cpu(frame->aid);
937 network->listen_interval = le16_to_cpu(frame->status);
938
939 info_element = frame->info_element;
940 left = stats->len - sizeof(*frame);
941
942 while (left >= sizeof(struct ieee80211_info_element)) {
943 if (sizeof(struct ieee80211_info_element) +
944 info_element->len > left) {
945 IEEE80211_DEBUG_QOS("ASSOC RESP: parse failed: "
946 "info_element->len + 2 > left : "
947 "info_element->len+2=%zd left=%d, id=%d.\n",
948 info_element->len +
949 sizeof(struct
950 ieee80211_info_element),
951 left, info_element->id);
952 return 1;
953 }
954
955 switch (info_element->id) {
956 case MFIE_TYPE_SSID:
957 if (ieee80211_is_empty_essid(info_element->data,
958 info_element->len)) {
959 network->flags |= NETWORK_EMPTY_ESSID;
960 break;
961 }
962
963 network->ssid_len = min(info_element->len,
964 (u8) IW_ESSID_MAX_SIZE);
965 memcpy(network->ssid, info_element->data,
966 network->ssid_len);
967 if (network->ssid_len < IW_ESSID_MAX_SIZE)
968 memset(network->ssid + network->ssid_len, 0,
969 IW_ESSID_MAX_SIZE - network->ssid_len);
970
971 IEEE80211_DEBUG_QOS("MFIE_TYPE_SSID: '%s' len=%d.\n",
972 network->ssid, network->ssid_len);
973 break;
974
975 case MFIE_TYPE_TIM:
976 IEEE80211_DEBUG_QOS("MFIE_TYPE_TIM: ignored\n");
977 break;
978
979 case MFIE_TYPE_IBSS_SET:
980 IEEE80211_DEBUG_QOS("MFIE_TYPE_IBSS_SET: ignored\n");
981 break;
982
983 case MFIE_TYPE_CHALLENGE:
984 IEEE80211_DEBUG_QOS("MFIE_TYPE_CHALLENGE: ignored\n");
985 break;
986
987 case MFIE_TYPE_GENERIC:
988 IEEE80211_DEBUG_QOS("MFIE_TYPE_GENERIC: %d bytes\n",
989 info_element->len);
990 ieee80211_parse_qos_info_param_IE(info_element,
991 network);
992 break;
993
994 case MFIE_TYPE_RSN:
995 IEEE80211_DEBUG_QOS("MFIE_TYPE_RSN: %d bytes\n",
996 info_element->len);
997 break;
998
999 case MFIE_TYPE_QOS_PARAMETER:
1000 printk("QoS Error need to parse QOS_PARAMETER IE\n");
1001 break;
1002
1003 default:
1004 IEEE80211_DEBUG_QOS("unsupported IE %d\n",
1005 info_element->id);
1006 break;
1007 }
1008
1009 left -= sizeof(struct ieee80211_info_element) +
1010 info_element->len;
1011 info_element = (struct ieee80211_info_element *)
1012 &info_element->data[info_element->len];
1013 }
1014
1015 if (ieee->handle_assoc_response != NULL)
1016 ieee->handle_assoc_response(dev, frame, network);
1017
1018 return 0;
1019}
1020
1021/************