LCOV - code coverage report
Current view: top level - src/ap - utils.c (source / functions) Hit Total Coverage
Test: wpa_supplicant/hostapd combined for hwsim test run 1443382998 Lines: 35 36 97.2 %
Date: 2015-09-27 Functions: 3 3 100.0 %

          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 : }

Generated by: LCOV version 1.10