]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Process unprotected Beacon frame RX events
authorJouni Malinen <jouni@codeaurora.org>
Wed, 1 Apr 2020 13:06:32 +0000 (16:06 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 24 Apr 2020 14:10:09 +0000 (17:10 +0300)
Convert driver indications to internal events to allow invalid Beacon
frames to be reported to the AP.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
src/drivers/driver_nl80211_event.c

index 17a06d8f8438fc3c1e85955334aabcf815402b9d..1152312a82232c94a827fa374fa11d1e0fd1db3b 100644 (file)
@@ -137,6 +137,7 @@ static const char * nl80211_command_to_string(enum nl80211_commands cmd)
        C2S(NL80211_CMD_STA_OPMODE_CHANGED)
        C2S(NL80211_CMD_CONTROL_PORT_FRAME)
        C2S(NL80211_CMD_UPDATE_OWE_INFO)
+       C2S(NL80211_CMD_UNPROT_BEACON)
        default:
                return "NL80211_CMD_UNKNOWN";
        }
@@ -893,6 +894,23 @@ static void mlme_event_unprot_disconnect(struct wpa_driver_nl80211_data *drv,
 }
 
 
+static void mlme_event_unprot_beacon(struct wpa_driver_nl80211_data *drv,
+                                    const u8 *frame, size_t len)
+{
+       const struct ieee80211_mgmt *mgmt;
+       union wpa_event_data event;
+
+       if (len < 24)
+               return;
+
+       mgmt = (const struct ieee80211_mgmt *) frame;
+
+       os_memset(&event, 0, sizeof(event));
+       event.unprot_beacon.sa = mgmt->sa;
+       wpa_supplicant_event(drv->ctx, EVENT_UNPROT_BEACON, &event);
+}
+
+
 static void mlme_event(struct i802_bss *bss,
                       enum nl80211_commands cmd, struct nlattr *frame,
                       struct nlattr *addr, struct nlattr *timed_out,
@@ -974,6 +992,9 @@ static void mlme_event(struct i802_bss *bss,
                mlme_event_unprot_disconnect(drv, EVENT_UNPROT_DISASSOC,
                                             nla_data(frame), nla_len(frame));
                break;
+       case NL80211_CMD_UNPROT_BEACON:
+               mlme_event_unprot_beacon(drv, nla_data(frame), nla_len(frame));
+               break;
        default:
                break;
        }
@@ -2541,6 +2562,7 @@ static void do_process_drv_event(struct i802_bss *bss, int cmd,
 {
        struct wpa_driver_nl80211_data *drv = bss->drv;
        int external_scan_event = 0;
+       struct nlattr *frame = tb[NL80211_ATTR_FRAME];
 
        wpa_printf(MSG_DEBUG, "nl80211: Drv Event %d (%s) received for %s",
                   cmd, nl80211_command_to_string(cmd), bss->ifname);
@@ -2751,6 +2773,11 @@ static void do_process_drv_event(struct i802_bss *bss, int cmd,
        case NL80211_CMD_UPDATE_OWE_INFO:
                mlme_event_dh_event(drv, bss, tb);
                break;
+       case NL80211_CMD_UNPROT_BEACON:
+               if (frame)
+                       mlme_event_unprot_beacon(drv, nla_data(frame),
+                                                nla_len(frame));
+               break;
        default:
                wpa_dbg(drv->ctx, MSG_DEBUG, "nl80211: Ignored unknown event "
                        "(cmd=%d)", cmd);