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