blob: 43847cf4ab2ee2e4d75551dd1793b16431d3ce77 [file] [log] [blame]
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -07001/*
2 * wpa_supplicant - Internal driver interface wrappers
Dmitry Shmidt807291d2015-01-27 13:40:23 -08003 * Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi>
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -07004 *
Dmitry Shmidtc5ec7f52012-03-06 16:33:24 -08005 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -07007 */
8
9#ifndef DRIVER_I_H
10#define DRIVER_I_H
11
Sunil Ravic0f5d412024-09-11 22:12:49 +000012#include "common/nan_de.h"
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -070013#include "drivers/driver.h"
14
15/* driver_ops */
16static inline void * wpa_drv_init(struct wpa_supplicant *wpa_s,
17 const char *ifname)
18{
Sunil Ravi79e6c4f2025-01-04 00:47:06 +000019 if (wpa_s->driver->init2) {
20 enum wpa_p2p_mode p2p_mode = WPA_P2P_MODE_WFD_R1;
21
22#ifdef CONFIG_P2P
23 p2p_mode = wpa_s->p2p_mode;
24#endif /* CONFIG_P2P */
25
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -070026 return wpa_s->driver->init2(wpa_s, ifname,
Sunil Ravi79e6c4f2025-01-04 00:47:06 +000027 wpa_s->global_drv_priv,
28 p2p_mode);
29 }
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -070030 if (wpa_s->driver->init) {
31 return wpa_s->driver->init(wpa_s, ifname);
32 }
33 return NULL;
34}
35
36static inline void wpa_drv_deinit(struct wpa_supplicant *wpa_s)
37{
38 if (wpa_s->driver->deinit)
39 wpa_s->driver->deinit(wpa_s->drv_priv);
40}
41
42static inline int wpa_drv_set_param(struct wpa_supplicant *wpa_s,
43 const char *param)
44{
45 if (wpa_s->driver->set_param)
46 return wpa_s->driver->set_param(wpa_s->drv_priv, param);
47 return 0;
48}
49
50static inline int wpa_drv_set_countermeasures(struct wpa_supplicant *wpa_s,
51 int enabled)
52{
53 if (wpa_s->driver->set_countermeasures) {
54 return wpa_s->driver->set_countermeasures(wpa_s->drv_priv,
55 enabled);
56 }
57 return -1;
58}
59
60static inline int wpa_drv_authenticate(struct wpa_supplicant *wpa_s,
61 struct wpa_driver_auth_params *params)
62{
63 if (wpa_s->driver->authenticate)
64 return wpa_s->driver->authenticate(wpa_s->drv_priv, params);
65 return -1;
66}
67
68static inline int wpa_drv_associate(struct wpa_supplicant *wpa_s,
69 struct wpa_driver_associate_params *params)
70{
71 if (wpa_s->driver->associate) {
Sunil Ravi2a14cf12023-11-21 00:54:38 +000072 if (params)
73 params->freq.link_id = -1;
74
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -070075 return wpa_s->driver->associate(wpa_s->drv_priv, params);
76 }
77 return -1;
78}
79
Dmitry Shmidt6c0da2b2015-01-05 13:08:17 -080080static inline int wpa_drv_init_mesh(struct wpa_supplicant *wpa_s)
81{
82 if (wpa_s->driver->init_mesh)
83 return wpa_s->driver->init_mesh(wpa_s->drv_priv);
84 return -1;
85}
86
87static inline int wpa_drv_join_mesh(struct wpa_supplicant *wpa_s,
88 struct wpa_driver_mesh_join_params *params)
89{
90 if (wpa_s->driver->join_mesh)
91 return wpa_s->driver->join_mesh(wpa_s->drv_priv, params);
92 return -1;
93}
94
95static inline int wpa_drv_leave_mesh(struct wpa_supplicant *wpa_s)
96{
97 if (wpa_s->driver->leave_mesh)
98 return wpa_s->driver->leave_mesh(wpa_s->drv_priv);
99 return -1;
100}
101
Hai Shalom81f62d82019-07-22 12:10:00 -0700102static inline int wpa_drv_mesh_link_probe(struct wpa_supplicant *wpa_s,
103 const u8 *addr,
104 const u8 *eth, size_t len)
105{
106 if (wpa_s->driver->probe_mesh_link)
107 return wpa_s->driver->probe_mesh_link(wpa_s->drv_priv, addr,
108 eth, len);
109 return -1;
110}
111
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700112static inline int wpa_drv_scan(struct wpa_supplicant *wpa_s,
113 struct wpa_driver_scan_params *params)
114{
Sunil Ravi79e6c4f2025-01-04 00:47:06 +0000115 params->link_id = -1;
116
Dmitry Shmidt2f74e362015-01-21 13:19:05 -0800117#ifdef CONFIG_TESTING_OPTIONS
118 if (wpa_s->test_failure == WPAS_TEST_FAILURE_SCAN_TRIGGER)
119 return -EBUSY;
120#endif /* CONFIG_TESTING_OPTIONS */
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700121 if (wpa_s->driver->scan2)
122 return wpa_s->driver->scan2(wpa_s->drv_priv, params);
123 return -1;
124}
125
Dmitry Shmidt1f69aa52012-01-24 16:10:04 -0800126static inline int wpa_drv_sched_scan(struct wpa_supplicant *wpa_s,
Dmitry Shmidtd7ff03d2015-12-04 14:49:35 -0800127 struct wpa_driver_scan_params *params)
Dmitry Shmidt1f69aa52012-01-24 16:10:04 -0800128{
129 if (wpa_s->driver->sched_scan)
Dmitry Shmidtd7ff03d2015-12-04 14:49:35 -0800130 return wpa_s->driver->sched_scan(wpa_s->drv_priv, params);
Dmitry Shmidt1f69aa52012-01-24 16:10:04 -0800131 return -1;
132}
133
134static inline int wpa_drv_stop_sched_scan(struct wpa_supplicant *wpa_s)
135{
136 if (wpa_s->driver->stop_sched_scan)
137 return wpa_s->driver->stop_sched_scan(wpa_s->drv_priv);
138 return -1;
139}
140
Hai Shalomfdcde762020-04-02 11:19:20 -0700141struct wpa_scan_results *
Sunil Ravi99c035e2024-07-12 01:42:03 +0000142wpa_drv_get_scan_results(struct wpa_supplicant *wpa_s, const u8 *bssid);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700143
144static inline int wpa_drv_get_bssid(struct wpa_supplicant *wpa_s, u8 *bssid)
145{
146 if (wpa_s->driver->get_bssid) {
147 return wpa_s->driver->get_bssid(wpa_s->drv_priv, bssid);
148 }
149 return -1;
150}
151
152static inline int wpa_drv_get_ssid(struct wpa_supplicant *wpa_s, u8 *ssid)
153{
154 if (wpa_s->driver->get_ssid) {
155 return wpa_s->driver->get_ssid(wpa_s->drv_priv, ssid);
156 }
157 return -1;
158}
159
Sunil Ravi38ad1ed2023-01-17 23:58:31 +0000160static inline int wpa_drv_set_key(struct wpa_supplicant *wpa_s, int link_id,
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700161 enum wpa_alg alg, const u8 *addr,
162 int key_idx, int set_tx,
Dmitry Shmidtfb79edc2014-01-10 10:45:54 -0800163 const u8 *seq, size_t seq_len,
Hai Shalomfdcde762020-04-02 11:19:20 -0700164 const u8 *key, size_t key_len,
165 enum key_flag key_flag)
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700166{
Hai Shalomfdcde762020-04-02 11:19:20 -0700167 struct wpa_driver_set_key_params params;
168
169 os_memset(&params, 0, sizeof(params));
170 params.ifname = wpa_s->ifname;
171 params.alg = alg;
172 params.addr = addr;
173 params.key_idx = key_idx;
174 params.set_tx = set_tx;
175 params.seq = seq;
176 params.seq_len = seq_len;
177 params.key = key;
178 params.key_len = key_len;
179 params.key_flag = key_flag;
Sunil Ravi38ad1ed2023-01-17 23:58:31 +0000180 params.link_id = link_id;
Hai Shalomfdcde762020-04-02 11:19:20 -0700181
Dmitry Shmidtfb79edc2014-01-10 10:45:54 -0800182 if (alg != WPA_ALG_NONE) {
Hai Shalomfdcde762020-04-02 11:19:20 -0700183 /* keyidx = 1 can be either a broadcast or--with
184 * Extended Key ID--a unicast key. Use bit 15 for
185 * the pairwise keyidx 1 which is hopefully high enough
186 * to not clash with future extensions.
187 */
188 if (key_idx == 1 && (key_flag & KEY_FLAG_PAIRWISE))
189 wpa_s->keys_cleared &= ~BIT(15);
190 else if (key_idx >= 0 && key_idx <= 5)
Dmitry Shmidtfb79edc2014-01-10 10:45:54 -0800191 wpa_s->keys_cleared &= ~BIT(key_idx);
192 else
193 wpa_s->keys_cleared = 0;
194 }
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700195 if (wpa_s->driver->set_key) {
Hai Shalomfdcde762020-04-02 11:19:20 -0700196 return wpa_s->driver->set_key(wpa_s->drv_priv, &params);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700197 }
198 return -1;
199}
200
Dmitry Shmidtd5ab1b52016-06-21 12:38:41 -0700201static inline int wpa_drv_get_seqnum(struct wpa_supplicant *wpa_s,
202 const u8 *addr, int idx, u8 *seq)
203{
204 if (wpa_s->driver->get_seqnum)
205 return wpa_s->driver->get_seqnum(wpa_s->ifname, wpa_s->drv_priv,
Sunil Ravi2a14cf12023-11-21 00:54:38 +0000206 addr, idx, -1, seq);
Dmitry Shmidtd5ab1b52016-06-21 12:38:41 -0700207 return -1;
208}
209
Dmitry Shmidt34af3062013-07-11 10:46:32 -0700210static inline int wpa_drv_sta_deauth(struct wpa_supplicant *wpa_s,
Hai Shalom81f62d82019-07-22 12:10:00 -0700211 const u8 *addr, u16 reason_code)
Dmitry Shmidt34af3062013-07-11 10:46:32 -0700212{
213 if (wpa_s->driver->sta_deauth) {
Dmitry Shmidtc2ebb4b2013-07-24 12:57:51 -0700214 return wpa_s->driver->sta_deauth(wpa_s->drv_priv,
215 wpa_s->own_addr, addr,
Sunil Ravi2a14cf12023-11-21 00:54:38 +0000216 reason_code, -1);
Dmitry Shmidt34af3062013-07-11 10:46:32 -0700217 }
218 return -1;
219}
220
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700221static inline int wpa_drv_deauthenticate(struct wpa_supplicant *wpa_s,
Hai Shalom81f62d82019-07-22 12:10:00 -0700222 const u8 *addr, u16 reason_code)
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700223{
224 if (wpa_s->driver->deauthenticate) {
225 return wpa_s->driver->deauthenticate(wpa_s->drv_priv, addr,
226 reason_code);
227 }
228 return -1;
229}
230
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700231static inline int wpa_drv_add_pmkid(struct wpa_supplicant *wpa_s,
Dmitry Shmidtd2986c22017-10-23 14:22:09 -0700232 struct wpa_pmkid_params *params)
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700233{
234 if (wpa_s->driver->add_pmkid) {
Dmitry Shmidtd2986c22017-10-23 14:22:09 -0700235 return wpa_s->driver->add_pmkid(wpa_s->drv_priv, params);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700236 }
237 return -1;
238}
239
240static inline int wpa_drv_remove_pmkid(struct wpa_supplicant *wpa_s,
Dmitry Shmidtd2986c22017-10-23 14:22:09 -0700241 struct wpa_pmkid_params *params)
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700242{
243 if (wpa_s->driver->remove_pmkid) {
Dmitry Shmidtd2986c22017-10-23 14:22:09 -0700244 return wpa_s->driver->remove_pmkid(wpa_s->drv_priv, params);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700245 }
246 return -1;
247}
248
249static inline int wpa_drv_flush_pmkid(struct wpa_supplicant *wpa_s)
250{
251 if (wpa_s->driver->flush_pmkid) {
252 return wpa_s->driver->flush_pmkid(wpa_s->drv_priv);
253 }
254 return -1;
255}
256
257static inline int wpa_drv_get_capa(struct wpa_supplicant *wpa_s,
258 struct wpa_driver_capa *capa)
259{
260 if (wpa_s->driver->get_capa) {
261 return wpa_s->driver->get_capa(wpa_s->drv_priv, capa);
262 }
263 return -1;
264}
265
266static inline void wpa_drv_poll(struct wpa_supplicant *wpa_s)
267{
268 if (wpa_s->driver->poll) {
269 wpa_s->driver->poll(wpa_s->drv_priv);
270 }
271}
272
273static inline const char * wpa_drv_get_ifname(struct wpa_supplicant *wpa_s)
274{
275 if (wpa_s->driver->get_ifname) {
276 return wpa_s->driver->get_ifname(wpa_s->drv_priv);
277 }
278 return NULL;
279}
280
Dmitry Shmidtd11f0192014-03-24 12:09:47 -0700281static inline const char *
282wpa_driver_get_radio_name(struct wpa_supplicant *wpa_s)
283{
284 if (wpa_s->driver->get_radio_name)
285 return wpa_s->driver->get_radio_name(wpa_s->drv_priv);
286 return NULL;
287}
288
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700289static inline const u8 * wpa_drv_get_mac_addr(struct wpa_supplicant *wpa_s)
290{
291 if (wpa_s->driver->get_mac_addr) {
292 return wpa_s->driver->get_mac_addr(wpa_s->drv_priv);
293 }
294 return NULL;
295}
296
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700297static inline int wpa_drv_set_operstate(struct wpa_supplicant *wpa_s,
298 int state)
299{
300 if (wpa_s->driver->set_operstate)
301 return wpa_s->driver->set_operstate(wpa_s->drv_priv, state);
302 return 0;
303}
304
305static inline int wpa_drv_mlme_setprotection(struct wpa_supplicant *wpa_s,
306 const u8 *addr, int protect_type,
307 int key_type)
308{
309 if (wpa_s->driver->mlme_setprotection)
310 return wpa_s->driver->mlme_setprotection(wpa_s->drv_priv, addr,
311 protect_type,
312 key_type);
313 return 0;
314}
315
316static inline struct hostapd_hw_modes *
317wpa_drv_get_hw_feature_data(struct wpa_supplicant *wpa_s, u16 *num_modes,
Dmitry Shmidtd2986c22017-10-23 14:22:09 -0700318 u16 *flags, u8 *dfs_domain)
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700319{
320 if (wpa_s->driver->get_hw_feature_data)
321 return wpa_s->driver->get_hw_feature_data(wpa_s->drv_priv,
Dmitry Shmidtd2986c22017-10-23 14:22:09 -0700322 num_modes, flags,
323 dfs_domain);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700324 return NULL;
325}
326
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700327static inline int wpa_drv_set_country(struct wpa_supplicant *wpa_s,
328 const char *alpha2)
329{
330 if (wpa_s->driver->set_country)
331 return wpa_s->driver->set_country(wpa_s->drv_priv, alpha2);
332 return 0;
333}
334
335static inline int wpa_drv_send_mlme(struct wpa_supplicant *wpa_s,
Dmitry Shmidta3dc3092015-06-23 11:21:28 -0700336 const u8 *data, size_t data_len, int noack,
Hai Shalomfdcde762020-04-02 11:19:20 -0700337 unsigned int freq, unsigned int wait)
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700338{
339 if (wpa_s->driver->send_mlme)
340 return wpa_s->driver->send_mlme(wpa_s->drv_priv,
Dmitry Shmidta3dc3092015-06-23 11:21:28 -0700341 data, data_len, noack,
Sunil Ravi2a14cf12023-11-21 00:54:38 +0000342 freq, NULL, 0, 0, wait, -1);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700343 return -1;
344}
345
346static inline int wpa_drv_update_ft_ies(struct wpa_supplicant *wpa_s,
347 const u8 *md,
348 const u8 *ies, size_t ies_len)
349{
350 if (wpa_s->driver->update_ft_ies)
351 return wpa_s->driver->update_ft_ies(wpa_s->drv_priv, md,
352 ies, ies_len);
353 return -1;
354}
355
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700356static inline int wpa_drv_sta_add(struct wpa_supplicant *wpa_s,
357 struct hostapd_sta_add_params *params)
358{
Sunil Raviaf8751c2023-03-29 11:35:17 -0700359 if (wpa_s->driver->sta_add) {
Sunil Ravi2a14cf12023-11-21 00:54:38 +0000360 /* Set link_id to -1 for non-TDLS peers */
361 if (!(params->flags & WPA_STA_TDLS_PEER))
362 params->mld_link_id = -1;
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700363 return wpa_s->driver->sta_add(wpa_s->drv_priv, params);
Sunil Raviaf8751c2023-03-29 11:35:17 -0700364 }
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700365 return -1;
366}
367
368static inline int wpa_drv_sta_remove(struct wpa_supplicant *wpa_s,
369 const u8 *addr)
370{
371 if (wpa_s->driver->sta_remove)
372 return wpa_s->driver->sta_remove(wpa_s->drv_priv, addr);
373 return -1;
374}
375
Hai Shalomfdcde762020-04-02 11:19:20 -0700376static inline int wpa_drv_tx_control_port(struct wpa_supplicant *wpa_s,
377 const u8 *dest, u16 proto,
378 const u8 *buf, size_t len,
379 int no_encrypt)
380{
381 if (!wpa_s->driver->tx_control_port)
382 return -1;
383 return wpa_s->driver->tx_control_port(wpa_s->drv_priv, dest, proto,
Sunil Ravi2a14cf12023-11-21 00:54:38 +0000384 buf, len, no_encrypt, -1);
Hai Shalomfdcde762020-04-02 11:19:20 -0700385}
386
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700387static inline int wpa_drv_hapd_send_eapol(struct wpa_supplicant *wpa_s,
388 const u8 *addr, const u8 *data,
389 size_t data_len, int encrypt,
390 const u8 *own_addr, u32 flags)
391{
392 if (wpa_s->driver->hapd_send_eapol)
393 return wpa_s->driver->hapd_send_eapol(wpa_s->drv_priv, addr,
394 data, data_len, encrypt,
Sunil Ravi2a14cf12023-11-21 00:54:38 +0000395 own_addr, flags, -1);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700396 return -1;
397}
398
399static inline int wpa_drv_sta_set_flags(struct wpa_supplicant *wpa_s,
400 const u8 *addr, int total_flags,
401 int flags_or, int flags_and)
402{
403 if (wpa_s->driver->sta_set_flags)
404 return wpa_s->driver->sta_set_flags(wpa_s->drv_priv, addr,
405 total_flags, flags_or,
406 flags_and);
407 return -1;
408}
409
410static inline int wpa_drv_set_supp_port(struct wpa_supplicant *wpa_s,
411 int authorized)
412{
413 if (wpa_s->driver->set_supp_port) {
414 return wpa_s->driver->set_supp_port(wpa_s->drv_priv,
415 authorized);
416 }
417 return 0;
418}
419
Sunil Ravi38ad1ed2023-01-17 23:58:31 +0000420int wpa_drv_send_action(struct wpa_supplicant *wpa_s, unsigned int freq,
421 unsigned int wait, const u8 *dst, const u8 *src,
422 const u8 *bssid, const u8 *data, size_t data_len,
423 int no_cck);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700424
425static inline void wpa_drv_send_action_cancel_wait(struct wpa_supplicant *wpa_s)
426{
427 if (wpa_s->driver->send_action_cancel_wait)
428 wpa_s->driver->send_action_cancel_wait(wpa_s->drv_priv);
429}
430
431static inline int wpa_drv_set_freq(struct wpa_supplicant *wpa_s,
432 struct hostapd_freq_params *freq)
433{
434 if (wpa_s->driver->set_freq)
435 return wpa_s->driver->set_freq(wpa_s->drv_priv, freq);
436 return -1;
437}
438
439static inline int wpa_drv_if_add(struct wpa_supplicant *wpa_s,
440 enum wpa_driver_if_type type,
441 const char *ifname, const u8 *addr,
442 void *bss_ctx, char *force_ifname,
443 u8 *if_addr, const char *bridge)
444{
445 if (wpa_s->driver->if_add)
446 return wpa_s->driver->if_add(wpa_s->drv_priv, type, ifname,
447 addr, bss_ctx, NULL, force_ifname,
Dmitry Shmidtd7ff03d2015-12-04 14:49:35 -0800448 if_addr, bridge, 0, 0);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700449 return -1;
450}
451
452static inline int wpa_drv_if_remove(struct wpa_supplicant *wpa_s,
453 enum wpa_driver_if_type type,
454 const char *ifname)
455{
456 if (wpa_s->driver->if_remove)
457 return wpa_s->driver->if_remove(wpa_s->drv_priv, type, ifname);
458 return -1;
459}
460
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700461static inline int wpa_drv_remain_on_channel(struct wpa_supplicant *wpa_s,
462 unsigned int freq,
463 unsigned int duration)
464{
465 if (wpa_s->driver->remain_on_channel)
466 return wpa_s->driver->remain_on_channel(wpa_s->drv_priv, freq,
467 duration);
468 return -1;
469}
470
471static inline int wpa_drv_cancel_remain_on_channel(
472 struct wpa_supplicant *wpa_s)
473{
474 if (wpa_s->driver->cancel_remain_on_channel)
475 return wpa_s->driver->cancel_remain_on_channel(
476 wpa_s->drv_priv);
477 return -1;
478}
479
480static inline int wpa_drv_probe_req_report(struct wpa_supplicant *wpa_s,
481 int report)
482{
483 if (wpa_s->driver->probe_req_report)
484 return wpa_s->driver->probe_req_report(wpa_s->drv_priv,
485 report);
486 return -1;
487}
488
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700489static inline int wpa_drv_deinit_ap(struct wpa_supplicant *wpa_s)
490{
491 if (wpa_s->driver->deinit_ap)
492 return wpa_s->driver->deinit_ap(wpa_s->drv_priv);
493 return 0;
494}
495
Dmitry Shmidt04949592012-07-19 12:16:46 -0700496static inline int wpa_drv_deinit_p2p_cli(struct wpa_supplicant *wpa_s)
497{
498 if (wpa_s->driver->deinit_p2p_cli)
499 return wpa_s->driver->deinit_p2p_cli(wpa_s->drv_priv);
500 return 0;
501}
502
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700503static inline void wpa_drv_suspend(struct wpa_supplicant *wpa_s)
504{
505 if (wpa_s->driver->suspend)
506 wpa_s->driver->suspend(wpa_s->drv_priv);
507}
508
509static inline void wpa_drv_resume(struct wpa_supplicant *wpa_s)
510{
511 if (wpa_s->driver->resume)
512 wpa_s->driver->resume(wpa_s->drv_priv);
513}
514
515static inline int wpa_drv_signal_monitor(struct wpa_supplicant *wpa_s,
516 int threshold, int hysteresis)
517{
518 if (wpa_s->driver->signal_monitor)
519 return wpa_s->driver->signal_monitor(wpa_s->drv_priv,
520 threshold, hysteresis);
521 return -1;
522}
523
Hai Shalomfdcde762020-04-02 11:19:20 -0700524int wpa_drv_signal_poll(struct wpa_supplicant *wpa_s,
525 struct wpa_signal_info *si);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700526
Sunil Ravi89eba102022-09-13 21:04:37 -0700527static inline int wpa_drv_mlo_signal_poll(struct wpa_supplicant *wpa_s,
528 struct wpa_mlo_signal_info *mlo_si)
529{
530 if (wpa_s->driver->mlo_signal_poll)
531 return wpa_s->driver->mlo_signal_poll(wpa_s->drv_priv, mlo_si);
532 return -1;
533}
534
Hai Shalom74f70d42019-02-11 14:42:39 -0800535static inline int wpa_drv_channel_info(struct wpa_supplicant *wpa_s,
536 struct wpa_channel_info *ci)
537{
538 if (wpa_s->driver->channel_info)
539 return wpa_s->driver->channel_info(wpa_s->drv_priv, ci);
540 return -1;
541}
542
Yuhao Zhengfcd6f212012-07-27 10:37:52 -0700543static inline int wpa_drv_pktcnt_poll(struct wpa_supplicant *wpa_s,
544 struct hostap_sta_driver_data *sta)
545{
546 if (wpa_s->driver->read_sta_data)
Jouni Malinen1e6c57f2012-09-05 17:07:03 +0300547 return wpa_s->driver->read_sta_data(wpa_s->drv_priv, sta,
548 wpa_s->bssid);
Yuhao Zhengfcd6f212012-07-27 10:37:52 -0700549 return -1;
550}
551
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700552static inline int wpa_drv_set_ap_wps_ie(struct wpa_supplicant *wpa_s,
553 const struct wpabuf *beacon,
554 const struct wpabuf *proberesp,
555 const struct wpabuf *assocresp)
556{
557 if (!wpa_s->driver->set_ap_wps_ie)
558 return -1;
559 return wpa_s->driver->set_ap_wps_ie(wpa_s->drv_priv, beacon,
560 proberesp, assocresp);
561}
562
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700563static inline int wpa_drv_get_noa(struct wpa_supplicant *wpa_s,
564 u8 *buf, size_t buf_len)
565{
566 if (!wpa_s->driver->get_noa)
567 return -1;
568 return wpa_s->driver->get_noa(wpa_s->drv_priv, buf, buf_len);
569}
570
571static inline int wpa_drv_set_p2p_powersave(struct wpa_supplicant *wpa_s,
572 int legacy_ps, int opp_ps,
573 int ctwindow)
574{
575 if (!wpa_s->driver->set_p2p_powersave)
576 return -1;
577 return wpa_s->driver->set_p2p_powersave(wpa_s->drv_priv, legacy_ps,
578 opp_ps, ctwindow);
579}
580
581static inline int wpa_drv_ampdu(struct wpa_supplicant *wpa_s, int ampdu)
582{
583 if (!wpa_s->driver->ampdu)
584 return -1;
585 return wpa_s->driver->ampdu(wpa_s->drv_priv, ampdu);
586}
587
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700588static inline int wpa_drv_send_tdls_mgmt(struct wpa_supplicant *wpa_s,
589 const u8 *dst, u8 action_code,
590 u8 dialog_token, u16 status_code,
Dmitry Shmidt9ead16e2014-10-07 13:15:23 -0700591 u32 peer_capab, int initiator,
Sunil Ravi2a14cf12023-11-21 00:54:38 +0000592 const u8 *buf, size_t len, int link_id)
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700593{
594 if (wpa_s->driver->send_tdls_mgmt) {
595 return wpa_s->driver->send_tdls_mgmt(wpa_s->drv_priv, dst,
596 action_code, dialog_token,
Dmitry Shmidtdf5a7e42014-04-02 12:59:59 -0700597 status_code, peer_capab,
Sunil Ravi2a14cf12023-11-21 00:54:38 +0000598 initiator, buf, len,
599 link_id);
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -0700600 }
601 return -1;
602}
603
604static inline int wpa_drv_tdls_oper(struct wpa_supplicant *wpa_s,
605 enum tdls_oper oper, const u8 *peer)
606{
607 if (!wpa_s->driver->tdls_oper)
608 return -1;
609 return wpa_s->driver->tdls_oper(wpa_s->drv_priv, oper, peer);
610}
611
Dmitry Shmidt1f69aa52012-01-24 16:10:04 -0800612#ifdef ANDROID
Dmitry Shmidtbd567ad2011-05-09 14:17:09 -0700613static inline int wpa_drv_driver_cmd(struct wpa_supplicant *wpa_s,
614 char *cmd, char *buf, size_t buf_len)
615{
616 if (!wpa_s->driver->driver_cmd)
617 return -1;
618 return wpa_s->driver->driver_cmd(wpa_s->drv_priv, cmd, buf, buf_len);
619}
Dmitry Shmidt292b0c32013-11-22 12:54:42 -0800620#endif /* ANDROID */
Dmitry Shmidtbd567ad2011-05-09 14:17:09 -0700621
Dmitry Shmidt1f69aa52012-01-24 16:10:04 -0800622static inline void wpa_drv_set_rekey_info(struct wpa_supplicant *wpa_s,
Dmitry Shmidt807291d2015-01-27 13:40:23 -0800623 const u8 *kek, size_t kek_len,
624 const u8 *kck, size_t kck_len,
Dmitry Shmidt1f69aa52012-01-24 16:10:04 -0800625 const u8 *replay_ctr)
626{
627 if (!wpa_s->driver->set_rekey_info)
628 return;
Dmitry Shmidt807291d2015-01-27 13:40:23 -0800629 wpa_s->driver->set_rekey_info(wpa_s->drv_priv, kek, kek_len,
630 kck, kck_len, replay_ctr);
Dmitry Shmidt1f69aa52012-01-24 16:10:04 -0800631}
632
Dmitry Shmidt04949592012-07-19 12:16:46 -0700633static inline int wpa_drv_radio_disable(struct wpa_supplicant *wpa_s,
634 int disabled)
635{
636 if (!wpa_s->driver->radio_disable)
637 return -1;
638 return wpa_s->driver->radio_disable(wpa_s->drv_priv, disabled);
639}
640
Dmitry Shmidtc5ec7f52012-03-06 16:33:24 -0800641static inline int wpa_drv_switch_channel(struct wpa_supplicant *wpa_s,
Dmitry Shmidte0e48dc2013-11-18 12:00:06 -0800642 struct csa_settings *settings)
Dmitry Shmidt1f69aa52012-01-24 16:10:04 -0800643{
Dmitry Shmidtc5ec7f52012-03-06 16:33:24 -0800644 if (!wpa_s->driver->switch_channel)
Dmitry Shmidt1f69aa52012-01-24 16:10:04 -0800645 return -1;
Dmitry Shmidte0e48dc2013-11-18 12:00:06 -0800646 return wpa_s->driver->switch_channel(wpa_s->drv_priv, settings);
Dmitry Shmidt1f69aa52012-01-24 16:10:04 -0800647}
Dmitry Shmidt04949592012-07-19 12:16:46 -0700648
Dmitry Shmidt6c0da2b2015-01-05 13:08:17 -0800649static inline int wpa_drv_add_ts(struct wpa_supplicant *wpa_s, u8 tsid,
650 const u8 *address, u8 user_priority,
651 u16 admitted_time)
652{
653 if (!wpa_s->driver->add_tx_ts)
654 return -1;
655 return wpa_s->driver->add_tx_ts(wpa_s->drv_priv, tsid, address,
656 user_priority, admitted_time);
657}
658
659static inline int wpa_drv_del_ts(struct wpa_supplicant *wpa_s, u8 tid,
660 const u8 *address)
661{
662 if (!wpa_s->driver->del_tx_ts)
663 return -1;
664 return wpa_s->driver->del_tx_ts(wpa_s->drv_priv, tid, address);
665}
666
667static inline int wpa_drv_tdls_enable_channel_switch(
668 struct wpa_supplicant *wpa_s, const u8 *addr, u8 oper_class,
669 const struct hostapd_freq_params *freq_params)
670{
671 if (!wpa_s->driver->tdls_enable_channel_switch)
672 return -1;
673 return wpa_s->driver->tdls_enable_channel_switch(wpa_s->drv_priv, addr,
674 oper_class,
675 freq_params);
676}
677
678static inline int
679wpa_drv_tdls_disable_channel_switch(struct wpa_supplicant *wpa_s,
680 const u8 *addr)
681{
682 if (!wpa_s->driver->tdls_disable_channel_switch)
683 return -1;
684 return wpa_s->driver->tdls_disable_channel_switch(wpa_s->drv_priv,
685 addr);
686}
687
Dmitry Shmidt61d9df32012-08-29 16:22:06 -0700688static inline int wpa_drv_wnm_oper(struct wpa_supplicant *wpa_s,
689 enum wnm_oper oper, const u8 *peer,
690 u8 *buf, u16 *buf_len)
691{
692 if (!wpa_s->driver->wnm_oper)
693 return -1;
694 return wpa_s->driver->wnm_oper(wpa_s->drv_priv, oper, peer, buf,
695 buf_len);
696}
697
Dmitry Shmidt56052862013-10-04 10:23:25 -0700698static inline int wpa_drv_status(struct wpa_supplicant *wpa_s,
699 char *buf, size_t buflen)
700{
701 if (!wpa_s->driver->status)
702 return -1;
703 return wpa_s->driver->status(wpa_s->drv_priv, buf, buflen);
704}
705
Dmitry Shmidt051af732013-10-22 13:52:46 -0700706static inline int wpa_drv_set_qos_map(struct wpa_supplicant *wpa_s,
707 const u8 *qos_map_set, u8 qos_map_set_len)
708{
709 if (!wpa_s->driver->set_qos_map)
710 return -1;
711 return wpa_s->driver->set_qos_map(wpa_s->drv_priv, qos_map_set,
712 qos_map_set_len);
713}
714
Hai Shalomfdcde762020-04-02 11:19:20 -0700715static inline int wpa_drv_get_wowlan(struct wpa_supplicant *wpa_s)
716{
717 if (!wpa_s->driver->get_wowlan)
718 return 0;
719 return wpa_s->driver->get_wowlan(wpa_s->drv_priv);
720}
721
Dmitry Shmidtb58836e2014-04-29 14:35:56 -0700722static inline int wpa_drv_wowlan(struct wpa_supplicant *wpa_s,
723 const struct wowlan_triggers *triggers)
724{
725 if (!wpa_s->driver->set_wowlan)
726 return -1;
727 return wpa_s->driver->set_wowlan(wpa_s->drv_priv, triggers);
728}
729
Dmitry Shmidta38abf92014-03-06 13:38:44 -0800730static inline int wpa_drv_vendor_cmd(struct wpa_supplicant *wpa_s,
731 int vendor_id, int subcmd, const u8 *data,
Hai Shalom60840252021-02-19 19:02:11 -0800732 size_t data_len,
733 enum nested_attr nested_attr_flag,
734 struct wpabuf *buf)
Dmitry Shmidta38abf92014-03-06 13:38:44 -0800735{
736 if (!wpa_s->driver->vendor_cmd)
737 return -1;
738 return wpa_s->driver->vendor_cmd(wpa_s->drv_priv, vendor_id, subcmd,
Hai Shalom60840252021-02-19 19:02:11 -0800739 data, data_len, nested_attr_flag, buf);
Dmitry Shmidta38abf92014-03-06 13:38:44 -0800740}
741
Dmitry Shmidt661b4f72014-09-29 14:58:27 -0700742static inline int wpa_drv_roaming(struct wpa_supplicant *wpa_s, int allowed,
743 const u8 *bssid)
744{
745 if (!wpa_s->driver->roaming)
746 return -1;
747 return wpa_s->driver->roaming(wpa_s->drv_priv, allowed, bssid);
748}
749
Roshan Pius3a1667e2018-07-03 15:17:14 -0700750static inline int wpa_drv_disable_fils(struct wpa_supplicant *wpa_s,
751 int disable)
752{
753 if (!wpa_s->driver->disable_fils)
754 return -1;
755 return wpa_s->driver->disable_fils(wpa_s->drv_priv, disable);
756}
757
Dmitry Shmidt661b4f72014-09-29 14:58:27 -0700758static inline int wpa_drv_set_mac_addr(struct wpa_supplicant *wpa_s,
759 const u8 *addr)
760{
761 if (!wpa_s->driver->set_mac_addr)
762 return -1;
763 return wpa_s->driver->set_mac_addr(wpa_s->drv_priv, addr);
764}
765
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700766
767#ifdef CONFIG_MACSEC
768
769static inline int wpa_drv_macsec_init(struct wpa_supplicant *wpa_s,
770 struct macsec_init_params *params)
771{
772 if (!wpa_s->driver->macsec_init)
773 return -1;
774 return wpa_s->driver->macsec_init(wpa_s->drv_priv, params);
775}
776
777static inline int wpa_drv_macsec_deinit(struct wpa_supplicant *wpa_s)
778{
779 if (!wpa_s->driver->macsec_deinit)
780 return -1;
781 return wpa_s->driver->macsec_deinit(wpa_s->drv_priv);
782}
783
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800784static inline int wpa_drv_macsec_get_capability(struct wpa_supplicant *wpa_s,
785 enum macsec_cap *cap)
786{
787 if (!wpa_s->driver->macsec_get_capability)
788 return -1;
789 return wpa_s->driver->macsec_get_capability(wpa_s->drv_priv, cap);
790}
791
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700792static inline int wpa_drv_enable_protect_frames(struct wpa_supplicant *wpa_s,
Hai Shalome21d4e82020-04-29 16:34:06 -0700793 bool enabled)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700794{
795 if (!wpa_s->driver->enable_protect_frames)
796 return -1;
797 return wpa_s->driver->enable_protect_frames(wpa_s->drv_priv, enabled);
798}
799
Dmitry Shmidtabb90a32016-12-05 15:34:39 -0800800static inline int wpa_drv_enable_encrypt(struct wpa_supplicant *wpa_s,
Hai Shalome21d4e82020-04-29 16:34:06 -0700801 bool enabled)
Dmitry Shmidtabb90a32016-12-05 15:34:39 -0800802{
803 if (!wpa_s->driver->enable_encrypt)
804 return -1;
805 return wpa_s->driver->enable_encrypt(wpa_s->drv_priv, enabled);
806}
807
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700808static inline int wpa_drv_set_replay_protect(struct wpa_supplicant *wpa_s,
Hai Shalome21d4e82020-04-29 16:34:06 -0700809 bool enabled, u32 window)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700810{
811 if (!wpa_s->driver->set_replay_protect)
812 return -1;
813 return wpa_s->driver->set_replay_protect(wpa_s->drv_priv, enabled,
814 window);
815}
816
Sunil Raviaf8751c2023-03-29 11:35:17 -0700817static inline int wpa_drv_set_offload(struct wpa_supplicant *wpa_s, u8 offload)
818{
819 if (!wpa_s->driver->set_offload)
820 return -1;
821 return wpa_s->driver->set_offload(wpa_s->drv_priv, offload);
822
823}
824
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700825static inline int wpa_drv_set_current_cipher_suite(struct wpa_supplicant *wpa_s,
Dmitry Shmidt7d175302016-09-06 13:11:34 -0700826 u64 cs)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700827{
828 if (!wpa_s->driver->set_current_cipher_suite)
829 return -1;
Dmitry Shmidt7d175302016-09-06 13:11:34 -0700830 return wpa_s->driver->set_current_cipher_suite(wpa_s->drv_priv, cs);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700831}
832
833static inline int wpa_drv_enable_controlled_port(struct wpa_supplicant *wpa_s,
Hai Shalome21d4e82020-04-29 16:34:06 -0700834 bool enabled)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700835{
836 if (!wpa_s->driver->enable_controlled_port)
837 return -1;
838 return wpa_s->driver->enable_controlled_port(wpa_s->drv_priv, enabled);
839}
840
841static inline int wpa_drv_get_receive_lowest_pn(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800842 struct receive_sa *sa)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700843{
844 if (!wpa_s->driver->get_receive_lowest_pn)
845 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800846 return wpa_s->driver->get_receive_lowest_pn(wpa_s->drv_priv, sa);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700847}
848
849static inline int wpa_drv_get_transmit_next_pn(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800850 struct transmit_sa *sa)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700851{
852 if (!wpa_s->driver->get_transmit_next_pn)
853 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800854 return wpa_s->driver->get_transmit_next_pn(wpa_s->drv_priv, sa);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700855}
856
857static inline int wpa_drv_set_transmit_next_pn(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800858 struct transmit_sa *sa)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700859{
860 if (!wpa_s->driver->set_transmit_next_pn)
861 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800862 return wpa_s->driver->set_transmit_next_pn(wpa_s->drv_priv, sa);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700863}
864
Hai Shalom74f70d42019-02-11 14:42:39 -0800865static inline int wpa_drv_set_receive_lowest_pn(struct wpa_supplicant *wpa_s,
866 struct receive_sa *sa)
867{
868 if (!wpa_s->driver->set_receive_lowest_pn)
869 return -1;
870 return wpa_s->driver->set_receive_lowest_pn(wpa_s->drv_priv, sa);
871}
872
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700873static inline int
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800874wpa_drv_create_receive_sc(struct wpa_supplicant *wpa_s, struct receive_sc *sc,
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700875 unsigned int conf_offset, int validation)
876{
877 if (!wpa_s->driver->create_receive_sc)
878 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800879 return wpa_s->driver->create_receive_sc(wpa_s->drv_priv, sc,
880 conf_offset, validation);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700881}
882
883static inline int wpa_drv_delete_receive_sc(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800884 struct receive_sc *sc)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700885{
886 if (!wpa_s->driver->delete_receive_sc)
887 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800888 return wpa_s->driver->delete_receive_sc(wpa_s->drv_priv, sc);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700889}
890
891static inline int wpa_drv_create_receive_sa(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800892 struct receive_sa *sa)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700893{
894 if (!wpa_s->driver->create_receive_sa)
895 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800896 return wpa_s->driver->create_receive_sa(wpa_s->drv_priv, sa);
897}
898
899static inline int wpa_drv_delete_receive_sa(struct wpa_supplicant *wpa_s,
900 struct receive_sa *sa)
901{
902 if (!wpa_s->driver->delete_receive_sa)
903 return -1;
904 return wpa_s->driver->delete_receive_sa(wpa_s->drv_priv, sa);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700905}
906
907static inline int wpa_drv_enable_receive_sa(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800908 struct receive_sa *sa)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700909{
910 if (!wpa_s->driver->enable_receive_sa)
911 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800912 return wpa_s->driver->enable_receive_sa(wpa_s->drv_priv, sa);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700913}
914
915static inline int wpa_drv_disable_receive_sa(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800916 struct receive_sa *sa)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700917{
918 if (!wpa_s->driver->disable_receive_sa)
919 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800920 return wpa_s->driver->disable_receive_sa(wpa_s->drv_priv, sa);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700921}
922
923static inline int
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800924wpa_drv_create_transmit_sc(struct wpa_supplicant *wpa_s, struct transmit_sc *sc,
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700925 unsigned int conf_offset)
926{
927 if (!wpa_s->driver->create_transmit_sc)
928 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800929 return wpa_s->driver->create_transmit_sc(wpa_s->drv_priv, sc,
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700930 conf_offset);
931}
932
933static inline int wpa_drv_delete_transmit_sc(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800934 struct transmit_sc *sc)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700935{
936 if (!wpa_s->driver->delete_transmit_sc)
937 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800938 return wpa_s->driver->delete_transmit_sc(wpa_s->drv_priv, sc);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700939}
940
941static inline int wpa_drv_create_transmit_sa(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800942 struct transmit_sa *sa)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700943{
944 if (!wpa_s->driver->create_transmit_sa)
945 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800946 return wpa_s->driver->create_transmit_sa(wpa_s->drv_priv, sa);
947}
948
949static inline int wpa_drv_delete_transmit_sa(struct wpa_supplicant *wpa_s,
950 struct transmit_sa *sa)
951{
952 if (!wpa_s->driver->delete_transmit_sa)
953 return -1;
954 return wpa_s->driver->delete_transmit_sa(wpa_s->drv_priv, sa);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700955}
956
957static inline int wpa_drv_enable_transmit_sa(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800958 struct transmit_sa *sa)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700959{
960 if (!wpa_s->driver->enable_transmit_sa)
961 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800962 return wpa_s->driver->enable_transmit_sa(wpa_s->drv_priv, sa);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700963}
964
965static inline int wpa_drv_disable_transmit_sa(struct wpa_supplicant *wpa_s,
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800966 struct transmit_sa *sa)
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700967{
968 if (!wpa_s->driver->disable_transmit_sa)
969 return -1;
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -0800970 return wpa_s->driver->disable_transmit_sa(wpa_s->drv_priv, sa);
Dmitry Shmidt5a1480c2014-05-12 09:46:02 -0700971}
972#endif /* CONFIG_MACSEC */
973
Ravi Joshie6ccb162015-07-16 17:45:41 -0700974static inline int wpa_drv_setband(struct wpa_supplicant *wpa_s,
Hai Shalom60840252021-02-19 19:02:11 -0800975 u32 band_mask)
Ravi Joshie6ccb162015-07-16 17:45:41 -0700976{
977 if (!wpa_s->driver->set_band)
978 return -1;
Hai Shalom60840252021-02-19 19:02:11 -0800979 return wpa_s->driver->set_band(wpa_s->drv_priv, band_mask);
Ravi Joshie6ccb162015-07-16 17:45:41 -0700980}
981
Dmitry Shmidtd80a4012015-11-05 16:35:40 -0800982static inline int wpa_drv_get_pref_freq_list(struct wpa_supplicant *wpa_s,
983 enum wpa_driver_if_type if_type,
984 unsigned int *num,
Sunil8cd6f4d2022-06-28 18:40:46 +0000985 struct weighted_pcl *freq_list)
Dmitry Shmidtd80a4012015-11-05 16:35:40 -0800986{
Dmitry Shmidtebd93af2017-02-21 13:40:44 -0800987#ifdef CONFIG_TESTING_OPTIONS
988 if (wpa_s->get_pref_freq_list_override)
989 return wpas_ctrl_iface_get_pref_freq_list_override(
990 wpa_s, if_type, num, freq_list);
991#endif /* CONFIG_TESTING_OPTIONS */
Dmitry Shmidtd80a4012015-11-05 16:35:40 -0800992 if (!wpa_s->driver->get_pref_freq_list)
993 return -1;
994 return wpa_s->driver->get_pref_freq_list(wpa_s->drv_priv, if_type,
995 num, freq_list);
996}
997
998static inline int wpa_drv_set_prob_oper_freq(struct wpa_supplicant *wpa_s,
999 unsigned int freq)
1000{
1001 if (!wpa_s->driver->set_prob_oper_freq)
1002 return 0;
1003 return wpa_s->driver->set_prob_oper_freq(wpa_s->drv_priv, freq);
1004}
1005
Dmitry Shmidtabb90a32016-12-05 15:34:39 -08001006static inline int wpa_drv_abort_scan(struct wpa_supplicant *wpa_s,
1007 u64 scan_cookie)
Dmitry Shmidtd7ff03d2015-12-04 14:49:35 -08001008{
1009 if (!wpa_s->driver->abort_scan)
1010 return -1;
Dmitry Shmidtabb90a32016-12-05 15:34:39 -08001011 return wpa_s->driver->abort_scan(wpa_s->drv_priv, scan_cookie);
Dmitry Shmidtd7ff03d2015-12-04 14:49:35 -08001012}
1013
Dmitry Shmidt849734c2016-05-27 09:59:01 -07001014static inline int wpa_drv_configure_frame_filters(struct wpa_supplicant *wpa_s,
1015 u32 filters)
1016{
1017 if (!wpa_s->driver->configure_data_frame_filters)
1018 return -1;
1019 return wpa_s->driver->configure_data_frame_filters(wpa_s->drv_priv,
1020 filters);
1021}
1022
Dmitry Shmidtd5ab1b52016-06-21 12:38:41 -07001023static inline int wpa_drv_get_ext_capa(struct wpa_supplicant *wpa_s,
1024 enum wpa_driver_if_type type)
1025{
1026 if (!wpa_s->driver->get_ext_capab)
1027 return -1;
1028 return wpa_s->driver->get_ext_capab(wpa_s->drv_priv, type,
1029 &wpa_s->extended_capa,
1030 &wpa_s->extended_capa_mask,
1031 &wpa_s->extended_capa_len);
1032}
1033
Dmitry Shmidt58d12ad2016-07-28 10:07:03 -07001034static inline int wpa_drv_p2p_lo_start(struct wpa_supplicant *wpa_s,
1035 unsigned int channel,
1036 unsigned int period,
1037 unsigned int interval,
1038 unsigned int count,
1039 const u8 *device_types,
1040 size_t dev_types_len,
1041 const u8 *ies, size_t ies_len)
1042{
1043 if (!wpa_s->driver->p2p_lo_start)
1044 return -1;
1045 return wpa_s->driver->p2p_lo_start(wpa_s->drv_priv, channel, period,
1046 interval, count, device_types,
1047 dev_types_len, ies, ies_len);
1048}
1049
1050static inline int wpa_drv_p2p_lo_stop(struct wpa_supplicant *wpa_s)
1051{
1052 if (!wpa_s->driver->p2p_lo_stop)
1053 return -1;
1054 return wpa_s->driver->p2p_lo_stop(wpa_s->drv_priv);
1055}
1056
Dmitry Shmidt7f2c7532016-08-15 09:48:12 -07001057static inline int wpa_drv_set_default_scan_ies(struct wpa_supplicant *wpa_s,
1058 const u8 *ies, size_t len)
1059{
1060 if (!wpa_s->driver->set_default_scan_ies)
1061 return -1;
1062 return wpa_s->driver->set_default_scan_ies(wpa_s->drv_priv, ies, len);
1063}
1064
Dmitry Shmidt9839ecd2016-11-07 11:05:47 -08001065static inline int wpa_drv_set_tdls_mode(struct wpa_supplicant *wpa_s,
1066 int tdls_external_control)
1067{
1068 if (!wpa_s->driver->set_tdls_mode)
1069 return -1;
1070 return wpa_s->driver->set_tdls_mode(wpa_s->drv_priv,
1071 tdls_external_control);
1072}
1073
Dmitry Shmidtd2986c22017-10-23 14:22:09 -07001074static inline struct wpa_bss_candidate_info *
1075wpa_drv_get_bss_trans_status(struct wpa_supplicant *wpa_s,
1076 struct wpa_bss_trans_info *params)
1077{
1078 if (!wpa_s->driver->get_bss_transition_status)
1079 return NULL;
1080 return wpa_s->driver->get_bss_transition_status(wpa_s->drv_priv,
1081 params);
1082}
1083
1084static inline int wpa_drv_ignore_assoc_disallow(struct wpa_supplicant *wpa_s,
1085 int val)
1086{
1087 if (!wpa_s->driver->ignore_assoc_disallow)
1088 return -1;
1089 return wpa_s->driver->ignore_assoc_disallow(wpa_s->drv_priv, val);
1090}
1091
Hai Shalom899fcc72020-10-19 14:38:18 -07001092static inline int wpa_drv_set_bssid_tmp_disallow(struct wpa_supplicant *wpa_s,
1093 unsigned int num_bssid,
1094 const u8 *bssids)
Dmitry Shmidtd2986c22017-10-23 14:22:09 -07001095{
Hai Shalom899fcc72020-10-19 14:38:18 -07001096 if (!wpa_s->driver->set_bssid_tmp_disallow)
Dmitry Shmidtd2986c22017-10-23 14:22:09 -07001097 return -1;
Hai Shalom899fcc72020-10-19 14:38:18 -07001098 return wpa_s->driver->set_bssid_tmp_disallow(wpa_s->drv_priv, num_bssid,
1099 bssids);
Dmitry Shmidtd2986c22017-10-23 14:22:09 -07001100}
1101
1102static inline int wpa_drv_update_connect_params(
1103 struct wpa_supplicant *wpa_s,
1104 struct wpa_driver_associate_params *params,
1105 enum wpa_drv_update_connect_params_mask mask)
1106{
1107 if (!wpa_s->driver->update_connect_params)
1108 return -1;
Sunil Ravi2a14cf12023-11-21 00:54:38 +00001109
1110 if (params)
1111 params->freq.link_id = -1;
1112
Dmitry Shmidtd2986c22017-10-23 14:22:09 -07001113 return wpa_s->driver->update_connect_params(wpa_s->drv_priv, params,
1114 mask);
1115}
1116
Roshan Pius3a1667e2018-07-03 15:17:14 -07001117static inline int
1118wpa_drv_send_external_auth_status(struct wpa_supplicant *wpa_s,
1119 struct external_auth *params)
1120{
1121 if (!wpa_s->driver->send_external_auth_status)
1122 return -1;
1123 return wpa_s->driver->send_external_auth_status(wpa_s->drv_priv,
1124 params);
1125}
1126
Hai Shalom74f70d42019-02-11 14:42:39 -08001127static inline int wpa_drv_set_4addr_mode(struct wpa_supplicant *wpa_s, int val)
1128{
1129 if (!wpa_s->driver->set_4addr_mode)
1130 return -1;
1131 return wpa_s->driver->set_4addr_mode(wpa_s->drv_priv,
1132 wpa_s->bridge_ifname, val);
1133}
1134
Hai Shalome21d4e82020-04-29 16:34:06 -07001135static inline int wpa_drv_dpp_listen(struct wpa_supplicant *wpa_s, bool enable)
Hai Shalomb755a2a2020-04-23 21:49:02 -07001136{
1137 if (!wpa_s->driver->dpp_listen)
1138 return 0;
1139 return wpa_s->driver->dpp_listen(wpa_s->drv_priv, enable);
1140}
1141
Sunil Ravi89eba102022-09-13 21:04:37 -07001142static inline int wpa_drv_send_pasn_resp(struct wpa_supplicant *wpa_s,
1143 struct pasn_auth *params)
1144{
1145 if (!wpa_s->driver->send_pasn_resp)
1146 return -1;
1147 return wpa_s->driver->send_pasn_resp(wpa_s->drv_priv, params);
1148}
1149
1150static inline int wpa_drv_set_secure_ranging_ctx(struct wpa_supplicant *wpa_s,
1151 const u8 *own_addr,
1152 const u8 *peer_addr,
1153 u32 cipher, u8 tk_len,
1154 const u8 *tk,
1155 u8 ltf_keyseed_len,
1156 const u8 *ltf_keyseed,
1157 u32 action)
1158{
1159 struct secure_ranging_params params;
1160
Sunil Ravib0ac25f2024-07-12 01:42:03 +00001161 /* Configure secure ranging context only to the drivers that support it.
1162 */
Sunil Ravi89eba102022-09-13 21:04:37 -07001163 if (!wpa_s->driver->set_secure_ranging_ctx)
Sunil Ravib0ac25f2024-07-12 01:42:03 +00001164 return 0;
Sunil Ravi89eba102022-09-13 21:04:37 -07001165
1166 os_memset(&params, 0, sizeof(params));
1167 params.action = action;
1168 params.own_addr = own_addr;
1169 params.peer_addr = peer_addr;
1170 params.cipher = cipher;
1171 params.tk_len = tk_len;
1172 params.tk = tk;
1173 params.ltf_keyseed_len = ltf_keyseed_len;
1174 params.ltf_keyseed = ltf_keyseed;
1175
1176 return wpa_s->driver->set_secure_ranging_ctx(wpa_s->drv_priv, &params);
1177}
1178
1179static inline int
1180wpas_drv_get_sta_mlo_info(struct wpa_supplicant *wpa_s,
1181 struct driver_sta_mlo_info *mlo_info)
1182{
1183 if (!wpa_s->driver->get_sta_mlo_info)
1184 return 0;
1185
1186 return wpa_s->driver->get_sta_mlo_info(wpa_s->drv_priv, mlo_info);
1187}
1188
Sunil Ravic0f5d412024-09-11 22:12:49 +00001189static inline int
1190wpas_drv_nan_flush(struct wpa_supplicant *wpa_s)
1191{
1192 if (!wpa_s->driver->nan_flush)
1193 return 0;
1194
1195 return wpa_s->driver->nan_flush(wpa_s->drv_priv);
1196}
1197
1198static inline int
1199wpas_drv_nan_publish(struct wpa_supplicant *wpa_s, const u8 *addr,
1200 int publish_id, const char *service_name,
1201 const u8 *service_id,
1202 enum nan_service_protocol_type srv_proto_type,
1203 const struct wpabuf *ssi, const struct wpabuf *elems,
1204 struct nan_publish_params *params)
1205{
1206 if (!wpa_s->driver->nan_publish)
1207 return 0;
1208
1209 return wpa_s->driver->nan_publish(wpa_s->drv_priv, addr, publish_id,
1210 service_name, service_id,
1211 srv_proto_type, ssi, elems, params);
1212}
1213
1214static inline int
1215wpas_drv_nan_cancel_publish(struct wpa_supplicant *wpa_s, int publish_id)
1216{
1217 if (!wpa_s->driver->nan_cancel_publish)
1218 return 0;
1219
1220 return wpa_s->driver->nan_cancel_publish(wpa_s->drv_priv, publish_id);
1221}
1222
1223static inline int
1224wpas_drv_nan_update_publish(struct wpa_supplicant *wpa_s, int publish_id,
1225 const struct wpabuf *ssi)
1226{
1227 if (!wpa_s->driver->nan_update_publish)
1228 return 0;
1229
1230 return wpa_s->driver->nan_update_publish(wpa_s->drv_priv, publish_id,
1231 ssi);
1232}
1233
1234static inline int
1235wpas_drv_nan_subscribe(struct wpa_supplicant *wpa_s, const u8 *addr,
1236 int subscribe_id, const char *service_name,
1237 const u8 *service_id,
1238 enum nan_service_protocol_type srv_proto_type,
1239 const struct wpabuf *ssi, const struct wpabuf *elems,
1240 struct nan_subscribe_params *params)
1241{
1242 if (!wpa_s->driver->nan_subscribe)
1243 return 0;
1244
1245 return wpa_s->driver->nan_subscribe(wpa_s->drv_priv, addr, subscribe_id,
1246 service_name, service_id,
1247 srv_proto_type, ssi, elems, params);
1248}
1249
1250static inline int
1251wpas_drv_nan_cancel_subscribe(struct wpa_supplicant *wpa_s, int subscribe_id)
1252{
1253 if (!wpa_s->driver->nan_cancel_subscribe)
1254 return 0;
1255
1256 return wpa_s->driver->nan_cancel_subscribe(wpa_s->drv_priv,
1257 subscribe_id);
1258}
1259
Dmitry Shmidt8d520ff2011-05-09 14:06:53 -07001260#endif /* DRIVER_I_H */