xref: /freebsd/contrib/wpa/wpa_supplicant/driver_i.h (revision a90b9d0159070121c221b966469c3e36d912bf82)
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 */
wpa_drv_init(struct wpa_supplicant * wpa_s,const char * ifname)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 
wpa_drv_deinit(struct wpa_supplicant * wpa_s)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 
wpa_drv_set_param(struct wpa_supplicant * wpa_s,const char * param)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 
wpa_drv_set_countermeasures(struct wpa_supplicant * wpa_s,int enabled)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 
wpa_drv_authenticate(struct wpa_supplicant * wpa_s,struct wpa_driver_auth_params * params)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 
wpa_drv_associate(struct wpa_supplicant * wpa_s,struct wpa_driver_associate_params * params)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) {
63*a90b9d01SCy Schubert 		if (params)
64*a90b9d01SCy Schubert 			params->freq.link_id = -1;
65*a90b9d01SCy Schubert 
66e28a4053SRui Paulo 		return wpa_s->driver->associate(wpa_s->drv_priv, params);
67e28a4053SRui Paulo 	}
68e28a4053SRui Paulo 	return -1;
69e28a4053SRui Paulo }
70e28a4053SRui Paulo 
wpa_drv_init_mesh(struct wpa_supplicant * wpa_s)715b9c547cSRui Paulo static inline int wpa_drv_init_mesh(struct wpa_supplicant *wpa_s)
725b9c547cSRui Paulo {
735b9c547cSRui Paulo 	if (wpa_s->driver->init_mesh)
745b9c547cSRui Paulo 		return wpa_s->driver->init_mesh(wpa_s->drv_priv);
755b9c547cSRui Paulo 	return -1;
765b9c547cSRui Paulo }
775b9c547cSRui Paulo 
wpa_drv_join_mesh(struct wpa_supplicant * wpa_s,struct wpa_driver_mesh_join_params * params)785b9c547cSRui Paulo static inline int wpa_drv_join_mesh(struct wpa_supplicant *wpa_s,
795b9c547cSRui Paulo 				    struct wpa_driver_mesh_join_params *params)
805b9c547cSRui Paulo {
815b9c547cSRui Paulo 	if (wpa_s->driver->join_mesh)
825b9c547cSRui Paulo 		return wpa_s->driver->join_mesh(wpa_s->drv_priv, params);
835b9c547cSRui Paulo 	return -1;
845b9c547cSRui Paulo }
855b9c547cSRui Paulo 
wpa_drv_leave_mesh(struct wpa_supplicant * wpa_s)865b9c547cSRui Paulo static inline int wpa_drv_leave_mesh(struct wpa_supplicant *wpa_s)
875b9c547cSRui Paulo {
885b9c547cSRui Paulo 	if (wpa_s->driver->leave_mesh)
895b9c547cSRui Paulo 		return wpa_s->driver->leave_mesh(wpa_s->drv_priv);
905b9c547cSRui Paulo 	return -1;
915b9c547cSRui Paulo }
925b9c547cSRui Paulo 
wpa_drv_mesh_link_probe(struct wpa_supplicant * wpa_s,const u8 * addr,const u8 * eth,size_t len)93206b73d0SCy Schubert static inline int wpa_drv_mesh_link_probe(struct wpa_supplicant *wpa_s,
94206b73d0SCy Schubert 					  const u8 *addr,
95206b73d0SCy Schubert 					  const u8 *eth, size_t len)
96206b73d0SCy Schubert {
97206b73d0SCy Schubert 	if (wpa_s->driver->probe_mesh_link)
98206b73d0SCy Schubert 		return wpa_s->driver->probe_mesh_link(wpa_s->drv_priv, addr,
99206b73d0SCy Schubert 						      eth, len);
100206b73d0SCy Schubert 	return -1;
101206b73d0SCy Schubert }
102206b73d0SCy Schubert 
wpa_drv_scan(struct wpa_supplicant * wpa_s,struct wpa_driver_scan_params * params)103e28a4053SRui Paulo static inline int wpa_drv_scan(struct wpa_supplicant *wpa_s,
104e28a4053SRui Paulo 			       struct wpa_driver_scan_params *params)
105e28a4053SRui Paulo {
1065b9c547cSRui Paulo #ifdef CONFIG_TESTING_OPTIONS
1075b9c547cSRui Paulo 	if (wpa_s->test_failure == WPAS_TEST_FAILURE_SCAN_TRIGGER)
1085b9c547cSRui Paulo 		return -EBUSY;
1095b9c547cSRui Paulo #endif /* CONFIG_TESTING_OPTIONS */
110e28a4053SRui Paulo 	if (wpa_s->driver->scan2)
111e28a4053SRui Paulo 		return wpa_s->driver->scan2(wpa_s->drv_priv, params);
112e28a4053SRui Paulo 	return -1;
113e28a4053SRui Paulo }
114e28a4053SRui Paulo 
wpa_drv_sched_scan(struct wpa_supplicant * wpa_s,struct wpa_driver_scan_params * params)115f05cddf9SRui Paulo static inline int wpa_drv_sched_scan(struct wpa_supplicant *wpa_s,
116780fb4a2SCy Schubert 				     struct wpa_driver_scan_params *params)
117f05cddf9SRui Paulo {
118f05cddf9SRui Paulo 	if (wpa_s->driver->sched_scan)
119780fb4a2SCy Schubert 		return wpa_s->driver->sched_scan(wpa_s->drv_priv, params);
120f05cddf9SRui Paulo 	return -1;
121f05cddf9SRui Paulo }
122f05cddf9SRui Paulo 
wpa_drv_stop_sched_scan(struct wpa_supplicant * wpa_s)123f05cddf9SRui Paulo static inline int wpa_drv_stop_sched_scan(struct wpa_supplicant *wpa_s)
124f05cddf9SRui Paulo {
125f05cddf9SRui Paulo 	if (wpa_s->driver->stop_sched_scan)
126f05cddf9SRui Paulo 		return wpa_s->driver->stop_sched_scan(wpa_s->drv_priv);
127f05cddf9SRui Paulo 	return -1;
128f05cddf9SRui Paulo }
129f05cddf9SRui Paulo 
130c1d255d3SCy Schubert struct wpa_scan_results *
131*a90b9d01SCy Schubert wpa_drv_get_scan_results(struct wpa_supplicant *wpa_s, const u8 *bssid);
132e28a4053SRui Paulo 
wpa_drv_get_bssid(struct wpa_supplicant * wpa_s,u8 * bssid)133e28a4053SRui Paulo static inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid)
134e28a4053SRui Paulo {
135e28a4053SRui Paulo 	if (wpa_s->driver->get_bssid) {
136e28a4053SRui Paulo 		return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid);
137e28a4053SRui Paulo 	}
138e28a4053SRui Paulo 	return -1;
139e28a4053SRui Paulo }
140e28a4053SRui Paulo 
wpa_drv_get_ssid(struct wpa_supplicant * wpa_s,u8 * ssid)141e28a4053SRui Paulo static inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid)
142e28a4053SRui Paulo {
143e28a4053SRui Paulo 	if (wpa_s->driver->get_ssid) {
144e28a4053SRui Paulo 		return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid);
145e28a4053SRui Paulo 	}
146e28a4053SRui Paulo 	return -1;
147e28a4053SRui Paulo }
148e28a4053SRui Paulo 
wpa_drv_set_key(struct wpa_supplicant * wpa_s,int link_id,enum wpa_alg alg,const u8 * addr,int key_idx,int set_tx,const u8 * seq,size_t seq_len,const u8 * key,size_t key_len,enum key_flag key_flag)149*a90b9d01SCy Schubert static inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s, int link_id,
150e28a4053SRui Paulo 				  enum wpa_alg alg, const u8 *addr,
151e28a4053SRui Paulo 				  int key_idx, int set_tx,
152e28a4053SRui Paulo 				  const u8 *seq, size_t seq_len,
153c1d255d3SCy Schubert 				  const u8 *key, size_t key_len,
154c1d255d3SCy Schubert 				  enum key_flag key_flag)
155e28a4053SRui Paulo {
156c1d255d3SCy Schubert 	struct wpa_driver_set_key_params params;
157c1d255d3SCy Schubert 
158c1d255d3SCy Schubert 	os_memset(&params, 0, sizeof(params));
159c1d255d3SCy Schubert 	params.ifname = wpa_s->ifname;
160c1d255d3SCy Schubert 	params.alg = alg;
161c1d255d3SCy Schubert 	params.addr = addr;
162c1d255d3SCy Schubert 	params.key_idx = key_idx;
163c1d255d3SCy Schubert 	params.set_tx = set_tx;
164c1d255d3SCy Schubert 	params.seq = seq;
165c1d255d3SCy Schubert 	params.seq_len = seq_len;
166c1d255d3SCy Schubert 	params.key = key;
167c1d255d3SCy Schubert 	params.key_len = key_len;
168c1d255d3SCy Schubert 	params.key_flag = key_flag;
169*a90b9d01SCy Schubert 	params.link_id = link_id;
170c1d255d3SCy Schubert 
1715b9c547cSRui Paulo 	if (alg != WPA_ALG_NONE) {
172c1d255d3SCy Schubert 		/* keyidx = 1 can be either a broadcast or--with
173c1d255d3SCy Schubert 		 * Extended Key ID--a unicast key. Use bit 15 for
174c1d255d3SCy Schubert 		 * the pairwise keyidx 1 which is hopefully high enough
175c1d255d3SCy Schubert 		 * to not clash with future extensions.
176c1d255d3SCy Schubert 		 */
177c1d255d3SCy Schubert 		if (key_idx == 1 && (key_flag & KEY_FLAG_PAIRWISE))
178c1d255d3SCy Schubert 			wpa_s->keys_cleared &= ~BIT(15);
179c1d255d3SCy Schubert 		else if (key_idx >= 0 && key_idx <= 5)
1805b9c547cSRui Paulo 			wpa_s->keys_cleared &= ~BIT(key_idx);
1815b9c547cSRui Paulo 		else
182e28a4053SRui Paulo 			wpa_s->keys_cleared = 0;
1835b9c547cSRui Paulo 	}
1845b9c547cSRui Paulo 	if (wpa_s->driver->set_key) {
185c1d255d3SCy Schubert 		return wpa_s->driver->set_key(wpa_s->drv_priv, &params);
186e28a4053SRui Paulo 	}
187e28a4053SRui Paulo 	return -1;
188e28a4053SRui Paulo }
189e28a4053SRui Paulo 
wpa_drv_get_seqnum(struct wpa_supplicant * wpa_s,const u8 * addr,int idx,u8 * seq)190780fb4a2SCy Schubert static inline int wpa_drv_get_seqnum(struct wpa_supplicant *wpa_s,
191780fb4a2SCy Schubert 				     const u8 *addr, int idx, u8 *seq)
192780fb4a2SCy Schubert {
193780fb4a2SCy Schubert 	if (wpa_s->driver->get_seqnum)
194780fb4a2SCy Schubert 		return wpa_s->driver->get_seqnum(wpa_s->ifname, wpa_s->drv_priv,
195*a90b9d01SCy Schubert 						 addr, idx, -1, seq);
196780fb4a2SCy Schubert 	return -1;
197780fb4a2SCy Schubert }
198780fb4a2SCy Schubert 
wpa_drv_sta_deauth(struct wpa_supplicant * wpa_s,const u8 * addr,u16 reason_code)1995b9c547cSRui Paulo static inline int wpa_drv_sta_deauth(struct wpa_supplicant *wpa_s,
200206b73d0SCy Schubert 				     const u8 *addr, u16 reason_code)
2015b9c547cSRui Paulo {
2025b9c547cSRui Paulo 	if (wpa_s->driver->sta_deauth) {
2035b9c547cSRui Paulo 		return wpa_s->driver->sta_deauth(wpa_s->drv_priv,
2045b9c547cSRui Paulo 						 wpa_s->own_addr, addr,
205*a90b9d01SCy Schubert 						 reason_code, -1);
2065b9c547cSRui Paulo 	}
2075b9c547cSRui Paulo 	return -1;
2085b9c547cSRui Paulo }
2095b9c547cSRui Paulo 
wpa_drv_deauthenticate(struct wpa_supplicant * wpa_s,const u8 * addr,u16 reason_code)210e28a4053SRui Paulo static inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
211206b73d0SCy Schubert 					 const u8 *addr, u16 reason_code)
212e28a4053SRui Paulo {
213e28a4053SRui Paulo 	if (wpa_s->driver->deauthenticate) {
214e28a4053SRui Paulo 		return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
215e28a4053SRui Paulo 						     reason_code);
216e28a4053SRui Paulo 	}
217e28a4053SRui Paulo 	return -1;
218e28a4053SRui Paulo }
219e28a4053SRui Paulo 
wpa_drv_add_pmkid(struct wpa_supplicant * wpa_s,struct wpa_pmkid_params * params)220e28a4053SRui Paulo static inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
22185732ac8SCy Schubert 				    struct wpa_pmkid_params *params)
222e28a4053SRui Paulo {
223e28a4053SRui Paulo 	if (wpa_s->driver->add_pmkid) {
22485732ac8SCy Schubert 		return wpa_s->driver->add_pmkid(wpa_s->drv_priv, params);
225e28a4053SRui Paulo 	}
226e28a4053SRui Paulo 	return -1;
227e28a4053SRui Paulo }
228e28a4053SRui Paulo 
wpa_drv_remove_pmkid(struct wpa_supplicant * wpa_s,struct wpa_pmkid_params * params)229e28a4053SRui Paulo static inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
23085732ac8SCy Schubert 				       struct wpa_pmkid_params *params)
231e28a4053SRui Paulo {
232e28a4053SRui Paulo 	if (wpa_s->driver->remove_pmkid) {
23385732ac8SCy Schubert 		return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, params);
234e28a4053SRui Paulo 	}
235e28a4053SRui Paulo 	return -1;
236e28a4053SRui Paulo }
237e28a4053SRui Paulo 
wpa_drv_flush_pmkid(struct wpa_supplicant * wpa_s)238e28a4053SRui Paulo static inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
239e28a4053SRui Paulo {
240e28a4053SRui Paulo 	if (wpa_s->driver->flush_pmkid) {
241e28a4053SRui Paulo 		return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
242e28a4053SRui Paulo 	}
243e28a4053SRui Paulo 	return -1;
244e28a4053SRui Paulo }
245e28a4053SRui Paulo 
wpa_drv_get_capa(struct wpa_supplicant * wpa_s,struct wpa_driver_capa * capa)246e28a4053SRui Paulo static inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
247e28a4053SRui Paulo 				   struct wpa_driver_capa *capa)
248e28a4053SRui Paulo {
249e28a4053SRui Paulo 	if (wpa_s->driver->get_capa) {
250e28a4053SRui Paulo 		return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
251e28a4053SRui Paulo 	}
252e28a4053SRui Paulo 	return -1;
253e28a4053SRui Paulo }
254e28a4053SRui Paulo 
wpa_drv_poll(struct wpa_supplicant * wpa_s)255e28a4053SRui Paulo static inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
256e28a4053SRui Paulo {
257e28a4053SRui Paulo 	if (wpa_s->driver->poll) {
258e28a4053SRui Paulo 		wpa_s->driver->poll(wpa_s->drv_priv);
259e28a4053SRui Paulo 	}
260e28a4053SRui Paulo }
261e28a4053SRui Paulo 
wpa_drv_get_ifname(struct wpa_supplicant * wpa_s)262e28a4053SRui Paulo static inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
263e28a4053SRui Paulo {
264e28a4053SRui Paulo 	if (wpa_s->driver->get_ifname) {
265e28a4053SRui Paulo 		return wpa_s->driver->get_ifname(wpa_s->drv_priv);
266e28a4053SRui Paulo 	}
267e28a4053SRui Paulo 	return NULL;
268e28a4053SRui Paulo }
269e28a4053SRui Paulo 
2705b9c547cSRui Paulo static inline const char *
wpa_driver_get_radio_name(struct wpa_supplicant * wpa_s)2715b9c547cSRui Paulo wpa_driver_get_radio_name(struct wpa_supplicant *wpa_s)
2725b9c547cSRui Paulo {
2735b9c547cSRui Paulo 	if (wpa_s->driver->get_radio_name)
2745b9c547cSRui Paulo 		return wpa_s->driver->get_radio_name(wpa_s->drv_priv);
2755b9c547cSRui Paulo 	return NULL;
2765b9c547cSRui Paulo }
2775b9c547cSRui Paulo 
wpa_drv_get_mac_addr(struct wpa_supplicant * wpa_s)278e28a4053SRui Paulo static inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
279e28a4053SRui Paulo {
280e28a4053SRui Paulo 	if (wpa_s->driver->get_mac_addr) {
281e28a4053SRui Paulo 		return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
282e28a4053SRui Paulo 	}
283e28a4053SRui Paulo 	return NULL;
284e28a4053SRui Paulo }
285e28a4053SRui Paulo 
wpa_drv_set_operstate(struct wpa_supplicant * wpa_s,int state)286e28a4053SRui Paulo static inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
287e28a4053SRui Paulo 					int state)
288e28a4053SRui Paulo {
289e28a4053SRui Paulo 	if (wpa_s->driver->set_operstate)
290e28a4053SRui Paulo 		return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
291e28a4053SRui Paulo 	return 0;
292e28a4053SRui Paulo }
293e28a4053SRui Paulo 
wpa_drv_mlme_setprotection(struct wpa_supplicant * wpa_s,const u8 * addr,int protect_type,int key_type)294e28a4053SRui Paulo static inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
295e28a4053SRui Paulo 					     const u8 *addr, int protect_type,
296e28a4053SRui Paulo 					     int key_type)
297e28a4053SRui Paulo {
298e28a4053SRui Paulo 	if (wpa_s->driver->mlme_setprotection)
299e28a4053SRui Paulo 		return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
300e28a4053SRui Paulo 							 protect_type,
301e28a4053SRui Paulo 							 key_type);
302e28a4053SRui Paulo 	return 0;
303e28a4053SRui Paulo }
304e28a4053SRui Paulo 
305e28a4053SRui Paulo static inline struct hostapd_hw_modes *
wpa_drv_get_hw_feature_data(struct wpa_supplicant * wpa_s,u16 * num_modes,u16 * flags,u8 * dfs_domain)306e28a4053SRui Paulo wpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
30785732ac8SCy Schubert 			    u16 *flags, u8 *dfs_domain)
308e28a4053SRui Paulo {
309e28a4053SRui Paulo 	if (wpa_s->driver->get_hw_feature_data)
310e28a4053SRui Paulo 		return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
31185732ac8SCy Schubert 							  num_modes, flags,
31285732ac8SCy Schubert 							  dfs_domain);
313e28a4053SRui Paulo 	return NULL;
314e28a4053SRui Paulo }
315e28a4053SRui Paulo 
wpa_drv_set_country(struct wpa_supplicant * wpa_s,const char * alpha2)316e28a4053SRui Paulo static inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
317e28a4053SRui Paulo 				      const char *alpha2)
318e28a4053SRui Paulo {
319e28a4053SRui Paulo 	if (wpa_s->driver->set_country)
320e28a4053SRui Paulo 		return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
321e28a4053SRui Paulo 	return 0;
322e28a4053SRui Paulo }
323e28a4053SRui Paulo 
wpa_drv_send_mlme(struct wpa_supplicant * wpa_s,const u8 * data,size_t data_len,int noack,unsigned int freq,unsigned int wait)324e28a4053SRui Paulo static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
325325151a3SRui Paulo 				    const u8 *data, size_t data_len, int noack,
326c1d255d3SCy Schubert 				    unsigned int freq, unsigned int wait)
327e28a4053SRui Paulo {
328e28a4053SRui Paulo 	if (wpa_s->driver->send_mlme)
329e28a4053SRui Paulo 		return wpa_s->driver->send_mlme(wpa_s->drv_priv,
330325151a3SRui Paulo 						data, data_len, noack,
331*a90b9d01SCy Schubert 						freq, NULL, 0, 0, wait, -1);
332e28a4053SRui Paulo 	return -1;
333e28a4053SRui Paulo }
334e28a4053SRui Paulo 
wpa_drv_update_ft_ies(struct wpa_supplicant * wpa_s,const u8 * md,const u8 * ies,size_t ies_len)335e28a4053SRui Paulo static inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
336e28a4053SRui Paulo 					const u8 *md,
337e28a4053SRui Paulo 					const u8 *ies, size_t ies_len)
338e28a4053SRui Paulo {
339e28a4053SRui Paulo 	if (wpa_s->driver->update_ft_ies)
340e28a4053SRui Paulo 		return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
341e28a4053SRui Paulo 						    ies, ies_len);
342e28a4053SRui Paulo 	return -1;
343e28a4053SRui Paulo }
344e28a4053SRui Paulo 
wpa_drv_sta_add(struct wpa_supplicant * wpa_s,struct hostapd_sta_add_params * params)345e28a4053SRui Paulo static inline int wpa_drv_sta_add(struct wpa_supplicant *wpa_s,
346e28a4053SRui Paulo 				  struct hostapd_sta_add_params *params)
347e28a4053SRui Paulo {
348*a90b9d01SCy Schubert 	if (wpa_s->driver->sta_add) {
349*a90b9d01SCy Schubert 		/* Set link_id to -1 for non-TDLS peers */
350*a90b9d01SCy Schubert 		if (!(params->flags & WPA_STA_TDLS_PEER))
351*a90b9d01SCy Schubert 			params->mld_link_id = -1;
352e28a4053SRui Paulo 		return wpa_s->driver->sta_add(wpa_s->drv_priv, params);
353*a90b9d01SCy Schubert 	}
354e28a4053SRui Paulo 	return -1;
355e28a4053SRui Paulo }
356e28a4053SRui Paulo 
wpa_drv_sta_remove(struct wpa_supplicant * wpa_s,const u8 * addr)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 
wpa_drv_tx_control_port(struct wpa_supplicant * wpa_s,const u8 * dest,u16 proto,const u8 * buf,size_t len,int no_encrypt)365c1d255d3SCy Schubert static inline int wpa_drv_tx_control_port(struct wpa_supplicant *wpa_s,
366c1d255d3SCy Schubert 					  const u8 *dest, u16 proto,
367c1d255d3SCy Schubert 					  const u8 *buf, size_t len,
368c1d255d3SCy Schubert 					  int no_encrypt)
369c1d255d3SCy Schubert {
370c1d255d3SCy Schubert 	if (!wpa_s->driver->tx_control_port)
371c1d255d3SCy Schubert 		return -1;
372c1d255d3SCy Schubert 	return wpa_s->driver->tx_control_port(wpa_s->drv_priv, dest, proto,
373*a90b9d01SCy Schubert 					      buf, len, no_encrypt, -1);
374c1d255d3SCy Schubert }
375c1d255d3SCy Schubert 
wpa_drv_hapd_send_eapol(struct wpa_supplicant * wpa_s,const u8 * addr,const u8 * data,size_t data_len,int encrypt,const u8 * own_addr,u32 flags)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,
384*a90b9d01SCy Schubert 						      own_addr, flags, -1);
385e28a4053SRui Paulo 	return -1;
386e28a4053SRui Paulo }
387e28a4053SRui Paulo 
wpa_drv_sta_set_flags(struct wpa_supplicant * wpa_s,const u8 * addr,int total_flags,int flags_or,int flags_and)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 
wpa_drv_set_supp_port(struct wpa_supplicant * wpa_s,int authorized)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 
409*a90b9d01SCy Schubert int wpa_drv_send_action(struct wpa_supplicant *wpa_s, unsigned int freq,
410*a90b9d01SCy Schubert 			unsigned int wait, const u8 *dst, const u8 *src,
411*a90b9d01SCy Schubert 			const u8 *bssid, const u8 *data, size_t data_len,
412*a90b9d01SCy Schubert 			int no_cck);
413f05cddf9SRui Paulo 
wpa_drv_send_action_cancel_wait(struct wpa_supplicant * wpa_s)414f05cddf9SRui Paulo static inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
415f05cddf9SRui Paulo {
416f05cddf9SRui Paulo 	if (wpa_s->driver->send_action_cancel_wait)
417f05cddf9SRui Paulo 		wpa_s->driver->send_action_cancel_wait(wpa_s->drv_priv);
418f05cddf9SRui Paulo }
419f05cddf9SRui Paulo 
wpa_drv_set_freq(struct wpa_supplicant * wpa_s,struct hostapd_freq_params * freq)420f05cddf9SRui Paulo static inline int wpa_drv_set_freq(struct wpa_supplicant *wpa_s,
421f05cddf9SRui Paulo 				   struct hostapd_freq_params *freq)
422f05cddf9SRui Paulo {
423f05cddf9SRui Paulo 	if (wpa_s->driver->set_freq)
424f05cddf9SRui Paulo 		return wpa_s->driver->set_freq(wpa_s->drv_priv, freq);
425e28a4053SRui Paulo 	return -1;
426e28a4053SRui Paulo }
427e28a4053SRui Paulo 
wpa_drv_if_add(struct wpa_supplicant * wpa_s,enum wpa_driver_if_type type,const char * ifname,const u8 * addr,void * bss_ctx,char * force_ifname,u8 * if_addr,const char * bridge)428e28a4053SRui Paulo static inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s,
429e28a4053SRui Paulo 				 enum wpa_driver_if_type type,
430e28a4053SRui Paulo 				 const char *ifname, const u8 *addr,
431e28a4053SRui Paulo 				 void *bss_ctx, char *force_ifname,
432f05cddf9SRui Paulo 				 u8 *if_addr, const char *bridge)
433e28a4053SRui Paulo {
434e28a4053SRui Paulo 	if (wpa_s->driver->if_add)
435e28a4053SRui Paulo 		return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname,
436e28a4053SRui Paulo 					     addr, bss_ctx, NULL, force_ifname,
437780fb4a2SCy Schubert 					     if_addr, bridge, 0, 0);
438e28a4053SRui Paulo 	return -1;
439e28a4053SRui Paulo }
440e28a4053SRui Paulo 
wpa_drv_if_remove(struct wpa_supplicant * wpa_s,enum wpa_driver_if_type type,const char * ifname)441e28a4053SRui Paulo static inline int wpa_drv_if_remove(struct wpa_supplicant *wpa_s,
442e28a4053SRui Paulo 				    enum wpa_driver_if_type type,
443e28a4053SRui Paulo 				    const char *ifname)
444e28a4053SRui Paulo {
445e28a4053SRui Paulo 	if (wpa_s->driver->if_remove)
446e28a4053SRui Paulo 		return wpa_s->driver->if_remove(wpa_s->drv_priv, type, ifname);
447e28a4053SRui Paulo 	return -1;
448e28a4053SRui Paulo }
449e28a4053SRui Paulo 
wpa_drv_remain_on_channel(struct wpa_supplicant * wpa_s,unsigned int freq,unsigned int duration)450e28a4053SRui Paulo static inline int wpa_drv_remain_on_channel(struct wpa_supplicant *wpa_s,
451e28a4053SRui Paulo 					    unsigned int freq,
452e28a4053SRui Paulo 					    unsigned int duration)
453e28a4053SRui Paulo {
454e28a4053SRui Paulo 	if (wpa_s->driver->remain_on_channel)
455e28a4053SRui Paulo 		return wpa_s->driver->remain_on_channel(wpa_s->drv_priv, freq,
456e28a4053SRui Paulo 							duration);
457e28a4053SRui Paulo 	return -1;
458e28a4053SRui Paulo }
459e28a4053SRui Paulo 
wpa_drv_cancel_remain_on_channel(struct wpa_supplicant * wpa_s)460e28a4053SRui Paulo static inline int wpa_drv_cancel_remain_on_channel(
461e28a4053SRui Paulo 	struct wpa_supplicant *wpa_s)
462e28a4053SRui Paulo {
463e28a4053SRui Paulo 	if (wpa_s->driver->cancel_remain_on_channel)
464e28a4053SRui Paulo 		return wpa_s->driver->cancel_remain_on_channel(
465e28a4053SRui Paulo 			wpa_s->drv_priv);
466e28a4053SRui Paulo 	return -1;
467e28a4053SRui Paulo }
468e28a4053SRui Paulo 
wpa_drv_probe_req_report(struct wpa_supplicant * wpa_s,int report)469e28a4053SRui Paulo static inline int wpa_drv_probe_req_report(struct wpa_supplicant *wpa_s,
470e28a4053SRui Paulo 					   int report)
471e28a4053SRui Paulo {
472e28a4053SRui Paulo 	if (wpa_s->driver->probe_req_report)
473e28a4053SRui Paulo 		return wpa_s->driver->probe_req_report(wpa_s->drv_priv,
474e28a4053SRui Paulo 						       report);
475e28a4053SRui Paulo 	return -1;
476e28a4053SRui Paulo }
477e28a4053SRui Paulo 
wpa_drv_deinit_ap(struct wpa_supplicant * wpa_s)478e28a4053SRui Paulo static inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
479e28a4053SRui Paulo {
480e28a4053SRui Paulo 	if (wpa_s->driver->deinit_ap)
481e28a4053SRui Paulo 		return wpa_s->driver->deinit_ap(wpa_s->drv_priv);
482e28a4053SRui Paulo 	return 0;
483e28a4053SRui Paulo }
484e28a4053SRui Paulo 
wpa_drv_deinit_p2p_cli(struct wpa_supplicant * wpa_s)485f05cddf9SRui Paulo static inline int wpa_drv_deinit_p2p_cli(struct wpa_supplicant *wpa_s)
486f05cddf9SRui Paulo {
487f05cddf9SRui Paulo 	if (wpa_s->driver->deinit_p2p_cli)
488f05cddf9SRui Paulo 		return wpa_s->driver->deinit_p2p_cli(wpa_s->drv_priv);
489f05cddf9SRui Paulo 	return 0;
490f05cddf9SRui Paulo }
491f05cddf9SRui Paulo 
wpa_drv_suspend(struct wpa_supplicant * wpa_s)492e28a4053SRui Paulo static inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
493e28a4053SRui Paulo {
494e28a4053SRui Paulo 	if (wpa_s->driver->suspend)
495e28a4053SRui Paulo 		wpa_s->driver->suspend(wpa_s->drv_priv);
496e28a4053SRui Paulo }
497e28a4053SRui Paulo 
wpa_drv_resume(struct wpa_supplicant * wpa_s)498e28a4053SRui Paulo static inline void wpa_drv_resume(struct wpa_supplicant *wpa_s)
499e28a4053SRui Paulo {
500e28a4053SRui Paulo 	if (wpa_s->driver->resume)
501e28a4053SRui Paulo 		wpa_s->driver->resume(wpa_s->drv_priv);
502e28a4053SRui Paulo }
503e28a4053SRui Paulo 
wpa_drv_signal_monitor(struct wpa_supplicant * wpa_s,int threshold,int hysteresis)504e28a4053SRui Paulo static inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s,
505e28a4053SRui Paulo 					 int threshold, int hysteresis)
506e28a4053SRui Paulo {
507e28a4053SRui Paulo 	if (wpa_s->driver->signal_monitor)
508e28a4053SRui Paulo 		return wpa_s->driver->signal_monitor(wpa_s->drv_priv,
509e28a4053SRui Paulo 						     threshold, hysteresis);
510e28a4053SRui Paulo 	return -1;
511e28a4053SRui Paulo }
512e28a4053SRui Paulo 
513c1d255d3SCy Schubert int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
514c1d255d3SCy Schubert 			struct wpa_signal_info *si);
515f05cddf9SRui Paulo 
wpa_drv_mlo_signal_poll(struct wpa_supplicant * wpa_s,struct wpa_mlo_signal_info * mlo_si)516*a90b9d01SCy Schubert static inline int wpa_drv_mlo_signal_poll(struct wpa_supplicant *wpa_s,
517*a90b9d01SCy Schubert 					  struct wpa_mlo_signal_info *mlo_si)
518*a90b9d01SCy Schubert {
519*a90b9d01SCy Schubert 	if (wpa_s->driver->mlo_signal_poll)
520*a90b9d01SCy Schubert 		return wpa_s->driver->mlo_signal_poll(wpa_s->drv_priv, mlo_si);
521*a90b9d01SCy Schubert 	return -1;
522*a90b9d01SCy Schubert }
523*a90b9d01SCy Schubert 
wpa_drv_channel_info(struct wpa_supplicant * wpa_s,struct wpa_channel_info * ci)5244bc52338SCy Schubert static inline int wpa_drv_channel_info(struct wpa_supplicant *wpa_s,
5254bc52338SCy Schubert 				       struct wpa_channel_info *ci)
5264bc52338SCy Schubert {
5274bc52338SCy Schubert 	if (wpa_s->driver->channel_info)
5284bc52338SCy Schubert 		return wpa_s->driver->channel_info(wpa_s->drv_priv, ci);
5294bc52338SCy Schubert 	return -1;
5304bc52338SCy Schubert }
5314bc52338SCy Schubert 
wpa_drv_pktcnt_poll(struct wpa_supplicant * wpa_s,struct hostap_sta_driver_data * sta)532f05cddf9SRui Paulo static inline int wpa_drv_pktcnt_poll(struct wpa_supplicant *wpa_s,
533f05cddf9SRui Paulo 				      struct hostap_sta_driver_data *sta)
534f05cddf9SRui Paulo {
535f05cddf9SRui Paulo 	if (wpa_s->driver->read_sta_data)
536f05cddf9SRui Paulo 		return wpa_s->driver->read_sta_data(wpa_s->drv_priv, sta,
537f05cddf9SRui Paulo 						    wpa_s->bssid);
538f05cddf9SRui Paulo 	return -1;
539f05cddf9SRui Paulo }
540f05cddf9SRui Paulo 
wpa_drv_set_ap_wps_ie(struct wpa_supplicant * wpa_s,const struct wpabuf * beacon,const struct wpabuf * proberesp,const struct wpabuf * assocresp)541e28a4053SRui Paulo static inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
542e28a4053SRui Paulo 					const struct wpabuf *beacon,
543f05cddf9SRui Paulo 					const struct wpabuf *proberesp,
544f05cddf9SRui Paulo 					const struct wpabuf *assocresp)
545e28a4053SRui Paulo {
546e28a4053SRui Paulo 	if (!wpa_s->driver->set_ap_wps_ie)
547e28a4053SRui Paulo 		return -1;
548e28a4053SRui Paulo 	return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon,
549f05cddf9SRui Paulo 					    proberesp, assocresp);
550f05cddf9SRui Paulo }
551f05cddf9SRui Paulo 
wpa_drv_get_noa(struct wpa_supplicant * wpa_s,u8 * buf,size_t buf_len)552f05cddf9SRui Paulo static inline int wpa_drv_get_noa(struct wpa_supplicant *wpa_s,
553f05cddf9SRui Paulo 				  u8 *buf, size_t buf_len)
554f05cddf9SRui Paulo {
555f05cddf9SRui Paulo 	if (!wpa_s->driver->get_noa)
556f05cddf9SRui Paulo 		return -1;
557f05cddf9SRui Paulo 	return wpa_s->driver->get_noa(wpa_s->drv_priv, buf, buf_len);
558f05cddf9SRui Paulo }
559f05cddf9SRui Paulo 
wpa_drv_set_p2p_powersave(struct wpa_supplicant * wpa_s,int legacy_ps,int opp_ps,int ctwindow)560f05cddf9SRui Paulo static inline int wpa_drv_set_p2p_powersave(struct wpa_supplicant *wpa_s,
561f05cddf9SRui Paulo 					    int legacy_ps, int opp_ps,
562f05cddf9SRui Paulo 					    int ctwindow)
563f05cddf9SRui Paulo {
564f05cddf9SRui Paulo 	if (!wpa_s->driver->set_p2p_powersave)
565f05cddf9SRui Paulo 		return -1;
566f05cddf9SRui Paulo 	return wpa_s->driver->set_p2p_powersave(wpa_s->drv_priv, legacy_ps,
567f05cddf9SRui Paulo 						opp_ps, ctwindow);
568f05cddf9SRui Paulo }
569f05cddf9SRui Paulo 
wpa_drv_ampdu(struct wpa_supplicant * wpa_s,int ampdu)570f05cddf9SRui Paulo static inline int wpa_drv_ampdu(struct wpa_supplicant *wpa_s, int ampdu)
571f05cddf9SRui Paulo {
572f05cddf9SRui Paulo 	if (!wpa_s->driver->ampdu)
573f05cddf9SRui Paulo 		return -1;
574f05cddf9SRui Paulo 	return wpa_s->driver->ampdu(wpa_s->drv_priv, ampdu);
575f05cddf9SRui Paulo }
576f05cddf9SRui Paulo 
wpa_drv_send_tdls_mgmt(struct wpa_supplicant * wpa_s,const u8 * dst,u8 action_code,u8 dialog_token,u16 status_code,u32 peer_capab,int initiator,const u8 * buf,size_t len,int link_id)577f05cddf9SRui Paulo static inline int wpa_drv_send_tdls_mgmt(struct wpa_supplicant *wpa_s,
578f05cddf9SRui Paulo 					 const u8 *dst, u8 action_code,
579f05cddf9SRui Paulo 					 u8 dialog_token, u16 status_code,
5805b9c547cSRui Paulo 					 u32 peer_capab, int initiator,
581*a90b9d01SCy Schubert 					 const u8 *buf, size_t len, int link_id)
582f05cddf9SRui Paulo {
583f05cddf9SRui Paulo 	if (wpa_s->driver->send_tdls_mgmt) {
584f05cddf9SRui Paulo 		return wpa_s->driver->send_tdls_mgmt(wpa_s->drv_priv, dst,
585f05cddf9SRui Paulo 						     action_code, dialog_token,
5865b9c547cSRui Paulo 						     status_code, peer_capab,
587*a90b9d01SCy Schubert 						     initiator, buf, len,
588*a90b9d01SCy Schubert 						     link_id);
589f05cddf9SRui Paulo 	}
590f05cddf9SRui Paulo 	return -1;
591f05cddf9SRui Paulo }
592f05cddf9SRui Paulo 
wpa_drv_tdls_oper(struct wpa_supplicant * wpa_s,enum tdls_oper oper,const u8 * peer)593f05cddf9SRui Paulo static inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
594f05cddf9SRui Paulo 				    enum tdls_oper oper, const u8 *peer)
595f05cddf9SRui Paulo {
596f05cddf9SRui Paulo 	if (!wpa_s->driver->tdls_oper)
597f05cddf9SRui Paulo 		return -1;
598f05cddf9SRui Paulo 	return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
599f05cddf9SRui Paulo }
600f05cddf9SRui Paulo 
6015b9c547cSRui Paulo #ifdef ANDROID
wpa_drv_driver_cmd(struct wpa_supplicant * wpa_s,char * cmd,char * buf,size_t buf_len)6025b9c547cSRui Paulo static inline int wpa_drv_driver_cmd(struct wpa_supplicant *wpa_s,
6035b9c547cSRui Paulo 				     char *cmd, char *buf, size_t buf_len)
6045b9c547cSRui Paulo {
6055b9c547cSRui Paulo 	if (!wpa_s->driver->driver_cmd)
6065b9c547cSRui Paulo 		return -1;
6075b9c547cSRui Paulo 	return wpa_s->driver->driver_cmd(wpa_s->drv_priv, cmd, buf, buf_len);
6085b9c547cSRui Paulo }
6095b9c547cSRui Paulo #endif /* ANDROID */
6105b9c547cSRui Paulo 
wpa_drv_set_rekey_info(struct wpa_supplicant * wpa_s,const u8 * kek,size_t kek_len,const u8 * kck,size_t kck_len,const u8 * replay_ctr)611f05cddf9SRui Paulo static inline void wpa_drv_set_rekey_info(struct wpa_supplicant *wpa_s,
6125b9c547cSRui Paulo 					  const u8 *kek, size_t kek_len,
6135b9c547cSRui Paulo 					  const u8 *kck, size_t kck_len,
614f05cddf9SRui Paulo 					  const u8 *replay_ctr)
615f05cddf9SRui Paulo {
616f05cddf9SRui Paulo 	if (!wpa_s->driver->set_rekey_info)
617f05cddf9SRui Paulo 		return;
6185b9c547cSRui Paulo 	wpa_s->driver->set_rekey_info(wpa_s->drv_priv, kek, kek_len,
6195b9c547cSRui Paulo 				      kck, kck_len, replay_ctr);
620f05cddf9SRui Paulo }
621f05cddf9SRui Paulo 
wpa_drv_radio_disable(struct wpa_supplicant * wpa_s,int disabled)622f05cddf9SRui Paulo static inline int wpa_drv_radio_disable(struct wpa_supplicant *wpa_s,
623f05cddf9SRui Paulo 					int disabled)
624f05cddf9SRui Paulo {
625f05cddf9SRui Paulo 	if (!wpa_s->driver->radio_disable)
626f05cddf9SRui Paulo 		return -1;
627f05cddf9SRui Paulo 	return wpa_s->driver->radio_disable(wpa_s->drv_priv, disabled);
628f05cddf9SRui Paulo }
629f05cddf9SRui Paulo 
wpa_drv_switch_channel(struct wpa_supplicant * wpa_s,struct csa_settings * settings)630f05cddf9SRui Paulo static inline int wpa_drv_switch_channel(struct wpa_supplicant *wpa_s,
6315b9c547cSRui Paulo 					 struct csa_settings *settings)
632f05cddf9SRui Paulo {
633f05cddf9SRui Paulo 	if (!wpa_s->driver->switch_channel)
634f05cddf9SRui Paulo 		return -1;
6355b9c547cSRui Paulo 	return wpa_s->driver->switch_channel(wpa_s->drv_priv, settings);
6365b9c547cSRui Paulo }
6375b9c547cSRui Paulo 
wpa_drv_add_ts(struct wpa_supplicant * wpa_s,u8 tsid,const u8 * address,u8 user_priority,u16 admitted_time)6385b9c547cSRui Paulo static inline int wpa_drv_add_ts(struct wpa_supplicant *wpa_s, u8 tsid,
6395b9c547cSRui Paulo 				 const u8 *address, u8 user_priority,
6405b9c547cSRui Paulo 				 u16 admitted_time)
6415b9c547cSRui Paulo {
6425b9c547cSRui Paulo 	if (!wpa_s->driver->add_tx_ts)
6435b9c547cSRui Paulo 		return -1;
6445b9c547cSRui Paulo 	return wpa_s->driver->add_tx_ts(wpa_s->drv_priv, tsid, address,
6455b9c547cSRui Paulo 					user_priority, admitted_time);
6465b9c547cSRui Paulo }
6475b9c547cSRui Paulo 
wpa_drv_del_ts(struct wpa_supplicant * wpa_s,u8 tid,const u8 * address)6485b9c547cSRui Paulo static inline int wpa_drv_del_ts(struct wpa_supplicant *wpa_s, u8 tid,
6495b9c547cSRui Paulo 				 const u8 *address)
6505b9c547cSRui Paulo {
6515b9c547cSRui Paulo 	if (!wpa_s->driver->del_tx_ts)
6525b9c547cSRui Paulo 		return -1;
6535b9c547cSRui Paulo 	return wpa_s->driver->del_tx_ts(wpa_s->drv_priv, tid, address);
6545b9c547cSRui Paulo }
6555b9c547cSRui Paulo 
wpa_drv_tdls_enable_channel_switch(struct wpa_supplicant * wpa_s,const u8 * addr,u8 oper_class,const struct hostapd_freq_params * freq_params)6565b9c547cSRui Paulo static inline int wpa_drv_tdls_enable_channel_switch(
6575b9c547cSRui Paulo 	struct wpa_supplicant *wpa_s, const u8 *addr, u8 oper_class,
6585b9c547cSRui Paulo 	const struct hostapd_freq_params *freq_params)
6595b9c547cSRui Paulo {
6605b9c547cSRui Paulo 	if (!wpa_s->driver->tdls_enable_channel_switch)
6615b9c547cSRui Paulo 		return -1;
6625b9c547cSRui Paulo 	return wpa_s->driver->tdls_enable_channel_switch(wpa_s->drv_priv, addr,
6635b9c547cSRui Paulo 							 oper_class,
6645b9c547cSRui Paulo 							 freq_params);
6655b9c547cSRui Paulo }
6665b9c547cSRui Paulo 
6675b9c547cSRui Paulo static inline int
wpa_drv_tdls_disable_channel_switch(struct wpa_supplicant * wpa_s,const u8 * addr)6685b9c547cSRui Paulo wpa_drv_tdls_disable_channel_switch(struct wpa_supplicant *wpa_s,
6695b9c547cSRui Paulo 				    const u8 *addr)
6705b9c547cSRui Paulo {
6715b9c547cSRui Paulo 	if (!wpa_s->driver->tdls_disable_channel_switch)
6725b9c547cSRui Paulo 		return -1;
6735b9c547cSRui Paulo 	return wpa_s->driver->tdls_disable_channel_switch(wpa_s->drv_priv,
6745b9c547cSRui Paulo 							  addr);
675f05cddf9SRui Paulo }
676f05cddf9SRui Paulo 
wpa_drv_wnm_oper(struct wpa_supplicant * wpa_s,enum wnm_oper oper,const u8 * peer,u8 * buf,u16 * buf_len)677f05cddf9SRui Paulo static inline int wpa_drv_wnm_oper(struct wpa_supplicant *wpa_s,
678f05cddf9SRui Paulo 				   enum wnm_oper oper, const u8 *peer,
679f05cddf9SRui Paulo 				   u8 *buf, u16 *buf_len)
680f05cddf9SRui Paulo {
681f05cddf9SRui Paulo 	if (!wpa_s->driver->wnm_oper)
682f05cddf9SRui Paulo 		return -1;
683f05cddf9SRui Paulo 	return wpa_s->driver->wnm_oper(wpa_s->drv_priv, oper, peer, buf,
684f05cddf9SRui Paulo 				       buf_len);
685e28a4053SRui Paulo }
686e28a4053SRui Paulo 
wpa_drv_status(struct wpa_supplicant * wpa_s,char * buf,size_t buflen)6875b9c547cSRui Paulo static inline int wpa_drv_status(struct wpa_supplicant *wpa_s,
6885b9c547cSRui Paulo 				 char *buf, size_t buflen)
6895b9c547cSRui Paulo {
6905b9c547cSRui Paulo 	if (!wpa_s->driver->status)
6915b9c547cSRui Paulo 		return -1;
6925b9c547cSRui Paulo 	return wpa_s->driver->status(wpa_s->drv_priv, buf, buflen);
6935b9c547cSRui Paulo }
6945b9c547cSRui Paulo 
wpa_drv_set_qos_map(struct wpa_supplicant * wpa_s,const u8 * qos_map_set,u8 qos_map_set_len)6955b9c547cSRui Paulo static inline int wpa_drv_set_qos_map(struct wpa_supplicant *wpa_s,
6965b9c547cSRui Paulo 				      const u8 *qos_map_set, u8 qos_map_set_len)
6975b9c547cSRui Paulo {
6985b9c547cSRui Paulo 	if (!wpa_s->driver->set_qos_map)
6995b9c547cSRui Paulo 		return -1;
7005b9c547cSRui Paulo 	return wpa_s->driver->set_qos_map(wpa_s->drv_priv, qos_map_set,
7015b9c547cSRui Paulo 					  qos_map_set_len);
7025b9c547cSRui Paulo }
7035b9c547cSRui Paulo 
wpa_drv_get_wowlan(struct wpa_supplicant * wpa_s)704c1d255d3SCy Schubert static inline int wpa_drv_get_wowlan(struct wpa_supplicant *wpa_s)
705c1d255d3SCy Schubert {
706c1d255d3SCy Schubert 	if (!wpa_s->driver->get_wowlan)
707c1d255d3SCy Schubert 		return 0;
708c1d255d3SCy Schubert 	return wpa_s->driver->get_wowlan(wpa_s->drv_priv);
709c1d255d3SCy Schubert }
710c1d255d3SCy Schubert 
wpa_drv_wowlan(struct wpa_supplicant * wpa_s,const struct wowlan_triggers * triggers)7115b9c547cSRui Paulo static inline int wpa_drv_wowlan(struct wpa_supplicant *wpa_s,
7125b9c547cSRui Paulo 				 const struct wowlan_triggers *triggers)
7135b9c547cSRui Paulo {
7145b9c547cSRui Paulo 	if (!wpa_s->driver->set_wowlan)
7155b9c547cSRui Paulo 		return -1;
7165b9c547cSRui Paulo 	return wpa_s->driver->set_wowlan(wpa_s->drv_priv, triggers);
7175b9c547cSRui Paulo }
7185b9c547cSRui Paulo 
wpa_drv_vendor_cmd(struct wpa_supplicant * wpa_s,int vendor_id,int subcmd,const u8 * data,size_t data_len,enum nested_attr nested_attr_flag,struct wpabuf * buf)7195b9c547cSRui Paulo static inline int wpa_drv_vendor_cmd(struct wpa_supplicant *wpa_s,
7205b9c547cSRui Paulo 				     int vendor_id, int subcmd, const u8 *data,
721c1d255d3SCy Schubert 				     size_t data_len,
722c1d255d3SCy Schubert 				     enum nested_attr nested_attr_flag,
723c1d255d3SCy Schubert 				     struct wpabuf *buf)
7245b9c547cSRui Paulo {
7255b9c547cSRui Paulo 	if (!wpa_s->driver->vendor_cmd)
7265b9c547cSRui Paulo 		return -1;
7275b9c547cSRui Paulo 	return wpa_s->driver->vendor_cmd(wpa_s->drv_priv, vendor_id, subcmd,
728c1d255d3SCy Schubert 					 data, data_len, nested_attr_flag, buf);
7295b9c547cSRui Paulo }
7305b9c547cSRui Paulo 
wpa_drv_roaming(struct wpa_supplicant * wpa_s,int allowed,const u8 * bssid)7315b9c547cSRui Paulo static inline int wpa_drv_roaming(struct wpa_supplicant *wpa_s, int allowed,
7325b9c547cSRui Paulo 				  const u8 *bssid)
7335b9c547cSRui Paulo {
7345b9c547cSRui Paulo 	if (!wpa_s->driver->roaming)
7355b9c547cSRui Paulo 		return -1;
7365b9c547cSRui Paulo 	return wpa_s->driver->roaming(wpa_s->drv_priv, allowed, bssid);
7375b9c547cSRui Paulo }
7385b9c547cSRui Paulo 
wpa_drv_disable_fils(struct wpa_supplicant * wpa_s,int disable)73985732ac8SCy Schubert static inline int wpa_drv_disable_fils(struct wpa_supplicant *wpa_s,
74085732ac8SCy Schubert 				       int disable)
74185732ac8SCy Schubert {
74285732ac8SCy Schubert 	if (!wpa_s->driver->disable_fils)
74385732ac8SCy Schubert 		return -1;
74485732ac8SCy Schubert 	return wpa_s->driver->disable_fils(wpa_s->drv_priv, disable);
74585732ac8SCy Schubert }
74685732ac8SCy Schubert 
wpa_drv_set_mac_addr(struct wpa_supplicant * wpa_s,const u8 * addr)7475b9c547cSRui Paulo static inline int wpa_drv_set_mac_addr(struct wpa_supplicant *wpa_s,
7485b9c547cSRui Paulo 				       const u8 *addr)
7495b9c547cSRui Paulo {
7505b9c547cSRui Paulo 	if (!wpa_s->driver->set_mac_addr)
7515b9c547cSRui Paulo 		return -1;
7525b9c547cSRui Paulo 	return wpa_s->driver->set_mac_addr(wpa_s->drv_priv, addr);
7535b9c547cSRui Paulo }
7545b9c547cSRui Paulo 
7555b9c547cSRui Paulo 
7565b9c547cSRui Paulo #ifdef CONFIG_MACSEC
7575b9c547cSRui Paulo 
wpa_drv_macsec_init(struct wpa_supplicant * wpa_s,struct macsec_init_params * params)7585b9c547cSRui Paulo static inline int wpa_drv_macsec_init(struct wpa_supplicant *wpa_s,
7595b9c547cSRui Paulo 				      struct macsec_init_params *params)
7605b9c547cSRui Paulo {
7615b9c547cSRui Paulo 	if (!wpa_s->driver->macsec_init)
7625b9c547cSRui Paulo 		return -1;
7635b9c547cSRui Paulo 	return wpa_s->driver->macsec_init(wpa_s->drv_priv, params);
7645b9c547cSRui Paulo }
7655b9c547cSRui Paulo 
wpa_drv_macsec_deinit(struct wpa_supplicant * wpa_s)7665b9c547cSRui Paulo static inline int wpa_drv_macsec_deinit(struct wpa_supplicant *wpa_s)
7675b9c547cSRui Paulo {
7685b9c547cSRui Paulo 	if (!wpa_s->driver->macsec_deinit)
7695b9c547cSRui Paulo 		return -1;
7705b9c547cSRui Paulo 	return wpa_s->driver->macsec_deinit(wpa_s->drv_priv);
7715b9c547cSRui Paulo }
7725b9c547cSRui Paulo 
wpa_drv_macsec_get_capability(struct wpa_supplicant * wpa_s,enum macsec_cap * cap)77385732ac8SCy Schubert static inline int wpa_drv_macsec_get_capability(struct wpa_supplicant *wpa_s,
77485732ac8SCy Schubert 						enum macsec_cap *cap)
77585732ac8SCy Schubert {
77685732ac8SCy Schubert 	if (!wpa_s->driver->macsec_get_capability)
77785732ac8SCy Schubert 		return -1;
77885732ac8SCy Schubert 	return wpa_s->driver->macsec_get_capability(wpa_s->drv_priv, cap);
77985732ac8SCy Schubert }
78085732ac8SCy Schubert 
wpa_drv_enable_protect_frames(struct wpa_supplicant * wpa_s,bool enabled)7815b9c547cSRui Paulo static inline int wpa_drv_enable_protect_frames(struct wpa_supplicant *wpa_s,
782c1d255d3SCy Schubert 						bool enabled)
7835b9c547cSRui Paulo {
7845b9c547cSRui Paulo 	if (!wpa_s->driver->enable_protect_frames)
7855b9c547cSRui Paulo 		return -1;
7865b9c547cSRui Paulo 	return wpa_s->driver->enable_protect_frames(wpa_s->drv_priv, enabled);
7875b9c547cSRui Paulo }
7885b9c547cSRui Paulo 
wpa_drv_enable_encrypt(struct wpa_supplicant * wpa_s,bool enabled)78985732ac8SCy Schubert static inline int wpa_drv_enable_encrypt(struct wpa_supplicant *wpa_s,
790c1d255d3SCy Schubert 						bool enabled)
79185732ac8SCy Schubert {
79285732ac8SCy Schubert 	if (!wpa_s->driver->enable_encrypt)
79385732ac8SCy Schubert 		return -1;
79485732ac8SCy Schubert 	return wpa_s->driver->enable_encrypt(wpa_s->drv_priv, enabled);
79585732ac8SCy Schubert }
79685732ac8SCy Schubert 
wpa_drv_set_replay_protect(struct wpa_supplicant * wpa_s,bool enabled,u32 window)7975b9c547cSRui Paulo static inline int wpa_drv_set_replay_protect(struct wpa_supplicant *wpa_s,
798c1d255d3SCy Schubert 					     bool enabled, u32 window)
7995b9c547cSRui Paulo {
8005b9c547cSRui Paulo 	if (!wpa_s->driver->set_replay_protect)
8015b9c547cSRui Paulo 		return -1;
8025b9c547cSRui Paulo 	return wpa_s->driver->set_replay_protect(wpa_s->drv_priv, enabled,
8035b9c547cSRui Paulo 						 window);
8045b9c547cSRui Paulo }
8055b9c547cSRui Paulo 
wpa_drv_set_offload(struct wpa_supplicant * wpa_s,u8 offload)806*a90b9d01SCy Schubert static inline int wpa_drv_set_offload(struct wpa_supplicant *wpa_s, u8 offload)
807*a90b9d01SCy Schubert {
808*a90b9d01SCy Schubert 	if (!wpa_s->driver->set_offload)
809*a90b9d01SCy Schubert 		return -1;
810*a90b9d01SCy Schubert 	return wpa_s->driver->set_offload(wpa_s->drv_priv, offload);
811*a90b9d01SCy Schubert 
812*a90b9d01SCy Schubert }
813*a90b9d01SCy Schubert 
wpa_drv_set_current_cipher_suite(struct wpa_supplicant * wpa_s,u64 cs)8145b9c547cSRui Paulo static inline int wpa_drv_set_current_cipher_suite(struct wpa_supplicant *wpa_s,
815780fb4a2SCy Schubert 						   u64 cs)
8165b9c547cSRui Paulo {
8175b9c547cSRui Paulo 	if (!wpa_s->driver->set_current_cipher_suite)
8185b9c547cSRui Paulo 		return -1;
819780fb4a2SCy Schubert 	return wpa_s->driver->set_current_cipher_suite(wpa_s->drv_priv, cs);
8205b9c547cSRui Paulo }
8215b9c547cSRui Paulo 
wpa_drv_enable_controlled_port(struct wpa_supplicant * wpa_s,bool enabled)8225b9c547cSRui Paulo static inline int wpa_drv_enable_controlled_port(struct wpa_supplicant *wpa_s,
823c1d255d3SCy Schubert 						 bool enabled)
8245b9c547cSRui Paulo {
8255b9c547cSRui Paulo 	if (!wpa_s->driver->enable_controlled_port)
8265b9c547cSRui Paulo 		return -1;
8275b9c547cSRui Paulo 	return wpa_s->driver->enable_controlled_port(wpa_s->drv_priv, enabled);
8285b9c547cSRui Paulo }
8295b9c547cSRui Paulo 
wpa_drv_get_receive_lowest_pn(struct wpa_supplicant * wpa_s,struct receive_sa * sa)8305b9c547cSRui Paulo static inline int wpa_drv_get_receive_lowest_pn(struct wpa_supplicant *wpa_s,
83185732ac8SCy Schubert 						struct receive_sa *sa)
8325b9c547cSRui Paulo {
8335b9c547cSRui Paulo 	if (!wpa_s->driver->get_receive_lowest_pn)
8345b9c547cSRui Paulo 		return -1;
83585732ac8SCy Schubert 	return wpa_s->driver->get_receive_lowest_pn(wpa_s->drv_priv, sa);
8365b9c547cSRui Paulo }
8375b9c547cSRui Paulo 
wpa_drv_get_transmit_next_pn(struct wpa_supplicant * wpa_s,struct transmit_sa * sa)8385b9c547cSRui Paulo static inline int wpa_drv_get_transmit_next_pn(struct wpa_supplicant *wpa_s,
83985732ac8SCy Schubert 						struct transmit_sa *sa)
8405b9c547cSRui Paulo {
8415b9c547cSRui Paulo 	if (!wpa_s->driver->get_transmit_next_pn)
8425b9c547cSRui Paulo 		return -1;
84385732ac8SCy Schubert 	return wpa_s->driver->get_transmit_next_pn(wpa_s->drv_priv, sa);
8445b9c547cSRui Paulo }
8455b9c547cSRui Paulo 
wpa_drv_set_transmit_next_pn(struct wpa_supplicant * wpa_s,struct transmit_sa * sa)8465b9c547cSRui Paulo static inline int wpa_drv_set_transmit_next_pn(struct wpa_supplicant *wpa_s,
84785732ac8SCy Schubert 						struct transmit_sa *sa)
8485b9c547cSRui Paulo {
8495b9c547cSRui Paulo 	if (!wpa_s->driver->set_transmit_next_pn)
8505b9c547cSRui Paulo 		return -1;
85185732ac8SCy Schubert 	return wpa_s->driver->set_transmit_next_pn(wpa_s->drv_priv, sa);
8525b9c547cSRui Paulo }
8535b9c547cSRui Paulo 
wpa_drv_set_receive_lowest_pn(struct wpa_supplicant * wpa_s,struct receive_sa * sa)8544bc52338SCy Schubert static inline int wpa_drv_set_receive_lowest_pn(struct wpa_supplicant *wpa_s,
8554bc52338SCy Schubert 						struct receive_sa *sa)
8564bc52338SCy Schubert {
8574bc52338SCy Schubert 	if (!wpa_s->driver->set_receive_lowest_pn)
8584bc52338SCy Schubert 		return -1;
8594bc52338SCy Schubert 	return wpa_s->driver->set_receive_lowest_pn(wpa_s->drv_priv, sa);
8604bc52338SCy Schubert }
8614bc52338SCy Schubert 
8625b9c547cSRui Paulo static inline int
wpa_drv_create_receive_sc(struct wpa_supplicant * wpa_s,struct receive_sc * sc,unsigned int conf_offset,int validation)86385732ac8SCy Schubert wpa_drv_create_receive_sc(struct wpa_supplicant *wpa_s, struct receive_sc *sc,
8645b9c547cSRui Paulo 			  unsigned int conf_offset, int validation)
8655b9c547cSRui Paulo {
8665b9c547cSRui Paulo 	if (!wpa_s->driver->create_receive_sc)
8675b9c547cSRui Paulo 		return -1;
86885732ac8SCy Schubert 	return wpa_s->driver->create_receive_sc(wpa_s->drv_priv, sc,
86985732ac8SCy Schubert 						conf_offset, validation);
8705b9c547cSRui Paulo }
8715b9c547cSRui Paulo 
wpa_drv_delete_receive_sc(struct wpa_supplicant * wpa_s,struct receive_sc * sc)8725b9c547cSRui Paulo static inline int wpa_drv_delete_receive_sc(struct wpa_supplicant *wpa_s,
87385732ac8SCy Schubert 					    struct receive_sc *sc)
8745b9c547cSRui Paulo {
8755b9c547cSRui Paulo 	if (!wpa_s->driver->delete_receive_sc)
8765b9c547cSRui Paulo 		return -1;
87785732ac8SCy Schubert 	return wpa_s->driver->delete_receive_sc(wpa_s->drv_priv, sc);
8785b9c547cSRui Paulo }
8795b9c547cSRui Paulo 
wpa_drv_create_receive_sa(struct wpa_supplicant * wpa_s,struct receive_sa * sa)8805b9c547cSRui Paulo static inline int wpa_drv_create_receive_sa(struct wpa_supplicant *wpa_s,
88185732ac8SCy Schubert 					    struct receive_sa *sa)
8825b9c547cSRui Paulo {
8835b9c547cSRui Paulo 	if (!wpa_s->driver->create_receive_sa)
8845b9c547cSRui Paulo 		return -1;
88585732ac8SCy Schubert 	return wpa_s->driver->create_receive_sa(wpa_s->drv_priv, sa);
88685732ac8SCy Schubert }
88785732ac8SCy Schubert 
wpa_drv_delete_receive_sa(struct wpa_supplicant * wpa_s,struct receive_sa * sa)88885732ac8SCy Schubert static inline int wpa_drv_delete_receive_sa(struct wpa_supplicant *wpa_s,
88985732ac8SCy Schubert 					    struct receive_sa *sa)
89085732ac8SCy Schubert {
89185732ac8SCy Schubert 	if (!wpa_s->driver->delete_receive_sa)
89285732ac8SCy Schubert 		return -1;
89385732ac8SCy Schubert 	return wpa_s->driver->delete_receive_sa(wpa_s->drv_priv, sa);
8945b9c547cSRui Paulo }
8955b9c547cSRui Paulo 
wpa_drv_enable_receive_sa(struct wpa_supplicant * wpa_s,struct receive_sa * sa)8965b9c547cSRui Paulo static inline int wpa_drv_enable_receive_sa(struct wpa_supplicant *wpa_s,
89785732ac8SCy Schubert 					    struct receive_sa *sa)
8985b9c547cSRui Paulo {
8995b9c547cSRui Paulo 	if (!wpa_s->driver->enable_receive_sa)
9005b9c547cSRui Paulo 		return -1;
90185732ac8SCy Schubert 	return wpa_s->driver->enable_receive_sa(wpa_s->drv_priv, sa);
9025b9c547cSRui Paulo }
9035b9c547cSRui Paulo 
wpa_drv_disable_receive_sa(struct wpa_supplicant * wpa_s,struct receive_sa * sa)9045b9c547cSRui Paulo static inline int wpa_drv_disable_receive_sa(struct wpa_supplicant *wpa_s,
90585732ac8SCy Schubert 					     struct receive_sa *sa)
9065b9c547cSRui Paulo {
9075b9c547cSRui Paulo 	if (!wpa_s->driver->disable_receive_sa)
9085b9c547cSRui Paulo 		return -1;
90985732ac8SCy Schubert 	return wpa_s->driver->disable_receive_sa(wpa_s->drv_priv, sa);
9105b9c547cSRui Paulo }
9115b9c547cSRui Paulo 
9125b9c547cSRui Paulo static inline int
wpa_drv_create_transmit_sc(struct wpa_supplicant * wpa_s,struct transmit_sc * sc,unsigned int conf_offset)91385732ac8SCy Schubert wpa_drv_create_transmit_sc(struct wpa_supplicant *wpa_s, struct transmit_sc *sc,
9145b9c547cSRui Paulo 			   unsigned int conf_offset)
9155b9c547cSRui Paulo {
9165b9c547cSRui Paulo 	if (!wpa_s->driver->create_transmit_sc)
9175b9c547cSRui Paulo 		return -1;
91885732ac8SCy Schubert 	return wpa_s->driver->create_transmit_sc(wpa_s->drv_priv, sc,
9195b9c547cSRui Paulo 						 conf_offset);
9205b9c547cSRui Paulo }
9215b9c547cSRui Paulo 
wpa_drv_delete_transmit_sc(struct wpa_supplicant * wpa_s,struct transmit_sc * sc)9225b9c547cSRui Paulo static inline int wpa_drv_delete_transmit_sc(struct wpa_supplicant *wpa_s,
92385732ac8SCy Schubert 					     struct transmit_sc *sc)
9245b9c547cSRui Paulo {
9255b9c547cSRui Paulo 	if (!wpa_s->driver->delete_transmit_sc)
9265b9c547cSRui Paulo 		return -1;
92785732ac8SCy Schubert 	return wpa_s->driver->delete_transmit_sc(wpa_s->drv_priv, sc);
9285b9c547cSRui Paulo }
9295b9c547cSRui Paulo 
wpa_drv_create_transmit_sa(struct wpa_supplicant * wpa_s,struct transmit_sa * sa)9305b9c547cSRui Paulo static inline int wpa_drv_create_transmit_sa(struct wpa_supplicant *wpa_s,
93185732ac8SCy Schubert 					     struct transmit_sa *sa)
9325b9c547cSRui Paulo {
9335b9c547cSRui Paulo 	if (!wpa_s->driver->create_transmit_sa)
9345b9c547cSRui Paulo 		return -1;
93585732ac8SCy Schubert 	return wpa_s->driver->create_transmit_sa(wpa_s->drv_priv, sa);
93685732ac8SCy Schubert }
93785732ac8SCy Schubert 
wpa_drv_delete_transmit_sa(struct wpa_supplicant * wpa_s,struct transmit_sa * sa)93885732ac8SCy Schubert static inline int wpa_drv_delete_transmit_sa(struct wpa_supplicant *wpa_s,
93985732ac8SCy Schubert 					     struct transmit_sa *sa)
94085732ac8SCy Schubert {
94185732ac8SCy Schubert 	if (!wpa_s->driver->delete_transmit_sa)
94285732ac8SCy Schubert 		return -1;
94385732ac8SCy Schubert 	return wpa_s->driver->delete_transmit_sa(wpa_s->drv_priv, sa);
9445b9c547cSRui Paulo }
9455b9c547cSRui Paulo 
wpa_drv_enable_transmit_sa(struct wpa_supplicant * wpa_s,struct transmit_sa * sa)9465b9c547cSRui Paulo static inline int wpa_drv_enable_transmit_sa(struct wpa_supplicant *wpa_s,
94785732ac8SCy Schubert 					     struct transmit_sa *sa)
9485b9c547cSRui Paulo {
9495b9c547cSRui Paulo 	if (!wpa_s->driver->enable_transmit_sa)
9505b9c547cSRui Paulo 		return -1;
95185732ac8SCy Schubert 	return wpa_s->driver->enable_transmit_sa(wpa_s->drv_priv, sa);
9525b9c547cSRui Paulo }
9535b9c547cSRui Paulo 
wpa_drv_disable_transmit_sa(struct wpa_supplicant * wpa_s,struct transmit_sa * sa)9545b9c547cSRui Paulo static inline int wpa_drv_disable_transmit_sa(struct wpa_supplicant *wpa_s,
95585732ac8SCy Schubert 					      struct transmit_sa *sa)
9565b9c547cSRui Paulo {
9575b9c547cSRui Paulo 	if (!wpa_s->driver->disable_transmit_sa)
9585b9c547cSRui Paulo 		return -1;
95985732ac8SCy Schubert 	return wpa_s->driver->disable_transmit_sa(wpa_s->drv_priv, sa);
9605b9c547cSRui Paulo }
9615b9c547cSRui Paulo #endif /* CONFIG_MACSEC */
9625b9c547cSRui Paulo 
wpa_drv_setband(struct wpa_supplicant * wpa_s,u32 band_mask)963325151a3SRui Paulo static inline int wpa_drv_setband(struct wpa_supplicant *wpa_s,
964c1d255d3SCy Schubert 				  u32 band_mask)
965325151a3SRui Paulo {
966325151a3SRui Paulo 	if (!wpa_s->driver->set_band)
967325151a3SRui Paulo 		return -1;
968c1d255d3SCy Schubert 	return wpa_s->driver->set_band(wpa_s->drv_priv, band_mask);
969325151a3SRui Paulo }
970325151a3SRui Paulo 
wpa_drv_get_pref_freq_list(struct wpa_supplicant * wpa_s,enum wpa_driver_if_type if_type,unsigned int * num,struct weighted_pcl * freq_list)971325151a3SRui Paulo static inline int wpa_drv_get_pref_freq_list(struct wpa_supplicant *wpa_s,
972325151a3SRui Paulo 					     enum wpa_driver_if_type if_type,
973325151a3SRui Paulo 					     unsigned int *num,
974*a90b9d01SCy Schubert 					     struct weighted_pcl *freq_list)
975325151a3SRui Paulo {
97685732ac8SCy Schubert #ifdef CONFIG_TESTING_OPTIONS
97785732ac8SCy Schubert 	if (wpa_s->get_pref_freq_list_override)
97885732ac8SCy Schubert 		return wpas_ctrl_iface_get_pref_freq_list_override(
97985732ac8SCy Schubert 			wpa_s, if_type, num, freq_list);
98085732ac8SCy Schubert #endif /* CONFIG_TESTING_OPTIONS */
981325151a3SRui Paulo 	if (!wpa_s->driver->get_pref_freq_list)
982325151a3SRui Paulo 		return -1;
983325151a3SRui Paulo 	return wpa_s->driver->get_pref_freq_list(wpa_s->drv_priv, if_type,
984325151a3SRui Paulo 						 num, freq_list);
985325151a3SRui Paulo }
986325151a3SRui Paulo 
wpa_drv_set_prob_oper_freq(struct wpa_supplicant * wpa_s,unsigned int freq)987325151a3SRui Paulo static inline int wpa_drv_set_prob_oper_freq(struct wpa_supplicant *wpa_s,
988325151a3SRui Paulo 					     unsigned int freq)
989325151a3SRui Paulo {
990325151a3SRui Paulo 	if (!wpa_s->driver->set_prob_oper_freq)
991325151a3SRui Paulo 		return 0;
992325151a3SRui Paulo 	return wpa_s->driver->set_prob_oper_freq(wpa_s->drv_priv, freq);
993325151a3SRui Paulo }
994325151a3SRui Paulo 
wpa_drv_abort_scan(struct wpa_supplicant * wpa_s,u64 scan_cookie)99585732ac8SCy Schubert static inline int wpa_drv_abort_scan(struct wpa_supplicant *wpa_s,
99685732ac8SCy Schubert 				     u64 scan_cookie)
997780fb4a2SCy Schubert {
998780fb4a2SCy Schubert 	if (!wpa_s->driver->abort_scan)
999780fb4a2SCy Schubert 		return -1;
100085732ac8SCy Schubert 	return wpa_s->driver->abort_scan(wpa_s->drv_priv, scan_cookie);
1001780fb4a2SCy Schubert }
1002780fb4a2SCy Schubert 
wpa_drv_configure_frame_filters(struct wpa_supplicant * wpa_s,u32 filters)1003780fb4a2SCy Schubert static inline int wpa_drv_configure_frame_filters(struct wpa_supplicant *wpa_s,
1004780fb4a2SCy Schubert 						  u32 filters)
1005780fb4a2SCy Schubert {
1006780fb4a2SCy Schubert 	if (!wpa_s->driver->configure_data_frame_filters)
1007780fb4a2SCy Schubert 		return -1;
1008780fb4a2SCy Schubert 	return wpa_s->driver->configure_data_frame_filters(wpa_s->drv_priv,
1009780fb4a2SCy Schubert 							   filters);
1010780fb4a2SCy Schubert }
1011780fb4a2SCy Schubert 
wpa_drv_get_ext_capa(struct wpa_supplicant * wpa_s,enum wpa_driver_if_type type)1012780fb4a2SCy Schubert static inline int wpa_drv_get_ext_capa(struct wpa_supplicant *wpa_s,
1013780fb4a2SCy Schubert 				       enum wpa_driver_if_type type)
1014780fb4a2SCy Schubert {
1015780fb4a2SCy Schubert 	if (!wpa_s->driver->get_ext_capab)
1016780fb4a2SCy Schubert 		return -1;
1017780fb4a2SCy Schubert 	return wpa_s->driver->get_ext_capab(wpa_s->drv_priv, type,
1018780fb4a2SCy Schubert 					    &wpa_s->extended_capa,
1019780fb4a2SCy Schubert 					    &wpa_s->extended_capa_mask,
1020780fb4a2SCy Schubert 					    &wpa_s->extended_capa_len);
1021780fb4a2SCy Schubert }
1022780fb4a2SCy Schubert 
wpa_drv_p2p_lo_start(struct wpa_supplicant * wpa_s,unsigned int channel,unsigned int period,unsigned int interval,unsigned int count,const u8 * device_types,size_t dev_types_len,const u8 * ies,size_t ies_len)1023780fb4a2SCy Schubert static inline int wpa_drv_p2p_lo_start(struct wpa_supplicant *wpa_s,
1024780fb4a2SCy Schubert 				       unsigned int channel,
1025780fb4a2SCy Schubert 				       unsigned int period,
1026780fb4a2SCy Schubert 				       unsigned int interval,
1027780fb4a2SCy Schubert 				       unsigned int count,
1028780fb4a2SCy Schubert 				       const u8 *device_types,
1029780fb4a2SCy Schubert 				       size_t dev_types_len,
1030780fb4a2SCy Schubert 				       const u8 *ies, size_t ies_len)
1031780fb4a2SCy Schubert {
1032780fb4a2SCy Schubert 	if (!wpa_s->driver->p2p_lo_start)
1033780fb4a2SCy Schubert 		return -1;
1034780fb4a2SCy Schubert 	return wpa_s->driver->p2p_lo_start(wpa_s->drv_priv, channel, period,
1035780fb4a2SCy Schubert 					   interval, count, device_types,
1036780fb4a2SCy Schubert 					   dev_types_len, ies, ies_len);
1037780fb4a2SCy Schubert }
1038780fb4a2SCy Schubert 
wpa_drv_p2p_lo_stop(struct wpa_supplicant * wpa_s)1039780fb4a2SCy Schubert static inline int wpa_drv_p2p_lo_stop(struct wpa_supplicant *wpa_s)
1040780fb4a2SCy Schubert {
1041780fb4a2SCy Schubert 	if (!wpa_s->driver->p2p_lo_stop)
1042780fb4a2SCy Schubert 		return -1;
1043780fb4a2SCy Schubert 	return wpa_s->driver->p2p_lo_stop(wpa_s->drv_priv);
1044780fb4a2SCy Schubert }
1045780fb4a2SCy Schubert 
wpa_drv_set_default_scan_ies(struct wpa_supplicant * wpa_s,const u8 * ies,size_t len)1046780fb4a2SCy Schubert static inline int wpa_drv_set_default_scan_ies(struct wpa_supplicant *wpa_s,
1047780fb4a2SCy Schubert 					       const u8 *ies, size_t len)
1048780fb4a2SCy Schubert {
1049780fb4a2SCy Schubert 	if (!wpa_s->driver->set_default_scan_ies)
1050780fb4a2SCy Schubert 		return -1;
1051780fb4a2SCy Schubert 	return wpa_s->driver->set_default_scan_ies(wpa_s->drv_priv, ies, len);
1052780fb4a2SCy Schubert }
1053780fb4a2SCy Schubert 
wpa_drv_set_tdls_mode(struct wpa_supplicant * wpa_s,int tdls_external_control)105485732ac8SCy Schubert static inline int wpa_drv_set_tdls_mode(struct wpa_supplicant *wpa_s,
105585732ac8SCy Schubert 					int tdls_external_control)
105685732ac8SCy Schubert {
105785732ac8SCy Schubert 	if (!wpa_s->driver->set_tdls_mode)
105885732ac8SCy Schubert 		return -1;
105985732ac8SCy Schubert 	return wpa_s->driver->set_tdls_mode(wpa_s->drv_priv,
106085732ac8SCy Schubert 					    tdls_external_control);
106185732ac8SCy Schubert }
106285732ac8SCy Schubert 
106385732ac8SCy Schubert static inline struct wpa_bss_candidate_info *
wpa_drv_get_bss_trans_status(struct wpa_supplicant * wpa_s,struct wpa_bss_trans_info * params)106485732ac8SCy Schubert wpa_drv_get_bss_trans_status(struct wpa_supplicant *wpa_s,
106585732ac8SCy Schubert 			     struct wpa_bss_trans_info *params)
106685732ac8SCy Schubert {
106785732ac8SCy Schubert 	if (!wpa_s->driver->get_bss_transition_status)
106885732ac8SCy Schubert 		return NULL;
106985732ac8SCy Schubert 	return wpa_s->driver->get_bss_transition_status(wpa_s->drv_priv,
107085732ac8SCy Schubert 							params);
107185732ac8SCy Schubert }
107285732ac8SCy Schubert 
wpa_drv_ignore_assoc_disallow(struct wpa_supplicant * wpa_s,int val)107385732ac8SCy Schubert static inline int wpa_drv_ignore_assoc_disallow(struct wpa_supplicant *wpa_s,
107485732ac8SCy Schubert 						int val)
107585732ac8SCy Schubert {
107685732ac8SCy Schubert 	if (!wpa_s->driver->ignore_assoc_disallow)
107785732ac8SCy Schubert 		return -1;
107885732ac8SCy Schubert 	return wpa_s->driver->ignore_assoc_disallow(wpa_s->drv_priv, val);
107985732ac8SCy Schubert }
108085732ac8SCy Schubert 
wpa_drv_set_bssid_tmp_disallow(struct wpa_supplicant * wpa_s,unsigned int num_bssid,const u8 * bssids)1081c1d255d3SCy Schubert static inline int wpa_drv_set_bssid_tmp_disallow(struct wpa_supplicant *wpa_s,
108285732ac8SCy Schubert 						 unsigned int num_bssid,
108385732ac8SCy Schubert 						 const u8 *bssids)
108485732ac8SCy Schubert {
1085c1d255d3SCy Schubert 	if (!wpa_s->driver->set_bssid_tmp_disallow)
108685732ac8SCy Schubert 		return -1;
1087c1d255d3SCy Schubert 	return wpa_s->driver->set_bssid_tmp_disallow(wpa_s->drv_priv, num_bssid,
108885732ac8SCy Schubert 						     bssids);
108985732ac8SCy Schubert }
109085732ac8SCy Schubert 
wpa_drv_update_connect_params(struct wpa_supplicant * wpa_s,struct wpa_driver_associate_params * params,enum wpa_drv_update_connect_params_mask mask)109185732ac8SCy Schubert static inline int wpa_drv_update_connect_params(
109285732ac8SCy Schubert 	struct wpa_supplicant *wpa_s,
109385732ac8SCy Schubert 	struct wpa_driver_associate_params *params,
109485732ac8SCy Schubert 	enum wpa_drv_update_connect_params_mask mask)
109585732ac8SCy Schubert {
109685732ac8SCy Schubert 	if (!wpa_s->driver->update_connect_params)
109785732ac8SCy Schubert 		return -1;
1098*a90b9d01SCy Schubert 
1099*a90b9d01SCy Schubert 	if (params)
1100*a90b9d01SCy Schubert 		params->freq.link_id = -1;
1101*a90b9d01SCy Schubert 
110285732ac8SCy Schubert 	return wpa_s->driver->update_connect_params(wpa_s->drv_priv, params,
110385732ac8SCy Schubert 						    mask);
110485732ac8SCy Schubert }
110585732ac8SCy Schubert 
110685732ac8SCy Schubert static inline int
wpa_drv_send_external_auth_status(struct wpa_supplicant * wpa_s,struct external_auth * params)110785732ac8SCy Schubert wpa_drv_send_external_auth_status(struct wpa_supplicant *wpa_s,
110885732ac8SCy Schubert 				  struct external_auth *params)
110985732ac8SCy Schubert {
111085732ac8SCy Schubert 	if (!wpa_s->driver->send_external_auth_status)
111185732ac8SCy Schubert 		return -1;
111285732ac8SCy Schubert 	return wpa_s->driver->send_external_auth_status(wpa_s->drv_priv,
111385732ac8SCy Schubert 							params);
111485732ac8SCy Schubert }
111585732ac8SCy Schubert 
wpa_drv_set_4addr_mode(struct wpa_supplicant * wpa_s,int val)11164bc52338SCy Schubert static inline int wpa_drv_set_4addr_mode(struct wpa_supplicant *wpa_s, int val)
11174bc52338SCy Schubert {
11184bc52338SCy Schubert 	if (!wpa_s->driver->set_4addr_mode)
11194bc52338SCy Schubert 		return -1;
11204bc52338SCy Schubert 	return wpa_s->driver->set_4addr_mode(wpa_s->drv_priv,
11214bc52338SCy Schubert 					     wpa_s->bridge_ifname, val);
11224bc52338SCy Schubert }
11234bc52338SCy Schubert 
wpa_drv_dpp_listen(struct wpa_supplicant * wpa_s,bool enable)1124c1d255d3SCy Schubert static inline int wpa_drv_dpp_listen(struct wpa_supplicant *wpa_s, bool enable)
1125c1d255d3SCy Schubert {
1126c1d255d3SCy Schubert 	if (!wpa_s->driver->dpp_listen)
1127c1d255d3SCy Schubert 		return 0;
1128c1d255d3SCy Schubert 	return wpa_s->driver->dpp_listen(wpa_s->drv_priv, enable);
1129c1d255d3SCy Schubert }
1130c1d255d3SCy Schubert 
wpa_drv_send_pasn_resp(struct wpa_supplicant * wpa_s,struct pasn_auth * params)1131*a90b9d01SCy Schubert static inline int wpa_drv_send_pasn_resp(struct wpa_supplicant *wpa_s,
1132*a90b9d01SCy Schubert 					 struct pasn_auth *params)
1133*a90b9d01SCy Schubert {
1134*a90b9d01SCy Schubert 	if (!wpa_s->driver->send_pasn_resp)
1135*a90b9d01SCy Schubert 		return -1;
1136*a90b9d01SCy Schubert 	return wpa_s->driver->send_pasn_resp(wpa_s->drv_priv, params);
1137*a90b9d01SCy Schubert }
1138*a90b9d01SCy Schubert 
wpa_drv_set_secure_ranging_ctx(struct wpa_supplicant * wpa_s,const u8 * own_addr,const u8 * peer_addr,u32 cipher,u8 tk_len,const u8 * tk,u8 ltf_keyseed_len,const u8 * ltf_keyseed,u32 action)1139*a90b9d01SCy Schubert static inline int wpa_drv_set_secure_ranging_ctx(struct wpa_supplicant *wpa_s,
1140*a90b9d01SCy Schubert 						 const u8 *own_addr,
1141*a90b9d01SCy Schubert 						 const u8 *peer_addr,
1142*a90b9d01SCy Schubert 						 u32 cipher, u8 tk_len,
1143*a90b9d01SCy Schubert 						 const u8 *tk,
1144*a90b9d01SCy Schubert 						 u8 ltf_keyseed_len,
1145*a90b9d01SCy Schubert 						 const u8 *ltf_keyseed,
1146*a90b9d01SCy Schubert 						 u32 action)
1147*a90b9d01SCy Schubert {
1148*a90b9d01SCy Schubert 	struct secure_ranging_params params;
1149*a90b9d01SCy Schubert 
1150*a90b9d01SCy Schubert 	/* Configure secure ranging context only to the drivers that support it.
1151*a90b9d01SCy Schubert 	 */
1152*a90b9d01SCy Schubert 	if (!wpa_s->driver->set_secure_ranging_ctx)
1153*a90b9d01SCy Schubert 		return 0;
1154*a90b9d01SCy Schubert 
1155*a90b9d01SCy Schubert 	os_memset(&params, 0, sizeof(params));
1156*a90b9d01SCy Schubert 	params.action = action;
1157*a90b9d01SCy Schubert 	params.own_addr = own_addr;
1158*a90b9d01SCy Schubert 	params.peer_addr = peer_addr;
1159*a90b9d01SCy Schubert 	params.cipher = cipher;
1160*a90b9d01SCy Schubert 	params.tk_len = tk_len;
1161*a90b9d01SCy Schubert 	params.tk = tk;
1162*a90b9d01SCy Schubert 	params.ltf_keyseed_len = ltf_keyseed_len;
1163*a90b9d01SCy Schubert 	params.ltf_keyseed = ltf_keyseed;
1164*a90b9d01SCy Schubert 
1165*a90b9d01SCy Schubert 	return wpa_s->driver->set_secure_ranging_ctx(wpa_s->drv_priv, &params);
1166*a90b9d01SCy Schubert }
1167*a90b9d01SCy Schubert 
1168*a90b9d01SCy Schubert static inline int
wpas_drv_get_sta_mlo_info(struct wpa_supplicant * wpa_s,struct driver_sta_mlo_info * mlo_info)1169*a90b9d01SCy Schubert wpas_drv_get_sta_mlo_info(struct wpa_supplicant *wpa_s,
1170*a90b9d01SCy Schubert 			  struct driver_sta_mlo_info *mlo_info)
1171*a90b9d01SCy Schubert {
1172*a90b9d01SCy Schubert 	if (!wpa_s->driver->get_sta_mlo_info)
1173*a90b9d01SCy Schubert 		return 0;
1174*a90b9d01SCy Schubert 
1175*a90b9d01SCy Schubert 	return wpa_s->driver->get_sta_mlo_info(wpa_s->drv_priv, mlo_info);
1176*a90b9d01SCy Schubert }
1177*a90b9d01SCy Schubert 
1178e28a4053SRui Paulo #endif /* DRIVER_I_H */
1179