bss.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. #include "utils/includes.h"
  15. #include "utils/common.h"
  16. #include "common/ieee802_11_common.h"
  17. #include "wlantest.h"
  18. struct wlantest_bss * bss_get(struct wlantest *wt, const u8 *bssid)
  19. {
  20. struct wlantest_bss *bss;
  21. if (bssid[0] & 0x01)
  22. return NULL; /* Skip group addressed frames */
  23. dl_list_for_each(bss, &wt->bss, struct wlantest_bss, list) {
  24. if (os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0)
  25. return bss;
  26. }
  27. bss = os_zalloc(sizeof(*bss));
  28. if (bss == NULL)
  29. return NULL;
  30. dl_list_init(&bss->sta);
  31. os_memcpy(bss->bssid, bssid, ETH_ALEN);
  32. dl_list_add(&wt->bss, &bss->list);
  33. wpa_printf(MSG_DEBUG, "Discovered new BSS - " MACSTR,
  34. MAC2STR(bss->bssid));
  35. return bss;
  36. }
  37. void bss_deinit(struct wlantest_bss *bss)
  38. {
  39. struct wlantest_sta *sta, *n;
  40. dl_list_for_each_safe(sta, n, &bss->sta, struct wlantest_sta, list)
  41. sta_deinit(sta);
  42. dl_list_del(&bss->list);
  43. os_free(bss);
  44. }
  45. void bss_update(struct wlantest_bss *bss, struct ieee802_11_elems *elems)
  46. {
  47. if (elems->ssid == NULL || elems->ssid_len > 32) {
  48. wpa_printf(MSG_INFO, "Invalid or missing SSID in a Beacon "
  49. "frame for " MACSTR, MAC2STR(bss->bssid));
  50. bss->parse_error_reported = 1;
  51. return;
  52. }
  53. os_memcpy(bss->ssid, elems->ssid, elems->ssid_len);
  54. bss->ssid_len = elems->ssid_len;
  55. if (elems->rsn_ie == NULL) {
  56. if (bss->rsnie[0]) {
  57. wpa_printf(MSG_INFO, "BSS " MACSTR " - RSN IE removed",
  58. MAC2STR(bss->bssid));
  59. bss->rsnie[0] = 0;
  60. }
  61. } else {
  62. if (bss->rsnie[0] == 0 ||
  63. os_memcmp(bss->rsnie, elems->rsn_ie - 2,
  64. elems->rsn_ie_len + 2) != 0) {
  65. wpa_printf(MSG_INFO, "BSS " MACSTR " - RSN IE "
  66. "stored", MAC2STR(bss->bssid));
  67. wpa_hexdump(MSG_DEBUG, "RSN IE", elems->rsn_ie - 2,
  68. elems->rsn_ie_len + 2);
  69. }
  70. os_memcpy(bss->rsnie, elems->rsn_ie - 2,
  71. elems->rsn_ie_len + 2);
  72. }
  73. if (elems->wpa_ie == NULL) {
  74. if (bss->wpaie[0]) {
  75. wpa_printf(MSG_INFO, "BSS " MACSTR " - WPA IE removed",
  76. MAC2STR(bss->bssid));
  77. bss->wpaie[0] = 0;
  78. }
  79. } else {
  80. if (bss->wpaie[0] == 0 ||
  81. os_memcmp(bss->wpaie, elems->wpa_ie - 2,
  82. elems->wpa_ie_len + 2) != 0) {
  83. wpa_printf(MSG_INFO, "BSS " MACSTR " - WPA IE "
  84. "stored", MAC2STR(bss->bssid));
  85. wpa_hexdump(MSG_DEBUG, "WPA IE", elems->wpa_ie - 2,
  86. elems->wpa_ie_len + 2);
  87. }
  88. os_memcpy(bss->wpaie, elems->wpa_ie - 2,
  89. elems->wpa_ie_len + 2);
  90. }
  91. }