diff --git a/src/cntlr.c b/src/cntlr.c index badc8a9ce170949aa94feab775e8dc3f116758c8..133cb2a1b3e0b810151ff8f1b448f4733d48635d 100644 --- a/src/cntlr.c +++ b/src/cntlr.c @@ -814,7 +814,8 @@ static void cntlr_bcn_metrics_parse(atimer_t *t) __func__, MAC2STR(s->de_sta->macaddr), MAC2STR(s->bssid), MAC2STR(n->alid)); list_for_each_entry_safe(b, tmp, &s->de_sta->meas_reportlist, list) { - dbg("bcn-report from " MACFMT "\n", MAC2STR(b->bssid)); + dbg("bcn-report from " MACFMT " %s\n", + MAC2STR(b->bssid), b->stale ? "(stale)":""); /* Skip entry not in our network */ bss = cntlr_iterate_fbss(c, b->bssid); diff --git a/src/cntlr_ubus_dbg.c b/src/cntlr_ubus_dbg.c index 3e136264fc7f2153c988886ccb4dc11d666390e8..7115c212d9764766bd6811c1df147f49863987d4 100644 --- a/src/cntlr_ubus_dbg.c +++ b/src/cntlr_ubus_dbg.c @@ -53,6 +53,15 @@ #ifndef MAP_CNTLR_DISABLE_UBUS_DBG +enum { + CLR_STEER_SUMMARY_STA, + __CLR_STEER_SUMMARY_MAX, +}; + +static const struct blobmsg_policy clr_steer_summary_params[__CLR_STEER_SUMMARY_MAX] = { + [CLR_STEER_SUMMARY_STA] = { .name = "sta", .type = BLOBMSG_TYPE_STRING}, +}; + static int cntlr_dbg_list_macs(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) @@ -90,6 +99,71 @@ static int cntlr_dbg_list_macs(struct ubus_context *ctx, struct ubus_object *obj return UBUS_STATUS_OK; } +static int cntlr_dbg_clear_steer_summary(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) +{ + struct controller *c = container_of(obj, struct controller, obj_dbg); + struct blob_attr *tb[__CLR_STEER_SUMMARY_MAX]; + uint8_t macaddr[6] = {0}; + char sta[18] = {0}; + struct sta *s = NULL; + + blobmsg_parse(clr_steer_summary_params, __CLR_STEER_SUMMARY_MAX, tb, + blob_data(msg), blob_len(msg)); + + if (tb[CLR_STEER_SUMMARY_STA]) { + strncpy(sta, blobmsg_data(tb[CLR_STEER_SUMMARY_STA]), + sizeof(sta) - 1); + if (!hwaddr_aton(sta, macaddr)) { + dbg("|%s:%d|Must provide valid STA address!\n", + __func__, __LINE__); + return UBUS_STATUS_UNKNOWN_ERROR; + } + } + + if (!hwaddr_is_zero(macaddr)) { + s = cntlr_find_sta(c, macaddr); + if (s) { + s->de_sta->mapsta.stats.no_candidate_cnt = 0; + s->de_sta->mapsta.stats.blacklist_attempt_cnt = 0; + s->de_sta->mapsta.stats.blacklist_success_cnt = 0; + s->de_sta->mapsta.stats.blacklist_failure_cnt = 0; + s->de_sta->mapsta.stats.btm_attempt_cnt = 0; + s->de_sta->mapsta.stats.btm_success_cnt = 0; + s->de_sta->mapsta.stats.btm_failure_cnt = 0; + s->de_sta->mapsta.stats.btm_query_resp_cnt = 0; + timestamp_reset(&s->de_sta->mapsta.stats.last_attempt_tsp); + timestamp_reset(&s->de_sta->mapsta.stats.last_steer_tsp); + } + return UBUS_STATUS_OK; + } + + list_for_each_entry(s, &c->stalist, list) { + s->de_sta->mapsta.stats.no_candidate_cnt = 0; + s->de_sta->mapsta.stats.blacklist_attempt_cnt = 0; + s->de_sta->mapsta.stats.blacklist_success_cnt = 0; + s->de_sta->mapsta.stats.blacklist_failure_cnt = 0; + s->de_sta->mapsta.stats.btm_attempt_cnt = 0; + s->de_sta->mapsta.stats.btm_success_cnt = 0; + s->de_sta->mapsta.stats.btm_failure_cnt = 0; + s->de_sta->mapsta.stats.btm_query_resp_cnt = 0; + timestamp_reset(&s->de_sta->mapsta.stats.last_attempt_tsp); + timestamp_reset(&s->de_sta->mapsta.stats.last_steer_tsp); + } + + c->dlem.network.steer_summary.no_candidate_cnt = 0; + c->dlem.network.steer_summary.blacklist_attempt_cnt = 0; + c->dlem.network.steer_summary.blacklist_success_cnt = 0; + c->dlem.network.steer_summary.blacklist_failure_cnt = 0; + c->dlem.network.steer_summary.btm_attempt_cnt = 0; + c->dlem.network.steer_summary.btm_success_cnt = 0; + c->dlem.network.steer_summary.btm_failure_cnt = 0; + c->dlem.network.steer_summary.btm_query_resp_cnt = 0; + + return UBUS_STATUS_OK; +} + #if (EASYMESH_VERSION > 2) static int cntlr_dbg_list_uris(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, @@ -165,6 +239,8 @@ int cntlr_publish_dbg_object(struct controller *c, const char *objname) struct ubus_method *obj_methods; struct ubus_method m[] = { UBUS_METHOD_NOARG("list_macs", cntlr_dbg_list_macs), + UBUS_METHOD("clear_steer_summary", cntlr_dbg_clear_steer_summary, + clr_steer_summary_params), #if (EASYMESH_VERSION > 2) UBUS_METHOD_NOARG("list_uris", cntlr_dbg_list_uris), #endif