2 * Common driver-related functions
3 * Copyright (c) 2003-2017, Jouni Malinen <j@w1.fi>
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
10 #include "utils/common.h"
13 void wpa_scan_results_free(struct wpa_scan_results
*res
)
20 for (i
= 0; i
< res
->num
; i
++)
27 const char * event_to_string(enum wpa_event_type event
)
29 #define E2S(n) case EVENT_ ## n: return #n
33 E2S(MICHAEL_MIC_FAILURE
);
36 E2S(INTERFACE_STATUS
);
46 E2S(WPS_BUTTON_PUSHED
);
50 E2S(REMAIN_ON_CHANNEL
);
51 E2S(CANCEL_REMAIN_ON_CHANNEL
);
56 E2S(INTERFACE_ENABLED
);
57 E2S(INTERFACE_DISABLED
);
58 E2S(CHANNEL_LIST_CHANGED
);
59 E2S(INTERFACE_UNAVAILABLE
);
65 E2S(DRIVER_GTK_REKEY
);
66 E2S(SCHED_SCAN_STOPPED
);
67 E2S(DRIVER_CLIENT_POLL_OK
);
71 E2S(CONNECT_FAILED_REASON
);
72 E2S(DFS_RADAR_DETECTED
);
73 E2S(DFS_CAC_FINISHED
);
75 E2S(DFS_NOP_FINISHED
);
78 E2S(AVOID_FREQUENCIES
);
79 E2S(NEW_PEER_CANDIDATE
);
80 E2S(ACS_CHANNEL_SELECTED
);
84 E2S(DFS_PRE_CAC_EXPIRED
);
87 E2S(STATION_OPMODE_CHANGED
);
88 E2S(INTERFACE_MAC_CHANGED
);
89 E2S(WDS_STA_INTERFACE_STATUS
);
97 const char * channel_width_to_string(enum chan_width width
)
100 case CHAN_WIDTH_20_NOHT
:
101 return "20 MHz (no HT)";
108 case CHAN_WIDTH_80P80
:
118 int ht_supported(const struct hostapd_hw_modes
*mode
)
120 if (!(mode
->flags
& HOSTAPD_MODE_FLAG_HT_INFO_KNOWN
)) {
122 * The driver did not indicate whether it supports HT. Assume
123 * it does to avoid connection issues.
129 * IEEE Std 802.11n-2009 20.1.1:
130 * An HT non-AP STA shall support all EQM rates for one spatial stream.
132 return mode
->mcs_set
[0] == 0xff;
136 int vht_supported(const struct hostapd_hw_modes
*mode
)
138 if (!(mode
->flags
& HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN
)) {
140 * The driver did not indicate whether it supports VHT. Assume
141 * it does to avoid connection issues.
147 * A VHT non-AP STA shall support MCS 0-7 for one spatial stream.
148 * TODO: Verify if this complies with the standard
150 return (mode
->vht_mcs_set
[0] & 0x3) != 3;
154 static int wpa_check_wowlan_trigger(const char *start
, const char *trigger
,
155 int capa_trigger
, u8
*param_trigger
)
157 if (os_strcmp(start
, trigger
) != 0)
167 struct wowlan_triggers
*
168 wpa_get_wowlan_triggers(const char *wowlan_triggers
,
169 const struct wpa_driver_capa
*capa
)
171 struct wowlan_triggers
*triggers
;
172 char *start
, *end
, *buf
;
175 if (!wowlan_triggers
)
178 buf
= os_strdup(wowlan_triggers
);
182 triggers
= os_zalloc(sizeof(*triggers
));
183 if (triggers
== NULL
)
186 #define CHECK_TRIGGER(trigger) \
187 wpa_check_wowlan_trigger(start, #trigger, \
188 capa->wowlan_triggers.trigger, \
192 while (*start
!= '\0') {
193 while (isblank((unsigned char) *start
))
198 while (!isblank((unsigned char) *end
) && *end
!= '\0')
203 if (!CHECK_TRIGGER(any
) &&
204 !CHECK_TRIGGER(disconnect
) &&
205 !CHECK_TRIGGER(magic_pkt
) &&
206 !CHECK_TRIGGER(gtk_rekey_failure
) &&
207 !CHECK_TRIGGER(eap_identity_req
) &&
208 !CHECK_TRIGGER(four_way_handshake
) &&
209 !CHECK_TRIGGER(rfkill_release
)) {
210 wpa_printf(MSG_DEBUG
,
211 "Unknown/unsupported wowlan trigger '%s'",
230 const char * driver_flag_to_string(u64 flag
)
232 #define DF2S(x) case WPA_DRIVER_FLAGS_ ## x: return #x
235 DF2S(SET_KEYS_AFTER_ASSOC
);
237 DF2S(4WAY_HANDSHAKE
);
241 DF2S(SET_KEYS_AFTER_ASSOC_DONE
);
243 DF2S(P2P_CONCURRENT
);
244 DF2S(P2P_DEDICATED_INTERFACE
);
246 DF2S(AP_TEARDOWN_SUPPORT
);
247 DF2S(P2P_MGMT_AND_NON_P2P
);
248 DF2S(SANE_ERROR_CODES
);
250 DF2S(EAPOL_TX_STATUS
);
251 DF2S(DEAUTH_TX_STATUS
);
254 DF2S(TDLS_EXTERNAL_SETUP
);
255 DF2S(PROBE_RESP_OFFLOAD
);
257 DF2S(INACTIVITY_TIMER
);
263 DF2S(DEDICATED_P2P_DEVICE
);
268 DF2S(KEY_MGMT_OFFLOAD
);
269 DF2S(TDLS_CHANNEL_SWITCH
);
272 DF2S(SUPPORT_HW_MODE_ANY
);
273 DF2S(OFFCHANNEL_SIMULTANEOUS
);
274 DF2S(FULL_AP_CLIENT_STATE
);
275 DF2S(P2P_LISTEN_OFFLOAD
);