diff --git a/src/cntlr.c b/src/cntlr.c index eb4b840ee1ff4e9ebfb095da7e157021b826c7bc..40929873b79bcc16363302d8e2149e3ee1e08cf0 100644 --- a/src/cntlr.c +++ b/src/cntlr.c @@ -407,14 +407,24 @@ void cntlr_update_sta_steer_counters(struct controller *c, a->answered = false; a->auto_bssid = dst_bssid ? false : true; - /* Update SteeringSummaryStats */ - /*TODO: split counter for opportunity & mandate */ - s->stats.btm_attempt_cnt++; /* Record tsp for most recent steer attempt */ timestamp_update(&s->stats.last_attempt_tsp); s->num_steer_attempts += 1; } +static void cntlr_btm_req_timer_cb(atimer_t *t) +{ + trace("%s:--->\n", __func__); + + struct sta *s = container_of(t, struct sta, btm_req_timer); + + if (s->pending_btm_resp_num > 0) { + s->failed_steer_attempts += s->pending_btm_resp_num; + s->stats.btm_failure_cnt += s->pending_btm_resp_num; + s->pending_btm_resp_num = 0; + } +} + static int cntlr_steer_sta(struct controller *c, struct sta *s, struct steer_target *to, uint32_t mode, uint32_t reason) @@ -460,6 +470,10 @@ static int cntlr_steer_sta(struct controller *c, struct sta *s, 1, (uint8_t (*)[6])s->macaddr, 1, (uint8_t (*)[6])to->bssid); + /* Expect btm-resp from STA forwarded to cntlr */ + s->pending_btm_resp_num++; + uloop_timeout_set(&s->btm_req_timer, BTM_RESP_EXP_TIMEOUT * 1000); + break; case STEER_MODE_UNDEFINED: default: @@ -615,6 +629,7 @@ static void cntlr_init_sta_steer_counters(struct sta *s) //s->stats.btm_failure_cnt = 0; //s->stats.btm_query_resp_cnt = 0; //s->stats.last_attempt_tsp = 0; + s->pending_btm_resp_num = 0; } struct sta *cntlr_add_sta(struct controller *c, uint8_t *macaddr) @@ -635,6 +650,7 @@ struct sta *cntlr_add_sta(struct controller *c, uint8_t *macaddr) memcpy(s->macaddr, macaddr, 6); list_add(&s->list, &c->stalist); s->bcn_metrics_timer.cb = cntlr_bcn_metrics_parse; + s->btm_req_timer.cb = cntlr_btm_req_timer_cb; cntlr_init_sta_steer_counters(s); return s; diff --git a/src/cntlr.h b/src/cntlr.h index b82db4fb400f4c440a50b3a408839843689eb580..93c784a68a4f1a1201836ea33da7a3a8b85892aa 100644 --- a/src/cntlr.h +++ b/src/cntlr.h @@ -179,6 +179,7 @@ struct sta { int bcn_report_wait_time; /* maximum time to wait for bcn response in seconds */ int failed_steer_attempts; + int pending_btm_resp_num; uint8_t num_steer_attempts; #define MAX_LOG_STEER_ATTEMPTS 10 @@ -186,6 +187,9 @@ struct sta { struct steer_stats stats; +#define BTM_RESP_EXP_TIMEOUT 5 + atimer_t btm_req_timer; + struct list_head list; }; diff --git a/src/cntlr_map.c b/src/cntlr_map.c index 4f26d27bb8fa2124d2287b0b3b1c073cb3d6baf3..a002943e2d1eb10c74d10e9c1824875f1b3c1bd9 100644 --- a/src/cntlr_map.c +++ b/src/cntlr_map.c @@ -1955,12 +1955,14 @@ int handle_sta_steer_btm_report(void *cntlr, struct cmdu_buff *cmdu) resp->status ? NULL : resp->target_bssid[0]); if (!attempt) - dbg("|%s:%d| could not find an attempt matching this btm report\n", + warn("|%s:%d| could not find an attempt matching this btm report\n", __func__, __LINE__); - else + else { + s->pending_btm_resp_num--; attempt->answered = true; + } - if (resp->status) { + if (resp->status != 0x00) { /* error code */ s->failed_steer_attempts++; /* Update Steering Summary Stats */ s->stats.btm_failure_cnt++;