wlantest: Move bss_update() into bss.c
[mech_eap.git] / wlantest / bss.c
1 /*
2  * BSS list
3  * Copyright (c) 2010, Jouni Malinen <j@w1.fi>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  *
9  * Alternatively, this software may be distributed under the terms of BSD
10  * license.
11  *
12  * See README and COPYING for more details.
13  */
14
15 #include "utils/includes.h"
16
17 #include "utils/common.h"
18 #include "common/ieee802_11_common.h"
19 #include "wlantest.h"
20
21
22 struct wlantest_bss * bss_get(struct wlantest *wt, const u8 *bssid)
23 {
24         struct wlantest_bss *bss;
25
26         if (bssid[0] & 0x01)
27                 return NULL; /* Skip group addressed frames */
28
29         dl_list_for_each(bss, &wt->bss, struct wlantest_bss, list) {
30                 if (os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0)
31                         return bss;
32         }
33
34         bss = os_zalloc(sizeof(*bss));
35         if (bss == NULL)
36                 return NULL;
37         dl_list_init(&bss->sta);
38         os_memcpy(bss->bssid, bssid, ETH_ALEN);
39         dl_list_add(&wt->bss, &bss->list);
40         wpa_printf(MSG_DEBUG, "Discovered new BSS - " MACSTR,
41                    MAC2STR(bss->bssid));
42         return bss;
43 }
44
45
46 void bss_deinit(struct wlantest_bss *bss)
47 {
48         struct wlantest_sta *sta, *n;
49         dl_list_for_each_safe(sta, n, &bss->sta, struct wlantest_sta, list)
50                 sta_deinit(sta);
51         dl_list_del(&bss->list);
52         os_free(bss);
53 }
54
55
56 void bss_update(struct wlantest_bss *bss, struct ieee802_11_elems *elems)
57 {
58         if (elems->ssid == NULL || elems->ssid_len > 32) {
59                 wpa_printf(MSG_INFO, "Invalid or missing SSID in a Beacon "
60                            "frame for " MACSTR, MAC2STR(bss->bssid));
61                 bss->parse_error_reported = 1;
62                 return;
63         }
64
65         os_memcpy(bss->ssid, elems->ssid, elems->ssid_len);
66         bss->ssid_len = elems->ssid_len;
67
68         if (elems->rsn_ie == NULL) {
69                 if (bss->rsnie[0]) {
70                         wpa_printf(MSG_INFO, "BSS " MACSTR " - RSN IE removed",
71                                    MAC2STR(bss->bssid));
72                         bss->rsnie[0] = 0;
73                 }
74         } else {
75                 if (bss->rsnie[0] == 0 ||
76                     os_memcmp(bss->rsnie, elems->rsn_ie - 2,
77                               elems->rsn_ie_len + 2) != 0) {
78                         wpa_printf(MSG_INFO, "BSS " MACSTR " - RSN IE "
79                                    "stored", MAC2STR(bss->bssid));
80                         wpa_hexdump(MSG_DEBUG, "RSN IE", elems->rsn_ie - 2,
81                                     elems->rsn_ie_len + 2);
82                 }
83                 os_memcpy(bss->rsnie, elems->rsn_ie - 2,
84                           elems->rsn_ie_len + 2);
85         }
86
87         if (elems->wpa_ie == NULL) {
88                 if (bss->wpaie[0]) {
89                         wpa_printf(MSG_INFO, "BSS " MACSTR " - WPA IE removed",
90                                    MAC2STR(bss->bssid));
91                         bss->wpaie[0] = 0;
92                 }
93         } else {
94                 if (bss->wpaie[0] == 0 ||
95                     os_memcmp(bss->wpaie, elems->wpa_ie - 2,
96                               elems->wpa_ie_len + 2) != 0) {
97                         wpa_printf(MSG_INFO, "BSS " MACSTR " - WPA IE "
98                                    "stored", MAC2STR(bss->bssid));
99                         wpa_hexdump(MSG_DEBUG, "WPA IE", elems->wpa_ie - 2,
100                                     elems->wpa_ie_len + 2);
101                 }
102                 os_memcpy(bss->wpaie, elems->wpa_ie - 2,
103                           elems->wpa_ie_len + 2);
104         }
105 }