driver_i.h revision bd567ad93e03f285fdad93464100148cd5ae7941
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_supplicant - Internal driver interface wrappers
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2003-2009, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
58d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This program is free software; you can redistribute it and/or modify
68d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * it under the terms of the GNU General Public License version 2 as
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * published by the Free Software Foundation.
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Alternatively, this software may be distributed under the terms of BSD
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * license.
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * See README and COPYING for more details.
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef DRIVER_I_H
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define DRIVER_I_H
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "drivers/driver.h"
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* driver_ops */
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void * wpa_drv_init(struct wpa_supplicant *wpa_s,
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  const char *ifname)
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->init2)
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->init2(wpa_s, ifname,
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    wpa_s->global_drv_priv);
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->init) {
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->init(wpa_s, ifname);
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_deinit(struct wpa_supplicant *wpa_s)
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->deinit)
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->deinit(wpa_s->drv_priv);
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_param(struct wpa_supplicant *wpa_s,
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    const char *param)
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_param)
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_param(wpa_s->drv_priv, param);
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_countermeasures(struct wpa_supplicant *wpa_s,
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      int enabled)
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_countermeasures) {
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_countermeasures(wpa_s->drv_priv,
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  enabled);
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_authenticate(struct wpa_supplicant *wpa_s,
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       struct wpa_driver_auth_params *params)
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->authenticate)
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->authenticate(wpa_s->drv_priv, params);
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_associate(struct wpa_supplicant *wpa_s,
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    struct wpa_driver_associate_params *params)
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->associate) {
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->associate(wpa_s->drv_priv, params);
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_scan(struct wpa_supplicant *wpa_s,
758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			       struct wpa_driver_scan_params *params)
768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->scan2)
788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->scan2(wpa_s->drv_priv, params);
798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct wpa_scan_results * wpa_drv_get_scan_results2(
838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s)
848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_scan_results2)
868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_scan_results2(wpa_s->drv_priv);
878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid)
918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_bssid) {
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid);
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid)
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_ssid) {
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid);
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s,
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  enum wpa_alg alg, const u8 *addr,
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  int key_idx, int set_tx,
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   const u8 *seq, size_t seq_len,
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   const u8 *key, size_t key_len)
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_key) {
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->keys_cleared = 0;
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_key(wpa_s->ifname, wpa_s->drv_priv,
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      alg, addr, key_idx, set_tx,
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      seq, seq_len, key, key_len);
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *addr, int reason_code)
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->deauthenticate) {
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     reason_code);
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_disassociate(struct wpa_supplicant *wpa_s,
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       const u8 *addr, int reason_code)
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->disassociate) {
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->disassociate(wpa_s->drv_priv, addr,
1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   reason_code);
1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    const u8 *bssid, const u8 *pmkid)
1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->add_pmkid) {
1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->add_pmkid(wpa_s->drv_priv, bssid, pmkid);
1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       const u8 *bssid, const u8 *pmkid)
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->remove_pmkid) {
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, bssid,
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   pmkid);
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->flush_pmkid) {
1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   struct wpa_driver_capa *capa)
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_capa) {
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->poll) {
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->poll(wpa_s->drv_priv);
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_ifname) {
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_ifname(wpa_s->drv_priv);
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_mac_addr) {
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_eapol(struct wpa_supplicant *wpa_s,
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *dst, u16 proto,
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *data, size_t data_len)
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_eapol)
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_eapol(wpa_s->drv_priv, dst, proto,
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 data, data_len);
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					int state)
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_operstate)
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     const u8 *addr, int protect_type,
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     int key_type)
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->mlme_setprotection)
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							 protect_type,
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							 key_type);
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline struct hostapd_hw_modes *
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtwpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			    u16 *flags)
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->get_hw_feature_data)
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							  num_modes, flags);
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return NULL;
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_channel(struct wpa_supplicant *wpa_s,
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      enum hostapd_hw_mode phymode, int chan,
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int freq)
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_channel)
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_channel(wpa_s->drv_priv, phymode,
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  chan, freq);
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_ssid(struct wpa_supplicant *wpa_s,
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   const u8 *ssid, size_t ssid_len)
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_ssid) {
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_ssid(wpa_s->drv_priv, ssid,
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					       ssid_len);
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_bssid(struct wpa_supplicant *wpa_s,
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    const u8 *bssid)
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_bssid) {
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_bssid(wpa_s->drv_priv, bssid);
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const char *alpha2)
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_country)
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    const u8 *data, size_t data_len)
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_mlme)
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_mlme(wpa_s->drv_priv,
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						data, data_len);
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_mlme_add_sta(struct wpa_supplicant *wpa_s,
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       const u8 *addr, const u8 *supp_rates,
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				       size_t supp_rates_len)
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->mlme_add_sta)
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->mlme_add_sta(wpa_s->drv_priv, addr,
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						   supp_rates, supp_rates_len);
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_mlme_remove_sta(struct wpa_supplicant *wpa_s,
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const u8 *addr)
2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->mlme_remove_sta)
2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->mlme_remove_sta(wpa_s->drv_priv, addr);
3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const u8 *md,
3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const u8 *ies, size_t ies_len)
3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->update_ft_ies)
3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    ies, ies_len);
3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_ft_action(struct wpa_supplicant *wpa_s,
3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 u8 action, const u8 *target_ap,
3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *ies, size_t ies_len)
3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_ft_action)
3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_ft_action(wpa_s->drv_priv, action,
3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     target_ap, ies, ies_len);
3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_beacon(struct wpa_supplicant *wpa_s,
3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *head, size_t head_len,
3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *tail, size_t tail_len,
3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     int dtim_period, int beacon_int)
3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_beacon)
3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_beacon(wpa_s->drv_priv, head,
3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 head_len, tail, tail_len,
3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						 dtim_period, beacon_int);
3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_sta_add(struct wpa_supplicant *wpa_s,
3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  struct hostapd_sta_add_params *params)
3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->sta_add)
3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->sta_add(wpa_s->drv_priv, params);
3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_sta_remove(struct wpa_supplicant *wpa_s,
3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *addr)
3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->sta_remove)
3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->sta_remove(wpa_s->drv_priv, addr);
3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s,
3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const u8 *addr, const u8 *data,
3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  size_t data_len, int encrypt,
3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const u8 *own_addr, u32 flags)
3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->hapd_send_eapol)
3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->hapd_send_eapol(wpa_s->drv_priv, addr,
3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      data, data_len, encrypt,
3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						      own_addr, flags);
3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const u8 *addr, int total_flags,
3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					int flags_or, int flags_and)
3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->sta_set_flags)
3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    total_flags, flags_or,
3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    flags_and);
3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_supp_port(struct wpa_supplicant *wpa_s,
3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					int authorized)
3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_supp_port) {
3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_supp_port(wpa_s->drv_priv,
3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						    authorized);
3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_action(struct wpa_supplicant *wpa_s,
3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      unsigned int freq,
3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      unsigned int wait,
3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *dst, const u8 *src,
3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *bssid,
3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *data, size_t data_len)
3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_action)
3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_action(wpa_s->drv_priv, freq,
3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  wait, dst, src, bssid,
3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						  data, data_len);
3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_action_cancel_wait)
4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->send_action_cancel_wait(wpa_s->drv_priv);
4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_freq(struct wpa_supplicant *wpa_s,
4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   struct hostapd_freq_params *freq)
4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_freq)
4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_freq(wpa_s->drv_priv, freq);
4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s,
4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 enum wpa_driver_if_type type,
4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 const char *ifname, const u8 *addr,
4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 void *bss_ctx, char *force_ifname,
4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				 u8 *if_addr, const char *bridge)
4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->if_add)
4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname,
4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     addr, bss_ctx, NULL, force_ifname,
4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					     if_addr, bridge);
4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_if_remove(struct wpa_supplicant *wpa_s,
4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    enum wpa_driver_if_type type,
4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    const char *ifname)
4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->if_remove)
4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->if_remove(wpa_s->drv_priv, type, ifname);
4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_intra_bss(struct wpa_supplicant *wpa_s,
4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					int enabled)
4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->set_intra_bss)
4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->set_intra_bss(wpa_s->drv_priv, enabled);
4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_remain_on_channel(struct wpa_supplicant *wpa_s,
4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    unsigned int freq,
4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    unsigned int duration)
4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->remain_on_channel)
4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->remain_on_channel(wpa_s->drv_priv, freq,
4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							duration);
4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_cancel_remain_on_channel(
4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	struct wpa_supplicant *wpa_s)
4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->cancel_remain_on_channel)
4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->cancel_remain_on_channel(
4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt			wpa_s->drv_priv);
4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_probe_req_report(struct wpa_supplicant *wpa_s,
4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					   int report)
4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->probe_req_report)
4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->probe_req_report(wpa_s->drv_priv,
4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						       report);
4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_disable_11b_rates(struct wpa_supplicant *wpa_s,
4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    int disabled)
4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->disable_11b_rates)
4748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->disable_11b_rates(wpa_s->drv_priv,
4758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt							disabled);
4768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
4778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
4808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->deinit_ap)
4828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->deinit_ap(wpa_s->drv_priv);
4838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return 0;
4848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
4878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->suspend)
4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->suspend(wpa_s->drv_priv);
4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline void wpa_drv_resume(struct wpa_supplicant *wpa_s)
4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->resume)
4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		wpa_s->driver->resume(wpa_s->drv_priv);
4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s,
4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 int threshold, int hysteresis)
5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->signal_monitor)
5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->signal_monitor(wpa_s->drv_priv,
5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     threshold, hysteresis);
5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      struct wpa_signal_info *si)
5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->signal_poll)
5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->signal_poll(wpa_s->drv_priv, si);
5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const struct wpabuf *beacon,
5178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const struct wpabuf *proberesp,
5188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					const struct wpabuf *assocresp)
5198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->set_ap_wps_ie)
5218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon,
5238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    proberesp, assocresp);
5248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_shared_freq(struct wpa_supplicant *wpa_s)
5278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->shared_freq)
5298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->shared_freq(wpa_s->drv_priv);
5318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_get_noa(struct wpa_supplicant *wpa_s,
5348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				  u8 *buf, size_t buf_len)
5358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->get_noa)
5378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->get_noa(wpa_s->drv_priv, buf, buf_len);
5398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_set_p2p_powersave(struct wpa_supplicant *wpa_s,
5428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    int legacy_ps, int opp_ps,
5438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    int ctwindow)
5448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->set_p2p_powersave)
5468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->set_p2p_powersave(wpa_s->drv_priv, legacy_ps,
5488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						opp_ps, ctwindow);
5498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_ampdu(struct wpa_supplicant *wpa_s, int ampdu)
5528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->ampdu)
5548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->ampdu(wpa_s->drv_priv, ampdu);
5568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_find(struct wpa_supplicant *wpa_s,
5598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				   unsigned int timeout, int type)
5608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_find)
5628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_find(wpa_s->drv_priv, timeout, type);
5648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_stop_find(struct wpa_supplicant *wpa_s)
5678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_stop_find)
5698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_stop_find(wpa_s->drv_priv);
5718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_listen(struct wpa_supplicant *wpa_s,
5748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     unsigned int timeout)
5758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_listen)
5778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_listen(wpa_s->drv_priv, timeout);
5798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_connect(struct wpa_supplicant *wpa_s,
5828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *peer_addr, int wps_method,
5838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int go_intent,
5848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      const u8 *own_interface_addr,
5858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      unsigned int force_freq,
5868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				      int persistent_group)
5878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_connect)
5898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
5908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_connect(wpa_s->drv_priv, peer_addr,
5918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  wps_method, go_intent,
5928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  own_interface_addr, force_freq,
5938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  persistent_group);
5948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
5958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_wps_success_cb(struct wpa_supplicant *wpa_s,
5978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *peer_addr)
5988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
5998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->wps_success_cb)
6008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->wps_success_cb(wpa_s->drv_priv, peer_addr);
6028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int
6058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtwpa_drv_p2p_group_formation_failed(struct wpa_supplicant *wpa_s)
6068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_group_formation_failed)
6088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_group_formation_failed(wpa_s->drv_priv);
6108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_set_params(struct wpa_supplicant *wpa_s,
6138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const struct p2p_params *params)
6148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_set_params)
6168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_set_params(wpa_s->drv_priv, params);
6188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_prov_disc_req(struct wpa_supplicant *wpa_s,
6218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    const u8 *peer_addr,
6228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					    u16 config_methods)
6238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_prov_disc_req)
6258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_prov_disc_req(wpa_s->drv_priv, peer_addr,
6278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						config_methods);
6288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline u64 wpa_drv_p2p_sd_request(struct wpa_supplicant *wpa_s,
6318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *dst,
6328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const struct wpabuf *tlvs)
6338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_sd_request)
6358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return 0;
6368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_sd_request(wpa_s->drv_priv, dst, tlvs);
6378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_sd_cancel_request(struct wpa_supplicant *wpa_s,
6408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						u64 req)
6418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_sd_cancel_request)
6438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_sd_cancel_request(wpa_s->drv_priv, req);
6458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_sd_response(struct wpa_supplicant *wpa_s,
6488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  int freq, const u8 *dst,
6498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  u8 dialog_token,
6508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					  const struct wpabuf *resp_tlvs)
6518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_sd_response)
6538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_sd_response(wpa_s->drv_priv, freq, dst,
6558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					      dialog_token, resp_tlvs);
6568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_service_update(struct wpa_supplicant *wpa_s)
6598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_service_update)
6618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_service_update(wpa_s->drv_priv);
6638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_reject(struct wpa_supplicant *wpa_s,
6668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *addr)
6678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_reject)
6698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_reject(wpa_s->drv_priv, addr);
6718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_p2p_invite(struct wpa_supplicant *wpa_s,
6748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *peer, int role, const u8 *bssid,
6758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *ssid, size_t ssid_len,
6768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     const u8 *go_dev_addr,
6778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     int persistent_group)
6788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->p2p_invite)
6808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
6818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->p2p_invite(wpa_s->drv_priv, peer, role, bssid,
6828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 ssid, ssid_len, go_dev_addr,
6838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 persistent_group);
6848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_send_tdls_mgmt(struct wpa_supplicant *wpa_s,
6878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *dst, u8 action_code,
6888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 u8 dialog_token, u16 status_code,
6898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt					 const u8 *buf, size_t len)
6908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
6918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (wpa_s->driver->send_tdls_mgmt) {
6928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return wpa_s->driver->send_tdls_mgmt(wpa_s->drv_priv, dst,
6938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     action_code, dialog_token,
6948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt						     status_code, buf, len);
6958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	}
6968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return -1;
6978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
6988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
6998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstatic inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
7008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				    enum tdls_oper oper, const u8 *peer)
7018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{
7028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	if (!wpa_s->driver->tdls_oper)
7038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt		return -1;
7048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
7058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}
7068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
707bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidtstatic inline int wpa_drv_driver_cmd(struct wpa_supplicant *wpa_s,
708bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt				     char *cmd, char *buf, size_t buf_len)
709bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt{
710bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt	if (!wpa_s->driver->driver_cmd)
711bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt		return -1;
712bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt	return wpa_s->driver->driver_cmd(wpa_s->drv_priv, cmd, buf, buf_len);
713bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt}
714bd567ad93e03f285fdad93464100148cd5ae7941Dmitry Shmidt
7158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* DRIVER_I_H */
716