diff --git a/src/agent_tlv.c b/src/agent_tlv.c index ed422a8ff8f2dc53fb71d934daf26e545d9b69ff..85b421774c0e0181bb40ff70e5dbe80d134ce1fb 100644 --- a/src/agent_tlv.c +++ b/src/agent_tlv.c @@ -1503,8 +1503,7 @@ int agent_gen_tlv_unassoc_sta_lm_report(struct agent *a, memcpy(s->macaddr, metrics[i].macaddr, 6); s->channel = metrics[i].meas.channel; - BUF_PUT_BE32(s->time_delta, timestamp_diff_ms(now, - metrics[i].meas.read_time)); + BUF_PUT_BE32(s->time_delta, metrics[i].meas.last_seen_ms); s->ul_rcpi = metrics[i].meas.rcpi; // reporting average RCPI offset += sizeof(*s); diff --git a/src/unasta.c b/src/unasta.c index 56962528177e9686b98307a246bfd4b8343b919e..fba633496cc6dc4f5f6a39a3adfafe58a7543d0a 100644 --- a/src/unasta.c +++ b/src/unasta.c @@ -44,15 +44,27 @@ static int unassoc_sta_meas_valid(struct wifi_unassoc_sta_element *usta) static int agent_get_monitor_rssi(struct wifi_unassoc_sta_element *usta) { - struct wifi_monsta monsta = {}; - int8_t rssi = 0; - trace("agent: %s: --->\n", __func__); - if (!wifi_get_monitor_sta(usta->mon_ifname, usta->macaddr, &monsta)) - rssi = monsta.rssi_avg; + struct wifi_monsta monsta = {}; + int ret = 0; + + ret = wifi_get_monitor_sta(usta->mon_ifname, usta->macaddr, &monsta); + if (!ret) { + dbg("%s: RSSI measured for " MACFMT ": %d, time delta = %d seconds\n", + __func__, MAC2STR(usta->macaddr), monsta.rssi_avg, monsta.last_seen); + usta->meas.rssi = monsta.rssi_avg; + usta->meas.rcpi = rssi_to_rcpi(monsta.rssi_avg); + usta->meas.last_seen_ms = monsta.last_seen * 1000; /* convert to ms */ + } else { + warn("%s: failed to get RSSI for unassociated STA "MACFMT"\n", + __func__, MAC2STR(usta->macaddr)); + usta->meas.rssi = 0; + usta->meas.rcpi = 255; + usta->meas.last_seen_ms = 0; + } - return rssi; + return ret; } int radio_free_unassoc_sta(struct wifi_radio_element *re, uint8_t *sta) @@ -226,7 +238,7 @@ int unassoc_sta_send_link_metrics_response(struct wifi_radio_element *re) list_for_each_entry(usta, &re->unassocstalist, list) { bool reset = false; - int8_t rssi = 0; + int ret = 0; if (!unassoc_sta_meas_requested(usta)) /* Not requested yet */ @@ -237,27 +249,15 @@ int unassoc_sta_send_link_metrics_response(struct wifi_radio_element *re) continue; /* Get most recent RSSI from driver */ - rssi = agent_get_monitor_rssi(usta); - if (rssi) { - /* RSSI available: update measurement */ - dbg("%s: RSSI measured for " MACFMT ": %d\n", - __func__, MAC2STR(usta->macaddr), rssi); - usta->meas.rssi = rssi; - usta->meas.rcpi = rssi_to_rcpi(rssi); - timestamp_update(&usta->meas.read_time); - } else { + ret = agent_get_monitor_rssi(usta); + if (ret || !usta->meas.rssi) { /* No RSSI: reenable monitoring in driver */ - usta->meas.rssi = 0; - usta->meas.rcpi = 255; - timestamp_reset(&usta->meas.read_time); - dbg("%s: no RSSI, restart monitoring of unassoc sta "MACFMT"\n", - __func__, MAC2STR(usta->macaddr)); if (!wifi_monitor_sta_add(usta->mon_ifname, usta->macaddr)) { dbg("%s: restarted monitoring of unassociated STA " MACFMT "\n", __func__, MAC2STR(usta->macaddr)); timestamp_update(&usta->meas.start_time); } else { - warn("%s: monitoring of unassoc sta "MACFMT" failed!\n", + warn("%s: failed to restart monitoring of unassoc sta "MACFMT"!\n", __func__, MAC2STR(usta->macaddr)); timestamp_reset(&usta->meas.start_time); usta->is_monitored = false; diff --git a/src/unasta.h b/src/unasta.h index 36d5d368d7fe398eb4082b64c233e6bc328fa5aa..51cd281c852b0421caa498a0be0c5126e2818551 100644 --- a/src/unasta.h +++ b/src/unasta.h @@ -19,8 +19,8 @@ struct wifi_sta_measurement { uint8_t channel; int8_t rssi; uint8_t rcpi; + int last_seen_ms; /* of most recent measurement */ - struct timespec read_time; struct timespec start_time; /* num of failed measurements */ int num_tries;