timeout clean
This commit is contained in:
parent
25d424b716
commit
c723c8c182
|
@ -21,6 +21,8 @@ static int ubus_get_clients(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
sprintf(mac_buf, MACSTR, MAC2STR(el->addr));
|
sprintf(mac_buf, MACSTR, MAC2STR(el->addr));
|
||||||
c = blobmsg_open_table(&b, mac_buf);
|
c = blobmsg_open_table(&b, mac_buf);
|
||||||
blobmsg_add_u32(&b, "try", el->try);
|
blobmsg_add_u32(&b, "try", el->try);
|
||||||
|
blobmsg_add_u32(&b, "time", el->time);
|
||||||
|
blobmsg_add_u32(&b, "authed", el->authed);
|
||||||
blobmsg_add_u32(&b, "connected", el->connected);
|
blobmsg_add_u32(&b, "connected", el->connected);
|
||||||
blobmsg_add_u32(&b, "freq_highest", el->freq_highest);
|
blobmsg_add_u32(&b, "freq_highest", el->freq_highest);
|
||||||
blobmsg_add_u32(&b, "signal_lowfreq", el->signal_lowfreq);
|
blobmsg_add_u32(&b, "signal_lowfreq", el->signal_lowfreq);
|
||||||
|
@ -97,6 +99,43 @@ static int ubus_set_client_threashold(struct ubus_context *ctx, struct ubus_obje
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ubus_get_clean_values(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, "every", clean_every);
|
||||||
|
blobmsg_add_u32(&b, "older_then", clean_older_then);
|
||||||
|
ubus_send_reply(ctx, req, b.head);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SET_CLEAN_EVERY,
|
||||||
|
SET_CLEAN_OLDER_THEN,
|
||||||
|
__SET_CLEAN_VALUES_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct blobmsg_policy ubus_set_clean_values_policy[__SET_CLEAN_VALUES_MAX] = {
|
||||||
|
[SET_CLEAN_EVERY] = { "every", BLOBMSG_TYPE_INT32 },
|
||||||
|
[SET_CLEAN_OLDER_THEN] = { "older_then", BLOBMSG_TYPE_INT32 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static int ubus_set_clean_values(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
|
struct ubus_request_data *req, const char *method, struct blob_attr *msg)
|
||||||
|
{
|
||||||
|
struct blob_attr *tb[__SET_CLEAN_VALUES_MAX];
|
||||||
|
|
||||||
|
blobmsg_parse(ubus_set_clean_values_policy, __SET_CLEAN_VALUES_MAX, tb, blob_data(msg), blob_len(msg));
|
||||||
|
if (!tb[SET_CLEAN_EVERY] && !tb[SET_CLEAN_OLDER_THEN])
|
||||||
|
return UBUS_STATUS_INVALID_ARGUMENT;
|
||||||
|
if (tb[SET_CLEAN_EVERY])
|
||||||
|
clean_every = blobmsg_get_u32(tb[SET_CLEAN_EVERY]);
|
||||||
|
if (tb[SET_CLEAN_OLDER_THEN])
|
||||||
|
clean_older_then = blobmsg_get_u32(tb[SET_CLEAN_OLDER_THEN]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int ubus_is_client_probe_learning(struct ubus_context *ctx, struct ubus_object *obj,
|
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)
|
struct ubus_request_data *req, const char *method, struct blob_attr *msg)
|
||||||
{
|
{
|
||||||
|
@ -127,6 +166,10 @@ static const struct ubus_method wifictld_ubus_methods[] = {
|
||||||
UBUS_METHOD_NOARG("get_client_threasholds", ubus_get_client_threasholds),
|
UBUS_METHOD_NOARG("get_client_threasholds", ubus_get_client_threasholds),
|
||||||
UBUS_METHOD("set_client_threasholds", ubus_set_client_threashold, ubus_set_client_threashold_policy),
|
UBUS_METHOD("set_client_threasholds", ubus_set_client_threashold, ubus_set_client_threashold_policy),
|
||||||
|
|
||||||
|
// client threasholds
|
||||||
|
UBUS_METHOD_NOARG("get_clean_values", ubus_get_clean_values),
|
||||||
|
UBUS_METHOD("set_clean_values", ubus_set_clean_values, ubus_set_clean_values_policy),
|
||||||
|
|
||||||
// learn by probe (or only auth)
|
// learn by probe (or only auth)
|
||||||
UBUS_METHOD_NOARG("is_client_probe_learning", ubus_is_client_probe_learning),
|
UBUS_METHOD_NOARG("is_client_probe_learning", ubus_is_client_probe_learning),
|
||||||
UBUS_METHOD_NOARG("toggle_client_probe_learning", ubus_toggle_client_probe_learning),
|
UBUS_METHOD_NOARG("toggle_client_probe_learning", ubus_toggle_client_probe_learning),
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
#include <libubox/avl.h>
|
#include <libubox/avl.h>
|
||||||
|
#include <libubox/uloop.h>
|
||||||
#include "hostapd/ieee802_11_defs.h" // ETH_ALEN
|
#include "hostapd/ieee802_11_defs.h" // ETH_ALEN
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "wifi_clients.h"
|
#include "wifi_clients.h"
|
||||||
|
@ -9,8 +11,40 @@
|
||||||
int client_try_threashold = 4;
|
int client_try_threashold = 4;
|
||||||
int client_signal_threashold = -75;
|
int client_signal_threashold = -75;
|
||||||
|
|
||||||
|
int clean_every = 600; //in ms = 10min
|
||||||
|
int clean_older_then = 3600; //in sec = 1h
|
||||||
|
|
||||||
struct avl_tree clients_by_addr;
|
struct avl_tree clients_by_addr;
|
||||||
|
|
||||||
|
|
||||||
|
void clean_cbhandler(struct uloop_timeout *t)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
time_t now;
|
||||||
|
time(&now);
|
||||||
|
now -= clean_older_then;
|
||||||
|
struct wifi_client *client, *ptr;
|
||||||
|
avl_for_each_element_safe(&clients_by_addr, client, avl, ptr) {
|
||||||
|
if (client->time < now && client->authed == 0) {
|
||||||
|
avl_delete(&clients_by_addr, &client->avl);
|
||||||
|
log_verbose("clean_client(): "MACSTR" remove from memory\n", MAC2STR(client->addr));
|
||||||
|
free(client);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uloop_timeout_set(t, clean_every * 1000);
|
||||||
|
|
||||||
|
if (i > 0) {
|
||||||
|
log_info("remove %d clients from memory\n", i);
|
||||||
|
}else{
|
||||||
|
log_verbose("clean_client(): remove %d clients from memory\n", i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct uloop_timeout clean = {
|
||||||
|
.cb = clean_cbhandler
|
||||||
|
};
|
||||||
|
|
||||||
static int avl_compare_macaddr(const void *k1, const void *k2, void *ptr)
|
static int avl_compare_macaddr(const void *k1, const void *k2, void *ptr)
|
||||||
{
|
{
|
||||||
return memcmp(k1, k2, ETH_ALEN);
|
return memcmp(k1, k2, ETH_ALEN);
|
||||||
|
@ -18,6 +52,8 @@ static int avl_compare_macaddr(const void *k1, const void *k2, void *ptr)
|
||||||
|
|
||||||
int wifi_clients_init() {
|
int wifi_clients_init() {
|
||||||
avl_init(&clients_by_addr, avl_compare_macaddr, false, NULL);
|
avl_init(&clients_by_addr, avl_compare_macaddr, false, NULL);
|
||||||
|
uloop_timeout_set(&clean, clean_every * 1000);
|
||||||
|
uloop_timeout_add(&clean);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +73,8 @@ struct wifi_client *__get_client(const u8 *address){
|
||||||
client = calloc(sizeof(*client), 1);
|
client = calloc(sizeof(*client), 1);
|
||||||
memcpy(client->addr, address, sizeof(client->addr));
|
memcpy(client->addr, address, sizeof(client->addr));
|
||||||
client->try = 0;
|
client->try = 0;
|
||||||
|
time(&client->time);
|
||||||
|
client->authed = 0;
|
||||||
client->connected = 0;
|
client->connected = 0;
|
||||||
client->freq_highest = 0;
|
client->freq_highest = 0;
|
||||||
client->signal_lowfreq = 0;
|
client->signal_lowfreq = 0;
|
||||||
|
@ -60,7 +98,7 @@ void __client_learn(struct wifi_client *client, uint32_t freq, uint32_t ssi_sign
|
||||||
client->signal_lowfreq = ssi_signal;
|
client->signal_lowfreq = ssi_signal;
|
||||||
}
|
}
|
||||||
log_debug("\n");
|
log_debug("\n");
|
||||||
//TODO time set and reset clean
|
time(&client->time);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wifi_clients_learn(const u8 *address, uint32_t freq, uint32_t ssi_signal) {
|
void wifi_clients_learn(const u8 *address, uint32_t freq, uint32_t ssi_signal) {
|
||||||
|
@ -80,6 +118,7 @@ int wifi_clients_try(const u8 *address, uint32_t freq, uint32_t ssi_signal) {
|
||||||
if (freq > WIFI_CLIENT_FREQ_THREASHOLD) {
|
if (freq > WIFI_CLIENT_FREQ_THREASHOLD) {
|
||||||
log_info("accept\n");
|
log_info("accept\n");
|
||||||
client->try = 0;
|
client->try = 0;
|
||||||
|
client->authed = 1;
|
||||||
client->connected = 1;
|
client->connected = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -93,6 +132,7 @@ int wifi_clients_try(const u8 *address, uint32_t freq, uint32_t ssi_signal) {
|
||||||
if(client->try > client_try_threashold) {
|
if(client->try > client_try_threashold) {
|
||||||
log_info("accept - threashold\n");
|
log_info("accept - threashold\n");
|
||||||
client->try = 0;
|
client->try = 0;
|
||||||
|
client->authed = 1;
|
||||||
client->connected = 1;
|
client->connected = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,20 +2,24 @@
|
||||||
#define __WIFICTLD_WIFI_CLIENTS_H
|
#define __WIFICTLD_WIFI_CLIENTS_H
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <time.h>
|
||||||
#include <libubox/avl.h>
|
#include <libubox/avl.h>
|
||||||
#include "hostapd/ieee802_11_defs.h"
|
#include "hostapd/ieee802_11_defs.h"
|
||||||
|
|
||||||
extern int client_try_threashold;
|
extern int client_try_threashold;
|
||||||
extern int client_signal_threashold;
|
extern int client_signal_threashold;
|
||||||
|
extern int clean_every;
|
||||||
|
extern int clean_older_then;
|
||||||
extern struct avl_tree clients_by_addr;
|
extern struct avl_tree clients_by_addr;
|
||||||
|
|
||||||
|
|
||||||
struct wifi_client {
|
struct wifi_client {
|
||||||
struct avl_node avl;
|
struct avl_node avl;
|
||||||
u8 addr[ETH_ALEN];
|
u8 addr[ETH_ALEN];
|
||||||
int time;
|
time_t time;
|
||||||
int try;
|
int try;
|
||||||
bool connected;
|
bool connected;
|
||||||
|
bool authed;
|
||||||
uint32_t freq_highest;
|
uint32_t freq_highest;
|
||||||
uint32_t signal_lowfreq;
|
uint32_t signal_lowfreq;
|
||||||
uint32_t signal_highfreq;
|
uint32_t signal_highfreq;
|
||||||
|
|
Loading…
Reference in New Issue