Home | History | Annotate | Download | only in ap
      1 /*
      2  * hostapd / Station table
      3  * Copyright (c) 2002-2009, Jouni Malinen <j (at) w1.fi>
      4  *
      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.
      8  *
      9  * Alternatively, this software may be distributed under the terms of BSD
     10  * license.
     11  *
     12  * See README and COPYING for more details.
     13  */
     14 
     15 #include "utils/includes.h"
     16 
     17 #include "utils/common.h"
     18 #include "utils/eloop.h"
     19 #include "common/ieee802_11_defs.h"
     20 #include "radius/radius.h"
     21 #include "radius/radius_client.h"
     22 #include "drivers/driver.h"
     23 #include "p2p/p2p.h"
     24 #include "hostapd.h"
     25 #include "accounting.h"
     26 #include "ieee802_1x.h"
     27 #include "ieee802_11.h"
     28 #include "wpa_auth.h"
     29 #include "preauth_auth.h"
     30 #include "ap_config.h"
     31 #include "beacon.h"
     32 #include "ap_mlme.h"
     33 #include "vlan_init.h"
     34 #include "p2p_hostapd.h"
     35 #include "ap_drv_ops.h"
     36 #include "sta_info.h"
     37 
     38 static void ap_sta_remove_in_other_bss(struct hostapd_data *hapd,
     39 				       struct sta_info *sta);
     40 static void ap_handle_session_timer(void *eloop_ctx, void *timeout_ctx);
     41 #ifdef CONFIG_IEEE80211W
     42 static void ap_sa_query_timer(void *eloop_ctx, void *timeout_ctx);
     43 #endif /* CONFIG_IEEE80211W */
     44 
     45 int ap_for_each_sta(struct hostapd_data *hapd,
     46 		    int (*cb)(struct hostapd_data *hapd, struct sta_info *sta,
     47 			      void *ctx),
     48 		    void *ctx)
     49 {
     50 	struct sta_info *sta;
     51 
     52 	for (sta = hapd->sta_list; sta; sta = sta->next) {
     53 		if (cb(hapd, sta, ctx))
     54 			return 1;
     55 	}
     56 
     57 	return 0;
     58 }
     59 
     60 
     61 struct sta_info * ap_get_sta(struct hostapd_data *hapd, const u8 *sta)
     62 {
     63 	struct sta_info *s;
     64 
     65 	s = hapd->sta_hash[STA_HASH(sta)];
     66 	while (s != NULL && os_memcmp(s->addr, sta, 6) != 0)
     67 		s = s->hnext;
     68 	return s;
     69 }
     70 
     71 
     72 static void ap_sta_list_del(struct hostapd_data *hapd, struct sta_info *sta)
     73 {
     74 	struct sta_info *tmp;
     75 
     76 	if (hapd->sta_list == sta) {
     77 		hapd->sta_list = sta->next;
     78 		return;
     79 	}
     80 
     81 	tmp = hapd->sta_list;
     82 	while (tmp != NULL && tmp->next != sta)
     83 		tmp = tmp->next;
     84 	if (tmp == NULL) {
     85 		wpa_printf(MSG_DEBUG, "Could not remove STA " MACSTR " from "
     86 			   "list.", MAC2STR(sta->addr));
     87 	} else
     88 		tmp->next = sta->next;
     89 }
     90 
     91 
     92 void ap_sta_hash_add(struct hostapd_data *hapd, struct sta_info *sta)
     93 {
     94 	sta->hnext = hapd->sta_hash[STA_HASH(sta->addr)];
     95 	hapd->sta_hash[STA_HASH(sta->addr)] = sta;
     96 }
     97 
     98 
     99 static void ap_sta_hash_del(struct hostapd_data *hapd, struct sta_info *sta)
    100 {
    101 	struct sta_info *s;
    102 
    103 	s = hapd->sta_hash[STA_HASH(sta->addr)];
    104 	if (s == NULL) return;
    105 	if (os_memcmp(s->addr, sta->addr, 6) == 0) {
    106 		hapd->sta_hash[STA_HASH(sta->addr)] = s->hnext;
    107 		return;
    108 	}
    109 
    110 	while (s->hnext != NULL &&
    111 	       os_memcmp(s->hnext->addr, sta->addr, ETH_ALEN) != 0)
    112 		s = s->hnext;
    113 	if (s->hnext != NULL)
    114 		s->hnext = s->hnext->hnext;
    115 	else
    116 		wpa_printf(MSG_DEBUG, "AP: could not remove STA " MACSTR
    117 			   " from hash table", MAC2STR(sta->addr));
    118 }
    119 
    120 
    121 void ap_free_sta(struct hostapd_data *hapd, struct sta_info *sta)
    122 {
    123 	int set_beacon = 0;
    124 
    125 	accounting_sta_stop(hapd, sta);
    126 
    127 	/* just in case */
    128 	ap_sta_set_authorized(hapd, sta, 0);
    129 
    130 	if (sta->flags & WLAN_STA_WDS)
    131 		hostapd_set_wds_sta(hapd, sta->addr, sta->aid, 0);
    132 
    133 	if (!(sta->flags & WLAN_STA_PREAUTH))
    134 		hostapd_drv_sta_remove(hapd, sta->addr);
    135 
    136 	ap_sta_hash_del(hapd, sta);
    137 	ap_sta_list_del(hapd, sta);
    138 
    139 	if (sta->aid > 0)
    140 		hapd->sta_aid[(sta->aid - 1) / 32] &=
    141 			~BIT((sta->aid - 1) % 32);
    142 
    143 	hapd->num_sta--;
    144 	if (sta->nonerp_set) {
    145 		sta->nonerp_set = 0;
    146 		hapd->iface->num_sta_non_erp--;
    147 		if (hapd->iface->num_sta_non_erp == 0)
    148 			set_beacon++;
    149 	}
    150 
    151 	if (sta->no_short_slot_time_set) {
    152 		sta->no_short_slot_time_set = 0;
    153 		hapd->iface->num_sta_no_short_slot_time--;
    154 		if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G
    155 		    && hapd->iface->num_sta_no_short_slot_time == 0)
    156 			set_beacon++;
    157 	}
    158 
    159 	if (sta->no_short_preamble_set) {
    160 		sta->no_short_preamble_set = 0;
    161 		hapd->iface->num_sta_no_short_preamble--;
    162 		if (hapd->iface->current_mode->mode == HOSTAPD_MODE_IEEE80211G
    163 		    && hapd->iface->num_sta_no_short_preamble == 0)
    164 			set_beacon++;
    165 	}
    166 
    167 	if (sta->no_ht_gf_set) {
    168 		sta->no_ht_gf_set = 0;
    169 		hapd->iface->num_sta_ht_no_gf--;
    170 	}
    171 
    172 	if (sta->no_ht_set) {
    173 		sta->no_ht_set = 0;
    174 		hapd->iface->num_sta_no_ht--;
    175 	}
    176 
    177 	if (sta->ht_20mhz_set) {
    178 		sta->ht_20mhz_set = 0;
    179 		hapd->iface->num_sta_ht_20mhz--;
    180 	}
    181 
    182 #ifdef CONFIG_P2P
    183 	if (sta->no_p2p_set) {
    184 		sta->no_p2p_set = 0;
    185 		hapd->num_sta_no_p2p--;
    186 		if (hapd->num_sta_no_p2p == 0)
    187 			hostapd_p2p_non_p2p_sta_disconnected(hapd);
    188 	}
    189 #endif /* CONFIG_P2P */
    190 
    191 #if defined(NEED_AP_MLME) && defined(CONFIG_IEEE80211N)
    192 	if (hostapd_ht_operation_update(hapd->iface) > 0)
    193 		set_beacon++;
    194 #endif /* NEED_AP_MLME && CONFIG_IEEE80211N */
    195 
    196 	if (set_beacon)
    197 		ieee802_11_set_beacons(hapd->iface);
    198 
    199 	eloop_cancel_timeout(ap_handle_timer, hapd, sta);
    200 	eloop_cancel_timeout(ap_handle_session_timer, hapd, sta);
    201 
    202 	ieee802_1x_free_station(sta);
    203 	wpa_auth_sta_deinit(sta->wpa_sm);
    204 	rsn_preauth_free_station(hapd, sta);
    205 #ifndef CONFIG_NO_RADIUS
    206 	radius_client_flush_auth(hapd->radius, sta->addr);
    207 #endif /* CONFIG_NO_RADIUS */
    208 
    209 	os_free(sta->last_assoc_req);
    210 	os_free(sta->challenge);
    211 
    212 #ifdef CONFIG_IEEE80211W
    213 	os_free(sta->sa_query_trans_id);
    214 	eloop_cancel_timeout(ap_sa_query_timer, hapd, sta);
    215 #endif /* CONFIG_IEEE80211W */
    216 
    217 #ifdef CONFIG_P2P
    218 	p2p_group_notif_disassoc(hapd->p2p_group, sta->addr);
    219 #endif /* CONFIG_P2P */
    220 
    221 	wpabuf_free(sta->wps_ie);
    222 	wpabuf_free(sta->p2p_ie);
    223 
    224 	os_free(sta->ht_capabilities);
    225 
    226 	os_free(sta);
    227 }
    228 
    229 
    230 void hostapd_free_stas(struct hostapd_data *hapd)
    231 {
    232 	struct sta_info *sta, *prev;
    233 
    234 	sta = hapd->sta_list;
    235 
    236 	while (sta) {
    237 		prev = sta;
    238 		if (sta->flags & WLAN_STA_AUTH) {
    239 			mlme_deauthenticate_indication(
    240 				hapd, sta, WLAN_REASON_UNSPECIFIED);
    241 		}
    242 		sta = sta->next;
    243 		wpa_printf(MSG_DEBUG, "Removing station " MACSTR,
    244 			   MAC2STR(prev->addr));
    245 		ap_free_sta(hapd, prev);
    246 	}
    247 }
    248 
    249 
    250 /**
    251  * ap_handle_timer - Per STA timer handler
    252  * @eloop_ctx: struct hostapd_data *
    253  * @timeout_ctx: struct sta_info *
    254  *
    255  * This function is called to check station activity and to remove inactive
    256  * stations.
    257  */
    258 void ap_handle_timer(void *eloop_ctx, void *timeout_ctx)
    259 {
    260 	struct hostapd_data *hapd = eloop_ctx;
    261 	struct sta_info *sta = timeout_ctx;
    262 	unsigned long next_time = 0;
    263 
    264 	if (sta->timeout_next == STA_REMOVE) {
    265 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
    266 			       HOSTAPD_LEVEL_INFO, "deauthenticated due to "
    267 			       "local deauth request");
    268 		ap_free_sta(hapd, sta);
    269 		return;
    270 	}
    271 
    272 	if ((sta->flags & WLAN_STA_ASSOC) &&
    273 	    (sta->timeout_next == STA_NULLFUNC ||
    274 	     sta->timeout_next == STA_DISASSOC)) {
    275 		int inactive_sec;
    276 		inactive_sec = hostapd_drv_get_inact_sec(hapd, sta->addr);
    277 		if (inactive_sec == -1) {
    278 			wpa_msg(hapd, MSG_DEBUG, "Check inactivity: Could not "
    279 				"get station info rom kernel driver for "
    280 				MACSTR, MAC2STR(sta->addr));
    281 		} else if (inactive_sec < hapd->conf->ap_max_inactivity &&
    282 			   sta->flags & WLAN_STA_ASSOC) {
    283 			/* station activity detected; reset timeout state */
    284 			wpa_msg(hapd, MSG_DEBUG, "Station " MACSTR " has been "
    285 				"active %is ago",
    286 				MAC2STR(sta->addr), inactive_sec);
    287 			sta->timeout_next = STA_NULLFUNC;
    288 			next_time = hapd->conf->ap_max_inactivity -
    289 				inactive_sec;
    290 		} else {
    291 			wpa_msg(hapd, MSG_DEBUG, "Station " MACSTR " has been "
    292 				"inactive too long: %d sec, max allowed: %d",
    293 				MAC2STR(sta->addr), inactive_sec,
    294 				hapd->conf->ap_max_inactivity);
    295 		}
    296 	}
    297 
    298 	if ((sta->flags & WLAN_STA_ASSOC) &&
    299 	    sta->timeout_next == STA_DISASSOC &&
    300 	    !(sta->flags & WLAN_STA_PENDING_POLL)) {
    301 		wpa_msg(hapd, MSG_DEBUG, "Station " MACSTR " has ACKed data "
    302 			"poll", MAC2STR(sta->addr));
    303 		/* data nullfunc frame poll did not produce TX errors; assume
    304 		 * station ACKed it */
    305 		sta->timeout_next = STA_NULLFUNC;
    306 		next_time = hapd->conf->ap_max_inactivity;
    307 	}
    308 
    309 	if (next_time) {
    310 		eloop_register_timeout(next_time, 0, ap_handle_timer, hapd,
    311 				       sta);
    312 		return;
    313 	}
    314 
    315 	if (sta->timeout_next == STA_NULLFUNC &&
    316 	    (sta->flags & WLAN_STA_ASSOC)) {
    317 #ifndef CONFIG_NATIVE_WINDOWS
    318 		/* send data frame to poll STA and check whether this frame
    319 		 * is ACKed */
    320 		struct ieee80211_hdr hdr;
    321 
    322 		wpa_printf(MSG_DEBUG, "  Polling STA with data frame");
    323 		sta->flags |= WLAN_STA_PENDING_POLL;
    324 
    325 		os_memset(&hdr, 0, sizeof(hdr));
    326 		if (hapd->driver &&
    327 		    os_strcmp(hapd->driver->name, "hostap") == 0) {
    328 			/*
    329 			 * WLAN_FC_STYPE_NULLFUNC would be more appropriate,
    330 			 * but it is apparently not retried so TX Exc events
    331 			 * are not received for it.
    332 			 */
    333 			hdr.frame_control =
    334 				IEEE80211_FC(WLAN_FC_TYPE_DATA,
    335 					     WLAN_FC_STYPE_DATA);
    336 		} else {
    337 			hdr.frame_control =
    338 				IEEE80211_FC(WLAN_FC_TYPE_DATA,
    339 					     WLAN_FC_STYPE_NULLFUNC);
    340 		}
    341 
    342 		hdr.frame_control |= host_to_le16(WLAN_FC_FROMDS);
    343 		os_memcpy(hdr.IEEE80211_DA_FROMDS, sta->addr, ETH_ALEN);
    344 		os_memcpy(hdr.IEEE80211_BSSID_FROMDS, hapd->own_addr,
    345 			  ETH_ALEN);
    346 		os_memcpy(hdr.IEEE80211_SA_FROMDS, hapd->own_addr, ETH_ALEN);
    347 
    348 		if (hostapd_drv_send_mlme(hapd, &hdr, sizeof(hdr)) < 0)
    349 			perror("ap_handle_timer: send");
    350 #endif /* CONFIG_NATIVE_WINDOWS */
    351 	} else if (sta->timeout_next != STA_REMOVE) {
    352 		int deauth = sta->timeout_next == STA_DEAUTH;
    353 
    354 		wpa_printf(MSG_DEBUG, "Sending %s info to STA " MACSTR,
    355 			   deauth ? "deauthentication" : "disassociation",
    356 			   MAC2STR(sta->addr));
    357 
    358 		if (deauth) {
    359 			hostapd_drv_sta_deauth(
    360 				hapd, sta->addr,
    361 				WLAN_REASON_PREV_AUTH_NOT_VALID);
    362 		} else {
    363 			hostapd_drv_sta_disassoc(
    364 				hapd, sta->addr,
    365 				WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY);
    366 		}
    367 	}
    368 
    369 	switch (sta->timeout_next) {
    370 	case STA_NULLFUNC:
    371 		sta->timeout_next = STA_DISASSOC;
    372 		eloop_register_timeout(AP_DISASSOC_DELAY, 0, ap_handle_timer,
    373 				       hapd, sta);
    374 		break;
    375 	case STA_DISASSOC:
    376 		sta->flags &= ~WLAN_STA_ASSOC;
    377 		ieee802_1x_notify_port_enabled(sta->eapol_sm, 0);
    378 		if (!sta->acct_terminate_cause)
    379 			sta->acct_terminate_cause =
    380 				RADIUS_ACCT_TERMINATE_CAUSE_IDLE_TIMEOUT;
    381 		accounting_sta_stop(hapd, sta);
    382 		ieee802_1x_free_station(sta);
    383 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
    384 			       HOSTAPD_LEVEL_INFO, "disassociated due to "
    385 			       "inactivity");
    386 		sta->timeout_next = STA_DEAUTH;
    387 		eloop_register_timeout(AP_DEAUTH_DELAY, 0, ap_handle_timer,
    388 				       hapd, sta);
    389 		mlme_disassociate_indication(
    390 			hapd, sta, WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY);
    391 		break;
    392 	case STA_DEAUTH:
    393 	case STA_REMOVE:
    394 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
    395 			       HOSTAPD_LEVEL_INFO, "deauthenticated due to "
    396 			       "inactivity");
    397 		if (!sta->acct_terminate_cause)
    398 			sta->acct_terminate_cause =
    399 				RADIUS_ACCT_TERMINATE_CAUSE_IDLE_TIMEOUT;
    400 		mlme_deauthenticate_indication(
    401 			hapd, sta,
    402 			WLAN_REASON_PREV_AUTH_NOT_VALID);
    403 		ap_free_sta(hapd, sta);
    404 		break;
    405 	}
    406 }
    407 
    408 
    409 static void ap_handle_session_timer(void *eloop_ctx, void *timeout_ctx)
    410 {
    411 	struct hostapd_data *hapd = eloop_ctx;
    412 	struct sta_info *sta = timeout_ctx;
    413 	u8 addr[ETH_ALEN];
    414 
    415 	if (!(sta->flags & WLAN_STA_AUTH))
    416 		return;
    417 
    418 	mlme_deauthenticate_indication(hapd, sta,
    419 				       WLAN_REASON_PREV_AUTH_NOT_VALID);
    420 	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
    421 		       HOSTAPD_LEVEL_INFO, "deauthenticated due to "
    422 		       "session timeout");
    423 	sta->acct_terminate_cause =
    424 		RADIUS_ACCT_TERMINATE_CAUSE_SESSION_TIMEOUT;
    425 	os_memcpy(addr, sta->addr, ETH_ALEN);
    426 	ap_free_sta(hapd, sta);
    427 	hostapd_drv_sta_deauth(hapd, addr, WLAN_REASON_PREV_AUTH_NOT_VALID);
    428 }
    429 
    430 
    431 void ap_sta_session_timeout(struct hostapd_data *hapd, struct sta_info *sta,
    432 			    u32 session_timeout)
    433 {
    434 	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
    435 		       HOSTAPD_LEVEL_DEBUG, "setting session timeout to %d "
    436 		       "seconds", session_timeout);
    437 	eloop_cancel_timeout(ap_handle_session_timer, hapd, sta);
    438 	eloop_register_timeout(session_timeout, 0, ap_handle_session_timer,
    439 			       hapd, sta);
    440 }
    441 
    442 
    443 void ap_sta_no_session_timeout(struct hostapd_data *hapd, struct sta_info *sta)
    444 {
    445 	eloop_cancel_timeout(ap_handle_session_timer, hapd, sta);
    446 }
    447 
    448 
    449 struct sta_info * ap_sta_add(struct hostapd_data *hapd, const u8 *addr)
    450 {
    451 	struct sta_info *sta;
    452 
    453 	sta = ap_get_sta(hapd, addr);
    454 	if (sta)
    455 		return sta;
    456 
    457 	wpa_printf(MSG_DEBUG, "  New STA");
    458 	if (hapd->num_sta >= hapd->conf->max_num_sta) {
    459 		/* FIX: might try to remove some old STAs first? */
    460 		wpa_printf(MSG_DEBUG, "no more room for new STAs (%d/%d)",
    461 			   hapd->num_sta, hapd->conf->max_num_sta);
    462 		return NULL;
    463 	}
    464 
    465 	sta = os_zalloc(sizeof(struct sta_info));
    466 	if (sta == NULL) {
    467 		wpa_printf(MSG_ERROR, "malloc failed");
    468 		return NULL;
    469 	}
    470 	sta->acct_interim_interval = hapd->conf->acct_interim_interval;
    471 
    472 	/* initialize STA info data */
    473 	eloop_register_timeout(hapd->conf->ap_max_inactivity, 0,
    474 			       ap_handle_timer, hapd, sta);
    475 	os_memcpy(sta->addr, addr, ETH_ALEN);
    476 	sta->next = hapd->sta_list;
    477 	hapd->sta_list = sta;
    478 	hapd->num_sta++;
    479 	ap_sta_hash_add(hapd, sta);
    480 	sta->ssid = &hapd->conf->ssid;
    481 	ap_sta_remove_in_other_bss(hapd, sta);
    482 
    483 	return sta;
    484 }
    485 
    486 
    487 static int ap_sta_remove(struct hostapd_data *hapd, struct sta_info *sta)
    488 {
    489 	ieee802_1x_notify_port_enabled(sta->eapol_sm, 0);
    490 
    491 	wpa_printf(MSG_DEBUG, "Removing STA " MACSTR " from kernel driver",
    492 		   MAC2STR(sta->addr));
    493 	if (hostapd_drv_sta_remove(hapd, sta->addr) &&
    494 	    sta->flags & WLAN_STA_ASSOC) {
    495 		wpa_printf(MSG_DEBUG, "Could not remove station " MACSTR
    496 			   " from kernel driver.", MAC2STR(sta->addr));
    497 		return -1;
    498 	}
    499 	return 0;
    500 }
    501 
    502 
    503 static void ap_sta_remove_in_other_bss(struct hostapd_data *hapd,
    504 				       struct sta_info *sta)
    505 {
    506 	struct hostapd_iface *iface = hapd->iface;
    507 	size_t i;
    508 
    509 	for (i = 0; i < iface->num_bss; i++) {
    510 		struct hostapd_data *bss = iface->bss[i];
    511 		struct sta_info *sta2;
    512 		/* bss should always be set during operation, but it may be
    513 		 * NULL during reconfiguration. Assume the STA is not
    514 		 * associated to another BSS in that case to avoid NULL pointer
    515 		 * dereferences. */
    516 		if (bss == hapd || bss == NULL)
    517 			continue;
    518 		sta2 = ap_get_sta(bss, sta->addr);
    519 		if (!sta2)
    520 			continue;
    521 
    522 		ap_sta_disconnect(bss, sta2, sta2->addr,
    523 				  WLAN_REASON_PREV_AUTH_NOT_VALID);
    524 	}
    525 }
    526 
    527 
    528 void ap_sta_disassociate(struct hostapd_data *hapd, struct sta_info *sta,
    529 			 u16 reason)
    530 {
    531 	wpa_printf(MSG_DEBUG, "%s: disassociate STA " MACSTR,
    532 		   hapd->conf->iface, MAC2STR(sta->addr));
    533 	sta->flags &= ~WLAN_STA_ASSOC;
    534 	ap_sta_remove(hapd, sta);
    535 	sta->timeout_next = STA_DEAUTH;
    536 	eloop_cancel_timeout(ap_handle_timer, hapd, sta);
    537 	eloop_register_timeout(AP_MAX_INACTIVITY_AFTER_DISASSOC, 0,
    538 			       ap_handle_timer, hapd, sta);
    539 	accounting_sta_stop(hapd, sta);
    540 	ieee802_1x_free_station(sta);
    541 
    542 	mlme_disassociate_indication(hapd, sta, reason);
    543 }
    544 
    545 
    546 void ap_sta_deauthenticate(struct hostapd_data *hapd, struct sta_info *sta,
    547 			   u16 reason)
    548 {
    549 	wpa_printf(MSG_DEBUG, "%s: deauthenticate STA " MACSTR,
    550 		   hapd->conf->iface, MAC2STR(sta->addr));
    551 	sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC);
    552 	ap_sta_remove(hapd, sta);
    553 	sta->timeout_next = STA_REMOVE;
    554 	eloop_cancel_timeout(ap_handle_timer, hapd, sta);
    555 	eloop_register_timeout(AP_MAX_INACTIVITY_AFTER_DEAUTH, 0,
    556 			       ap_handle_timer, hapd, sta);
    557 	accounting_sta_stop(hapd, sta);
    558 	ieee802_1x_free_station(sta);
    559 
    560 	mlme_deauthenticate_indication(hapd, sta, reason);
    561 }
    562 
    563 
    564 int ap_sta_bind_vlan(struct hostapd_data *hapd, struct sta_info *sta,
    565 		     int old_vlanid)
    566 {
    567 #ifndef CONFIG_NO_VLAN
    568 	const char *iface;
    569 	struct hostapd_vlan *vlan = NULL;
    570 	int ret;
    571 
    572 	/*
    573 	 * Do not proceed furthur if the vlan id remains same. We do not want
    574 	 * duplicate dynamic vlan entries.
    575 	 */
    576 	if (sta->vlan_id == old_vlanid)
    577 		return 0;
    578 
    579 	/*
    580 	 * During 1x reauth, if the vlan id changes, then remove the old id and
    581 	 * proceed furthur to add the new one.
    582 	 */
    583 	if (old_vlanid > 0)
    584 		vlan_remove_dynamic(hapd, old_vlanid);
    585 
    586 	iface = hapd->conf->iface;
    587 	if (sta->ssid->vlan[0])
    588 		iface = sta->ssid->vlan;
    589 
    590 	if (sta->ssid->dynamic_vlan == DYNAMIC_VLAN_DISABLED)
    591 		sta->vlan_id = 0;
    592 	else if (sta->vlan_id > 0) {
    593 		vlan = hapd->conf->vlan;
    594 		while (vlan) {
    595 			if (vlan->vlan_id == sta->vlan_id ||
    596 			    vlan->vlan_id == VLAN_ID_WILDCARD) {
    597 				iface = vlan->ifname;
    598 				break;
    599 			}
    600 			vlan = vlan->next;
    601 		}
    602 	}
    603 
    604 	if (sta->vlan_id > 0 && vlan == NULL) {
    605 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
    606 			       HOSTAPD_LEVEL_DEBUG, "could not find VLAN for "
    607 			       "binding station to (vlan_id=%d)",
    608 			       sta->vlan_id);
    609 		return -1;
    610 	} else if (sta->vlan_id > 0 && vlan->vlan_id == VLAN_ID_WILDCARD) {
    611 		vlan = vlan_add_dynamic(hapd, vlan, sta->vlan_id);
    612 		if (vlan == NULL) {
    613 			hostapd_logger(hapd, sta->addr,
    614 				       HOSTAPD_MODULE_IEEE80211,
    615 				       HOSTAPD_LEVEL_DEBUG, "could not add "
    616 				       "dynamic VLAN interface for vlan_id=%d",
    617 				       sta->vlan_id);
    618 			return -1;
    619 		}
    620 
    621 		iface = vlan->ifname;
    622 		if (vlan_setup_encryption_dyn(hapd, sta->ssid, iface) != 0) {
    623 			hostapd_logger(hapd, sta->addr,
    624 				       HOSTAPD_MODULE_IEEE80211,
    625 				       HOSTAPD_LEVEL_DEBUG, "could not "
    626 				       "configure encryption for dynamic VLAN "
    627 				       "interface for vlan_id=%d",
    628 				       sta->vlan_id);
    629 		}
    630 
    631 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
    632 			       HOSTAPD_LEVEL_DEBUG, "added new dynamic VLAN "
    633 			       "interface '%s'", iface);
    634 	} else if (vlan && vlan->vlan_id == sta->vlan_id) {
    635 		if (sta->vlan_id > 0) {
    636 			vlan->dynamic_vlan++;
    637 			hostapd_logger(hapd, sta->addr,
    638 				       HOSTAPD_MODULE_IEEE80211,
    639 				       HOSTAPD_LEVEL_DEBUG, "updated existing "
    640 				       "dynamic VLAN interface '%s'", iface);
    641 		}
    642 
    643 		/*
    644 		 * Update encryption configuration for statically generated
    645 		 * VLAN interface. This is only used for static WEP
    646 		 * configuration for the case where hostapd did not yet know
    647 		 * which keys are to be used when the interface was added.
    648 		 */
    649 		if (vlan_setup_encryption_dyn(hapd, sta->ssid, iface) != 0) {
    650 			hostapd_logger(hapd, sta->addr,
    651 				       HOSTAPD_MODULE_IEEE80211,
    652 				       HOSTAPD_LEVEL_DEBUG, "could not "
    653 				       "configure encryption for VLAN "
    654 				       "interface for vlan_id=%d",
    655 				       sta->vlan_id);
    656 		}
    657 	}
    658 
    659 	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
    660 		       HOSTAPD_LEVEL_DEBUG, "binding station to interface "
    661 		       "'%s'", iface);
    662 
    663 	if (wpa_auth_sta_set_vlan(sta->wpa_sm, sta->vlan_id) < 0)
    664 		wpa_printf(MSG_INFO, "Failed to update VLAN-ID for WPA");
    665 
    666 	ret = hostapd_drv_set_sta_vlan(iface, hapd, sta->addr, sta->vlan_id);
    667 	if (ret < 0) {
    668 		hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
    669 			       HOSTAPD_LEVEL_DEBUG, "could not bind the STA "
    670 			       "entry to vlan_id=%d", sta->vlan_id);
    671 	}
    672 	return ret;
    673 #else /* CONFIG_NO_VLAN */
    674 	return 0;
    675 #endif /* CONFIG_NO_VLAN */
    676 }
    677 
    678 
    679 #ifdef CONFIG_IEEE80211W
    680 
    681 int ap_check_sa_query_timeout(struct hostapd_data *hapd, struct sta_info *sta)
    682 {
    683 	u32 tu;
    684 	struct os_time now, passed;
    685 	os_get_time(&now);
    686 	os_time_sub(&now, &sta->sa_query_start, &passed);
    687 	tu = (passed.sec * 1000000 + passed.usec) / 1024;
    688 	if (hapd->conf->assoc_sa_query_max_timeout < tu) {
    689 		hostapd_logger(hapd, sta->addr,
    690 			       HOSTAPD_MODULE_IEEE80211,
    691 			       HOSTAPD_LEVEL_DEBUG,
    692 			       "association SA Query timed out");
    693 		sta->sa_query_timed_out = 1;
    694 		os_free(sta->sa_query_trans_id);
    695 		sta->sa_query_trans_id = NULL;
    696 		sta->sa_query_count = 0;
    697 		eloop_cancel_timeout(ap_sa_query_timer, hapd, sta);
    698 		return 1;
    699 	}
    700 
    701 	return 0;
    702 }
    703 
    704 
    705 static void ap_sa_query_timer(void *eloop_ctx, void *timeout_ctx)
    706 {
    707 	struct hostapd_data *hapd = eloop_ctx;
    708 	struct sta_info *sta = timeout_ctx;
    709 	unsigned int timeout, sec, usec;
    710 	u8 *trans_id, *nbuf;
    711 
    712 	if (sta->sa_query_count > 0 &&
    713 	    ap_check_sa_query_timeout(hapd, sta))
    714 		return;
    715 
    716 	nbuf = os_realloc(sta->sa_query_trans_id,
    717 			  (sta->sa_query_count + 1) * WLAN_SA_QUERY_TR_ID_LEN);
    718 	if (nbuf == NULL)
    719 		return;
    720 	if (sta->sa_query_count == 0) {
    721 		/* Starting a new SA Query procedure */
    722 		os_get_time(&sta->sa_query_start);
    723 	}
    724 	trans_id = nbuf + sta->sa_query_count * WLAN_SA_QUERY_TR_ID_LEN;
    725 	sta->sa_query_trans_id = nbuf;
    726 	sta->sa_query_count++;
    727 
    728 	os_get_random(trans_id, WLAN_SA_QUERY_TR_ID_LEN);
    729 
    730 	timeout = hapd->conf->assoc_sa_query_retry_timeout;
    731 	sec = ((timeout / 1000) * 1024) / 1000;
    732 	usec = (timeout % 1000) * 1024;
    733 	eloop_register_timeout(sec, usec, ap_sa_query_timer, hapd, sta);
    734 
    735 	hostapd_logger(hapd, sta->addr, HOSTAPD_MODULE_IEEE80211,
    736 		       HOSTAPD_LEVEL_DEBUG,
    737 		       "association SA Query attempt %d", sta->sa_query_count);
    738 
    739 #ifdef NEED_AP_MLME
    740 	ieee802_11_send_sa_query_req(hapd, sta->addr, trans_id);
    741 #endif /* NEED_AP_MLME */
    742 }
    743 
    744 
    745 void ap_sta_start_sa_query(struct hostapd_data *hapd, struct sta_info *sta)
    746 {
    747 	ap_sa_query_timer(hapd, sta);
    748 }
    749 
    750 
    751 void ap_sta_stop_sa_query(struct hostapd_data *hapd, struct sta_info *sta)
    752 {
    753 	eloop_cancel_timeout(ap_sa_query_timer, hapd, sta);
    754 	os_free(sta->sa_query_trans_id);
    755 	sta->sa_query_trans_id = NULL;
    756 	sta->sa_query_count = 0;
    757 }
    758 
    759 #endif /* CONFIG_IEEE80211W */
    760 
    761 
    762 void ap_sta_set_authorized(struct hostapd_data *hapd, struct sta_info *sta,
    763 			   int authorized)
    764 {
    765 	if (!!authorized == !!(sta->flags & WLAN_STA_AUTHORIZED))
    766 		return;
    767 
    768 	if (authorized)
    769 		sta->flags |= WLAN_STA_AUTHORIZED;
    770 	else
    771 		sta->flags &= ~WLAN_STA_AUTHORIZED;
    772 
    773 	if (hapd->sta_authorized_cb)
    774 		hapd->sta_authorized_cb(hapd->sta_authorized_cb_ctx,
    775 					sta->addr, authorized);
    776 }
    777 
    778 
    779 void ap_sta_disconnect(struct hostapd_data *hapd, struct sta_info *sta,
    780 		       const u8 *addr, u16 reason)
    781 {
    782 
    783 	if (sta == NULL && addr)
    784 		sta = ap_get_sta(hapd, addr);
    785 
    786 	if (addr)
    787 		hostapd_drv_sta_deauth(hapd, addr, reason);
    788 
    789 	if (sta == NULL)
    790 		return;
    791 	ap_sta_set_authorized(hapd, sta, 0);
    792 	sta->flags &= ~(WLAN_STA_AUTH | WLAN_STA_ASSOC);
    793 	eloop_cancel_timeout(ap_handle_timer, hapd, sta);
    794 	eloop_register_timeout(0, 0, ap_handle_timer, hapd, sta);
    795 	sta->timeout_next = STA_REMOVE;
    796 }
    797