• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/usteer/usteer.h

  1 /*
  2  *   This program is free software; you can redistribute it and/or modify
  3  *   it under the terms of the GNU General Public License as published by
  4  *   the Free Software Foundation; either version 2 of the License.
  5  *
  6  *   This program is distributed in the hope that it will be useful,
  7  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  8  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9  *   GNU General Public License for more details.
 10  *
 11  *   You should have received a copy of the GNU General Public License
 12  *   along with this program; if not, write to the Free Software
 13  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 14  *
 15  *   Copyright (C) 2020 embedd.ch 
 16  *   Copyright (C) 2020 Felix Fietkau <nbd@nbd.name> 
 17  *   Copyright (C) 2020 John Crispin <john@phrozen.org> 
 18  */
 19 
 20 #ifndef __APMGR_H
 21 #define __APMGR_H
 22 
 23 #include <libubox/avl.h>
 24 #include <libubox/blobmsg.h>
 25 #include <libubox/uloop.h>
 26 #include <libubox/utils.h>
 27 #include <libubox/kvlist.h>
 28 #include <libubus.h>
 29 #include "utils.h"
 30 #include "timeout.h"
 31 
 32 #define NO_SIGNAL 0xff
 33 
 34 #define __STR(x)                #x
 35 #define _STR(x)                 __STR(x)
 36 
 37 #define APMGR_V6_MCAST_GROUP    "ff02::4150"
 38 
 39 #define APMGR_PORT              16720 /* AP */
 40 #define APMGR_PORT_STR          _STR(APMGR_PORT)
 41 #define APMGR_BUFLEN            (64 * 1024)
 42 
 43 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
 44 
 45 enum usteer_event_type {
 46         EVENT_TYPE_PROBE,
 47         EVENT_TYPE_ASSOC,
 48         EVENT_TYPE_AUTH,
 49         __EVENT_TYPE_MAX,
 50 };
 51 
 52 enum usteer_node_type {
 53         NODE_TYPE_LOCAL,
 54         NODE_TYPE_REMOTE,
 55 };
 56 
 57 enum usteer_sta_connection_state {
 58         STA_NOT_CONNECTED = 0,
 59         STA_CONNECTED = 1,
 60         STA_DISCONNECTED = 2,
 61 };
 62 
 63 enum usteer_beacon_measurement_mode {
 64         BEACON_MEASUREMENT_PASSIVE = 0,
 65         BEACON_MEASUREMENT_ACTIVE = 1,
 66         BEACON_MEASUREMENT_TABLE = 2,
 67 };
 68 
 69 struct sta_info;
 70 struct usteer_local_node;
 71 struct usteer_remote_host;
 72 
 73 struct usteer_node {
 74         struct avl_node avl;
 75         struct list_head sta_info;
 76         struct list_head measurements;
 77 
 78         enum usteer_node_type type;
 79 
 80         struct blob_attr *rrm_nr;
 81         struct blob_attr *node_info;
 82         char ssid[33];
 83         uint8_t bssid[6];
 84 
 85         bool disabled;
 86         int freq;
 87         int channel;
 88         int op_class;
 89         int noise;
 90         int n_assoc;
 91         int max_assoc;
 92         int load;
 93 
 94         struct {
 95                 int source;
 96                 int target;
 97         } roam_events;
 98 
 99         uint64_t created;
100 };
101 
102 struct usteer_scan_request {
103         int n_freq;
104         int *freq;
105 
106         bool passive;
107 };
108 
109 struct usteer_scan_result {
110         uint8_t bssid[6];
111         char ssid[33];
112 
113         int freq;
114         int signal;
115 };
116 
117 struct usteer_survey_data {
118         uint16_t freq;
119         int8_t noise;
120 
121         uint64_t time;
122         uint64_t time_busy;
123 };
124 
125 struct usteer_freq_data {
126         uint16_t freq;
127 
128         uint8_t txpower;
129         bool dfs;
130 };
131 
132 struct usteer_node_handler {
133         struct list_head list;
134 
135         void (*init_node)(struct usteer_node *);
136         void (*free_node)(struct usteer_node *);
137         void (*update_node)(struct usteer_node *);
138         void (*update_sta)(struct usteer_node *, struct sta_info *);
139         void (*get_survey)(struct usteer_node *, void *,
140                            void (*cb)(void *priv, struct usteer_survey_data *d));
141         void (*get_freqlist)(struct usteer_node *, void *,
142                              void (*cb)(void *priv, struct usteer_freq_data *f));
143         int (*scan)(struct usteer_node *, struct usteer_scan_request *,
144                     void *, void (*cb)(void *priv, struct usteer_scan_result *r));
145 };
146 
147 struct usteer_config {
148         bool syslog;
149         uint32_t debug_level;
150 
151         bool ipv6;
152         bool local_mode;
153 
154         uint32_t sta_block_timeout;
155         uint32_t local_sta_timeout;
156         uint32_t local_sta_update;
157 
158         uint32_t max_retry_band;
159         uint32_t seen_policy_timeout;
160         uint32_t measurement_report_timeout;
161 
162         bool assoc_steering;
163         bool probe_steering;
164 
165         uint32_t max_neighbor_reports;
166 
167         uint32_t band_steering_threshold;
168         uint32_t load_balancing_threshold;
169 
170         uint32_t remote_update_interval;
171         uint32_t remote_node_timeout;
172 
173         int32_t min_snr;
174         uint32_t min_snr_kick_delay;
175         int32_t min_connect_snr;
176         uint32_t signal_diff_threshold;
177 
178         uint32_t steer_reject_timeout;
179 
180         int32_t roam_scan_snr;
181         uint32_t roam_process_timeout;
182 
183         uint32_t roam_scan_tries;
184         uint32_t roam_scan_timeout;
185         uint32_t roam_scan_interval;
186 
187         int32_t roam_trigger_snr;
188         uint32_t roam_trigger_interval;
189 
190         uint32_t roam_kick_delay;
191 
192         uint32_t band_steering_interval;
193         int32_t band_steering_min_snr; 
194 
195         uint32_t link_measurement_interval;
196 
197         uint32_t initial_connect_delay;
198 
199         bool load_kick_enabled;
200         uint32_t load_kick_threshold;
201         uint32_t load_kick_delay;
202         uint32_t load_kick_min_clients;
203         uint32_t load_kick_reason_code;
204 
205         const char *node_up_script;
206         uint32_t event_log_mask;
207 
208         struct blob_attr *ssid_list;
209 };
210 
211 struct usteer_bss_tm_query {
212         struct list_head list;
213 
214         /* Can't use sta_info here, as the STA might already be deleted */
215         uint8_t sta_addr[6];
216         uint8_t dialog_token;
217 };
218 
219 struct sta_info_stats {
220         uint32_t requests;
221         uint32_t blocked_cur;
222         uint32_t blocked_total;
223         uint32_t blocked_last_time;
224 };
225 
226 enum roam_trigger_state {
227         ROAM_TRIGGER_IDLE,
228         ROAM_TRIGGER_SCAN,
229         ROAM_TRIGGER_SCAN_DONE,
230 };
231 
232 struct sta_info {
233         struct list_head list;
234         struct list_head node_list;
235 
236         struct usteer_node *node;
237         struct sta *sta;
238 
239         struct usteer_timeout timeout;
240 
241         struct sta_info_stats stats[__EVENT_TYPE_MAX];
242         uint64_t created;
243         uint64_t seen;
244 
245         uint64_t connected_since;
246         uint64_t last_connected;
247 
248         int signal;
249 
250         uint8_t rrm;
251         bool bss_transition;
252         bool mbo;
253 
254         enum roam_trigger_state roam_state;
255         uint8_t roam_tries;
256         uint64_t roam_event;
257         uint64_t roam_kick;
258         uint64_t roam_scan_start;
259         uint64_t roam_scan_timeout_start;
260 
261         struct {
262                 uint8_t status_code;
263                 uint64_t timestamp;
264         } bss_transition_response;
265 
266         struct {
267                 bool below_snr;
268         } band_steering;
269 
270         uint64_t kick_time;
271 
272         int kick_count;
273 
274         uint32_t below_min_snr;
275 
276         uint8_t scan_band : 1;
277         uint8_t connected : 2;
278 };
279 
280 struct sta {
281         struct avl_node avl;
282         struct list_head nodes;
283         struct list_head measurements;
284 
285         uint8_t seen_2ghz : 1;
286         uint8_t seen_5ghz : 1;
287 
288         uint8_t addr[6];
289 };
290 
291 struct usteer_measurement_report {
292         struct usteer_timeout timeout;
293 
294         struct list_head list;
295 
296         struct usteer_node *node;
297         struct list_head node_list;
298 
299         struct sta *sta;
300         struct list_head sta_list;
301 
302         uint64_t timestamp;
303 
304         uint8_t rcpi;
305         uint8_t rsni;
306 };
307 
308 extern struct ubus_context *ubus_ctx;
309 extern struct usteer_config config;
310 extern struct list_head node_handlers;
311 extern struct avl_tree stations;
312 extern struct ubus_object usteer_obj;
313 extern uint64_t current_time;
314 extern const char * const event_types[__EVENT_TYPE_MAX];
315 extern struct blob_attr *host_info_blob;
316 
317 void usteer_update_time(void);
318 void usteer_init_defaults(void);
319 bool usteer_handle_sta_event(struct usteer_node *node, const uint8_t *addr,
320                             enum usteer_event_type type, int freq, int signal);
321 
322 int usteer_snr_to_signal(struct usteer_node *node, int snr);
323 
324 void usteer_local_nodes_init(struct ubus_context *ctx);
325 void usteer_local_node_kick(struct usteer_local_node *ln);
326 
327 int usteer_local_node_get_beacon_interval(struct usteer_local_node *ln);
328 
329 bool usteer_policy_node_below_max_assoc(struct usteer_node *node);
330 bool usteer_policy_can_perform_roam(struct sta_info *si);
331 
332 void usteer_band_steering_perform_steer(struct usteer_local_node *ln);
333 void usteer_band_steering_sta_update(struct sta_info *si);
334 bool usteer_band_steering_is_target(struct usteer_local_node *ln, struct usteer_node *node);
335 
336 void usteer_ubus_init(struct ubus_context *ctx);
337 void usteer_ubus_kick_client(struct sta_info *si);
338 int usteer_ubus_trigger_client_scan(struct sta_info *si);
339 int usteer_ubus_band_steering_request(struct sta_info *si);
340 int usteer_ubus_bss_transition_request(struct sta_info *si,
341                                        uint8_t dialog_token,
342                                        bool disassoc_imminent,
343                                        bool abridged,
344                                        uint8_t validity_period,
345                                        struct usteer_node *target_node);
346 
347 struct sta *usteer_sta_get(const uint8_t *addr, bool create);
348 struct sta_info *usteer_sta_info_get(struct sta *sta, struct usteer_node *node, bool *create);
349 
350 bool usteer_sta_supports_beacon_measurement_mode(struct sta_info *si, enum usteer_beacon_measurement_mode mode);
351 bool usteer_sta_supports_link_measurement(struct sta_info *si);
352 
353 void usteer_sta_disconnected(struct sta_info *si);
354 void usteer_sta_info_update_timeout(struct sta_info *si, int timeout);
355 void usteer_sta_info_update(struct sta_info *si, int signal, bool avg);
356 
357 static inline const char *usteer_node_name(struct usteer_node *node)
358 {
359         return node->avl.key;
360 }
361 void usteer_node_set_blob(struct blob_attr **dest, struct blob_attr *val);
362 
363 struct usteer_local_node *usteer_local_node_by_bssid(uint8_t *bssid);
364 struct usteer_remote_node *usteer_remote_node_by_bssid(uint8_t *bssid);
365 struct usteer_node *usteer_node_by_bssid(uint8_t *bssid);
366 
367 struct usteer_node *usteer_node_get_next_neighbor(struct usteer_node *current_node, struct usteer_node *last);
368 bool usteer_check_request(struct sta_info *si, enum usteer_event_type type);
369 
370 void config_set_interfaces(struct blob_attr *data);
371 void config_get_interfaces(struct blob_buf *buf);
372 
373 void config_set_node_up_script(struct blob_attr *data);
374 void config_get_node_up_script(struct blob_buf *buf);
375 
376 void config_set_ssid_list(struct blob_attr *data);
377 void config_get_ssid_list(struct blob_buf *buf);
378 
379 int usteer_interface_init(void);
380 void usteer_interface_add(const char *name);
381 void usteer_sta_node_cleanup(struct usteer_node *node);
382 void usteer_send_sta_update(struct sta_info *si);
383 
384 int usteer_lua_init(void);
385 int usteer_lua_ubus_init(void);
386 void usteer_run_hook(const char *name, const char *arg);
387 
388 void usteer_dump_node(struct blob_buf *buf, struct usteer_node *node);
389 void usteer_dump_host(struct blob_buf *buf, struct usteer_remote_host *host);
390 
391 int usteer_measurement_get_rssi(struct usteer_measurement_report *report);
392 
393 struct usteer_measurement_report * usteer_measurement_report_get(struct sta *sta, struct usteer_node *node, bool create);
394 void usteer_measurement_report_node_cleanup(struct usteer_node *node);
395 void usteer_measurement_report_sta_cleanup(struct sta *sta);
396 void usteer_measurement_report_del(struct usteer_measurement_report *mr);
397 
398 struct usteer_measurement_report *
399 usteer_measurement_report_add(struct sta *sta, struct usteer_node *node, uint8_t rcpi, uint8_t rsni, uint64_t timestamp);
400 
401 
402 int usteer_ubus_trigger_link_measurement(struct sta_info *si);
403 #endif
404 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt