1 /* 2 * hostapd - Driver operations 3 * Copyright (c) 2009-2014, Jouni Malinen <j (at) w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 #ifndef AP_DRV_OPS 10 #define AP_DRV_OPS 11 12 enum wpa_driver_if_type; 13 struct wpa_bss_params; 14 struct wpa_driver_scan_params; 15 struct ieee80211_ht_capabilities; 16 struct ieee80211_vht_capabilities; 17 struct hostapd_freq_params; 18 19 u32 hostapd_sta_flags_to_drv(u32 flags); 20 int hostapd_build_ap_extra_ies(struct hostapd_data *hapd, 21 struct wpabuf **beacon, 22 struct wpabuf **proberesp, 23 struct wpabuf **assocresp); 24 void hostapd_free_ap_extra_ies(struct hostapd_data *hapd, struct wpabuf *beacon, 25 struct wpabuf *proberesp, 26 struct wpabuf *assocresp); 27 int hostapd_set_ap_wps_ie(struct hostapd_data *hapd); 28 int hostapd_set_authorized(struct hostapd_data *hapd, 29 struct sta_info *sta, int authorized); 30 int hostapd_set_sta_flags(struct hostapd_data *hapd, struct sta_info *sta); 31 int hostapd_set_drv_ieee8021x(struct hostapd_data *hapd, const char *ifname, 32 int enabled); 33 int hostapd_vlan_if_add(struct hostapd_data *hapd, const char *ifname); 34 int hostapd_vlan_if_remove(struct hostapd_data *hapd, const char *ifname); 35 int hostapd_set_wds_sta(struct hostapd_data *hapd, char *ifname_wds, 36 const u8 *addr, int aid, int val); 37 int hostapd_sta_add(struct hostapd_data *hapd, 38 const u8 *addr, u16 aid, u16 capability, 39 const u8 *supp_rates, size_t supp_rates_len, 40 u16 listen_interval, 41 const struct ieee80211_ht_capabilities *ht_capab, 42 const struct ieee80211_vht_capabilities *vht_capab, 43 u32 flags, u8 qosinfo, u8 vht_opmode); 44 int hostapd_set_privacy(struct hostapd_data *hapd, int enabled); 45 int hostapd_set_generic_elem(struct hostapd_data *hapd, const u8 *elem, 46 size_t elem_len); 47 int hostapd_get_ssid(struct hostapd_data *hapd, u8 *buf, size_t len); 48 int hostapd_set_ssid(struct hostapd_data *hapd, const u8 *buf, size_t len); 49 int hostapd_if_add(struct hostapd_data *hapd, enum wpa_driver_if_type type, 50 const char *ifname, const u8 *addr, void *bss_ctx, 51 void **drv_priv, char *force_ifname, u8 *if_addr, 52 const char *bridge, int use_existing); 53 int hostapd_if_remove(struct hostapd_data *hapd, enum wpa_driver_if_type type, 54 const char *ifname); 55 int hostapd_set_ieee8021x(struct hostapd_data *hapd, 56 struct wpa_bss_params *params); 57 int hostapd_get_seqnum(const char *ifname, struct hostapd_data *hapd, 58 const u8 *addr, int idx, u8 *seq); 59 int hostapd_flush(struct hostapd_data *hapd); 60 int hostapd_set_freq(struct hostapd_data *hapd, int mode, int freq, 61 int channel, int ht_enabled, int vht_enabled, 62 int sec_channel_offset, int vht_oper_chwidth, 63 int center_segment0, int center_segment1); 64 int hostapd_set_rts(struct hostapd_data *hapd, int rts); 65 int hostapd_set_frag(struct hostapd_data *hapd, int frag); 66 int hostapd_sta_set_flags(struct hostapd_data *hapd, u8 *addr, 67 int total_flags, int flags_or, int flags_and); 68 int hostapd_set_country(struct hostapd_data *hapd, const char *country); 69 int hostapd_set_tx_queue_params(struct hostapd_data *hapd, int queue, int aifs, 70 int cw_min, int cw_max, int burst_time); 71 struct hostapd_hw_modes * 72 hostapd_get_hw_feature_data(struct hostapd_data *hapd, u16 *num_modes, 73 u16 *flags); 74 int hostapd_driver_commit(struct hostapd_data *hapd); 75 int hostapd_drv_none(struct hostapd_data *hapd); 76 int hostapd_driver_scan(struct hostapd_data *hapd, 77 struct wpa_driver_scan_params *params); 78 struct wpa_scan_results * hostapd_driver_get_scan_results( 79 struct hostapd_data *hapd); 80 int hostapd_driver_set_noa(struct hostapd_data *hapd, u8 count, int start, 81 int duration); 82 int hostapd_drv_set_key(const char *ifname, 83 struct hostapd_data *hapd, 84 enum wpa_alg alg, const u8 *addr, 85 int key_idx, int set_tx, 86 const u8 *seq, size_t seq_len, 87 const u8 *key, size_t key_len); 88 int hostapd_drv_send_mlme(struct hostapd_data *hapd, 89 const void *msg, size_t len, int noack); 90 int hostapd_drv_sta_deauth(struct hostapd_data *hapd, 91 const u8 *addr, int reason); 92 int hostapd_drv_sta_disassoc(struct hostapd_data *hapd, 93 const u8 *addr, int reason); 94 int hostapd_drv_send_action(struct hostapd_data *hapd, unsigned int freq, 95 unsigned int wait, const u8 *dst, const u8 *data, 96 size_t len); 97 int hostapd_add_sta_node(struct hostapd_data *hapd, const u8 *addr, 98 u16 auth_alg); 99 int hostapd_sta_auth(struct hostapd_data *hapd, const u8 *addr, 100 u16 seq, u16 status, const u8 *ie, size_t len); 101 int hostapd_sta_assoc(struct hostapd_data *hapd, const u8 *addr, 102 int reassoc, u16 status, const u8 *ie, size_t len); 103 int hostapd_add_tspec(struct hostapd_data *hapd, const u8 *addr, 104 u8 *tspec_ie, size_t tspec_ielen); 105 int hostapd_start_dfs_cac(struct hostapd_iface *iface, int mode, int freq, 106 int channel, int ht_enabled, int vht_enabled, 107 int sec_channel_offset, int vht_oper_chwidth, 108 int center_segment0, int center_segment1); 109 int hostapd_set_freq_params(struct hostapd_freq_params *data, int mode, 110 int freq, int channel, int ht_enabled, 111 int vht_enabled, int sec_channel_offset, 112 int vht_oper_chwidth, int center_segment0, 113 int center_segment1, u32 vht_caps); 114 115 116 #include "drivers/driver.h" 117 118 int hostapd_drv_wnm_oper(struct hostapd_data *hapd, 119 enum wnm_oper oper, const u8 *peer, 120 u8 *buf, u16 *buf_len); 121 122 int hostapd_drv_set_qos_map(struct hostapd_data *hapd, const u8 *qos_map_set, 123 u8 qos_map_set_len); 124 125 static 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 134 static 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 144 static 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 152 static 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 160 static 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 172 static 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 181 static 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 189 static 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 197 static 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 205 static 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 215 static 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 224 static 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 232 static 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 241 static 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 251 static 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 258 static 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 266 static 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 275 static 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 283 static 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