17242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci/* 27242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * hostapd - Driver operations 37242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * Copyright (c) 2009-2014, Jouni Malinen <j@w1.fi> 47242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * 57242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * This software may be distributed under the terms of the BSD license. 67242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * See README for more details. 77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci */ 87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#ifndef AP_DRV_OPS 107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#define AP_DRV_OPS 117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccienum wpa_driver_if_type; 137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistruct wpa_bss_params; 147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistruct wpa_driver_scan_params; 157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistruct ieee80211_ht_capabilities; 167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistruct ieee80211_vht_capabilities; 177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistruct hostapd_freq_params; 187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciu32 hostapd_sta_flags_to_drv(u32 flags); 207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_build_ap_extra_ies(struct hostapd_data *hapd, 217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct wpabuf **beacon, 227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct wpabuf **proberesp, 237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct wpabuf **assocresp); 247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid hostapd_free_ap_extra_ies(struct hostapd_data *hapd, struct wpabuf *beacon, 257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct wpabuf *proberesp, 267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct wpabuf *assocresp); 277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_ap_wps_ie(struct hostapd_data *hapd); 287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_authorized(struct hostapd_data *hapd, 297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct sta_info *sta, int authorized); 307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_sta_flags(struct hostapd_data *hapd, struct sta_info *sta); 317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_drv_ieee8021x(struct hostapd_data *hapd, const char *ifname, 327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int enabled); 337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_vlan_if_add(struct hostapd_data *hapd, const char *ifname); 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_vlan_if_remove(struct hostapd_data *hapd, const char *ifname); 357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_wds_sta(struct hostapd_data *hapd, char *ifname_wds, 367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const u8 *addr, int aid, int val); 377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_sta_add(struct hostapd_data *hapd, 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const u8 *addr, u16 aid, u16 capability, 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const u8 *supp_rates, size_t supp_rates_len, 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci u16 listen_interval, 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const struct ieee80211_ht_capabilities *ht_capab, 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const struct ieee80211_vht_capabilities *vht_capab, 437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci u32 flags, u8 qosinfo, u8 vht_opmode); 447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_privacy(struct hostapd_data *hapd, int enabled); 457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_generic_elem(struct hostapd_data *hapd, const u8 *elem, 467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci size_t elem_len); 477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_get_ssid(struct hostapd_data *hapd, u8 *buf, size_t len); 487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_ssid(struct hostapd_data *hapd, const u8 *buf, size_t len); 497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_if_add(struct hostapd_data *hapd, enum wpa_driver_if_type type, 507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const char *ifname, const u8 *addr, void *bss_ctx, 517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void **drv_priv, char *force_ifname, u8 *if_addr, 527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const char *bridge, int use_existing); 537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_if_remove(struct hostapd_data *hapd, enum wpa_driver_if_type type, 547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const char *ifname); 557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_ieee8021x(struct hostapd_data *hapd, 567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct wpa_bss_params *params); 577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_get_seqnum(const char *ifname, struct hostapd_data *hapd, 587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const u8 *addr, int idx, u8 *seq); 597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_flush(struct hostapd_data *hapd); 607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_freq(struct hostapd_data *hapd, int mode, int freq, 617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int channel, int ht_enabled, int vht_enabled, 627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int sec_channel_offset, int vht_oper_chwidth, 637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int center_segment0, int center_segment1); 647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_rts(struct hostapd_data *hapd, int rts); 657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_frag(struct hostapd_data *hapd, int frag); 667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_sta_set_flags(struct hostapd_data *hapd, u8 *addr, 677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int total_flags, int flags_or, int flags_and); 687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_country(struct hostapd_data *hapd, const char *country); 697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_tx_queue_params(struct hostapd_data *hapd, int queue, int aifs, 707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int cw_min, int cw_max, int burst_time); 717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistruct hostapd_hw_modes * 727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccihostapd_get_hw_feature_data(struct hostapd_data *hapd, u16 *num_modes, 737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci u16 *flags); 747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_driver_commit(struct hostapd_data *hapd); 757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_drv_none(struct hostapd_data *hapd); 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_driver_scan(struct hostapd_data *hapd, 777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct wpa_driver_scan_params *params); 787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistruct wpa_scan_results * hostapd_driver_get_scan_results( 797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct hostapd_data *hapd); 807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_driver_set_noa(struct hostapd_data *hapd, u8 count, int start, 817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int duration); 827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_drv_set_key(const char *ifname, 837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci struct hostapd_data *hapd, 847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci enum wpa_alg alg, const u8 *addr, 857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int key_idx, int set_tx, 867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const u8 *seq, size_t seq_len, 877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const u8 *key, size_t key_len); 887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_drv_send_mlme(struct hostapd_data *hapd, 897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const void *msg, size_t len, int noack); 907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_drv_sta_deauth(struct hostapd_data *hapd, 917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const u8 *addr, int reason); 927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_drv_sta_disassoc(struct hostapd_data *hapd, 937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const u8 *addr, int reason); 947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_drv_send_action(struct hostapd_data *hapd, unsigned int freq, 957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci unsigned int wait, const u8 *dst, const u8 *data, 967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci size_t len); 977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_add_sta_node(struct hostapd_data *hapd, const u8 *addr, 987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci u16 auth_alg); 997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_sta_auth(struct hostapd_data *hapd, const u8 *addr, 1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci u16 seq, u16 status, const u8 *ie, size_t len); 1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_sta_assoc(struct hostapd_data *hapd, const u8 *addr, 1027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int reassoc, u16 status, const u8 *ie, size_t len); 1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_add_tspec(struct hostapd_data *hapd, const u8 *addr, 1047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci u8 *tspec_ie, size_t tspec_ielen); 1057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_start_dfs_cac(struct hostapd_iface *iface, int mode, int freq, 1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int channel, int ht_enabled, int vht_enabled, 1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int sec_channel_offset, int vht_oper_chwidth, 1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int center_segment0, int center_segment1); 1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciint hostapd_set_freq_params(struct hostapd_freq_params *data, int mode, 1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int freq, int channel, int ht_enabled, 1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int vht_enabled, int sec_channel_offset, 1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci int vht_oper_chwidth, int center_segment0, 113 int center_segment1, u32 vht_caps); 114 115 116#include "drivers/driver.h" 117 118int hostapd_drv_wnm_oper(struct hostapd_data *hapd, 119 enum wnm_oper oper, const u8 *peer, 120 u8 *buf, u16 *buf_len); 121 122int hostapd_drv_set_qos_map(struct hostapd_data *hapd, const u8 *qos_map_set, 123 u8 qos_map_set_len); 124 125static inline int hostapd_drv_set_countermeasures(struct hostapd_data *hapd, 126 int enabled) 127{ 128 if (hapd->driver == NULL || 129 hapd->driver->hapd_set_countermeasures == NULL) 130 return 0; 131 return hapd->driver->hapd_set_countermeasures(hapd->drv_priv, enabled); 132} 133 134static inline int hostapd_drv_set_sta_vlan(const char *ifname, 135 struct hostapd_data *hapd, 136 const u8 *addr, int vlan_id) 137{ 138 if (hapd->driver == NULL || hapd->driver->set_sta_vlan == NULL) 139 return 0; 140 return hapd->driver->set_sta_vlan(hapd->drv_priv, addr, ifname, 141 vlan_id); 142} 143 144static inline int hostapd_drv_get_inact_sec(struct hostapd_data *hapd, 145 const u8 *addr) 146{ 147 if (hapd->driver == NULL || hapd->driver->get_inact_sec == NULL) 148 return 0; 149 return hapd->driver->get_inact_sec(hapd->drv_priv, addr); 150} 151 152static inline int hostapd_drv_sta_remove(struct hostapd_data *hapd, 153 const u8 *addr) 154{ 155 if (hapd->driver == NULL || hapd->driver->sta_remove == NULL) 156 return 0; 157 return hapd->driver->sta_remove(hapd->drv_priv, addr); 158} 159 160static inline int hostapd_drv_hapd_send_eapol(struct hostapd_data *hapd, 161 const u8 *addr, const u8 *data, 162 size_t data_len, int encrypt, 163 u32 flags) 164{ 165 if (hapd->driver == NULL || hapd->driver->hapd_send_eapol == NULL) 166 return 0; 167 return hapd->driver->hapd_send_eapol(hapd->drv_priv, addr, data, 168 data_len, encrypt, 169 hapd->own_addr, flags); 170} 171 172static inline int hostapd_drv_read_sta_data( 173 struct hostapd_data *hapd, struct hostap_sta_driver_data *data, 174 const u8 *addr) 175{ 176 if (hapd->driver == NULL || hapd->driver->read_sta_data == NULL) 177 return -1; 178 return hapd->driver->read_sta_data(hapd->drv_priv, data, addr); 179} 180 181static inline int hostapd_drv_sta_clear_stats(struct hostapd_data *hapd, 182 const u8 *addr) 183{ 184 if (hapd->driver == NULL || hapd->driver->sta_clear_stats == NULL) 185 return 0; 186 return hapd->driver->sta_clear_stats(hapd->drv_priv, addr); 187} 188 189static inline int hostapd_drv_set_acl(struct hostapd_data *hapd, 190 struct hostapd_acl_params *params) 191{ 192 if (hapd->driver == NULL || hapd->driver->set_acl == NULL) 193 return 0; 194 return hapd->driver->set_acl(hapd->drv_priv, params); 195} 196 197static inline int hostapd_drv_set_ap(struct hostapd_data *hapd, 198 struct wpa_driver_ap_params *params) 199{ 200 if (hapd->driver == NULL || hapd->driver->set_ap == NULL) 201 return 0; 202 return hapd->driver->set_ap(hapd->drv_priv, params); 203} 204 205static inline int hostapd_drv_set_radius_acl_auth(struct hostapd_data *hapd, 206 const u8 *mac, int accepted, 207 u32 session_timeout) 208{ 209 if (hapd->driver == NULL || hapd->driver->set_radius_acl_auth == NULL) 210 return 0; 211 return hapd->driver->set_radius_acl_auth(hapd->drv_priv, mac, accepted, 212 session_timeout); 213} 214 215static inline int hostapd_drv_set_radius_acl_expire(struct hostapd_data *hapd, 216 const u8 *mac) 217{ 218 if (hapd->driver == NULL || 219 hapd->driver->set_radius_acl_expire == NULL) 220 return 0; 221 return hapd->driver->set_radius_acl_expire(hapd->drv_priv, mac); 222} 223 224static inline int hostapd_drv_set_authmode(struct hostapd_data *hapd, 225 int auth_algs) 226{ 227 if (hapd->driver == NULL || hapd->driver->set_authmode == NULL) 228 return 0; 229 return hapd->driver->set_authmode(hapd->drv_priv, auth_algs); 230} 231 232static inline void hostapd_drv_poll_client(struct hostapd_data *hapd, 233 const u8 *own_addr, const u8 *addr, 234 int qos) 235{ 236 if (hapd->driver == NULL || hapd->driver->poll_client == NULL) 237 return; 238 hapd->driver->poll_client(hapd->drv_priv, own_addr, addr, qos); 239} 240 241static inline int hostapd_drv_get_survey(struct hostapd_data *hapd, 242 unsigned int freq) 243{ 244 if (hapd->driver == NULL) 245 return -1; 246 if (!hapd->driver->get_survey) 247 return -1; 248 return hapd->driver->get_survey(hapd->drv_priv, freq); 249} 250 251static inline int hostapd_get_country(struct hostapd_data *hapd, char *alpha2) 252{ 253 if (hapd->driver == NULL || hapd->driver->get_country == NULL) 254 return -1; 255 return hapd->driver->get_country(hapd->drv_priv, alpha2); 256} 257 258static inline const char * hostapd_drv_get_radio_name(struct hostapd_data *hapd) 259{ 260 if (hapd->driver == NULL || hapd->drv_priv == NULL || 261 hapd->driver->get_radio_name == NULL) 262 return NULL; 263 return hapd->driver->get_radio_name(hapd->drv_priv); 264} 265 266static inline int hostapd_drv_switch_channel(struct hostapd_data *hapd, 267 struct csa_settings *settings) 268{ 269 if (hapd->driver == NULL || hapd->driver->switch_channel == NULL) 270 return -ENOTSUP; 271 272 return hapd->driver->switch_channel(hapd->drv_priv, settings); 273} 274 275static inline int hostapd_drv_status(struct hostapd_data *hapd, char *buf, 276 size_t buflen) 277{ 278 if (hapd->driver == NULL || hapd->driver->status == NULL) 279 return -1; 280 return hapd->driver->status(hapd->drv_priv, buf, buflen); 281} 282 283static inline int hostapd_drv_vendor_cmd(struct hostapd_data *hapd, 284 int vendor_id, int subcmd, 285 const u8 *data, size_t data_len, 286 struct wpabuf *buf) 287{ 288 if (hapd->driver == NULL || hapd->driver->vendor_cmd == NULL) 289 return -1; 290 return hapd->driver->vendor_cmd(hapd->drv_priv, vendor_id, subcmd, data, 291 data_len, buf); 292} 293 294#endif /* AP_DRV_OPS */ 295