Lines Matching +full:mic +full:- +full:pos
1 // SPDX-License-Identifier: GPL-2.0-only
4 * for Intersil Prism2/2.5/3 - hostap.o module, common routines
6 * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
8 * Copyright (c) 2002-2003, Jouni Malinen <j@w1.fi>
9 * Copyright (c) 2004-2005, Intel Corporation
36 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; in libipw_monitor_rx()
37 u16 fc = le16_to_cpu(hdr->frame_control); in libipw_monitor_rx()
39 skb->dev = ieee->dev; in libipw_monitor_rx()
42 skb->pkt_type = PACKET_OTHERHOST; in libipw_monitor_rx()
43 skb->protocol = htons(ETH_P_80211_RAW); in libipw_monitor_rx()
44 memset(skb->cb, 0, sizeof(skb->cb)); in libipw_monitor_rx()
61 entry = &ieee->frag_cache[i]; in libipw_frag_cache_find()
62 if (entry->skb != NULL && in libipw_frag_cache_find()
63 time_after(jiffies, entry->first_frag_time + 2 * HZ)) { in libipw_frag_cache_find()
66 entry->seq, entry->last_frag); in libipw_frag_cache_find()
67 dev_kfree_skb_any(entry->skb); in libipw_frag_cache_find()
68 entry->skb = NULL; in libipw_frag_cache_find()
71 if (entry->skb != NULL && entry->seq == seq && in libipw_frag_cache_find()
72 (entry->last_frag + 1 == frag || frag == -1) && in libipw_frag_cache_find()
73 ether_addr_equal(entry->src_addr, src) && in libipw_frag_cache_find()
74 ether_addr_equal(entry->dst_addr, dst)) in libipw_frag_cache_find()
90 sc = le16_to_cpu(hdr->seq_ctl); in libipw_frag_cache_get()
96 skb = dev_alloc_skb(ieee->dev->mtu + in libipw_frag_cache_get()
104 entry = &ieee->frag_cache[ieee->frag_next_idx]; in libipw_frag_cache_get()
105 ieee->frag_next_idx++; in libipw_frag_cache_get()
106 if (ieee->frag_next_idx >= LIBIPW_FRAG_CACHE_LEN) in libipw_frag_cache_get()
107 ieee->frag_next_idx = 0; in libipw_frag_cache_get()
109 if (entry->skb != NULL) in libipw_frag_cache_get()
110 dev_kfree_skb_any(entry->skb); in libipw_frag_cache_get()
112 entry->first_frag_time = jiffies; in libipw_frag_cache_get()
113 entry->seq = seq; in libipw_frag_cache_get()
114 entry->last_frag = frag; in libipw_frag_cache_get()
115 entry->skb = skb; in libipw_frag_cache_get()
116 memcpy(entry->src_addr, hdr->addr2, ETH_ALEN); in libipw_frag_cache_get()
117 memcpy(entry->dst_addr, hdr->addr1, ETH_ALEN); in libipw_frag_cache_get()
121 entry = libipw_frag_cache_find(ieee, seq, frag, hdr->addr2, in libipw_frag_cache_get()
122 hdr->addr1); in libipw_frag_cache_get()
124 entry->last_frag = frag; in libipw_frag_cache_get()
125 skb = entry->skb; in libipw_frag_cache_get()
140 sc = le16_to_cpu(hdr->seq_ctl); in libipw_frag_cache_invalidate()
143 entry = libipw_frag_cache_find(ieee, seq, -1, hdr->addr2, in libipw_frag_cache_invalidate()
144 hdr->addr1); in libipw_frag_cache_invalidate()
149 return -1; in libipw_frag_cache_invalidate()
152 entry->skb = NULL; in libipw_frag_cache_invalidate()
167 if (ieee->iw_mode == IW_MODE_MASTER) { in libipw_rx_frame_mgmt()
169 ieee->dev->name); in libipw_rx_frame_mgmt()
173 skb->data);*/ in libipw_rx_frame_mgmt()
176 if (ieee->hostapd && type == WLAN_FC_TYPE_MGMT) { in libipw_rx_frame_mgmt()
178 ieee->iw_mode == IW_MODE_MASTER) { in libipw_rx_frame_mgmt()
184 hostap_rx(skb2->dev, skb2, rx_stats); in libipw_rx_frame_mgmt()
189 ieee->apdevstats.rx_packets++; in libipw_rx_frame_mgmt()
190 ieee->apdevstats.rx_bytes += skb->len; in libipw_rx_frame_mgmt()
191 prism2_rx_80211(ieee->apdev, skb, rx_stats, PRISM2_RX_MGMT); in libipw_rx_frame_mgmt()
195 if (ieee->iw_mode == IW_MODE_MASTER) { in libipw_rx_frame_mgmt()
199 skb->dev->name, type, stype); in libipw_rx_frame_mgmt()
200 return -1; in libipw_rx_frame_mgmt()
203 hostap_rx(skb->dev, skb, rx_stats); in libipw_rx_frame_mgmt()
208 "received in non-Host AP mode\n", skb->dev->name); in libipw_rx_frame_mgmt()
209 return -1; in libipw_rx_frame_mgmt()
214 /* Ethernet-II snap header (RFC1042 for most EtherTypes) */
218 /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
227 struct net_device *dev = ieee->dev; in libipw_is_eapol_frame()
230 u8 *pos; in libipw_is_eapol_frame() local
232 if (skb->len < 24) in libipw_is_eapol_frame()
235 hdr = (struct libipw_hdr_3addr *)skb->data; in libipw_is_eapol_frame()
236 fc = le16_to_cpu(hdr->frame_ctl); in libipw_is_eapol_frame()
241 ether_addr_equal(hdr->addr1, dev->dev_addr) && in libipw_is_eapol_frame()
242 ether_addr_equal(hdr->addr3, dev->dev_addr)) { in libipw_is_eapol_frame()
246 ether_addr_equal(hdr->addr1, dev->dev_addr)) { in libipw_is_eapol_frame()
251 if (skb->len < 24 + 8) in libipw_is_eapol_frame()
255 pos = skb->data + 24; in libipw_is_eapol_frame()
256 ethertype = (pos[6] << 8) | pos[7]; in libipw_is_eapol_frame()
271 if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL) in libipw_rx_frame_decrypt()
274 hdr = (struct libipw_hdr_3addr *)skb->data; in libipw_rx_frame_decrypt()
275 hdrlen = libipw_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); in libipw_rx_frame_decrypt()
277 atomic_inc(&crypt->refcnt); in libipw_rx_frame_decrypt()
278 res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv); in libipw_rx_frame_decrypt()
279 atomic_dec(&crypt->refcnt); in libipw_rx_frame_decrypt()
282 hdr->addr2, res); in libipw_rx_frame_decrypt()
283 if (res == -2) in libipw_rx_frame_decrypt()
286 skb->data[hdrlen + 3] >> 6); in libipw_rx_frame_decrypt()
287 ieee->ieee_stats.rx_discards_undecryptable++; in libipw_rx_frame_decrypt()
288 return -1; in libipw_rx_frame_decrypt()
303 if (crypt == NULL || crypt->ops->decrypt_msdu == NULL) in libipw_rx_frame_decrypt_msdu()
306 hdr = (struct libipw_hdr_3addr *)skb->data; in libipw_rx_frame_decrypt_msdu()
307 hdrlen = libipw_get_hdrlen(le16_to_cpu(hdr->frame_ctl)); in libipw_rx_frame_decrypt_msdu()
309 atomic_inc(&crypt->refcnt); in libipw_rx_frame_decrypt_msdu()
310 res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv); in libipw_rx_frame_decrypt_msdu()
311 atomic_dec(&crypt->refcnt); in libipw_rx_frame_decrypt_msdu()
313 printk(KERN_DEBUG "%s: MSDU decryption/MIC verification failed" in libipw_rx_frame_decrypt_msdu()
314 " (SA=%pM keyidx=%d)\n", ieee->dev->name, hdr->addr2, in libipw_rx_frame_decrypt_msdu()
316 return -1; in libipw_rx_frame_decrypt_msdu()
328 struct net_device *dev = ieee->dev; in libipw_rx()
349 hdr = (struct libipw_hdr_4addr *)skb->data; in libipw_rx()
350 if (skb->len < 10) { in libipw_rx()
351 printk(KERN_INFO "%s: SKB length < 10\n", dev->name); in libipw_rx()
355 fc = le16_to_cpu(hdr->frame_ctl); in libipw_rx()
358 sc = le16_to_cpu(hdr->seq_ctl); in libipw_rx()
362 if (skb->len < hdrlen) { in libipw_rx()
364 dev->name, skb->len); in libipw_rx()
369 * Rx paths. - Jean II */ in libipw_rx()
373 if (ieee->spy_data.spy_number > 0) { in libipw_rx()
377 if (rx_stats->mask & LIBIPW_STATMASK_RSSI) { in libipw_rx()
378 wstats.level = rx_stats->signal; in libipw_rx()
383 if (rx_stats->mask & LIBIPW_STATMASK_NOISE) { in libipw_rx()
384 wstats.noise = rx_stats->noise; in libipw_rx()
389 if (rx_stats->mask & LIBIPW_STATMASK_SIGNAL) { in libipw_rx()
390 wstats.qual = rx_stats->signal; in libipw_rx()
396 libipw_spy_update(ieee->dev, hdr->addr2, &wstats); in libipw_rx()
402 hostap_update_rx_stats(local->ap, hdr, rx_stats); in libipw_rx()
405 if (ieee->iw_mode == IW_MODE_MONITOR) { in libipw_rx()
406 dev->stats.rx_packets++; in libipw_rx()
407 dev->stats.rx_bytes += skb->len; in libipw_rx()
412 can_be_decrypted = (is_multicast_ether_addr(hdr->addr1) || in libipw_rx()
413 is_broadcast_ether_addr(hdr->addr2)) ? in libipw_rx()
414 ieee->host_mc_decrypt : ieee->host_decrypt; in libipw_rx()
417 if (skb->len >= hdrlen + 3) { in libipw_rx()
418 /* Top two-bits of byte 3 are the key index */ in libipw_rx()
419 keyidx = skb->data[hdrlen + 3] >> 6; in libipw_rx()
422 /* ieee->crypt[] is WEP_KEY (4) in length. Given that keyidx in libipw_rx()
423 * is only allowed 2-bits of storage, no value of keyidx can in libipw_rx()
426 crypt = ieee->crypt_info.crypt[keyidx]; in libipw_rx()
438 if (is_unicast_ether_addr(hdr->addr1) || local->bcrx_sta_key) in libipw_rx()
445 if (crypt && (crypt->ops == NULL || in libipw_rx()
446 crypt->ops->decrypt_mpdu == NULL)) in libipw_rx()
455 " (SA=%pM)\n", hdr->addr2); in libipw_rx()
456 ieee->ieee_stats.rx_discards_undecryptable++; in libipw_rx()
463 fc & IEEE80211_FCTL_PROTECTED && ieee->host_decrypt && in libipw_rx()
466 "from %pM\n", dev->name, hdr->addr2); in libipw_rx()
479 if (sc == ieee->prev_seq_ctl) in libipw_rx()
482 ieee->prev_seq_ctl = sc; in libipw_rx()
484 /* Data frame - extract src/dst addresses */ in libipw_rx()
485 if (skb->len < LIBIPW_3ADDR_LEN) in libipw_rx()
490 memcpy(dst, hdr->addr1, ETH_ALEN); in libipw_rx()
491 memcpy(src, hdr->addr3, ETH_ALEN); in libipw_rx()
494 memcpy(dst, hdr->addr3, ETH_ALEN); in libipw_rx()
495 memcpy(src, hdr->addr2, ETH_ALEN); in libipw_rx()
498 if (skb->len < LIBIPW_4ADDR_LEN) in libipw_rx()
500 memcpy(dst, hdr->addr3, ETH_ALEN); in libipw_rx()
501 memcpy(src, hdr->addr4, ETH_ALEN); in libipw_rx()
504 memcpy(dst, hdr->addr1, ETH_ALEN); in libipw_rx()
505 memcpy(src, hdr->addr2, ETH_ALEN); in libipw_rx()
513 skb->dev = dev = wds; in libipw_rx()
517 if (ieee->iw_mode == IW_MODE_MASTER && !wds && in libipw_rx()
519 IEEE80211_FCTL_FROMDS && ieee->stadev && in libipw_rx()
520 ether_addr_equal(hdr->addr2, ieee->assoc_ap_addr)) { in libipw_rx()
522 skb->dev = dev = ieee->stadev; in libipw_rx()
529 if ((ieee->iw_mode == IW_MODE_MASTER || in libipw_rx()
530 ieee->iw_mode == IW_MODE_REPEAT) && !from_assoc_ap) { in libipw_rx()
547 /* Nullfunc frames may have PS-bit set, so they must be passed to in libipw_rx()
560 type, stype, skb->len); in libipw_rx()
570 hdr = (struct libipw_hdr_4addr *)skb->data; in libipw_rx()
574 // ieee->host_decrypt && (fc & IEEE80211_FCTL_PROTECTED) && in libipw_rx()
589 flen = skb->len; in libipw_rx()
591 flen -= hdrlen; in libipw_rx()
593 if (frag_skb->tail + flen > frag_skb->end) { in libipw_rx()
596 dev->name); in libipw_rx()
615 /* more fragments expected - leave the skb in fragment in libipw_rx()
624 hdr = (struct libipw_hdr_4addr *)skb->data; in libipw_rx()
634 hdr = (struct libipw_hdr_4addr *)skb->data; in libipw_rx()
635 if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep) { in libipw_rx()
636 if ( /*ieee->ieee802_1x && */ in libipw_rx()
643 hdr->addr2); in libipw_rx()
648 if (crypt && !(fc & IEEE80211_FCTL_PROTECTED) && !ieee->open_wep && in libipw_rx()
652 hdr->addr2); in libipw_rx()
659 ieee->host_strip_iv_icv) { in libipw_rx()
662 /* Top two-bits of byte 3 are the key index */ in libipw_rx()
663 if (skb->len >= hdrlen + 3) in libipw_rx()
664 keyidx = skb->data[hdrlen + 3] >> 6; in libipw_rx()
671 switch (ieee->sec.encode_alg[keyidx]) { in libipw_rx()
681 /* 8 byte MIC, 4 byte ICV */ in libipw_rx()
687 /* 8 byte MIC */ in libipw_rx()
692 if (skb->len < trimlen) in libipw_rx()
695 __skb_trim(skb, skb->len - trimlen); in libipw_rx()
697 if (skb->len < hdrlen) in libipw_rx()
703 payload = skb->data + hdrlen; in libipw_rx()
709 if (ieee->ieee802_1x && ieee->iw_mode == IW_MODE_MASTER) { in libipw_rx()
712 dev->name); in libipw_rx()
713 if (ieee->hostapd && ieee->apdev) { in libipw_rx()
716 prism2_rx_80211(ieee->apdev, skb, rx_stats, in libipw_rx()
718 ieee->apdevstats.rx_packets++; in libipw_rx()
719 ieee->apdevstats.rx_bytes += skb->len; in libipw_rx()
725 "ethertype=0x%04x\n", dev->name, ethertype); in libipw_rx()
732 if (skb->len - hdrlen >= 8 && in libipw_rx()
736 /* remove RFC1042 or Bridge-Tunnel encapsulation and in libipw_rx()
745 len = htons(skb->len); in libipw_rx()
753 IEEE80211_FCTL_TODS) && skb->len >= ETH_HLEN + ETH_ALEN) { in libipw_rx()
754 /* Non-standard frame: get addr4 from its bogus location after in libipw_rx()
757 skb->data + skb->len - ETH_ALEN, in libipw_rx()
759 skb_trim(skb, skb->len - ETH_ALEN); in libipw_rx()
763 dev->stats.rx_packets++; in libipw_rx()
764 dev->stats.rx_bytes += skb->len; in libipw_rx()
767 if (ieee->iw_mode == IW_MODE_MASTER && !wds && ieee->ap->bridge_packets) { in libipw_rx()
771 ieee->ap->bridged_multicast++; in libipw_rx()
775 "multicast frame\n", dev->name); in libipw_rx()
776 } else if (hostap_is_sta_assoc(ieee->ap, dst)) { in libipw_rx()
779 ieee->ap->bridged_unicast++; in libipw_rx()
787 skb2->dev = dev; in libipw_rx()
788 skb2->protocol = htons(ETH_P_802_3); in libipw_rx()
791 /* skb2->network_header += ETH_HLEN; */ in libipw_rx()
797 skb->protocol = eth_type_trans(skb, dev); in libipw_rx()
798 memset(skb->cb, 0, sizeof(skb->cb)); in libipw_rx()
799 skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */ in libipw_rx()
806 dev->stats.rx_dropped++; in libipw_rx()
818 dev->stats.rx_dropped++; in libipw_rx()
820 /* Returning 0 indicates to caller that we have not handled the SKB-- in libipw_rx()
837 if (info_element->elementID != QOS_ELEMENT_ID) in libipw_verify_qos_info()
838 return -1; in libipw_verify_qos_info()
839 if (info_element->qui_subtype != sub_type) in libipw_verify_qos_info()
840 return -1; in libipw_verify_qos_info()
841 if (memcmp(info_element->qui, qos_oui, QOS_OUI_LEN)) in libipw_verify_qos_info()
842 return -1; in libipw_verify_qos_info()
843 if (info_element->qui_type != QOS_OUI_TYPE) in libipw_verify_qos_info()
844 return -1; in libipw_verify_qos_info()
845 if (info_element->version != QOS_VERSION_1) in libipw_verify_qos_info()
846 return -1; in libipw_verify_qos_info()
860 if (!element_param || !info_element || info_element->len != size - 2) in libipw_read_qos_param_element()
861 return -1; in libipw_read_qos_param_element()
864 return libipw_verify_qos_info(&element_param->info_element, in libipw_read_qos_param_element()
875 size_t size = sizeof(struct libipw_qos_information_element) - 2; in libipw_read_qos_info_element()
877 if (!element_info || !info_element || info_element->len != size - 2) in libipw_read_qos_info_element()
878 return -1; in libipw_read_qos_info_element()
900 ac_params = &(param_elm->ac_params_record[i]); in libipw_qos_convert_ac_to_parameters()
902 qos_param->aifs[i] = (ac_params->aci_aifsn) & 0x0F; in libipw_qos_convert_ac_to_parameters()
903 qos_param->aifs[i] -= (qos_param->aifs[i] < 2) ? 0 : 2; in libipw_qos_convert_ac_to_parameters()
905 cw_min = ac_params->ecw_min_max & 0x0F; in libipw_qos_convert_ac_to_parameters()
906 qos_param->cw_min[i] = cpu_to_le16((1 << cw_min) - 1); in libipw_qos_convert_ac_to_parameters()
908 cw_max = (ac_params->ecw_min_max & 0xF0) >> 4; in libipw_qos_convert_ac_to_parameters()
909 qos_param->cw_max[i] = cpu_to_le16((1 << cw_max) - 1); in libipw_qos_convert_ac_to_parameters()
911 qos_param->flag[i] = in libipw_qos_convert_ac_to_parameters()
912 (ac_params->aci_aifsn & 0x10) ? 0x01 : 0x00; in libipw_qos_convert_ac_to_parameters()
914 txop = le16_to_cpu(ac_params->tx_op_limit) * 32; in libipw_qos_convert_ac_to_parameters()
915 qos_param->tx_op_limit[i] = cpu_to_le16(txop); in libipw_qos_convert_ac_to_parameters()
935 network->qos_data.param_count = qos_info_element.ac_info & 0x0F; in libipw_parse_qos_info_param_IE()
936 network->flags |= NETWORK_HAS_QOS_INFORMATION; in libipw_parse_qos_info_param_IE()
943 qos_param = &(network->qos_data.parameters); in libipw_parse_qos_info_param_IE()
946 network->flags |= NETWORK_HAS_QOS_PARAMETERS; in libipw_parse_qos_info_param_IE()
947 network->qos_data.param_count = in libipw_parse_qos_info_param_IE()
954 network->qos_data.supported = 1; in libipw_parse_qos_info_param_IE()
1007 if (sizeof(*info_element) + info_element->len > length) { in libipw_parse_info_param()
1009 "info_element->len + 2 > left : " in libipw_parse_info_param()
1010 "info_element->len+2=%zd left=%d, id=%d.\n", in libipw_parse_info_param()
1011 info_element->len + in libipw_parse_info_param()
1013 length, info_element->id); in libipw_parse_info_param()
1020 switch (info_element->id) { in libipw_parse_info_param()
1022 network->ssid_len = min(info_element->len, in libipw_parse_info_param()
1024 memcpy(network->ssid, info_element->data, in libipw_parse_info_param()
1025 network->ssid_len); in libipw_parse_info_param()
1026 if (network->ssid_len < IW_ESSID_MAX_SIZE) in libipw_parse_info_param()
1027 memset(network->ssid + network->ssid_len, 0, in libipw_parse_info_param()
1028 IW_ESSID_MAX_SIZE - network->ssid_len); in libipw_parse_info_param()
1031 network->ssid_len, network->ssid, in libipw_parse_info_param()
1032 network->ssid_len); in libipw_parse_info_param()
1039 network->rates_len = min(info_element->len, in libipw_parse_info_param()
1041 for (i = 0; i < network->rates_len; i++) { in libipw_parse_info_param()
1042 network->rates[i] = info_element->data[i]; in libipw_parse_info_param()
1044 p += scnprintf(p, sizeof(rates_str) - in libipw_parse_info_param()
1045 (p - rates_str), "%02X ", in libipw_parse_info_param()
1046 network->rates[i]); in libipw_parse_info_param()
1049 (info_element->data[i])) { in libipw_parse_info_param()
1050 network->flags |= NETWORK_HAS_OFDM; in libipw_parse_info_param()
1051 if (info_element->data[i] & in libipw_parse_info_param()
1053 network->flags &= in libipw_parse_info_param()
1059 rates_str, network->rates_len); in libipw_parse_info_param()
1066 network->rates_ex_len = min(info_element->len, in libipw_parse_info_param()
1068 for (i = 0; i < network->rates_ex_len; i++) { in libipw_parse_info_param()
1069 network->rates_ex[i] = info_element->data[i]; in libipw_parse_info_param()
1071 p += scnprintf(p, sizeof(rates_str) - in libipw_parse_info_param()
1072 (p - rates_str), "%02X ", in libipw_parse_info_param()
1073 network->rates_ex[i]); in libipw_parse_info_param()
1076 (info_element->data[i])) { in libipw_parse_info_param()
1077 network->flags |= NETWORK_HAS_OFDM; in libipw_parse_info_param()
1078 if (info_element->data[i] & in libipw_parse_info_param()
1080 network->flags &= in libipw_parse_info_param()
1086 rates_str, network->rates_ex_len); in libipw_parse_info_param()
1091 info_element->data[0]); in libipw_parse_info_param()
1092 network->channel = info_element->data[0]; in libipw_parse_info_param()
1104 network->tim.tim_count = info_element->data[0]; in libipw_parse_info_param()
1105 network->tim.tim_period = info_element->data[1]; in libipw_parse_info_param()
1110 network->erp_value = info_element->data[0]; in libipw_parse_info_param()
1111 network->flags |= NETWORK_HAS_ERP_VALUE; in libipw_parse_info_param()
1113 network->erp_value); in libipw_parse_info_param()
1117 network->atim_window = info_element->data[0]; in libipw_parse_info_param()
1119 network->atim_window); in libipw_parse_info_param()
1128 info_element->len); in libipw_parse_info_param()
1133 if (info_element->len >= 4 && in libipw_parse_info_param()
1134 info_element->data[0] == 0x00 && in libipw_parse_info_param()
1135 info_element->data[1] == 0x50 && in libipw_parse_info_param()
1136 info_element->data[2] == 0xf2 && in libipw_parse_info_param()
1137 info_element->data[3] == 0x01) { in libipw_parse_info_param()
1138 network->wpa_ie_len = min(info_element->len + 2, in libipw_parse_info_param()
1140 memcpy(network->wpa_ie, info_element, in libipw_parse_info_param()
1141 network->wpa_ie_len); in libipw_parse_info_param()
1147 info_element->len); in libipw_parse_info_param()
1148 network->rsn_ie_len = min(info_element->len + 2, in libipw_parse_info_param()
1150 memcpy(network->rsn_ie, info_element, in libipw_parse_info_param()
1151 network->rsn_ie_len); in libipw_parse_info_param()
1160 network->power_constraint = info_element->data[0]; in libipw_parse_info_param()
1161 network->flags |= NETWORK_HAS_POWER_CONSTRAINT; in libipw_parse_info_param()
1165 network->power_constraint = info_element->data[0]; in libipw_parse_info_param()
1166 network->flags |= NETWORK_HAS_CSA; in libipw_parse_info_param()
1170 network->quiet.count = info_element->data[0]; in libipw_parse_info_param()
1171 network->quiet.period = info_element->data[1]; in libipw_parse_info_param()
1172 network->quiet.duration = info_element->data[2]; in libipw_parse_info_param()
1173 network->quiet.offset = info_element->data[3]; in libipw_parse_info_param()
1174 network->flags |= NETWORK_HAS_QUIET; in libipw_parse_info_param()
1178 network->flags |= NETWORK_HAS_IBSS_DFS; in libipw_parse_info_param()
1182 network->tpc_report.transmit_power = in libipw_parse_info_param()
1183 info_element->data[0]; in libipw_parse_info_param()
1184 network->tpc_report.link_margin = info_element->data[1]; in libipw_parse_info_param()
1185 network->flags |= NETWORK_HAS_TPC_REPORT; in libipw_parse_info_param()
1191 get_info_element_string(info_element->id), in libipw_parse_info_param()
1192 info_element->id); in libipw_parse_info_param()
1196 length -= sizeof(*info_element) + info_element->len; in libipw_parse_info_param()
1198 (struct libipw_info_element *)&info_element-> in libipw_parse_info_param()
1199 data[info_element->len]; in libipw_parse_info_param()
1210 struct net_device *dev = ieee->dev; in libipw_handle_assoc_resp()
1212 network->flags = 0; in libipw_handle_assoc_resp()
1213 network->qos_data.active = 0; in libipw_handle_assoc_resp()
1214 network->qos_data.supported = 0; in libipw_handle_assoc_resp()
1215 network->qos_data.param_count = 0; in libipw_handle_assoc_resp()
1216 network->qos_data.old_param_count = 0; in libipw_handle_assoc_resp()
1218 //network->atim_window = le16_to_cpu(frame->aid) & (0x3FFF); in libipw_handle_assoc_resp()
1219 network->atim_window = le16_to_cpu(frame->aid); in libipw_handle_assoc_resp()
1220 network->listen_interval = le16_to_cpu(frame->status); in libipw_handle_assoc_resp()
1221 memcpy(network->bssid, frame->header.addr3, ETH_ALEN); in libipw_handle_assoc_resp()
1222 network->capability = le16_to_cpu(frame->capability); in libipw_handle_assoc_resp()
1223 network->last_scanned = jiffies; in libipw_handle_assoc_resp()
1224 network->rates_len = network->rates_ex_len = 0; in libipw_handle_assoc_resp()
1225 network->last_associate = 0; in libipw_handle_assoc_resp()
1226 network->ssid_len = 0; in libipw_handle_assoc_resp()
1227 network->erp_value = in libipw_handle_assoc_resp()
1228 (network->capability & WLAN_CAPABILITY_IBSS) ? 0x3 : 0x0; in libipw_handle_assoc_resp()
1230 if (stats->freq == LIBIPW_52GHZ_BAND) { in libipw_handle_assoc_resp()
1232 network->channel = stats->received_channel; in libipw_handle_assoc_resp()
1234 network->flags |= NETWORK_HAS_CCK; in libipw_handle_assoc_resp()
1236 network->wpa_ie_len = 0; in libipw_handle_assoc_resp()
1237 network->rsn_ie_len = 0; in libipw_handle_assoc_resp()
1239 if (libipw_parse_info_param((void *)frame->variable, in libipw_handle_assoc_resp()
1240 stats->len - sizeof(*frame), network)) in libipw_handle_assoc_resp()
1243 network->mode = 0; in libipw_handle_assoc_resp()
1244 if (stats->freq == LIBIPW_52GHZ_BAND) in libipw_handle_assoc_resp()
1245 network->mode = IEEE_A; in libipw_handle_assoc_resp()
1247 if (network->flags & NETWORK_HAS_OFDM) in libipw_handle_assoc_resp()
1248 network->mode |= IEEE_G; in libipw_handle_assoc_resp()
1249 if (network->flags & NETWORK_HAS_CCK) in libipw_handle_assoc_resp()
1250 network->mode |= IEEE_B; in libipw_handle_assoc_resp()
1253 memcpy(&network->stats, stats, sizeof(network->stats)); in libipw_handle_assoc_resp()
1255 if (ieee->handle_assoc_response != NULL) in libipw_handle_assoc_resp()
1256 ieee->handle_assoc_response(dev, frame, network); in libipw_handle_assoc_resp()
1268 network->qos_data.active = 0; in libipw_network_init()
1269 network->qos_data.supported = 0; in libipw_network_init()
1270 network->qos_data.param_count = 0; in libipw_network_init()
1271 network->qos_data.old_param_count = 0; in libipw_network_init()
1274 memcpy(network->bssid, beacon->header.addr3, ETH_ALEN); in libipw_network_init()
1275 network->capability = le16_to_cpu(beacon->capability); in libipw_network_init()
1276 network->last_scanned = jiffies; in libipw_network_init()
1277 network->time_stamp[0] = le32_to_cpu(beacon->time_stamp[0]); in libipw_network_init()
1278 network->time_stamp[1] = le32_to_cpu(beacon->time_stamp[1]); in libipw_network_init()
1279 network->beacon_interval = le16_to_cpu(beacon->beacon_interval); in libipw_network_init()
1280 /* Where to pull this? beacon->listen_interval; */ in libipw_network_init()
1281 network->listen_interval = 0x0A; in libipw_network_init()
1282 network->rates_len = network->rates_ex_len = 0; in libipw_network_init()
1283 network->last_associate = 0; in libipw_network_init()
1284 network->ssid_len = 0; in libipw_network_init()
1285 network->flags = 0; in libipw_network_init()
1286 network->atim_window = 0; in libipw_network_init()
1287 network->erp_value = (network->capability & WLAN_CAPABILITY_IBSS) ? in libipw_network_init()
1290 if (stats->freq == LIBIPW_52GHZ_BAND) { in libipw_network_init()
1292 network->channel = stats->received_channel; in libipw_network_init()
1294 network->flags |= NETWORK_HAS_CCK; in libipw_network_init()
1296 network->wpa_ie_len = 0; in libipw_network_init()
1297 network->rsn_ie_len = 0; in libipw_network_init()
1299 if (libipw_parse_info_param((void *)beacon->variable, in libipw_network_init()
1300 stats->len - sizeof(*beacon), network)) in libipw_network_init()
1303 network->mode = 0; in libipw_network_init()
1304 if (stats->freq == LIBIPW_52GHZ_BAND) in libipw_network_init()
1305 network->mode = IEEE_A; in libipw_network_init()
1307 if (network->flags & NETWORK_HAS_OFDM) in libipw_network_init()
1308 network->mode |= IEEE_G; in libipw_network_init()
1309 if (network->flags & NETWORK_HAS_CCK) in libipw_network_init()
1310 network->mode |= IEEE_B; in libipw_network_init()
1313 if (network->mode == 0) { in libipw_network_init()
1315 network->ssid_len, network->ssid, in libipw_network_init()
1316 network->bssid); in libipw_network_init()
1320 memcpy(&network->stats, stats, sizeof(network->stats)); in libipw_network_init()
1331 return ((src->ssid_len == dst->ssid_len) && in is_same_network()
1332 (src->channel == dst->channel) && in is_same_network()
1333 ether_addr_equal_64bits(src->bssid, dst->bssid) && in is_same_network()
1334 !memcmp(src->ssid, dst->ssid, src->ssid_len)); in is_same_network()
1348 if (dst->channel == src->stats.received_channel) in update_network()
1349 memcpy(&dst->stats, &src->stats, in update_network()
1353 "off channel (%d vs. %d)\n", src->bssid, in update_network()
1354 dst->channel, src->stats.received_channel); in update_network()
1356 dst->capability = src->capability; in update_network()
1357 memcpy(dst->rates, src->rates, src->rates_len); in update_network()
1358 dst->rates_len = src->rates_len; in update_network()
1359 memcpy(dst->rates_ex, src->rates_ex, src->rates_ex_len); in update_network()
1360 dst->rates_ex_len = src->rates_ex_len; in update_network()
1362 dst->mode = src->mode; in update_network()
1363 dst->flags = src->flags; in update_network()
1364 dst->time_stamp[0] = src->time_stamp[0]; in update_network()
1365 dst->time_stamp[1] = src->time_stamp[1]; in update_network()
1367 dst->beacon_interval = src->beacon_interval; in update_network()
1368 dst->listen_interval = src->listen_interval; in update_network()
1369 dst->atim_window = src->atim_window; in update_network()
1370 dst->erp_value = src->erp_value; in update_network()
1371 dst->tim = src->tim; in update_network()
1373 memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len); in update_network()
1374 dst->wpa_ie_len = src->wpa_ie_len; in update_network()
1375 memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len); in update_network()
1376 dst->rsn_ie_len = src->rsn_ie_len; in update_network()
1378 dst->last_scanned = jiffies; in update_network()
1379 qos_active = src->qos_data.active; in update_network()
1380 old_param = dst->qos_data.old_param_count; in update_network()
1381 if (dst->flags & NETWORK_HAS_QOS_MASK) in update_network()
1382 memcpy(&dst->qos_data, &src->qos_data, in update_network()
1385 dst->qos_data.supported = src->qos_data.supported; in update_network()
1386 dst->qos_data.param_count = src->qos_data.param_count; in update_network()
1389 if (dst->qos_data.supported == 1) { in update_network()
1390 if (dst->ssid_len) in update_network()
1393 dst->ssid); in update_network()
1398 dst->qos_data.active = qos_active; in update_network()
1399 dst->qos_data.old_param_count = old_param; in update_network()
1401 /* dst->last_associate is not overwritten */ in update_network()
1415 struct net_device *dev = ieee->dev; in libipw_process_probe_response()
1420 struct libipw_info_element *info_element = (void *)beacon->variable; in libipw_process_probe_response()
1424 LIBIPW_DEBUG_SCAN("'%*pE' (%pM): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n", in libipw_process_probe_response()
1425 info_element->len, info_element->data, in libipw_process_probe_response()
1426 beacon->header.addr3, in libipw_process_probe_response()
1427 (beacon->capability & cpu_to_le16(1 << 0xf)) ? '1' : '0', in libipw_process_probe_response()
1428 (beacon->capability & cpu_to_le16(1 << 0xe)) ? '1' : '0', in libipw_process_probe_response()
1429 (beacon->capability & cpu_to_le16(1 << 0xd)) ? '1' : '0', in libipw_process_probe_response()
1430 (beacon->capability & cpu_to_le16(1 << 0xc)) ? '1' : '0', in libipw_process_probe_response()
1431 (beacon->capability & cpu_to_le16(1 << 0xb)) ? '1' : '0', in libipw_process_probe_response()
1432 (beacon->capability & cpu_to_le16(1 << 0xa)) ? '1' : '0', in libipw_process_probe_response()
1433 (beacon->capability & cpu_to_le16(1 << 0x9)) ? '1' : '0', in libipw_process_probe_response()
1434 (beacon->capability & cpu_to_le16(1 << 0x8)) ? '1' : '0', in libipw_process_probe_response()
1435 (beacon->capability & cpu_to_le16(1 << 0x7)) ? '1' : '0', in libipw_process_probe_response()
1436 (beacon->capability & cpu_to_le16(1 << 0x6)) ? '1' : '0', in libipw_process_probe_response()
1437 (beacon->capability & cpu_to_le16(1 << 0x5)) ? '1' : '0', in libipw_process_probe_response()
1438 (beacon->capability & cpu_to_le16(1 << 0x4)) ? '1' : '0', in libipw_process_probe_response()
1439 (beacon->capability & cpu_to_le16(1 << 0x3)) ? '1' : '0', in libipw_process_probe_response()
1440 (beacon->capability & cpu_to_le16(1 << 0x2)) ? '1' : '0', in libipw_process_probe_response()
1441 (beacon->capability & cpu_to_le16(1 << 0x1)) ? '1' : '0', in libipw_process_probe_response()
1442 (beacon->capability & cpu_to_le16(1 << 0x0)) ? '1' : '0'); in libipw_process_probe_response()
1446 info_element->len, info_element->data, in libipw_process_probe_response()
1447 beacon->header.addr3, in libipw_process_probe_response()
1448 is_beacon(beacon->header.frame_ctl) ? in libipw_process_probe_response()
1453 /* The network parsed correctly -- so now we scan our known networks in libipw_process_probe_response()
1463 spin_lock_irqsave(&ieee->lock, flags); in libipw_process_probe_response()
1465 list_for_each_entry(target, &ieee->network_list, list) { in libipw_process_probe_response()
1470 time_before(target->last_scanned, oldest->last_scanned)) in libipw_process_probe_response()
1476 if (&target->list == &ieee->network_list) { in libipw_process_probe_response()
1477 if (list_empty(&ieee->network_free_list)) { in libipw_process_probe_response()
1479 list_del(&oldest->list); in libipw_process_probe_response()
1482 target->ssid_len, target->ssid, in libipw_process_probe_response()
1483 target->bssid); in libipw_process_probe_response()
1486 target = list_entry(ieee->network_free_list.next, in libipw_process_probe_response()
1488 list_del(ieee->network_free_list.next); in libipw_process_probe_response()
1495 is_beacon(beacon->header.frame_ctl) ? in libipw_process_probe_response()
1499 list_add_tail(&target->list, &ieee->network_list); in libipw_process_probe_response()
1502 target->ssid_len, target->ssid, in libipw_process_probe_response()
1503 target->bssid, in libipw_process_probe_response()
1504 is_beacon(beacon->header.frame_ctl) ? in libipw_process_probe_response()
1509 spin_unlock_irqrestore(&ieee->lock, flags); in libipw_process_probe_response()
1511 if (is_beacon(beacon->header.frame_ctl)) { in libipw_process_probe_response()
1512 if (ieee->handle_beacon != NULL) in libipw_process_probe_response()
1513 ieee->handle_beacon(dev, beacon, target); in libipw_process_probe_response()
1515 if (ieee->handle_probe_response != NULL) in libipw_process_probe_response()
1516 ieee->handle_probe_response(dev, beacon, target); in libipw_process_probe_response()
1524 switch (WLAN_FC_GET_STYPE(le16_to_cpu(header->frame_ctl))) { in libipw_rx_mgt()
1528 (header->frame_ctl))); in libipw_rx_mgt()
1537 (header->frame_ctl))); in libipw_rx_mgt()
1543 (header->frame_ctl))); in libipw_rx_mgt()
1545 if (ieee->handle_probe_request != NULL) in libipw_rx_mgt()
1546 ieee->handle_probe_request(ieee->dev, in libipw_rx_mgt()
1555 (header->frame_ctl))); in libipw_rx_mgt()
1566 (header->frame_ctl))); in libipw_rx_mgt()
1577 (header->frame_ctl))); in libipw_rx_mgt()
1579 if (ieee->handle_auth != NULL) in libipw_rx_mgt()
1580 ieee->handle_auth(ieee->dev, in libipw_rx_mgt()
1585 if (ieee->handle_disassoc != NULL) in libipw_rx_mgt()
1586 ieee->handle_disassoc(ieee->dev, in libipw_rx_mgt()
1593 if (ieee->handle_action) in libipw_rx_mgt()
1594 ieee->handle_action(ieee->dev, in libipw_rx_mgt()
1602 (header->frame_ctl))); in libipw_rx_mgt()
1605 ieee->dev->name); in libipw_rx_mgt()
1606 if (ieee->handle_reassoc_request != NULL) in libipw_rx_mgt()
1607 ieee->handle_reassoc_request(ieee->dev, in libipw_rx_mgt()
1615 (header->frame_ctl))); in libipw_rx_mgt()
1618 ieee->dev->name); in libipw_rx_mgt()
1619 if (ieee->handle_assoc_request != NULL) in libipw_rx_mgt()
1620 ieee->handle_assoc_request(ieee->dev); in libipw_rx_mgt()
1625 if (ieee->handle_deauth != NULL) in libipw_rx_mgt()
1626 ieee->handle_deauth(ieee->dev, in libipw_rx_mgt()
1633 (header->frame_ctl))); in libipw_rx_mgt()
1635 ieee->dev->name, in libipw_rx_mgt()
1637 (header->frame_ctl))); in libipw_rx_mgt()