1131962Smp/*
259243Sobrien * wpa_supplicant - Internal driver interface wrappers
359243Sobrien * Copyright (c) 2003-2009, Jouni Malinen <j@w1.fi>
459243Sobrien *
559243Sobrien * This software may be distributed under the terms of the BSD license.
659243Sobrien * See README for more details.
759243Sobrien */
859243Sobrien
959243Sobrien#ifndef DRIVER_I_H
1059243Sobrien#define DRIVER_I_H
1159243Sobrien
1259243Sobrien#include "drivers/driver.h"
1359243Sobrien
1459243Sobrien/* driver_ops */
1559243Sobrienstatic inline void * wpa_drv_init(struct wpa_supplicant *wpa_s,
1659243Sobrien				  const char *ifname)
1759243Sobrien{
1859243Sobrien	if (wpa_s->driver->init2)
1959243Sobrien		return wpa_s->driver->init2(wpa_s, ifname,
20100616Smp					    wpa_s->global_drv_priv);
2159243Sobrien	if (wpa_s->driver->init) {
2259243Sobrien		return wpa_s->driver->init(wpa_s, ifname);
2359243Sobrien	}
2459243Sobrien	return NULL;
2559243Sobrien}
2659243Sobrien
2759243Sobrienstatic inline void wpa_drv_deinit(struct wpa_supplicant *wpa_s)
2859243Sobrien{
2959243Sobrien	if (wpa_s->driver->deinit)
3059243Sobrien		wpa_s->driver->deinit(wpa_s->drv_priv);
3159243Sobrien}
3259243Sobrien
3359243Sobrienstatic inline int wpa_drv_set_param(struct wpa_supplicant *wpa_s,
3459243Sobrien				    const char *param)
3559243Sobrien{
3659243Sobrien	if (wpa_s->driver->set_param)
3759243Sobrien		return wpa_s->driver->set_param(wpa_s->drv_priv, param);
38131962Smp	return 0;
3959243Sobrien}
4059243Sobrien
4159243Sobrienstatic inline int wpa_drv_set_countermeasures(struct wpa_supplicant *wpa_s,
4259243Sobrien					      int enabled)
4359243Sobrien{
4469408Sache	if (wpa_s->driver->set_countermeasures) {
4559243Sobrien		return wpa_s->driver->set_countermeasures(wpa_s->drv_priv,
4669408Sache							  enabled);
4759243Sobrien	}
4859243Sobrien	return -1;
4959243Sobrien}
5059243Sobrien
5159243Sobrienstatic inline int wpa_drv_authenticate(struct wpa_supplicant *wpa_s,
5259243Sobrien				       struct wpa_driver_auth_params *params)
5359243Sobrien{
5459243Sobrien	if (wpa_s->driver->authenticate)
5559243Sobrien		return wpa_s->driver->authenticate(wpa_s->drv_priv, params);
5659243Sobrien	return -1;
5759243Sobrien}
5859243Sobrien
5959243Sobrienstatic inline int wpa_drv_associate(struct wpa_supplicant *wpa_s,
6059243Sobrien				    struct wpa_driver_associate_params *params)
6159243Sobrien{
6259243Sobrien	if (wpa_s->driver->associate) {
6359243Sobrien		return wpa_s->driver->associate(wpa_s->drv_priv, params);
6459243Sobrien	}
6559243Sobrien	return -1;
6659243Sobrien}
6759243Sobrien
6859243Sobrienstatic inline int wpa_drv_scan(struct wpa_supplicant *wpa_s,
6959243Sobrien			       struct wpa_driver_scan_params *params)
7059243Sobrien{
7159243Sobrien	if (wpa_s->driver->scan2)
7259243Sobrien		return wpa_s->driver->scan2(wpa_s->drv_priv, params);
7359243Sobrien	return -1;
7459243Sobrien}
7559243Sobrien
7659243Sobrienstatic inline int wpa_drv_sched_scan(struct wpa_supplicant *wpa_s,
7759243Sobrien				     struct wpa_driver_scan_params *params,
7859243Sobrien				     u32 interval)
7959243Sobrien{
8059243Sobrien	if (wpa_s->driver->sched_scan)
8159243Sobrien		return wpa_s->driver->sched_scan(wpa_s->drv_priv,
8259243Sobrien						 params, interval);
8359243Sobrien	return -1;
8459243Sobrien}
8559243Sobrien
8659243Sobrienstatic inline int wpa_drv_stop_sched_scan(struct wpa_supplicant *wpa_s)
8759243Sobrien{
8859243Sobrien	if (wpa_s->driver->stop_sched_scan)
8959243Sobrien		return wpa_s->driver->stop_sched_scan(wpa_s->drv_priv);
9059243Sobrien	return -1;
9159243Sobrien}
9259243Sobrien
9359243Sobrienstatic inline struct wpa_scan_results * wpa_drv_get_scan_results2(
9459243Sobrien	struct wpa_supplicant *wpa_s)
9559243Sobrien{
9659243Sobrien	if (wpa_s->driver->get_scan_results2)
9759243Sobrien		return wpa_s->driver->get_scan_results2(wpa_s->drv_priv);
9859243Sobrien	return NULL;
9959243Sobrien}
10059243Sobrien
10159243Sobrienstatic inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid)
10259243Sobrien{
10359243Sobrien	if (wpa_s->driver->get_bssid) {
10459243Sobrien		return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid);
10559243Sobrien	}
10659243Sobrien	return -1;
10759243Sobrien}
10869408Sache
10959243Sobrienstatic inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid)
11069408Sache{
11159243Sobrien	if (wpa_s->driver->get_ssid) {
11259243Sobrien		return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid);
11359243Sobrien	}
11459243Sobrien	return -1;
11559243Sobrien}
11659243Sobrien
11759243Sobrienstatic inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s,
118131962Smp				  enum wpa_alg alg, const u8 *addr,
119131962Smp				  int key_idx, int set_tx,
12059243Sobrien				   const u8 *seq, size_t seq_len,
12159243Sobrien				   const u8 *key, size_t key_len)
12269408Sache{
12359243Sobrien	if (wpa_s->driver->set_key) {
12459243Sobrien		wpa_s->keys_cleared = 0;
12559243Sobrien		return wpa_s->driver->set_key(wpa_s->ifname, wpa_s->drv_priv,
12659243Sobrien					      alg, addr, key_idx, set_tx,
12769408Sache					      seq, seq_len, key, key_len);
12859243Sobrien	}
12959243Sobrien	return -1;
13059243Sobrien}
13159243Sobrien
13259243Sobrienstatic inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
13359243Sobrien					 const u8 *addr, int reason_code)
13459243Sobrien{
13559243Sobrien	if (wpa_s->driver->deauthenticate) {
13659243Sobrien		return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
13759243Sobrien						     reason_code);
13859243Sobrien	}
13959243Sobrien	return -1;
14059243Sobrien}
14159243Sobrien
14259243Sobrienstatic inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
14359243Sobrien				    const u8 *bssid, const u8 *pmkid)
14459243Sobrien{
14559243Sobrien	if (wpa_s->driver->add_pmkid) {
14659243Sobrien		return wpa_s->driver->add_pmkid(wpa_s->drv_priv, bssid, pmkid);
14759243Sobrien	}
14859243Sobrien	return -1;
14959243Sobrien}
15059243Sobrien
15159243Sobrienstatic inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
15259243Sobrien				       const u8 *bssid, const u8 *pmkid)
15359243Sobrien{
15459243Sobrien	if (wpa_s->driver->remove_pmkid) {
15559243Sobrien		return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, bssid,
15659243Sobrien						   pmkid);
15759243Sobrien	}
15859243Sobrien	return -1;
15959243Sobrien}
16059243Sobrien
16159243Sobrienstatic inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
16259243Sobrien{
16359243Sobrien	if (wpa_s->driver->flush_pmkid) {
16459243Sobrien		return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
16559243Sobrien	}
16659243Sobrien	return -1;
16759243Sobrien}
16859243Sobrien
16959243Sobrienstatic inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
17059243Sobrien				   struct wpa_driver_capa *capa)
17159243Sobrien{
17259243Sobrien	if (wpa_s->driver->get_capa) {
17359243Sobrien		return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
17459243Sobrien	}
17559243Sobrien	return -1;
17659243Sobrien}
17759243Sobrien
17859243Sobrienstatic inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
17959243Sobrien{
18059243Sobrien	if (wpa_s->driver->poll) {
18159243Sobrien		wpa_s->driver->poll(wpa_s->drv_priv);
18259243Sobrien	}
18359243Sobrien}
18459243Sobrien
18559243Sobrienstatic inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
18659243Sobrien{
18759243Sobrien	if (wpa_s->driver->get_ifname) {
18859243Sobrien		return wpa_s->driver->get_ifname(wpa_s->drv_priv);
18959243Sobrien	}
19059243Sobrien	return NULL;
19159243Sobrien}
19259243Sobrien
19359243Sobrienstatic inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
19459243Sobrien{
19559243Sobrien	if (wpa_s->driver->get_mac_addr) {
19659243Sobrien		return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
19759243Sobrien	}
19859243Sobrien	return NULL;
19959243Sobrien}
20059243Sobrien
20159243Sobrienstatic inline int wpa_drv_send_eapol(struct wpa_supplicant *wpa_s,
20259243Sobrien				     const u8 *dst, u16 proto,
20359243Sobrien				     const u8 *data, size_t data_len)
20459243Sobrien{
20559243Sobrien	if (wpa_s->driver->send_eapol)
20659243Sobrien		return wpa_s->driver->send_eapol(wpa_s->drv_priv, dst, proto,
20759243Sobrien						 data, data_len);
20859243Sobrien	return -1;
20959243Sobrien}
21059243Sobrien
21159243Sobrienstatic inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
21259243Sobrien					int state)
21359243Sobrien{
21459243Sobrien	if (wpa_s->driver->set_operstate)
21559243Sobrien		return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
21659243Sobrien	return 0;
21759243Sobrien}
21859243Sobrien
21959243Sobrienstatic inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
22059243Sobrien					     const u8 *addr, int protect_type,
22159243Sobrien					     int key_type)
22259243Sobrien{
22359243Sobrien	if (wpa_s->driver->mlme_setprotection)
22459243Sobrien		return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
22559243Sobrien							 protect_type,
22659243Sobrien							 key_type);
22759243Sobrien	return 0;
22859243Sobrien}
22959243Sobrien
23059243Sobrienstatic inline struct hostapd_hw_modes *
23159243Sobrienwpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
23259243Sobrien			    u16 *flags)
23359243Sobrien{
23459243Sobrien	if (wpa_s->driver->get_hw_feature_data)
23559243Sobrien		return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
23659243Sobrien							  num_modes, flags);
23759243Sobrien	return NULL;
23859243Sobrien}
23959243Sobrien
24059243Sobrienstatic inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
24159243Sobrien				      const char *alpha2)
24259243Sobrien{
24359243Sobrien	if (wpa_s->driver->set_country)
24459243Sobrien		return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
24559243Sobrien	return 0;
24659243Sobrien}
24759243Sobrien
24859243Sobrienstatic inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
24959243Sobrien				    const u8 *data, size_t data_len, int noack)
25059243Sobrien{
25159243Sobrien	if (wpa_s->driver->send_mlme)
25259243Sobrien		return wpa_s->driver->send_mlme(wpa_s->drv_priv,
25359243Sobrien						data, data_len, noack);
25459243Sobrien	return -1;
25559243Sobrien}
25659243Sobrien
25759243Sobrienstatic inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
25859243Sobrien					const u8 *md,
25959243Sobrien					const u8 *ies, size_t ies_len)
26059243Sobrien{
26159243Sobrien	if (wpa_s->driver->update_ft_ies)
26259243Sobrien		return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
26359243Sobrien						    ies, ies_len);
26459243Sobrien	return -1;
26559243Sobrien}
26659243Sobrien
26759243Sobrienstatic inline int wpa_drv_send_ft_action(struct wpa_supplicant *wpa_s,
26859243Sobrien					 u8 action, const u8 *target_ap,
26959243Sobrien					 const u8 *ies, size_t ies_len)
27059243Sobrien{
27159243Sobrien	if (wpa_s->driver->send_ft_action)
27259243Sobrien		return wpa_s->driver->send_ft_action(wpa_s->drv_priv, action,
27359243Sobrien						     target_ap, ies, ies_len);
27459243Sobrien	return -1;
27559243Sobrien}
27659243Sobrien
27759243Sobrienstatic inline int wpa_drv_set_ap(struct wpa_supplicant *wpa_s,
27859243Sobrien				 struct wpa_driver_ap_params *params)
27959243Sobrien{
28059243Sobrien	if (wpa_s->driver->set_ap)
28159243Sobrien		return wpa_s->driver->set_ap(wpa_s->drv_priv, params);
28259243Sobrien	return -1;
28359243Sobrien}
28459243Sobrien
28559243Sobrienstatic inline int wpa_drv_sta_add(struct wpa_supplicant *wpa_s,
28659243Sobrien				  struct hostapd_sta_add_params *params)
28759243Sobrien{
28859243Sobrien	if (wpa_s->driver->sta_add)
28959243Sobrien		return wpa_s->driver->sta_add(wpa_s->drv_priv, params);
29059243Sobrien	return -1;
29159243Sobrien}
29259243Sobrien
29359243Sobrienstatic inline int wpa_drv_sta_remove(struct wpa_supplicant *wpa_s,
29459243Sobrien				     const u8 *addr)
29559243Sobrien{
29659243Sobrien	if (wpa_s->driver->sta_remove)
29759243Sobrien		return wpa_s->driver->sta_remove(wpa_s->drv_priv, addr);
29859243Sobrien	return -1;
29959243Sobrien}
30059243Sobrien
30159243Sobrienstatic inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s,
30259243Sobrien					  const u8 *addr, const u8 *data,
30359243Sobrien					  size_t data_len, int encrypt,
30459243Sobrien					  const u8 *own_addr, u32 flags)
30559243Sobrien{
30659243Sobrien	if (wpa_s->driver->hapd_send_eapol)
30759243Sobrien		return wpa_s->driver->hapd_send_eapol(wpa_s->drv_priv, addr,
30859243Sobrien						      data, data_len, encrypt,
30959243Sobrien						      own_addr, flags);
31059243Sobrien	return -1;
31159243Sobrien}
31259243Sobrien
31359243Sobrienstatic inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
31459243Sobrien					const u8 *addr, int total_flags,
31559243Sobrien					int flags_or, int flags_and)
31659243Sobrien{
31759243Sobrien	if (wpa_s->driver->sta_set_flags)
31859243Sobrien		return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
31959243Sobrien						    total_flags, flags_or,
32059243Sobrien						    flags_and);
32159243Sobrien	return -1;
32259243Sobrien}
32359243Sobrien
32459243Sobrienstatic inline int wpa_drv_set_supp_port(struct wpa_supplicant *wpa_s,
32559243Sobrien					int authorized)
32659243Sobrien{
32759243Sobrien	if (wpa_s->driver->set_supp_port) {
32859243Sobrien		return wpa_s->driver->set_supp_port(wpa_s->drv_priv,
32959243Sobrien						    authorized);
33059243Sobrien	}
33159243Sobrien	return 0;
33259243Sobrien}
33359243Sobrien
33459243Sobrienstatic inline int wpa_drv_send_action(struct wpa_supplicant *wpa_s,
33559243Sobrien				      unsigned int freq,
33659243Sobrien				      unsigned int wait,
33759243Sobrien				      const u8 *dst, const u8 *src,
33859243Sobrien				      const u8 *bssid,
33959243Sobrien				      const u8 *data, size_t data_len,
34059243Sobrien				      int no_cck)
34159243Sobrien{
34259243Sobrien	if (wpa_s->driver->send_action)
34359243Sobrien		return wpa_s->driver->send_action(wpa_s->drv_priv, freq,
34459243Sobrien						  wait, dst, src, bssid,
34559243Sobrien						  data, data_len, no_cck);
34659243Sobrien	return -1;
34759243Sobrien}
34859243Sobrien
34959243Sobrienstatic inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
35059243Sobrien{
35159243Sobrien	if (wpa_s->driver->send_action_cancel_wait)
35259243Sobrien		wpa_s->driver->send_action_cancel_wait(wpa_s->drv_priv);
35359243Sobrien}
35459243Sobrien
35559243Sobrienstatic inline int wpa_drv_set_freq(struct wpa_supplicant *wpa_s,
35659243Sobrien				   struct hostapd_freq_params *freq)
35759243Sobrien{
35859243Sobrien	if (wpa_s->driver->set_freq)
35959243Sobrien		return wpa_s->driver->set_freq(wpa_s->drv_priv, freq);
36059243Sobrien	return -1;
36159243Sobrien}
36259243Sobrien
36359243Sobrienstatic inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s,
36459243Sobrien				 enum wpa_driver_if_type type,
36559243Sobrien				 const char *ifname, const u8 *addr,
36659243Sobrien				 void *bss_ctx, char *force_ifname,
36759243Sobrien				 u8 *if_addr, const char *bridge)
36859243Sobrien{
36959243Sobrien	if (wpa_s->driver->if_add)
37059243Sobrien		return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname,
37159243Sobrien					     addr, bss_ctx, NULL, force_ifname,
37259243Sobrien					     if_addr, bridge);
37359243Sobrien	return -1;
37459243Sobrien}
37559243Sobrien
37659243Sobrienstatic inline int wpa_drv_if_remove(struct wpa_supplicant *wpa_s,
37759243Sobrien				    enum wpa_driver_if_type type,
37859243Sobrien				    const char *ifname)
37959243Sobrien{
38059243Sobrien	if (wpa_s->driver->if_remove)
38159243Sobrien		return wpa_s->driver->if_remove(wpa_s->drv_priv, type, ifname);
38259243Sobrien	return -1;
38359243Sobrien}
38459243Sobrien
38559243Sobrienstatic inline int wpa_drv_remain_on_channel(struct wpa_supplicant *wpa_s,
38659243Sobrien					    unsigned int freq,
38759243Sobrien					    unsigned int duration)
38859243Sobrien{
38959243Sobrien	if (wpa_s->driver->remain_on_channel)
39059243Sobrien		return wpa_s->driver->remain_on_channel(wpa_s->drv_priv, freq,
39159243Sobrien							duration);
39259243Sobrien	return -1;
39359243Sobrien}
39459243Sobrien
39559243Sobrienstatic inline int wpa_drv_cancel_remain_on_channel(
39659243Sobrien	struct wpa_supplicant *wpa_s)
39759243Sobrien{
39859243Sobrien	if (wpa_s->driver->cancel_remain_on_channel)
39959243Sobrien		return wpa_s->driver->cancel_remain_on_channel(
40059243Sobrien			wpa_s->drv_priv);
40159243Sobrien	return -1;
40259243Sobrien}
40359243Sobrien
40459243Sobrienstatic inline int wpa_drv_probe_req_report(struct wpa_supplicant *wpa_s,
40559243Sobrien					   int report)
40659243Sobrien{
40759243Sobrien	if (wpa_s->driver->probe_req_report)
40859243Sobrien		return wpa_s->driver->probe_req_report(wpa_s->drv_priv,
40959243Sobrien						       report);
41059243Sobrien	return -1;
41159243Sobrien}
41259243Sobrien
41359243Sobrienstatic inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
41459243Sobrien{
41559243Sobrien	if (wpa_s->driver->deinit_ap)
41659243Sobrien		return wpa_s->driver->deinit_ap(wpa_s->drv_priv);
41759243Sobrien	return 0;
41859243Sobrien}
41959243Sobrien
42059243Sobrienstatic inline int wpa_drv_deinit_p2p_cli(struct wpa_supplicant *wpa_s)
42159243Sobrien{
42259243Sobrien	if (wpa_s->driver->deinit_p2p_cli)
42359243Sobrien		return wpa_s->driver->deinit_p2p_cli(wpa_s->drv_priv);
42459243Sobrien	return 0;
42559243Sobrien}
42659243Sobrien
42759243Sobrienstatic inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
42859243Sobrien{
42959243Sobrien	if (wpa_s->driver->suspend)
43059243Sobrien		wpa_s->driver->suspend(wpa_s->drv_priv);
43159243Sobrien}
43259243Sobrien
43359243Sobrienstatic inline void wpa_drv_resume(struct wpa_supplicant *wpa_s)
43459243Sobrien{
43559243Sobrien	if (wpa_s->driver->resume)
43659243Sobrien		wpa_s->driver->resume(wpa_s->drv_priv);
43759243Sobrien}
43859243Sobrien
43959243Sobrienstatic inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s,
44059243Sobrien					 int threshold, int hysteresis)
44159243Sobrien{
44259243Sobrien	if (wpa_s->driver->signal_monitor)
44359243Sobrien		return wpa_s->driver->signal_monitor(wpa_s->drv_priv,
44459243Sobrien						     threshold, hysteresis);
44559243Sobrien	return -1;
44659243Sobrien}
44759243Sobrien
44859243Sobrienstatic inline int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
44959243Sobrien				      struct wpa_signal_info *si)
45059243Sobrien{
45159243Sobrien	if (wpa_s->driver->signal_poll)
45259243Sobrien		return wpa_s->driver->signal_poll(wpa_s->drv_priv, si);
45359243Sobrien	return -1;
45459243Sobrien}
45559243Sobrien
45659243Sobrienstatic inline int wpa_drv_pktcnt_poll(struct wpa_supplicant *wpa_s,
45759243Sobrien				      struct hostap_sta_driver_data *sta)
45859243Sobrien{
45959243Sobrien	if (wpa_s->driver->read_sta_data)
46059243Sobrien		return wpa_s->driver->read_sta_data(wpa_s->drv_priv, sta,
46159243Sobrien						    wpa_s->bssid);
46259243Sobrien	return -1;
46359243Sobrien}
46459243Sobrien
46559243Sobrienstatic inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
46659243Sobrien					const struct wpabuf *beacon,
46759243Sobrien					const struct wpabuf *proberesp,
46859243Sobrien					const struct wpabuf *assocresp)
46959243Sobrien{
47059243Sobrien	if (!wpa_s->driver->set_ap_wps_ie)
47159243Sobrien		return -1;
47259243Sobrien	return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon,
47359243Sobrien					    proberesp, assocresp);
47459243Sobrien}
47559243Sobrien
47659243Sobrienstatic inline int wpa_drv_shared_freq(struct wpa_supplicant *wpa_s)
47759243Sobrien{
47859243Sobrien	if (!wpa_s->driver->shared_freq)
47959243Sobrien		return -1;
48059243Sobrien	return wpa_s->driver->shared_freq(wpa_s->drv_priv);
48159243Sobrien}
48259243Sobrien
48359243Sobrienstatic inline int wpa_drv_get_noa(struct wpa_supplicant *wpa_s,
48459243Sobrien				  u8 *buf, size_t buf_len)
48559243Sobrien{
48659243Sobrien	if (!wpa_s->driver->get_noa)
48759243Sobrien		return -1;
48859243Sobrien	return wpa_s->driver->get_noa(wpa_s->drv_priv, buf, buf_len);
48959243Sobrien}
49059243Sobrien
49159243Sobrienstatic inline int wpa_drv_set_p2p_powersave(struct wpa_supplicant *wpa_s,
49259243Sobrien					    int legacy_ps, int opp_ps,
49359243Sobrien					    int ctwindow)
49459243Sobrien{
49559243Sobrien	if (!wpa_s->driver->set_p2p_powersave)
49659243Sobrien		return -1;
49759243Sobrien	return wpa_s->driver->set_p2p_powersave(wpa_s->drv_priv, legacy_ps,
49859243Sobrien						opp_ps, ctwindow);
49959243Sobrien}
50059243Sobrien
50159243Sobrienstatic inline int wpa_drv_ampdu(struct wpa_supplicant *wpa_s, int ampdu)
50259243Sobrien{
50359243Sobrien	if (!wpa_s->driver->ampdu)
50459243Sobrien		return -1;
50559243Sobrien	return wpa_s->driver->ampdu(wpa_s->drv_priv, ampdu);
50659243Sobrien}
50759243Sobrien
50859243Sobrienstatic inline int wpa_drv_p2p_find(struct wpa_supplicant *wpa_s,
50959243Sobrien				   unsigned int timeout, int type)
51059243Sobrien{
51159243Sobrien	if (!wpa_s->driver->p2p_find)
51259243Sobrien		return -1;
51359243Sobrien	return wpa_s->driver->p2p_find(wpa_s->drv_priv, timeout, type);
51459243Sobrien}
51559243Sobrien
51659243Sobrienstatic inline int wpa_drv_p2p_stop_find(struct wpa_supplicant *wpa_s)
51759243Sobrien{
51859243Sobrien	if (!wpa_s->driver->p2p_stop_find)
51959243Sobrien		return -1;
52059243Sobrien	return wpa_s->driver->p2p_stop_find(wpa_s->drv_priv);
52159243Sobrien}
52259243Sobrien
52359243Sobrienstatic inline int wpa_drv_p2p_listen(struct wpa_supplicant *wpa_s,
52459243Sobrien				     unsigned int timeout)
52559243Sobrien{
52659243Sobrien	if (!wpa_s->driver->p2p_listen)
52759243Sobrien		return -1;
52859243Sobrien	return wpa_s->driver->p2p_listen(wpa_s->drv_priv, timeout);
52959243Sobrien}
53059243Sobrien
53159243Sobrienstatic inline int wpa_drv_p2p_connect(struct wpa_supplicant *wpa_s,
53259243Sobrien				      const u8 *peer_addr, int wps_method,
53359415Sobrien				      int go_intent,
53459415Sobrien				      const u8 *own_interface_addr,
53559415Sobrien				      unsigned int force_freq,
53659243Sobrien				      int persistent_group)
53759243Sobrien{
53859243Sobrien	if (!wpa_s->driver->p2p_connect)
53959243Sobrien		return -1;
54059243Sobrien	return wpa_s->driver->p2p_connect(wpa_s->drv_priv, peer_addr,
54159243Sobrien					  wps_method, go_intent,
54259243Sobrien					  own_interface_addr, force_freq,
54359415Sobrien					  persistent_group);
54459415Sobrien}
54559415Sobrien
54659243Sobrienstatic inline int wpa_drv_wps_success_cb(struct wpa_supplicant *wpa_s,
54759243Sobrien					 const u8 *peer_addr)
54859243Sobrien{
54959243Sobrien	if (!wpa_s->driver->wps_success_cb)
55059243Sobrien		return -1;
55159243Sobrien	return wpa_s->driver->wps_success_cb(wpa_s->drv_priv, peer_addr);
55259243Sobrien}
55359243Sobrien
55459243Sobrienstatic inline int
55559243Sobrienwpa_drv_p2p_group_formation_failed(struct wpa_supplicant *wpa_s)
55659243Sobrien{
55759243Sobrien	if (!wpa_s->driver->p2p_group_formation_failed)
55859243Sobrien		return -1;
55959415Sobrien	return wpa_s->driver->p2p_group_formation_failed(wpa_s->drv_priv);
56059415Sobrien}
56159415Sobrien
56259415Sobrienstatic inline int wpa_drv_p2p_set_params(struct wpa_supplicant *wpa_s,
56359243Sobrien					 const struct p2p_params *params)
56459243Sobrien{
56559243Sobrien	if (!wpa_s->driver->p2p_set_params)
56659243Sobrien		return -1;
56759243Sobrien	return wpa_s->driver->p2p_set_params(wpa_s->drv_priv, params);
56859243Sobrien}
56959243Sobrien
57059243Sobrienstatic inline int wpa_drv_p2p_prov_disc_req(struct wpa_supplicant *wpa_s,
57159243Sobrien					    const u8 *peer_addr,
57259243Sobrien					    u16 config_methods, int join)
57359243Sobrien{
57459243Sobrien	if (!wpa_s->driver->p2p_prov_disc_req)
57559243Sobrien		return -1;
57659243Sobrien	return wpa_s->driver->p2p_prov_disc_req(wpa_s->drv_priv, peer_addr,
57759243Sobrien						config_methods, join);
57859243Sobrien}
57959243Sobrien
58059243Sobrienstatic inline u64 wpa_drv_p2p_sd_request(struct wpa_supplicant *wpa_s,
58159243Sobrien					 const u8 *dst,
58259243Sobrien					 const struct wpabuf *tlvs)
58359243Sobrien{
58459243Sobrien	if (!wpa_s->driver->p2p_sd_request)
58559243Sobrien		return 0;
58659243Sobrien	return wpa_s->driver->p2p_sd_request(wpa_s->drv_priv, dst, tlvs);
58759243Sobrien}
58859243Sobrien
58959243Sobrienstatic inline int wpa_drv_p2p_sd_cancel_request(struct wpa_supplicant *wpa_s,
59059243Sobrien						u64 req)
59159243Sobrien{
59259243Sobrien	if (!wpa_s->driver->p2p_sd_cancel_request)
59359243Sobrien		return -1;
59459243Sobrien	return wpa_s->driver->p2p_sd_cancel_request(wpa_s->drv_priv, req);
59559243Sobrien}
59659243Sobrien
59759243Sobrienstatic inline int wpa_drv_p2p_sd_response(struct wpa_supplicant *wpa_s,
59859243Sobrien					  int freq, const u8 *dst,
59959243Sobrien					  u8 dialog_token,
60059243Sobrien					  const struct wpabuf *resp_tlvs)
60159243Sobrien{
60259243Sobrien	if (!wpa_s->driver->p2p_sd_response)
60359243Sobrien		return -1;
60459415Sobrien	return wpa_s->driver->p2p_sd_response(wpa_s->drv_priv, freq, dst,
60559415Sobrien					      dialog_token, resp_tlvs);
60659415Sobrien}
60759243Sobrien
60859243Sobrienstatic inline int wpa_drv_p2p_service_update(struct wpa_supplicant *wpa_s)
60959243Sobrien{
61059415Sobrien	if (!wpa_s->driver->p2p_service_update)
61159415Sobrien		return -1;
61259415Sobrien	return wpa_s->driver->p2p_service_update(wpa_s->drv_priv);
61359415Sobrien}
61459415Sobrien
61559415Sobrienstatic inline int wpa_drv_p2p_reject(struct wpa_supplicant *wpa_s,
61659243Sobrien				     const u8 *addr)
61759243Sobrien{
61859243Sobrien	if (!wpa_s->driver->p2p_reject)
61959243Sobrien		return -1;
62059243Sobrien	return wpa_s->driver->p2p_reject(wpa_s->drv_priv, addr);
62159243Sobrien}
62259243Sobrien
62359243Sobrienstatic inline int wpa_drv_p2p_invite(struct wpa_supplicant *wpa_s,
62459243Sobrien				     const u8 *peer, int role, const u8 *bssid,
62559243Sobrien				     const u8 *ssid, size_t ssid_len,
62659243Sobrien				     const u8 *go_dev_addr,
62759243Sobrien				     int persistent_group)
62859243Sobrien{
62959243Sobrien	if (!wpa_s->driver->p2p_invite)
63059243Sobrien		return -1;
63159243Sobrien	return wpa_s->driver->p2p_invite(wpa_s->drv_priv, peer, role, bssid,
63259243Sobrien					 ssid, ssid_len, go_dev_addr,
63359243Sobrien					 persistent_group);
63459243Sobrien}
63559243Sobrien
63659243Sobrienstatic inline int wpa_drv_send_tdls_mgmt(struct wpa_supplicant *wpa_s,
63759243Sobrien					 const u8 *dst, u8 action_code,
63859243Sobrien					 u8 dialog_token, u16 status_code,
63959243Sobrien					 const u8 *buf, size_t len)
64059243Sobrien{
64159243Sobrien	if (wpa_s->driver->send_tdls_mgmt) {
64259243Sobrien		return wpa_s->driver->send_tdls_mgmt(wpa_s->drv_priv, dst,
64359243Sobrien						     action_code, dialog_token,
64459243Sobrien						     status_code, buf, len);
64559243Sobrien	}
64659243Sobrien	return -1;
64759243Sobrien}
64859243Sobrien
64959243Sobrienstatic inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
65059243Sobrien				    enum tdls_oper oper, const u8 *peer)
65159243Sobrien{
65259243Sobrien	if (!wpa_s->driver->tdls_oper)
65359243Sobrien		return -1;
65459243Sobrien	return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
65559243Sobrien}
65659243Sobrien
65759243Sobrienstatic inline void wpa_drv_set_rekey_info(struct wpa_supplicant *wpa_s,
65859243Sobrien					  const u8 *kek, const u8 *kck,
65959243Sobrien					  const u8 *replay_ctr)
66059243Sobrien{
66159243Sobrien	if (!wpa_s->driver->set_rekey_info)
66259243Sobrien		return;
66359243Sobrien	wpa_s->driver->set_rekey_info(wpa_s->drv_priv, kek, kck, replay_ctr);
66459243Sobrien}
66559243Sobrien
66659243Sobrienstatic inline int wpa_drv_radio_disable(struct wpa_supplicant *wpa_s,
66759243Sobrien					int disabled)
66859243Sobrien{
66959243Sobrien	if (!wpa_s->driver->radio_disable)
67059243Sobrien		return -1;
67159243Sobrien	return wpa_s->driver->radio_disable(wpa_s->drv_priv, disabled);
67259243Sobrien}
67359243Sobrien
67459243Sobrienstatic inline int wpa_drv_switch_channel(struct wpa_supplicant *wpa_s,
67559243Sobrien					 unsigned int freq)
67659243Sobrien{
67759243Sobrien	if (!wpa_s->driver->switch_channel)
67859243Sobrien		return -1;
67959243Sobrien	return wpa_s->driver->switch_channel(wpa_s->drv_priv, freq);
68059243Sobrien}
68159243Sobrien
68259243Sobrienstatic inline int wpa_drv_wnm_oper(struct wpa_supplicant *wpa_s,
68359243Sobrien				   enum wnm_oper oper, const u8 *peer,
68459243Sobrien				   u8 *buf, u16 *buf_len)
68559243Sobrien{
68659243Sobrien	if (!wpa_s->driver->wnm_oper)
68759243Sobrien		return -1;
68859243Sobrien	return wpa_s->driver->wnm_oper(wpa_s->drv_priv, oper, peer, buf,
68959243Sobrien				       buf_len);
69059243Sobrien}
69159243Sobrien
69259243Sobrien#endif /* DRIVER_I_H */
69359243Sobrien