18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_supplicant - Internal driver interface wrappers
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2003-2009, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef DRIVER_I_H
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define DRIVER_I_H
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "drivers/driver.h"
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* driver_ops */
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void * wpa_drv_init(struct wpa_supplicant *wpa_s,
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  const char *ifname)
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->init2)
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->init2(wpa_s, ifname,
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    wpa_s->global_drv_priv);
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->init) {
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->init(wpa_s, ifname);
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_deinit(struct wpa_supplicant *wpa_s)
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->deinit)
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->deinit(wpa_s->drv_priv);
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_param(struct wpa_supplicant *wpa_s,
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    const char *param)
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_param)
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_param(wpa_s->drv_priv, param);
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_countermeasures(struct wpa_supplicant *wpa_s,
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      int enabled)
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_countermeasures) {
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_countermeasures(wpa_s->drv_priv,
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  enabled);
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_authenticate(struct wpa_supplicant *wpa_s,
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_driver_auth_params *params)
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->authenticate)
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->authenticate(wpa_s->drv_priv, params);
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_associate(struct wpa_supplicant *wpa_s,
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    struct wpa_driver_associate_params *params)
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->associate) {
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->associate(wpa_s->drv_priv, params);
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_scan(struct wpa_supplicant *wpa_s,
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       struct wpa_driver_scan_params *params)
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->scan2)
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->scan2(wpa_s->drv_priv, params);
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic inline int wpa_drv_sched_scan(struct wpa_supplicant *wpa_s,
771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     struct wpa_driver_scan_params *params,
781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				     u32 interval)
791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (wpa_s->driver->sched_scan)
811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_s->driver->sched_scan(wpa_s->drv_priv,
821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						 params, interval);
831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return -1;
841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic inline int wpa_drv_stop_sched_scan(struct wpa_supplicant *wpa_s)
871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (wpa_s->driver->stop_sched_scan)
891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_s->driver->stop_sched_scan(wpa_s->drv_priv);
901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	return -1;
911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct wpa_scan_results * wpa_drv_get_scan_results2(
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s)
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_scan_results2)
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_scan_results2(wpa_s->drv_priv);
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid)
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_bssid) {
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid);
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid)
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_ssid) {
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid);
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s,
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  enum wpa_alg alg, const u8 *addr,
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int key_idx, int set_tx,
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   const u8 *seq, size_t seq_len,
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   const u8 *key, size_t key_len)
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_key) {
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->keys_cleared = 0;
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_key(wpa_s->ifname, wpa_s->drv_priv,
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      alg, addr, key_idx, set_tx,
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      seq, seq_len, key, key_len);
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
13234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidtstatic inline int wpa_drv_sta_deauth(struct wpa_supplicant *wpa_s,
13334af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt				     const u8 *addr, int reason_code)
13434af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt{
13534af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt	if (wpa_s->driver->sta_deauth) {
136c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt		return wpa_s->driver->sta_deauth(wpa_s->drv_priv,
137c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt						 wpa_s->own_addr, addr,
13834af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt						 reason_code);
13934af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt	}
14034af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt	return -1;
14134af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt}
14234af306c42b7ccf956508e7cd23f0ba90606e360Dmitry Shmidt
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *addr, int reason_code)
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->deauthenticate) {
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     reason_code);
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    const u8 *bssid, const u8 *pmkid)
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->add_pmkid) {
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->add_pmkid(wpa_s->drv_priv, bssid, pmkid);
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       const u8 *bssid, const u8 *pmkid)
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->remove_pmkid) {
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, bssid,
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   pmkid);
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->flush_pmkid) {
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   struct wpa_driver_capa *capa)
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_capa) {
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->poll) {
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->poll(wpa_s->drv_priv);
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_ifname) {
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_ifname(wpa_s->drv_priv);
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_mac_addr) {
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_eapol(struct wpa_supplicant *wpa_s,
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *dst, u16 proto,
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *data, size_t data_len)
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_eapol)
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_eapol(wpa_s->drv_priv, dst, proto,
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 data, data_len);
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					int state)
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_operstate)
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     const u8 *addr, int protect_type,
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     int key_type)
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->mlme_setprotection)
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							 protect_type,
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							 key_type);
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct hostapd_hw_modes *
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtwpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    u16 *flags)
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_hw_feature_data)
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  num_modes, flags);
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const char *alpha2)
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_country)
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
2601f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				    const u8 *data, size_t data_len, int noack)
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_mlme)
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_mlme(wpa_s->drv_priv,
2641f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						data, data_len, noack);
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const u8 *md,
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const u8 *ies, size_t ies_len)
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->update_ft_ies)
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    ies, ies_len);
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_ft_action(struct wpa_supplicant *wpa_s,
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 u8 action, const u8 *target_ap,
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *ies, size_t ies_len)
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_ft_action)
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_ft_action(wpa_s->drv_priv, action,
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     target_ap, ies, ies_len);
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic inline int wpa_drv_set_ap(struct wpa_supplicant *wpa_s,
2891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				 struct wpa_driver_ap_params *params)
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (wpa_s->driver->set_ap)
2921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_s->driver->set_ap(wpa_s->drv_priv, params);
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_sta_add(struct wpa_supplicant *wpa_s,
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  struct hostapd_sta_add_params *params)
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->sta_add)
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->sta_add(wpa_s->drv_priv, params);
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_sta_remove(struct wpa_supplicant *wpa_s,
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *addr)
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->sta_remove)
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->sta_remove(wpa_s->drv_priv, addr);
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s,
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const u8 *addr, const u8 *data,
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  size_t data_len, int encrypt,
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const u8 *own_addr, u32 flags)
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->hapd_send_eapol)
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->hapd_send_eapol(wpa_s->drv_priv, addr,
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      data, data_len, encrypt,
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      own_addr, flags);
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const u8 *addr, int total_flags,
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					int flags_or, int flags_and)
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->sta_set_flags)
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    total_flags, flags_or,
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    flags_and);
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_supp_port(struct wpa_supplicant *wpa_s,
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					int authorized)
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_supp_port) {
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_supp_port(wpa_s->drv_priv,
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    authorized);
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_action(struct wpa_supplicant *wpa_s,
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      unsigned int freq,
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      unsigned int wait,
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *dst, const u8 *src,
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *bssid,
3501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      const u8 *data, size_t data_len,
3511f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      int no_cck)
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_action)
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_action(wpa_s->drv_priv, freq,
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  wait, dst, src, bssid,
3561f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						  data, data_len, no_cck);
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_action_cancel_wait)
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->send_action_cancel_wait(wpa_s->drv_priv);
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_freq(struct wpa_supplicant *wpa_s,
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   struct hostapd_freq_params *freq)
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_freq)
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_freq(wpa_s->drv_priv, freq);
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s,
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 enum wpa_driver_if_type type,
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 const char *ifname, const u8 *addr,
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 void *bss_ctx, char *force_ifname,
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 u8 *if_addr, const char *bridge)
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->if_add)
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname,
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     addr, bss_ctx, NULL, force_ifname,
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     if_addr, bridge);
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_if_remove(struct wpa_supplicant *wpa_s,
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    enum wpa_driver_if_type type,
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    const char *ifname)
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->if_remove)
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->if_remove(wpa_s->drv_priv, type, ifname);
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_remain_on_channel(struct wpa_supplicant *wpa_s,
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    unsigned int freq,
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    unsigned int duration)
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->remain_on_channel)
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->remain_on_channel(wpa_s->drv_priv, freq,
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							duration);
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_cancel_remain_on_channel(
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s)
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->cancel_remain_on_channel)
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->cancel_remain_on_channel(
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_s->drv_priv);
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_probe_req_report(struct wpa_supplicant *wpa_s,
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   int report)
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->probe_req_report)
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->probe_req_report(wpa_s->drv_priv,
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       report);
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->deinit_ap)
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->deinit_ap(wpa_s->drv_priv);
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
43104949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic inline int wpa_drv_deinit_p2p_cli(struct wpa_supplicant *wpa_s)
43204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
43304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->driver->deinit_p2p_cli)
43404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return wpa_s->driver->deinit_p2p_cli(wpa_s->drv_priv);
43504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return 0;
43604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
43704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->suspend)
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->suspend(wpa_s->drv_priv);
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_resume(struct wpa_supplicant *wpa_s)
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->resume)
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->resume(wpa_s->drv_priv);
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s,
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 int threshold, int hysteresis)
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->signal_monitor)
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->signal_monitor(wpa_s->drv_priv,
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     threshold, hysteresis);
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      struct wpa_signal_info *si)
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->signal_poll)
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->signal_poll(wpa_s->drv_priv, si);
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
467fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zhengstatic inline int wpa_drv_pktcnt_poll(struct wpa_supplicant *wpa_s,
468fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng				      struct hostap_sta_driver_data *sta)
469fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng{
470fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	if (wpa_s->driver->read_sta_data)
4711e6c57fee4a56b421cc20f6dc0785c9138b21337Jouni Malinen		return wpa_s->driver->read_sta_data(wpa_s->drv_priv, sta,
4721e6c57fee4a56b421cc20f6dc0785c9138b21337Jouni Malinen						    wpa_s->bssid);
473fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	return -1;
474fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng}
475fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const struct wpabuf *beacon,
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const struct wpabuf *proberesp,
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const struct wpabuf *assocresp)
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->set_ap_wps_ie)
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon,
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    proberesp, assocresp);
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_shared_freq(struct wpa_supplicant *wpa_s)
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->shared_freq)
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->shared_freq(wpa_s->drv_priv);
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_get_noa(struct wpa_supplicant *wpa_s,
4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  u8 *buf, size_t buf_len)
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->get_noa)
4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->get_noa(wpa_s->drv_priv, buf, buf_len);
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_p2p_powersave(struct wpa_supplicant *wpa_s,
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    int legacy_ps, int opp_ps,
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    int ctwindow)
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->set_p2p_powersave)
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->set_p2p_powersave(wpa_s->drv_priv, legacy_ps,
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						opp_ps, ctwindow);
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_ampdu(struct wpa_supplicant *wpa_s, int ampdu)
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->ampdu)
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->ampdu(wpa_s->drv_priv, ampdu);
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_find(struct wpa_supplicant *wpa_s,
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   unsigned int timeout, int type)
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_find)
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_find(wpa_s->drv_priv, timeout, type);
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_stop_find(struct wpa_supplicant *wpa_s)
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_stop_find)
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_stop_find(wpa_s->drv_priv);
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_listen(struct wpa_supplicant *wpa_s,
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     unsigned int timeout)
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_listen)
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_listen(wpa_s->drv_priv, timeout);
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_connect(struct wpa_supplicant *wpa_s,
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *peer_addr, int wps_method,
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int go_intent,
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *own_interface_addr,
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      unsigned int force_freq,
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int persistent_group)
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_connect)
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_connect(wpa_s->drv_priv, peer_addr,
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  wps_method, go_intent,
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  own_interface_addr, force_freq,
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  persistent_group);
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_wps_success_cb(struct wpa_supplicant *wpa_s,
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *peer_addr)
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->wps_success_cb)
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->wps_success_cb(wpa_s->drv_priv, peer_addr);
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtwpa_drv_p2p_group_formation_failed(struct wpa_supplicant *wpa_s)
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_group_formation_failed)
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_group_formation_failed(wpa_s->drv_priv);
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_set_params(struct wpa_supplicant *wpa_s,
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const struct p2p_params *params)
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_set_params)
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_set_params(wpa_s->drv_priv, params);
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_prov_disc_req(struct wpa_supplicant *wpa_s,
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    const u8 *peer_addr,
5831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    u16 config_methods, int join)
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_prov_disc_req)
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_prov_disc_req(wpa_s->drv_priv, peer_addr,
5881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						config_methods, join);
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline u64 wpa_drv_p2p_sd_request(struct wpa_supplicant *wpa_s,
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *dst,
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const struct wpabuf *tlvs)
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_sd_request)
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_sd_request(wpa_s->drv_priv, dst, tlvs);
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_sd_cancel_request(struct wpa_supplicant *wpa_s,
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						u64 req)
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_sd_cancel_request)
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_sd_cancel_request(wpa_s->drv_priv, req);
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_sd_response(struct wpa_supplicant *wpa_s,
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  int freq, const u8 *dst,
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  u8 dialog_token,
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const struct wpabuf *resp_tlvs)
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_sd_response)
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_sd_response(wpa_s->drv_priv, freq, dst,
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      dialog_token, resp_tlvs);
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_service_update(struct wpa_supplicant *wpa_s)
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_service_update)
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_service_update(wpa_s->drv_priv);
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_reject(struct wpa_supplicant *wpa_s,
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *addr)
6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_reject)
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_reject(wpa_s->drv_priv, addr);
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_invite(struct wpa_supplicant *wpa_s,
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *peer, int role, const u8 *bssid,
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *ssid, size_t ssid_len,
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *go_dev_addr,
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     int persistent_group)
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_invite)
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_invite(wpa_s->drv_priv, peer, role, bssid,
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 ssid, ssid_len, go_dev_addr,
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 persistent_group);
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_tdls_mgmt(struct wpa_supplicant *wpa_s,
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *dst, u8 action_code,
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 u8 dialog_token, u16 status_code,
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *buf, size_t len)
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_tdls_mgmt) {
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_tdls_mgmt(wpa_s->drv_priv, dst,
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     action_code, dialog_token,
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     status_code, buf, len);
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    enum tdls_oper oper, const u8 *peer)
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->tdls_oper)
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6681f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef ANDROID
669bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidtstatic inline int wpa_drv_driver_cmd(struct wpa_supplicant *wpa_s,
670bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt				     char *cmd, char *buf, size_t buf_len)
671bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt{
672bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt	if (!wpa_s->driver->driver_cmd)
673bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt		return -1;
674bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt	return wpa_s->driver->driver_cmd(wpa_s->drv_priv, cmd, buf, buf_len);
675bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt}
6761f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif
677bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt
6781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic inline void wpa_drv_set_rekey_info(struct wpa_supplicant *wpa_s,
6791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					  const u8 *kek, const u8 *kck,
6801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					  const u8 *replay_ctr)
6811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
6821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_s->driver->set_rekey_info)
6831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
6841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_s->driver->set_rekey_info(wpa_s->drv_priv, kek, kck, replay_ctr);
6851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
6861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
68704949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic inline int wpa_drv_radio_disable(struct wpa_supplicant *wpa_s,
68804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					int disabled)
68904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
69004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_s->driver->radio_disable)
69104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
69204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_s->driver->radio_disable(wpa_s->drv_priv, disabled);
69304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
69404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
695c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtstatic inline int wpa_drv_switch_channel(struct wpa_supplicant *wpa_s,
69604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					 unsigned int freq)
6971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
698c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	if (!wpa_s->driver->switch_channel)
6991f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
700c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return wpa_s->driver->switch_channel(wpa_s->drv_priv, freq);
7011f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
70204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
70361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic inline int wpa_drv_wnm_oper(struct wpa_supplicant *wpa_s,
70461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				   enum wnm_oper oper, const u8 *peer,
70561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				   u8 *buf, u16 *buf_len)
70661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
70761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (!wpa_s->driver->wnm_oper)
70861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
70961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_s->driver->wnm_oper(wpa_s->drv_priv, oper, peer, buf,
71061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				       buf_len);
71161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
71261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
7138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_I_H */
714