xref: /freebsd/contrib/wpa/wpa_supplicant/driver_i.h (revision 206b73d0429edb7c49b612537544e677fa568e83)
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 
90*206b73d0SCy Schubert static inline int wpa_drv_mesh_link_probe(struct wpa_supplicant *wpa_s,
91*206b73d0SCy Schubert 					  const u8 *addr,
92*206b73d0SCy Schubert 					  const u8 *eth, size_t len)
93*206b73d0SCy Schubert {
94*206b73d0SCy Schubert 	if (wpa_s->driver->probe_mesh_link)
95*206b73d0SCy Schubert 		return wpa_s->driver->probe_mesh_link(wpa_s->drv_priv, addr,
96*206b73d0SCy Schubert 						      eth, len);
97*206b73d0SCy Schubert 	return -1;
98*206b73d0SCy Schubert }
99*206b73d0SCy 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 
127e28a4053SRui Paulo static inline struct wpa_scan_results * wpa_drv_get_scan_results2(
128e28a4053SRui Paulo 	struct wpa_supplicant *wpa_s)
129e28a4053SRui Paulo {
130e28a4053SRui Paulo 	if (wpa_s->driver->get_scan_results2)
131e28a4053SRui Paulo 		return wpa_s->driver->get_scan_results2(wpa_s->drv_priv);
132e28a4053SRui Paulo 	return NULL;
133e28a4053SRui Paulo }
134e28a4053SRui Paulo 
135e28a4053SRui Paulo static inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid)
136e28a4053SRui Paulo {
137e28a4053SRui Paulo 	if (wpa_s->driver->get_bssid) {
138e28a4053SRui Paulo 		return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid);
139e28a4053SRui Paulo 	}
140e28a4053SRui Paulo 	return -1;
141e28a4053SRui Paulo }
142e28a4053SRui Paulo 
143e28a4053SRui Paulo static inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid)
144e28a4053SRui Paulo {
145e28a4053SRui Paulo 	if (wpa_s->driver->get_ssid) {
146e28a4053SRui Paulo 		return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid);
147e28a4053SRui Paulo 	}
148e28a4053SRui Paulo 	return -1;
149e28a4053SRui Paulo }
150e28a4053SRui Paulo 
151e28a4053SRui Paulo static inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s,
152e28a4053SRui Paulo 				  enum wpa_alg alg, const u8 *addr,
153e28a4053SRui Paulo 				  int key_idx, int set_tx,
154e28a4053SRui Paulo 				  const u8 *seq, size_t seq_len,
155e28a4053SRui Paulo 				  const u8 *key, size_t key_len)
156e28a4053SRui Paulo {
1575b9c547cSRui Paulo 	if (alg != WPA_ALG_NONE) {
1585b9c547cSRui Paulo 		if (key_idx >= 0 && key_idx <= 6)
1595b9c547cSRui Paulo 			wpa_s->keys_cleared &= ~BIT(key_idx);
1605b9c547cSRui Paulo 		else
161e28a4053SRui Paulo 			wpa_s->keys_cleared = 0;
1625b9c547cSRui Paulo 	}
1635b9c547cSRui Paulo 	if (wpa_s->driver->set_key) {
164e28a4053SRui Paulo 		return wpa_s->driver->set_key(wpa_s->ifname, wpa_s->drv_priv,
165e28a4053SRui Paulo 					      alg, addr, key_idx, set_tx,
166e28a4053SRui Paulo 					      seq, seq_len, key, key_len);
167e28a4053SRui Paulo 	}
168e28a4053SRui Paulo 	return -1;
169e28a4053SRui Paulo }
170e28a4053SRui Paulo 
171780fb4a2SCy Schubert static inline int wpa_drv_get_seqnum(struct wpa_supplicant *wpa_s,
172780fb4a2SCy Schubert 				     const u8 *addr, int idx, u8 *seq)
173780fb4a2SCy Schubert {
174780fb4a2SCy Schubert 	if (wpa_s->driver->get_seqnum)
175780fb4a2SCy Schubert 		return wpa_s->driver->get_seqnum(wpa_s->ifname, wpa_s->drv_priv,
176780fb4a2SCy Schubert 						 addr, idx, seq);
177780fb4a2SCy Schubert 	return -1;
178780fb4a2SCy Schubert }
179780fb4a2SCy Schubert 
1805b9c547cSRui Paulo static inline int wpa_drv_sta_deauth(struct wpa_supplicant *wpa_s,
181*206b73d0SCy Schubert 				     const u8 *addr, u16 reason_code)
1825b9c547cSRui Paulo {
1835b9c547cSRui Paulo 	if (wpa_s->driver->sta_deauth) {
1845b9c547cSRui Paulo 		return wpa_s->driver->sta_deauth(wpa_s->drv_priv,
1855b9c547cSRui Paulo 						 wpa_s->own_addr, addr,
1865b9c547cSRui Paulo 						 reason_code);
1875b9c547cSRui Paulo 	}
1885b9c547cSRui Paulo 	return -1;
1895b9c547cSRui Paulo }
1905b9c547cSRui Paulo 
191e28a4053SRui Paulo static inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
192*206b73d0SCy Schubert 					 const u8 *addr, u16 reason_code)
193e28a4053SRui Paulo {
194e28a4053SRui Paulo 	if (wpa_s->driver->deauthenticate) {
195e28a4053SRui Paulo 		return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
196e28a4053SRui Paulo 						     reason_code);
197e28a4053SRui Paulo 	}
198e28a4053SRui Paulo 	return -1;
199e28a4053SRui Paulo }
200e28a4053SRui Paulo 
201e28a4053SRui Paulo static inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
20285732ac8SCy Schubert 				    struct wpa_pmkid_params *params)
203e28a4053SRui Paulo {
204e28a4053SRui Paulo 	if (wpa_s->driver->add_pmkid) {
20585732ac8SCy Schubert 		return wpa_s->driver->add_pmkid(wpa_s->drv_priv, params);
206e28a4053SRui Paulo 	}
207e28a4053SRui Paulo 	return -1;
208e28a4053SRui Paulo }
209e28a4053SRui Paulo 
210e28a4053SRui Paulo static inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
21185732ac8SCy Schubert 				       struct wpa_pmkid_params *params)
212e28a4053SRui Paulo {
213e28a4053SRui Paulo 	if (wpa_s->driver->remove_pmkid) {
21485732ac8SCy Schubert 		return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, params);
215e28a4053SRui Paulo 	}
216e28a4053SRui Paulo 	return -1;
217e28a4053SRui Paulo }
218e28a4053SRui Paulo 
219e28a4053SRui Paulo static inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
220e28a4053SRui Paulo {
221e28a4053SRui Paulo 	if (wpa_s->driver->flush_pmkid) {
222e28a4053SRui Paulo 		return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
223e28a4053SRui Paulo 	}
224e28a4053SRui Paulo 	return -1;
225e28a4053SRui Paulo }
226e28a4053SRui Paulo 
227e28a4053SRui Paulo static inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
228e28a4053SRui Paulo 				   struct wpa_driver_capa *capa)
229e28a4053SRui Paulo {
230e28a4053SRui Paulo 	if (wpa_s->driver->get_capa) {
231e28a4053SRui Paulo 		return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
232e28a4053SRui Paulo 	}
233e28a4053SRui Paulo 	return -1;
234e28a4053SRui Paulo }
235e28a4053SRui Paulo 
236e28a4053SRui Paulo static inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
237e28a4053SRui Paulo {
238e28a4053SRui Paulo 	if (wpa_s->driver->poll) {
239e28a4053SRui Paulo 		wpa_s->driver->poll(wpa_s->drv_priv);
240e28a4053SRui Paulo 	}
241e28a4053SRui Paulo }
242e28a4053SRui Paulo 
243e28a4053SRui Paulo static inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
244e28a4053SRui Paulo {
245e28a4053SRui Paulo 	if (wpa_s->driver->get_ifname) {
246e28a4053SRui Paulo 		return wpa_s->driver->get_ifname(wpa_s->drv_priv);
247e28a4053SRui Paulo 	}
248e28a4053SRui Paulo 	return NULL;
249e28a4053SRui Paulo }
250e28a4053SRui Paulo 
2515b9c547cSRui Paulo static inline const char *
2525b9c547cSRui Paulo wpa_driver_get_radio_name(struct wpa_supplicant *wpa_s)
2535b9c547cSRui Paulo {
2545b9c547cSRui Paulo 	if (wpa_s->driver->get_radio_name)
2555b9c547cSRui Paulo 		return wpa_s->driver->get_radio_name(wpa_s->drv_priv);
2565b9c547cSRui Paulo 	return NULL;
2575b9c547cSRui Paulo }
2585b9c547cSRui Paulo 
259e28a4053SRui Paulo static inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
260e28a4053SRui Paulo {
261e28a4053SRui Paulo 	if (wpa_s->driver->get_mac_addr) {
262e28a4053SRui Paulo 		return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
263e28a4053SRui Paulo 	}
264e28a4053SRui Paulo 	return NULL;
265e28a4053SRui Paulo }
266e28a4053SRui Paulo 
267e28a4053SRui Paulo static inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
268e28a4053SRui Paulo 					int state)
269e28a4053SRui Paulo {
270e28a4053SRui Paulo 	if (wpa_s->driver->set_operstate)
271e28a4053SRui Paulo 		return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
272e28a4053SRui Paulo 	return 0;
273e28a4053SRui Paulo }
274e28a4053SRui Paulo 
275e28a4053SRui Paulo static inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
276e28a4053SRui Paulo 					     const u8 *addr, int protect_type,
277e28a4053SRui Paulo 					     int key_type)
278e28a4053SRui Paulo {
279e28a4053SRui Paulo 	if (wpa_s->driver->mlme_setprotection)
280e28a4053SRui Paulo 		return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
281e28a4053SRui Paulo 							 protect_type,
282e28a4053SRui Paulo 							 key_type);
283e28a4053SRui Paulo 	return 0;
284e28a4053SRui Paulo }
285e28a4053SRui Paulo 
286e28a4053SRui Paulo static inline struct hostapd_hw_modes *
287e28a4053SRui Paulo wpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
28885732ac8SCy Schubert 			    u16 *flags, u8 *dfs_domain)
289e28a4053SRui Paulo {
290e28a4053SRui Paulo 	if (wpa_s->driver->get_hw_feature_data)
291e28a4053SRui Paulo 		return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
29285732ac8SCy Schubert 							  num_modes, flags,
29385732ac8SCy Schubert 							  dfs_domain);
294e28a4053SRui Paulo 	return NULL;
295e28a4053SRui Paulo }
296e28a4053SRui Paulo 
297e28a4053SRui Paulo static inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
298e28a4053SRui Paulo 				      const char *alpha2)
299e28a4053SRui Paulo {
300e28a4053SRui Paulo 	if (wpa_s->driver->set_country)
301e28a4053SRui Paulo 		return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
302e28a4053SRui Paulo 	return 0;
303e28a4053SRui Paulo }
304e28a4053SRui Paulo 
305e28a4053SRui Paulo static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
306325151a3SRui Paulo 				    const u8 *data, size_t data_len, int noack,
307325151a3SRui Paulo 				    unsigned int freq)
308e28a4053SRui Paulo {
309e28a4053SRui Paulo 	if (wpa_s->driver->send_mlme)
310e28a4053SRui Paulo 		return wpa_s->driver->send_mlme(wpa_s->drv_priv,
311325151a3SRui Paulo 						data, data_len, noack,
312780fb4a2SCy Schubert 						freq, NULL, 0);
313e28a4053SRui Paulo 	return -1;
314e28a4053SRui Paulo }
315e28a4053SRui Paulo 
316e28a4053SRui Paulo static inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
317e28a4053SRui Paulo 					const u8 *md,
318e28a4053SRui Paulo 					const u8 *ies, size_t ies_len)
319e28a4053SRui Paulo {
320e28a4053SRui Paulo 	if (wpa_s->driver->update_ft_ies)
321e28a4053SRui Paulo 		return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
322e28a4053SRui Paulo 						    ies, ies_len);
323e28a4053SRui Paulo 	return -1;
324e28a4053SRui Paulo }
325e28a4053SRui Paulo 
326f05cddf9SRui Paulo static inline int wpa_drv_set_ap(struct wpa_supplicant *wpa_s,
327f05cddf9SRui Paulo 				 struct wpa_driver_ap_params *params)
328e28a4053SRui Paulo {
329f05cddf9SRui Paulo 	if (wpa_s->driver->set_ap)
330f05cddf9SRui Paulo 		return wpa_s->driver->set_ap(wpa_s->drv_priv, params);
331e28a4053SRui Paulo 	return -1;
332e28a4053SRui Paulo }
333e28a4053SRui Paulo 
334e28a4053SRui Paulo static inline int wpa_drv_sta_add(struct wpa_supplicant *wpa_s,
335e28a4053SRui Paulo 				  struct hostapd_sta_add_params *params)
336e28a4053SRui Paulo {
337e28a4053SRui Paulo 	if (wpa_s->driver->sta_add)
338e28a4053SRui Paulo 		return wpa_s->driver->sta_add(wpa_s->drv_priv, params);
339e28a4053SRui Paulo 	return -1;
340e28a4053SRui Paulo }
341e28a4053SRui Paulo 
342e28a4053SRui Paulo static inline int wpa_drv_sta_remove(struct wpa_supplicant *wpa_s,
343e28a4053SRui Paulo 				     const u8 *addr)
344e28a4053SRui Paulo {
345e28a4053SRui Paulo 	if (wpa_s->driver->sta_remove)
346e28a4053SRui Paulo 		return wpa_s->driver->sta_remove(wpa_s->drv_priv, addr);
347e28a4053SRui Paulo 	return -1;
348e28a4053SRui Paulo }
349e28a4053SRui Paulo 
350e28a4053SRui Paulo static inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s,
351e28a4053SRui Paulo 					  const u8 *addr, const u8 *data,
352e28a4053SRui Paulo 					  size_t data_len, int encrypt,
353f05cddf9SRui Paulo 					  const u8 *own_addr, u32 flags)
354e28a4053SRui Paulo {
355e28a4053SRui Paulo 	if (wpa_s->driver->hapd_send_eapol)
356e28a4053SRui Paulo 		return wpa_s->driver->hapd_send_eapol(wpa_s->drv_priv, addr,
357e28a4053SRui Paulo 						      data, data_len, encrypt,
358f05cddf9SRui Paulo 						      own_addr, flags);
359e28a4053SRui Paulo 	return -1;
360e28a4053SRui Paulo }
361e28a4053SRui Paulo 
362e28a4053SRui Paulo static inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
363e28a4053SRui Paulo 					const u8 *addr, int total_flags,
364e28a4053SRui Paulo 					int flags_or, int flags_and)
365e28a4053SRui Paulo {
366e28a4053SRui Paulo 	if (wpa_s->driver->sta_set_flags)
367e28a4053SRui Paulo 		return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
368e28a4053SRui Paulo 						    total_flags, flags_or,
369e28a4053SRui Paulo 						    flags_and);
370e28a4053SRui Paulo 	return -1;
371e28a4053SRui Paulo }
372e28a4053SRui Paulo 
373e28a4053SRui Paulo static inline int wpa_drv_set_supp_port(struct wpa_supplicant *wpa_s,
374e28a4053SRui Paulo 					int authorized)
375e28a4053SRui Paulo {
376e28a4053SRui Paulo 	if (wpa_s->driver->set_supp_port) {
377e28a4053SRui Paulo 		return wpa_s->driver->set_supp_port(wpa_s->drv_priv,
378e28a4053SRui Paulo 						    authorized);
379e28a4053SRui Paulo 	}
380e28a4053SRui Paulo 	return 0;
381e28a4053SRui Paulo }
382e28a4053SRui Paulo 
383e28a4053SRui Paulo static inline int wpa_drv_send_action(struct wpa_supplicant *wpa_s,
384e28a4053SRui Paulo 				      unsigned int freq,
385f05cddf9SRui Paulo 				      unsigned int wait,
386e28a4053SRui Paulo 				      const u8 *dst, const u8 *src,
387e28a4053SRui Paulo 				      const u8 *bssid,
388f05cddf9SRui Paulo 				      const u8 *data, size_t data_len,
389f05cddf9SRui Paulo 				      int no_cck)
390e28a4053SRui Paulo {
391e28a4053SRui Paulo 	if (wpa_s->driver->send_action)
392e28a4053SRui Paulo 		return wpa_s->driver->send_action(wpa_s->drv_priv, freq,
393f05cddf9SRui Paulo 						  wait, dst, src, bssid,
394f05cddf9SRui Paulo 						  data, data_len, no_cck);
395f05cddf9SRui Paulo 	return -1;
396f05cddf9SRui Paulo }
397f05cddf9SRui Paulo 
398f05cddf9SRui Paulo static inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
399f05cddf9SRui Paulo {
400f05cddf9SRui Paulo 	if (wpa_s->driver->send_action_cancel_wait)
401f05cddf9SRui Paulo 		wpa_s->driver->send_action_cancel_wait(wpa_s->drv_priv);
402f05cddf9SRui Paulo }
403f05cddf9SRui Paulo 
404f05cddf9SRui Paulo static inline int wpa_drv_set_freq(struct wpa_supplicant *wpa_s,
405f05cddf9SRui Paulo 				   struct hostapd_freq_params *freq)
406f05cddf9SRui Paulo {
407f05cddf9SRui Paulo 	if (wpa_s->driver->set_freq)
408f05cddf9SRui Paulo 		return wpa_s->driver->set_freq(wpa_s->drv_priv, freq);
409e28a4053SRui Paulo 	return -1;
410e28a4053SRui Paulo }
411e28a4053SRui Paulo 
412e28a4053SRui Paulo static inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s,
413e28a4053SRui Paulo 				 enum wpa_driver_if_type type,
414e28a4053SRui Paulo 				 const char *ifname, const u8 *addr,
415e28a4053SRui Paulo 				 void *bss_ctx, char *force_ifname,
416f05cddf9SRui Paulo 				 u8 *if_addr, const char *bridge)
417e28a4053SRui Paulo {
418e28a4053SRui Paulo 	if (wpa_s->driver->if_add)
419e28a4053SRui Paulo 		return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname,
420e28a4053SRui Paulo 					     addr, bss_ctx, NULL, force_ifname,
421780fb4a2SCy Schubert 					     if_addr, bridge, 0, 0);
422e28a4053SRui Paulo 	return -1;
423e28a4053SRui Paulo }
424e28a4053SRui Paulo 
425e28a4053SRui Paulo static inline int wpa_drv_if_remove(struct wpa_supplicant *wpa_s,
426e28a4053SRui Paulo 				    enum wpa_driver_if_type type,
427e28a4053SRui Paulo 				    const char *ifname)
428e28a4053SRui Paulo {
429e28a4053SRui Paulo 	if (wpa_s->driver->if_remove)
430e28a4053SRui Paulo 		return wpa_s->driver->if_remove(wpa_s->drv_priv, type, ifname);
431e28a4053SRui Paulo 	return -1;
432e28a4053SRui Paulo }
433e28a4053SRui Paulo 
434e28a4053SRui Paulo static inline int wpa_drv_remain_on_channel(struct wpa_supplicant *wpa_s,
435e28a4053SRui Paulo 					    unsigned int freq,
436e28a4053SRui Paulo 					    unsigned int duration)
437e28a4053SRui Paulo {
438e28a4053SRui Paulo 	if (wpa_s->driver->remain_on_channel)
439e28a4053SRui Paulo 		return wpa_s->driver->remain_on_channel(wpa_s->drv_priv, freq,
440e28a4053SRui Paulo 							duration);
441e28a4053SRui Paulo 	return -1;
442e28a4053SRui Paulo }
443e28a4053SRui Paulo 
444e28a4053SRui Paulo static inline int wpa_drv_cancel_remain_on_channel(
445e28a4053SRui Paulo 	struct wpa_supplicant *wpa_s)
446e28a4053SRui Paulo {
447e28a4053SRui Paulo 	if (wpa_s->driver->cancel_remain_on_channel)
448e28a4053SRui Paulo 		return wpa_s->driver->cancel_remain_on_channel(
449e28a4053SRui Paulo 			wpa_s->drv_priv);
450e28a4053SRui Paulo 	return -1;
451e28a4053SRui Paulo }
452e28a4053SRui Paulo 
453e28a4053SRui Paulo static inline int wpa_drv_probe_req_report(struct wpa_supplicant *wpa_s,
454e28a4053SRui Paulo 					   int report)
455e28a4053SRui Paulo {
456e28a4053SRui Paulo 	if (wpa_s->driver->probe_req_report)
457e28a4053SRui Paulo 		return wpa_s->driver->probe_req_report(wpa_s->drv_priv,
458e28a4053SRui Paulo 						       report);
459e28a4053SRui Paulo 	return -1;
460e28a4053SRui Paulo }
461e28a4053SRui Paulo 
462e28a4053SRui Paulo static inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
463e28a4053SRui Paulo {
464e28a4053SRui Paulo 	if (wpa_s->driver->deinit_ap)
465e28a4053SRui Paulo 		return wpa_s->driver->deinit_ap(wpa_s->drv_priv);
466e28a4053SRui Paulo 	return 0;
467e28a4053SRui Paulo }
468e28a4053SRui Paulo 
469f05cddf9SRui Paulo static inline int wpa_drv_deinit_p2p_cli(struct wpa_supplicant *wpa_s)
470f05cddf9SRui Paulo {
471f05cddf9SRui Paulo 	if (wpa_s->driver->deinit_p2p_cli)
472f05cddf9SRui Paulo 		return wpa_s->driver->deinit_p2p_cli(wpa_s->drv_priv);
473f05cddf9SRui Paulo 	return 0;
474f05cddf9SRui Paulo }
475f05cddf9SRui Paulo 
476e28a4053SRui Paulo static inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
477e28a4053SRui Paulo {
478e28a4053SRui Paulo 	if (wpa_s->driver->suspend)
479e28a4053SRui Paulo 		wpa_s->driver->suspend(wpa_s->drv_priv);
480e28a4053SRui Paulo }
481e28a4053SRui Paulo 
482e28a4053SRui Paulo static inline void wpa_drv_resume(struct wpa_supplicant *wpa_s)
483e28a4053SRui Paulo {
484e28a4053SRui Paulo 	if (wpa_s->driver->resume)
485e28a4053SRui Paulo 		wpa_s->driver->resume(wpa_s->drv_priv);
486e28a4053SRui Paulo }
487e28a4053SRui Paulo 
488e28a4053SRui Paulo static inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s,
489e28a4053SRui Paulo 					 int threshold, int hysteresis)
490e28a4053SRui Paulo {
491e28a4053SRui Paulo 	if (wpa_s->driver->signal_monitor)
492e28a4053SRui Paulo 		return wpa_s->driver->signal_monitor(wpa_s->drv_priv,
493e28a4053SRui Paulo 						     threshold, hysteresis);
494e28a4053SRui Paulo 	return -1;
495e28a4053SRui Paulo }
496e28a4053SRui Paulo 
497f05cddf9SRui Paulo static inline int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
498f05cddf9SRui Paulo 				      struct wpa_signal_info *si)
499f05cddf9SRui Paulo {
500f05cddf9SRui Paulo 	if (wpa_s->driver->signal_poll)
501f05cddf9SRui Paulo 		return wpa_s->driver->signal_poll(wpa_s->drv_priv, si);
502f05cddf9SRui Paulo 	return -1;
503f05cddf9SRui Paulo }
504f05cddf9SRui Paulo 
5054bc52338SCy Schubert static inline int wpa_drv_channel_info(struct wpa_supplicant *wpa_s,
5064bc52338SCy Schubert 				       struct wpa_channel_info *ci)
5074bc52338SCy Schubert {
5084bc52338SCy Schubert 	if (wpa_s->driver->channel_info)
5094bc52338SCy Schubert 		return wpa_s->driver->channel_info(wpa_s->drv_priv, ci);
5104bc52338SCy Schubert 	return -1;
5114bc52338SCy Schubert }
5124bc52338SCy Schubert 
513f05cddf9SRui Paulo static inline int wpa_drv_pktcnt_poll(struct wpa_supplicant *wpa_s,
514f05cddf9SRui Paulo 				      struct hostap_sta_driver_data *sta)
515f05cddf9SRui Paulo {
516f05cddf9SRui Paulo 	if (wpa_s->driver->read_sta_data)
517f05cddf9SRui Paulo 		return wpa_s->driver->read_sta_data(wpa_s->drv_priv, sta,
518f05cddf9SRui Paulo 						    wpa_s->bssid);
519f05cddf9SRui Paulo 	return -1;
520f05cddf9SRui Paulo }
521f05cddf9SRui Paulo 
522e28a4053SRui Paulo static inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
523e28a4053SRui Paulo 					const struct wpabuf *beacon,
524f05cddf9SRui Paulo 					const struct wpabuf *proberesp,
525f05cddf9SRui Paulo 					const struct wpabuf *assocresp)
526e28a4053SRui Paulo {
527e28a4053SRui Paulo 	if (!wpa_s->driver->set_ap_wps_ie)
528e28a4053SRui Paulo 		return -1;
529e28a4053SRui Paulo 	return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon,
530f05cddf9SRui Paulo 					    proberesp, assocresp);
531f05cddf9SRui Paulo }
532f05cddf9SRui Paulo 
533f05cddf9SRui Paulo static inline int wpa_drv_get_noa(struct wpa_supplicant *wpa_s,
534f05cddf9SRui Paulo 				  u8 *buf, size_t buf_len)
535f05cddf9SRui Paulo {
536f05cddf9SRui Paulo 	if (!wpa_s->driver->get_noa)
537f05cddf9SRui Paulo 		return -1;
538f05cddf9SRui Paulo 	return wpa_s->driver->get_noa(wpa_s->drv_priv, buf, buf_len);
539f05cddf9SRui Paulo }
540f05cddf9SRui Paulo 
541f05cddf9SRui Paulo static inline int wpa_drv_set_p2p_powersave(struct wpa_supplicant *wpa_s,
542f05cddf9SRui Paulo 					    int legacy_ps, int opp_ps,
543f05cddf9SRui Paulo 					    int ctwindow)
544f05cddf9SRui Paulo {
545f05cddf9SRui Paulo 	if (!wpa_s->driver->set_p2p_powersave)
546f05cddf9SRui Paulo 		return -1;
547f05cddf9SRui Paulo 	return wpa_s->driver->set_p2p_powersave(wpa_s->drv_priv, legacy_ps,
548f05cddf9SRui Paulo 						opp_ps, ctwindow);
549f05cddf9SRui Paulo }
550f05cddf9SRui Paulo 
551f05cddf9SRui Paulo static inline int wpa_drv_ampdu(struct wpa_supplicant *wpa_s, int ampdu)
552f05cddf9SRui Paulo {
553f05cddf9SRui Paulo 	if (!wpa_s->driver->ampdu)
554f05cddf9SRui Paulo 		return -1;
555f05cddf9SRui Paulo 	return wpa_s->driver->ampdu(wpa_s->drv_priv, ampdu);
556f05cddf9SRui Paulo }
557f05cddf9SRui Paulo 
558f05cddf9SRui Paulo static inline int wpa_drv_send_tdls_mgmt(struct wpa_supplicant *wpa_s,
559f05cddf9SRui Paulo 					 const u8 *dst, u8 action_code,
560f05cddf9SRui Paulo 					 u8 dialog_token, u16 status_code,
5615b9c547cSRui Paulo 					 u32 peer_capab, int initiator,
562f05cddf9SRui Paulo 					 const u8 *buf, size_t len)
563f05cddf9SRui Paulo {
564f05cddf9SRui Paulo 	if (wpa_s->driver->send_tdls_mgmt) {
565f05cddf9SRui Paulo 		return wpa_s->driver->send_tdls_mgmt(wpa_s->drv_priv, dst,
566f05cddf9SRui Paulo 						     action_code, dialog_token,
5675b9c547cSRui Paulo 						     status_code, peer_capab,
5685b9c547cSRui Paulo 						     initiator, buf, len);
569f05cddf9SRui Paulo 	}
570f05cddf9SRui Paulo 	return -1;
571f05cddf9SRui Paulo }
572f05cddf9SRui Paulo 
573f05cddf9SRui Paulo static inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
574f05cddf9SRui Paulo 				    enum tdls_oper oper, const u8 *peer)
575f05cddf9SRui Paulo {
576f05cddf9SRui Paulo 	if (!wpa_s->driver->tdls_oper)
577f05cddf9SRui Paulo 		return -1;
578f05cddf9SRui Paulo 	return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
579f05cddf9SRui Paulo }
580f05cddf9SRui Paulo 
5815b9c547cSRui Paulo #ifdef ANDROID
5825b9c547cSRui Paulo static inline int wpa_drv_driver_cmd(struct wpa_supplicant *wpa_s,
5835b9c547cSRui Paulo 				     char *cmd, char *buf, size_t buf_len)
5845b9c547cSRui Paulo {
5855b9c547cSRui Paulo 	if (!wpa_s->driver->driver_cmd)
5865b9c547cSRui Paulo 		return -1;
5875b9c547cSRui Paulo 	return wpa_s->driver->driver_cmd(wpa_s->drv_priv, cmd, buf, buf_len);
5885b9c547cSRui Paulo }
5895b9c547cSRui Paulo #endif /* ANDROID */
5905b9c547cSRui Paulo 
591f05cddf9SRui Paulo static inline void wpa_drv_set_rekey_info(struct wpa_supplicant *wpa_s,
5925b9c547cSRui Paulo 					  const u8 *kek, size_t kek_len,
5935b9c547cSRui Paulo 					  const u8 *kck, size_t kck_len,
594f05cddf9SRui Paulo 					  const u8 *replay_ctr)
595f05cddf9SRui Paulo {
596f05cddf9SRui Paulo 	if (!wpa_s->driver->set_rekey_info)
597f05cddf9SRui Paulo 		return;
5985b9c547cSRui Paulo 	wpa_s->driver->set_rekey_info(wpa_s->drv_priv, kek, kek_len,
5995b9c547cSRui Paulo 				      kck, kck_len, replay_ctr);
600f05cddf9SRui Paulo }
601f05cddf9SRui Paulo 
602f05cddf9SRui Paulo static inline int wpa_drv_radio_disable(struct wpa_supplicant *wpa_s,
603f05cddf9SRui Paulo 					int disabled)
604f05cddf9SRui Paulo {
605f05cddf9SRui Paulo 	if (!wpa_s->driver->radio_disable)
606f05cddf9SRui Paulo 		return -1;
607f05cddf9SRui Paulo 	return wpa_s->driver->radio_disable(wpa_s->drv_priv, disabled);
608f05cddf9SRui Paulo }
609f05cddf9SRui Paulo 
610f05cddf9SRui Paulo static inline int wpa_drv_switch_channel(struct wpa_supplicant *wpa_s,
6115b9c547cSRui Paulo 					 struct csa_settings *settings)
612f05cddf9SRui Paulo {
613f05cddf9SRui Paulo 	if (!wpa_s->driver->switch_channel)
614f05cddf9SRui Paulo 		return -1;
6155b9c547cSRui Paulo 	return wpa_s->driver->switch_channel(wpa_s->drv_priv, settings);
6165b9c547cSRui Paulo }
6175b9c547cSRui Paulo 
6185b9c547cSRui Paulo static inline int wpa_drv_add_ts(struct wpa_supplicant *wpa_s, u8 tsid,
6195b9c547cSRui Paulo 				 const u8 *address, u8 user_priority,
6205b9c547cSRui Paulo 				 u16 admitted_time)
6215b9c547cSRui Paulo {
6225b9c547cSRui Paulo 	if (!wpa_s->driver->add_tx_ts)
6235b9c547cSRui Paulo 		return -1;
6245b9c547cSRui Paulo 	return wpa_s->driver->add_tx_ts(wpa_s->drv_priv, tsid, address,
6255b9c547cSRui Paulo 					user_priority, admitted_time);
6265b9c547cSRui Paulo }
6275b9c547cSRui Paulo 
6285b9c547cSRui Paulo static inline int wpa_drv_del_ts(struct wpa_supplicant *wpa_s, u8 tid,
6295b9c547cSRui Paulo 				 const u8 *address)
6305b9c547cSRui Paulo {
6315b9c547cSRui Paulo 	if (!wpa_s->driver->del_tx_ts)
6325b9c547cSRui Paulo 		return -1;
6335b9c547cSRui Paulo 	return wpa_s->driver->del_tx_ts(wpa_s->drv_priv, tid, address);
6345b9c547cSRui Paulo }
6355b9c547cSRui Paulo 
6365b9c547cSRui Paulo static inline int wpa_drv_tdls_enable_channel_switch(
6375b9c547cSRui Paulo 	struct wpa_supplicant *wpa_s, const u8 *addr, u8 oper_class,
6385b9c547cSRui Paulo 	const struct hostapd_freq_params *freq_params)
6395b9c547cSRui Paulo {
6405b9c547cSRui Paulo 	if (!wpa_s->driver->tdls_enable_channel_switch)
6415b9c547cSRui Paulo 		return -1;
6425b9c547cSRui Paulo 	return wpa_s->driver->tdls_enable_channel_switch(wpa_s->drv_priv, addr,
6435b9c547cSRui Paulo 							 oper_class,
6445b9c547cSRui Paulo 							 freq_params);
6455b9c547cSRui Paulo }
6465b9c547cSRui Paulo 
6475b9c547cSRui Paulo static inline int
6485b9c547cSRui Paulo wpa_drv_tdls_disable_channel_switch(struct wpa_supplicant *wpa_s,
6495b9c547cSRui Paulo 				    const u8 *addr)
6505b9c547cSRui Paulo {
6515b9c547cSRui Paulo 	if (!wpa_s->driver->tdls_disable_channel_switch)
6525b9c547cSRui Paulo 		return -1;
6535b9c547cSRui Paulo 	return wpa_s->driver->tdls_disable_channel_switch(wpa_s->drv_priv,
6545b9c547cSRui Paulo 							  addr);
655f05cddf9SRui Paulo }
656f05cddf9SRui Paulo 
657f05cddf9SRui Paulo static inline int wpa_drv_wnm_oper(struct wpa_supplicant *wpa_s,
658f05cddf9SRui Paulo 				   enum wnm_oper oper, const u8 *peer,
659f05cddf9SRui Paulo 				   u8 *buf, u16 *buf_len)
660f05cddf9SRui Paulo {
661f05cddf9SRui Paulo 	if (!wpa_s->driver->wnm_oper)
662f05cddf9SRui Paulo 		return -1;
663f05cddf9SRui Paulo 	return wpa_s->driver->wnm_oper(wpa_s->drv_priv, oper, peer, buf,
664f05cddf9SRui Paulo 				       buf_len);
665e28a4053SRui Paulo }
666e28a4053SRui Paulo 
6675b9c547cSRui Paulo static inline int wpa_drv_status(struct wpa_supplicant *wpa_s,
6685b9c547cSRui Paulo 				 char *buf, size_t buflen)
6695b9c547cSRui Paulo {
6705b9c547cSRui Paulo 	if (!wpa_s->driver->status)
6715b9c547cSRui Paulo 		return -1;
6725b9c547cSRui Paulo 	return wpa_s->driver->status(wpa_s->drv_priv, buf, buflen);
6735b9c547cSRui Paulo }
6745b9c547cSRui Paulo 
6755b9c547cSRui Paulo static inline int wpa_drv_set_qos_map(struct wpa_supplicant *wpa_s,
6765b9c547cSRui Paulo 				      const u8 *qos_map_set, u8 qos_map_set_len)
6775b9c547cSRui Paulo {
6785b9c547cSRui Paulo 	if (!wpa_s->driver->set_qos_map)
6795b9c547cSRui Paulo 		return -1;
6805b9c547cSRui Paulo 	return wpa_s->driver->set_qos_map(wpa_s->drv_priv, qos_map_set,
6815b9c547cSRui Paulo 					  qos_map_set_len);
6825b9c547cSRui Paulo }
6835b9c547cSRui Paulo 
6845b9c547cSRui Paulo static inline int wpa_drv_wowlan(struct wpa_supplicant *wpa_s,
6855b9c547cSRui Paulo 				 const struct wowlan_triggers *triggers)
6865b9c547cSRui Paulo {
6875b9c547cSRui Paulo 	if (!wpa_s->driver->set_wowlan)
6885b9c547cSRui Paulo 		return -1;
6895b9c547cSRui Paulo 	return wpa_s->driver->set_wowlan(wpa_s->drv_priv, triggers);
6905b9c547cSRui Paulo }
6915b9c547cSRui Paulo 
6925b9c547cSRui Paulo static inline int wpa_drv_vendor_cmd(struct wpa_supplicant *wpa_s,
6935b9c547cSRui Paulo 				     int vendor_id, int subcmd, const u8 *data,
6945b9c547cSRui Paulo 				     size_t data_len, struct wpabuf *buf)
6955b9c547cSRui Paulo {
6965b9c547cSRui Paulo 	if (!wpa_s->driver->vendor_cmd)
6975b9c547cSRui Paulo 		return -1;
6985b9c547cSRui Paulo 	return wpa_s->driver->vendor_cmd(wpa_s->drv_priv, vendor_id, subcmd,
6995b9c547cSRui Paulo 					 data, data_len, buf);
7005b9c547cSRui Paulo }
7015b9c547cSRui Paulo 
7025b9c547cSRui Paulo static inline int wpa_drv_roaming(struct wpa_supplicant *wpa_s, int allowed,
7035b9c547cSRui Paulo 				  const u8 *bssid)
7045b9c547cSRui Paulo {
7055b9c547cSRui Paulo 	if (!wpa_s->driver->roaming)
7065b9c547cSRui Paulo 		return -1;
7075b9c547cSRui Paulo 	return wpa_s->driver->roaming(wpa_s->drv_priv, allowed, bssid);
7085b9c547cSRui Paulo }
7095b9c547cSRui Paulo 
71085732ac8SCy Schubert static inline int wpa_drv_disable_fils(struct wpa_supplicant *wpa_s,
71185732ac8SCy Schubert 				       int disable)
71285732ac8SCy Schubert {
71385732ac8SCy Schubert 	if (!wpa_s->driver->disable_fils)
71485732ac8SCy Schubert 		return -1;
71585732ac8SCy Schubert 	return wpa_s->driver->disable_fils(wpa_s->drv_priv, disable);
71685732ac8SCy Schubert }
71785732ac8SCy Schubert 
7185b9c547cSRui Paulo static inline int wpa_drv_set_mac_addr(struct wpa_supplicant *wpa_s,
7195b9c547cSRui Paulo 				       const u8 *addr)
7205b9c547cSRui Paulo {
7215b9c547cSRui Paulo 	if (!wpa_s->driver->set_mac_addr)
7225b9c547cSRui Paulo 		return -1;
7235b9c547cSRui Paulo 	return wpa_s->driver->set_mac_addr(wpa_s->drv_priv, addr);
7245b9c547cSRui Paulo }
7255b9c547cSRui Paulo 
7265b9c547cSRui Paulo 
7275b9c547cSRui Paulo #ifdef CONFIG_MACSEC
7285b9c547cSRui Paulo 
7295b9c547cSRui Paulo static inline int wpa_drv_macsec_init(struct wpa_supplicant *wpa_s,
7305b9c547cSRui Paulo 				      struct macsec_init_params *params)
7315b9c547cSRui Paulo {
7325b9c547cSRui Paulo 	if (!wpa_s->driver->macsec_init)
7335b9c547cSRui Paulo 		return -1;
7345b9c547cSRui Paulo 	return wpa_s->driver->macsec_init(wpa_s->drv_priv, params);
7355b9c547cSRui Paulo }
7365b9c547cSRui Paulo 
7375b9c547cSRui Paulo static inline int wpa_drv_macsec_deinit(struct wpa_supplicant *wpa_s)
7385b9c547cSRui Paulo {
7395b9c547cSRui Paulo 	if (!wpa_s->driver->macsec_deinit)
7405b9c547cSRui Paulo 		return -1;
7415b9c547cSRui Paulo 	return wpa_s->driver->macsec_deinit(wpa_s->drv_priv);
7425b9c547cSRui Paulo }
7435b9c547cSRui Paulo 
74485732ac8SCy Schubert static inline int wpa_drv_macsec_get_capability(struct wpa_supplicant *wpa_s,
74585732ac8SCy Schubert 						enum macsec_cap *cap)
74685732ac8SCy Schubert {
74785732ac8SCy Schubert 	if (!wpa_s->driver->macsec_get_capability)
74885732ac8SCy Schubert 		return -1;
74985732ac8SCy Schubert 	return wpa_s->driver->macsec_get_capability(wpa_s->drv_priv, cap);
75085732ac8SCy Schubert }
75185732ac8SCy Schubert 
7525b9c547cSRui Paulo static inline int wpa_drv_enable_protect_frames(struct wpa_supplicant *wpa_s,
7535b9c547cSRui Paulo 						Boolean enabled)
7545b9c547cSRui Paulo {
7555b9c547cSRui Paulo 	if (!wpa_s->driver->enable_protect_frames)
7565b9c547cSRui Paulo 		return -1;
7575b9c547cSRui Paulo 	return wpa_s->driver->enable_protect_frames(wpa_s->drv_priv, enabled);
7585b9c547cSRui Paulo }
7595b9c547cSRui Paulo 
76085732ac8SCy Schubert static inline int wpa_drv_enable_encrypt(struct wpa_supplicant *wpa_s,
76185732ac8SCy Schubert 						Boolean enabled)
76285732ac8SCy Schubert {
76385732ac8SCy Schubert 	if (!wpa_s->driver->enable_encrypt)
76485732ac8SCy Schubert 		return -1;
76585732ac8SCy Schubert 	return wpa_s->driver->enable_encrypt(wpa_s->drv_priv, enabled);
76685732ac8SCy Schubert }
76785732ac8SCy Schubert 
7685b9c547cSRui Paulo static inline int wpa_drv_set_replay_protect(struct wpa_supplicant *wpa_s,
7695b9c547cSRui Paulo 					     Boolean enabled, u32 window)
7705b9c547cSRui Paulo {
7715b9c547cSRui Paulo 	if (!wpa_s->driver->set_replay_protect)
7725b9c547cSRui Paulo 		return -1;
7735b9c547cSRui Paulo 	return wpa_s->driver->set_replay_protect(wpa_s->drv_priv, enabled,
7745b9c547cSRui Paulo 						 window);
7755b9c547cSRui Paulo }
7765b9c547cSRui Paulo 
7775b9c547cSRui Paulo static inline int wpa_drv_set_current_cipher_suite(struct wpa_supplicant *wpa_s,
778780fb4a2SCy Schubert 						   u64 cs)
7795b9c547cSRui Paulo {
7805b9c547cSRui Paulo 	if (!wpa_s->driver->set_current_cipher_suite)
7815b9c547cSRui Paulo 		return -1;
782780fb4a2SCy Schubert 	return wpa_s->driver->set_current_cipher_suite(wpa_s->drv_priv, cs);
7835b9c547cSRui Paulo }
7845b9c547cSRui Paulo 
7855b9c547cSRui Paulo static inline int wpa_drv_enable_controlled_port(struct wpa_supplicant *wpa_s,
7865b9c547cSRui Paulo 						 Boolean enabled)
7875b9c547cSRui Paulo {
7885b9c547cSRui Paulo 	if (!wpa_s->driver->enable_controlled_port)
7895b9c547cSRui Paulo 		return -1;
7905b9c547cSRui Paulo 	return wpa_s->driver->enable_controlled_port(wpa_s->drv_priv, enabled);
7915b9c547cSRui Paulo }
7925b9c547cSRui Paulo 
7935b9c547cSRui Paulo static inline int wpa_drv_get_receive_lowest_pn(struct wpa_supplicant *wpa_s,
79485732ac8SCy Schubert 						struct receive_sa *sa)
7955b9c547cSRui Paulo {
7965b9c547cSRui Paulo 	if (!wpa_s->driver->get_receive_lowest_pn)
7975b9c547cSRui Paulo 		return -1;
79885732ac8SCy Schubert 	return wpa_s->driver->get_receive_lowest_pn(wpa_s->drv_priv, sa);
7995b9c547cSRui Paulo }
8005b9c547cSRui Paulo 
8015b9c547cSRui Paulo static inline int wpa_drv_get_transmit_next_pn(struct wpa_supplicant *wpa_s,
80285732ac8SCy Schubert 						struct transmit_sa *sa)
8035b9c547cSRui Paulo {
8045b9c547cSRui Paulo 	if (!wpa_s->driver->get_transmit_next_pn)
8055b9c547cSRui Paulo 		return -1;
80685732ac8SCy Schubert 	return wpa_s->driver->get_transmit_next_pn(wpa_s->drv_priv, sa);
8075b9c547cSRui Paulo }
8085b9c547cSRui Paulo 
8095b9c547cSRui Paulo static inline int wpa_drv_set_transmit_next_pn(struct wpa_supplicant *wpa_s,
81085732ac8SCy Schubert 						struct transmit_sa *sa)
8115b9c547cSRui Paulo {
8125b9c547cSRui Paulo 	if (!wpa_s->driver->set_transmit_next_pn)
8135b9c547cSRui Paulo 		return -1;
81485732ac8SCy Schubert 	return wpa_s->driver->set_transmit_next_pn(wpa_s->drv_priv, sa);
8155b9c547cSRui Paulo }
8165b9c547cSRui Paulo 
8174bc52338SCy Schubert static inline int wpa_drv_set_receive_lowest_pn(struct wpa_supplicant *wpa_s,
8184bc52338SCy Schubert 						struct receive_sa *sa)
8194bc52338SCy Schubert {
8204bc52338SCy Schubert 	if (!wpa_s->driver->set_receive_lowest_pn)
8214bc52338SCy Schubert 		return -1;
8224bc52338SCy Schubert 	return wpa_s->driver->set_receive_lowest_pn(wpa_s->drv_priv, sa);
8234bc52338SCy Schubert }
8244bc52338SCy Schubert 
8255b9c547cSRui Paulo static inline int
82685732ac8SCy Schubert wpa_drv_create_receive_sc(struct wpa_supplicant *wpa_s, struct receive_sc *sc,
8275b9c547cSRui Paulo 			  unsigned int conf_offset, int validation)
8285b9c547cSRui Paulo {
8295b9c547cSRui Paulo 	if (!wpa_s->driver->create_receive_sc)
8305b9c547cSRui Paulo 		return -1;
83185732ac8SCy Schubert 	return wpa_s->driver->create_receive_sc(wpa_s->drv_priv, sc,
83285732ac8SCy Schubert 						conf_offset, validation);
8335b9c547cSRui Paulo }
8345b9c547cSRui Paulo 
8355b9c547cSRui Paulo static inline int wpa_drv_delete_receive_sc(struct wpa_supplicant *wpa_s,
83685732ac8SCy Schubert 					    struct receive_sc *sc)
8375b9c547cSRui Paulo {
8385b9c547cSRui Paulo 	if (!wpa_s->driver->delete_receive_sc)
8395b9c547cSRui Paulo 		return -1;
84085732ac8SCy Schubert 	return wpa_s->driver->delete_receive_sc(wpa_s->drv_priv, sc);
8415b9c547cSRui Paulo }
8425b9c547cSRui Paulo 
8435b9c547cSRui Paulo static inline int wpa_drv_create_receive_sa(struct wpa_supplicant *wpa_s,
84485732ac8SCy Schubert 					    struct receive_sa *sa)
8455b9c547cSRui Paulo {
8465b9c547cSRui Paulo 	if (!wpa_s->driver->create_receive_sa)
8475b9c547cSRui Paulo 		return -1;
84885732ac8SCy Schubert 	return wpa_s->driver->create_receive_sa(wpa_s->drv_priv, sa);
84985732ac8SCy Schubert }
85085732ac8SCy Schubert 
85185732ac8SCy Schubert static inline int wpa_drv_delete_receive_sa(struct wpa_supplicant *wpa_s,
85285732ac8SCy Schubert 					    struct receive_sa *sa)
85385732ac8SCy Schubert {
85485732ac8SCy Schubert 	if (!wpa_s->driver->delete_receive_sa)
85585732ac8SCy Schubert 		return -1;
85685732ac8SCy Schubert 	return wpa_s->driver->delete_receive_sa(wpa_s->drv_priv, sa);
8575b9c547cSRui Paulo }
8585b9c547cSRui Paulo 
8595b9c547cSRui Paulo static inline int wpa_drv_enable_receive_sa(struct wpa_supplicant *wpa_s,
86085732ac8SCy Schubert 					    struct receive_sa *sa)
8615b9c547cSRui Paulo {
8625b9c547cSRui Paulo 	if (!wpa_s->driver->enable_receive_sa)
8635b9c547cSRui Paulo 		return -1;
86485732ac8SCy Schubert 	return wpa_s->driver->enable_receive_sa(wpa_s->drv_priv, sa);
8655b9c547cSRui Paulo }
8665b9c547cSRui Paulo 
8675b9c547cSRui Paulo static inline int wpa_drv_disable_receive_sa(struct wpa_supplicant *wpa_s,
86885732ac8SCy Schubert 					     struct receive_sa *sa)
8695b9c547cSRui Paulo {
8705b9c547cSRui Paulo 	if (!wpa_s->driver->disable_receive_sa)
8715b9c547cSRui Paulo 		return -1;
87285732ac8SCy Schubert 	return wpa_s->driver->disable_receive_sa(wpa_s->drv_priv, sa);
8735b9c547cSRui Paulo }
8745b9c547cSRui Paulo 
8755b9c547cSRui Paulo static inline int
87685732ac8SCy Schubert wpa_drv_create_transmit_sc(struct wpa_supplicant *wpa_s, struct transmit_sc *sc,
8775b9c547cSRui Paulo 			   unsigned int conf_offset)
8785b9c547cSRui Paulo {
8795b9c547cSRui Paulo 	if (!wpa_s->driver->create_transmit_sc)
8805b9c547cSRui Paulo 		return -1;
88185732ac8SCy Schubert 	return wpa_s->driver->create_transmit_sc(wpa_s->drv_priv, sc,
8825b9c547cSRui Paulo 						 conf_offset);
8835b9c547cSRui Paulo }
8845b9c547cSRui Paulo 
8855b9c547cSRui Paulo static inline int wpa_drv_delete_transmit_sc(struct wpa_supplicant *wpa_s,
88685732ac8SCy Schubert 					     struct transmit_sc *sc)
8875b9c547cSRui Paulo {
8885b9c547cSRui Paulo 	if (!wpa_s->driver->delete_transmit_sc)
8895b9c547cSRui Paulo 		return -1;
89085732ac8SCy Schubert 	return wpa_s->driver->delete_transmit_sc(wpa_s->drv_priv, sc);
8915b9c547cSRui Paulo }
8925b9c547cSRui Paulo 
8935b9c547cSRui Paulo static inline int wpa_drv_create_transmit_sa(struct wpa_supplicant *wpa_s,
89485732ac8SCy Schubert 					     struct transmit_sa *sa)
8955b9c547cSRui Paulo {
8965b9c547cSRui Paulo 	if (!wpa_s->driver->create_transmit_sa)
8975b9c547cSRui Paulo 		return -1;
89885732ac8SCy Schubert 	return wpa_s->driver->create_transmit_sa(wpa_s->drv_priv, sa);
89985732ac8SCy Schubert }
90085732ac8SCy Schubert 
90185732ac8SCy Schubert static inline int wpa_drv_delete_transmit_sa(struct wpa_supplicant *wpa_s,
90285732ac8SCy Schubert 					     struct transmit_sa *sa)
90385732ac8SCy Schubert {
90485732ac8SCy Schubert 	if (!wpa_s->driver->delete_transmit_sa)
90585732ac8SCy Schubert 		return -1;
90685732ac8SCy Schubert 	return wpa_s->driver->delete_transmit_sa(wpa_s->drv_priv, sa);
9075b9c547cSRui Paulo }
9085b9c547cSRui Paulo 
9095b9c547cSRui Paulo static inline int wpa_drv_enable_transmit_sa(struct wpa_supplicant *wpa_s,
91085732ac8SCy Schubert 					     struct transmit_sa *sa)
9115b9c547cSRui Paulo {
9125b9c547cSRui Paulo 	if (!wpa_s->driver->enable_transmit_sa)
9135b9c547cSRui Paulo 		return -1;
91485732ac8SCy Schubert 	return wpa_s->driver->enable_transmit_sa(wpa_s->drv_priv, sa);
9155b9c547cSRui Paulo }
9165b9c547cSRui Paulo 
9175b9c547cSRui Paulo static inline int wpa_drv_disable_transmit_sa(struct wpa_supplicant *wpa_s,
91885732ac8SCy Schubert 					      struct transmit_sa *sa)
9195b9c547cSRui Paulo {
9205b9c547cSRui Paulo 	if (!wpa_s->driver->disable_transmit_sa)
9215b9c547cSRui Paulo 		return -1;
92285732ac8SCy Schubert 	return wpa_s->driver->disable_transmit_sa(wpa_s->drv_priv, sa);
9235b9c547cSRui Paulo }
9245b9c547cSRui Paulo #endif /* CONFIG_MACSEC */
9255b9c547cSRui Paulo 
926325151a3SRui Paulo static inline int wpa_drv_setband(struct wpa_supplicant *wpa_s,
927325151a3SRui Paulo 				  enum set_band band)
928325151a3SRui Paulo {
929325151a3SRui Paulo 	if (!wpa_s->driver->set_band)
930325151a3SRui Paulo 		return -1;
931325151a3SRui Paulo 	return wpa_s->driver->set_band(wpa_s->drv_priv, band);
932325151a3SRui Paulo }
933325151a3SRui Paulo 
934325151a3SRui Paulo static inline int wpa_drv_get_pref_freq_list(struct wpa_supplicant *wpa_s,
935325151a3SRui Paulo 					     enum wpa_driver_if_type if_type,
936325151a3SRui Paulo 					     unsigned int *num,
937325151a3SRui Paulo 					     unsigned int *freq_list)
938325151a3SRui Paulo {
93985732ac8SCy Schubert #ifdef CONFIG_TESTING_OPTIONS
94085732ac8SCy Schubert 	if (wpa_s->get_pref_freq_list_override)
94185732ac8SCy Schubert 		return wpas_ctrl_iface_get_pref_freq_list_override(
94285732ac8SCy Schubert 			wpa_s, if_type, num, freq_list);
94385732ac8SCy Schubert #endif /* CONFIG_TESTING_OPTIONS */
944325151a3SRui Paulo 	if (!wpa_s->driver->get_pref_freq_list)
945325151a3SRui Paulo 		return -1;
946325151a3SRui Paulo 	return wpa_s->driver->get_pref_freq_list(wpa_s->drv_priv, if_type,
947325151a3SRui Paulo 						 num, freq_list);
948325151a3SRui Paulo }
949325151a3SRui Paulo 
950325151a3SRui Paulo static inline int wpa_drv_set_prob_oper_freq(struct wpa_supplicant *wpa_s,
951325151a3SRui Paulo 					     unsigned int freq)
952325151a3SRui Paulo {
953325151a3SRui Paulo 	if (!wpa_s->driver->set_prob_oper_freq)
954325151a3SRui Paulo 		return 0;
955325151a3SRui Paulo 	return wpa_s->driver->set_prob_oper_freq(wpa_s->drv_priv, freq);
956325151a3SRui Paulo }
957325151a3SRui Paulo 
95885732ac8SCy Schubert static inline int wpa_drv_abort_scan(struct wpa_supplicant *wpa_s,
95985732ac8SCy Schubert 				     u64 scan_cookie)
960780fb4a2SCy Schubert {
961780fb4a2SCy Schubert 	if (!wpa_s->driver->abort_scan)
962780fb4a2SCy Schubert 		return -1;
96385732ac8SCy Schubert 	return wpa_s->driver->abort_scan(wpa_s->drv_priv, scan_cookie);
964780fb4a2SCy Schubert }
965780fb4a2SCy Schubert 
966780fb4a2SCy Schubert static inline int wpa_drv_configure_frame_filters(struct wpa_supplicant *wpa_s,
967780fb4a2SCy Schubert 						  u32 filters)
968780fb4a2SCy Schubert {
969780fb4a2SCy Schubert 	if (!wpa_s->driver->configure_data_frame_filters)
970780fb4a2SCy Schubert 		return -1;
971780fb4a2SCy Schubert 	return wpa_s->driver->configure_data_frame_filters(wpa_s->drv_priv,
972780fb4a2SCy Schubert 							   filters);
973780fb4a2SCy Schubert }
974780fb4a2SCy Schubert 
975780fb4a2SCy Schubert static inline int wpa_drv_get_ext_capa(struct wpa_supplicant *wpa_s,
976780fb4a2SCy Schubert 				       enum wpa_driver_if_type type)
977780fb4a2SCy Schubert {
978780fb4a2SCy Schubert 	if (!wpa_s->driver->get_ext_capab)
979780fb4a2SCy Schubert 		return -1;
980780fb4a2SCy Schubert 	return wpa_s->driver->get_ext_capab(wpa_s->drv_priv, type,
981780fb4a2SCy Schubert 					    &wpa_s->extended_capa,
982780fb4a2SCy Schubert 					    &wpa_s->extended_capa_mask,
983780fb4a2SCy Schubert 					    &wpa_s->extended_capa_len);
984780fb4a2SCy Schubert }
985780fb4a2SCy Schubert 
986780fb4a2SCy Schubert static inline int wpa_drv_p2p_lo_start(struct wpa_supplicant *wpa_s,
987780fb4a2SCy Schubert 				       unsigned int channel,
988780fb4a2SCy Schubert 				       unsigned int period,
989780fb4a2SCy Schubert 				       unsigned int interval,
990780fb4a2SCy Schubert 				       unsigned int count,
991780fb4a2SCy Schubert 				       const u8 *device_types,
992780fb4a2SCy Schubert 				       size_t dev_types_len,
993780fb4a2SCy Schubert 				       const u8 *ies, size_t ies_len)
994780fb4a2SCy Schubert {
995780fb4a2SCy Schubert 	if (!wpa_s->driver->p2p_lo_start)
996780fb4a2SCy Schubert 		return -1;
997780fb4a2SCy Schubert 	return wpa_s->driver->p2p_lo_start(wpa_s->drv_priv, channel, period,
998780fb4a2SCy Schubert 					   interval, count, device_types,
999780fb4a2SCy Schubert 					   dev_types_len, ies, ies_len);
1000780fb4a2SCy Schubert }
1001780fb4a2SCy Schubert 
1002780fb4a2SCy Schubert static inline int wpa_drv_p2p_lo_stop(struct wpa_supplicant *wpa_s)
1003780fb4a2SCy Schubert {
1004780fb4a2SCy Schubert 	if (!wpa_s->driver->p2p_lo_stop)
1005780fb4a2SCy Schubert 		return -1;
1006780fb4a2SCy Schubert 	return wpa_s->driver->p2p_lo_stop(wpa_s->drv_priv);
1007780fb4a2SCy Schubert }
1008780fb4a2SCy Schubert 
1009780fb4a2SCy Schubert static inline int wpa_drv_set_default_scan_ies(struct wpa_supplicant *wpa_s,
1010780fb4a2SCy Schubert 					       const u8 *ies, size_t len)
1011780fb4a2SCy Schubert {
1012780fb4a2SCy Schubert 	if (!wpa_s->driver->set_default_scan_ies)
1013780fb4a2SCy Schubert 		return -1;
1014780fb4a2SCy Schubert 	return wpa_s->driver->set_default_scan_ies(wpa_s->drv_priv, ies, len);
1015780fb4a2SCy Schubert }
1016780fb4a2SCy Schubert 
101785732ac8SCy Schubert static inline int wpa_drv_set_tdls_mode(struct wpa_supplicant *wpa_s,
101885732ac8SCy Schubert 					int tdls_external_control)
101985732ac8SCy Schubert {
102085732ac8SCy Schubert 	if (!wpa_s->driver->set_tdls_mode)
102185732ac8SCy Schubert 		return -1;
102285732ac8SCy Schubert 	return wpa_s->driver->set_tdls_mode(wpa_s->drv_priv,
102385732ac8SCy Schubert 					    tdls_external_control);
102485732ac8SCy Schubert }
102585732ac8SCy Schubert 
102685732ac8SCy Schubert static inline struct wpa_bss_candidate_info *
102785732ac8SCy Schubert wpa_drv_get_bss_trans_status(struct wpa_supplicant *wpa_s,
102885732ac8SCy Schubert 			     struct wpa_bss_trans_info *params)
102985732ac8SCy Schubert {
103085732ac8SCy Schubert 	if (!wpa_s->driver->get_bss_transition_status)
103185732ac8SCy Schubert 		return NULL;
103285732ac8SCy Schubert 	return wpa_s->driver->get_bss_transition_status(wpa_s->drv_priv,
103385732ac8SCy Schubert 							params);
103485732ac8SCy Schubert }
103585732ac8SCy Schubert 
103685732ac8SCy Schubert static inline int wpa_drv_ignore_assoc_disallow(struct wpa_supplicant *wpa_s,
103785732ac8SCy Schubert 						int val)
103885732ac8SCy Schubert {
103985732ac8SCy Schubert 	if (!wpa_s->driver->ignore_assoc_disallow)
104085732ac8SCy Schubert 		return -1;
104185732ac8SCy Schubert 	return wpa_s->driver->ignore_assoc_disallow(wpa_s->drv_priv, val);
104285732ac8SCy Schubert }
104385732ac8SCy Schubert 
104485732ac8SCy Schubert static inline int wpa_drv_set_bssid_blacklist(struct wpa_supplicant *wpa_s,
104585732ac8SCy Schubert 					      unsigned int num_bssid,
104685732ac8SCy Schubert 					      const u8 *bssids)
104785732ac8SCy Schubert {
104885732ac8SCy Schubert 	if (!wpa_s->driver->set_bssid_blacklist)
104985732ac8SCy Schubert 		return -1;
105085732ac8SCy Schubert 	return wpa_s->driver->set_bssid_blacklist(wpa_s->drv_priv, num_bssid,
105185732ac8SCy Schubert 						  bssids);
105285732ac8SCy Schubert }
105385732ac8SCy Schubert 
105485732ac8SCy Schubert static inline int wpa_drv_update_connect_params(
105585732ac8SCy Schubert 	struct wpa_supplicant *wpa_s,
105685732ac8SCy Schubert 	struct wpa_driver_associate_params *params,
105785732ac8SCy Schubert 	enum wpa_drv_update_connect_params_mask mask)
105885732ac8SCy Schubert {
105985732ac8SCy Schubert 	if (!wpa_s->driver->update_connect_params)
106085732ac8SCy Schubert 		return -1;
106185732ac8SCy Schubert 	return wpa_s->driver->update_connect_params(wpa_s->drv_priv, params,
106285732ac8SCy Schubert 						    mask);
106385732ac8SCy Schubert }
106485732ac8SCy Schubert 
106585732ac8SCy Schubert static inline int
106685732ac8SCy Schubert wpa_drv_send_external_auth_status(struct wpa_supplicant *wpa_s,
106785732ac8SCy Schubert 				  struct external_auth *params)
106885732ac8SCy Schubert {
106985732ac8SCy Schubert 	if (!wpa_s->driver->send_external_auth_status)
107085732ac8SCy Schubert 		return -1;
107185732ac8SCy Schubert 	return wpa_s->driver->send_external_auth_status(wpa_s->drv_priv,
107285732ac8SCy Schubert 							params);
107385732ac8SCy Schubert }
107485732ac8SCy Schubert 
10754bc52338SCy Schubert static inline int wpa_drv_set_4addr_mode(struct wpa_supplicant *wpa_s, int val)
10764bc52338SCy Schubert {
10774bc52338SCy Schubert 	if (!wpa_s->driver->set_4addr_mode)
10784bc52338SCy Schubert 		return -1;
10794bc52338SCy Schubert 	return wpa_s->driver->set_4addr_mode(wpa_s->drv_priv,
10804bc52338SCy Schubert 					     wpa_s->bridge_ifname, val);
10814bc52338SCy Schubert }
10824bc52338SCy Schubert 
1083e28a4053SRui Paulo #endif /* DRIVER_I_H */
1084