Pass signal strength through, fix units

The signal strength is currently never used as the only driver reporting
it is nl80211 which uses IEEE80211_RADIOTAP_DB_ANTSIGNAL which is never
populated by the kernel. The kernel will (soon) populate
IEEE80211_RADIOTAP_DBM_ANTSIGNAL instead though, so use that.

Also, since it was never really populated, we can redefine the signal
field to be in dBm units only.

My next patch will also require knowing the signal strength of probe
requests throughout the code (where available), so add it to the
necessary APIs.

Signed-hostap: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2012-04-01 18:48:12 +03:00 committed by Jouni Malinen
parent 370b076197
commit baf513d695
13 changed files with 47 additions and 25 deletions

View file

@ -293,7 +293,8 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
void handle_probe_req(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; u8 *resp;
struct ieee802_11_elems elems; 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++) for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++)
if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx, if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx,
mgmt->sa, mgmt->da, mgmt->bssid, mgmt->sa, mgmt->da, mgmt->bssid,
ie, ie_len) > 0) ie, ie_len, ssi_signal) > 0)
return; return;
if (!hapd->iconf->send_probe_response) if (!hapd->iconf->send_probe_response)

View file

@ -19,7 +19,8 @@
struct ieee80211_mgmt; struct ieee80211_mgmt;
void handle_probe_req(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);
void ieee802_11_set_beacon(struct hostapd_data *hapd); void ieee802_11_set_beacon(struct hostapd_data *hapd);
void ieee802_11_set_beacons(struct hostapd_iface *iface); void ieee802_11_set_beacons(struct hostapd_iface *iface);
void ieee802_11_update_beacons(struct hostapd_iface *iface); void ieee802_11_update_beacons(struct hostapd_iface *iface);

View file

