wlantest: Do not add new BSS/STA entries based on ctrl commands
Introduce bss_find()/sta_find() as an alternative bss_get()/sta_get() command that do not allocate new BSS/STA entry if no existing entry is found.
This commit is contained in:
parent
fbdd21327e
commit
57f7d03f91
4 changed files with 43 additions and 17 deletions
|
@ -21,6 +21,19 @@
|
||||||
#include "wlantest.h"
|
#include "wlantest.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct wlantest_bss * bss_find(struct wlantest *wt, const u8 *bssid)
|
||||||
|
{
|
||||||
|
struct wlantest_bss *bss;
|
||||||
|
|
||||||
|
dl_list_for_each(bss, &wt->bss, struct wlantest_bss, list) {
|
||||||
|
if (os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0)
|
||||||
|
return bss;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct wlantest_bss * bss_get(struct wlantest *wt, const u8 *bssid)
|
struct wlantest_bss * bss_get(struct wlantest *wt, const u8 *bssid)
|
||||||
{
|
{
|
||||||
struct wlantest_bss *bss;
|
struct wlantest_bss *bss;
|
||||||
|
@ -28,10 +41,9 @@ struct wlantest_bss * bss_get(struct wlantest *wt, const u8 *bssid)
|
||||||
if (bssid[0] & 0x01)
|
if (bssid[0] & 0x01)
|
||||||
return NULL; /* Skip group addressed frames */
|
return NULL; /* Skip group addressed frames */
|
||||||
|
|
||||||
dl_list_for_each(bss, &wt->bss, struct wlantest_bss, list) {
|
bss = bss_find(wt, bssid);
|
||||||
if (os_memcmp(bss->bssid, bssid, ETH_ALEN) == 0)
|
if (bss)
|
||||||
return bss;
|
return bss;
|
||||||
}
|
|
||||||
|
|
||||||
bss = os_zalloc(sizeof(*bss));
|
bss = os_zalloc(sizeof(*bss));
|
||||||
if (bss == NULL)
|
if (bss == NULL)
|
||||||
|
|
|
@ -180,7 +180,7 @@ static void ctrl_list_sta(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bss = bss_get(wt, bssid);
|
bss = bss_find(wt, bssid);
|
||||||
if (bss == NULL) {
|
if (bss == NULL) {
|
||||||
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
||||||
return;
|
return;
|
||||||
|
@ -228,7 +228,7 @@ static void ctrl_clear_sta_counters(struct wlantest *wt, int sock, u8 *cmd,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bss = bss_get(wt, addr);
|
bss = bss_find(wt, addr);
|
||||||
if (bss == NULL) {
|
if (bss == NULL) {
|
||||||
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
||||||
return;
|
return;
|
||||||
|
@ -240,7 +240,7 @@ static void ctrl_clear_sta_counters(struct wlantest *wt, int sock, u8 *cmd,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sta = sta_get(bss, addr);
|
sta = sta_find(bss, addr);
|
||||||
if (sta == NULL) {
|
if (sta == NULL) {
|
||||||
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
||||||
return;
|
return;
|
||||||
|
@ -264,7 +264,7 @@ static void ctrl_clear_bss_counters(struct wlantest *wt, int sock, u8 *cmd,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bss = bss_get(wt, addr);
|
bss = bss_find(wt, addr);
|
||||||
if (bss == NULL) {
|
if (bss == NULL) {
|
||||||
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
||||||
return;
|
return;
|
||||||
|
@ -291,7 +291,7 @@ static void ctrl_get_sta_counter(struct wlantest *wt, int sock, u8 *cmd,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bss = bss_get(wt, addr);
|
bss = bss_find(wt, addr);
|
||||||
if (bss == NULL) {
|
if (bss == NULL) {
|
||||||
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
||||||
return;
|
return;
|
||||||
|
@ -303,7 +303,7 @@ static void ctrl_get_sta_counter(struct wlantest *wt, int sock, u8 *cmd,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
sta = sta_get(bss, addr);
|
sta = sta_find(bss, addr);
|
||||||
if (sta == NULL) {
|
if (sta == NULL) {
|
||||||
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
||||||
return;
|
return;
|
||||||
|
@ -345,7 +345,7 @@ static void ctrl_get_bss_counter(struct wlantest *wt, int sock, u8 *cmd,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bss = bss_get(wt, addr);
|
bss = bss_find(wt, addr);
|
||||||
if (bss == NULL) {
|
if (bss == NULL) {
|
||||||
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
||||||
return;
|
return;
|
||||||
|
@ -614,7 +614,7 @@ static void ctrl_inject(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bss = bss_get(wt, bssid);
|
bss = bss_find(wt, bssid);
|
||||||
if (bss == NULL) {
|
if (bss == NULL) {
|
||||||
wpa_printf(MSG_INFO, "BSS not found for inject command");
|
wpa_printf(MSG_INFO, "BSS not found for inject command");
|
||||||
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
ctrl_send_simple(wt, sock, WLANTEST_CTRL_FAILURE);
|
||||||
|
@ -629,7 +629,7 @@ static void ctrl_inject(struct wlantest *wt, int sock, u8 *cmd, size_t clen)
|
||||||
return;
|
return;
|
||||||
} sta = NULL;
|
} sta = NULL;
|
||||||
} else {
|
} else {
|
||||||
sta = sta_get(bss, sta_addr);
|
sta = sta_find(bss, sta_addr);
|
||||||
if (sta == NULL) {
|
if (sta == NULL) {
|
||||||
wpa_printf(MSG_INFO, "Station not found for inject "
|
wpa_printf(MSG_INFO, "Station not found for inject "
|
||||||
"command");
|
"command");
|
||||||
|
|
|
@ -20,6 +20,19 @@
|
||||||
#include "wlantest.h"
|
#include "wlantest.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct wlantest_sta * sta_find(struct wlantest_bss *bss, const u8 *addr)
|
||||||
|
{
|
||||||
|
struct wlantest_sta *sta;
|
||||||
|
|
||||||
|
dl_list_for_each(sta, &bss->sta, struct wlantest_sta, list) {
|
||||||
|
if (os_memcmp(sta->addr, addr, ETH_ALEN) == 0)
|
||||||
|
return sta;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct wlantest_sta * sta_get(struct wlantest_bss *bss, const u8 *addr)
|
struct wlantest_sta * sta_get(struct wlantest_bss *bss, const u8 *addr)
|
||||||
{
|
{
|
||||||
struct wlantest_sta *sta;
|
struct wlantest_sta *sta;
|
||||||
|
@ -27,10 +40,9 @@ struct wlantest_sta * sta_get(struct wlantest_bss *bss, const u8 *addr)
|
||||||
if (addr[0] & 0x01)
|
if (addr[0] & 0x01)
|
||||||
return NULL; /* Skip group addressed frames */
|
return NULL; /* Skip group addressed frames */
|
||||||
|
|
||||||
dl_list_for_each(sta, &bss->sta, struct wlantest_sta, list) {
|
sta = sta_find(bss, addr);
|
||||||
if (os_memcmp(sta->addr, addr, ETH_ALEN) == 0)
|
if (sta)
|
||||||
return sta;
|
return sta;
|
||||||
}
|
|
||||||
|
|
||||||
sta = os_zalloc(sizeof(*sta));
|
sta = os_zalloc(sizeof(*sta));
|
||||||
if (sta == NULL)
|
if (sta == NULL)
|
||||||
|
|
|
@ -153,6 +153,7 @@ void monitor_deinit(struct wlantest *wt);
|
||||||
void rx_mgmt(struct wlantest *wt, const u8 *data, size_t len);
|
void rx_mgmt(struct wlantest *wt, const u8 *data, size_t len);
|
||||||
void rx_data(struct wlantest *wt, const u8 *data, size_t len);
|
void rx_data(struct wlantest *wt, const u8 *data, size_t len);
|
||||||
|
|
||||||
|
struct wlantest_bss * bss_find(struct wlantest *wt, const u8 *bssid);
|
||||||
struct wlantest_bss * bss_get(struct wlantest *wt, const u8 *bssid);
|
struct wlantest_bss * bss_get(struct wlantest *wt, const u8 *bssid);
|
||||||
void bss_deinit(struct wlantest_bss *bss);
|
void bss_deinit(struct wlantest_bss *bss);
|
||||||
void bss_update(struct wlantest *wt, struct wlantest_bss *bss,
|
void bss_update(struct wlantest *wt, struct wlantest_bss *bss,
|
||||||
|
@ -160,6 +161,7 @@ void bss_update(struct wlantest *wt, struct wlantest_bss *bss,
|
||||||
void bss_flush(struct wlantest *wt);
|
void bss_flush(struct wlantest *wt);
|
||||||
void pmk_deinit(struct wlantest_pmk *pmk);
|
void pmk_deinit(struct wlantest_pmk *pmk);
|
||||||
|
|
||||||
|
struct wlantest_sta * sta_find(struct wlantest_bss *bss, const u8 *addr);
|
||||||
struct wlantest_sta * sta_get(struct wlantest_bss *bss, const u8 *addr);
|
struct wlantest_sta * sta_get(struct wlantest_bss *bss, const u8 *addr);
|
||||||
void sta_deinit(struct wlantest_sta *sta);
|
void sta_deinit(struct wlantest_sta *sta);
|
||||||
void sta_update_assoc(struct wlantest_sta *sta,
|
void sta_update_assoc(struct wlantest_sta *sta,
|
||||||
|
|
Loading…
Reference in a new issue