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 channel_width_to_int(enum chan_width width
)
121 case CHAN_WIDTH_20_NOHT
:
128 case CHAN_WIDTH_80P80
:
137 int ht_supported(const struct hostapd_hw_modes
*mode
)
139 if (!(mode
->flags
& HOSTAPD_MODE_FLAG_HT_INFO_KNOWN
)) {
141 * The driver did not indicate whether it supports HT. Assume
142 * it does to avoid connection issues.
148 * IEEE Std 802.11n-2009 20.1.1:
149 * An HT non-AP STA shall support all EQM rates for one spatial stream.
151 return mode
->mcs_set
[0] == 0xff;
155 int vht_supported(const struct hostapd_hw_modes
*mode
)
157 if (!(mode
->flags
& HOSTAPD_MODE_FLAG_VHT_INFO_KNOWN
)) {
159 * The driver did not indicate whether it supports VHT. Assume
160 * it does to avoid connection issues.
166 * A VHT non-AP STA shall support MCS 0-7 for one spatial stream.
167 * TODO: Verify if this complies with the standard
169 return (mode
->vht_mcs_set
[0] & 0x3) != 3;
173 static int wpa_check_wowlan_trigger(const char *start
, const char *trigger
,
174 int capa_trigger
, u8
*param_trigger
)
176 if (os_strcmp(start
, trigger
) != 0)
186 struct wowlan_triggers
*
187 wpa_get_wowlan_triggers(const char *wowlan_triggers
,
188 const struct wpa_driver_capa
*capa
)
190 struct wowlan_triggers
*triggers
;
191 char *start
, *end
, *buf
;
194 if (!wowlan_triggers
)
197 buf
= os_strdup(wowlan_triggers
);
201 triggers
= os_zalloc(sizeof(*triggers
));
202 if (triggers
== NULL
)
205 #define CHECK_TRIGGER(trigger) \
206 wpa_check_wowlan_trigger(start, #trigger, \
207 capa->wowlan_triggers.trigger, \
211 while (*start
!= '\0') {
212 while (isblank((unsigned char) *start
))
217 while (!isblank((unsigned char) *end
) && *end
!= '\0')
222 if (!CHECK_TRIGGER(any
) &&
223 !CHECK_TRIGGER(disconnect
) &&
224 !CHECK_TRIGGER(magic_pkt
) &&
225 !CHECK_TRIGGER(gtk_rekey_failure
) &&
226 !CHECK_TRIGGER(eap_identity_req
) &&
227 !CHECK_TRIGGER(four_way_handshake
) &&
228 !CHECK_TRIGGER(rfkill_release
)) {
229 wpa_printf(MSG_DEBUG
,
230 "Unknown/unsupported wowlan trigger '%s'",
249 const char * driver_flag_to_string(u64 flag
)
251 #define DF2S(x) case WPA_DRIVER_FLAGS_ ## x: return #x
254 DF2S(SET_KEYS_AFTER_ASSOC
);
256 DF2S(4WAY_HANDSHAKE_PSK
);
257 DF2S(4WAY_HANDSHAKE_8021X
);
261 DF2S(SET_KEYS_AFTER_ASSOC_DONE
);
263 DF2S(P2P_CONCURRENT
);
264 DF2S(P2P_DEDICATED_INTERFACE
);
266 DF2S(AP_TEARDOWN_SUPPORT
);
267 DF2S(P2P_MGMT_AND_NON_P2P
);
268 DF2S(SANE_ERROR_CODES
);
270 DF2S(EAPOL_TX_STATUS
);
271 DF2S(DEAUTH_TX_STATUS
);
274 DF2S(TDLS_EXTERNAL_SETUP
);
275 DF2S(PROBE_RESP_OFFLOAD
);
277 DF2S(INACTIVITY_TIMER
);
283 DF2S(DEDICATED_P2P_DEVICE
);
288 DF2S(KEY_MGMT_OFFLOAD
);
289 DF2S(TDLS_CHANNEL_SWITCH
);
292 DF2S(SUPPORT_HW_MODE_ANY
);
293 DF2S(OFFCHANNEL_SIMULTANEOUS
);
294 DF2S(FULL_AP_CLIENT_STATE
);
295 DF2S(P2P_LISTEN_OFFLOAD
);
297 DF2S(BEACON_RATE_LEGACY
);
298 DF2S(BEACON_RATE_HT
);
299 DF2S(BEACON_RATE_VHT
);
300 DF2S(MGMT_TX_RANDOM_TA
);
301 DF2S(MGMT_TX_RANDOM_TA_CONNECTED
);
302 DF2S(SCHED_SCAN_RELATIVE_RSSI
);
303 DF2S(HE_CAPABILITIES
);
304 DF2S(FILS_SK_OFFLOAD
);