1 /* 2 * AP mode helper functions 3 * Copyright (c) 2009, 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 #include "includes.h" 10 11 #include "common.h" 12 #include "common/ieee802_11_defs.h" 13 #include "sta_info.h" 14 #include "hostapd.h" 15 16 17 int hostapd_register_probereq_cb(struct hostapd_data *hapd, 18 int (*cb)(void *ctx, const u8 *sa, 19 const u8 *da, const u8 *bssid, 20 const u8 *ie, size_t ie_len, 21 int ssi_signal), 22 void *ctx) 23 { 24 struct hostapd_probereq_cb *n; 25 26 n = os_realloc_array(hapd->probereq_cb, hapd->num_probereq_cb + 1, 27 sizeof(struct hostapd_probereq_cb)); 28 if (n == NULL) 29 return -1; 30 31 hapd->probereq_cb = n; 32 n = &hapd->probereq_cb[hapd->num_probereq_cb]; 33 hapd->num_probereq_cb++; 34 35 n->cb = cb; 36 n->ctx = ctx; 37 38 return 0; 39 } 40 41 42 struct prune_data { 43 struct hostapd_data *hapd; 44 const u8 *addr; 45 }; 46 47 static int prune_associations(struct hostapd_iface *iface, void *ctx) 48 { 49 struct prune_data *data = ctx; 50 struct sta_info *osta; 51 struct hostapd_data *ohapd; 52 size_t j; 53 54 for (j = 0; j < iface->num_bss; j++) { 55 ohapd = iface->bss[j]; 56 if (ohapd == data->hapd) 57 continue; 58 osta = ap_get_sta(ohapd, data->addr); 59 if (!osta) 60 continue; 61 62 wpa_printf(MSG_INFO, "%s: Prune association for " MACSTR, 63 ohapd->conf->iface, MAC2STR(osta->addr)); 64 ap_sta_disassociate(ohapd, osta, WLAN_REASON_UNSPECIFIED); 65 } 66 67 return 0; 68 } 69 70 /** 71 * hostapd_prune_associations - Remove extraneous associations 72 * @hapd: Pointer to BSS data for the most recent association 73 * @addr: Associated STA address 74 * 75 * This function looks through all radios and BSS's for previous 76 * (stale) associations of STA. If any are found they are removed. 77 */ 78 void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr) 79 { 80 struct prune_data data; 81 data.hapd = hapd; 82 data.addr = addr; 83 if (hapd->iface->interfaces && 84 hapd->iface->interfaces->for_each_interface) 85 hapd->iface->interfaces->for_each_interface( 86 hapd->iface->interfaces, prune_associations, &data); 87 } 88