]> git.ipfire.org Git - thirdparty/hostap.git/blobdiff - wpa_supplicant/events.c
DBus: Add ability to report probe requests
[thirdparty/hostap.git] / wpa_supplicant / events.c
index 139972b363b8fc850b7d75fc85100792f3c751dd..cd45cd19eb43bfab2afbe6e4d8288c8b76de2ad8 100644 (file)
@@ -2309,15 +2309,17 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                ap_rx_from_unknown_sta(wpa_s, data->rx_from_unknown.addr,
                                       data->rx_from_unknown.wds);
                break;
-       case EVENT_RX_MGMT:
+       case EVENT_RX_MGMT: {
+               u16 fc, stype;
+               const struct ieee80211_mgmt *mgmt;
+
+               mgmt = (const struct ieee80211_mgmt *)
+                       data->rx_mgmt.frame;
+               fc = le_to_host16(mgmt->frame_control);
+               stype = WLAN_FC_GET_STYPE(fc);
+
                if (wpa_s->ap_iface == NULL) {
 #ifdef CONFIG_P2P
-                       u16 fc, stype;
-                       const struct ieee80211_mgmt *mgmt;
-                       mgmt = (const struct ieee80211_mgmt *)
-                               data->rx_mgmt.frame;
-                       fc = le_to_host16(mgmt->frame_control);
-                       stype = WLAN_FC_GET_STYPE(fc);
                        if (stype == WLAN_FC_STYPE_PROBE_REQ &&
                            data->rx_mgmt.frame_len > 24) {
                                const u8 *src = mgmt->sa;
@@ -2325,8 +2327,10 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                                size_t ie_len = data->rx_mgmt.frame_len -
                                        (mgmt->u.probe_req.variable -
                                         data->rx_mgmt.frame);
-                               wpas_p2p_probe_req_rx(wpa_s, src, mgmt->da,
-                                                     mgmt->bssid, ie, ie_len);
+                               wpas_p2p_probe_req_rx(
+                                       wpa_s, src, mgmt->da,
+                                       mgmt->bssid, ie, ie_len,
+                                       data->rx_mgmt.ssi_signal);
                                break;
                        }
 #endif /* CONFIG_P2P */
@@ -2334,8 +2338,23 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                                "management frame in non-AP mode");
                        break;
                }
+
+               if (stype == WLAN_FC_STYPE_PROBE_REQ &&
+                   data->rx_mgmt.frame_len > 24) {
+                       const u8 *ie = mgmt->u.probe_req.variable;
+                       size_t ie_len = data->rx_mgmt.frame_len -
+                               (mgmt->u.probe_req.variable -
+                                data->rx_mgmt.frame);
+
+                       wpas_notify_preq(wpa_s, mgmt->sa, mgmt->da,
+                                        mgmt->bssid, ie, ie_len,
+                                        data->rx_mgmt.ssi_signal);
+                       break;
+               }
+
                ap_mgmt_rx(wpa_s, &data->rx_mgmt);
                break;
+               }
 #endif /* CONFIG_AP */
        case EVENT_RX_ACTION:
                wpa_dbg(wpa_s, MSG_DEBUG, "Received Action frame: SA=" MACSTR
@@ -2402,7 +2421,8 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                                             data->rx_probe_req.da,
                                             data->rx_probe_req.bssid,
                                             data->rx_probe_req.ie,
-                                            data->rx_probe_req.ie_len);
+                                            data->rx_probe_req.ie_len,
+                                            data->rx_probe_req.ssi_signal);
                        break;
                }
 #endif /* CONFIG_AP */
@@ -2411,7 +2431,8 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
                                      data->rx_probe_req.da,
                                      data->rx_probe_req.bssid,
                                      data->rx_probe_req.ie,
-                                     data->rx_probe_req.ie_len);
+                                     data->rx_probe_req.ie_len,
+                                     data->rx_probe_req.ssi_signal);
 #endif /* CONFIG_P2P */
                break;
        case EVENT_REMAIN_ON_CHANNEL:
@@ -2539,6 +2560,11 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
        case EVENT_CHANNEL_LIST_CHANGED:
                if (wpa_s->drv_priv == NULL)
                        break; /* Ignore event during drv initialization */
+
+               free_hw_features(wpa_s);
+               wpa_s->hw.modes = wpa_drv_get_hw_feature_data(
+                       wpa_s, &wpa_s->hw.num_modes, &wpa_s->hw.flags);
+
 #ifdef CONFIG_P2P
                wpas_p2p_update_channel_list(wpa_s);
 #endif /* CONFIG_P2P */