]> 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 3af6dc1a8e3901e84230714ed7084041107df59c..cd45cd19eb43bfab2afbe6e4d8288c8b76de2ad8 100644 (file)
@@ -1659,9 +1659,13 @@ static void wpa_supplicant_event_disassoc(struct wpa_supplicant *wpa_s,
        if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
                wpas_connection_failed(wpa_s, bssid);
        wpa_sm_notify_disassoc(wpa_s->wpa);
-       wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" MACSTR
-               " reason=%d",
-               MAC2STR(bssid), reason_code);
+       if (!is_zero_ether_addr(bssid) ||
+           wpa_s->wpa_state >= WPA_AUTHENTICATING) {
+               wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" MACSTR
+                       " reason=%d%s",
+                       MAC2STR(bssid), reason_code,
+                       locally_generated ? " locally_generated=1" : "");
+       }
        if (wpa_supplicant_dynamic_keys(wpa_s)) {
                wpa_dbg(wpa_s, MSG_DEBUG, "Disconnect event - remove keys");
                wpa_s->keys_cleared = 0;
@@ -2305,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;
@@ -2321,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 */
@@ -2330,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
@@ -2398,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 */
@@ -2407,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:
@@ -2535,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 */