Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / src / ap / utils.c
index 0ff48ae..fcb371b 100644 (file)
@@ -2,33 +2,30 @@
  * AP mode helper functions
  * Copyright (c) 2009, Jouni Malinen <j@w1.fi>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * Alternatively, this software may be distributed under the terms of BSD
- * license.
- *
- * See README and COPYING for more details.
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
  */
 
 #include "includes.h"
 
 #include "common.h"
 #include "common/ieee802_11_defs.h"
+#include "fst/fst.h"
 #include "sta_info.h"
 #include "hostapd.h"
 
 
 int hostapd_register_probereq_cb(struct hostapd_data *hapd,
                                 int (*cb)(void *ctx, const u8 *sa,
-                                          const u8 *ie, size_t ie_len),
+                                          const u8 *da, const u8 *bssid,
+                                          const u8 *ie, size_t ie_len,
+                                          int ssi_signal),
                                 void *ctx)
 {
        struct hostapd_probereq_cb *n;
 
-       n = os_realloc(hapd->probereq_cb, (hapd->num_probereq_cb + 1) *
-                      sizeof(struct hostapd_probereq_cb));
+       n = os_realloc_array(hapd->probereq_cb, hapd->num_probereq_cb + 1,
+                            sizeof(struct hostapd_probereq_cb));
        if (n == NULL)
                return -1;
 
@@ -59,10 +56,20 @@ static int prune_associations(struct hostapd_iface *iface, void *ctx)
                ohapd = iface->bss[j];
                if (ohapd == data->hapd)
                        continue;
+#ifdef CONFIG_FST
+               /* Don't prune STAs belong to same FST */
+               if (ohapd->iface->fst &&
+                   data->hapd->iface->fst &&
+                   fst_are_ifaces_aggregated(ohapd->iface->fst,
+                                             data->hapd->iface->fst))
+                       continue;
+#endif /* CONFIG_FST */
                osta = ap_get_sta(ohapd, data->addr);
                if (!osta)
                        continue;
 
+               wpa_printf(MSG_INFO, "%s: Prune association for " MACSTR,
+                          ohapd->conf->iface, MAC2STR(osta->addr));
                ap_sta_disassociate(ohapd, osta, WLAN_REASON_UNSPECIFIED);
        }
 
@@ -82,7 +89,8 @@ void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr)
        struct prune_data data;
        data.hapd = hapd;
        data.addr = addr;
-       if (hapd->iface->for_each_interface)
-               hapd->iface->for_each_interface(hapd->iface->interfaces,
-                                               prune_associations, &data);
+       if (hapd->iface->interfaces &&
+           hapd->iface->interfaces->for_each_interface)
+               hapd->iface->interfaces->for_each_interface(
+                       hapd->iface->interfaces, prune_associations, &data);
 }