diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 0253663d0..b71106381 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -293,7 +293,8 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, void handle_probe_req(struct hostapd_data *hapd, - const struct ieee80211_mgmt *mgmt, size_t len) + const struct ieee80211_mgmt *mgmt, size_t len, + int ssi_signal) { u8 *resp; struct ieee802_11_elems elems; @@ -311,7 +312,7 @@ void handle_probe_req(struct hostapd_data *hapd, for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++) if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx, mgmt->sa, mgmt->da, mgmt->bssid, - ie, ie_len) > 0) + ie, ie_len, ssi_signal) > 0) return; if (!hapd->iconf->send_probe_response) diff --git a/src/ap/beacon.h b/src/ap/beacon.h index 0dd6021a8..37f10d2f5 100644 --- a/src/ap/beacon.h +++ b/src/ap/beacon.h @@ -19,7 +19,8 @@ struct ieee80211_mgmt; void handle_probe_req(struct hostapd_data *hapd, - const struct ieee80211_mgmt *mgmt, size_t len); + const struct ieee80211_mgmt *mgmt, size_t len, + int ssi_signal); void ieee802_11_set_beacon(struct hostapd_data *hapd); void ieee802_11_set_beacons(struct hostapd_iface *iface); void ieee802_11_update_beacons(struct hostapd_iface *iface); diff --git a/src/ap/drv_callbacks.c b/src/ap/drv_callbacks.c index 820a90314..bd5b908fc 100644 --- a/src/ap/drv_callbacks.c +++ b/src/ap/drv_callbacks.c @@ -265,7 +265,8 @@ void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr) int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa, const u8 *da, - const u8 *bssid, const u8 *ie, size_t ie_len) + const u8 *bssid, const u8 *ie, size_t ie_len, + int ssi_signal) { size_t i; int ret = 0; @@ -276,7 +277,8 @@ int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa, const u8 *da, random_add_randomness(sa, ETH_ALEN); for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++) { if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx, - sa, da, bssid, ie, ie_len) > 0) { + sa, da, bssid, ie, ie_len, + ssi_signal) > 0) { ret = 1; break; } @@ -541,7 +543,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; case EVENT_NEW_STA: hostapd_event_new_sta(hapd, data->new_sta.addr); diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h index 2cb4a6500..63cf494ec 100644 --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -31,7 +31,7 @@ struct hapd_interfaces { struct hostapd_probereq_cb { int (*cb)(void *ctx, const u8 *sa, const u8 *da, const u8 *bssid, - const u8 *ie, size_t ie_len); + const u8 *ie, size_t ie_len, int ssi_signal); void *ctx; }; @@ -45,7 +45,7 @@ struct hostapd_rate_data { struct hostapd_frame_info { u32 channel; u32 datarate; - u32 ssi_signal; + int ssi_signal; /* dBm */ }; @@ -269,7 +269,8 @@ void hostapd_new_assoc_sta(struct hostapd_data *hapd, struct sta_info *sta, int hostapd_register_probereq_cb(struct hostapd_data *hapd, int (*cb)(void *ctx, const u8 *sa, const u8 *da, const u8 *bssid, - const u8 *ie, size_t ie_len), + const u8 *ie, size_t ie_len, + int ssi_signal), void *ctx); void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr); @@ -279,6 +280,7 @@ int hostapd_notif_assoc(struct hostapd_data *hapd, const u8 *addr, void hostapd_notif_disassoc(struct hostapd_data *hapd, const u8 *addr); void hostapd_event_sta_low_ack(struct hostapd_data *hapd, const u8 *addr); int hostapd_probe_req_rx(struct hostapd_data *hapd, const u8 *sa, const u8 *da, - const u8 *bssid, const u8 *ie, size_t ie_len); + const u8 *bssid, const u8 *ie, size_t ie_len, + int ssi_signal); #endif /* HOSTAPD_H */ diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 9c931ca4b..f305b07de 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -1392,7 +1392,7 @@ void ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len, if (stype == WLAN_FC_STYPE_PROBE_REQ) { - handle_probe_req(hapd, mgmt, len); + handle_probe_req(hapd, mgmt, len, fi->ssi_signal); return; } diff --git a/src/ap/utils.c b/src/ap/utils.c index 36c1182bf..3e9fc0810 100644 --- a/src/ap/utils.c +++ b/src/ap/utils.c @@ -17,7 +17,8 @@ int hostapd_register_probereq_cb(struct hostapd_data *hapd, int (*cb)(void *ctx, const u8 *sa, const u8 *da, const u8 *bssid, - const u8 *ie, size_t ie_len), + const u8 *ie, size_t ie_len, + int ssi_signal), void *ctx) { struct hostapd_probereq_cb *n; diff --git a/src/ap/wps_hostapd.c b/src/ap/wps_hostapd.c index 01038e9e2..e47e7e734 100644 --- a/src/ap/wps_hostapd.c +++ b/src/ap/wps_hostapd.c @@ -37,7 +37,8 @@ static void hostapd_wps_upnp_deinit(struct hostapd_data *hapd); static int hostapd_wps_probe_req_rx(void *ctx, const u8 *addr, const u8 *da, const u8 *bssid, - const u8 *ie, size_t ie_len); + const u8 *ie, size_t ie_len, + int ssi_signal); static void hostapd_wps_ap_pin_timeout(void *eloop_data, void *user_ctx); @@ -1178,7 +1179,8 @@ error: static int hostapd_wps_probe_req_rx(void *ctx, const u8 *addr, const u8 *da, const u8 *bssid, - const u8 *ie, size_t ie_len) + const u8 *ie, size_t ie_len, + int ssi_signal) { struct hostapd_data *hapd = ctx; struct wpabuf *wps_ie; diff --git a/src/drivers/driver.h b/src/drivers/driver.h index c4f6b5f3d..3c7ebe863 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -3271,7 +3271,7 @@ union wpa_event_data { const u8 *frame; size_t frame_len; u32 datarate; - u32 ssi_signal; + int ssi_signal; /* dBm */ } rx_mgmt; /** @@ -3389,6 +3389,11 @@ union wpa_event_data { * ie_len - Length of ie buffer in octets */ size_t ie_len; + + /** + * signal - signal strength in dBm (or 0 if not available) + */ + int ssi_signal; } rx_probe_req; /** diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 0c99ff808..512893327 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -5879,8 +5879,8 @@ static void handle_monitor_read(int sock, void *eloop_ctx, void *sock_ctx) case IEEE80211_RADIOTAP_RATE: datarate = *iter.this_arg * 5; break; - case IEEE80211_RADIOTAP_DB_ANTSIGNAL: - ssi_signal = *iter.this_arg; + case IEEE80211_RADIOTAP_DBM_ANTSIGNAL: + ssi_signal = (s8) *iter.this_arg; break; } } diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index 66b0e1f8f..d0fb1b056 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -357,11 +357,13 @@ static int ap_vendor_action_rx(void *ctx, const u8 *buf, size_t len, int freq) static int ap_probe_req_rx(void *ctx, const u8 *sa, const u8 *da, - const u8 *bssid, const u8 *ie, size_t ie_len) + const u8 *bssid, const u8 *ie, size_t ie_len, + int ssi_signal) { #ifdef CONFIG_P2P struct wpa_supplicant *wpa_s = ctx; - return wpas_p2p_probe_req_rx(wpa_s, sa, da, bssid, ie, ie_len); + return wpas_p2p_probe_req_rx(wpa_s, sa, da, bssid, ie, ie_len, + ssi_signal); #else /* CONFIG_P2P */ return 0; #endif /* CONFIG_P2P */ diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index 0fb2d682e..1f4084050 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -2325,8 +2325,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 */ @@ -2402,7 +2404,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 +2414,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: diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 874fe819d..bf5804ddc 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -3697,7 +3697,7 @@ int wpas_p2p_assoc_req_ie(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, int wpas_p2p_probe_req_rx(struct wpa_supplicant *wpa_s, const u8 *addr, const u8 *dst, const u8 *bssid, - const u8 *ie, size_t ie_len) + const u8 *ie, size_t ie_len, int ssi_signal) { if (wpa_s->global->p2p_disabled) return 0; diff --git a/wpa_supplicant/p2p_supplicant.h b/wpa_supplicant/p2p_supplicant.h index cf46eaf1b..4cd71932e 100644 --- a/wpa_supplicant/p2p_supplicant.h +++ b/wpa_supplicant/p2p_supplicant.h @@ -54,7 +54,8 @@ int wpas_p2p_assoc_req_ie(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, u8 *buf, size_t len, int p2p_group); int wpas_p2p_probe_req_rx(struct wpa_supplicant *wpa_s, const u8 *addr, const u8 *dst, const u8 *bssid, - const u8 *ie, size_t ie_len); + const u8 *ie, size_t ie_len, + int ssi_signal); void wpas_p2p_rx_action(struct wpa_supplicant *wpa_s, const u8 *da, const u8 *sa, const u8 *bssid, u8 category, const u8 *data, size_t len, int freq);