diff --git a/wireless/wifictld/src/main.c b/wireless/wifictld/src/main.c index 0caddc4..8d82fb7 100644 --- a/wireless/wifictld/src/main.c +++ b/wireless/wifictld/src/main.c @@ -7,8 +7,6 @@ int main(int argc, char *argv[]) { - client_probe_learning = 1; - int ret = 0; #ifdef MINI diff --git a/wireless/wifictld/src/ubus_events.c b/wireless/wifictld/src/ubus_events.c index cb44862..48e556f 100644 --- a/wireless/wifictld/src/ubus_events.c +++ b/wireless/wifictld/src/ubus_events.c @@ -7,7 +7,9 @@ #include "log.h" #include "wifi_clients.h" -int client_probe_learning = 0; +bool client_probe_steering = true; +// steering contains learning already +bool client_probe_learning = false; static struct blob_buf b; @@ -100,28 +102,37 @@ static int receive_notify(struct ubus_context *ctx, struct ubus_object *obj, str // handle - log_debug("ubus_events.receive_notify(): handle\n"); - + log_verbose("%s["MACSTR"] freq: %d signal %d", method, MAC2STR(addr), freq, ssi_signal); if (!strcmp(method, "auth")) { if (wifi_clients_try(addr, freq, ssi_signal)) { - log_debug("auth["MACSTR"] freq: %d signal %d -> reject\n", MAC2STR(addr), freq, ssi_signal); + log_debug(" -> reject\n"); return WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY; } - log_debug("auth["MACSTR"] freq: %d signal %d -> accept\n", MAC2STR(addr), freq, ssi_signal); + log_debug(" -> accept\n"); return WLAN_STATUS_SUCCESS; } - - log_verbose("%s["MACSTR"] freq: %d signal %d", method, MAC2STR(addr), freq, ssi_signal); - if (!strcmp(method, "deauth")) { - log_verbose(" disconnect"); - wifi_clients_disconnect(addr, freq, ssi_signal); - } else if (!strcmp(method, "probe") && client_probe_learning) { - log_verbose(" learn"); + if (!strcmp(method, "probe")) { + if(client_probe_steering) { + if (wifi_clients_try(addr, freq, ssi_signal)) { + log_debug(" -> reject\n"); + return WLAN_STATUS_UNSPECIFIED_FAILURE; + } + log_debug(" -> accept\n"); + return WLAN_STATUS_SUCCESS; + } + if(client_probe_learning) { + log_verbose(" learn"); wifi_clients_learn(addr, freq, ssi_signal); + } + } + + if (!strcmp(method, "deauth")) { + wifi_clients_disconnect(addr, freq, ssi_signal); + log_verbose(" -> disconnect\n"); + return WLAN_STATUS_SUCCESS; } log_verbose("\n"); return WLAN_STATUS_SUCCESS; - } diff --git a/wireless/wifictld/src/ubus_events.h b/wireless/wifictld/src/ubus_events.h index 0b07683..5a4b5de 100644 --- a/wireless/wifictld/src/ubus_events.h +++ b/wireless/wifictld/src/ubus_events.h @@ -3,7 +3,13 @@ #include -extern int client_probe_learning; +extern bool client_probe_steering; +/* + steering contains learning already: + when client_probe_steering is set, + client_probe_learning is ignored +*/ +extern bool client_probe_learning; int wifictld_ubus_bind_events(struct ubus_context *ctx); diff --git a/wireless/wifictld/src/ubus_service.c b/wireless/wifictld/src/ubus_service.c index 5c726af..10214ee 100644 --- a/wireless/wifictld/src/ubus_service.c +++ b/wireless/wifictld/src/ubus_service.c @@ -136,6 +136,26 @@ static int ubus_set_clean_values(struct ubus_context *ctx, struct ubus_object *o return 0; } +static int ubus_is_client_probe_steering(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, struct blob_attr *msg) +{ + blob_buf_init(&b, 0); + blobmsg_add_u32(&b, "current", client_probe_steering); + ubus_send_reply(ctx, req, b.head); + return 0; +} + +static int ubus_toggle_client_probe_steering(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, struct blob_attr *msg) +{ + blob_buf_init(&b, 0); + blobmsg_add_u32(&b, "before", client_probe_steering); + client_probe_steering = !client_probe_steering; + blobmsg_add_u32(&b, "current", client_probe_steering); + ubus_send_reply(ctx, req, b.head); + return 0; +} + static int ubus_is_client_probe_learning(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { @@ -170,6 +190,10 @@ static const struct ubus_method wifictld_ubus_methods[] = { UBUS_METHOD_NOARG("get_clean_values", ubus_get_clean_values), UBUS_METHOD("set_clean_values", ubus_set_clean_values, ubus_set_clean_values_policy), + // steering by probe (or only auth) + UBUS_METHOD_NOARG("is_client_probe_steering", ubus_is_client_probe_steering), + UBUS_METHOD_NOARG("toggle_client_probe_steering", ubus_toggle_client_probe_steering), + // learn by probe (or only auth) UBUS_METHOD_NOARG("is_client_probe_learning", ubus_is_client_probe_learning), UBUS_METHOD_NOARG("toggle_client_probe_learning", ubus_toggle_client_probe_learning),