diff --git a/src/cntlr.c b/src/cntlr.c index 59a1007fb943fbf222c9d82321a0ed0d27b6b0a0..eb4b840ee1ff4e9ebfb095da7e157021b826c7bc 100644 --- a/src/cntlr.c +++ b/src/cntlr.c @@ -392,9 +392,12 @@ void cntlr_update_sta_steer_counters(struct controller *c, break; case STEER_MODE_BTM_REQ: a->method = STEER_METHOD_BTM_REQ; + /* Update SteeringSummaryStats - per STA & per Network */ + s->stats.btm_attempt_cnt++; break; case STEER_MODE_OPPORTUNITY: a->method = STEER_METHOD_ASYNC_BTM; + /*TODO: add counter for opportunity (incl blacklis count) */ break; default: a->method = STEER_METHOD_UNKNOWN; @@ -408,7 +411,7 @@ void cntlr_update_sta_steer_counters(struct controller *c, /*TODO: split counter for opportunity & mandate */ s->stats.btm_attempt_cnt++; /* Record tsp for most recent steer attempt */ - timestamp_update(&s->stats.last_steer_time); + timestamp_update(&s->stats.last_attempt_tsp); s->num_steer_attempts += 1; } @@ -521,9 +524,9 @@ static void cntlr_try_steer_sta(struct controller *c, struct sta *s) switch (candidate.verdict) { case STEER_VERDICT_OK: - if (!timestamp_expired(&s->stats.last_steer_time, STEER_ATTEMPT_MIN_INTV)) { + if (!timestamp_expired(&s->stats.last_attempt_tsp, STEER_ATTEMPT_MIN_ITV)) { dbg("%s: last steer attempt < %us ago; skip steering\n", - __func__, STEER_ATTEMPT_MIN_INTV / 1000); + __func__, STEER_ATTEMPT_MIN_ITV / 1000); return; } cntlr_steer_sta(c, s, candidate.best, candidate.mode, candidate.reason); @@ -534,7 +537,15 @@ static void cntlr_try_steer_sta(struct controller *c, struct sta *s) /* TODO: check next steer-control ? */ break; case STEER_VERDICT_EXCLUDE: - /* TODO: exclude this STA from subsequent steer attempts */ + /* STA excluded from subsequent steer attempts */ + dbg("%s: sticky STA excluded from steering, elapsed %us of %us\n", __func__, + timestamp_elapsed_sec(&s->stats.last_attempt_tsp), + STEER_ATTEMPT_STICKY_ITV / 1000); + if (timestamp_expired(&s->stats.last_attempt_tsp, STEER_ATTEMPT_STICKY_ITV)) + /* time up, allow steering again */ + s->failed_steer_attempts = 0; + + /* TODO: consider update of BTM steering disallowed STA list in agent */ break; default: break; @@ -603,7 +614,7 @@ static void cntlr_init_sta_steer_counters(struct sta *s) //s->stats.btm_success_cnt = 0; //s->stats.btm_failure_cnt = 0; //s->stats.btm_query_resp_cnt = 0; - //s->stats.last_steer_time = 0; + //s->stats.last_attempt_tsp = 0; } struct sta *cntlr_add_sta(struct controller *c, uint8_t *macaddr) diff --git a/src/cntlr.h b/src/cntlr.h index c4186bb74198dc102636827724161d1720d6ed17..b82db4fb400f4c440a50b3a408839843689eb580 100644 --- a/src/cntlr.h +++ b/src/cntlr.h @@ -148,7 +148,7 @@ struct steer_stats { /* Reperesents time this Associated Device was last attempted * to be steered. Calculate delta from now (secs) for reporting */ - struct timespec last_steer_time; + struct timespec last_attempt_tsp; }; struct sta { diff --git a/src/cntlr_map.c b/src/cntlr_map.c index d211967478259d42cca577fdb1449cd96401f7e1..4f26d27bb8fa2124d2287b0b3b1c073cb3d6baf3 100644 --- a/src/cntlr_map.c +++ b/src/cntlr_map.c @@ -318,7 +318,7 @@ int handle_topology_response(void *cntlr, struct cmdu_buff *cmdu) s->type = IEEE1905; s->agent = bsta->agent; //s->failed_steer_attempts = 0; - //timestamp_reset(s->stats.last_steer_time); + //timestamp_reset(s->stats.last_attempt_tsp); } } } diff --git a/src/cntlr_ubus.c b/src/cntlr_ubus.c index efebf7bd6b017dcbe2afbe2d3e063f633b18717b..8ee2b8f6159eae6d93e5ca65f9c9065acc61fc1f 100644 --- a/src/cntlr_ubus.c +++ b/src/cntlr_ubus.c @@ -596,7 +596,7 @@ static int cntlr_status(struct ubus_context *ctx, struct ubus_object *obj, blobmsg_add_u32(&bb, "ul_thput", s->ul_thput); blobmsg_add_u32(&bb, "dl_thput", s->dl_thput); blobmsg_add_u32(&bb, "ul_rcpi", s->ul_rcpi); - //blobmsg_add_u32(&bb, "last_steer_time", s->stats.last_steer_time); + //blobmsg_add_u32(&bb, "last_attempt_tsp", s->stats.last_attempt_tsp); blobmsg_add_u32(&bb, "failed_steer_attempts", s->failed_steer_attempts); //blobmsg_add_u16(&bb, "num_bcn_metrics", s->num_bcn_metrics); @@ -818,7 +818,7 @@ static int cntlr_steer_summary(struct ubus_context *ctx, struct ubus_object *obj if (!hwaddr_is_zero(macaddr)) blobmsg_add_u32(&bb, "time_since_steer", - timestamp_elapsed_sec(&s->stats.last_steer_time)); + timestamp_elapsed_sec(&s->stats.last_attempt_tsp)); } } else { diff --git a/src/plugins/steer/rcpi/rcpi.c b/src/plugins/steer/rcpi/rcpi.c index 2b032739ece15c921603f179785a53372168ea13..29ba215ab8366c8bc36a50730fd6dae7636ea7ff 100644 --- a/src/plugins/steer/rcpi/rcpi.c +++ b/src/plugins/steer/rcpi/rcpi.c @@ -50,6 +50,12 @@ int rcpi_steer(void *priv, struct steer_sta *s) return 0; } + if (s->s->failed_steer_attempts > sctrl->max_btm_attempt) { + /* skip further checks for sticky candidates */ + s->verdict = STEER_VERDICT_EXCLUDE; + return 0; + } + if (list_empty(s->bcnlist)) { dbg("%s: report list is empty\n", __func__); s->verdict = STEER_VERDICT_NOK; @@ -118,14 +124,11 @@ int rcpi_steer(void *priv, struct steer_sta *s) s->reason = STEER_REASON_LOW_RCPI; s->verdict = STEER_VERDICT_OK; - if (s->s->failed_steer_attempts < sctrl->max_btm_attempt) s->mode = STEER_MODE_BTM_REQ; - else + else if (s->s->failed_steer_attempts == sctrl->max_btm_attempt) s->mode = STEER_MODE_ASSOC_CTL; - /* TODO: return STEER_VERDICT_EXCLUDE for more than X assoc cntlrs */ - return 0; } diff --git a/src/steer_module.h b/src/steer_module.h index f91ae9958eccbca69289b845e205f2a6240fafb9..20e69024303fb355a83bfb7dfdf59fa2df1c1117 100644 --- a/src/steer_module.h +++ b/src/steer_module.h @@ -21,7 +21,8 @@ extern "C" { #include "steer.h" -#define STEER_ATTEMPT_MIN_INTV 30000 /* ms */ +#define STEER_ATTEMPT_MIN_ITV (30 * 1000) /* 30 secs */ +#define STEER_ATTEMPT_STICKY_ITV (10 * 60 * 1000) /* 10 minutes */ struct steer_control *cntlr_get_steer_control(struct controller *c); void cntlr_assign_steer_module_default(struct controller *c);