xref: /freebsd/contrib/wpa/wpa_supplicant/driver_i.h (revision c1d255d3ffdbe447de3ab875bf4e7d7accc5bfc5)
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 
90206b73d0SCy Schubert static inline int wpa_drv_mesh_link_probe(struct wpa_supplicant *wpa_s,
91206b73d0SCy Schubert 					  const u8 *addr,
92206b73d0SCy Schubert 					  const u8 *eth, size_t len)
93206b73d0SCy Schubert {
94206b73d0SCy Schubert 	if (wpa_s->driver->probe_mesh_link)
95206b73d0SCy Schubert 		return wpa_s->driver->probe_mesh_link(wpa_s->drv_priv, addr,
96206b73d0SCy Schubert 						      eth, len);
97206b73d0SCy Schubert 	return -1;
98206b73d0SCy Schubert }
99206b73d0SCy Schubert 
100e28a4053SRui Paulo static inline int wpa_drv_scan(struct wpa_supplicant *wpa_s,
101e28a4053SRui Paulo 			       struct wpa_driver_scan_params *params)
102e28a4053SRui Paulo {
1035b9c547cSRui Paulo #ifdef CONFIG_TESTING_OPTIONS
1045b9c547cSRui Paulo 	if (wpa_s->test_failure == WPAS_TEST_FAILURE_SCAN_TRIGGER)
1055b9c547cSRui Paulo 		return -EBUSY;
1065b9c547cSRui Paulo #endif /* CONFIG_TESTING_OPTIONS */
107e28a4053SRui Paulo 	if (wpa_s->driver->scan2)
108e28a4053SRui Paulo 		return wpa_s->driver->scan2(wpa_s->drv_priv, params);
109e28a4053SRui Paulo 	return -1;
110e28a4053SRui Paulo }
111e28a4053SRui Paulo 
112f05cddf9SRui Paulo static inline int wpa_drv_sched_scan(struct wpa_supplicant *wpa_s,
113780fb4a2SCy Schubert 				     struct wpa_driver_scan_params *params)
114f05cddf9SRui Paulo {
115f05cddf9SRui Paulo 	if (wpa_s->driver->sched_scan)
116780fb4a2SCy Schubert 		return wpa_s->driver->sched_scan(wpa_s->drv_priv, params);
117f05cddf9SRui Paulo 	return -1;
118f05cddf9SRui Paulo }
119f05cddf9SRui Paulo 
120f05cddf9SRui Paulo static inline int wpa_drv_stop_sched_scan(struct wpa_supplicant *wpa_s)
121f05cddf9SRui Paulo {
122f05cddf9SRui Paulo 	if (wpa_s->driver->stop_sched_scan)
123f05cddf9SRui Paulo 		return wpa_s->driver->stop_sched_scan(wpa_s->drv_priv);
124f05cddf9SRui Paulo 	return -1;
125f05cddf9SRui Paulo }
126f05cddf9SRui Paulo 
127*c1d255d3SCy Schubert struct wpa_scan_results *
128*c1d255d3SCy Schubert wpa_drv_get_scan_results2(struct wpa_supplicant *wpa_s);
129e28a4053SRui Paulo 
130e28a4053SRui Paulo static inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid)
131e28a4053SRui Paulo {
132e28a4053SRui Paulo 	if (wpa_s->driver->get_bssid) {
133e28a4053SRui Paulo 		return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid);
134e28a4053SRui Paulo 	}
135e28a4053SRui Paulo 	return -1;
136e28a4053SRui Paulo }
137e28a4053SRui Paulo 
138e28a4053SRui Paulo static inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid)
139e28a4053SRui Paulo {
140e28a4053SRui Paulo 	if (wpa_s->driver->get_ssid) {
141e28a4053SRui Paulo 		return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid);
142e28a4053SRui Paulo 	}
143e28a4053SRui Paulo 	return -1;
144e28a4053SRui Paulo }
145e28a4053SRui Paulo 
146e28a4053SRui Paulo static inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s,
147e28a4053SRui Paulo 				  enum wpa_alg alg, const u8 *addr,
148e28a4053SRui Paulo 				  int key_idx, int set_tx,
149e28a4053SRui Paulo 				  const u8 *seq, size_t seq_len,
150*c1d255d3SCy Schubert 				  const u8 *key, size_t key_len,
151*c1d255d3SCy Schubert 				  enum key_flag key_flag)
152e28a4053SRui Paulo {
153*c1d255d3SCy Schubert 	struct wpa_driver_set_key_params params;
154*c1d255d3SCy Schubert 
155*c1d255d3SCy Schubert 	os_memset(&params, 0, sizeof(params));
156*c1d255d3SCy Schubert 	params.ifname = wpa_s->ifname;
157*c1d255d3SCy Schubert 	params.alg = alg;
158*c1d255d3SCy Schubert 	params.addr = addr;
159*c1d255d3SCy Schubert 	params.key_idx = key_idx;
160*c1d255d3SCy Schubert 	params.set_tx = set_tx;
161*c1d255d3SCy Schubert 	params.seq = seq;
162*c1d255d3SCy Schubert 	params.seq_len = seq_len;
163*c1d255d3SCy Schubert 	params.key = key;
164*c1d255d3SCy Schubert 	params.key_len = key_len;
165*c1d255d3SCy Schubert 	params.key_flag = key_flag;
166*c1d255d3SCy Schubert 
1675b9c547cSRui Paulo 	if (alg != WPA_ALG_NONE) {
168*c1d255d3SCy Schubert 		/* keyidx = 1 can be either a broadcast or--with
169*c1d255d3SCy Schubert 		 * Extended Key ID--a unicast key. Use bit 15 for
170*c1d255d3SCy Schubert 		 * the pairwise keyidx 1 which is hopefully high enough
171*c1d255d3SCy Schubert 		 * to not clash with future extensions.
172*c1d255d3SCy Schubert 		 */
173*c1d255d3SCy Schubert 		if (key_idx == 1 && (key_flag & KEY_FLAG_PAIRWISE))
174*c1d255d3SCy Schubert 			wpa_s->keys_cleared &= ~BIT(15);
175*c1d255d3SCy Schubert 		else if (key_idx >= 0 && key_idx <= 5)
1765b9c547cSRui Paulo 			wpa_s->keys_cleared &= ~BIT(key_idx);
1775b9c547cSRui Paulo 		else
178e28a4053SRui Paulo 			wpa_s->keys_cleared = 0;
1795b9c547cSRui Paulo 	}
1805b9c547cSRui Paulo 	if (wpa_s->driver->set_key) {
181*c1d255d3SCy Schubert 		return wpa_s->driver->set_key(wpa_s->drv_priv, &params);
182e28a4053SRui Paulo 	}
183e28a4053SRui Paulo 	return -1;
184e28a4053SRui Paulo }
185e28a4053SRui Paulo 
186780fb4a2SCy Schubert static inline int wpa_drv_get_seqnum(struct wpa_supplicant *wpa_s,
187780fb4a2SCy Schubert 				     const u8 *addr, int idx, u8 *seq)
188780fb4a2SCy Schubert {
189780fb4a2SCy Schubert 	if (wpa_s->driver->get_seqnum)
190780fb4a2SCy Schubert 		return wpa_s->driver->get_seqnum(wpa_s->ifname, wpa_s->drv_priv,
191780fb4a2SCy Schubert 						 addr, idx, seq);
192780fb4a2SCy Schubert 	return -1;
193780fb4a2SCy Schubert }
194780fb4a2SCy Schubert 
1955b9c547cSRui Paulo static inline int wpa_drv_sta_deauth(struct wpa_supplicant *wpa_s,
196206b73d0SCy Schubert 				     const u8 *addr, u16 reason_code)
1975b9c547cSRui Paulo {
1985b9c547cSRui Paulo 	if (wpa_s->driver->sta_deauth) {
1995b9c547cSRui Paulo 		return wpa_s->driver->sta_deauth(wpa_s->drv_priv,
2005b9c547cSRui Paulo 						 wpa_s->own_addr, addr,
2015b9c547cSRui Paulo 						 reason_code);
2025b9c547cSRui Paulo 	}
2035b9c547cSRui Paulo 	return -1;
2045b9c547cSRui Paulo }
2055b9c547cSRui Paulo 
206e28a4053SRui Paulo static inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
207206b73d0SCy Schubert 					 const u8 *addr, u16 reason_code)
208e28a4053SRui Paulo {
209e28a4053SRui Paulo 	if (wpa_s->driver->deauthenticate) {
210e28a4053SRui Paulo 		return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
211e28a4053SRui Paulo 						     reason_code);
212e28a4053SRui Paulo 	}
213e28a4053SRui Paulo 	return -1;
214e28a4053SRui Paulo }
215e28a4053SRui Paulo 
216e28a4053SRui Paulo static inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
21785732ac8SCy Schubert 				    struct wpa_pmkid_params *params)
218e28a4053SRui Paulo {
219e28a4053SRui Paulo 	if (wpa_s->driver->add_pmkid) {
22085732ac8SCy Schubert 		return wpa_s->driver->add_pmkid(wpa_s->drv_priv, params);
221e28a4053SRui Paulo 	}
222e28a4053SRui Paulo 	return -1;
223e28a4053SRui Paulo }
224e28a4053SRui Paulo 
225e28a4053SRui Paulo static inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
22685732ac8SCy Schubert 				       struct wpa_pmkid_params *params)
227e28a4053SRui Paulo {
228e28a4053SRui Paulo 	if (wpa_s->driver->remove_pmkid) {
22985732ac8SCy Schubert 		return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, params);
230e28a4053SRui Paulo 	}
231e28a4053SRui Paulo 	return -1;
232e28a4053SRui Paulo }
233e28a4053SRui Paulo 
234e28a4053SRui Paulo static inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
235e28a4053SRui Paulo {
236e28a4053SRui Paulo 	if (wpa_s->driver->flush_pmkid) {
237e28a4053SRui Paulo 		return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
238e28a4053SRui Paulo 	}
239e28a4053SRui Paulo 	return -1;
240e28a4053SRui Paulo }
241e28a4053SRui Paulo 
242e28a4053SRui Paulo static inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
243e28a4053SRui Paulo 				   struct wpa_driver_capa *capa)
244e28a4053SRui Paulo {
245e28a4053SRui Paulo 	if (wpa_s->driver->get_capa) {
246e28a4053SRui Paulo 		return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
247e28a4053SRui Paulo 	}
248e28a4053SRui Paulo 	return -1;
249e28a4053SRui Paulo }
250e28a4053SRui Paulo 
251e28a4053SRui Paulo static inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
252e28a4053SRui Paulo {
253e28a4053SRui Paulo 	if (wpa_s->driver->poll) {
254e28a4053SRui Paulo 		wpa_s->driver->poll(wpa_s->drv_priv);
255e28a4053SRui Paulo 	}
256e28a4053SRui Paulo }
257e28a4053SRui Paulo 
258e28a4053SRui Paulo static inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
259e28a4053SRui Paulo {
260e28a4053SRui Paulo 	if (wpa_s->driver->get_ifname) {
261e28a4053SRui Paulo 		return wpa_s->driver->get_ifname(wpa_s->drv_priv);
262e28a4053SRui Paulo 	}
263e28a4053SRui Paulo 	return NULL;
264e28a4053SRui Paulo }
265e28a4053SRui Paulo 
2665b9c547cSRui Paulo static inline const char *
2675b9c547cSRui Paulo wpa_driver_get_radio_name(struct wpa_supplicant *wpa_s)
2685b9c547cSRui Paulo {
2695b9c547cSRui Paulo 	if (wpa_s->driver->get_radio_name)
2705b9c547cSRui Paulo 		return wpa_s->driver->get_radio_name(wpa_s->drv_priv);
2715b9c547cSRui Paulo 	return NULL;
2725b9c547cSRui Paulo }
2735b9c547cSRui Paulo 
274e28a4053SRui Paulo static inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
275e28a4053SRui Paulo {
276e28a4053SRui Paulo 	if (wpa_s->driver->get_mac_addr) {
277e28a4053SRui Paulo 		return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
278e28a4053SRui Paulo 	}
279e28a4053SRui Paulo 	return NULL;
280e28a4053SRui Paulo }
281e28a4053SRui Paulo 
282e28a4053SRui Paulo static inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
283e28a4053SRui Paulo 					int state)
284e28a4053SRui Paulo {
285e28a4053SRui Paulo 	if (wpa_s->driver->set_operstate)
286e28a4053SRui Paulo 		return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
287e28a4053SRui Paulo 	return 0;
288e28a4053SRui Paulo }
289e28a4053SRui Paulo 
290e28a4053SRui Paulo static inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
291e28a4053SRui Paulo 					     const u8 *addr, int protect_type,
292e28a4053SRui Paulo 					     int key_type)
293e28a4053SRui Paulo {
294e28a4053SRui Paulo 	if (wpa_s->driver->mlme_setprotection)
295e28a4053SRui Paulo 		return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
296e28a4053SRui Paulo 							 protect_type,
297e28a4053SRui Paulo 							 key_type);
298e28a4053SRui Paulo 	return 0;
299e28a4053SRui Paulo }
300e28a4053SRui Paulo 
301e28a4053SRui Paulo static inline struct hostapd_hw_modes *
302e28a4053SRui Paulo wpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
30385732ac8SCy Schubert 			    u16 *flags, u8 *dfs_domain)
304e28a4053SRui Paulo {
305e28a4053SRui Paulo 	if (wpa_s->driver->get_hw_feature_data)
306e28a4053SRui Paulo 		return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
30785732ac8SCy Schubert 							  num_modes, flags,
30885732ac8SCy Schubert 							  dfs_domain);
309e28a4053SRui Paulo 	return NULL;
310e28a4053SRui Paulo }
311e28a4053SRui Paulo 
312e28a4053SRui Paulo static inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
313e28a4053SRui Paulo 				      const char *alpha2)
314e28a4053SRui Paulo {
315e28a4053SRui Paulo 	if (wpa_s->driver->set_country)
316e28a4053SRui Paulo 		return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
317e28a4053SRui Paulo 	return 0;
318e28a4053SRui Paulo }
319e28a4053SRui Paulo 
320e28a4053SRui Paulo static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
321325151a3SRui Paulo 				    const u8 *data, size_t data_len, int noack,
322*c1d255d3SCy Schubert 				    unsigned int freq, unsigned int wait)
323e28a4053SRui Paulo {
324e28a4053SRui Paulo 	if (wpa_s->driver->send_mlme)
325e28a4053SRui Paulo 		return wpa_s->driver->send_mlme(wpa_s->drv_priv,
326325151a3SRui Paulo 						data, data_len, noack,
327*c1d255d3SCy Schubert 						freq, NULL, 0, 0, wait);
328e28a4053SRui Paulo 	return -1;
329e28a4053SRui Paulo }
330e28a4053SRui Paulo 
331e28a4053SRui Paulo static inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
332e28a4053SRui Paulo 					const u8 *md,
333e28a4053SRui Paulo 					const u8 *ies, size_t ies_len)
334e28a4053SRui Paulo {
335e28a4053SRui Paulo 	if (wpa_s->driver->update_ft_ies)
336e28a4053SRui Paulo 		return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
337e28a4053SRui Paulo 						    ies, ies_len);
338e28a4053SRui Paulo 	return -1;
339e28a4053SRui Paulo }
340e28a4053SRui Paulo 
341f05cddf9SRui Paulo static inline int wpa_drv_set_ap(struct wpa_supplicant *wpa_s,
342f05cddf9SRui Paulo 				 struct wpa_driver_ap_params *params)
343e28a4053SRui Paulo {
344f05cddf9SRui Paulo 	if (wpa_s->driver->set_ap)
345f05cddf9SRui Paulo 		return wpa_s->driver->set_ap(wpa_s->drv_priv, params);
346e28a4053SRui Paulo 	return -1;
347e28a4053SRui Paulo }
348e28a4053SRui Paulo 
349e28a4053SRui Paulo static inline int wpa_drv_sta_add(struct wpa_supplicant *wpa_s,
350e28a4053SRui Paulo 				  struct hostapd_sta_add_params *params)
351e28a4053SRui Paulo {
352e28a4053SRui Paulo 	if (wpa_s->driver->sta_add)
353e28a4053SRui Paulo 		return wpa_s->driver->sta_add(wpa_s->drv_priv, params);
354e28a4053SRui Paulo 	return -1;
355e28a4053SRui Paulo }
356e28a4053SRui Paulo 
357e28a4053SRui Paulo static inline int wpa_drv_sta_remove(struct wpa_supplicant *wpa_s,
358e28a4053SRui Paulo 				     const u8 *addr)
359e28a4053SRui Paulo {
360e28a4053SRui Paulo 	if (wpa_s->driver->sta_remove)
361e28a4053SRui Paulo 		return wpa_s->driver->sta_remove(wpa_s->drv_priv, addr);
362e28a4053SRui Paulo 	return -1;
363e28a4053SRui Paulo }
364e28a4053SRui Paulo 
365*c1d255d3SCy Schubert static inline int wpa_drv_tx_control_port(struct wpa_supplicant *wpa_s,
366*c1d255d3SCy Schubert 					  const u8 *dest, u16 proto,
367*c1d255d3SCy Schubert 					  const u8 *buf, size_t len,
368*c1d255d3SCy Schubert 					  int no_encrypt)
369*c1d255d3SCy Schubert {
370*c1d255d3SCy Schubert 	if (!wpa_s->driver->tx_control_port)
371*c1d255d3SCy Schubert 		return -1;
372*c1d255d3SCy Schubert 	return wpa_s->driver->tx_control_port(wpa_s->drv_priv, dest, proto,
373*c1d255d3SCy Schubert 					      buf, len, no_encrypt);
374*c1d255d3SCy Schubert }
375*c1d255d3SCy Schubert 
376e28a4053SRui Paulo static inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s,
377e28a4053SRui Paulo 					  const u8 *addr, const u8 *data,
378e28a4053SRui Paulo 					  size_t data_len, int encrypt,
379f05cddf9SRui Paulo 					  const u8 *own_addr, u32 flags)
380e28a4053SRui Paulo {
381e28a4053SRui Paulo 	if (wpa_s->driver->hapd_send_eapol)
382e28a4053SRui Paulo 		return wpa_s->driver->hapd_send_eapol(wpa_s->drv_priv, addr,
383e28a4053SRui Paulo 						      data, data_len, encrypt,
384f05cddf9SRui Paulo 						      own_addr, flags);
385e28a4053SRui Paulo 	return -1;
386e28a4053SRui Paulo }
387e28a4053SRui Paulo 
388e28a4053SRui Paulo static inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
389e28a4053SRui Paulo 					const u8 *addr, int total_flags,
390e28a4053SRui Paulo 					int flags_or, int flags_and)
391e28a4053SRui Paulo {
392e28a4053SRui Paulo 	if (wpa_s->driver->sta_set_flags)
393e28a4053SRui Paulo 		return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
394e28a4053SRui Paulo 						    total_flags, flags_or,
395e28a4053SRui Paulo 						    flags_and);
396e28a4053SRui Paulo 	return -1;
397e28a4053SRui Paulo }
398e28a4053SRui Paulo 
399e28a4053SRui Paulo static inline int wpa_drv_set_supp_port(struct wpa_supplicant *wpa_s,
400e28a4053SRui Paulo 					int authorized)
401e28a4053SRui Paulo {
402e28a4053SRui Paulo 	if (wpa_s->driver->set_supp_port) {
403e28a4053SRui Paulo 		return wpa_s->driver->set_supp_port(wpa_s->drv_priv,
404e28a4053SRui Paulo 						    authorized);
405e28a4053SRui Paulo 	}
406e28a4053SRui Paulo 	return 0;
407e28a4053SRui Paulo }
408e28a4053SRui Paulo 
409e28a4053SRui Paulo static inline int wpa_drv_send_action(struct wpa_supplicant *wpa_s,
410e28a4053SRui Paulo 				      unsigned int freq,
411f05cddf9SRui Paulo 				      unsigned int wait,
412e28a4053SRui Paulo 				      const u8 *dst, const u8 *src,
413e28a4053SRui Paulo 				      const u8 *bssid,
414f05cddf9SRui Paulo 				      const u8 *data, size_t data_len,
415f05cddf9SRui Paulo 				      int no_cck)
416e28a4053SRui Paulo {
417e28a4053SRui Paulo 	if (wpa_s->driver->send_action)
418e28a4053SRui Paulo 		return wpa_s->driver->send_action(wpa_s->drv_priv, freq,
419f05cddf9SRui Paulo 						  wait, dst, src, bssid,
420f05cddf9SRui Paulo 						  data, data_len, no_cck);
421f05cddf9SRui Paulo 	return -1;
422f05cddf9SRui Paulo }
423f05cddf9SRui Paulo 
424f05cddf9SRui Paulo static inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
425f05cddf9SRui Paulo {
426f05cddf9SRui Paulo 	if (wpa_s->driver->send_action_cancel_wait)
427f05cddf9SRui Paulo 		wpa_s->driver->send_action_cancel_wait(wpa_s->drv_priv);
428f05cddf9SRui Paulo }
429f05cddf9SRui Paulo 
430f05cddf9SRui Paulo static inline int wpa_drv_set_freq(struct wpa_supplicant *wpa_s,
431f05cddf9SRui Paulo 				   struct hostapd_freq_params *freq)
432f05cddf9SRui Paulo {
433f05cddf9SRui Paulo 	if (wpa_s->driver->set_freq)
434f05cddf9SRui Paulo 		return wpa_s->driver->set_freq(wpa_s->drv_priv, freq);
435e28a4053SRui Paulo 	return -1;
436e28a4053SRui Paulo }
437e28a4053SRui Paulo 
438e28a4053SRui Paulo static inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s,
439e28a4053SRui Paulo 				 enum wpa_driver_if_type type,
440e28a4053SRui Paulo 				 const char *ifname, const u8 *addr,
441e28a4053SRui Paulo 				 void *bss_ctx, char *force_ifname,
442f05cddf9SRui Paulo 				 u8 *if_addr, const char *bridge)
443e28a4053SRui Paulo {
444e28a4053SRui Paulo 	if (wpa_s->driver->if_add)
445e28a4053SRui Paulo 		return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname,
446e28a4053SRui Paulo 					     addr, bss_ctx, NULL, force_ifname,
447780fb4a2SCy Schubert 					     if_addr, bridge, 0, 0);
448e28a4053SRui Paulo 	return -1;
449e28a4053SRui Paulo }
450e28a4053SRui Paulo 
451e28a4053SRui Paulo static inline int wpa_drv_if_remove(struct wpa_supplicant *wpa_s,
452e28a4053SRui Paulo 				    enum wpa_driver_if_type type,
453e28a4053SRui Paulo 				    const char *ifname)
454e28a4053SRui Paulo {
455e28a4053SRui Paulo 	if (wpa_s->driver->if_remove)
456e28a4053SRui Paulo 		return wpa_s->driver->if_remove(wpa_s->drv_priv, type, ifname);
457e28a4053SRui Paulo 	return -1;
458e28a4053SRui Paulo }
459e28a4053SRui Paulo 
460e28a4053SRui Paulo static inline int wpa_drv_remain_on_channel(struct wpa_supplicant *wpa_s,
461e28a4053SRui Paulo 					    unsigned int freq,
462e28a4053SRui Paulo 					    unsigned int duration)
463e28a4053SRui Paulo {
464e28a4053SRui Paulo 	if (wpa_s->driver->remain_on_channel)
465e28a4053SRui Paulo 		return wpa_s->driver->remain_on_channel(wpa_s->drv_priv, freq,
466e28a4053SRui Paulo 							duration);
467e28a4053SRui Paulo 	return -1;
468e28a4053SRui Paulo }
469e28a4053SRui Paulo 
470e28a4053SRui Paulo static inline int wpa_drv_cancel_remain_on_channel(
471e28a4053SRui Paulo 	struct wpa_supplicant *wpa_s)
472e28a4053SRui Paulo {
473e28a4053SRui Paulo 	if (wpa_s->driver->cancel_remain_on_channel)
474e28a4053SRui Paulo 		return wpa_s->driver->cancel_remain_on_channel(
475e28a4053SRui Paulo 			wpa_s->drv_priv);
476e28a4053SRui Paulo 	return -1;
477e28a4053SRui Paulo }
478e28a4053SRui Paulo 
479e28a4053SRui Paulo static inline int wpa_drv_probe_req_report(struct wpa_supplicant *wpa_s,
480e28a4053SRui Paulo 					   int report)
481e28a4053SRui Paulo {
482e28a4053SRui Paulo 	if (wpa_s->driver->probe_req_report)
483e28a4053SRui Paulo 		return wpa_s->driver->probe_req_report(wpa_s->drv_priv,
484e28a4053SRui Paulo 						       report);
485e28a4053SRui Paulo 	return -1;
486e28a4053SRui Paulo }
487e28a4053SRui Paulo 
488e28a4053SRui Paulo static inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
489e28a4053SRui Paulo {
490e28a4053SRui Paulo 	if (wpa_s->driver->deinit_ap)
491e28a4053SRui Paulo 		return wpa_s->driver->deinit_ap(wpa_s->drv_priv);
492e28a4053SRui Paulo 	return 0;
493e28a4053SRui Paulo }
494e28a4053SRui Paulo 
495f05cddf9SRui Paulo static inline int wpa_drv_deinit_p2p_cli(struct wpa_supplicant *wpa_s)
496f05cddf9SRui Paulo {
497f05cddf9SRui Paulo 	if (wpa_s->driver->deinit_p2p_cli)
498f05cddf9SRui Paulo 		return wpa_s->driver->deinit_p2p_cli(wpa_s->drv_priv);
499f05cddf9SRui Paulo 	return 0;
500f05cddf9SRui Paulo }
501f05cddf9SRui Paulo 
502e28a4053SRui Paulo static inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
503e28a4053SRui Paulo {
504e28a4053SRui Paulo 	if (wpa_s->driver->suspend)
505e28a4053SRui Paulo 		wpa_s->driver->suspend(wpa_s->drv_priv);
506e28a4053SRui Paulo }
507e28a4053SRui Paulo 
508e28a4053SRui Paulo static inline void wpa_drv_resume(struct wpa_supplicant *wpa_s)
509e28a4053SRui Paulo {
510e28a4053SRui Paulo 	if (wpa_s->driver->resume)
511e28a4053SRui Paulo 		wpa_s->driver->resume(wpa_s->drv_priv);
512e28a4053SRui Paulo }
513e28a4053SRui Paulo 
514e28a4053SRui Paulo static inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s,
515e28a4053SRui Paulo 					 int threshold, int hysteresis)
516e28a4053SRui Paulo {
517e28a4053SRui Paulo 	if (wpa_s->driver->signal_monitor)
518e28a4053SRui Paulo 		return wpa_s->driver->signal_monitor(wpa_s->drv_priv,
519e28a4053SRui Paulo 						     threshold, hysteresis);
520e28a4053SRui Paulo 	return -1;
521e28a4053SRui Paulo }
522e28a4053SRui Paulo 
523*c1d255d3SCy Schubert int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
524*c1d255d3SCy Schubert 			struct wpa_signal_info *si);
525f05cddf9SRui Paulo 
5264bc52338SCy Schubert static inline int wpa_drv_channel_info(struct wpa_supplicant *wpa_s,
5274bc52338SCy Schubert 				       struct wpa_channel_info *ci)
5284bc52338SCy Schubert {
5294bc52338SCy Schubert 	if (wpa_s->driver->channel_info)
5304bc52338SCy Schubert 		return wpa_s->driver->channel_info(wpa_s->drv_priv, ci);
5314bc52338SCy Schubert 	return -1;
5324bc52338SCy Schubert }
5334bc52338SCy Schubert 
534f05cddf9SRui Paulo static inline int wpa_drv_pktcnt_poll(struct wpa_supplicant *wpa_s,
535f05cddf9SRui Paulo 				      struct hostap_sta_driver_data *sta)
536f05cddf9SRui Paulo {
537f05cddf9SRui Paulo 	if (wpa_s->driver->read_sta_data)
538f05cddf9SRui Paulo 		return wpa_s->driver->read_sta_data(wpa_s->drv_priv, sta,
539f05cddf9SRui Paulo 						    wpa_s->bssid);
540f05cddf9SRui Paulo 	return -1;
541f05cddf9SRui Paulo }
542f05cddf9SRui Paulo 
543e28a4053SRui Paulo static inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
544e28a4053SRui Paulo 					const struct wpabuf *beacon,
545f05cddf9SRui Paulo 					const struct wpabuf *proberesp,
546f05cddf9SRui Paulo 					const struct wpabuf *assocresp)
547e28a4053SRui Paulo {
548e28a4053SRui Paulo 	if (!wpa_s->driver->set_ap_wps_ie)
549e28a4053SRui Paulo 		return -1;
550e28a4053SRui Paulo 	return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon,
551f05cddf9SRui Paulo 					    proberesp, assocresp);
552f05cddf9SRui Paulo }
553f05cddf9SRui Paulo 
554f05cddf9SRui Paulo static inline int wpa_drv_get_noa(struct wpa_supplicant *wpa_s,
555f05cddf9SRui Paulo 				  u8 *buf, size_t buf_len)
556f05cddf9SRui Paulo {
557f05cddf9SRui Paulo 	if (!wpa_s->driver->get_noa)
558f05cddf9SRui Paulo 		return -1;
559f05cddf9SRui Paulo 	return wpa_s->driver->get_noa(wpa_s->drv_priv, buf, buf_len);
560f05cddf9SRui Paulo }
561f05cddf9SRui Paulo 
562f05cddf9SRui Paulo static inline int wpa_drv_set_p2p_powersave(struct wpa_supplicant *wpa_s,
563f05cddf9SRui Paulo 					    int legacy_ps, int opp_ps,
564f05cddf9SRui Paulo 					    int ctwindow)
565f05cddf9SRui Paulo {
566f05cddf9SRui Paulo 	if (!wpa_s->driver->set_p2p_powersave)
567f05cddf9SRui Paulo 		return -1;
568f05cddf9SRui Paulo 	return wpa_s->driver->set_p2p_powersave(wpa_s->drv_priv, legacy_ps,
569f05cddf9SRui Paulo 						opp_ps, ctwindow);
570f05cddf9SRui Paulo }
571f05cddf9SRui Paulo 
572f05cddf9SRui Paulo static inline int wpa_drv_ampdu(struct wpa_supplicant *wpa_s, int ampdu)
573f05cddf9SRui Paulo {
574f05cddf9SRui Paulo 	if (!wpa_s->driver->ampdu)
575f05cddf9SRui Paulo 		return -1;
576f05cddf9SRui Paulo 	return wpa_s->driver->ampdu(wpa_s->drv_priv, ampdu);
577f05cddf9SRui Paulo }
578f05cddf9SRui Paulo 
579f05cddf9SRui Paulo static inline int wpa_drv_send_tdls_mgmt(struct wpa_supplicant *wpa_s,
580f05cddf9SRui Paulo 					 const u8 *dst, u8 action_code,
581f05cddf9SRui Paulo 					 u8 dialog_token, u16 status_code,
5825b9c547cSRui Paulo 					 u32 peer_capab, int initiator,
583f05cddf9SRui Paulo 					 const u8 *buf, size_t len)
584f05cddf9SRui Paulo {
585f05cddf9SRui Paulo 	if (wpa_s->driver->send_tdls_mgmt) {
586f05cddf9SRui Paulo 		return wpa_s->driver->send_tdls_mgmt(wpa_s->drv_priv, dst,
587f05cddf9SRui Paulo 						     action_code, dialog_token,
5885b9c547cSRui Paulo 						     status_code, peer_capab,
5895b9c547cSRui Paulo 						     initiator, buf, len);
590f05cddf9SRui Paulo 	}
591f05cddf9SRui Paulo 	return -1;
592f05cddf9SRui Paulo }
593f05cddf9SRui Paulo 
594f05cddf9SRui Paulo static inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
595f05cddf9SRui Paulo 				    enum tdls_oper oper, const u8 *peer)
596f05cddf9SRui Paulo {
597f05cddf9SRui Paulo 	if (!wpa_s->driver->tdls_oper)
598f05cddf9SRui Paulo 		return -1;
599f05cddf9SRui Paulo 	return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
600f05cddf9SRui Paulo }
601f05cddf9SRui Paulo 
6025b9c547cSRui Paulo #ifdef ANDROID
6035b9c547cSRui Paulo static inline int wpa_drv_driver_cmd(struct wpa_supplicant *wpa_s,
6045b9c547cSRui Paulo 				     char *cmd, char *buf, size_t buf_len)
6055b9c547cSRui Paulo {
6065b9c547cSRui Paulo 	if (!wpa_s->driver->driver_cmd)
6075b9c547cSRui Paulo 		return -1;
6085b9c547cSRui Paulo 	return wpa_s->driver->driver_cmd(wpa_s->drv_priv, cmd, buf, buf_len);
6095b9c547cSRui Paulo }
6105b9c547cSRui Paulo #endif /* ANDROID */
6115b9c547cSRui Paulo 
612f05cddf9SRui Paulo static inline void wpa_drv_set_rekey_info(struct wpa_supplicant *wpa_s,
6135b9c547cSRui Paulo 					  const u8 *kek, size_t kek_len,
6145b9c547cSRui Paulo 					  const u8 *kck, size_t kck_len,
615f05cddf9SRui Paulo 					  const u8 *replay_ctr)
616f05cddf9SRui Paulo {
617f05cddf9SRui Paulo 	if (!wpa_s->driver->set_rekey_info)
618f05cddf9SRui Paulo 		return;
6195b9c547cSRui Paulo 	wpa_s->driver->set_rekey_info(wpa_s->drv_priv, kek, kek_len,
6205b9c547cSRui Paulo 				      kck, kck_len, replay_ctr);
621f05cddf9SRui Paulo }
622f05cddf9SRui Paulo 
623f05cddf9SRui Paulo static inline int wpa_drv_radio_disable(struct wpa_supplicant *wpa_s,
624f05cddf9SRui Paulo 					int disabled)
625f05cddf9SRui Paulo {
626f05cddf9SRui Paulo 	if (!wpa_s->driver->radio_disable)
627f05cddf9SRui Paulo 		return -1;
628f05cddf9SRui Paulo 	return wpa_s->driver->radio_disable(wpa_s->drv_priv, disabled);
629f05cddf9SRui Paulo }
630f05cddf9SRui Paulo 
631f05cddf9SRui Paulo static inline int wpa_drv_switch_channel(struct wpa_supplicant *wpa_s,
6325b9c547cSRui Paulo 					 struct csa_settings *settings)
633f05cddf9SRui Paulo {
634f05cddf9SRui Paulo 	if (!wpa_s->driver->switch_channel)
635f05cddf9SRui Paulo 		return -1;
6365b9c547cSRui Paulo 	return wpa_s->driver->switch_channel(wpa_s->drv_priv, settings);
6375b9c547cSRui Paulo }
6385b9c547cSRui Paulo 
6395b9c547cSRui Paulo static inline int wpa_drv_add_ts(struct wpa_supplicant *wpa_s, u8 tsid,
6405b9c547cSRui Paulo 				 const u8 *address, u8 user_priority,
6415b9c547cSRui Paulo 				 u16 admitted_time)
6425b9c547cSRui Paulo {
6435b9c547cSRui Paulo 	if (!wpa_s->driver->add_tx_ts)
6445b9c547cSRui Paulo 		return -1;
6455b9c547cSRui Paulo 	return wpa_s->driver->add_tx_ts(wpa_s->drv_priv, tsid, address,
6465b9c547cSRui Paulo 					user_priority, admitted_time);
6475b9c547cSRui Paulo }
6485b9c547cSRui Paulo 
6495b9c547cSRui Paulo static inline int wpa_drv_del_ts(struct wpa_supplicant *wpa_s, u8 tid,
6505b9c547cSRui Paulo 				 const u8 *address)
6515b9c547cSRui Paulo {
6525b9c547cSRui Paulo 	if (!wpa_s->driver->del_tx_ts)
6535b9c547cSRui Paulo 		return -1;
6545b9c547cSRui Paulo 	return wpa_s->driver->del_tx_ts(wpa_s->drv_priv, tid, address);
6555b9c547cSRui Paulo }
6565b9c547cSRui Paulo 
6575b9c547cSRui Paulo static inline int wpa_drv_tdls_enable_channel_switch(
6585b9c547cSRui Paulo 	struct wpa_supplicant *wpa_s, const u8 *addr, u8 oper_class,
6595b9c547cSRui Paulo 	const struct hostapd_freq_params *freq_params)
6605b9c547cSRui Paulo {
6615b9c547cSRui Paulo 	if (!wpa_s->driver->tdls_enable_channel_switch)
6625b9c547cSRui Paulo 		return -1;
6635b9c547cSRui Paulo 	return wpa_s->driver->tdls_enable_channel_switch(wpa_s->drv_priv, addr,
6645b9c547cSRui Paulo 							 oper_class,
6655b9c547cSRui Paulo 							 freq_params);
6665b9c547cSRui Paulo }
6675b9c547cSRui Paulo 
6685b9c547cSRui Paulo static inline int
6695b9c547cSRui Paulo wpa_drv_tdls_disable_channel_switch(struct wpa_supplicant *wpa_s,
6705b9c547cSRui Paulo 				    const u8 *addr)
6715b9c547cSRui Paulo {
6725b9c547cSRui Paulo 	if (!wpa_s->driver->tdls_disable_channel_switch)
6735b9c547cSRui Paulo 		return -1;
6745b9c547cSRui Paulo 	return wpa_s->driver->tdls_disable_channel_switch(wpa_s->drv_priv,
6755b9c547cSRui Paulo 							  addr);
676f05cddf9SRui Paulo }
677f05cddf9SRui Paulo 
678f05cddf9SRui Paulo static inline int wpa_drv_wnm_oper(struct wpa_supplicant *wpa_s,
679f05cddf9SRui Paulo 				   enum wnm_oper oper, const u8 *peer,
680f05cddf9SRui Paulo 				   u8 *buf, u16 *buf_len)
681f05cddf9SRui Paulo {
682f05cddf9SRui Paulo 	if (!wpa_s->driver->wnm_oper)
683f05cddf9SRui Paulo 		return -1;
684f05cddf9SRui Paulo 	return wpa_s->driver->wnm_oper(wpa_s->drv_priv, oper, peer, buf,
685f05cddf9SRui Paulo 				       buf_len);
686e28a4053SRui Paulo }
687e28a4053SRui Paulo 
6885b9c547cSRui Paulo static inline int wpa_drv_status(struct wpa_supplicant *wpa_s,
6895b9c547cSRui Paulo 				 char *buf, size_t buflen)
6905b9c547cSRui Paulo {
6915b9c547cSRui Paulo 	if (!wpa_s->driver->status)
6925b9c547cSRui Paulo 		return -1;
6935b9c547cSRui Paulo 	return wpa_s->driver->status(wpa_s->drv_priv, buf, buflen);
6945b9c547cSRui Paulo }
6955b9c547cSRui Paulo 
6965b9c547cSRui Paulo static inline int wpa_drv_set_qos_map(struct wpa_supplicant *wpa_s,
6975b9c547cSRui Paulo 				      const u8 *qos_map_set, u8 qos_map_set_len)
6985b9c547cSRui Paulo {
6995b9c547cSRui Paulo 	if (!wpa_s->driver->set_qos_map)
7005b9c547cSRui Paulo 		return -1;
7015b9c547cSRui Paulo 	return wpa_s->driver->set_qos_map(wpa_s->drv_priv, qos_map_set,
7025b9c547cSRui Paulo 					  qos_map_set_len);
7035b9c547cSRui Paulo }
7045b9c547cSRui Paulo 
705*c1d255d3SCy Schubert static inline int wpa_drv_get_wowlan(struct wpa_supplicant *wpa_s)
706*c1d255d3SCy Schubert {
707*c1d255d3SCy Schubert 	if (!wpa_s->driver->get_wowlan)
708*c1d255d3SCy Schubert 		return 0;
709*c1d255d3SCy Schubert 	return wpa_s->driver->get_wowlan(wpa_s->drv_priv);
710*c1d255d3SCy Schubert }
711*c1d255d3SCy Schubert 
7125b9c547cSRui Paulo static inline int wpa_drv_wowlan(struct wpa_supplicant *wpa_s,
7135b9c547cSRui Paulo 				 const struct wowlan_triggers *triggers)
7145b9c547cSRui Paulo {
7155b9c547cSRui Paulo 	if (!wpa_s->driver->set_wowlan)
7165b9c547cSRui Paulo 		return -1;
7175b9c547cSRui Paulo 	return wpa_s->driver->set_wowlan(wpa_s->drv_priv, triggers);
7185b9c547cSRui Paulo }
7195b9c547cSRui Paulo 
7205b9c547cSRui Paulo static inline int wpa_drv_vendor_cmd(struct wpa_supplicant *wpa_s,
7215b9c547cSRui Paulo 				     int vendor_id, int subcmd, const u8 *data,
722*c1d255d3SCy Schubert 				     size_t data_len,
723*c1d255d3SCy Schubert 				     enum nested_attr nested_attr_flag,
724*c1d255d3SCy Schubert 				     struct wpabuf *buf)
7255b9c547cSRui Paulo {
7265b9c547cSRui Paulo 	if (!wpa_s->driver->vendor_cmd)
7275b9c547cSRui Paulo 		return -1;
7285b9c547cSRui Paulo 	return wpa_s->driver->vendor_cmd(wpa_s->drv_priv, vendor_id, subcmd,
729*c1d255d3SCy Schubert 					 data, data_len, nested_attr_flag, buf);
7305b9c547cSRui Paulo }
7315b9c547cSRui Paulo 
7325b9c547cSRui Paulo static inline int wpa_drv_roaming(struct wpa_supplicant *wpa_s, int allowed,
7335b9c547cSRui Paulo 				  const u8 *bssid)
7345b9c547cSRui Paulo {
7355b9c547cSRui Paulo 	if (!wpa_s->driver->roaming)
7365b9c547cSRui Paulo 		return -1;
7375b9c547cSRui Paulo 	return wpa_s->driver->roaming(wpa_s->drv_priv, allowed, bssid);
7385b9c547cSRui Paulo }
7395b9c547cSRui Paulo 
74085732ac8SCy Schubert static inline int wpa_drv_disable_fils(struct wpa_supplicant *wpa_s,
74185732ac8SCy Schubert 				       int disable)
74285732ac8SCy Schubert {
74385732ac8SCy Schubert 	if (!wpa_s->driver->disable_fils)
74485732ac8SCy Schubert 		return -1;
74585732ac8SCy Schubert 	return wpa_s->driver->disable_fils(wpa_s->drv_priv, disable);
74685732ac8SCy Schubert }
74785732ac8SCy Schubert 
7485b9c547cSRui Paulo static inline int wpa_drv_set_mac_addr(struct wpa_supplicant *wpa_s,
7495b9c547cSRui Paulo 				       const u8 *addr)
7505b9c547cSRui Paulo {
7515b9c547cSRui Paulo 	if (!wpa_s->driver->set_mac_addr)
7525b9c547cSRui Paulo 		return -1;
7535b9c547cSRui Paulo 	return wpa_s->driver->set_mac_addr(wpa_s->drv_priv, addr);
7545b9c547cSRui Paulo }
7555b9c547cSRui Paulo 
7565b9c547cSRui Paulo 
7575b9c547cSRui Paulo #ifdef CONFIG_MACSEC
7585b9c547cSRui Paulo 
7595b9c547cSRui Paulo static inline int wpa_drv_macsec_init(struct wpa_supplicant *wpa_s,
7605b9c547cSRui Paulo 				      struct macsec_init_params *params)
7615b9c547cSRui Paulo {
7625b9c547cSRui Paulo 	if (!wpa_s->driver->macsec_init)
7635b9c547cSRui Paulo 		return -1;
7645b9c547cSRui Paulo 	return wpa_s->driver->macsec_init(wpa_s->drv_priv, params);
7655b9c547cSRui Paulo }
7665b9c547cSRui Paulo 
7675b9c547cSRui Paulo static inline int wpa_drv_macsec_deinit(struct wpa_supplicant *wpa_s)
7685b9c547cSRui Paulo {
7695b9c547cSRui Paulo 	if (!wpa_s->driver->macsec_deinit)
7705b9c547cSRui Paulo 		return -1;
7715b9c547cSRui Paulo 	return wpa_s->driver->macsec_deinit(wpa_s->drv_priv);
7725b9c547cSRui Paulo }
7735b9c547cSRui Paulo 
77485732ac8SCy Schubert static inline int wpa_drv_macsec_get_capability(struct wpa_supplicant *wpa_s,
77585732ac8SCy Schubert 						enum macsec_cap *cap)
77685732ac8SCy Schubert {
77785732ac8SCy Schubert 	if (!wpa_s->driver->macsec_get_capability)
77885732ac8SCy Schubert 		return -1;
77985732ac8SCy Schubert 	return wpa_s->driver->macsec_get_capability(wpa_s->drv_priv, cap);
78085732ac8SCy Schubert }
78185732ac8SCy Schubert 
7825b9c547cSRui Paulo static inline int wpa_drv_enable_protect_frames(struct wpa_supplicant *wpa_s,
783*c1d255d3SCy Schubert 						bool enabled)
7845b9c547cSRui Paulo {
7855b9c547cSRui Paulo 	if (!wpa_s->driver->enable_protect_frames)
7865b9c547cSRui Paulo 		return -1;
7875b9c547cSRui Paulo 	return wpa_s->driver->enable_protect_frames(wpa_s->drv_priv, enabled);
7885b9c547cSRui Paulo }
7895b9c547cSRui Paulo 
79085732ac8SCy Schubert static inline int wpa_drv_enable_encrypt(struct wpa_supplicant *wpa_s,
791*c1d255d3SCy Schubert 						bool enabled)
79285732ac8SCy Schubert {
79385732ac8SCy Schubert 	if (!wpa_s->driver->enable_encrypt)
79485732ac8SCy Schubert 		return -1;
79585732ac8SCy Schubert 	return wpa_s->driver->enable_encrypt(wpa_s->drv_priv, enabled);
79685732ac8SCy Schubert }
79785732ac8SCy Schubert 
7985b9c547cSRui Paulo static inline int wpa_drv_set_replay_protect(struct wpa_supplicant *wpa_s,
799*c1d255d3SCy Schubert 					     bool enabled, u32 window)
8005b9c547cSRui Paulo {
8015b9c547cSRui Paulo 	if (!wpa_s->driver->set_replay_protect)
8025b9c547cSRui Paulo 		return -1;
8035b9c547cSRui Paulo 	return wpa_s->driver->set_replay_protect(wpa_s->drv_priv, enabled,
8045b9c547cSRui Paulo 						 window);
8055b9c547cSRui Paulo }
8065b9c547cSRui Paulo 
8075b9c547cSRui Paulo static inline int wpa_drv_set_current_cipher_suite(struct wpa_supplicant *wpa_s,
808780fb4a2SCy Schubert 						   u64 cs)
8095b9c547cSRui Paulo {
8105b9c547cSRui Paulo 	if (!wpa_s->driver->set_current_cipher_suite)
8115b9c547cSRui Paulo 		return -1;
812780fb4a2SCy Schubert 	return wpa_s->driver->set_current_cipher_suite(wpa_s->drv_priv, cs);
8135b9c547cSRui Paulo }
8145b9c547cSRui Paulo 
8155b9c547cSRui Paulo static inline int wpa_drv_enable_controlled_port(struct wpa_supplicant *wpa_s,
816*c1d255d3SCy Schubert 						 bool enabled)
8175b9c547cSRui Paulo {
8185b9c547cSRui Paulo 	if (!wpa_s->driver->enable_controlled_port)
8195b9c547cSRui Paulo 		return -1;
8205b9c547cSRui Paulo 	return wpa_s->driver->enable_controlled_port(wpa_s->drv_priv, enabled);
8215b9c547cSRui Paulo }
8225b9c547cSRui Paulo 
8235b9c547cSRui Paulo static inline int wpa_drv_get_receive_lowest_pn(struct wpa_supplicant *wpa_s,
82485732ac8SCy Schubert 						struct receive_sa *sa)
8255b9c547cSRui Paulo {
8265b9c547cSRui Paulo 	if (!wpa_s->driver->get_receive_lowest_pn)
8275b9c547cSRui Paulo 		return -1;
82885732ac8SCy Schubert 	return wpa_s->driver->get_receive_lowest_pn(wpa_s->drv_priv, sa);
8295b9c547cSRui Paulo }
8305b9c547cSRui Paulo 
8315b9c547cSRui Paulo static inline int wpa_drv_get_transmit_next_pn(struct wpa_supplicant *wpa_s,
83285732ac8SCy Schubert 						struct transmit_sa *sa)
8335b9c547cSRui Paulo {
8345b9c547cSRui Paulo 	if (!wpa_s->driver->get_transmit_next_pn)
8355b9c547cSRui Paulo 		return -1;
83685732ac8SCy Schubert 	return wpa_s->driver->get_transmit_next_pn(wpa_s->drv_priv, sa);
8375b9c547cSRui Paulo }
8385b9c547cSRui Paulo 
8395b9c547cSRui Paulo static inline int wpa_drv_set_transmit_next_pn(struct wpa_supplicant *wpa_s,
84085732ac8SCy Schubert 						struct transmit_sa *sa)
8415b9c547cSRui Paulo {
8425b9c547cSRui Paulo 	if (!wpa_s->driver->set_transmit_next_pn)
8435b9c547cSRui Paulo 		return -1;
84485732ac8SCy Schubert 	return wpa_s->driver->set_transmit_next_pn(wpa_s->drv_priv, sa);
8455b9c547cSRui Paulo }
8465b9c547cSRui Paulo 
8474bc52338SCy Schubert static inline int wpa_drv_set_receive_lowest_pn(struct wpa_supplicant *wpa_s,
8484bc52338SCy Schubert 						struct receive_sa *sa)
8494bc52338SCy Schubert {
8504bc52338SCy Schubert 	if (!wpa_s->driver->set_receive_lowest_pn)
8514bc52338SCy Schubert 		return -1;
8524bc52338SCy Schubert 	return wpa_s->driver->set_receive_lowest_pn(wpa_s->drv_priv, sa);
8534bc52338SCy Schubert }
8544bc52338SCy Schubert 
8555b9c547cSRui Paulo static inline int
85685732ac8SCy Schubert wpa_drv_create_receive_sc(struct wpa_supplicant *wpa_s, struct receive_sc *sc,
8575b9c547cSRui Paulo 			  unsigned int conf_offset, int validation)
8585b9c547cSRui Paulo {
8595b9c547cSRui Paulo 	if (!wpa_s->driver->create_receive_sc)
8605b9c547cSRui Paulo 		return -1;
86185732ac8SCy Schubert 	return wpa_s->driver->create_receive_sc(wpa_s->drv_priv, sc,
86285732ac8SCy Schubert 						conf_offset, validation);
8635b9c547cSRui Paulo }
8645b9c547cSRui Paulo 
8655b9c547cSRui Paulo static inline int wpa_drv_delete_receive_sc(struct wpa_supplicant *wpa_s,
86685732ac8SCy Schubert 					    struct receive_sc *sc)
8675b9c547cSRui Paulo {
8685b9c547cSRui Paulo 	if (!wpa_s->driver->delete_receive_sc)
8695b9c547cSRui Paulo 		return -1;
87085732ac8SCy Schubert 	return wpa_s->driver->delete_receive_sc(wpa_s->drv_priv, sc);
8715b9c547cSRui Paulo }
8725b9c547cSRui Paulo 
8735b9c547cSRui Paulo static inline int wpa_drv_create_receive_sa(struct wpa_supplicant *wpa_s,
87485732ac8SCy Schubert 					    struct receive_sa *sa)
8755b9c547cSRui Paulo {
8765b9c547cSRui Paulo 	if (!wpa_s->driver->create_receive_sa)
8775b9c547cSRui Paulo 		return -1;
87885732ac8SCy Schubert 	return wpa_s->driver->create_receive_sa(wpa_s->drv_priv, sa);
87985732ac8SCy Schubert }
88085732ac8SCy Schubert 
88185732ac8SCy Schubert static inline int wpa_drv_delete_receive_sa(struct wpa_supplicant *wpa_s,
88285732ac8SCy Schubert 					    struct receive_sa *sa)
88385732ac8SCy Schubert {
88485732ac8SCy Schubert 	if (!wpa_s->driver->delete_receive_sa)
88585732ac8SCy Schubert 		return -1;
88685732ac8SCy Schubert 	return wpa_s->driver->delete_receive_sa(wpa_s->drv_priv, sa);
8875b9c547cSRui Paulo }
8885b9c547cSRui Paulo 
8895b9c547cSRui Paulo static inline int wpa_drv_enable_receive_sa(struct wpa_supplicant *wpa_s,
89085732ac8SCy Schubert 					    struct receive_sa *sa)
8915b9c547cSRui Paulo {
8925b9c547cSRui Paulo 	if (!wpa_s->driver->enable_receive_sa)
8935b9c547cSRui Paulo 		return -1;
89485732ac8SCy Schubert 	return wpa_s->driver->enable_receive_sa(wpa_s->drv_priv, sa);
8955b9c547cSRui Paulo }
8965b9c547cSRui Paulo 
8975b9c547cSRui Paulo static inline int wpa_drv_disable_receive_sa(struct wpa_supplicant *wpa_s,
89885732ac8SCy Schubert 					     struct receive_sa *sa)
8995b9c547cSRui Paulo {
9005b9c547cSRui Paulo 	if (!wpa_s->driver->disable_receive_sa)
9015b9c547cSRui Paulo 		return -1;
90285732ac8SCy Schubert 	return wpa_s->driver->disable_receive_sa(wpa_s->drv_priv, sa);
9035b9c547cSRui Paulo }
9045b9c547cSRui Paulo 
9055b9c547cSRui Paulo static inline int
90685732ac8SCy Schubert wpa_drv_create_transmit_sc(struct wpa_supplicant *wpa_s, struct transmit_sc *sc,
9075b9c547cSRui Paulo 			   unsigned int conf_offset)
9085b9c547cSRui Paulo {
9095b9c547cSRui Paulo 	if (!wpa_s->driver->create_transmit_sc)
9105b9c547cSRui Paulo 		return -1;
91185732ac8SCy Schubert 	return wpa_s->driver->create_transmit_sc(wpa_s->drv_priv, sc,
9125b9c547cSRui Paulo 						 conf_offset);
9135b9c547cSRui Paulo }
9145b9c547cSRui Paulo 
9155b9c547cSRui Paulo static inline int wpa_drv_delete_transmit_sc(struct wpa_supplicant *wpa_s,
91685732ac8SCy Schubert 					     struct transmit_sc *sc)
9175b9c547cSRui Paulo {
9185b9c547cSRui Paulo 	if (!wpa_s->driver->delete_transmit_sc)
9195b9c547cSRui Paulo 		return -1;
92085732ac8SCy Schubert 	return wpa_s->driver->delete_transmit_sc(wpa_s->drv_priv, sc);
9215b9c547cSRui Paulo }
9225b9c547cSRui Paulo 
9235b9c547cSRui Paulo static inline int wpa_drv_create_transmit_sa(struct wpa_supplicant *wpa_s,
92485732ac8SCy Schubert 					     struct transmit_sa *sa)
9255b9c547cSRui Paulo {
9265b9c547cSRui Paulo 	if (!wpa_s->driver->create_transmit_sa)
9275b9c547cSRui Paulo 		return -1;
92885732ac8SCy Schubert 	return wpa_s->driver->create_transmit_sa(wpa_s->drv_priv, sa);
92985732ac8SCy Schubert }
93085732ac8SCy Schubert 
93185732ac8SCy Schubert static inline int wpa_drv_delete_transmit_sa(struct wpa_supplicant *wpa_s,
93285732ac8SCy Schubert 					     struct transmit_sa *sa)
93385732ac8SCy Schubert {
93485732ac8SCy Schubert 	if (!wpa_s->driver->delete_transmit_sa)
93585732ac8SCy Schubert 		return -1;
93685732ac8SCy Schubert 	return wpa_s->driver->delete_transmit_sa(wpa_s->drv_priv, sa);
9375b9c547cSRui Paulo }
9385b9c547cSRui Paulo 
9395b9c547cSRui Paulo static inline int wpa_drv_enable_transmit_sa(struct wpa_supplicant *wpa_s,
94085732ac8SCy Schubert 					     struct transmit_sa *sa)
9415b9c547cSRui Paulo {
9425b9c547cSRui Paulo 	if (!wpa_s->driver->enable_transmit_sa)
9435b9c547cSRui Paulo 		return -1;
94485732ac8SCy Schubert 	return wpa_s->driver->enable_transmit_sa(wpa_s->drv_priv, sa);
9455b9c547cSRui Paulo }
9465b9c547cSRui Paulo 
9475b9c547cSRui Paulo static inline int wpa_drv_disable_transmit_sa(struct wpa_supplicant *wpa_s,
94885732ac8SCy Schubert 					      struct transmit_sa *sa)
9495b9c547cSRui Paulo {
9505b9c547cSRui Paulo 	if (!wpa_s->driver->disable_transmit_sa)
9515b9c547cSRui Paulo 		return -1;
95285732ac8SCy Schubert 	return wpa_s->driver->disable_transmit_sa(wpa_s->drv_priv, sa);
9535b9c547cSRui Paulo }
9545b9c547cSRui Paulo #endif /* CONFIG_MACSEC */
9555b9c547cSRui Paulo 
956325151a3SRui Paulo static inline int wpa_drv_setband(struct wpa_supplicant *wpa_s,
957*c1d255d3SCy Schubert 				  u32 band_mask)
958325151a3SRui Paulo {
959325151a3SRui Paulo 	if (!wpa_s->driver->set_band)
960325151a3SRui Paulo 		return -1;
961*c1d255d3SCy Schubert 	return wpa_s->driver->set_band(wpa_s->drv_priv, band_mask);
962325151a3SRui Paulo }
963325151a3SRui Paulo 
964325151a3SRui Paulo static inline int wpa_drv_get_pref_freq_list(struct wpa_supplicant *wpa_s,
965325151a3SRui Paulo 					     enum wpa_driver_if_type if_type,
966325151a3SRui Paulo 					     unsigned int *num,
967325151a3SRui Paulo 					     unsigned int *freq_list)
968325151a3SRui Paulo {
96985732ac8SCy Schubert #ifdef CONFIG_TESTING_OPTIONS
97085732ac8SCy Schubert 	if (wpa_s->get_pref_freq_list_override)
97185732ac8SCy Schubert 		return wpas_ctrl_iface_get_pref_freq_list_override(
97285732ac8SCy Schubert 			wpa_s, if_type, num, freq_list);
97385732ac8SCy Schubert #endif /* CONFIG_TESTING_OPTIONS */
974325151a3SRui Paulo 	if (!wpa_s->driver->get_pref_freq_list)
975325151a3SRui Paulo 		return -1;
976325151a3SRui Paulo 	return wpa_s->driver->get_pref_freq_list(wpa_s->drv_priv, if_type,
977325151a3SRui Paulo 						 num, freq_list);
978325151a3SRui Paulo }
979325151a3SRui Paulo 
980325151a3SRui Paulo static inline int wpa_drv_set_prob_oper_freq(struct wpa_supplicant *wpa_s,
981325151a3SRui Paulo 					     unsigned int freq)
982325151a3SRui Paulo {
983325151a3SRui Paulo 	if (!wpa_s->driver->set_prob_oper_freq)
984325151a3SRui Paulo 		return 0;
985325151a3SRui Paulo 	return wpa_s->driver->set_prob_oper_freq(wpa_s->drv_priv, freq);
986325151a3SRui Paulo }
987325151a3SRui Paulo 
98885732ac8SCy Schubert static inline int wpa_drv_abort_scan(struct wpa_supplicant *wpa_s,
98985732ac8SCy Schubert 				     u64 scan_cookie)
990780fb4a2SCy Schubert {
991780fb4a2SCy Schubert 	if (!wpa_s->driver->abort_scan)
992780fb4a2SCy Schubert 		return -1;
99385732ac8SCy Schubert 	return wpa_s->driver->abort_scan(wpa_s->drv_priv, scan_cookie);
994780fb4a2SCy Schubert }
995780fb4a2SCy Schubert 
996780fb4a2SCy Schubert static inline int wpa_drv_configure_frame_filters(struct wpa_supplicant *wpa_s,
997780fb4a2SCy Schubert 						  u32 filters)
998780fb4a2SCy Schubert {
999780fb4a2SCy Schubert 	if (!wpa_s->driver->configure_data_frame_filters)
1000780fb4a2SCy Schubert 		return -1;
1001780fb4a2SCy Schubert 	return wpa_s->driver->configure_data_frame_filters(wpa_s->drv_priv,
1002780fb4a2SCy Schubert 							   filters);
1003780fb4a2SCy Schubert }
1004780fb4a2SCy Schubert 
1005780fb4a2SCy Schubert static inline int wpa_drv_get_ext_capa(struct wpa_supplicant *wpa_s,
1006780fb4a2SCy Schubert 				       enum wpa_driver_if_type type)
1007780fb4a2SCy Schubert {
1008780fb4a2SCy Schubert 	if (!wpa_s->driver->get_ext_capab)
1009780fb4a2SCy Schubert 		return -1;
1010780fb4a2SCy Schubert 	return wpa_s->driver->get_ext_capab(wpa_s->drv_priv, type,
1011780fb4a2SCy Schubert 					    &wpa_s->extended_capa,
1012780fb4a2SCy Schubert 					    &wpa_s->extended_capa_mask,
1013780fb4a2SCy Schubert 					    &wpa_s->extended_capa_len);
1014780fb4a2SCy Schubert }
1015780fb4a2SCy Schubert 
1016780fb4a2SCy Schubert static inline int wpa_drv_p2p_lo_start(struct wpa_supplicant *wpa_s,
1017780fb4a2SCy Schubert 				       unsigned int channel,
1018780fb4a2SCy Schubert 				       unsigned int period,
1019780fb4a2SCy Schubert 				       unsigned int interval,
1020780fb4a2SCy Schubert 				       unsigned int count,
1021780fb4a2SCy Schubert 				       const u8 *device_types,
1022780fb4a2SCy Schubert 				       size_t dev_types_len,
1023780fb4a2SCy Schubert 				       const u8 *ies, size_t ies_len)
1024780fb4a2SCy Schubert {
1025780fb4a2SCy Schubert 	if (!wpa_s->driver->p2p_lo_start)
1026780fb4a2SCy Schubert 		return -1;
1027780fb4a2SCy Schubert 	return wpa_s->driver->p2p_lo_start(wpa_s->drv_priv, channel, period,
1028780fb4a2SCy Schubert 					   interval, count, device_types,
1029780fb4a2SCy Schubert 					   dev_types_len, ies, ies_len);
1030780fb4a2SCy Schubert }
1031780fb4a2SCy Schubert 
1032780fb4a2SCy Schubert static inline int wpa_drv_p2p_lo_stop(struct wpa_supplicant *wpa_s)
1033780fb4a2SCy Schubert {
1034780fb4a2SCy Schubert 	if (!wpa_s->driver->p2p_lo_stop)
1035780fb4a2SCy Schubert 		return -1;
1036780fb4a2SCy Schubert 	return wpa_s->driver->p2p_lo_stop(wpa_s->drv_priv);
1037780fb4a2SCy Schubert }
1038780fb4a2SCy Schubert 
1039780fb4a2SCy Schubert static inline int wpa_drv_set_default_scan_ies(struct wpa_supplicant *wpa_s,
1040780fb4a2SCy Schubert 					       const u8 *ies, size_t len)
1041780fb4a2SCy Schubert {
1042780fb4a2SCy Schubert 	if (!wpa_s->driver->set_default_scan_ies)
1043780fb4a2SCy Schubert 		return -1;
1044780fb4a2SCy Schubert 	return wpa_s->driver->set_default_scan_ies(wpa_s->drv_priv, ies, len);
1045780fb4a2SCy Schubert }
1046780fb4a2SCy Schubert 
104785732ac8SCy Schubert static inline int wpa_drv_set_tdls_mode(struct wpa_supplicant *wpa_s,
104885732ac8SCy Schubert 					int tdls_external_control)
104985732ac8SCy Schubert {
105085732ac8SCy Schubert 	if (!wpa_s->driver->set_tdls_mode)
105185732ac8SCy Schubert 		return -1;
105285732ac8SCy Schubert 	return wpa_s->driver->set_tdls_mode(wpa_s->drv_priv,
105385732ac8SCy Schubert 					    tdls_external_control);
105485732ac8SCy Schubert }
105585732ac8SCy Schubert 
105685732ac8SCy Schubert static inline struct wpa_bss_candidate_info *
105785732ac8SCy Schubert wpa_drv_get_bss_trans_status(struct wpa_supplicant *wpa_s,
105885732ac8SCy Schubert 			     struct wpa_bss_trans_info *params)
105985732ac8SCy Schubert {
106085732ac8SCy Schubert 	if (!wpa_s->driver->get_bss_transition_status)
106185732ac8SCy Schubert 		return NULL;
106285732ac8SCy Schubert 	return wpa_s->driver->get_bss_transition_status(wpa_s->drv_priv,
106385732ac8SCy Schubert 							params);
106485732ac8SCy Schubert }
106585732ac8SCy Schubert 
106685732ac8SCy Schubert static inline int wpa_drv_ignore_assoc_disallow(struct wpa_supplicant *wpa_s,
106785732ac8SCy Schubert 						int val)
106885732ac8SCy Schubert {
106985732ac8SCy Schubert 	if (!wpa_s->driver->ignore_assoc_disallow)
107085732ac8SCy Schubert 		return -1;
107185732ac8SCy Schubert 	return wpa_s->driver->ignore_assoc_disallow(wpa_s->drv_priv, val);
107285732ac8SCy Schubert }
107385732ac8SCy Schubert 
1074*c1d255d3SCy Schubert static inline int wpa_drv_set_bssid_tmp_disallow(struct wpa_supplicant *wpa_s,
107585732ac8SCy Schubert 						 unsigned int num_bssid,
107685732ac8SCy Schubert 						 const u8 *bssids)
107785732ac8SCy Schubert {
1078*c1d255d3SCy Schubert 	if (!wpa_s->driver->set_bssid_tmp_disallow)
107985732ac8SCy Schubert 		return -1;
1080*c1d255d3SCy Schubert 	return wpa_s->driver->set_bssid_tmp_disallow(wpa_s->drv_priv, num_bssid,
108185732ac8SCy Schubert 						     bssids);
108285732ac8SCy Schubert }
108385732ac8SCy Schubert 
108485732ac8SCy Schubert static inline int wpa_drv_update_connect_params(
108585732ac8SCy Schubert 	struct wpa_supplicant *wpa_s,
108685732ac8SCy Schubert 	struct wpa_driver_associate_params *params,
108785732ac8SCy Schubert 	enum wpa_drv_update_connect_params_mask mask)
108885732ac8SCy Schubert {
108985732ac8SCy Schubert 	if (!wpa_s->driver->update_connect_params)
109085732ac8SCy Schubert 		return -1;
109185732ac8SCy Schubert 	return wpa_s->driver->update_connect_params(wpa_s->drv_priv, params,
109285732ac8SCy Schubert 						    mask);
109385732ac8SCy Schubert }
109485732ac8SCy Schubert 
109585732ac8SCy Schubert static inline int
109685732ac8SCy Schubert wpa_drv_send_external_auth_status(struct wpa_supplicant *wpa_s,
109785732ac8SCy Schubert 				  struct external_auth *params)
109885732ac8SCy Schubert {
109985732ac8SCy Schubert 	if (!wpa_s->driver->send_external_auth_status)
110085732ac8SCy Schubert 		return -1;
110185732ac8SCy Schubert 	return wpa_s->driver->send_external_auth_status(wpa_s->drv_priv,
110285732ac8SCy Schubert 							params);
110385732ac8SCy Schubert }
110485732ac8SCy Schubert 
11054bc52338SCy Schubert static inline int wpa_drv_set_4addr_mode(struct wpa_supplicant *wpa_s, int val)
11064bc52338SCy Schubert {
11074bc52338SCy Schubert 	if (!wpa_s->driver->set_4addr_mode)
11084bc52338SCy Schubert 		return -1;
11094bc52338SCy Schubert 	return wpa_s->driver->set_4addr_mode(wpa_s->drv_priv,
11104bc52338SCy Schubert 					     wpa_s->bridge_ifname, val);
11114bc52338SCy Schubert }
11124bc52338SCy Schubert 
1113*c1d255d3SCy Schubert static inline int wpa_drv_dpp_listen(struct wpa_supplicant *wpa_s, bool enable)
1114*c1d255d3SCy Schubert {
1115*c1d255d3SCy Schubert 	if (!wpa_s->driver->dpp_listen)
1116*c1d255d3SCy Schubert 		return 0;
1117*c1d255d3SCy Schubert 	return wpa_s->driver->dpp_listen(wpa_s->drv_priv, enable);
1118*c1d255d3SCy Schubert }
1119*c1d255d3SCy Schubert 
1120e28a4053SRui Paulo #endif /* DRIVER_I_H */
1121