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 930 : 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 930 : n = os_realloc_array(hapd->probereq_cb, hapd->num_probereq_cb + 1,
28 : sizeof(struct hostapd_probereq_cb));
29 930 : if (n == NULL)
30 0 : return -1;
31 :
32 930 : hapd->probereq_cb = n;
33 930 : n = &hapd->probereq_cb[hapd->num_probereq_cb];
34 930 : hapd->num_probereq_cb++;
35 :
36 930 : n->cb = cb;
37 930 : n->ctx = ctx;
38 :
39 930 : return 0;
40 : }
41 :
42 :
43 : struct prune_data {
44 : struct hostapd_data *hapd;
45 : const u8 *addr;
46 : };
47 :
48 3593 : static int prune_associations(struct hostapd_iface *iface, void *ctx)
49 : {
50 3593 : struct prune_data *data = ctx;
51 : struct sta_info *osta;
52 : struct hostapd_data *ohapd;
53 : size_t j;
54 :
55 7416 : for (j = 0; j < iface->num_bss; j++) {
56 3823 : ohapd = iface->bss[j];
57 3823 : if (ohapd == data->hapd)
58 2872 : continue;
59 : #ifdef CONFIG_FST
60 : /* Don't prune STAs belong to same FST */
61 1213 : 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 704 : osta = ap_get_sta(ohapd, data->addr);
68 704 : if (!osta)
69 440 : continue;
70 :
71 1848 : wpa_printf(MSG_INFO, "%s: Prune association for " MACSTR,
72 1848 : ohapd->conf->iface, MAC2STR(osta->addr));
73 264 : ap_sta_disassociate(ohapd, osta, WLAN_REASON_UNSPECIFIED);
74 : }
75 :
76 3593 : 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 3307 : void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr)
88 : {
89 : struct prune_data data;
90 3307 : data.hapd = hapd;
91 3307 : data.addr = addr;
92 6179 : if (hapd->iface->interfaces &&
93 2872 : hapd->iface->interfaces->for_each_interface)
94 5744 : hapd->iface->interfaces->for_each_interface(
95 2872 : hapd->iface->interfaces, prune_associations, &data);
96 3307 : }
|