xref: /freebsd/contrib/wpa/wpa_supplicant/driver_i.h (revision 780fb4a2fa9a9aee5ac48a60b790f567c0dc13e9)
1e28a4053SRui Paulo /*
2e28a4053SRui Paulo  * wpa_supplicant - Internal driver interface wrappers
35b9c547cSRui Paulo  * Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi>
4e28a4053SRui Paulo  *
5f05cddf9SRui Paulo  * This software may be distributed under the terms of the BSD license.
6f05cddf9SRui Paulo  * See README for more details.
7e28a4053SRui Paulo  */
8e28a4053SRui Paulo 
9e28a4053SRui Paulo #ifndef DRIVER_I_H
10e28a4053SRui Paulo #define DRIVER_I_H
11e28a4053SRui Paulo 
12e28a4053SRui Paulo #include "drivers/driver.h"
13e28a4053SRui Paulo 
14e28a4053SRui Paulo /* driver_ops */
15e28a4053SRui Paulo static inline void * wpa_drv_init(struct wpa_supplicant *wpa_s,
16e28a4053SRui Paulo 				  const char *ifname)
17e28a4053SRui Paulo {
18e28a4053SRui Paulo 	if (wpa_s->driver->init2)
19e28a4053SRui Paulo 		return wpa_s->driver->init2(wpa_s, ifname,
20e28a4053SRui Paulo 					    wpa_s->global_drv_priv);
21e28a4053SRui Paulo 	if (wpa_s->driver->init) {
22e28a4053SRui Paulo 		return wpa_s->driver->init(wpa_s, ifname);
23e28a4053SRui Paulo 	}
24e28a4053SRui Paulo 	return NULL;
25e28a4053SRui Paulo }
26e28a4053SRui Paulo 
27e28a4053SRui Paulo static inline void wpa_drv_deinit(struct wpa_supplicant *wpa_s)
28e28a4053SRui Paulo {
29e28a4053SRui Paulo 	if (wpa_s->driver->deinit)
30e28a4053SRui Paulo 		wpa_s->driver->deinit(wpa_s->drv_priv);
31e28a4053SRui Paulo }
32e28a4053SRui Paulo 
33e28a4053SRui Paulo static inline int wpa_drv_set_param(struct wpa_supplicant *wpa_s,
34e28a4053SRui Paulo 				    const char *param)
35e28a4053SRui Paulo {
36e28a4053SRui Paulo 	if (wpa_s->driver->set_param)
37e28a4053SRui Paulo 		return wpa_s->driver->set_param(wpa_s->drv_priv, param);
38e28a4053SRui Paulo 	return 0;
39e28a4053SRui Paulo }
40e28a4053SRui Paulo 
41e28a4053SRui Paulo static inline int wpa_drv_set_countermeasures(struct wpa_supplicant *wpa_s,
42e28a4053SRui Paulo 					      int enabled)
43e28a4053SRui Paulo {
44e28a4053SRui Paulo 	if (wpa_s->driver->set_countermeasures) {
45e28a4053SRui Paulo 		return wpa_s->driver->set_countermeasures(wpa_s->drv_priv,
46e28a4053SRui Paulo 							  enabled);
47e28a4053SRui Paulo 	}
48e28a4053SRui Paulo 	return -1;
49e28a4053SRui Paulo }
50e28a4053SRui Paulo 
51e28a4053SRui Paulo static inline int wpa_drv_authenticate(struct wpa_supplicant *wpa_s,
52e28a4053SRui Paulo 				       struct wpa_driver_auth_params *params)
53e28a4053SRui Paulo {
54e28a4053SRui Paulo 	if (wpa_s->driver->authenticate)
55e28a4053SRui Paulo 		return wpa_s->driver->authenticate(wpa_s->drv_priv, params);
56e28a4053SRui Paulo 	return -1;
57e28a4053SRui Paulo }
58e28a4053SRui Paulo 
59e28a4053SRui Paulo static inline int wpa_drv_associate(struct wpa_supplicant *wpa_s,
60e28a4053SRui Paulo 				    struct wpa_driver_associate_params *params)
61e28a4053SRui Paulo {
62e28a4053SRui Paulo 	if (wpa_s->driver->associate) {
63e28a4053SRui Paulo 		return wpa_s->driver->associate(wpa_s->drv_priv, params);
64e28a4053SRui Paulo 	}
65e28a4053SRui Paulo 	return -1;
66e28a4053SRui Paulo }
67e28a4053SRui Paulo 
685b9c547cSRui Paulo static inline int wpa_drv_init_mesh(struct wpa_supplicant *wpa_s)
695b9c547cSRui Paulo {
705b9c547cSRui Paulo 	if (wpa_s->driver->init_mesh)
715b9c547cSRui Paulo 		return wpa_s->driver->init_mesh(wpa_s->drv_priv);
725b9c547cSRui Paulo 	return -1;
735b9c547cSRui Paulo }
745b9c547cSRui Paulo 
755b9c547cSRui Paulo static inline int wpa_drv_join_mesh(struct wpa_supplicant *wpa_s,
765b9c547cSRui Paulo 				    struct wpa_driver_mesh_join_params *params)
775b9c547cSRui Paulo {
785b9c547cSRui Paulo 	if (wpa_s->driver->join_mesh)
795b9c547cSRui Paulo 		return wpa_s->driver->join_mesh(wpa_s->drv_priv, params);
805b9c547cSRui Paulo 	return -1;
815b9c547cSRui Paulo }
825b9c547cSRui Paulo 
835b9c547cSRui Paulo static inline int wpa_drv_leave_mesh(struct wpa_supplicant *wpa_s)
845b9c547cSRui Paulo {
855b9c547cSRui Paulo 	if (wpa_s->driver->leave_mesh)
865b9c547cSRui Paulo 		return wpa_s->driver->leave_mesh(wpa_s->drv_priv);
875b9c547cSRui Paulo 	return -1;
885b9c547cSRui Paulo }
895b9c547cSRui Paulo 
90e28a4053SRui Paulo static inline int wpa_drv_scan(struct wpa_supplicant *wpa_s,
91e28a4053SRui Paulo 			       struct wpa_driver_scan_params *params)
92e28a4053SRui Paulo {
935b9c547cSRui Paulo #ifdef CONFIG_TESTING_OPTIONS
945b9c547cSRui Paulo 	if (wpa_s->test_failure == WPAS_TEST_FAILURE_SCAN_TRIGGER)
955b9c547cSRui Paulo 		return -EBUSY;
965b9c547cSRui Paulo #endif /* CONFIG_TESTING_OPTIONS */
97e28a4053SRui Paulo 	if (wpa_s->driver->scan2)
98e28a4053SRui Paulo 		return wpa_s->driver->scan2(wpa_s->drv_priv, params);
99e28a4053SRui Paulo 	return -1;
100e28a4053SRui Paulo }
101e28a4053SRui Paulo 
102f05cddf9SRui Paulo static inline int wpa_drv_sched_scan(struct wpa_supplicant *wpa_s,
103*780fb4a2SCy Schubert 				     struct wpa_driver_scan_params *params)
104f05cddf9SRui Paulo {
105f05cddf9SRui Paulo 	if (wpa_s->driver->sched_scan)
106*780fb4a2SCy Schubert 		return wpa_s->driver->sched_scan(wpa_s->drv_priv, params);
107f05cddf9SRui Paulo 	return -1;
108f05cddf9SRui Paulo }
109f05cddf9SRui Paulo 
110f05cddf9SRui Paulo static inline int wpa_drv_stop_sched_scan(struct wpa_supplicant *wpa_s)
111f05cddf9SRui Paulo {
112f05cddf9SRui Paulo 	if (wpa_s->driver->stop_sched_scan)
113f05cddf9SRui Paulo 		return wpa_s->driver->stop_sched_scan(wpa_s->drv_priv);
114f05cddf9SRui Paulo 	return -1;
115f05cddf9SRui Paulo }
116f05cddf9SRui Paulo 
117e28a4053SRui Paulo static inline struct wpa_scan_results * wpa_drv_get_scan_results2(
118e28a4053SRui Paulo 	struct wpa_supplicant *wpa_s)
119e28a4053SRui Paulo {
120e28a4053SRui Paulo 	if (wpa_s->driver->get_scan_results2)
121e28a4053SRui Paulo 		return wpa_s->driver->get_scan_results2(wpa_s->drv_priv);
122e28a4053SRui Paulo 	return NULL;
123e28a4053SRui Paulo }
124e28a4053SRui Paulo 
125e28a4053SRui Paulo static inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid)
126e28a4053SRui Paulo {
127e28a4053SRui Paulo 	if (wpa_s->driver->get_bssid) {
128e28a4053SRui Paulo 		return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid);
129e28a4053SRui Paulo 	}
130e28a4053SRui Paulo 	return -1;
131e28a4053SRui Paulo }
132e28a4053SRui Paulo 
133e28a4053SRui Paulo static inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid)
134e28a4053SRui Paulo {
135e28a4053SRui Paulo 	if (wpa_s->driver->get_ssid) {
136e28a4053SRui Paulo 		return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid);
137e28a4053SRui Paulo 	}
138e28a4053SRui Paulo 	return -1;
139e28a4053SRui Paulo }
140e28a4053SRui Paulo 
141e28a4053SRui Paulo static inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s,
142e28a4053SRui Paulo 				  enum wpa_alg alg, const u8 *addr,
143e28a4053SRui Paulo 				  int key_idx, int set_tx,
144e28a4053SRui Paulo 				  const u8 *seq, size_t seq_len,
145e28a4053SRui Paulo 				  const u8 *key, size_t key_len)
146e28a4053SRui Paulo {
1475b9c547cSRui Paulo 	if (alg != WPA_ALG_NONE) {
1485b9c547cSRui Paulo 		if (key_idx >= 0 && key_idx <= 6)
1495b9c547cSRui Paulo 			wpa_s->keys_cleared &= ~BIT(key_idx);
1505b9c547cSRui Paulo 		else
151e28a4053SRui Paulo 			wpa_s->keys_cleared = 0;
1525b9c547cSRui Paulo 	}
1535b9c547cSRui Paulo 	if (wpa_s->driver->set_key) {
154e28a4053SRui Paulo 		return wpa_s->driver->set_key(wpa_s->ifname, wpa_s->drv_priv,
155e28a4053SRui Paulo 					      alg, addr, key_idx, set_tx,
156e28a4053SRui Paulo 					      seq, seq_len, key, key_len);
157e28a4053SRui Paulo 	}
158e28a4053SRui Paulo 	return -1;
159e28a4053SRui Paulo }
160e28a4053SRui Paulo 
161*780fb4a2SCy Schubert static inline int wpa_drv_get_seqnum(struct wpa_supplicant *wpa_s,
162*780fb4a2SCy Schubert 				     const u8 *addr, int idx, u8 *seq)
163*780fb4a2SCy Schubert {
164*780fb4a2SCy Schubert 	if (wpa_s->driver->get_seqnum)
165*780fb4a2SCy Schubert 		return wpa_s->driver->get_seqnum(wpa_s->ifname, wpa_s->drv_priv,
166*780fb4a2SCy Schubert 						 addr, idx, seq);
167*780fb4a2SCy Schubert 	return -1;
168*780fb4a2SCy Schubert }
169*780fb4a2SCy Schubert 
1705b9c547cSRui Paulo static inline int wpa_drv_sta_deauth(struct wpa_supplicant *wpa_s,
1715b9c547cSRui Paulo 				     const u8 *addr, int reason_code)
1725b9c547cSRui Paulo {
1735b9c547cSRui Paulo 	if (wpa_s->driver->sta_deauth) {
1745b9c547cSRui Paulo 		return wpa_s->driver->sta_deauth(wpa_s->drv_priv,
1755b9c547cSRui Paulo 						 wpa_s->own_addr, addr,
1765b9c547cSRui Paulo 						 reason_code);
1775b9c547cSRui Paulo 	}
1785b9c547cSRui Paulo 	return -1;
1795b9c547cSRui Paulo }
1805b9c547cSRui Paulo 
181e28a4053SRui Paulo static inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
182e28a4053SRui Paulo 					 const u8 *addr, int reason_code)
183e28a4053SRui Paulo {
184e28a4053SRui Paulo 	if (wpa_s->driver->deauthenticate) {
185e28a4053SRui Paulo 		return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
186e28a4053SRui Paulo 						     reason_code);
187e28a4053SRui Paulo 	}
188e28a4053SRui Paulo 	return -1;
189e28a4053SRui Paulo }
190e28a4053SRui Paulo 
191e28a4053SRui Paulo static inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
192e28a4053SRui Paulo 				    const u8 *bssid, const u8 *pmkid)
193e28a4053SRui Paulo {
194e28a4053SRui Paulo 	if (wpa_s->driver->add_pmkid) {
195e28a4053SRui Paulo 		return wpa_s->driver->add_pmkid(wpa_s->drv_priv, bssid, pmkid);
196e28a4053SRui Paulo 	}
197e28a4053SRui Paulo 	return -1;
198e28a4053SRui Paulo }
199e28a4053SRui Paulo 
200e28a4053SRui Paulo static inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
201e28a4053SRui Paulo 				       const u8 *bssid, const u8 *pmkid)
202e28a4053SRui Paulo {
203e28a4053SRui Paulo 	if (wpa_s->driver->remove_pmkid) {
204e28a4053SRui Paulo 		return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, bssid,
205e28a4053SRui Paulo 						   pmkid);
206e28a4053SRui Paulo 	}
207e28a4053SRui Paulo 	return -1;
208e28a4053SRui Paulo }
209e28a4053SRui Paulo 
210e28a4053SRui Paulo static inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
211e28a4053SRui Paulo {
212e28a4053SRui Paulo 	if (wpa_s->driver->flush_pmkid) {
213e28a4053SRui Paulo 		return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
214e28a4053SRui Paulo 	}
215e28a4053SRui Paulo 	return -1;
216e28a4053SRui Paulo }
217e28a4053SRui Paulo 
218e28a4053SRui Paulo static inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
219e28a4053SRui Paulo 				   struct wpa_driver_capa *capa)
220e28a4053SRui Paulo {
221e28a4053SRui Paulo 	if (wpa_s->driver->get_capa) {
222e28a4053SRui Paulo 		return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
223e28a4053SRui Paulo 	}
224e28a4053SRui Paulo 	return -1;
225e28a4053SRui Paulo }
226e28a4053SRui Paulo 
227e28a4053SRui Paulo static inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
228e28a4053SRui Paulo {
229e28a4053SRui Paulo 	if (wpa_s->driver->poll) {
230e28a4053SRui Paulo 		wpa_s->driver->poll(wpa_s->drv_priv);
231e28a4053SRui Paulo 	}
232e28a4053SRui Paulo }
233e28a4053SRui Paulo 
234e28a4053SRui Paulo static inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
235e28a4053SRui Paulo {
236e28a4053SRui Paulo 	if (wpa_s->driver->get_ifname) {
237e28a4053SRui Paulo 		return wpa_s->driver->get_ifname(wpa_s->drv_priv);
238e28a4053SRui Paulo 	}
239e28a4053SRui Paulo 	return NULL;
240e28a4053SRui Paulo }
241e28a4053SRui Paulo 
2425b9c547cSRui Paulo static inline const char *
2435b9c547cSRui Paulo wpa_driver_get_radio_name(struct wpa_supplicant *wpa_s)
2445b9c547cSRui Paulo {
2455b9c547cSRui Paulo 	if (wpa_s->driver->get_radio_name)
2465b9c547cSRui Paulo 		return wpa_s->driver->get_radio_name(wpa_s->drv_priv);
2475b9c547cSRui Paulo 	return NULL;
2485b9c547cSRui Paulo }
2495b9c547cSRui Paulo 
250e28a4053SRui Paulo static inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
251e28a4053SRui Paulo {
252e28a4053SRui Paulo 	if (wpa_s->driver->get_mac_addr) {
253e28a4053SRui Paulo 		return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
254e28a4053SRui Paulo 	}
255e28a4053SRui Paulo 	return NULL;
256e28a4053SRui Paulo }
257e28a4053SRui Paulo 
258e28a4053SRui Paulo static inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
259e28a4053SRui Paulo 					int state)
260e28a4053SRui Paulo {
261e28a4053SRui Paulo 	if (wpa_s->driver->set_operstate)
262e28a4053SRui Paulo 		return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
263e28a4053SRui Paulo 	return 0;
264e28a4053SRui Paulo }
265e28a4053SRui Paulo 
266e28a4053SRui Paulo static inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
267e28a4053SRui Paulo 					     const u8 *addr, int protect_type,
268e28a4053SRui Paulo 					     int key_type)
269e28a4053SRui Paulo {
270e28a4053SRui Paulo 	if (wpa_s->driver->mlme_setprotection)
271e28a4053SRui Paulo 		return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
272e28a4053SRui Paulo 							 protect_type,
273e28a4053SRui Paulo 							 key_type);
274e28a4053SRui Paulo 	return 0;
275e28a4053SRui Paulo }
276e28a4053SRui Paulo 
277e28a4053SRui Paulo static inline struct hostapd_hw_modes *
278e28a4053SRui Paulo wpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
279e28a4053SRui Paulo 			    u16 *flags)
280e28a4053SRui Paulo {
281e28a4053SRui Paulo 	if (wpa_s->driver->get_hw_feature_data)
282e28a4053SRui Paulo 		return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
283e28a4053SRui Paulo 							  num_modes, flags);
284e28a4053SRui Paulo 	return NULL;
285e28a4053SRui Paulo }
286e28a4053SRui Paulo 
287e28a4053SRui Paulo static inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
288e28a4053SRui Paulo 				      const char *alpha2)
289e28a4053SRui Paulo {
290e28a4053SRui Paulo 	if (wpa_s->driver->set_country)
291e28a4053SRui Paulo 		return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
292e28a4053SRui Paulo 	return 0;
293e28a4053SRui Paulo }
294e28a4053SRui Paulo 
295e28a4053SRui Paulo static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
296325151a3SRui Paulo 				    const u8 *data, size_t data_len, int noack,
297325151a3SRui Paulo 				    unsigned int freq)
298e28a4053SRui Paulo {
299e28a4053SRui Paulo 	if (wpa_s->driver->send_mlme)
300e28a4053SRui Paulo 		return wpa_s->driver->send_mlme(wpa_s->drv_priv,
301325151a3SRui Paulo 						data, data_len, noack,
302*780fb4a2SCy Schubert 						freq, NULL, 0);
303e28a4053SRui Paulo 	return -1;
304e28a4053SRui Paulo }
305e28a4053SRui Paulo 
306e28a4053SRui Paulo static inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
307e28a4053SRui Paulo 					const u8 *md,
308e28a4053SRui Paulo 					const u8 *ies, size_t ies_len)
309e28a4053SRui Paulo {
310e28a4053SRui Paulo 	if (wpa_s->driver->update_ft_ies)
311e28a4053SRui Paulo 		return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
312e28a4053SRui Paulo 						    ies, ies_len);
313e28a4053SRui Paulo 	return -1;
314e28a4053SRui Paulo }
315e28a4053SRui Paulo 
316f05cddf9SRui Paulo static inline int wpa_drv_set_ap(struct wpa_supplicant *wpa_s,
317f05cddf9SRui Paulo 				 struct wpa_driver_ap_params *params)
318e28a4053SRui Paulo {
319f05cddf9SRui Paulo 	if (wpa_s->driver->set_ap)
320f05cddf9SRui Paulo 		return wpa_s->driver->set_ap(wpa_s->drv_priv, params);
321e28a4053SRui Paulo 	return -1;
322e28a4053SRui Paulo }
323e28a4053SRui Paulo 
324e28a4053SRui Paulo static inline int wpa_drv_sta_add(struct wpa_supplicant *wpa_s,
325e28a4053SRui Paulo 				  struct hostapd_sta_add_params *params)
326e28a4053SRui Paulo {
327e28a4053SRui Paulo 	if (wpa_s->driver->sta_add)
328e28a4053SRui Paulo 		return wpa_s->driver->sta_add(wpa_s->drv_priv, params);
329e28a4053SRui Paulo 	return -1;
330e28a4053SRui Paulo }
331e28a4053SRui Paulo 
332e28a4053SRui Paulo static inline int wpa_drv_sta_remove(struct wpa_supplicant *wpa_s,
333e28a4053SRui Paulo 				     const u8 *addr)
334e28a4053SRui Paulo {
335e28a4053SRui Paulo 	if (wpa_s->driver->sta_remove)
336e28a4053SRui Paulo 		return wpa_s->driver->sta_remove(wpa_s->drv_priv, addr);
337e28a4053SRui Paulo 	return -1;
338e28a4053SRui Paulo }
339e28a4053SRui Paulo 
340e28a4053SRui Paulo static inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s,
341e28a4053SRui Paulo 					  const u8 *addr, const u8 *data,
342e28a4053SRui Paulo 					  size_t data_len, int encrypt,
343f05cddf9SRui Paulo 					  const u8 *own_addr, u32 flags)
344e28a4053SRui Paulo {
345e28a4053SRui Paulo 	if (wpa_s->driver->hapd_send_eapol)
346e28a4053SRui Paulo 		return wpa_s->driver->hapd_send_eapol(wpa_s->drv_priv, addr,
347e28a4053SRui Paulo 						      data, data_len, encrypt,
348f05cddf9SRui Paulo 						      own_addr, flags);
349e28a4053SRui Paulo 	return -1;
350e28a4053SRui Paulo }
351e28a4053SRui Paulo 
352e28a4053SRui Paulo static inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
353e28a4053SRui Paulo 					const u8 *addr, int total_flags,
354e28a4053SRui Paulo 					int flags_or, int flags_and)
355e28a4053SRui Paulo {
356e28a4053SRui Paulo 	if (wpa_s->driver->sta_set_flags)
357e28a4053SRui Paulo 		return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
358e28a4053SRui Paulo 						    total_flags, flags_or,
359e28a4053SRui Paulo 						    flags_and);
360e28a4053SRui Paulo 	return -1;
361e28a4053SRui Paulo }
362e28a4053SRui Paulo 
363e28a4053SRui Paulo static inline int wpa_drv_set_supp_port(struct wpa_supplicant *wpa_s,
364e28a4053SRui Paulo 					int authorized)
365e28a4053SRui Paulo {
366e28a4053SRui Paulo 	if (wpa_s->driver->set_supp_port) {
367e28a4053SRui Paulo 		return wpa_s->driver->set_supp_port(wpa_s->drv_priv,
368e28a4053SRui Paulo 						    authorized);
369e28a4053SRui Paulo 	}
370e28a4053SRui Paulo 	return 0;
371e28a4053SRui Paulo }
372e28a4053SRui Paulo 
373e28a4053SRui Paulo static inline int wpa_drv_send_action(struct wpa_supplicant *wpa_s,
374e28a4053SRui Paulo 				      unsigned int freq,
375f05cddf9SRui Paulo 				      unsigned int wait,
376e28a4053SRui Paulo 				      const u8 *dst, const u8 *src,
377e28a4053SRui Paulo 				      const u8 *bssid,
378f05cddf9SRui Paulo 				      const u8 *data, size_t data_len,
379f05cddf9SRui Paulo 				      int no_cck)
380e28a4053SRui Paulo {
381e28a4053SRui Paulo 	if (wpa_s->driver->send_action)
382e28a4053SRui Paulo 		return wpa_s->driver->send_action(wpa_s->drv_priv, freq,
383f05cddf9SRui Paulo 						  wait, dst, src, bssid,
384f05cddf9SRui Paulo 						  data, data_len, no_cck);
385f05cddf9SRui Paulo 	return -1;
386f05cddf9SRui Paulo }
387f05cddf9SRui Paulo 
388f05cddf9SRui Paulo static inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
389f05cddf9SRui Paulo {
390f05cddf9SRui Paulo 	if (wpa_s->driver->send_action_cancel_wait)
391f05cddf9SRui Paulo 		wpa_s->driver->send_action_cancel_wait(wpa_s->drv_priv);
392f05cddf9SRui Paulo }
393f05cddf9SRui Paulo 
394f05cddf9SRui Paulo static inline int wpa_drv_set_freq(struct wpa_supplicant *wpa_s,
395f05cddf9SRui Paulo 				   struct hostapd_freq_params *freq)
396f05cddf9SRui Paulo {
397f05cddf9SRui Paulo 	if (wpa_s->driver->set_freq)
398f05cddf9SRui Paulo 		return wpa_s->driver->set_freq(wpa_s->drv_priv, freq);
399e28a4053SRui Paulo 	return -1;
400e28a4053SRui Paulo }
401e28a4053SRui Paulo 
402e28a4053SRui Paulo static inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s,
403e28a4053SRui Paulo 				 enum wpa_driver_if_type type,
404e28a4053SRui Paulo 				 const char *ifname, const u8 *addr,
405e28a4053SRui Paulo 				 void *bss_ctx, char *force_ifname,
406f05cddf9SRui Paulo 				 u8 *if_addr, const char *bridge)
407e28a4053SRui Paulo {
408e28a4053SRui Paulo 	if (wpa_s->driver->if_add)
409e28a4053SRui Paulo 		return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname,
410e28a4053SRui Paulo 					     addr, bss_ctx, NULL, force_ifname,
411*780fb4a2SCy Schubert 					     if_addr, bridge, 0, 0);
412e28a4053SRui Paulo 	return -1;
413e28a4053SRui Paulo }
414e28a4053SRui Paulo 
415e28a4053SRui Paulo static inline int wpa_drv_if_remove(struct wpa_supplicant *wpa_s,
416e28a4053SRui Paulo 				    enum wpa_driver_if_type type,
417e28a4053SRui Paulo 				    const char *ifname)
418e28a4053SRui Paulo {
419e28a4053SRui Paulo 	if (wpa_s->driver->if_remove)
420e28a4053SRui Paulo 		return wpa_s->driver->if_remove(wpa_s->drv_priv, type, ifname);
421e28a4053SRui Paulo 	return -1;
422e28a4053SRui Paulo }
423e28a4053SRui Paulo 
424e28a4053SRui Paulo static inline int wpa_drv_remain_on_channel(struct wpa_supplicant *wpa_s,
425e28a4053SRui Paulo 					    unsigned int freq,
426e28a4053SRui Paulo 					    unsigned int duration)
427e28a4053SRui Paulo {
428e28a4053SRui Paulo 	if (wpa_s->driver->remain_on_channel)
429e28a4053SRui Paulo 		return wpa_s->driver->remain_on_channel(wpa_s->drv_priv, freq,
430e28a4053SRui Paulo 							duration);
431e28a4053SRui Paulo 	return -1;
432e28a4053SRui Paulo }
433e28a4053SRui Paulo 
434e28a4053SRui Paulo static inline int wpa_drv_cancel_remain_on_channel(
435e28a4053SRui Paulo 	struct wpa_supplicant *wpa_s)
436e28a4053SRui Paulo {
437e28a4053SRui Paulo 	if (wpa_s->driver->cancel_remain_on_channel)
438e28a4053SRui Paulo 		return wpa_s->driver->cancel_remain_on_channel(
439e28a4053SRui Paulo 			wpa_s->drv_priv);
440e28a4053SRui Paulo 	return -1;
441e28a4053SRui Paulo }
442e28a4053SRui Paulo 
443e28a4053SRui Paulo static inline int wpa_drv_probe_req_report(struct wpa_supplicant *wpa_s,
444e28a4053SRui Paulo 					   int report)
445e28a4053SRui Paulo {
446e28a4053SRui Paulo 	if (wpa_s->driver->probe_req_report)
447e28a4053SRui Paulo 		return wpa_s->driver->probe_req_report(wpa_s->drv_priv,
448e28a4053SRui Paulo 						       report);
449e28a4053SRui Paulo 	return -1;
450e28a4053SRui Paulo }
451e28a4053SRui Paulo 
452e28a4053SRui Paulo static inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
453e28a4053SRui Paulo {
454e28a4053SRui Paulo 	if (wpa_s->driver->deinit_ap)
455e28a4053SRui Paulo 		return wpa_s->driver->deinit_ap(wpa_s->drv_priv);
456e28a4053SRui Paulo 	return 0;
457e28a4053SRui Paulo }
458e28a4053SRui Paulo 
459f05cddf9SRui Paulo static inline int wpa_drv_deinit_p2p_cli(struct wpa_supplicant *wpa_s)
460f05cddf9SRui Paulo {
461f05cddf9SRui Paulo 	if (wpa_s->driver->deinit_p2p_cli)
462f05cddf9SRui Paulo 		return wpa_s->driver->deinit_p2p_cli(wpa_s->drv_priv);
463f05cddf9SRui Paulo 	return 0;
464f05cddf9SRui Paulo }
465f05cddf9SRui Paulo 
466e28a4053SRui Paulo static inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
467e28a4053SRui Paulo {
468e28a4053SRui Paulo 	if (wpa_s->driver->suspend)
469e28a4053SRui Paulo 		wpa_s->driver->suspend(wpa_s->drv_priv);
470e28a4053SRui Paulo }
471e28a4053SRui Paulo 
472e28a4053SRui Paulo static inline void wpa_drv_resume(struct wpa_supplicant *wpa_s)
473e28a4053SRui Paulo {
474e28a4053SRui Paulo 	if (wpa_s->driver->resume)
475e28a4053SRui Paulo 		wpa_s->driver->resume(wpa_s->drv_priv);
476e28a4053SRui Paulo }
477e28a4053SRui Paulo 
478e28a4053SRui Paulo static inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s,
479e28a4053SRui Paulo 					 int threshold, int hysteresis)
480e28a4053SRui Paulo {
481e28a4053SRui Paulo 	if (wpa_s->driver->signal_monitor)
482e28a4053SRui Paulo 		return wpa_s->driver->signal_monitor(wpa_s->drv_priv,
483e28a4053SRui Paulo 						     threshold, hysteresis);
484e28a4053SRui Paulo 	return -1;
485e28a4053SRui Paulo }
486e28a4053SRui Paulo 
487f05cddf9SRui Paulo static inline int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
488f05cddf9SRui Paulo 				      struct wpa_signal_info *si)
489f05cddf9SRui Paulo {
490f05cddf9SRui Paulo 	if (wpa_s->driver->signal_poll)
491f05cddf9SRui Paulo 		return wpa_s->driver->signal_poll(wpa_s->drv_priv, si);
492f05cddf9SRui Paulo 	return -1;
493f05cddf9SRui Paulo }
494f05cddf9SRui Paulo 
495f05cddf9SRui Paulo static inline int wpa_drv_pktcnt_poll(struct wpa_supplicant *wpa_s,
496f05cddf9SRui Paulo 				      struct hostap_sta_driver_data *sta)
497f05cddf9SRui Paulo {
498f05cddf9SRui Paulo 	if (wpa_s->driver->read_sta_data)
499f05cddf9SRui Paulo 		return wpa_s->driver->read_sta_data(wpa_s->drv_priv, sta,
500f05cddf9SRui Paulo 						    wpa_s->bssid);
501f05cddf9SRui Paulo 	return -1;
502f05cddf9SRui Paulo }
503f05cddf9SRui Paulo 
504e28a4053SRui Paulo static inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
505e28a4053SRui Paulo 					const struct wpabuf *beacon,
506f05cddf9SRui Paulo 					const struct wpabuf *proberesp,
507f05cddf9SRui Paulo 					const struct wpabuf *assocresp)
508e28a4053SRui Paulo {
509e28a4053SRui Paulo 	if (!wpa_s->driver->set_ap_wps_ie)
510e28a4053SRui Paulo 		return -1;
511e28a4053SRui Paulo 	return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon,
512f05cddf9SRui Paulo 					    proberesp, assocresp);
513f05cddf9SRui Paulo }
514f05cddf9SRui Paulo 
515f05cddf9SRui Paulo static inline int wpa_drv_get_noa(struct wpa_supplicant *wpa_s,
516f05cddf9SRui Paulo 				  u8 *buf, size_t buf_len)
517f05cddf9SRui Paulo {
518f05cddf9SRui Paulo 	if (!wpa_s->driver->get_noa)
519f05cddf9SRui Paulo 		return -1;
520f05cddf9SRui Paulo 	return wpa_s->driver->get_noa(wpa_s->drv_priv, buf, buf_len);
521f05cddf9SRui Paulo }
522f05cddf9SRui Paulo 
523f05cddf9SRui Paulo static inline int wpa_drv_set_p2p_powersave(struct wpa_supplicant *wpa_s,
524f05cddf9SRui Paulo 					    int legacy_ps, int opp_ps,
525f05cddf9SRui Paulo 					    int ctwindow)
526f05cddf9SRui Paulo {
527f05cddf9SRui Paulo 	if (!wpa_s->driver->set_p2p_powersave)
528f05cddf9SRui Paulo 		return -1;
529f05cddf9SRui Paulo 	return wpa_s->driver->set_p2p_powersave(wpa_s->drv_priv, legacy_ps,
530f05cddf9SRui Paulo 						opp_ps, ctwindow);
531f05cddf9SRui Paulo }
532f05cddf9SRui Paulo 
533f05cddf9SRui Paulo static inline int wpa_drv_ampdu(struct wpa_supplicant *wpa_s, int ampdu)
534f05cddf9SRui Paulo {
535f05cddf9SRui Paulo 	if (!wpa_s->driver->ampdu)
536f05cddf9SRui Paulo 		return -1;
537f05cddf9SRui Paulo 	return wpa_s->driver->ampdu(wpa_s->drv_priv, ampdu);
538f05cddf9SRui Paulo }
539f05cddf9SRui Paulo 
540f05cddf9SRui Paulo static inline int wpa_drv_send_tdls_mgmt(struct wpa_supplicant *wpa_s,
541f05cddf9SRui Paulo 					 const u8 *dst, u8 action_code,
542f05cddf9SRui Paulo 					 u8 dialog_token, u16 status_code,
5435b9c547cSRui Paulo 					 u32 peer_capab, int initiator,
544f05cddf9SRui Paulo 					 const u8 *buf, size_t len)
545f05cddf9SRui Paulo {
546f05cddf9SRui Paulo 	if (wpa_s->driver->send_tdls_mgmt) {
547f05cddf9SRui Paulo 		return wpa_s->driver->send_tdls_mgmt(wpa_s->drv_priv, dst,
548f05cddf9SRui Paulo 						     action_code, dialog_token,
5495b9c547cSRui Paulo 						     status_code, peer_capab,
5505b9c547cSRui Paulo 						     initiator, buf, len);
551f05cddf9SRui Paulo 	}
552f05cddf9SRui Paulo 	return -1;
553f05cddf9SRui Paulo }
554f05cddf9SRui Paulo 
555f05cddf9SRui Paulo static inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
556f05cddf9SRui Paulo 				    enum tdls_oper oper, const u8 *peer)
557f05cddf9SRui Paulo {
558f05cddf9SRui Paulo 	if (!wpa_s->driver->tdls_oper)
559f05cddf9SRui Paulo 		return -1;
560f05cddf9SRui Paulo 	return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
561f05cddf9SRui Paulo }
562f05cddf9SRui Paulo 
5635b9c547cSRui Paulo #ifdef ANDROID
5645b9c547cSRui Paulo static inline int wpa_drv_driver_cmd(struct wpa_supplicant *wpa_s,
5655b9c547cSRui Paulo 				     char *cmd, char *buf, size_t buf_len)
5665b9c547cSRui Paulo {
5675b9c547cSRui Paulo 	if (!wpa_s->driver->driver_cmd)
5685b9c547cSRui Paulo 		return -1;
5695b9c547cSRui Paulo 	return wpa_s->driver->driver_cmd(wpa_s->drv_priv, cmd, buf, buf_len);
5705b9c547cSRui Paulo }
5715b9c547cSRui Paulo #endif /* ANDROID */
5725b9c547cSRui Paulo 
573f05cddf9SRui Paulo static inline void wpa_drv_set_rekey_info(struct wpa_supplicant *wpa_s,
5745b9c547cSRui Paulo 					  const u8 *kek, size_t kek_len,
5755b9c547cSRui Paulo 					  const u8 *kck, size_t kck_len,
576f05cddf9SRui Paulo 					  const u8 *replay_ctr)
577f05cddf9SRui Paulo {
578f05cddf9SRui Paulo 	if (!wpa_s->driver->set_rekey_info)
579f05cddf9SRui Paulo 		return;
5805b9c547cSRui Paulo 	wpa_s->driver->set_rekey_info(wpa_s->drv_priv, kek, kek_len,
5815b9c547cSRui Paulo 				      kck, kck_len, replay_ctr);
582f05cddf9SRui Paulo }
583f05cddf9SRui Paulo 
584f05cddf9SRui Paulo static inline int wpa_drv_radio_disable(struct wpa_supplicant *wpa_s,
585f05cddf9SRui Paulo 					int disabled)
586f05cddf9SRui Paulo {
587f05cddf9SRui Paulo 	if (!wpa_s->driver->radio_disable)
588f05cddf9SRui Paulo 		return -1;
589f05cddf9SRui Paulo 	return wpa_s->driver->radio_disable(wpa_s->drv_priv, disabled);
590f05cddf9SRui Paulo }
591f05cddf9SRui Paulo 
592f05cddf9SRui Paulo static inline int wpa_drv_switch_channel(struct wpa_supplicant *wpa_s,
5935b9c547cSRui Paulo 					 struct csa_settings *settings)
594f05cddf9SRui Paulo {
595f05cddf9SRui Paulo 	if (!wpa_s->driver->switch_channel)
596f05cddf9SRui Paulo 		return -1;
5975b9c547cSRui Paulo 	return wpa_s->driver->switch_channel(wpa_s->drv_priv, settings);
5985b9c547cSRui Paulo }
5995b9c547cSRui Paulo 
6005b9c547cSRui Paulo static inline int wpa_drv_add_ts(struct wpa_supplicant *wpa_s, u8 tsid,
6015b9c547cSRui Paulo 				 const u8 *address, u8 user_priority,
6025b9c547cSRui Paulo 				 u16 admitted_time)
6035b9c547cSRui Paulo {
6045b9c547cSRui Paulo 	if (!wpa_s->driver->add_tx_ts)
6055b9c547cSRui Paulo 		return -1;
6065b9c547cSRui Paulo 	return wpa_s->driver->add_tx_ts(wpa_s->drv_priv, tsid, address,
6075b9c547cSRui Paulo 					user_priority, admitted_time);
6085b9c547cSRui Paulo }
6095b9c547cSRui Paulo 
6105b9c547cSRui Paulo static inline int wpa_drv_del_ts(struct wpa_supplicant *wpa_s, u8 tid,
6115b9c547cSRui Paulo 				 const u8 *address)
6125b9c547cSRui Paulo {
6135b9c547cSRui Paulo 	if (!wpa_s->driver->del_tx_ts)
6145b9c547cSRui Paulo 		return -1;
6155b9c547cSRui Paulo 	return wpa_s->driver->del_tx_ts(wpa_s->drv_priv, tid, address);
6165b9c547cSRui Paulo }
6175b9c547cSRui Paulo 
6185b9c547cSRui Paulo static inline int wpa_drv_tdls_enable_channel_switch(
6195b9c547cSRui Paulo 	struct wpa_supplicant *wpa_s, const u8 *addr, u8 oper_class,
6205b9c547cSRui Paulo 	const struct hostapd_freq_params *freq_params)
6215b9c547cSRui Paulo {
6225b9c547cSRui Paulo 	if (!wpa_s->driver->tdls_enable_channel_switch)
6235b9c547cSRui Paulo 		return -1;
6245b9c547cSRui Paulo 	return wpa_s->driver->tdls_enable_channel_switch(wpa_s->drv_priv, addr,
6255b9c547cSRui Paulo 							 oper_class,
6265b9c547cSRui Paulo 							 freq_params);
6275b9c547cSRui Paulo }
6285b9c547cSRui Paulo 
6295b9c547cSRui Paulo static inline int
6305b9c547cSRui Paulo wpa_drv_tdls_disable_channel_switch(struct wpa_supplicant *wpa_s,
6315b9c547cSRui Paulo 				    const u8 *addr)
6325b9c547cSRui Paulo {
6335b9c547cSRui Paulo 	if (!wpa_s->driver->tdls_disable_channel_switch)
6345b9c547cSRui Paulo 		return -1;
6355b9c547cSRui Paulo 	return wpa_s->driver->tdls_disable_channel_switch(wpa_s->drv_priv,
6365b9c547cSRui Paulo 							  addr);
637f05cddf9SRui Paulo }
638f05cddf9SRui Paulo 
639f05cddf9SRui Paulo static inline int wpa_drv_wnm_oper(struct wpa_supplicant *wpa_s,
640f05cddf9SRui Paulo 				   enum wnm_oper oper, const u8 *peer,
641f05cddf9SRui Paulo 				   u8 *buf, u16 *buf_len)
642f05cddf9SRui Paulo {
643f05cddf9SRui Paulo 	if (!wpa_s->driver->wnm_oper)
644f05cddf9SRui Paulo 		return -1;
645f05cddf9SRui Paulo 	return wpa_s->driver->wnm_oper(wpa_s->drv_priv, oper, peer, buf,
646f05cddf9SRui Paulo 				       buf_len);
647e28a4053SRui Paulo }
648e28a4053SRui Paulo 
6495b9c547cSRui Paulo static inline int wpa_drv_status(struct wpa_supplicant *wpa_s,
6505b9c547cSRui Paulo 				 char *buf, size_t buflen)
6515b9c547cSRui Paulo {
6525b9c547cSRui Paulo 	if (!wpa_s->driver->status)
6535b9c547cSRui Paulo 		return -1;
6545b9c547cSRui Paulo 	return wpa_s->driver->status(wpa_s->drv_priv, buf, buflen);
6555b9c547cSRui Paulo }
6565b9c547cSRui Paulo 
6575b9c547cSRui Paulo static inline int wpa_drv_set_qos_map(struct wpa_supplicant *wpa_s,
6585b9c547cSRui Paulo 				      const u8 *qos_map_set, u8 qos_map_set_len)
6595b9c547cSRui Paulo {
6605b9c547cSRui Paulo 	if (!wpa_s->driver->set_qos_map)
6615b9c547cSRui Paulo 		return -1;
6625b9c547cSRui Paulo 	return wpa_s->driver->set_qos_map(wpa_s->drv_priv, qos_map_set,
6635b9c547cSRui Paulo 					  qos_map_set_len);
6645b9c547cSRui Paulo }
6655b9c547cSRui Paulo 
6665b9c547cSRui Paulo static inline int wpa_drv_wowlan(struct wpa_supplicant *wpa_s,
6675b9c547cSRui Paulo 				 const struct wowlan_triggers *triggers)
6685b9c547cSRui Paulo {
6695b9c547cSRui Paulo 	if (!wpa_s->driver->set_wowlan)
6705b9c547cSRui Paulo 		return -1;
6715b9c547cSRui Paulo 	return wpa_s->driver->set_wowlan(wpa_s->drv_priv, triggers);
6725b9c547cSRui Paulo }
6735b9c547cSRui Paulo 
6745b9c547cSRui Paulo static inline int wpa_drv_vendor_cmd(struct wpa_supplicant *wpa_s,
6755b9c547cSRui Paulo 				     int vendor_id, int subcmd, const u8 *data,
6765b9c547cSRui Paulo 				     size_t data_len, struct wpabuf *buf)
6775b9c547cSRui Paulo {
6785b9c547cSRui Paulo 	if (!wpa_s->driver->vendor_cmd)
6795b9c547cSRui Paulo 		return -1;
6805b9c547cSRui Paulo 	return wpa_s->driver->vendor_cmd(wpa_s->drv_priv, vendor_id, subcmd,
6815b9c547cSRui Paulo 					 data, data_len, buf);
6825b9c547cSRui Paulo }
6835b9c547cSRui Paulo 
6845b9c547cSRui Paulo static inline int wpa_drv_roaming(struct wpa_supplicant *wpa_s, int allowed,
6855b9c547cSRui Paulo 				  const u8 *bssid)
6865b9c547cSRui Paulo {
6875b9c547cSRui Paulo 	if (!wpa_s->driver->roaming)
6885b9c547cSRui Paulo 		return -1;
6895b9c547cSRui Paulo 	return wpa_s->driver->roaming(wpa_s->drv_priv, allowed, bssid);
6905b9c547cSRui Paulo }
6915b9c547cSRui Paulo 
6925b9c547cSRui Paulo static inline int wpa_drv_set_mac_addr(struct wpa_supplicant *wpa_s,
6935b9c547cSRui Paulo 				       const u8 *addr)
6945b9c547cSRui Paulo {
6955b9c547cSRui Paulo 	if (!wpa_s->driver->set_mac_addr)
6965b9c547cSRui Paulo 		return -1;
6975b9c547cSRui Paulo 	return wpa_s->driver->set_mac_addr(wpa_s->drv_priv, addr);
6985b9c547cSRui Paulo }
6995b9c547cSRui Paulo 
7005b9c547cSRui Paulo 
7015b9c547cSRui Paulo #ifdef CONFIG_MACSEC
7025b9c547cSRui Paulo 
7035b9c547cSRui Paulo static inline int wpa_drv_macsec_init(struct wpa_supplicant *wpa_s,
7045b9c547cSRui Paulo 				      struct macsec_init_params *params)
7055b9c547cSRui Paulo {
7065b9c547cSRui Paulo 	if (!wpa_s->driver->macsec_init)
7075b9c547cSRui Paulo 		return -1;
7085b9c547cSRui Paulo 	return wpa_s->driver->macsec_init(wpa_s->drv_priv, params);
7095b9c547cSRui Paulo }
7105b9c547cSRui Paulo 
7115b9c547cSRui Paulo static inline int wpa_drv_macsec_deinit(struct wpa_supplicant *wpa_s)
7125b9c547cSRui Paulo {
7135b9c547cSRui Paulo 	if (!wpa_s->driver->macsec_deinit)
7145b9c547cSRui Paulo 		return -1;
7155b9c547cSRui Paulo 	return wpa_s->driver->macsec_deinit(wpa_s->drv_priv);
7165b9c547cSRui Paulo }
7175b9c547cSRui Paulo 
7185b9c547cSRui Paulo static inline int wpa_drv_enable_protect_frames(struct wpa_supplicant *wpa_s,
7195b9c547cSRui Paulo 						Boolean enabled)
7205b9c547cSRui Paulo {
7215b9c547cSRui Paulo 	if (!wpa_s->driver->enable_protect_frames)
7225b9c547cSRui Paulo 		return -1;
7235b9c547cSRui Paulo 	return wpa_s->driver->enable_protect_frames(wpa_s->drv_priv, enabled);
7245b9c547cSRui Paulo }
7255b9c547cSRui Paulo 
7265b9c547cSRui Paulo static inline int wpa_drv_set_replay_protect(struct wpa_supplicant *wpa_s,
7275b9c547cSRui Paulo 					     Boolean enabled, u32 window)
7285b9c547cSRui Paulo {
7295b9c547cSRui Paulo 	if (!wpa_s->driver->set_replay_protect)
7305b9c547cSRui Paulo 		return -1;
7315b9c547cSRui Paulo 	return wpa_s->driver->set_replay_protect(wpa_s->drv_priv, enabled,
7325b9c547cSRui Paulo 						 window);
7335b9c547cSRui Paulo }
7345b9c547cSRui Paulo 
7355b9c547cSRui Paulo static inline int wpa_drv_set_current_cipher_suite(struct wpa_supplicant *wpa_s,
736*780fb4a2SCy Schubert 						   u64 cs)
7375b9c547cSRui Paulo {
7385b9c547cSRui Paulo 	if (!wpa_s->driver->set_current_cipher_suite)
7395b9c547cSRui Paulo 		return -1;
740*780fb4a2SCy Schubert 	return wpa_s->driver->set_current_cipher_suite(wpa_s->drv_priv, cs);
7415b9c547cSRui Paulo }
7425b9c547cSRui Paulo 
7435b9c547cSRui Paulo static inline int wpa_drv_enable_controlled_port(struct wpa_supplicant *wpa_s,
7445b9c547cSRui Paulo 						 Boolean enabled)
7455b9c547cSRui Paulo {
7465b9c547cSRui Paulo 	if (!wpa_s->driver->enable_controlled_port)
7475b9c547cSRui Paulo 		return -1;
7485b9c547cSRui Paulo 	return wpa_s->driver->enable_controlled_port(wpa_s->drv_priv, enabled);
7495b9c547cSRui Paulo }
7505b9c547cSRui Paulo 
7515b9c547cSRui Paulo static inline int wpa_drv_get_receive_lowest_pn(struct wpa_supplicant *wpa_s,
7525b9c547cSRui Paulo 						u32 channel, u8 an,
7535b9c547cSRui Paulo 						u32 *lowest_pn)
7545b9c547cSRui Paulo {
7555b9c547cSRui Paulo 	if (!wpa_s->driver->get_receive_lowest_pn)
7565b9c547cSRui Paulo 		return -1;
7575b9c547cSRui Paulo 	return wpa_s->driver->get_receive_lowest_pn(wpa_s->drv_priv, channel,
7585b9c547cSRui Paulo 						    an, lowest_pn);
7595b9c547cSRui Paulo }
7605b9c547cSRui Paulo 
7615b9c547cSRui Paulo static inline int wpa_drv_get_transmit_next_pn(struct wpa_supplicant *wpa_s,
7625b9c547cSRui Paulo 						u32 channel, u8 an,
7635b9c547cSRui Paulo 						u32 *next_pn)
7645b9c547cSRui Paulo {
7655b9c547cSRui Paulo 	if (!wpa_s->driver->get_transmit_next_pn)
7665b9c547cSRui Paulo 		return -1;
7675b9c547cSRui Paulo 	return wpa_s->driver->get_transmit_next_pn(wpa_s->drv_priv, channel,
7685b9c547cSRui Paulo 						    an, next_pn);
7695b9c547cSRui Paulo }
7705b9c547cSRui Paulo 
7715b9c547cSRui Paulo static inline int wpa_drv_set_transmit_next_pn(struct wpa_supplicant *wpa_s,
7725b9c547cSRui Paulo 						u32 channel, u8 an,
7735b9c547cSRui Paulo 						u32 next_pn)
7745b9c547cSRui Paulo {
7755b9c547cSRui Paulo 	if (!wpa_s->driver->set_transmit_next_pn)
7765b9c547cSRui Paulo 		return -1;
7775b9c547cSRui Paulo 	return wpa_s->driver->set_transmit_next_pn(wpa_s->drv_priv, channel,
7785b9c547cSRui Paulo 						    an, next_pn);
7795b9c547cSRui Paulo }
7805b9c547cSRui Paulo 
7815b9c547cSRui Paulo static inline int wpa_drv_get_available_receive_sc(struct wpa_supplicant *wpa_s,
7825b9c547cSRui Paulo 						   u32 *channel)
7835b9c547cSRui Paulo {
7845b9c547cSRui Paulo 	if (!wpa_s->driver->get_available_receive_sc)
7855b9c547cSRui Paulo 		return -1;
7865b9c547cSRui Paulo 	return wpa_s->driver->get_available_receive_sc(wpa_s->drv_priv,
7875b9c547cSRui Paulo 						       channel);
7885b9c547cSRui Paulo }
7895b9c547cSRui Paulo 
7905b9c547cSRui Paulo static inline int
7915b9c547cSRui Paulo wpa_drv_create_receive_sc(struct wpa_supplicant *wpa_s, u32 channel,
7925b9c547cSRui Paulo 			  const u8 *sci_addr, u16 sci_port,
7935b9c547cSRui Paulo 			  unsigned int conf_offset, int validation)
7945b9c547cSRui Paulo {
7955b9c547cSRui Paulo 	if (!wpa_s->driver->create_receive_sc)
7965b9c547cSRui Paulo 		return -1;
7975b9c547cSRui Paulo 	return wpa_s->driver->create_receive_sc(wpa_s->drv_priv, channel,
7985b9c547cSRui Paulo 						sci_addr, sci_port, conf_offset,
7995b9c547cSRui Paulo 						validation);
8005b9c547cSRui Paulo }
8015b9c547cSRui Paulo 
8025b9c547cSRui Paulo static inline int wpa_drv_delete_receive_sc(struct wpa_supplicant *wpa_s,
8035b9c547cSRui Paulo 					    u32 channel)
8045b9c547cSRui Paulo {
8055b9c547cSRui Paulo 	if (!wpa_s->driver->delete_receive_sc)
8065b9c547cSRui Paulo 		return -1;
8075b9c547cSRui Paulo 	return wpa_s->driver->delete_receive_sc(wpa_s->drv_priv, channel);
8085b9c547cSRui Paulo }
8095b9c547cSRui Paulo 
8105b9c547cSRui Paulo static inline int wpa_drv_create_receive_sa(struct wpa_supplicant *wpa_s,
8115b9c547cSRui Paulo 					    u32 channel, u8 an,
8125b9c547cSRui Paulo 					    u32 lowest_pn, const u8 *sak)
8135b9c547cSRui Paulo {
8145b9c547cSRui Paulo 	if (!wpa_s->driver->create_receive_sa)
8155b9c547cSRui Paulo 		return -1;
8165b9c547cSRui Paulo 	return wpa_s->driver->create_receive_sa(wpa_s->drv_priv, channel, an,
8175b9c547cSRui Paulo 						lowest_pn, sak);
8185b9c547cSRui Paulo }
8195b9c547cSRui Paulo 
8205b9c547cSRui Paulo static inline int wpa_drv_enable_receive_sa(struct wpa_supplicant *wpa_s,
8215b9c547cSRui Paulo 					    u32 channel, u8 an)
8225b9c547cSRui Paulo {
8235b9c547cSRui Paulo 	if (!wpa_s->driver->enable_receive_sa)
8245b9c547cSRui Paulo 		return -1;
8255b9c547cSRui Paulo 	return wpa_s->driver->enable_receive_sa(wpa_s->drv_priv, channel, an);
8265b9c547cSRui Paulo }
8275b9c547cSRui Paulo 
8285b9c547cSRui Paulo static inline int wpa_drv_disable_receive_sa(struct wpa_supplicant *wpa_s,
8295b9c547cSRui Paulo 					     u32 channel, u8 an)
8305b9c547cSRui Paulo {
8315b9c547cSRui Paulo 	if (!wpa_s->driver->disable_receive_sa)
8325b9c547cSRui Paulo 		return -1;
8335b9c547cSRui Paulo 	return wpa_s->driver->disable_receive_sa(wpa_s->drv_priv, channel, an);
8345b9c547cSRui Paulo }
8355b9c547cSRui Paulo 
8365b9c547cSRui Paulo static inline int
8375b9c547cSRui Paulo wpa_drv_get_available_transmit_sc(struct wpa_supplicant *wpa_s, u32 *channel)
8385b9c547cSRui Paulo {
8395b9c547cSRui Paulo 	if (!wpa_s->driver->get_available_transmit_sc)
8405b9c547cSRui Paulo 		return -1;
8415b9c547cSRui Paulo 	return wpa_s->driver->get_available_transmit_sc(wpa_s->drv_priv,
8425b9c547cSRui Paulo 							channel);
8435b9c547cSRui Paulo }
8445b9c547cSRui Paulo 
8455b9c547cSRui Paulo static inline int
8465b9c547cSRui Paulo wpa_drv_create_transmit_sc(struct wpa_supplicant *wpa_s, u32 channel,
8475b9c547cSRui Paulo 			   const u8 *sci_addr, u16 sci_port,
8485b9c547cSRui Paulo 			   unsigned int conf_offset)
8495b9c547cSRui Paulo {
8505b9c547cSRui Paulo 	if (!wpa_s->driver->create_transmit_sc)
8515b9c547cSRui Paulo 		return -1;
8525b9c547cSRui Paulo 	return wpa_s->driver->create_transmit_sc(wpa_s->drv_priv, channel,
8535b9c547cSRui Paulo 						 sci_addr, sci_port,
8545b9c547cSRui Paulo 						 conf_offset);
8555b9c547cSRui Paulo }
8565b9c547cSRui Paulo 
8575b9c547cSRui Paulo static inline int wpa_drv_delete_transmit_sc(struct wpa_supplicant *wpa_s,
8585b9c547cSRui Paulo 					     u32 channel)
8595b9c547cSRui Paulo {
8605b9c547cSRui Paulo 	if (!wpa_s->driver->delete_transmit_sc)
8615b9c547cSRui Paulo 		return -1;
8625b9c547cSRui Paulo 	return wpa_s->driver->delete_transmit_sc(wpa_s->drv_priv, channel);
8635b9c547cSRui Paulo }
8645b9c547cSRui Paulo 
8655b9c547cSRui Paulo static inline int wpa_drv_create_transmit_sa(struct wpa_supplicant *wpa_s,
8665b9c547cSRui Paulo 					     u32 channel, u8 an,
8675b9c547cSRui Paulo 					     u32 next_pn,
8685b9c547cSRui Paulo 					     Boolean confidentiality,
8695b9c547cSRui Paulo 					     const u8 *sak)
8705b9c547cSRui Paulo {
8715b9c547cSRui Paulo 	if (!wpa_s->driver->create_transmit_sa)
8725b9c547cSRui Paulo 		return -1;
8735b9c547cSRui Paulo 	return wpa_s->driver->create_transmit_sa(wpa_s->drv_priv, channel, an,
8745b9c547cSRui Paulo 						 next_pn, confidentiality, sak);
8755b9c547cSRui Paulo }
8765b9c547cSRui Paulo 
8775b9c547cSRui Paulo static inline int wpa_drv_enable_transmit_sa(struct wpa_supplicant *wpa_s,
8785b9c547cSRui Paulo 					     u32 channel, u8 an)
8795b9c547cSRui Paulo {
8805b9c547cSRui Paulo 	if (!wpa_s->driver->enable_transmit_sa)
8815b9c547cSRui Paulo 		return -1;
8825b9c547cSRui Paulo 	return wpa_s->driver->enable_transmit_sa(wpa_s->drv_priv, channel, an);
8835b9c547cSRui Paulo }
8845b9c547cSRui Paulo 
8855b9c547cSRui Paulo static inline int wpa_drv_disable_transmit_sa(struct wpa_supplicant *wpa_s,
8865b9c547cSRui Paulo 					      u32 channel, u8 an)
8875b9c547cSRui Paulo {
8885b9c547cSRui Paulo 	if (!wpa_s->driver->disable_transmit_sa)
8895b9c547cSRui Paulo 		return -1;
8905b9c547cSRui Paulo 	return wpa_s->driver->disable_transmit_sa(wpa_s->drv_priv, channel, an);
8915b9c547cSRui Paulo }
8925b9c547cSRui Paulo #endif /* CONFIG_MACSEC */
8935b9c547cSRui Paulo 
894325151a3SRui Paulo static inline int wpa_drv_setband(struct wpa_supplicant *wpa_s,
895325151a3SRui Paulo 				  enum set_band band)
896325151a3SRui Paulo {
897325151a3SRui Paulo 	if (!wpa_s->driver->set_band)
898325151a3SRui Paulo 		return -1;
899325151a3SRui Paulo 	return wpa_s->driver->set_band(wpa_s->drv_priv, band);
900325151a3SRui Paulo }
901325151a3SRui Paulo 
902325151a3SRui Paulo static inline int wpa_drv_get_pref_freq_list(struct wpa_supplicant *wpa_s,
903325151a3SRui Paulo 					     enum wpa_driver_if_type if_type,
904325151a3SRui Paulo 					     unsigned int *num,
905325151a3SRui Paulo 					     unsigned int *freq_list)
906325151a3SRui Paulo {
907325151a3SRui Paulo 	if (!wpa_s->driver->get_pref_freq_list)
908325151a3SRui Paulo 		return -1;
909325151a3SRui Paulo 	return wpa_s->driver->get_pref_freq_list(wpa_s->drv_priv, if_type,
910325151a3SRui Paulo 						 num, freq_list);
911325151a3SRui Paulo }
912325151a3SRui Paulo 
913325151a3SRui Paulo static inline int wpa_drv_set_prob_oper_freq(struct wpa_supplicant *wpa_s,
914325151a3SRui Paulo 					     unsigned int freq)
915325151a3SRui Paulo {
916325151a3SRui Paulo 	if (!wpa_s->driver->set_prob_oper_freq)
917325151a3SRui Paulo 		return 0;
918325151a3SRui Paulo 	return wpa_s->driver->set_prob_oper_freq(wpa_s->drv_priv, freq);
919325151a3SRui Paulo }
920325151a3SRui Paulo 
921*780fb4a2SCy Schubert static inline int wpa_drv_abort_scan(struct wpa_supplicant *wpa_s)
922*780fb4a2SCy Schubert {
923*780fb4a2SCy Schubert 	if (!wpa_s->driver->abort_scan)
924*780fb4a2SCy Schubert 		return -1;
925*780fb4a2SCy Schubert 	return wpa_s->driver->abort_scan(wpa_s->drv_priv);
926*780fb4a2SCy Schubert }
927*780fb4a2SCy Schubert 
928*780fb4a2SCy Schubert static inline int wpa_drv_configure_frame_filters(struct wpa_supplicant *wpa_s,
929*780fb4a2SCy Schubert 						  u32 filters)
930*780fb4a2SCy Schubert {
931*780fb4a2SCy Schubert 	if (!wpa_s->driver->configure_data_frame_filters)
932*780fb4a2SCy Schubert 		return -1;
933*780fb4a2SCy Schubert 	return wpa_s->driver->configure_data_frame_filters(wpa_s->drv_priv,
934*780fb4a2SCy Schubert 							   filters);
935*780fb4a2SCy Schubert }
936*780fb4a2SCy Schubert 
937*780fb4a2SCy Schubert static inline int wpa_drv_get_ext_capa(struct wpa_supplicant *wpa_s,
938*780fb4a2SCy Schubert 				       enum wpa_driver_if_type type)
939*780fb4a2SCy Schubert {
940*780fb4a2SCy Schubert 	if (!wpa_s->driver->get_ext_capab)
941*780fb4a2SCy Schubert 		return -1;
942*780fb4a2SCy Schubert 	return wpa_s->driver->get_ext_capab(wpa_s->drv_priv, type,
943*780fb4a2SCy Schubert 					    &wpa_s->extended_capa,
944*780fb4a2SCy Schubert 					    &wpa_s->extended_capa_mask,
945*780fb4a2SCy Schubert 					    &wpa_s->extended_capa_len);
946*780fb4a2SCy Schubert }
947*780fb4a2SCy Schubert 
948*780fb4a2SCy Schubert static inline int wpa_drv_p2p_lo_start(struct wpa_supplicant *wpa_s,
949*780fb4a2SCy Schubert 				       unsigned int channel,
950*780fb4a2SCy Schubert 				       unsigned int period,
951*780fb4a2SCy Schubert 				       unsigned int interval,
952*780fb4a2SCy Schubert 				       unsigned int count,
953*780fb4a2SCy Schubert 				       const u8 *device_types,
954*780fb4a2SCy Schubert 				       size_t dev_types_len,
955*780fb4a2SCy Schubert 				       const u8 *ies, size_t ies_len)
956*780fb4a2SCy Schubert {
957*780fb4a2SCy Schubert 	if (!wpa_s->driver->p2p_lo_start)
958*780fb4a2SCy Schubert 		return -1;
959*780fb4a2SCy Schubert 	return wpa_s->driver->p2p_lo_start(wpa_s->drv_priv, channel, period,
960*780fb4a2SCy Schubert 					   interval, count, device_types,
961*780fb4a2SCy Schubert 					   dev_types_len, ies, ies_len);
962*780fb4a2SCy Schubert }
963*780fb4a2SCy Schubert 
964*780fb4a2SCy Schubert static inline int wpa_drv_p2p_lo_stop(struct wpa_supplicant *wpa_s)
965*780fb4a2SCy Schubert {
966*780fb4a2SCy Schubert 	if (!wpa_s->driver->p2p_lo_stop)
967*780fb4a2SCy Schubert 		return -1;
968*780fb4a2SCy Schubert 	return wpa_s->driver->p2p_lo_stop(wpa_s->drv_priv);
969*780fb4a2SCy Schubert }
970*780fb4a2SCy Schubert 
971*780fb4a2SCy Schubert static inline int wpa_drv_set_default_scan_ies(struct wpa_supplicant *wpa_s,
972*780fb4a2SCy Schubert 					       const u8 *ies, size_t len)
973*780fb4a2SCy Schubert {
974*780fb4a2SCy Schubert 	if (!wpa_s->driver->set_default_scan_ies)
975*780fb4a2SCy Schubert 		return -1;
976*780fb4a2SCy Schubert 	return wpa_s->driver->set_default_scan_ies(wpa_s->drv_priv, ies, len);
977*780fb4a2SCy Schubert }
978*780fb4a2SCy Schubert 
979e28a4053SRui Paulo #endif /* DRIVER_I_H */
980