@ -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, 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; size_t i;
int ret = 0; 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); random_add_randomness(sa, ETH_ALEN);
for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++) { for (i = 0; hapd->probereq_cb && i < hapd->num_probereq_cb; i++) {
if (hapd->probereq_cb[i].cb(hapd->probereq_cb[i].ctx, 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; ret = 1;
break; 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.da,
data->rx_probe_req.bssid, data->rx_probe_req.bssid,
data->rx_probe_req.ie, data->rx_probe_req.ie,
data->rx_probe_req.ie_len); data->rx_probe_req.ie_len,
data->rx_probe_req.ssi_signal);
break; break;
case EVENT_NEW_STA: case EVENT_NEW_STA:
hostapd_event_new_sta(hapd, data->new_sta.addr); hostapd_event_new_sta(hapd, data->new_sta.addr);

View file

@ -31,7 +31,7 @@ struct hapd_interfaces {
struct hostapd_probereq_cb { struct hostapd_probereq_cb {
int (*cb)(void *ctx, const u8 *sa, const u8 *da, const u8 *bssid, 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 *ctx;
}; };
@ -45,7 +45,7 @@ struct hostapd_rate_data {
struct hostapd_frame_info { struct hostapd_frame_info {
u32 channel; u32 channel;
u32 datarate; 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 hostapd_register_probereq_cb(struct hostapd_data *hapd,
int (*cb)(void *ctx, const u8 *sa, int (*cb)(void *ctx, const u8 *sa,
const u8 *da, const u8 *bssid, 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 *ctx);
void hostapd_prune_associations(struct hostapd_data *hapd, const u8 *addr); 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_notif_disassoc(struct hostapd_data *hapd, const u8 *addr);
void hostapd_event_sta_low_ack(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, 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 */ #endif /* HOSTAPD_H */

View file

@ -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) { if (stype == WLAN_FC_STYPE_PROBE_REQ) {
handle_probe_req(hapd, mgmt, len); handle_probe_req(hapd, mgmt, len, fi->ssi_signal);
return; return;
} }

View file

@ -17,7 +17,8 @@
int hostapd_register_probereq_cb(struct hostapd_data *hapd, int hostapd_register_probereq_cb(struct hostapd_data *hapd,
int (*cb)(void *ctx, const u8 *sa, int (*cb)(void *ctx, const u8 *sa,
const u8 *da, const u8 *bssid, 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 *ctx)
{ {
struct hostapd_probereq_cb *n; struct hostapd_probereq_cb *n;

View file

@ -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, static int hostapd_wps_probe_req_rx(void *ctx, const u8 *addr, const u8 *da,
const u8 *bssid, 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); 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, static int hostapd_wps_probe_req_rx(void *ctx, const u8 *addr, const u8 *da,
const u8 *bssid, 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 hostapd_data *hapd = ctx;
struct wpabuf *wps_ie; struct wpabuf *wps_ie;

View file

@ -3271,7 +3271,7 @@ union wpa_event_data {
const u8 *frame; const u8 *frame;
size_t frame_len; size_t frame_len;
u32 datarate; u32 datarate;
u32 ssi_signal; int ssi_signal; /* dBm */
} rx_mgmt; } rx_mgmt;
/** /**
@ -3389,6 +3389,11 @@ union wpa_event_data {
* ie_len - Length of ie buffer in octets * ie_len - Length of ie buffer in octets
*/ */
size_t ie_len; size_t ie_len;
/**
* signal - signal strength in dBm (or 0 if not available)
*/
int ssi_signal;
} rx_probe_req; } rx_probe_req;
/** /**

View file

@ -5879,8 +5879,8 @@ static void handle_monitor_read(int sock, void *eloop_ctx, void *sock_ctx)
case IEEE80211_RADIOTAP_RATE: case IEEE80211_RADIOTAP_RATE:
datarate = *iter.this_arg * 5; datarate = *iter.this_arg * 5;
break; break;
case IEEE80211_RADIOTAP_DB_ANTSIGNAL: case IEEE80211_RADIOTAP_DBM_ANTSIGNAL:
ssi_signal = *iter.this_arg; ssi_signal = (s8) *iter.this_arg;
break; break;
} }
} }

View file

@ -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, 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 #ifdef CONFIG_P2P
struct wpa_supplicant *wpa_s = ctx; 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 */ #else /* CONFIG_P2P */
return 0; return 0;
#endif /* CONFIG_P2P */ #endif /* CONFIG_P2P */

View file

@ -2325,8 +2325,10 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
size_t ie_len = data->rx_mgmt.frame_len - size_t ie_len = data->rx_mgmt.frame_len -
(mgmt->u.probe_req.variable - (mgmt->u.probe_req.variable -
data->rx_mgmt.frame); data->rx_mgmt.frame);
wpas_p2p_probe_req_rx(wpa_s, src, mgmt->da, wpas_p2p_probe_req_rx(
mgmt->bssid, ie, ie_len); wpa_s, src, mgmt->da,
mgmt->bssid, ie, ie_len,
data->rx_mgmt.ssi_signal);
break; break;
} }
#endif /* CONFIG_P2P */ #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.da,
data->rx_probe_req.bssid, data->rx_probe_req.bssid,
data->rx_probe_req.ie, data->rx_probe_req.ie,
data->rx_probe_req.ie_len); data->rx_probe_req.ie_len,
data->rx_probe_req.ssi_signal);
break; break;
} }
#endif /* CONFIG_AP */ #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.da,
data->rx_probe_req.bssid, data->rx_probe_req.bssid,
data->rx_probe_req.ie, 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 */ #endif /* CONFIG_P2P */
break; break;
case EVENT_REMAIN_ON_CHANNEL: case EVENT_REMAIN_ON_CHANNEL:

View file

@ -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, int wpas_p2p_probe_req_rx(struct wpa_supplicant *wpa_s, const u8 *addr,
const u8 *dst, const u8 *bssid, 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) if (wpa_s->global->p2p_disabled)
return 0; return 0;

View file

@ -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); u8 *buf, size_t len, int p2p_group);
int wpas_p2p_probe_req_rx(struct wpa_supplicant *wpa_s, const u8 *addr, int wpas_p2p_probe_req_rx(struct wpa_supplicant *wpa_s, const u8 *addr,
const u8 *dst, const u8 *bssid, 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, void wpas_p2p_rx_action(struct wpa_supplicant *wpa_s, const u8 *da,
const u8 *sa, const u8 *bssid, const u8 *sa, const u8 *bssid,
u8 category, const u8 *data, size_t len, int freq); u8 category, const u8 *data, size_t len, int freq);