From f73b1516984ac6f8818e1d687f2907676f224a86 Mon Sep 17 00:00:00 2001 From: Mathy Vanhoef Date: Fri, 26 Jun 2020 15:49:09 +0400 Subject: [PATCH] fragattack: add GET_CHANNEL to both wpa_s and hostapd --- hostapd/ctrl_iface.c | 21 +++++++++++++++++++++ wpa_supplicant/ctrl_iface.c | 23 +++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/hostapd/ctrl_iface.c b/hostapd/ctrl_iface.c index 530ed86bf..dc87c6f00 100644 --- a/hostapd/ctrl_iface.c +++ b/hostapd/ctrl_iface.c @@ -2476,6 +2476,25 @@ static int hostapd_get_gtk(struct hostapd_data *hapd, char *buf, size_t buflen) return pos; } + +static int hostapd_get_channel(struct hostapd_data *hapd, char *buf, size_t buflen) +{ + struct wpa_channel_info ci; + u8 op_class, channel; + + if (hostapd_drv_channel_info(hapd, &ci) != 0 || + ieee80211_chaninfo_to_channel(ci.frequency, ci.chanwidth, + ci.sec_channel, &op_class, + &channel) < 0) { + wpa_printf(MSG_WARNING, "Failed to get channel info from drive, falling " + "back to channel provided in the current config."); + channel = hapd->iconf->channel; + } + + return os_snprintf(buf, buflen, "%d\n", channel); +} + + #endif /* CONFIG_TESTING_OPTIONS */ @@ -3354,6 +3373,8 @@ static int hostapd_ctrl_iface_receive_process(struct hostapd_data *hapd, reply_len = hostapd_get_tk(hapd, buf + 7, reply, reply_size); } else if (os_strcmp(buf, "GET_GTK") == 0) { reply_len = hostapd_get_gtk(hapd, reply, reply_size); + } else if (os_strcmp(buf, "GET_CHANNEL") == 0) { + reply_len = hostapd_get_channel(hapd, reply, reply_size); #endif /* CONFIG_TESTING_OPTIONS */ } else if (os_strncmp(buf, "CHAN_SWITCH ", 12) == 0) { if (hostapd_ctrl_iface_chan_switch(hapd->iface, buf + 12)) diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index 7884f33f5..67c13b4fa 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -9445,6 +9445,27 @@ static int wpa_supplicant_ctrl_iface_get_gtk(struct wpa_supplicant *wpa_s, } +static int wpa_supplicant_ctrl_iface_get_channel(struct wpa_supplicant *wpa_s, + char *buf, size_t buflen) +{ + struct wpa_channel_info ci; + u8 op_class, channel; + + if (wpa_drv_channel_info(wpa_s, &ci) != 0 || + ieee80211_chaninfo_to_channel(ci.frequency, ci.chanwidth, + ci.sec_channel, &op_class, + &channel) < 0) { + wpa_printf(MSG_WARNING, "Failed to get channel info from drive, falling " + "back to channel provided in the current config. assoc_freq=%d", wpa_s->assoc_freq); + if (ieee80211_chaninfo_to_channel(wpa_s->assoc_freq, CHAN_WIDTH_20, 0, + &op_class, &channel) < 0) + return -1; + } + + return os_snprintf(buf, buflen, "%d\n", channel); +} + + static int wpas_ctrl_get_assoc_resp_ies(struct wpa_supplicant *wpa_s, char *buf, size_t buflen) { @@ -10833,6 +10854,8 @@ char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s, WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA); } else if (os_strcmp(buf, "GET_GTK") == 0) { reply_len = wpa_supplicant_ctrl_iface_get_gtk(wpa_s, reply, reply_size); + } else if (os_strcmp(buf, "GET_CHANNEL") == 0) { + reply_len = wpa_supplicant_ctrl_iface_get_channel(wpa_s, reply, reply_size); } else if (os_strcmp(buf, "GET_ASSOC_RESP_IES") == 0) { reply_len = wpas_ctrl_get_assoc_resp_ies(wpa_s, reply, reply_size); } else if (os_strncmp(buf, "SET_ASSOC_RESP_IES ", 19) == 0) {