]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Report offchannel RX frame frequency to hostapd
authorJouni Malinen <jouni@codeaurora.org>
Mon, 8 Jan 2018 01:37:48 +0000 (03:37 +0200)
committerJouni Malinen <jouni@qca.qualcomm.com>
Mon, 8 Jan 2018 01:37:48 +0000 (03:37 +0200)
Not all code paths for management frame RX reporting delivered the
correct frequency for offchannel RX cases. This is needed mainly for
Public Action frame processing in some special cases where AP is
operating, but an exchange is done on a non-operational channel. For
example, DPP Initiator role may need to do this.

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
src/ap/drv_callbacks.c
src/ap/hostapd.h
src/ap/ieee802_11.c

index c4553600233529c637898b43e99de33f5444a90b..4858cd5dc2c04f69f433cffefae960fa97a0b30b 100644 (file)
@@ -1114,6 +1114,7 @@ static int hostapd_mgmt_rx(struct hostapd_data *hapd, struct rx_mgmt *rx_mgmt)
        }
 
        os_memset(&fi, 0, sizeof(fi));
+       fi.freq = rx_mgmt->freq;
        fi.datarate = rx_mgmt->datarate;
        fi.ssi_signal = rx_mgmt->ssi_signal;
 
index 0e35ee80a5169490889962195cc7eec8f72462d9..32de734ff80a084ef93db35b66e8bbaae3715d13 100644 (file)
@@ -85,6 +85,7 @@ struct hostapd_rate_data {
 };
 
 struct hostapd_frame_info {
+       unsigned int freq;
        u32 channel;
        u32 datarate;
        int ssi_signal; /* dBm */
index f6cea4017dde9abfd238098d09a851bfba2da384..27520fee561f61781a33d109e86aa477968925a7 100644 (file)
@@ -3604,7 +3604,8 @@ static int robust_action_frame(u8 category)
 
 
 static int handle_action(struct hostapd_data *hapd,
-                        const struct ieee80211_mgmt *mgmt, size_t len)
+                        const struct ieee80211_mgmt *mgmt, size_t len,
+                        unsigned int freq)
 {
        struct sta_info *sta;
        sta = ap_get_sta(hapd, mgmt->sa);
@@ -3713,7 +3714,7 @@ static int handle_action(struct hostapd_data *hapd,
                        pos = mgmt->u.action.u.vs_public_action.oui;
                        end = ((const u8 *) mgmt) + len;
                        hostapd_dpp_rx_action(hapd, mgmt->sa, pos, end - pos,
-                                             hapd->iface->freq);
+                                             freq);
                        return 1;
                }
                if (len >= IEEE80211_HDRLEN + 2 &&
@@ -3812,10 +3813,16 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len,
        struct ieee80211_mgmt *mgmt;
        u16 fc, stype;
        int ret = 0;
+       unsigned int freq;
 
        if (len < 24)
                return 0;
 
+       if (fi && fi->freq)
+               freq = fi->freq;
+       else
+               freq = hapd->iface->freq;
+
        mgmt = (struct ieee80211_mgmt *) buf;
        fc = le_to_host16(mgmt->frame_control);
        stype = WLAN_FC_GET_STYPE(fc);
@@ -3887,7 +3894,7 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len,
                break;
        case WLAN_FC_STYPE_ACTION:
                wpa_printf(MSG_DEBUG, "mgmt::action");
-               ret = handle_action(hapd, mgmt, len);
+               ret = handle_action(hapd, mgmt, len, freq);
                break;
        default:
                hostapd_logger(hapd, mgmt->sa, HOSTAPD_MODULE_IEEE80211,