2 * IEEE 802.11 Common routines
3 * Copyright (c) 2002-2015, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
13 #include "wpa_common.h"
14 #include "ieee802_11_defs.h"
15 #include "ieee802_11_common.h"
18 static int ieee802_11_parse_vendor_specific(const u8 *pos, size_t elen,
19 struct ieee802_11_elems *elems,
24 /* first 3 bytes in vendor specific information element are the IEEE
25 * OUI of the vendor. The following byte is used a vendor specific
29 wpa_printf(MSG_MSGDUMP, "short vendor specific "
30 "information element ignored (len=%lu)",
31 (unsigned long) elen);
36 oui = WPA_GET_BE24(pos);
39 /* Microsoft/Wi-Fi information elements are further typed and
43 /* Microsoft OUI (00:50:F2) with OUI Type 1:
44 * real WPA information element */
46 elems->wpa_ie_len = elen;
49 /* WMM information element */
51 wpa_printf(MSG_MSGDUMP, "short WMM "
52 "information element ignored "
54 (unsigned long) elen);
58 case WMM_OUI_SUBTYPE_INFORMATION_ELEMENT:
59 case WMM_OUI_SUBTYPE_PARAMETER_ELEMENT:
61 * Share same pointer since only one of these
62 * is used and they start with same data.
63 * Length field can be used to distinguish the
67 elems->wmm_len = elen;
69 case WMM_OUI_SUBTYPE_TSPEC_ELEMENT:
70 elems->wmm_tspec = pos;
71 elems->wmm_tspec_len = elen;
74 wpa_printf(MSG_EXCESSIVE, "unknown WMM "
75 "information element ignored "
76 "(subtype=%d len=%lu)",
77 pos[4], (unsigned long) elen);
82 /* Wi-Fi Protected Setup (WPS) IE */
84 elems->wps_ie_len = elen;
87 wpa_printf(MSG_EXCESSIVE, "Unknown Microsoft "
88 "information element ignored "
90 pos[3], (unsigned long) elen);
98 /* Wi-Fi Alliance - P2P IE */
100 elems->p2p_len = elen;
103 /* Wi-Fi Alliance - WFD IE */
105 elems->wfd_len = elen;
107 case HS20_INDICATION_OUI_TYPE:
110 elems->hs20_len = elen;
112 case HS20_OSEN_OUI_TYPE:
113 /* Hotspot 2.0 OSEN */
115 elems->osen_len = elen;
118 wpa_printf(MSG_MSGDUMP, "Unknown WFA "
119 "information element ignored "
121 pos[3], (unsigned long) elen);
128 case VENDOR_HT_CAPAB_OUI_TYPE:
129 elems->vendor_ht_cap = pos;
130 elems->vendor_ht_cap_len = elen;
132 case VENDOR_VHT_TYPE:
134 (pos[4] == VENDOR_VHT_SUBTYPE ||
135 pos[4] == VENDOR_VHT_SUBTYPE2)) {
136 elems->vendor_vht = pos;
137 elems->vendor_vht_len = elen;
142 wpa_printf(MSG_EXCESSIVE, "Unknown Broadcom "
143 "information element ignored "
145 pos[3], (unsigned long) elen);
151 wpa_printf(MSG_EXCESSIVE, "unknown vendor specific "
152 "information element ignored (vendor OUI "
153 "%02x:%02x:%02x len=%lu)",
154 pos[0], pos[1], pos[2], (unsigned long) elen);
163 * ieee802_11_parse_elems - Parse information elements in management frames
164 * @start: Pointer to the start of IEs
165 * @len: Length of IE buffer in octets
166 * @elems: Data structure for parsed elements
167 * @show_errors: Whether to show parsing errors in debug log
168 * Returns: Parsing result
170 ParseRes ieee802_11_parse_elems(const u8 *start, size_t len,
171 struct ieee802_11_elems *elems,
175 const u8 *pos = start;
178 os_memset(elems, 0, sizeof(*elems));
189 wpa_printf(MSG_DEBUG, "IEEE 802.11 element "
190 "parse failed (id=%d elen=%d "
192 id, elen, (unsigned long) left);
193 wpa_hexdump(MSG_MSGDUMP, "IEs", start, len);
200 if (elen > SSID_MAX_LEN) {
201 wpa_printf(MSG_DEBUG,
202 "Ignored too long SSID element (elen=%u)",
207 elems->ssid_len = elen;
209 case WLAN_EID_SUPP_RATES:
210 elems->supp_rates = pos;
211 elems->supp_rates_len = elen;
213 case WLAN_EID_DS_PARAMS:
216 elems->ds_params = pos;
218 case WLAN_EID_CF_PARAMS:
221 case WLAN_EID_CHALLENGE:
222 elems->challenge = pos;
223 elems->challenge_len = elen;
225 case WLAN_EID_ERP_INFO:
228 elems->erp_info = pos;
230 case WLAN_EID_EXT_SUPP_RATES:
231 elems->ext_supp_rates = pos;
232 elems->ext_supp_rates_len = elen;
234 case WLAN_EID_VENDOR_SPECIFIC:
235 if (ieee802_11_parse_vendor_specific(pos, elen,
242 elems->rsn_ie_len = elen;
244 case WLAN_EID_PWR_CAPABILITY:
246 case WLAN_EID_SUPPORTED_CHANNELS:
247 elems->supp_channels = pos;
248 elems->supp_channels_len = elen;
250 case WLAN_EID_MOBILITY_DOMAIN:
251 if (elen < sizeof(struct rsn_mdie))
254 elems->mdie_len = elen;
256 case WLAN_EID_FAST_BSS_TRANSITION:
257 if (elen < sizeof(struct rsn_ftie))
260 elems->ftie_len = elen;
262 case WLAN_EID_TIMEOUT_INTERVAL:
265 elems->timeout_int = pos;
267 case WLAN_EID_HT_CAP:
268 if (elen < sizeof(struct ieee80211_ht_capabilities))
270 elems->ht_capabilities = pos;
272 case WLAN_EID_HT_OPERATION:
273 if (elen < sizeof(struct ieee80211_ht_operation))
275 elems->ht_operation = pos;
277 case WLAN_EID_MESH_CONFIG:
278 elems->mesh_config = pos;
279 elems->mesh_config_len = elen;
281 case WLAN_EID_MESH_ID:
282 elems->mesh_id = pos;
283 elems->mesh_id_len = elen;
285 case WLAN_EID_PEER_MGMT:
286 elems->peer_mgmt = pos;
287 elems->peer_mgmt_len = elen;
289 case WLAN_EID_VHT_CAP:
290 if (elen < sizeof(struct ieee80211_vht_capabilities))
292 elems->vht_capabilities = pos;
294 case WLAN_EID_VHT_OPERATION:
295 if (elen < sizeof(struct ieee80211_vht_operation))
297 elems->vht_operation = pos;
299 case WLAN_EID_VHT_OPERATING_MODE_NOTIFICATION:
302 elems->vht_opmode_notif = pos;
304 case WLAN_EID_LINK_ID:
307 elems->link_id = pos;
309 case WLAN_EID_INTERWORKING:
310 elems->interworking = pos;
311 elems->interworking_len = elen;
313 case WLAN_EID_QOS_MAP_SET:
316 elems->qos_map_set = pos;
317 elems->qos_map_set_len = elen;
319 case WLAN_EID_EXT_CAPAB:
320 elems->ext_capab = pos;
321 elems->ext_capab_len = elen;
323 case WLAN_EID_BSS_MAX_IDLE_PERIOD:
326 elems->bss_max_idle_period = pos;
328 case WLAN_EID_SSID_LIST:
329 elems->ssid_list = pos;
330 elems->ssid_list_len = elen;
334 elems->ampe_len = elen;
338 elems->mic_len = elen;
339 /* after mic everything is encrypted, so stop. */
346 wpa_printf(MSG_MSGDUMP, "IEEE 802.11 element parse "
347 "ignored unknown element (id=%d elen=%d)",
359 return unknown ? ParseUnknown : ParseOK;
363 int ieee802_11_ie_count(const u8 *ies, size_t ies_len)
374 while (pos + 2 <= end) {
375 if (pos + 2 + pos[1] > end)
385 struct wpabuf * ieee802_11_vendor_ie_concat(const u8 *ies, size_t ies_len,
389 const u8 *end, *pos, *ie;
395 while (pos + 1 < end) {
396 if (pos + 2 + pos[1] > end)
398 if (pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 &&
399 WPA_GET_BE32(&pos[2]) == oui_type) {
407 return NULL; /* No specified vendor IE found */
409 buf = wpabuf_alloc(ies_len);
414 * There may be multiple vendor IEs in the message, so need to
415 * concatenate their data fields.
417 while (pos + 1 < end) {
418 if (pos + 2 + pos[1] > end)
420 if (pos[0] == WLAN_EID_VENDOR_SPECIFIC && pos[1] >= 4 &&
421 WPA_GET_BE32(&pos[2]) == oui_type)
422 wpabuf_put_data(buf, pos + 6, pos[1] - 4);
430 const u8 * get_hdr_bssid(const struct ieee80211_hdr *hdr, size_t len)
435 * PS-Poll frames are 16 bytes. All other frames are
436 * 24 bytes or longer.
441 fc = le_to_host16(hdr->frame_control);
442 type = WLAN_FC_GET_TYPE(fc);
443 stype = WLAN_FC_GET_STYPE(fc);
446 case WLAN_FC_TYPE_DATA:
449 switch (fc & (WLAN_FC_FROMDS | WLAN_FC_TODS)) {
450 case WLAN_FC_FROMDS | WLAN_FC_TODS:
458 case WLAN_FC_TYPE_CTRL:
459 if (stype != WLAN_FC_STYPE_PSPOLL)
462 case WLAN_FC_TYPE_MGMT:
470 int hostapd_config_wmm_ac(struct hostapd_wmm_ac_params wmm_ac_params[],
471 const char *name, const char *val)
475 struct hostapd_wmm_ac_params *ac;
477 /* skip 'wme_ac_' or 'wmm_ac_' prefix */
479 if (os_strncmp(pos, "be_", 3) == 0) {
482 } else if (os_strncmp(pos, "bk_", 3) == 0) {
485 } else if (os_strncmp(pos, "vi_", 3) == 0) {
488 } else if (os_strncmp(pos, "vo_", 3) == 0) {
492 wpa_printf(MSG_ERROR, "Unknown WMM name '%s'", pos);
496 ac = &wmm_ac_params[num];
498 if (os_strcmp(pos, "aifs") == 0) {
500 if (v < 1 || v > 255) {
501 wpa_printf(MSG_ERROR, "Invalid AIFS value %d", v);
505 } else if (os_strcmp(pos, "cwmin") == 0) {
507 if (v < 0 || v > 12) {
508 wpa_printf(MSG_ERROR, "Invalid cwMin value %d", v);
512 } else if (os_strcmp(pos, "cwmax") == 0) {
514 if (v < 0 || v > 12) {
515 wpa_printf(MSG_ERROR, "Invalid cwMax value %d", v);
519 } else if (os_strcmp(pos, "txop_limit") == 0) {
521 if (v < 0 || v > 0xffff) {
522 wpa_printf(MSG_ERROR, "Invalid txop value %d", v);
526 } else if (os_strcmp(pos, "acm") == 0) {
528 if (v < 0 || v > 1) {
529 wpa_printf(MSG_ERROR, "Invalid acm value %d", v);
532 ac->admission_control_mandatory = v;
534 wpa_printf(MSG_ERROR, "Unknown wmm_ac_ field '%s'", pos);
542 enum hostapd_hw_mode ieee80211_freq_to_chan(int freq, u8 *channel)
544 enum hostapd_hw_mode mode = NUM_HOSTAPD_MODES;
546 if (freq >= 2412 && freq <= 2472) {
547 mode = HOSTAPD_MODE_IEEE80211G;
548 *channel = (freq - 2407) / 5;
549 } else if (freq == 2484) {
550 mode = HOSTAPD_MODE_IEEE80211B;
552 } else if (freq >= 4900 && freq < 5000) {
553 mode = HOSTAPD_MODE_IEEE80211A;
554 *channel = (freq - 4000) / 5;
555 } else if (freq >= 5000 && freq < 5900) {
556 mode = HOSTAPD_MODE_IEEE80211A;
557 *channel = (freq - 5000) / 5;
558 } else if (freq >= 56160 + 2160 * 1 && freq <= 56160 + 2160 * 4) {
559 mode = HOSTAPD_MODE_IEEE80211AD;
560 *channel = (freq - 56160) / 2160;
567 static const char *us_op_class_cc[] = {
571 static const char *eu_op_class_cc[] = {
572 "AL", "AM", "AT", "AZ", "BA", "BE", "BG", "BY", "CH", "CY", "CZ", "DE",
573 "DK", "EE", "EL", "ES", "FI", "FR", "GE", "HR", "HU", "IE", "IS", "IT",
574 "LI", "LT", "LU", "LV", "MD", "ME", "MK", "MT", "NL", "NO", "PL", "PT",
575 "RO", "RS", "RU", "SE", "SI", "SK", "TR", "UA", "UK", NULL
578 static const char *jp_op_class_cc[] = {
582 static const char *cn_op_class_cc[] = {
587 static int country_match(const char *cc[], const char *country)
593 for (i = 0; cc[i]; i++) {
594 if (cc[i][0] == country[0] && cc[i][1] == country[1])
602 static int ieee80211_chan_to_freq_us(u8 op_class, u8 chan)
605 case 12: /* channels 1..11 */
606 case 32: /* channels 1..7; 40 MHz */
607 case 33: /* channels 5..11; 40 MHz */
608 if (chan < 1 || chan > 11)
610 return 2407 + 5 * chan;
611 case 1: /* channels 36,40,44,48 */
612 case 2: /* channels 52,56,60,64; dfs */
613 case 22: /* channels 36,44; 40 MHz */
614 case 23: /* channels 52,60; 40 MHz */
615 case 27: /* channels 40,48; 40 MHz */
616 case 28: /* channels 56,64; 40 MHz */
617 if (chan < 36 || chan > 64)
619 return 5000 + 5 * chan;
620 case 4: /* channels 100-144 */
621 case 24: /* channels 100-140; 40 MHz */
622 if (chan < 100 || chan > 144)
624 return 5000 + 5 * chan;
625 case 3: /* channels 149,153,157,161 */
626 case 25: /* channels 149,157; 40 MHz */
627 case 26: /* channels 149,157; 40 MHz */
628 case 30: /* channels 153,161; 40 MHz */
629 case 31: /* channels 153,161; 40 MHz */
630 if (chan < 149 || chan > 161)
632 return 5000 + 5 * chan;
633 case 34: /* 60 GHz band, channels 1..3 */
634 if (chan < 1 || chan > 3)
636 return 56160 + 2160 * chan;
642 static int ieee80211_chan_to_freq_eu(u8 op_class, u8 chan)
645 case 4: /* channels 1..13 */
646 case 11: /* channels 1..9; 40 MHz */
647 case 12: /* channels 5..13; 40 MHz */
648 if (chan < 1 || chan > 13)
650 return 2407 + 5 * chan;
651 case 1: /* channels 36,40,44,48 */
652 case 2: /* channels 52,56,60,64; dfs */
653 case 5: /* channels 36,44; 40 MHz */
654 case 6: /* channels 52,60; 40 MHz */
655 case 8: /* channels 40,48; 40 MHz */
656 case 9: /* channels 56,64; 40 MHz */
657 if (chan < 36 || chan > 64)
659 return 5000 + 5 * chan;
660 case 3: /* channels 100-140 */
661 case 7: /* channels 100-132; 40 MHz */
662 case 10: /* channels 104-136; 40 MHz */
663 case 16: /* channels 100-140 */
664 if (chan < 100 || chan > 140)
666 return 5000 + 5 * chan;
667 case 17: /* channels 149,153,157,161,165,169 */
668 if (chan < 149 || chan > 169)
670 return 5000 + 5 * chan;
671 case 18: /* 60 GHz band, channels 1..4 */
672 if (chan < 1 || chan > 4)
674 return 56160 + 2160 * chan;
680 static int ieee80211_chan_to_freq_jp(u8 op_class, u8 chan)
683 case 30: /* channels 1..13 */
684 case 56: /* channels 1..9; 40 MHz */
685 case 57: /* channels 5..13; 40 MHz */
686 if (chan < 1 || chan > 13)
688 return 2407 + 5 * chan;
689 case 31: /* channel 14 */
692 return 2414 + 5 * chan;
693 case 1: /* channels 34,38,42,46(old) or 36,40,44,48 */
694 case 32: /* channels 52,56,60,64 */
695 case 33: /* channels 52,56,60,64 */
696 case 36: /* channels 36,44; 40 MHz */
697 case 37: /* channels 52,60; 40 MHz */
698 case 38: /* channels 52,60; 40 MHz */
699 case 41: /* channels 40,48; 40 MHz */
700 case 42: /* channels 56,64; 40 MHz */
701 case 43: /* channels 56,64; 40 MHz */
702 if (chan < 34 || chan > 64)
704 return 5000 + 5 * chan;
705 case 34: /* channels 100-140 */
706 case 35: /* channels 100-140 */
707 case 39: /* channels 100-132; 40 MHz */
708 case 40: /* channels 100-132; 40 MHz */
709 case 44: /* channels 104-136; 40 MHz */
710 case 45: /* channels 104-136; 40 MHz */
711 case 58: /* channels 100-140 */
712 if (chan < 100 || chan > 140)
714 return 5000 + 5 * chan;
715 case 59: /* 60 GHz band, channels 1..4 */
716 if (chan < 1 || chan > 3)
718 return 56160 + 2160 * chan;
724 static int ieee80211_chan_to_freq_cn(u8 op_class, u8 chan)
727 case 7: /* channels 1..13 */
728 case 8: /* channels 1..9; 40 MHz */
729 case 9: /* channels 5..13; 40 MHz */
730 if (chan < 1 || chan > 13)
732 return 2407 + 5 * chan;
733 case 1: /* channels 36,40,44,48 */
734 case 2: /* channels 52,56,60,64; dfs */
735 case 4: /* channels 36,44; 40 MHz */
736 case 5: /* channels 52,60; 40 MHz */
737 if (chan < 36 || chan > 64)
739 return 5000 + 5 * chan;
740 case 3: /* channels 149,153,157,161,165 */
741 case 6: /* channels 149,157; 40 MHz */
742 if (chan < 149 || chan > 165)
744 return 5000 + 5 * chan;
750 static int ieee80211_chan_to_freq_global(u8 op_class, u8 chan)
752 /* Table E-4 in IEEE Std 802.11-2012 - Global operating classes */
756 if (chan < 1 || chan > 13)
758 return 2407 + 5 * chan;
763 return 2414 + 5 * chan;
764 case 83: /* channels 1..9; 40 MHz */
765 case 84: /* channels 5..13; 40 MHz */
766 if (chan < 1 || chan > 13)
768 return 2407 + 5 * chan;
769 case 115: /* channels 36,40,44,48; indoor only */
770 case 116: /* channels 36,44; 40 MHz; indoor only */
771 case 117: /* channels 40,48; 40 MHz; indoor only */
772 case 118: /* channels 52,56,60,64; dfs */
773 case 119: /* channels 52,60; 40 MHz; dfs */
774 case 120: /* channels 56,64; 40 MHz; dfs */
775 if (chan < 36 || chan > 64)
777 return 5000 + 5 * chan;
778 case 121: /* channels 100-140 */
779 case 122: /* channels 100-142; 40 MHz */
780 case 123: /* channels 104-136; 40 MHz */
781 if (chan < 100 || chan > 140)
783 return 5000 + 5 * chan;
784 case 124: /* channels 149,153,157,161 */
785 case 125: /* channels 149,153,157,161,165,169 */
786 case 126: /* channels 149,157; 40 MHz */
787 case 127: /* channels 153,161; 40 MHz */
788 if (chan < 149 || chan > 161)
790 return 5000 + 5 * chan;
791 case 128: /* center freqs 42, 58, 106, 122, 138, 155; 80 MHz */
792 case 130: /* center freqs 42, 58, 106, 122, 138, 155; 80 MHz */
793 if (chan < 36 || chan > 161)
795 return 5000 + 5 * chan;
796 case 129: /* center freqs 50, 114; 160 MHz */
797 if (chan < 50 || chan > 114)
799 return 5000 + 5 * chan;
800 case 180: /* 60 GHz band, channels 1..4 */
801 if (chan < 1 || chan > 4)
803 return 56160 + 2160 * chan;
809 * ieee80211_chan_to_freq - Convert channel info to frequency
810 * @country: Country code, if known; otherwise, global operating class is used
811 * @op_class: Operating class
812 * @chan: Channel number
813 * Returns: Frequency in MHz or -1 if the specified channel is unknown
815 int ieee80211_chan_to_freq(const char *country, u8 op_class, u8 chan)
819 if (country_match(us_op_class_cc, country)) {
820 freq = ieee80211_chan_to_freq_us(op_class, chan);
825 if (country_match(eu_op_class_cc, country)) {
826 freq = ieee80211_chan_to_freq_eu(op_class, chan);
831 if (country_match(jp_op_class_cc, country)) {
832 freq = ieee80211_chan_to_freq_jp(op_class, chan);
837 if (country_match(cn_op_class_cc, country)) {
838 freq = ieee80211_chan_to_freq_cn(op_class, chan);
843 return ieee80211_chan_to_freq_global(op_class, chan);
847 int ieee80211_is_dfs(int freq)
849 /* TODO: this could be more accurate to better cover all domains */
850 return (freq >= 5260 && freq <= 5320) || (freq >= 5500 && freq <= 5700);
854 static int is_11b(u8 rate)
856 return rate == 0x02 || rate == 0x04 || rate == 0x0b || rate == 0x16;
860 int supp_rates_11b_only(struct ieee802_11_elems *elems)
862 int num_11b = 0, num_others = 0;
865 if (elems->supp_rates == NULL && elems->ext_supp_rates == NULL)
868 for (i = 0; elems->supp_rates && i < elems->supp_rates_len; i++) {
869 if (is_11b(elems->supp_rates[i]))
875 for (i = 0; elems->ext_supp_rates && i < elems->ext_supp_rates_len;
877 if (is_11b(elems->ext_supp_rates[i]))
883 return num_11b > 0 && num_others == 0;
887 const char * fc2str(u16 fc)
889 u16 stype = WLAN_FC_GET_STYPE(fc);
890 #define C2S(x) case x: return #x;
892 switch (WLAN_FC_GET_TYPE(fc)) {
893 case WLAN_FC_TYPE_MGMT:
895 C2S(WLAN_FC_STYPE_ASSOC_REQ)
896 C2S(WLAN_FC_STYPE_ASSOC_RESP)
897 C2S(WLAN_FC_STYPE_REASSOC_REQ)
898 C2S(WLAN_FC_STYPE_REASSOC_RESP)
899 C2S(WLAN_FC_STYPE_PROBE_REQ)
900 C2S(WLAN_FC_STYPE_PROBE_RESP)
901 C2S(WLAN_FC_STYPE_BEACON)
902 C2S(WLAN_FC_STYPE_ATIM)
903 C2S(WLAN_FC_STYPE_DISASSOC)
904 C2S(WLAN_FC_STYPE_AUTH)
905 C2S(WLAN_FC_STYPE_DEAUTH)
906 C2S(WLAN_FC_STYPE_ACTION)
909 case WLAN_FC_TYPE_CTRL:
911 C2S(WLAN_FC_STYPE_PSPOLL)
912 C2S(WLAN_FC_STYPE_RTS)
913 C2S(WLAN_FC_STYPE_CTS)
914 C2S(WLAN_FC_STYPE_ACK)
915 C2S(WLAN_FC_STYPE_CFEND)
916 C2S(WLAN_FC_STYPE_CFENDACK)
919 case WLAN_FC_TYPE_DATA:
921 C2S(WLAN_FC_STYPE_DATA)
922 C2S(WLAN_FC_STYPE_DATA_CFACK)
923 C2S(WLAN_FC_STYPE_DATA_CFPOLL)
924 C2S(WLAN_FC_STYPE_DATA_CFACKPOLL)
925 C2S(WLAN_FC_STYPE_NULLFUNC)
926 C2S(WLAN_FC_STYPE_CFACK)
927 C2S(WLAN_FC_STYPE_CFPOLL)
928 C2S(WLAN_FC_STYPE_CFACKPOLL)
929 C2S(WLAN_FC_STYPE_QOS_DATA)
930 C2S(WLAN_FC_STYPE_QOS_DATA_CFACK)
931 C2S(WLAN_FC_STYPE_QOS_DATA_CFPOLL)
932 C2S(WLAN_FC_STYPE_QOS_DATA_CFACKPOLL)
933 C2S(WLAN_FC_STYPE_QOS_NULL)
934 C2S(WLAN_FC_STYPE_QOS_CFPOLL)
935 C2S(WLAN_FC_STYPE_QOS_CFACKPOLL)
939 return "WLAN_FC_TYPE_UNKNOWN";