2 * hostapd - Driver operations
3 * Copyright (c) 2009-2010, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
15 #include "utils/includes.h"
17 #include "utils/common.h"
18 #include "drivers/driver.h"
19 #include "common/ieee802_11_defs.h"
22 #include "ieee802_11.h"
24 #include "ap_config.h"
25 #include "p2p_hostapd.h"
26 #include "ap_drv_ops.h"
29 static int hostapd_sta_flags_to_drv(int flags)
32 if (flags & WLAN_STA_AUTHORIZED)
33 res |= WPA_STA_AUTHORIZED;
34 if (flags & WLAN_STA_WMM)
36 if (flags & WLAN_STA_SHORT_PREAMBLE)
37 res |= WPA_STA_SHORT_PREAMBLE;
38 if (flags & WLAN_STA_MFP)
44 static int hostapd_set_ap_wps_ie(struct hostapd_data *hapd)
46 struct wpabuf *beacon, *proberesp, *assocresp = NULL;
49 if (hapd->driver == NULL || hapd->driver->set_ap_wps_ie == NULL)
52 beacon = hapd->wps_beacon_ie;
53 proberesp = hapd->wps_probe_resp_ie;
56 if (hapd->wps_beacon_ie == NULL && hapd->p2p_beacon_ie == NULL)
59 beacon = wpabuf_alloc((hapd->wps_beacon_ie ?
60 wpabuf_len(hapd->wps_beacon_ie) : 0) +
61 (hapd->p2p_beacon_ie ?
62 wpabuf_len(hapd->p2p_beacon_ie) : 0));
65 if (hapd->wps_beacon_ie)
66 wpabuf_put_buf(beacon, hapd->wps_beacon_ie);
67 if (hapd->p2p_beacon_ie)
68 wpabuf_put_buf(beacon, hapd->p2p_beacon_ie);
71 if (hapd->wps_probe_resp_ie == NULL && hapd->p2p_probe_resp_ie == NULL)
74 proberesp = wpabuf_alloc(
75 (hapd->wps_probe_resp_ie ?
76 wpabuf_len(hapd->wps_probe_resp_ie) : 0) +
77 (hapd->p2p_probe_resp_ie ?
78 wpabuf_len(hapd->p2p_probe_resp_ie) : 0));
79 if (proberesp == NULL) {
83 if (hapd->wps_probe_resp_ie)
84 wpabuf_put_buf(proberesp, hapd->wps_probe_resp_ie);
85 if (hapd->p2p_probe_resp_ie)
86 wpabuf_put_buf(proberesp, hapd->p2p_probe_resp_ie);
88 #endif /* CONFIG_P2P */
90 #ifdef CONFIG_P2P_MANAGER
91 if (hapd->conf->p2p & P2P_MANAGE) {
94 a = wpabuf_alloc(100 + (beacon ? wpabuf_len(beacon) : 0));
98 wpabuf_put_buf(a, beacon);
99 if (beacon != hapd->wps_beacon_ie)
101 start = wpabuf_put(a, 0);
102 p = hostapd_eid_p2p_manage(hapd, start);
103 wpabuf_put(a, p - start);
107 a = wpabuf_alloc(100 + (proberesp ? wpabuf_len(proberesp) :
112 wpabuf_put_buf(a, proberesp);
113 if (proberesp != hapd->wps_probe_resp_ie)
114 wpabuf_free(proberesp);
115 start = wpabuf_put(a, 0);
116 p = hostapd_eid_p2p_manage(hapd, start);
117 wpabuf_put(a, p - start);
121 #endif /* CONFIG_P2P_MANAGER */
124 if (hapd->conf->wps_state)
125 assocresp = wps_build_assoc_resp_ie();
126 #endif /* CONFIG_WPS2 */
128 #ifdef CONFIG_P2P_MANAGER
129 if (hapd->conf->p2p & P2P_MANAGE) {
131 a = wpabuf_alloc(100 + (assocresp ? wpabuf_len(assocresp) :
135 start = wpabuf_put(a, 0);
136 p = hostapd_eid_p2p_manage(hapd, start);
137 wpabuf_put(a, p - start);
139 wpabuf_put_buf(a, assocresp);
140 wpabuf_free(assocresp);
145 #endif /* CONFIG_P2P_MANAGER */
147 ret = hapd->driver->set_ap_wps_ie(hapd->drv_priv, beacon, proberesp,
150 if (beacon != hapd->wps_beacon_ie)
152 if (proberesp != hapd->wps_probe_resp_ie)
153 wpabuf_free(proberesp);
154 wpabuf_free(assocresp);
160 static int hostapd_send_mgmt_frame(struct hostapd_data *hapd, const void *msg,
163 if (hapd->driver == NULL || hapd->driver->send_mlme == NULL)
165 return hapd->driver->send_mlme(hapd->drv_priv, msg, len);
169 static int hostapd_send_eapol(struct hostapd_data *hapd, const u8 *addr,
170 const u8 *data, size_t data_len, int encrypt)
172 if (hapd->driver == NULL || hapd->driver->hapd_send_eapol == NULL)
174 return hapd->driver->hapd_send_eapol(hapd->drv_priv, addr, data,
180 static int hostapd_set_authorized(struct hostapd_data *hapd,
181 struct sta_info *sta, int authorized)
184 return hostapd_sta_set_flags(hapd, sta->addr,
185 hostapd_sta_flags_to_drv(
187 WPA_STA_AUTHORIZED, ~0);
190 return hostapd_sta_set_flags(hapd, sta->addr,
191 hostapd_sta_flags_to_drv(sta->flags),
192 0, ~WPA_STA_AUTHORIZED);
196 static int hostapd_set_key(const char *ifname, struct hostapd_data *hapd,
197 enum wpa_alg alg, const u8 *addr, int key_idx,
198 int set_tx, const u8 *seq, size_t seq_len,
199 const u8 *key, size_t key_len)
201 if (hapd->driver == NULL || hapd->driver->set_key == NULL)
203 return hapd->driver->set_key(ifname, hapd->drv_priv, alg, addr,
204 key_idx, set_tx, seq, seq_len, key,
209 static int hostapd_read_sta_data(struct hostapd_data *hapd,
210 struct hostap_sta_driver_data *data,
213 if (hapd->driver == NULL || hapd->driver->read_sta_data == NULL)
215 return hapd->driver->read_sta_data(hapd->drv_priv, data, addr);
219 static int hostapd_sta_clear_stats(struct hostapd_data *hapd, const u8 *addr)
221 if (hapd->driver == NULL || hapd->driver->sta_clear_stats == NULL)
223 return hapd->driver->sta_clear_stats(hapd->drv_priv, addr);
227 static int hostapd_set_sta_flags(struct hostapd_data *hapd,
228 struct sta_info *sta)
230 int set_flags, total_flags, flags_and, flags_or;
231 total_flags = hostapd_sta_flags_to_drv(sta->flags);
232 set_flags = WPA_STA_SHORT_PREAMBLE | WPA_STA_WMM | WPA_STA_MFP;
233 if (((!hapd->conf->ieee802_1x && !hapd->conf->wpa) ||
234 sta->auth_alg == WLAN_AUTH_FT) &&
235 sta->flags & WLAN_STA_AUTHORIZED)
236 set_flags |= WPA_STA_AUTHORIZED;
237 flags_or = total_flags & set_flags;
238 flags_and = total_flags | ~set_flags;
239 return hostapd_sta_set_flags(hapd, sta->addr, total_flags,
240 flags_or, flags_and);
244 static int hostapd_set_drv_ieee8021x(struct hostapd_data *hapd,
245 const char *ifname, int enabled)
247 struct wpa_bss_params params;
248 os_memset(¶ms, 0, sizeof(params));
249 params.ifname = ifname;
250 params.enabled = enabled;
252 params.wpa = hapd->conf->wpa;
253 params.ieee802_1x = hapd->conf->ieee802_1x;
254 params.wpa_group = hapd->conf->wpa_group;
255 params.wpa_pairwise = hapd->conf->wpa_pairwise;
256 params.wpa_key_mgmt = hapd->conf->wpa_key_mgmt;
257 params.rsn_preauth = hapd->conf->rsn_preauth;
259 return hostapd_set_ieee8021x(hapd, ¶ms);
263 static int hostapd_set_radius_acl_auth(struct hostapd_data *hapd,
264 const u8 *mac, int accepted,
267 if (hapd->driver == NULL || hapd->driver->set_radius_acl_auth == NULL)
269 return hapd->driver->set_radius_acl_auth(hapd->drv_priv, mac, accepted,
274 static int hostapd_set_radius_acl_expire(struct hostapd_data *hapd,
277 if (hapd->driver == NULL ||
278 hapd->driver->set_radius_acl_expire == NULL)
280 return hapd->driver->set_radius_acl_expire(hapd->drv_priv, mac);
284 static int hostapd_set_bss_params(struct hostapd_data *hapd,
289 #ifdef CONFIG_IEEE80211N
290 u8 buf[60], *ht_capab, *ht_oper, *pos;
294 pos = hostapd_eid_ht_capabilities(hapd, pos);
296 pos = hostapd_eid_ht_operation(hapd, pos);
297 if (pos > ht_oper && ht_oper > ht_capab &&
298 hostapd_set_ht_params(hapd, ht_capab + 2, ht_capab[1],
299 ht_oper + 2, ht_oper[1])) {
300 wpa_printf(MSG_ERROR, "Could not set HT capabilities "
301 "for kernel driver");
305 #endif /* CONFIG_IEEE80211N */
307 if (hostapd_set_cts_protect(hapd, use_protection)) {
308 wpa_printf(MSG_ERROR, "Failed to set CTS protect in kernel "
313 if (hapd->iface->current_mode &&
314 hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G &&
315 hostapd_set_short_slot_time(hapd,
316 hapd->iface->num_sta_no_short_slot_time
318 wpa_printf(MSG_ERROR, "Failed to set Short Slot Time option "
323 if (hapd->iface->num_sta_no_short_preamble == 0 &&
324 hapd->iconf->preamble == SHORT_PREAMBLE)
325 preamble = SHORT_PREAMBLE;
327 preamble = LONG_PREAMBLE;
328 if (hostapd_set_preamble(hapd, preamble)) {
329 wpa_printf(MSG_ERROR, "Could not set preamble for kernel "
338 static int hostapd_set_beacon(struct hostapd_data *hapd,
339 const u8 *head, size_t head_len,
340 const u8 *tail, size_t tail_len, int dtim_period,
343 if (hapd->driver == NULL || hapd->driver->set_beacon == NULL)
345 return hapd->driver->set_beacon(hapd->drv_priv,
346 head, head_len, tail, tail_len,
347 dtim_period, beacon_int);
351 static int hostapd_vlan_if_add(struct hostapd_data *hapd, const char *ifname)
353 char force_ifname[IFNAMSIZ];
354 u8 if_addr[ETH_ALEN];
355 return hostapd_if_add(hapd, WPA_IF_AP_VLAN, ifname, NULL, NULL, NULL,
356 force_ifname, if_addr);
359 static int hostapd_vlan_if_remove(struct hostapd_data *hapd,
362 return hostapd_if_remove(hapd, WPA_IF_AP_VLAN, ifname);
366 static int hostapd_set_wds_sta(struct hostapd_data *hapd, const u8 *addr,
369 if (hapd->driver == NULL || hapd->driver->set_wds_sta == NULL)
371 return hapd->driver->set_wds_sta(hapd->drv_priv, addr, aid, val);
375 static int hostapd_set_sta_vlan(const char *ifname, struct hostapd_data *hapd,
376 const u8 *addr, int vlan_id)
378 if (hapd->driver == NULL || hapd->driver->set_sta_vlan == NULL)
380 return hapd->driver->set_sta_vlan(hapd->drv_priv, addr, ifname,
385 static int hostapd_get_inact_sec(struct hostapd_data *hapd, const u8 *addr)
387 if (hapd->driver == NULL || hapd->driver->get_inact_sec == NULL)
389 return hapd->driver->get_inact_sec(hapd->drv_priv, addr);
393 static int hostapd_sta_deauth(struct hostapd_data *hapd, const u8 *addr,
396 if (hapd->driver == NULL || hapd->driver->sta_deauth == NULL)
398 return hapd->driver->sta_deauth(hapd->drv_priv, hapd->own_addr, addr,
403 static int hostapd_sta_disassoc(struct hostapd_data *hapd, const u8 *addr,
406 if (hapd->driver == NULL || hapd->driver->sta_disassoc == NULL)
408 return hapd->driver->sta_disassoc(hapd->drv_priv, hapd->own_addr, addr,
413 static int hostapd_sta_add(struct hostapd_data *hapd,
414 const u8 *addr, u16 aid, u16 capability,
415 const u8 *supp_rates, size_t supp_rates_len,
417 const struct ieee80211_ht_capabilities *ht_capab)
419 struct hostapd_sta_add_params params;
421 if (hapd->driver == NULL)
423 if (hapd->driver->sta_add == NULL)
426 os_memset(¶ms, 0, sizeof(params));
429 params.capability = capability;
430 params.supp_rates = supp_rates;
431 params.supp_rates_len = supp_rates_len;
432 params.listen_interval = listen_interval;
433 params.ht_capabilities = ht_capab;
434 return hapd->driver->sta_add(hapd->drv_priv, ¶ms);
438 static int hostapd_sta_remove(struct hostapd_data *hapd, const u8 *addr)
440 if (hapd->driver == NULL || hapd->driver->sta_remove == NULL)
442 return hapd->driver->sta_remove(hapd->drv_priv, addr);
446 static int hostapd_set_countermeasures(struct hostapd_data *hapd, int enabled)
448 if (hapd->driver == NULL ||
449 hapd->driver->hapd_set_countermeasures == NULL)
451 return hapd->driver->hapd_set_countermeasures(hapd->drv_priv, enabled);
455 void hostapd_set_driver_ops(struct hostapd_driver_ops *ops)
457 ops->set_ap_wps_ie = hostapd_set_ap_wps_ie;
458 ops->send_mgmt_frame = hostapd_send_mgmt_frame;
459 ops->send_eapol = hostapd_send_eapol;
460 ops->set_authorized = hostapd_set_authorized;
461 ops->set_key = hostapd_set_key;
462 ops->read_sta_data = hostapd_read_sta_data;
463 ops->sta_clear_stats = hostapd_sta_clear_stats;
464 ops->set_sta_flags = hostapd_set_sta_flags;
465 ops->set_drv_ieee8021x = hostapd_set_drv_ieee8021x;
466 ops->set_radius_acl_auth = hostapd_set_radius_acl_auth;
467 ops->set_radius_acl_expire = hostapd_set_radius_acl_expire;
468 ops->set_bss_params = hostapd_set_bss_params;
469 ops->set_beacon = hostapd_set_beacon;
470 ops->vlan_if_add = hostapd_vlan_if_add;
471 ops->vlan_if_remove = hostapd_vlan_if_remove;
472 ops->set_wds_sta = hostapd_set_wds_sta;
473 ops->set_sta_vlan = hostapd_set_sta_vlan;
474 ops->get_inact_sec = hostapd_get_inact_sec;
475 ops->sta_deauth = hostapd_sta_deauth;
476 ops->sta_disassoc = hostapd_sta_disassoc;
477 ops->sta_add = hostapd_sta_add;
478 ops->sta_remove = hostapd_sta_remove;
479 ops->set_countermeasures = hostapd_set_countermeasures;
483 int hostapd_set_privacy(struct hostapd_data *hapd, int enabled)
485 if (hapd->driver == NULL || hapd->driver->set_privacy == NULL)
487 return hapd->driver->set_privacy(hapd->drv_priv, enabled);
491 int hostapd_set_generic_elem(struct hostapd_data *hapd, const u8 *elem,
494 if (hapd->driver == NULL || hapd->driver->set_generic_elem == NULL)
496 return hapd->driver->set_generic_elem(hapd->drv_priv, elem, elem_len);
500 int hostapd_get_ssid(struct hostapd_data *hapd, u8 *buf, size_t len)
502 if (hapd->driver == NULL || hapd->driver->hapd_get_ssid == NULL)
504 return hapd->driver->hapd_get_ssid(hapd->drv_priv, buf, len);
508 int hostapd_set_ssid(struct hostapd_data *hapd, const u8 *buf, size_t len)
510 if (hapd->driver == NULL || hapd->driver->hapd_set_ssid == NULL)
512 return hapd->driver->hapd_set_ssid(hapd->drv_priv, buf, len);
516 int hostapd_if_add(struct hostapd_data *hapd, enum wpa_driver_if_type type,
517 const char *ifname, const u8 *addr, void *bss_ctx,
518 void **drv_priv, char *force_ifname, u8 *if_addr)
520 if (hapd->driver == NULL || hapd->driver->if_add == NULL)
522 return hapd->driver->if_add(hapd->drv_priv, type, ifname, addr,
523 bss_ctx, drv_priv, force_ifname, if_addr);
527 int hostapd_if_remove(struct hostapd_data *hapd, enum wpa_driver_if_type type,
530 if (hapd->driver == NULL || hapd->driver->if_remove == NULL)
532 return hapd->driver->if_remove(hapd->drv_priv, type, ifname);
536 int hostapd_set_ieee8021x(struct hostapd_data *hapd,
537 struct wpa_bss_params *params)
539 if (hapd->driver == NULL || hapd->driver->set_ieee8021x == NULL)
541 return hapd->driver->set_ieee8021x(hapd->drv_priv, params);
545 int hostapd_get_seqnum(const char *ifname, struct hostapd_data *hapd,
546 const u8 *addr, int idx, u8 *seq)
548 if (hapd->driver == NULL || hapd->driver->get_seqnum == NULL)
550 return hapd->driver->get_seqnum(ifname, hapd->drv_priv, addr, idx,
555 int hostapd_flush(struct hostapd_data *hapd)
557 if (hapd->driver == NULL || hapd->driver->flush == NULL)
559 return hapd->driver->flush(hapd->drv_priv);
563 int hostapd_set_freq(struct hostapd_data *hapd, int mode, int freq,
564 int channel, int ht_enabled, int sec_channel_offset)
566 struct hostapd_freq_params data;
567 if (hapd->driver == NULL)
569 if (hapd->driver->set_freq == NULL)
571 os_memset(&data, 0, sizeof(data));
574 data.channel = channel;
575 data.ht_enabled = ht_enabled;
576 data.sec_channel_offset = sec_channel_offset;
577 return hapd->driver->set_freq(hapd->drv_priv, &data);
580 int hostapd_set_rts(struct hostapd_data *hapd, int rts)
582 if (hapd->driver == NULL || hapd->driver->set_rts == NULL)
584 return hapd->driver->set_rts(hapd->drv_priv, rts);
588 int hostapd_set_frag(struct hostapd_data *hapd, int frag)
590 if (hapd->driver == NULL || hapd->driver->set_frag == NULL)
592 return hapd->driver->set_frag(hapd->drv_priv, frag);
596 int hostapd_sta_set_flags(struct hostapd_data *hapd, u8 *addr,
597 int total_flags, int flags_or, int flags_and)
599 if (hapd->driver == NULL || hapd->driver->sta_set_flags == NULL)
601 return hapd->driver->sta_set_flags(hapd->drv_priv, addr, total_flags,
602 flags_or, flags_and);
606 int hostapd_set_rate_sets(struct hostapd_data *hapd, int *supp_rates,
607 int *basic_rates, int mode)
609 if (hapd->driver == NULL || hapd->driver->set_rate_sets == NULL)
611 return hapd->driver->set_rate_sets(hapd->drv_priv, supp_rates,
616 int hostapd_set_country(struct hostapd_data *hapd, const char *country)
618 if (hapd->driver == NULL ||
619 hapd->driver->set_country == NULL)
621 return hapd->driver->set_country(hapd->drv_priv, country);
625 int hostapd_set_cts_protect(struct hostapd_data *hapd, int value)
627 if (hapd->driver == NULL || hapd->driver->set_cts_protect == NULL)
629 return hapd->driver->set_cts_protect(hapd->drv_priv, value);
633 int hostapd_set_preamble(struct hostapd_data *hapd, int value)
635 if (hapd->driver == NULL || hapd->driver->set_preamble == NULL)
637 return hapd->driver->set_preamble(hapd->drv_priv, value);
641 int hostapd_set_short_slot_time(struct hostapd_data *hapd, int value)
643 if (hapd->driver == NULL || hapd->driver->set_short_slot_time == NULL)
645 return hapd->driver->set_short_slot_time(hapd->drv_priv, value);
649 int hostapd_set_tx_queue_params(struct hostapd_data *hapd, int queue, int aifs,
650 int cw_min, int cw_max, int burst_time)
652 if (hapd->driver == NULL || hapd->driver->set_tx_queue_params == NULL)
654 return hapd->driver->set_tx_queue_params(hapd->drv_priv, queue, aifs,
655 cw_min, cw_max, burst_time);
659 int hostapd_valid_bss_mask(struct hostapd_data *hapd, const u8 *addr,
662 if (hapd->driver == NULL || hapd->driver->valid_bss_mask == NULL)
664 return hapd->driver->valid_bss_mask(hapd->drv_priv, addr, mask);
668 struct hostapd_hw_modes *
669 hostapd_get_hw_feature_data(struct hostapd_data *hapd, u16 *num_modes,
672 if (hapd->driver == NULL ||
673 hapd->driver->get_hw_feature_data == NULL)
675 return hapd->driver->get_hw_feature_data(hapd->drv_priv, num_modes,
680 int hostapd_driver_commit(struct hostapd_data *hapd)
682 if (hapd->driver == NULL || hapd->driver->commit == NULL)
684 return hapd->driver->commit(hapd->drv_priv);
688 int hostapd_set_ht_params(struct hostapd_data *hapd,
689 const u8 *ht_capab, size_t ht_capab_len,
690 const u8 *ht_oper, size_t ht_oper_len)
692 if (hapd->driver == NULL || hapd->driver->set_ht_params == NULL ||
693 ht_capab == NULL || ht_oper == NULL)
695 return hapd->driver->set_ht_params(hapd->drv_priv,
696 ht_capab, ht_capab_len,
697 ht_oper, ht_oper_len);
701 int hostapd_drv_none(struct hostapd_data *hapd)
703 return hapd->driver && os_strcmp(hapd->driver->name, "none") == 0;
707 int hostapd_driver_scan(struct hostapd_data *hapd,
708 struct wpa_driver_scan_params *params)
710 if (hapd->driver && hapd->driver->scan2)
711 return hapd->driver->scan2(hapd->drv_priv, params);
716 struct wpa_scan_results * hostapd_driver_get_scan_results(
717 struct hostapd_data *hapd)
719 if (hapd->driver && hapd->driver->get_scan_results2)
720 return hapd->driver->get_scan_results2(hapd->drv_priv);
725 int hostapd_driver_set_noa(struct hostapd_data *hapd, u8 count, int start,
728 if (hapd->driver && hapd->driver->set_noa)
729 return hapd->driver->set_noa(hapd->drv_priv, count, start,