]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Check ethertype for control port RX
authorMarkus Theil <markus.theil@tu-ilmenau.de>
Sat, 11 Apr 2020 10:25:18 +0000 (12:25 +0200)
committerJouni Malinen <j@w1.fi>
Sun, 19 Apr 2020 12:53:02 +0000 (15:53 +0300)
nl80211 control port event handling previously did not differentiate
between EAPOL and RSN preauth ethertypes. Add checking of the ethertype
and report unexpected frames (only EAPOL frames are supposed to be
delivered through this path).

Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
src/drivers/driver_nl80211_event.c

index d4ca2eb29b816ba53a124672f66a94a9caf75d6e..6c4fd68c954d6f4f8de87b31b86feb5f8f469684 100644 (file)
@@ -2505,12 +2505,34 @@ static void nl80211_sta_opmode_change_event(struct wpa_driver_nl80211_data *drv,
 static void nl80211_control_port_frame(struct wpa_driver_nl80211_data *drv,
                                       struct nlattr **tb)
 {
-       if (!tb[NL80211_ATTR_MAC] || !tb[NL80211_ATTR_FRAME])
+       u8 *src_addr;
+       u16 ethertype;
+
+       if (!tb[NL80211_ATTR_MAC] ||
+           !tb[NL80211_ATTR_FRAME] ||
+           !tb[NL80211_ATTR_CONTROL_PORT_ETHERTYPE])
                return;
 
-       drv_event_eapol_rx(drv->ctx, nla_data(tb[NL80211_ATTR_MAC]),
-                          nla_data(tb[NL80211_ATTR_FRAME]),
-                          nla_len(tb[NL80211_ATTR_FRAME]));
+       src_addr = nla_data(tb[NL80211_ATTR_MAC]);
+       ethertype = nla_get_u16(tb[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
+
+       switch (ethertype) {
+       case ETH_P_RSN_PREAUTH:
+               wpa_printf(MSG_INFO, "nl80211: Got pre-auth frame from "
+                          MACSTR " over control port unexpectedly",
+                          MAC2STR(src_addr));
+               break;
+       case ETH_P_PAE:
+               drv_event_eapol_rx(drv->ctx, src_addr,
+                                  nla_data(tb[NL80211_ATTR_FRAME]),
+                                  nla_len(tb[NL80211_ATTR_FRAME]));
+               break;
+       default:
+               wpa_printf(MSG_INFO, "nl80211: Unxpected ethertype 0x%04x from "
+                          MACSTR " over control port",
+                          ethertype, MAC2STR(src_addr));
+               break;
+       }
 }