STA_DISCONNECTED = 2,
};
+enum usteer_beacon_measurement_mode {
+ BEACON_MEASUREMENT_PASSIVE = 0,
+ BEACON_MEASUREMENT_ACTIVE = 1,
+ BEACON_MEASUREMENT_TABLE = 2,
+};
+
struct sta_info;
struct usteer_local_node;
struct usteer_remote_host;
struct usteer_node {
struct avl_node avl;
struct list_head sta_info;
+ struct list_head measurements;
enum usteer_node_type type;
bool disabled;
int freq;
+ int channel;
+ int op_class;
int noise;
int n_assoc;
int max_assoc;
int load;
+
+ struct {
+ int source;
+ int target;
+ } roam_events;
+
+ uint64_t created;
};
struct usteer_scan_request {
uint32_t max_retry_band;
uint32_t seen_policy_timeout;
+ uint32_t measurement_report_timeout;
bool assoc_steering;
+ uint32_t max_neighbor_reports;
+
uint32_t band_steering_threshold;
uint32_t load_balancing_threshold;
uint32_t remote_node_timeout;
int32_t min_snr;
+ uint32_t min_snr_kick_delay;
int32_t min_connect_snr;
uint32_t signal_diff_threshold;
int32_t roam_scan_snr;
+ uint32_t roam_process_timeout;
+
uint32_t roam_scan_tries;
+ uint32_t roam_scan_timeout;
uint32_t roam_scan_interval;
int32_t roam_trigger_snr;
struct blob_attr *ssid_list;
};
+struct usteer_bss_tm_query {
+ struct list_head list;
+
+ /* Can't use sta_info here, as the STA might already be deleted */
+ uint8_t sta_addr[6];
+ uint8_t dialog_token;
+};
+
struct sta_info_stats {
uint32_t requests;
uint32_t blocked_cur;
struct sta_info_stats stats[__EVENT_TYPE_MAX];
uint64_t created;
uint64_t seen;
+ uint64_t last_connected;
int signal;
+ uint8_t rrm;
+ bool bss_transition;
+
enum roam_trigger_state roam_state;
uint8_t roam_tries;
uint64_t roam_event;
uint64_t roam_kick;
- uint64_t roam_scan_done;
+ uint64_t roam_scan_start;
+ uint64_t roam_scan_timeout_start;
+
+ struct {
+ uint8_t status_code;
+ uint64_t timestamp;
+ } bss_transition_response;
int kick_count;
+ uint32_t below_min_snr;
+
uint8_t scan_band : 1;
uint8_t connected : 2;
};
struct sta {
struct avl_node avl;
struct list_head nodes;
+ struct list_head measurements;
uint8_t seen_2ghz : 1;
uint8_t seen_5ghz : 1;
uint8_t addr[6];
};
+struct usteer_beacon_report {
+ uint8_t rcpi;
+ uint8_t rsni;
+};
+
+struct usteer_measurement_report {
+ struct usteer_timeout timeout;
+
+ struct list_head list;
+
+ struct usteer_node *node;
+ struct list_head node_list;
+
+ struct sta *sta;
+ struct list_head sta_list;
+
+ uint64_t timestamp;
+
+ struct usteer_beacon_report beacon_report;
+};
+
extern struct ubus_context *ubus_ctx;
extern struct usteer_config config;
extern struct list_head node_handlers;
bool usteer_handle_sta_event(struct usteer_node *node, const uint8_t *addr,
enum usteer_event_type type, int freq, int signal);
+int usteer_snr_to_signal(struct usteer_node *node, int snr);
+
void usteer_local_nodes_init(struct ubus_context *ctx);
void usteer_local_node_kick(struct usteer_local_node *ln);
+int usteer_local_node_get_beacon_interval(struct usteer_local_node *ln);
+
void usteer_ubus_init(struct ubus_context *ctx);
void usteer_ubus_kick_client(struct sta_info *si);
int usteer_ubus_trigger_client_scan(struct sta_info *si);
int usteer_ubus_notify_client_disassoc(struct sta_info *si);
+int usteer_ubus_bss_transition_request(struct sta_info *si,
+ uint8_t dialog_token,
+ bool disassoc_imminent,
+ bool abridged,
+ uint8_t validity_period);
struct sta *usteer_sta_get(const uint8_t *addr, bool create);
struct sta_info *usteer_sta_info_get(struct sta *sta, struct usteer_node *node, bool *create);
+bool usteer_sta_supports_beacon_measurement_mode(struct sta_info *si, enum usteer_beacon_measurement_mode mode);
+
+void usteer_sta_disconnected(struct sta_info *si);
void usteer_sta_info_update_timeout(struct sta_info *si, int timeout);
void usteer_sta_info_update(struct sta_info *si, int signal, bool avg);
}
void usteer_node_set_blob(struct blob_attr **dest, struct blob_attr *val);
+struct usteer_local_node *usteer_local_node_by_bssid(uint8_t *bssid);
+struct usteer_remote_node *usteer_remote_node_by_bssid(uint8_t *bssid);
+struct usteer_node *usteer_node_by_bssid(uint8_t *bssid);
+
+struct usteer_node *usteer_node_get_next_neighbor(struct usteer_node *current_node, struct usteer_node *last);
bool usteer_check_request(struct sta_info *si, enum usteer_event_type type);
void config_set_interfaces(struct blob_attr *data);
void usteer_dump_node(struct blob_buf *buf, struct usteer_node *node);
void usteer_dump_host(struct blob_buf *buf, struct usteer_remote_host *host);
+struct usteer_measurement_report * usteer_measurement_report_get(struct sta *sta, struct usteer_node *node, bool create);
+void usteer_measurement_report_node_cleanup(struct usteer_node *node);
+void usteer_measurement_report_sta_cleanup(struct sta *sta);
+void usteer_measurement_report_del(struct usteer_measurement_report *mr);
+
+struct usteer_measurement_report *
+usteer_measurement_report_add_beacon_report(struct sta *sta, struct usteer_node *node, struct usteer_beacon_report *br, uint64_t timestamp);
+
#endif