--- src/drivers/driver_nl80211.c | 57 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 57 insertions(+), 0 deletions(-) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 4ced3cc..72e3e20 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -1595,6 +1595,27 @@ static void nl80211_client_probe_event(struct wpa_driver_nl80211_data *drv, } +static void nl80211_spurious_class3_frame(struct i802_bss *bss, + struct nlattr **tb) +{ + struct wpa_driver_nl80211_data *drv = bss->drv; + union wpa_event_data event; + u8 bssid[ETH_ALEN]; + + if (!tb[NL80211_ATTR_MAC]) + return; + + if (linux_get_ifhwaddr(drv->ioctl_sock, bss->ifname, bssid) < 0) + return; + + os_memset(&event, 0, sizeof(event)); + event.rx_from_unknown.bssid = bssid; + event.rx_from_unknown.addr = nla_data(tb[NL80211_ATTR_MAC]); + + wpa_supplicant_event(drv->ctx, EVENT_RX_FROM_UNKNOWN, &event); +} + + static int process_event(struct nl_msg *msg, void *arg) { struct i802_bss *bss = arg; @@ -1721,6 +1742,9 @@ static int process_event(struct nl_msg *msg, void *arg) case NL80211_CMD_PROBE_CLIENT: nl80211_client_probe_event(drv, tb); break; + case NL80211_CMD_UNEXPECTED_FRAME: + nl80211_spurious_class3_frame(bss, tb); + break; default: wpa_printf(MSG_DEBUG, "nl80211: Ignored unknown event " "(cmd=%d)", gnlh->cmd); @@ -2477,6 +2501,36 @@ static int nl80211_mgmt_subscribe_non_ap(struct i802_bss *bss) } +static int nl80211_register_spurious_class3(struct i802_bss *bss) +{ + struct wpa_driver_nl80211_data *drv = bss->drv; + struct nl_msg *msg; + int ret = -1; + + msg = nlmsg_alloc(); + if (!msg) + return -1; + + genlmsg_put(msg, 0, 0, genl_family_get_id(drv->nl80211), 0, 0, + NL80211_CMD_UNEXPECTED_FRAME, 0); + + NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, bss->ifindex); + + ret = send_and_recv(drv, bss->nl_mgmt.handle, msg, NULL, NULL); + msg = NULL; + if (ret) { + wpa_printf(MSG_DEBUG, "nl80211: Register spurious class3 " + "failed: ret=%d (%s)", + ret, strerror(-ret)); + goto nla_put_failure; + } + ret = 0; +nla_put_failure: + nlmsg_free(msg); + return ret; +} + + static int nl80211_mgmt_subscribe_ap(struct i802_bss *bss) { static const int stypes[] = { @@ -2508,6 +2562,9 @@ static int nl80211_mgmt_subscribe_ap(struct i802_bss *bss) } } + if (nl80211_register_spurious_class3(bss)) + goto out_err; + return 0; out_err: -- 1.7.6.3