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
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *addr, int reason_code)
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->deauthenticate) {
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     reason_code);
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_disassociate(struct wpa_supplicant *wpa_s,
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       const u8 *addr, int reason_code)
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->disassociate) {
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->disassociate(wpa_s->drv_priv, addr,
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   reason_code);
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    const u8 *bssid, const u8 *pmkid)
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->add_pmkid) {
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->add_pmkid(wpa_s->drv_priv, bssid, pmkid);
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       const u8 *bssid, const u8 *pmkid)
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->remove_pmkid) {
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, bssid,
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   pmkid);
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->flush_pmkid) {
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   struct wpa_driver_capa *capa)
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_capa) {
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->poll) {
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->poll(wpa_s->drv_priv);
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_ifname) {
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_ifname(wpa_s->drv_priv);
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_mac_addr) {
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_eapol(struct wpa_supplicant *wpa_s,
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *dst, u16 proto,
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *data, size_t data_len)
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_eapol)
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_eapol(wpa_s->drv_priv, dst, proto,
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 data, data_len);
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					int state)
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_operstate)
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     const u8 *addr, int protect_type,
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     int key_type)
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->mlme_setprotection)
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							 protect_type,
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							 key_type);
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct hostapd_hw_modes *
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtwpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    u16 *flags)
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_hw_feature_data)
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  num_modes, flags);
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const char *alpha2)
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_country)
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
2591f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				    const u8 *data, size_t data_len, int noack)
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_mlme)
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_mlme(wpa_s->drv_priv,
2631f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						data, data_len, noack);
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const u8 *md,
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const u8 *ies, size_t ies_len)
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->update_ft_ies)
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    ies, ies_len);
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_ft_action(struct wpa_supplicant *wpa_s,
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 u8 action, const u8 *target_ap,
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *ies, size_t ies_len)
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_ft_action)
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_ft_action(wpa_s->drv_priv, action,
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     target_ap, ies, ies_len);
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic inline int wpa_drv_set_ap(struct wpa_supplicant *wpa_s,
2881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				 struct wpa_driver_ap_params *params)
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (wpa_s->driver->set_ap)
2911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return wpa_s->driver->set_ap(wpa_s->drv_priv, params);
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_sta_add(struct wpa_supplicant *wpa_s,
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  struct hostapd_sta_add_params *params)
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->sta_add)
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->sta_add(wpa_s->drv_priv, params);
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_sta_remove(struct wpa_supplicant *wpa_s,
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *addr)
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->sta_remove)
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->sta_remove(wpa_s->drv_priv, addr);
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s,
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const u8 *addr, const u8 *data,
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  size_t data_len, int encrypt,
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const u8 *own_addr, u32 flags)
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->hapd_send_eapol)
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->hapd_send_eapol(wpa_s->drv_priv, addr,
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      data, data_len, encrypt,
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      own_addr, flags);
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const u8 *addr, int total_flags,
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					int flags_or, int flags_and)
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->sta_set_flags)
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    total_flags, flags_or,
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    flags_and);
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_supp_port(struct wpa_supplicant *wpa_s,
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					int authorized)
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_supp_port) {
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_supp_port(wpa_s->drv_priv,
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    authorized);
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_action(struct wpa_supplicant *wpa_s,
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      unsigned int freq,
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      unsigned int wait,
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *dst, const u8 *src,
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *bssid,
3491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      const u8 *data, size_t data_len,
3501f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt				      int no_cck)
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_action)
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_action(wpa_s->drv_priv, freq,
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  wait, dst, src, bssid,
3551f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						  data, data_len, no_cck);
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_action_cancel_wait)
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->send_action_cancel_wait(wpa_s->drv_priv);
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_freq(struct wpa_supplicant *wpa_s,
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   struct hostapd_freq_params *freq)
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_freq)
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_freq(wpa_s->drv_priv, freq);
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s,
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 enum wpa_driver_if_type type,
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 const char *ifname, const u8 *addr,
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 void *bss_ctx, char *force_ifname,
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 u8 *if_addr, const char *bridge)
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->if_add)
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname,
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     addr, bss_ctx, NULL, force_ifname,
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     if_addr, bridge);
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_if_remove(struct wpa_supplicant *wpa_s,
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    enum wpa_driver_if_type type,
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    const char *ifname)
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->if_remove)
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->if_remove(wpa_s->drv_priv, type, ifname);
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_remain_on_channel(struct wpa_supplicant *wpa_s,
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    unsigned int freq,
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    unsigned int duration)
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->remain_on_channel)
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->remain_on_channel(wpa_s->drv_priv, freq,
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							duration);
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_cancel_remain_on_channel(
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s)
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->cancel_remain_on_channel)
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->cancel_remain_on_channel(
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_s->drv_priv);
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_probe_req_report(struct wpa_supplicant *wpa_s,
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   int report)
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->probe_req_report)
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->probe_req_report(wpa_s->drv_priv,
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       report);
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->deinit_ap)
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->deinit_ap(wpa_s->drv_priv);
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
43004949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic inline int wpa_drv_deinit_p2p_cli(struct wpa_supplicant *wpa_s)
43104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
43204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (wpa_s->driver->deinit_p2p_cli)
43304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return wpa_s->driver->deinit_p2p_cli(wpa_s->drv_priv);
43404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return 0;
43504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
43604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->suspend)
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->suspend(wpa_s->drv_priv);
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_resume(struct wpa_supplicant *wpa_s)
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->resume)
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->resume(wpa_s->drv_priv);
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s,
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 int threshold, int hysteresis)
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->signal_monitor)
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->signal_monitor(wpa_s->drv_priv,
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     threshold, hysteresis);
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      struct wpa_signal_info *si)
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->signal_poll)
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->signal_poll(wpa_s->drv_priv, si);
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
466fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zhengstatic inline int wpa_drv_pktcnt_poll(struct wpa_supplicant *wpa_s,
467fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng				      struct hostap_sta_driver_data *sta)
468fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng{
469fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	if (wpa_s->driver->read_sta_data)
4701e6c57fee4a56b421cc20f6dc0785c9138b21337Jouni Malinen		return wpa_s->driver->read_sta_data(wpa_s->drv_priv, sta,
4711e6c57fee4a56b421cc20f6dc0785c9138b21337Jouni Malinen						    wpa_s->bssid);
472fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng	return -1;
473fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng}
474fcd6f21dad589eb6fdba941c98e072ca2664726bYuhao Zheng
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const struct wpabuf *beacon,
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const struct wpabuf *proberesp,
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const struct wpabuf *assocresp)
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->set_ap_wps_ie)
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon,
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    proberesp, assocresp);
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_shared_freq(struct wpa_supplicant *wpa_s)
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->shared_freq)
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->shared_freq(wpa_s->drv_priv);
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_get_noa(struct wpa_supplicant *wpa_s,
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  u8 *buf, size_t buf_len)
4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->get_noa)
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->get_noa(wpa_s->drv_priv, buf, buf_len);
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_p2p_powersave(struct wpa_supplicant *wpa_s,
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    int legacy_ps, int opp_ps,
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    int ctwindow)
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->set_p2p_powersave)
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->set_p2p_powersave(wpa_s->drv_priv, legacy_ps,
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						opp_ps, ctwindow);
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_ampdu(struct wpa_supplicant *wpa_s, int ampdu)
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->ampdu)
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->ampdu(wpa_s->drv_priv, ampdu);
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_find(struct wpa_supplicant *wpa_s,
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   unsigned int timeout, int type)
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_find)
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_find(wpa_s->drv_priv, timeout, type);
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_stop_find(struct wpa_supplicant *wpa_s)
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_stop_find)
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_stop_find(wpa_s->drv_priv);
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_listen(struct wpa_supplicant *wpa_s,
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     unsigned int timeout)
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_listen)
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_listen(wpa_s->drv_priv, timeout);
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_connect(struct wpa_supplicant *wpa_s,
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *peer_addr, int wps_method,
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int go_intent,
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *own_interface_addr,
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      unsigned int force_freq,
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int persistent_group)
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_connect)
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_connect(wpa_s->drv_priv, peer_addr,
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  wps_method, go_intent,
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  own_interface_addr, force_freq,
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  persistent_group);
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_wps_success_cb(struct wpa_supplicant *wpa_s,
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *peer_addr)
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->wps_success_cb)
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->wps_success_cb(wpa_s->drv_priv, peer_addr);
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtwpa_drv_p2p_group_formation_failed(struct wpa_supplicant *wpa_s)
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_group_formation_failed)
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_group_formation_failed(wpa_s->drv_priv);
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_set_params(struct wpa_supplicant *wpa_s,
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const struct p2p_params *params)
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_set_params)
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_set_params(wpa_s->drv_priv, params);
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_prov_disc_req(struct wpa_supplicant *wpa_s,
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    const u8 *peer_addr,
5821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					    u16 config_methods, int join)
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_prov_disc_req)
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_prov_disc_req(wpa_s->drv_priv, peer_addr,
5871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt						config_methods, join);
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline u64 wpa_drv_p2p_sd_request(struct wpa_supplicant *wpa_s,
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *dst,
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const struct wpabuf *tlvs)
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_sd_request)
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_sd_request(wpa_s->drv_priv, dst, tlvs);
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_sd_cancel_request(struct wpa_supplicant *wpa_s,
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						u64 req)
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_sd_cancel_request)
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_sd_cancel_request(wpa_s->drv_priv, req);
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_sd_response(struct wpa_supplicant *wpa_s,
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  int freq, const u8 *dst,
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  u8 dialog_token,
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const struct wpabuf *resp_tlvs)
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_sd_response)
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_sd_response(wpa_s->drv_priv, freq, dst,
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      dialog_token, resp_tlvs);
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_service_update(struct wpa_supplicant *wpa_s)
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_service_update)
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_service_update(wpa_s->drv_priv);
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_reject(struct wpa_supplicant *wpa_s,
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *addr)
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_reject)
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_reject(wpa_s->drv_priv, addr);
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_invite(struct wpa_supplicant *wpa_s,
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *peer, int role, const u8 *bssid,
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *ssid, size_t ssid_len,
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *go_dev_addr,
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     int persistent_group)
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_invite)
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_invite(wpa_s->drv_priv, peer, role, bssid,
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 ssid, ssid_len, go_dev_addr,
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 persistent_group);
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_tdls_mgmt(struct wpa_supplicant *wpa_s,
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *dst, u8 action_code,
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 u8 dialog_token, u16 status_code,
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *buf, size_t len)
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_tdls_mgmt) {
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_tdls_mgmt(wpa_s->drv_priv, dst,
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     action_code, dialog_token,
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     status_code, buf, len);
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    enum tdls_oper oper, const u8 *peer)
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->tdls_oper)
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6671f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#ifdef ANDROID
668bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidtstatic inline int wpa_drv_driver_cmd(struct wpa_supplicant *wpa_s,
669bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt				     char *cmd, char *buf, size_t buf_len)
670bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt{
671bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt	if (!wpa_s->driver->driver_cmd)
672bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt		return -1;
673bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt	return wpa_s->driver->driver_cmd(wpa_s->drv_priv, cmd, buf, buf_len);
674bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt}
6751f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt#endif
676bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt
6771f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtstatic inline void wpa_drv_set_rekey_info(struct wpa_supplicant *wpa_s,
6781f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					  const u8 *kek, const u8 *kck,
6791f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt					  const u8 *replay_ctr)
6801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
6811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	if (!wpa_s->driver->set_rekey_info)
6821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return;
6831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt	wpa_s->driver->set_rekey_info(wpa_s->drv_priv, kek, kck, replay_ctr);
6841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
6851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt
68604949598a23f501be6eec21697465fd46a28840aDmitry Shmidtstatic inline int wpa_drv_radio_disable(struct wpa_supplicant *wpa_s,
68704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					int disabled)
68804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt{
68904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	if (!wpa_s->driver->radio_disable)
69004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt		return -1;
69104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt	return wpa_s->driver->radio_disable(wpa_s->drv_priv, disabled);
69204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt}
69304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
694c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidtstatic inline int wpa_drv_switch_channel(struct wpa_supplicant *wpa_s,
69504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt					 unsigned int freq)
6961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{
697c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	if (!wpa_s->driver->switch_channel)
6981f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt		return -1;
699c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt	return wpa_s->driver->switch_channel(wpa_s->drv_priv, freq);
7001f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt}
70104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt
70261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstatic inline int wpa_drv_wnm_oper(struct wpa_supplicant *wpa_s,
70361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				   enum wnm_oper oper, const u8 *peer,
70461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				   u8 *buf, u16 *buf_len)
70561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt{
70661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	if (!wpa_s->driver->wnm_oper)
70761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		return -1;
70861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	return wpa_s->driver->wnm_oper(wpa_s->drv_priv, oper, peer, buf,
70961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt				       buf_len);
71061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt}
71161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
7128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_I_H */
713