diff --git a/src/agent.c b/src/agent.c index 3d3dd075280bbe9568e502d94705cd221ffafb30..405261399e8739ebd33c28f52bb85d961d758575 100644 --- a/src/agent.c +++ b/src/agent.c @@ -1689,9 +1689,12 @@ static int report_assoc_sta_metrics(struct agent *a, struct sta *s, bool notify_ snprintf(ev_data, sizeof(ev_data), "{\"macaddr\":\""MACFMT"\"" ",\"report_rcpi_threshold\":%d" + ",\"rcpi_hysteresis_margin\":%d" ",\"rcpi\":%d}", MAC2STR(s->macaddr), - rcfg->report_rcpi_threshold, curr_rcpi); + rcfg->report_rcpi_threshold, + rcfg->rcpi_hysteresis_margin, + curr_rcpi); if (curr_rcpi < rcfg->report_rcpi_threshold) agent_notify_iface_event(a, ap->ifname, @@ -1796,18 +1799,6 @@ static void wifi_sta_periodic_run(atimer_t *t) return; } - if (s->rssi_avg[0] && s->rssi_avg[1]) { - struct agent_config_radio *rcfg = - get_agent_config_radio(&a->cfg, ap->cfg->device); - uint8_t curr_rcpi = rssi_to_rcpi(s->rssi_avg[0]); - uint8_t prev_rcpi = rssi_to_rcpi(s->rssi_avg[1]); - uint8_t trigger = rcfg->report_rcpi_threshold; - - if ((prev_rcpi <= trigger && curr_rcpi > trigger) || - (prev_rcpi >= trigger && curr_rcpi < trigger)) - report_assoc_sta_metrics(a, s, true); - } - if (sta_steer_allowed(s->steer_policy) && !list_empty(&s->pref_nbrlist) && maybe_steer_sta(s, &reason, &pref_nbr)) { @@ -1818,6 +1809,38 @@ static void wifi_sta_periodic_run(atimer_t *t) if (!list_empty(&ap->nbrlist) && list_empty(&s->pref_nbrlist)) recalc_desired_neighbors(s); + if (s->rssi_avg[0] && s->rssi_avg[1]) { + struct agent_config_radio *rcfg; + uint8_t trig_l, trig_h; + uint8_t curr_rcpi, prev_rcpi; + + rcfg = get_agent_config_radio(&a->cfg, ap->cfg->device); + if (!rcfg) + goto rearm_periodic; + + if (!rcfg->report_rcpi_threshold) + goto rearm_periodic; + + trig_l = rcfg->report_rcpi_threshold - rcfg->rcpi_hysteresis_margin; + trig_h = rcfg->report_rcpi_threshold + rcfg->rcpi_hysteresis_margin; + curr_rcpi = rssi_to_rcpi(s->rssi_avg[0]); + prev_rcpi = rssi_to_rcpi(s->rssi_avg[1]); + + if (curr_rcpi > trig_l && curr_rcpi < trig_h) + s->num_rssi_rep = 0; + else if ((prev_rcpi < trig_h && curr_rcpi >= trig_h) || + (prev_rcpi > trig_l && curr_rcpi <= trig_l)) + s->num_rssi_rep = 1; + else { + /* rcpi outside range for consecutive sample */ + if (s->num_rssi_rep == MAX_RSSI_MEAS) { + /* interpret collected samples */ + report_assoc_sta_metrics(a, s, true); + } else + s->num_rssi_rep++; + } + } + rearm_periodic: timer_set(&s->sta_timer, STA_PERIODIC_RUN_INTERVAL); } diff --git a/src/agent.h b/src/agent.h index 3c70685d4cb00c28edf477c6fe7fa14549e01af2..a55f786487028d4eba5a3d3117e6292778162139 100644 --- a/src/agent.h +++ b/src/agent.h @@ -456,9 +456,10 @@ struct sta { #endif uint32_t caps; /** capability bitmap */ int rssi[WIFI_NUM_ANTENNA]; /** rssi of last received pkt */ -#define MAX_RSSI_MEAS 2 +#define MAX_RSSI_MEAS 3 int8_t rssi_avg[MAX_RSSI_MEAS]; /** average rssi history FIFO buffer */ - uint8_t num_rssi; /** number of RSSI samples */ + uint8_t num_rssi; /** total number of RSSI samples aggregated */ + uint8_t num_rssi_rep; /** number of RSSI samples collected for report */ uint64_t connected_ms; /** number of msecs connected */ struct timespec last_update; uint32_t tx_rate; /** tx-rate in kbps */ diff --git a/src/config.c b/src/config.c index 77e8466a7c760bf98c6997c151431aa27d271a99..3696b35d67e5a27308ad2135f0dc6dc658fc7daa 100644 --- a/src/config.c +++ b/src/config.c @@ -2556,7 +2556,8 @@ static int agent_config_get_wifi_radio(struct agent_config *a, } if (ifname && band) { - uint8_t rcpi_threshold = 0, report_rcpi_threshold = 0; + uint8_t rcpi_threshold = 0; + uint8_t report_rcpi_threshold = 0; n = get_agent_config_radio(a, ifname); if (!n) { @@ -2645,6 +2646,8 @@ static int agent_config_get_wifi_radio(struct agent_config *a, if (tb[WIFI_RADIO_RCPI_HYSTERESIS_MARGIN]) n->rcpi_hysteresis_margin = atoi(tb[WIFI_RADIO_RCPI_HYSTERESIS_MARGIN]->v.string); + else + n->rcpi_hysteresis_margin = 0; if (tb[WIFI_RADIO_REPORT_UTIL_THRESHOLD]) n->report_util_threshold =