diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2005-10-04 08:22:13 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-10-04 08:22:13 -0400 |
| commit | 13d1ef29bc5125d7b77c5f6cdfde5ed31226005c (patch) | |
| tree | fdab36f463a248d5be3bd46a5ad181f6d354ddde | |
| parent | e2608361be343e6220e0a87e04ff224eb037df31 (diff) | |
| parent | ff0037b259e8b47843176142131844bc80fd2887 (diff) | |
Merge rsync://bughost.org/repos/ieee80211-delta/
| -rw-r--r-- | include/net/ieee80211.h | 30 | ||||
| -rw-r--r-- | include/net/ieee80211_crypt.h | 6 | ||||
| -rw-r--r-- | net/ieee80211/ieee80211_rx.c | 314 |
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 | ||
| 618 | struct ieee80211_probe_request { | 618 | struct 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 | ||
| 1048 | static 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 | |||
| 1064 | static 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 */ |
| 1049 | extern void free_ieee80211(struct net_device *dev); | 1077 | extern void free_ieee80211(struct net_device *dev); |
| 1050 | extern struct net_device *alloc_ieee80211(int sizeof_priv); | 1078 | extern 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 | ||
| 28 | enum { | 28 | enum { |
| 29 | IEEE80211_CRYPTO_TKIP_COUNTERMEASURES = (1<<0), | 29 | IEEE80211_CRYPTO_TKIP_COUNTERMEASURES = (1 << 0), |
| 30 | }; | 30 | }; |
| 31 | 31 | ||
| 32 | struct ieee80211_crypto_ops { | 32 | struct 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 | ||
| 920 | static int ieee80211_handle_assoc_resp(struct ieee80211_device *ieee, struct ieee80211_assoc_response | 920 | static 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 | /************ | ||
