1214501Srpaulo/*
2214501Srpaulo * wpa_supplicant - Internal driver interface wrappers
3214501Srpaulo * Copyright (c) 2003-2009, Jouni Malinen <j@w1.fi>
4214501Srpaulo *
5252726Srpaulo * This software may be distributed under the terms of the BSD license.
6252726Srpaulo * See README for more details.
7214501Srpaulo */
8214501Srpaulo
9214501Srpaulo#ifndef DRIVER_I_H
10214501Srpaulo#define DRIVER_I_H
11214501Srpaulo
12214501Srpaulo#include "drivers/driver.h"
13214501Srpaulo
14214501Srpaulo/* driver_ops */
15214501Srpaulostatic inline void * wpa_drv_init(struct wpa_supplicant *wpa_s,
16214501Srpaulo				  const char *ifname)
17214501Srpaulo{
18214501Srpaulo	if (wpa_s->driver->init2)
19214501Srpaulo		return wpa_s->driver->init2(wpa_s, ifname,
20214501Srpaulo					    wpa_s->global_drv_priv);
21214501Srpaulo	if (wpa_s->driver->init) {
22214501Srpaulo		return wpa_s->driver->init(wpa_s, ifname);
23214501Srpaulo	}
24214501Srpaulo	return NULL;
25214501Srpaulo}
26214501Srpaulo
27214501Srpaulostatic inline void wpa_drv_deinit(struct wpa_supplicant *wpa_s)
28214501Srpaulo{
29214501Srpaulo	if (wpa_s->driver->deinit)
30214501Srpaulo		wpa_s->driver->deinit(wpa_s->drv_priv);
31214501Srpaulo}
32214501Srpaulo
33214501Srpaulostatic inline int wpa_drv_set_param(struct wpa_supplicant *wpa_s,
34214501Srpaulo				    const char *param)
35214501Srpaulo{
36214501Srpaulo	if (wpa_s->driver->set_param)
37214501Srpaulo		return wpa_s->driver->set_param(wpa_s->drv_priv, param);
38214501Srpaulo	return 0;
39214501Srpaulo}
40214501Srpaulo
41214501Srpaulostatic inline int wpa_drv_set_countermeasures(struct wpa_supplicant *wpa_s,
42214501Srpaulo					      int enabled)
43214501Srpaulo{
44214501Srpaulo	if (wpa_s->driver->set_countermeasures) {
45214501Srpaulo		return wpa_s->driver->set_countermeasures(wpa_s->drv_priv,
46214501Srpaulo							  enabled);
47214501Srpaulo	}
48214501Srpaulo	return -1;
49214501Srpaulo}
50214501Srpaulo
51214501Srpaulostatic inline int wpa_drv_authenticate(struct wpa_supplicant *wpa_s,
52214501Srpaulo				       struct wpa_driver_auth_params *params)
53214501Srpaulo{
54214501Srpaulo	if (wpa_s->driver->authenticate)
55214501Srpaulo		return wpa_s->driver->authenticate(wpa_s->drv_priv, params);
56214501Srpaulo	return -1;
57214501Srpaulo}
58214501Srpaulo
59214501Srpaulostatic inline int wpa_drv_associate(struct wpa_supplicant *wpa_s,
60214501Srpaulo				    struct wpa_driver_associate_params *params)
61214501Srpaulo{
62214501Srpaulo	if (wpa_s->driver->associate) {
63214501Srpaulo		return wpa_s->driver->associate(wpa_s->drv_priv, params);
64214501Srpaulo	}
65214501Srpaulo	return -1;
66214501Srpaulo}
67214501Srpaulo
68214501Srpaulostatic inline int wpa_drv_scan(struct wpa_supplicant *wpa_s,
69214501Srpaulo			       struct wpa_driver_scan_params *params)
70214501Srpaulo{
71214501Srpaulo	if (wpa_s->driver->scan2)
72214501Srpaulo		return wpa_s->driver->scan2(wpa_s->drv_priv, params);
73214501Srpaulo	return -1;
74214501Srpaulo}
75214501Srpaulo
76252726Srpaulostatic inline int wpa_drv_sched_scan(struct wpa_supplicant *wpa_s,
77252726Srpaulo				     struct wpa_driver_scan_params *params,
78252726Srpaulo				     u32 interval)
79252726Srpaulo{
80252726Srpaulo	if (wpa_s->driver->sched_scan)
81252726Srpaulo		return wpa_s->driver->sched_scan(wpa_s->drv_priv,
82252726Srpaulo						 params, interval);
83252726Srpaulo	return -1;
84252726Srpaulo}
85252726Srpaulo
86252726Srpaulostatic inline int wpa_drv_stop_sched_scan(struct wpa_supplicant *wpa_s)
87252726Srpaulo{
88252726Srpaulo	if (wpa_s->driver->stop_sched_scan)
89252726Srpaulo		return wpa_s->driver->stop_sched_scan(wpa_s->drv_priv);
90252726Srpaulo	return -1;
91252726Srpaulo}
92252726Srpaulo
93214501Srpaulostatic inline struct wpa_scan_results * wpa_drv_get_scan_results2(
94214501Srpaulo	struct wpa_supplicant *wpa_s)
95214501Srpaulo{
96214501Srpaulo	if (wpa_s->driver->get_scan_results2)
97214501Srpaulo		return wpa_s->driver->get_scan_results2(wpa_s->drv_priv);
98214501Srpaulo	return NULL;
99214501Srpaulo}
100214501Srpaulo
101214501Srpaulostatic inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid)
102214501Srpaulo{
103214501Srpaulo	if (wpa_s->driver->get_bssid) {
104214501Srpaulo		return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid);
105214501Srpaulo	}
106214501Srpaulo	return -1;
107214501Srpaulo}
108214501Srpaulo
109214501Srpaulostatic inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid)
110214501Srpaulo{
111214501Srpaulo	if (wpa_s->driver->get_ssid) {
112214501Srpaulo		return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid);
113214501Srpaulo	}
114214501Srpaulo	return -1;
115214501Srpaulo}
116214501Srpaulo
117214501Srpaulostatic inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s,
118214501Srpaulo				  enum wpa_alg alg, const u8 *addr,
119214501Srpaulo				  int key_idx, int set_tx,
120214501Srpaulo				   const u8 *seq, size_t seq_len,
121214501Srpaulo				   const u8 *key, size_t key_len)
122214501Srpaulo{
123214501Srpaulo	if (wpa_s->driver->set_key) {
124214501Srpaulo		wpa_s->keys_cleared = 0;
125214501Srpaulo		return wpa_s->driver->set_key(wpa_s->ifname, wpa_s->drv_priv,
126214501Srpaulo					      alg, addr, key_idx, set_tx,
127214501Srpaulo					      seq, seq_len, key, key_len);
128214501Srpaulo	}
129214501Srpaulo	return -1;
130214501Srpaulo}
131214501Srpaulo
132214501Srpaulostatic inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
133214501Srpaulo					 const u8 *addr, int reason_code)
134214501Srpaulo{
135214501Srpaulo	if (wpa_s->driver->deauthenticate) {
136214501Srpaulo		return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
137214501Srpaulo						     reason_code);
138214501Srpaulo	}
139214501Srpaulo	return -1;
140214501Srpaulo}
141214501Srpaulo
142214501Srpaulostatic inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
143214501Srpaulo				    const u8 *bssid, const u8 *pmkid)
144214501Srpaulo{
145214501Srpaulo	if (wpa_s->driver->add_pmkid) {
146214501Srpaulo		return wpa_s->driver->add_pmkid(wpa_s->drv_priv, bssid, pmkid);
147214501Srpaulo	}
148214501Srpaulo	return -1;
149214501Srpaulo}
150214501Srpaulo
151214501Srpaulostatic inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
152214501Srpaulo				       const u8 *bssid, const u8 *pmkid)
153214501Srpaulo{
154214501Srpaulo	if (wpa_s->driver->remove_pmkid) {
155214501Srpaulo		return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, bssid,
156214501Srpaulo						   pmkid);
157214501Srpaulo	}
158214501Srpaulo	return -1;
159214501Srpaulo}
160214501Srpaulo
161214501Srpaulostatic inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
162214501Srpaulo{
163214501Srpaulo	if (wpa_s->driver->flush_pmkid) {
164214501Srpaulo		return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
165214501Srpaulo	}
166214501Srpaulo	return -1;
167214501Srpaulo}
168214501Srpaulo
169214501Srpaulostatic inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
170214501Srpaulo				   struct wpa_driver_capa *capa)
171214501Srpaulo{
172214501Srpaulo	if (wpa_s->driver->get_capa) {
173214501Srpaulo		return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
174214501Srpaulo	}
175214501Srpaulo	return -1;
176214501Srpaulo}
177214501Srpaulo
178214501Srpaulostatic inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
179214501Srpaulo{
180214501Srpaulo	if (wpa_s->driver->poll) {
181214501Srpaulo		wpa_s->driver->poll(wpa_s->drv_priv);
182214501Srpaulo	}
183214501Srpaulo}
184214501Srpaulo
185214501Srpaulostatic inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
186214501Srpaulo{
187214501Srpaulo	if (wpa_s->driver->get_ifname) {
188214501Srpaulo		return wpa_s->driver->get_ifname(wpa_s->drv_priv);
189214501Srpaulo	}
190214501Srpaulo	return NULL;
191214501Srpaulo}
192214501Srpaulo
193214501Srpaulostatic inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
194214501Srpaulo{
195214501Srpaulo	if (wpa_s->driver->get_mac_addr) {
196214501Srpaulo		return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
197214501Srpaulo	}
198214501Srpaulo	return NULL;
199214501Srpaulo}
200214501Srpaulo
201214501Srpaulostatic inline int wpa_drv_send_eapol(struct wpa_supplicant *wpa_s,
202214501Srpaulo				     const u8 *dst, u16 proto,
203214501Srpaulo				     const u8 *data, size_t data_len)
204214501Srpaulo{
205214501Srpaulo	if (wpa_s->driver->send_eapol)
206214501Srpaulo		return wpa_s->driver->send_eapol(wpa_s->drv_priv, dst, proto,
207214501Srpaulo						 data, data_len);
208214501Srpaulo	return -1;
209214501Srpaulo}
210214501Srpaulo
211214501Srpaulostatic inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
212214501Srpaulo					int state)
213214501Srpaulo{
214214501Srpaulo	if (wpa_s->driver->set_operstate)
215214501Srpaulo		return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
216214501Srpaulo	return 0;
217214501Srpaulo}
218214501Srpaulo
219214501Srpaulostatic inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
220214501Srpaulo					     const u8 *addr, int protect_type,
221214501Srpaulo					     int key_type)
222214501Srpaulo{
223214501Srpaulo	if (wpa_s->driver->mlme_setprotection)
224214501Srpaulo		return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
225214501Srpaulo							 protect_type,
226214501Srpaulo							 key_type);
227214501Srpaulo	return 0;
228214501Srpaulo}
229214501Srpaulo
230214501Srpaulostatic inline struct hostapd_hw_modes *
231214501Srpaulowpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
232214501Srpaulo			    u16 *flags)
233214501Srpaulo{
234214501Srpaulo	if (wpa_s->driver->get_hw_feature_data)
235214501Srpaulo		return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
236214501Srpaulo							  num_modes, flags);
237214501Srpaulo	return NULL;
238214501Srpaulo}
239214501Srpaulo
240214501Srpaulostatic inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
241214501Srpaulo				      const char *alpha2)
242214501Srpaulo{
243214501Srpaulo	if (wpa_s->driver->set_country)
244214501Srpaulo		return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
245214501Srpaulo	return 0;
246214501Srpaulo}
247214501Srpaulo
248214501Srpaulostatic inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
249252726Srpaulo				    const u8 *data, size_t data_len, int noack)
250214501Srpaulo{
251214501Srpaulo	if (wpa_s->driver->send_mlme)
252214501Srpaulo		return wpa_s->driver->send_mlme(wpa_s->drv_priv,
253252726Srpaulo						data, data_len, noack);
254214501Srpaulo	return -1;
255214501Srpaulo}
256214501Srpaulo
257214501Srpaulostatic inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
258214501Srpaulo					const u8 *md,
259214501Srpaulo					const u8 *ies, size_t ies_len)
260214501Srpaulo{
261214501Srpaulo	if (wpa_s->driver->update_ft_ies)
262214501Srpaulo		return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
263214501Srpaulo						    ies, ies_len);
264214501Srpaulo	return -1;
265214501Srpaulo}
266214501Srpaulo
267214501Srpaulostatic inline int wpa_drv_send_ft_action(struct wpa_supplicant *wpa_s,
268214501Srpaulo					 u8 action, const u8 *target_ap,
269214501Srpaulo					 const u8 *ies, size_t ies_len)
270214501Srpaulo{
271214501Srpaulo	if (wpa_s->driver->send_ft_action)
272214501Srpaulo		return wpa_s->driver->send_ft_action(wpa_s->drv_priv, action,
273214501Srpaulo						     target_ap, ies, ies_len);
274214501Srpaulo	return -1;
275214501Srpaulo}
276214501Srpaulo
277252726Srpaulostatic inline int wpa_drv_set_ap(struct wpa_supplicant *wpa_s,
278252726Srpaulo				 struct wpa_driver_ap_params *params)
279214501Srpaulo{
280252726Srpaulo	if (wpa_s->driver->set_ap)
281252726Srpaulo		return wpa_s->driver->set_ap(wpa_s->drv_priv, params);
282214501Srpaulo	return -1;
283214501Srpaulo}
284214501Srpaulo
285214501Srpaulostatic inline int wpa_drv_sta_add(struct wpa_supplicant *wpa_s,
286214501Srpaulo				  struct hostapd_sta_add_params *params)
287214501Srpaulo{
288214501Srpaulo	if (wpa_s->driver->sta_add)
289214501Srpaulo		return wpa_s->driver->sta_add(wpa_s->drv_priv, params);
290214501Srpaulo	return -1;
291214501Srpaulo}
292214501Srpaulo
293214501Srpaulostatic inline int wpa_drv_sta_remove(struct wpa_supplicant *wpa_s,
294214501Srpaulo				     const u8 *addr)
295214501Srpaulo{
296214501Srpaulo	if (wpa_s->driver->sta_remove)
297214501Srpaulo		return wpa_s->driver->sta_remove(wpa_s->drv_priv, addr);
298214501Srpaulo	return -1;
299214501Srpaulo}
300214501Srpaulo
301214501Srpaulostatic inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s,
302214501Srpaulo					  const u8 *addr, const u8 *data,
303214501Srpaulo					  size_t data_len, int encrypt,
304252726Srpaulo					  const u8 *own_addr, u32 flags)
305214501Srpaulo{
306214501Srpaulo	if (wpa_s->driver->hapd_send_eapol)
307214501Srpaulo		return wpa_s->driver->hapd_send_eapol(wpa_s->drv_priv, addr,
308214501Srpaulo						      data, data_len, encrypt,
309252726Srpaulo						      own_addr, flags);
310214501Srpaulo	return -1;
311214501Srpaulo}
312214501Srpaulo
313214501Srpaulostatic inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
314214501Srpaulo					const u8 *addr, int total_flags,
315214501Srpaulo					int flags_or, int flags_and)
316214501Srpaulo{
317214501Srpaulo	if (wpa_s->driver->sta_set_flags)
318214501Srpaulo		return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
319214501Srpaulo						    total_flags, flags_or,
320214501Srpaulo						    flags_and);
321214501Srpaulo	return -1;
322214501Srpaulo}
323214501Srpaulo
324214501Srpaulostatic inline int wpa_drv_set_supp_port(struct wpa_supplicant *wpa_s,
325214501Srpaulo					int authorized)
326214501Srpaulo{
327214501Srpaulo	if (wpa_s->driver->set_supp_port) {
328214501Srpaulo		return wpa_s->driver->set_supp_port(wpa_s->drv_priv,
329214501Srpaulo						    authorized);
330214501Srpaulo	}
331214501Srpaulo	return 0;
332214501Srpaulo}
333214501Srpaulo
334214501Srpaulostatic inline int wpa_drv_send_action(struct wpa_supplicant *wpa_s,
335214501Srpaulo				      unsigned int freq,
336252726Srpaulo				      unsigned int wait,
337214501Srpaulo				      const u8 *dst, const u8 *src,
338214501Srpaulo				      const u8 *bssid,
339252726Srpaulo				      const u8 *data, size_t data_len,
340252726Srpaulo				      int no_cck)
341214501Srpaulo{
342214501Srpaulo	if (wpa_s->driver->send_action)
343214501Srpaulo		return wpa_s->driver->send_action(wpa_s->drv_priv, freq,
344252726Srpaulo						  wait, dst, src, bssid,
345252726Srpaulo						  data, data_len, no_cck);
346214501Srpaulo	return -1;
347214501Srpaulo}
348214501Srpaulo
349252726Srpaulostatic inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
350252726Srpaulo{
351252726Srpaulo	if (wpa_s->driver->send_action_cancel_wait)
352252726Srpaulo		wpa_s->driver->send_action_cancel_wait(wpa_s->drv_priv);
353252726Srpaulo}
354252726Srpaulo
355252726Srpaulostatic inline int wpa_drv_set_freq(struct wpa_supplicant *wpa_s,
356252726Srpaulo				   struct hostapd_freq_params *freq)
357252726Srpaulo{
358252726Srpaulo	if (wpa_s->driver->set_freq)
359252726Srpaulo		return wpa_s->driver->set_freq(wpa_s->drv_priv, freq);
360252726Srpaulo	return -1;
361252726Srpaulo}
362252726Srpaulo
363214501Srpaulostatic inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s,
364214501Srpaulo				 enum wpa_driver_if_type type,
365214501Srpaulo				 const char *ifname, const u8 *addr,
366214501Srpaulo				 void *bss_ctx, char *force_ifname,
367252726Srpaulo				 u8 *if_addr, const char *bridge)
368214501Srpaulo{
369214501Srpaulo	if (wpa_s->driver->if_add)
370214501Srpaulo		return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname,
371214501Srpaulo					     addr, bss_ctx, NULL, force_ifname,
372252726Srpaulo					     if_addr, bridge);
373214501Srpaulo	return -1;
374214501Srpaulo}
375214501Srpaulo
376214501Srpaulostatic inline int wpa_drv_if_remove(struct wpa_supplicant *wpa_s,
377214501Srpaulo				    enum wpa_driver_if_type type,
378214501Srpaulo				    const char *ifname)
379214501Srpaulo{
380214501Srpaulo	if (wpa_s->driver->if_remove)
381214501Srpaulo		return wpa_s->driver->if_remove(wpa_s->drv_priv, type, ifname);
382214501Srpaulo	return -1;
383214501Srpaulo}
384214501Srpaulo
385214501Srpaulostatic inline int wpa_drv_remain_on_channel(struct wpa_supplicant *wpa_s,
386214501Srpaulo					    unsigned int freq,
387214501Srpaulo					    unsigned int duration)
388214501Srpaulo{
389214501Srpaulo	if (wpa_s->driver->remain_on_channel)
390214501Srpaulo		return wpa_s->driver->remain_on_channel(wpa_s->drv_priv, freq,
391214501Srpaulo							duration);
392214501Srpaulo	return -1;
393214501Srpaulo}
394214501Srpaulo
395214501Srpaulostatic inline int wpa_drv_cancel_remain_on_channel(
396214501Srpaulo	struct wpa_supplicant *wpa_s)
397214501Srpaulo{
398214501Srpaulo	if (wpa_s->driver->cancel_remain_on_channel)
399214501Srpaulo		return wpa_s->driver->cancel_remain_on_channel(
400214501Srpaulo			wpa_s->drv_priv);
401214501Srpaulo	return -1;
402214501Srpaulo}
403214501Srpaulo
404214501Srpaulostatic inline int wpa_drv_probe_req_report(struct wpa_supplicant *wpa_s,
405214501Srpaulo					   int report)
406214501Srpaulo{
407214501Srpaulo	if (wpa_s->driver->probe_req_report)
408214501Srpaulo		return wpa_s->driver->probe_req_report(wpa_s->drv_priv,
409214501Srpaulo						       report);
410214501Srpaulo	return -1;
411214501Srpaulo}
412214501Srpaulo
413214501Srpaulostatic inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
414214501Srpaulo{
415214501Srpaulo	if (wpa_s->driver->deinit_ap)
416214501Srpaulo		return wpa_s->driver->deinit_ap(wpa_s->drv_priv);
417214501Srpaulo	return 0;
418214501Srpaulo}
419214501Srpaulo
420252726Srpaulostatic inline int wpa_drv_deinit_p2p_cli(struct wpa_supplicant *wpa_s)
421252726Srpaulo{
422252726Srpaulo	if (wpa_s->driver->deinit_p2p_cli)
423252726Srpaulo		return wpa_s->driver->deinit_p2p_cli(wpa_s->drv_priv);
424252726Srpaulo	return 0;
425252726Srpaulo}
426252726Srpaulo
427214501Srpaulostatic inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
428214501Srpaulo{
429214501Srpaulo	if (wpa_s->driver->suspend)
430214501Srpaulo		wpa_s->driver->suspend(wpa_s->drv_priv);
431214501Srpaulo}
432214501Srpaulo
433214501Srpaulostatic inline void wpa_drv_resume(struct wpa_supplicant *wpa_s)
434214501Srpaulo{
435214501Srpaulo	if (wpa_s->driver->resume)
436214501Srpaulo		wpa_s->driver->resume(wpa_s->drv_priv);
437214501Srpaulo}
438214501Srpaulo
439214501Srpaulostatic inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s,
440214501Srpaulo					 int threshold, int hysteresis)
441214501Srpaulo{
442214501Srpaulo	if (wpa_s->driver->signal_monitor)
443214501Srpaulo		return wpa_s->driver->signal_monitor(wpa_s->drv_priv,
444214501Srpaulo						     threshold, hysteresis);
445214501Srpaulo	return -1;
446214501Srpaulo}
447214501Srpaulo
448252726Srpaulostatic inline int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
449252726Srpaulo				      struct wpa_signal_info *si)
450252726Srpaulo{
451252726Srpaulo	if (wpa_s->driver->signal_poll)
452252726Srpaulo		return wpa_s->driver->signal_poll(wpa_s->drv_priv, si);
453252726Srpaulo	return -1;
454252726Srpaulo}
455252726Srpaulo
456252726Srpaulostatic inline int wpa_drv_pktcnt_poll(struct wpa_supplicant *wpa_s,
457252726Srpaulo				      struct hostap_sta_driver_data *sta)
458252726Srpaulo{
459252726Srpaulo	if (wpa_s->driver->read_sta_data)
460252726Srpaulo		return wpa_s->driver->read_sta_data(wpa_s->drv_priv, sta,
461252726Srpaulo						    wpa_s->bssid);
462252726Srpaulo	return -1;
463252726Srpaulo}
464252726Srpaulo
465214501Srpaulostatic inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
466214501Srpaulo					const struct wpabuf *beacon,
467252726Srpaulo					const struct wpabuf *proberesp,
468252726Srpaulo					const struct wpabuf *assocresp)
469214501Srpaulo{
470214501Srpaulo	if (!wpa_s->driver->set_ap_wps_ie)
471214501Srpaulo		return -1;
472214501Srpaulo	return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon,
473252726Srpaulo					    proberesp, assocresp);
474214501Srpaulo}
475214501Srpaulo
476252726Srpaulostatic inline int wpa_drv_shared_freq(struct wpa_supplicant *wpa_s)
477252726Srpaulo{
478252726Srpaulo	if (!wpa_s->driver->shared_freq)
479252726Srpaulo		return -1;
480252726Srpaulo	return wpa_s->driver->shared_freq(wpa_s->drv_priv);
481252726Srpaulo}
482252726Srpaulo
483252726Srpaulostatic inline int wpa_drv_get_noa(struct wpa_supplicant *wpa_s,
484252726Srpaulo				  u8 *buf, size_t buf_len)
485252726Srpaulo{
486252726Srpaulo	if (!wpa_s->driver->get_noa)
487252726Srpaulo		return -1;
488252726Srpaulo	return wpa_s->driver->get_noa(wpa_s->drv_priv, buf, buf_len);
489252726Srpaulo}
490252726Srpaulo
491252726Srpaulostatic inline int wpa_drv_set_p2p_powersave(struct wpa_supplicant *wpa_s,
492252726Srpaulo					    int legacy_ps, int opp_ps,
493252726Srpaulo					    int ctwindow)
494252726Srpaulo{
495252726Srpaulo	if (!wpa_s->driver->set_p2p_powersave)
496252726Srpaulo		return -1;
497252726Srpaulo	return wpa_s->driver->set_p2p_powersave(wpa_s->drv_priv, legacy_ps,
498252726Srpaulo						opp_ps, ctwindow);
499252726Srpaulo}
500252726Srpaulo
501252726Srpaulostatic inline int wpa_drv_ampdu(struct wpa_supplicant *wpa_s, int ampdu)
502252726Srpaulo{
503252726Srpaulo	if (!wpa_s->driver->ampdu)
504252726Srpaulo		return -1;
505252726Srpaulo	return wpa_s->driver->ampdu(wpa_s->drv_priv, ampdu);
506252726Srpaulo}
507252726Srpaulo
508252726Srpaulostatic inline int wpa_drv_p2p_find(struct wpa_supplicant *wpa_s,
509252726Srpaulo				   unsigned int timeout, int type)
510252726Srpaulo{
511252726Srpaulo	if (!wpa_s->driver->p2p_find)
512252726Srpaulo		return -1;
513252726Srpaulo	return wpa_s->driver->p2p_find(wpa_s->drv_priv, timeout, type);
514252726Srpaulo}
515252726Srpaulo
516252726Srpaulostatic inline int wpa_drv_p2p_stop_find(struct wpa_supplicant *wpa_s)
517252726Srpaulo{
518252726Srpaulo	if (!wpa_s->driver->p2p_stop_find)
519252726Srpaulo		return -1;
520252726Srpaulo	return wpa_s->driver->p2p_stop_find(wpa_s->drv_priv);
521252726Srpaulo}
522252726Srpaulo
523252726Srpaulostatic inline int wpa_drv_p2p_listen(struct wpa_supplicant *wpa_s,
524252726Srpaulo				     unsigned int timeout)
525252726Srpaulo{
526252726Srpaulo	if (!wpa_s->driver->p2p_listen)
527252726Srpaulo		return -1;
528252726Srpaulo	return wpa_s->driver->p2p_listen(wpa_s->drv_priv, timeout);
529252726Srpaulo}
530252726Srpaulo
531252726Srpaulostatic inline int wpa_drv_p2p_connect(struct wpa_supplicant *wpa_s,
532252726Srpaulo				      const u8 *peer_addr, int wps_method,
533252726Srpaulo				      int go_intent,
534252726Srpaulo				      const u8 *own_interface_addr,
535252726Srpaulo				      unsigned int force_freq,
536252726Srpaulo				      int persistent_group)
537252726Srpaulo{
538252726Srpaulo	if (!wpa_s->driver->p2p_connect)
539252726Srpaulo		return -1;
540252726Srpaulo	return wpa_s->driver->p2p_connect(wpa_s->drv_priv, peer_addr,
541252726Srpaulo					  wps_method, go_intent,
542252726Srpaulo					  own_interface_addr, force_freq,
543252726Srpaulo					  persistent_group);
544252726Srpaulo}
545252726Srpaulo
546252726Srpaulostatic inline int wpa_drv_wps_success_cb(struct wpa_supplicant *wpa_s,
547252726Srpaulo					 const u8 *peer_addr)
548252726Srpaulo{
549252726Srpaulo	if (!wpa_s->driver->wps_success_cb)
550252726Srpaulo		return -1;
551252726Srpaulo	return wpa_s->driver->wps_success_cb(wpa_s->drv_priv, peer_addr);
552252726Srpaulo}
553252726Srpaulo
554252726Srpaulostatic inline int
555252726Srpaulowpa_drv_p2p_group_formation_failed(struct wpa_supplicant *wpa_s)
556252726Srpaulo{
557252726Srpaulo	if (!wpa_s->driver->p2p_group_formation_failed)
558252726Srpaulo		return -1;
559252726Srpaulo	return wpa_s->driver->p2p_group_formation_failed(wpa_s->drv_priv);
560252726Srpaulo}
561252726Srpaulo
562252726Srpaulostatic inline int wpa_drv_p2p_set_params(struct wpa_supplicant *wpa_s,
563252726Srpaulo					 const struct p2p_params *params)
564252726Srpaulo{
565252726Srpaulo	if (!wpa_s->driver->p2p_set_params)
566252726Srpaulo		return -1;
567252726Srpaulo	return wpa_s->driver->p2p_set_params(wpa_s->drv_priv, params);
568252726Srpaulo}
569252726Srpaulo
570252726Srpaulostatic inline int wpa_drv_p2p_prov_disc_req(struct wpa_supplicant *wpa_s,
571252726Srpaulo					    const u8 *peer_addr,
572252726Srpaulo					    u16 config_methods, int join)
573252726Srpaulo{
574252726Srpaulo	if (!wpa_s->driver->p2p_prov_disc_req)
575252726Srpaulo		return -1;
576252726Srpaulo	return wpa_s->driver->p2p_prov_disc_req(wpa_s->drv_priv, peer_addr,
577252726Srpaulo						config_methods, join);
578252726Srpaulo}
579252726Srpaulo
580252726Srpaulostatic inline u64 wpa_drv_p2p_sd_request(struct wpa_supplicant *wpa_s,
581252726Srpaulo					 const u8 *dst,
582252726Srpaulo					 const struct wpabuf *tlvs)
583252726Srpaulo{
584252726Srpaulo	if (!wpa_s->driver->p2p_sd_request)
585252726Srpaulo		return 0;
586252726Srpaulo	return wpa_s->driver->p2p_sd_request(wpa_s->drv_priv, dst, tlvs);
587252726Srpaulo}
588252726Srpaulo
589252726Srpaulostatic inline int wpa_drv_p2p_sd_cancel_request(struct wpa_supplicant *wpa_s,
590252726Srpaulo						u64 req)
591252726Srpaulo{
592252726Srpaulo	if (!wpa_s->driver->p2p_sd_cancel_request)
593252726Srpaulo		return -1;
594252726Srpaulo	return wpa_s->driver->p2p_sd_cancel_request(wpa_s->drv_priv, req);
595252726Srpaulo}
596252726Srpaulo
597252726Srpaulostatic inline int wpa_drv_p2p_sd_response(struct wpa_supplicant *wpa_s,
598252726Srpaulo					  int freq, const u8 *dst,
599252726Srpaulo					  u8 dialog_token,
600252726Srpaulo					  const struct wpabuf *resp_tlvs)
601252726Srpaulo{
602252726Srpaulo	if (!wpa_s->driver->p2p_sd_response)
603252726Srpaulo		return -1;
604252726Srpaulo	return wpa_s->driver->p2p_sd_response(wpa_s->drv_priv, freq, dst,
605252726Srpaulo					      dialog_token, resp_tlvs);
606252726Srpaulo}
607252726Srpaulo
608252726Srpaulostatic inline int wpa_drv_p2p_service_update(struct wpa_supplicant *wpa_s)
609252726Srpaulo{
610252726Srpaulo	if (!wpa_s->driver->p2p_service_update)
611252726Srpaulo		return -1;
612252726Srpaulo	return wpa_s->driver->p2p_service_update(wpa_s->drv_priv);
613252726Srpaulo}
614252726Srpaulo
615252726Srpaulostatic inline int wpa_drv_p2p_reject(struct wpa_supplicant *wpa_s,
616252726Srpaulo				     const u8 *addr)
617252726Srpaulo{
618252726Srpaulo	if (!wpa_s->driver->p2p_reject)
619252726Srpaulo		return -1;
620252726Srpaulo	return wpa_s->driver->p2p_reject(wpa_s->drv_priv, addr);
621252726Srpaulo}
622252726Srpaulo
623252726Srpaulostatic inline int wpa_drv_p2p_invite(struct wpa_supplicant *wpa_s,
624252726Srpaulo				     const u8 *peer, int role, const u8 *bssid,
625252726Srpaulo				     const u8 *ssid, size_t ssid_len,
626252726Srpaulo				     const u8 *go_dev_addr,
627252726Srpaulo				     int persistent_group)
628252726Srpaulo{
629252726Srpaulo	if (!wpa_s->driver->p2p_invite)
630252726Srpaulo		return -1;
631252726Srpaulo	return wpa_s->driver->p2p_invite(wpa_s->drv_priv, peer, role, bssid,
632252726Srpaulo					 ssid, ssid_len, go_dev_addr,
633252726Srpaulo					 persistent_group);
634252726Srpaulo}
635252726Srpaulo
636252726Srpaulostatic inline int wpa_drv_send_tdls_mgmt(struct wpa_supplicant *wpa_s,
637252726Srpaulo					 const u8 *dst, u8 action_code,
638252726Srpaulo					 u8 dialog_token, u16 status_code,
639252726Srpaulo					 const u8 *buf, size_t len)
640252726Srpaulo{
641252726Srpaulo	if (wpa_s->driver->send_tdls_mgmt) {
642252726Srpaulo		return wpa_s->driver->send_tdls_mgmt(wpa_s->drv_priv, dst,
643252726Srpaulo						     action_code, dialog_token,
644252726Srpaulo						     status_code, buf, len);
645252726Srpaulo	}
646252726Srpaulo	return -1;
647252726Srpaulo}
648252726Srpaulo
649252726Srpaulostatic inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
650252726Srpaulo				    enum tdls_oper oper, const u8 *peer)
651252726Srpaulo{
652252726Srpaulo	if (!wpa_s->driver->tdls_oper)
653252726Srpaulo		return -1;
654252726Srpaulo	return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
655252726Srpaulo}
656252726Srpaulo
657252726Srpaulostatic inline void wpa_drv_set_rekey_info(struct wpa_supplicant *wpa_s,
658252726Srpaulo					  const u8 *kek, const u8 *kck,
659252726Srpaulo					  const u8 *replay_ctr)
660252726Srpaulo{
661252726Srpaulo	if (!wpa_s->driver->set_rekey_info)
662252726Srpaulo		return;
663252726Srpaulo	wpa_s->driver->set_rekey_info(wpa_s->drv_priv, kek, kck, replay_ctr);
664252726Srpaulo}
665252726Srpaulo
666252726Srpaulostatic inline int wpa_drv_radio_disable(struct wpa_supplicant *wpa_s,
667252726Srpaulo					int disabled)
668252726Srpaulo{
669252726Srpaulo	if (!wpa_s->driver->radio_disable)
670252726Srpaulo		return -1;
671252726Srpaulo	return wpa_s->driver->radio_disable(wpa_s->drv_priv, disabled);
672252726Srpaulo}
673252726Srpaulo
674252726Srpaulostatic inline int wpa_drv_switch_channel(struct wpa_supplicant *wpa_s,
675252726Srpaulo					 unsigned int freq)
676252726Srpaulo{
677252726Srpaulo	if (!wpa_s->driver->switch_channel)
678252726Srpaulo		return -1;
679252726Srpaulo	return wpa_s->driver->switch_channel(wpa_s->drv_priv, freq);
680252726Srpaulo}
681252726Srpaulo
682252726Srpaulostatic inline int wpa_drv_wnm_oper(struct wpa_supplicant *wpa_s,
683252726Srpaulo				   enum wnm_oper oper, const u8 *peer,
684252726Srpaulo				   u8 *buf, u16 *buf_len)
685252726Srpaulo{
686252726Srpaulo	if (!wpa_s->driver->wnm_oper)
687252726Srpaulo		return -1;
688252726Srpaulo	return wpa_s->driver->wnm_oper(wpa_s->drv_priv, oper, peer, buf,
689252726Srpaulo				       buf_len);
690252726Srpaulo}
691252726Srpaulo
692214501Srpaulo#endif /* DRIVER_I_H */
693