mirror of
https://dev.iopsys.eu/hal/wifimngr.git
synced 2025-12-20 01:11:11 +08:00
506 lines
17 KiB
C
506 lines
17 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* wifimngr.h - header file for wifimngr.
|
|
*
|
|
* Copyright (C) 2019-2024 IOPSYS Software Solutions AB. All rights reserved.
|
|
* Copyright (C) 2025 Genexis AB.
|
|
*
|
|
* Author: Anjan Chanda <anjan.chanda@genexis.eu>
|
|
*/
|
|
|
|
#ifndef WIFIMNGR_H
|
|
#define WIFIMNGR_H
|
|
|
|
#include <linux/limits.h>
|
|
|
|
#include "wifimngr_opts.h"
|
|
|
|
#define WIFI_DEV_MAX_NUM 8
|
|
#define WIFI_IF_MAX_NUM 32
|
|
#define WIFI_MLD_MAX_NUM 4
|
|
|
|
#define WIFI_OBJECT "wifi"
|
|
#define WIFI_WPS_OBJECT "wifi.wps"
|
|
|
|
#define WIFI_RADIO_OBJECT "wifi.radio"
|
|
#define WIFI_AP_OBJECT "wifi.ap"
|
|
#define WIFI_BSTA_OBJECT "wifi.bsta"
|
|
#define WIFI_APMLD_OBJECT "wifi.apmld"
|
|
#define WIFI_BSTAMLD_OBJECT "wifi.bstamld"
|
|
|
|
#define WIFI_AP_OBJECT_PREFIX WIFI_AP_OBJECT"."
|
|
#define WIFI_RADIO_OBJECT_PREFIX WIFI_RADIO_OBJECT"."
|
|
#define WIFI_BSTA_OBJECT_PREFIX WIFI_BSTA_OBJECT"."
|
|
#define WIFI_APMLD_OBJECT_PREFIX WIFI_APMLD_OBJECT"."
|
|
#define WIFI_BSTAMLD_OBJECT_PREFIX WIFI_BSTAMLD_OBJECT"."
|
|
|
|
|
|
/* wifi ubus objects */
|
|
struct wifi_ubus_object {
|
|
void *priv;
|
|
struct ubus_object obj;
|
|
struct ubus_object_type obj_type;
|
|
struct list_head list;
|
|
};
|
|
|
|
/* initial estimate for number of APs in scanresults */
|
|
#define NUM_SCANRES 128
|
|
#define MAX_NUM_SUPP_CHANNELS 64
|
|
#define MAX_NUM_PER_CHANNEL_SCANRES 64
|
|
|
|
struct wifimngr_channel {
|
|
uint32_t channel; /* 20MHz ctrl-channel */
|
|
uint32_t freq; /* frequency in MHz */
|
|
|
|
#ifdef WIFI_CACHE_SCANRESULTS
|
|
/* cached scanresults from latest scan */
|
|
time_t scanres_ts;
|
|
int num_scanres;
|
|
struct wifi_bss *scanres;
|
|
#endif
|
|
};
|
|
|
|
struct wifimngr_device {
|
|
char device[16];
|
|
char phy[16];
|
|
union {
|
|
uint8_t macaddr[6];
|
|
char phypath[256];
|
|
};
|
|
char country[3];
|
|
enum wifi_band band;
|
|
bool disabled;
|
|
bool mlo_capable;
|
|
bool mlo;
|
|
uint32_t object_id;
|
|
|
|
int num_ch;
|
|
struct wifimngr_channel ch[MAX_NUM_SUPP_CHANNELS];
|
|
};
|
|
|
|
struct wifimngr_iface {
|
|
char iface[16];
|
|
char device[16];
|
|
char phy[16];
|
|
char mld[16];
|
|
char mld_netdev[16];
|
|
enum wifi_band band;
|
|
bool mlo;
|
|
enum wifi_mode mode;
|
|
int disabled;
|
|
uint32_t object_id;
|
|
};
|
|
|
|
struct wifimngr_mld {
|
|
char ifname[16];
|
|
enum wifi_mode mode;
|
|
uint32_t object_id;
|
|
};
|
|
|
|
struct wifimngr {
|
|
struct wifimngr_device wdev[WIFI_DEV_MAX_NUM];
|
|
int num_wifi_device;
|
|
|
|
struct wifimngr_iface ifs[WIFI_IF_MAX_NUM];
|
|
int num_wifi_iface;
|
|
|
|
struct wifimngr_mld mld[WIFI_MLD_MAX_NUM];
|
|
int num_wifi_mld;
|
|
|
|
const char *evmap_file;
|
|
const char *conffile;
|
|
struct uloop_timeout hbtimer;
|
|
uint64_t ticks;
|
|
|
|
#ifdef HAS_UBUS
|
|
struct ubus_context *ubus_ctx;
|
|
struct ubus_object wifi_obj;
|
|
struct ubus_object wifi_wps_obj;
|
|
#endif
|
|
|
|
int num_wifi_device_obj;
|
|
int num_wifi_iface_obj;
|
|
|
|
struct list_head event_list;
|
|
struct list_head radiolist; /* list of wifi_ubus_objects */
|
|
struct list_head iflist; /* list of wifi_ubus_objects */
|
|
};
|
|
|
|
int wifimngr_get_wifi_devices(struct wifimngr *w, const char *conffile);
|
|
int wifimngr_get_wifi_interfaces(struct wifimngr *w, const char *conffile);
|
|
int wifimngr_get_wifi_mlds(struct wifimngr *w, const char *conffile);
|
|
|
|
struct wifimngr_device *wifimngr_ifname_to_device(struct wifimngr *w, const char *ifname);
|
|
|
|
const char *ubus_objname_to_ifname(struct ubus_object *obj);
|
|
|
|
#define UBUS_METHOD_ADD(_tab, iter, __m) \
|
|
do { \
|
|
struct ubus_method ___m = __m; \
|
|
memcpy(&_tab[iter++], &___m, sizeof(struct ubus_method)); \
|
|
} while(0)
|
|
|
|
|
|
int add_wifi_methods(struct wifimngr *w, struct ubus_object *wifi_obj);
|
|
int add_wps_methods(struct wifimngr *w, struct ubus_object *wifi_wps_obj);
|
|
|
|
int wifimngr_add_objects(struct wifimngr *w);
|
|
|
|
int wifimngr_add_object(struct wifimngr *w, const char *objname,
|
|
int (*add_methods)(struct wifimngr *w, struct ubus_object *o),
|
|
struct ubus_object *object);
|
|
|
|
int wifimngr_add_radio_object(struct wifimngr *w, struct wifimngr_device *wdev);
|
|
int wifimngr_add_interface_object(struct wifimngr *w, struct wifimngr_iface *iface);
|
|
int wifimngr_add_mld_interface_object(struct wifimngr *w, struct wifimngr_mld *mldif);
|
|
|
|
int wifimngr_main(struct wifimngr_cmdline_opts *opts);
|
|
int wifimngr_init(struct wifimngr **w, struct wifimngr_cmdline_opts *opts);
|
|
int wifimngr_exit(struct wifimngr *w);
|
|
|
|
int wifimngr_reconfig(struct wifimngr *w);
|
|
|
|
void wifimngr_version(void);
|
|
|
|
/* uci functions */
|
|
int uci_add_wifi_iface(char **argv);
|
|
int uci_del_wifi_iface(char *ifname);
|
|
int uci_get_wifi_devices(struct wifimngr *w, const char *conffile);
|
|
int uci_get_wifi_interfaces(struct wifimngr *w, const char *conffile);
|
|
int uci_get_wifi_mlds(struct wifimngr *w, const char *conffile);
|
|
|
|
|
|
extern int wifimngr_nl_msgs_handler(struct ubus_context *ctx);
|
|
|
|
//void wifimngr_event_init(void);
|
|
void wifimngr_event_exit(struct wifimngr *w);
|
|
|
|
int wifimngr_events_register(struct wifimngr *w, const char *ifname,
|
|
const char *family, const char *group);
|
|
|
|
int wifimngr_event_register(struct wifimngr *w, const char *ifname,
|
|
const char *family, const char *group);
|
|
|
|
void wifimngr_event_unregister(struct wifimngr *w, const char *ifname);
|
|
|
|
void wifimngr_del_object(struct wifimngr *w, struct ubus_object *obj, bool remove_from_ubus);
|
|
|
|
struct wifimngr_device *wifimngr_lookup_wifi_device(struct wifimngr *w,
|
|
const char *device);
|
|
|
|
#ifdef WIFI_CACHE_SCANRESULTS
|
|
int wifimngr_get_initial_scanresults(struct wifimngr *w);
|
|
int wifimngr_update_scanresults_cache(struct wifimngr_device *wdev, int sz, char *evbuf);
|
|
void wifimngr_flush_scanresults(struct wifimngr *w);
|
|
#endif
|
|
|
|
//TODO: deprecate
|
|
int find_phy_from_device_path(char *path, char *phy, size_t size);
|
|
bool phy_dir_exist(char *phy);
|
|
|
|
|
|
int wl_radio_help(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_radio_status(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_radio_stats(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_scan(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_scan_ex(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_scanresults(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_autochannel(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_start_cac(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_stop_cac(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_simulate_radar(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_add_iface(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_del_iface(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_channels_info(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_channels(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_opclass_preferences(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_radio_get_param(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
|
|
|
|
|
|
int wl_ap_dump_beacon(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_apmld_dump_beacon(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_ap_help(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_ap_status(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_ap_stats(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_assoclist(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_block_sta(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_apmld_block_sta(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_blocked_stas(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_apmld_blocked_stas(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int ap_chan_switch(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_stations(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_sta_ratings(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_apmld_sta_ratings(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int sta_disconnect(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int sta_probe(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int sta_monitor_add(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int sta_monitor_del(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int sta_monitor_get(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int subscribe_frame(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int unsubscribe_frame(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int ap_measure_link(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int ap_mbo_disallow_assoc(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int ap_bss_up(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int ap_bss_down(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int ap_send_action(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
|
|
int wl_sta_dpp_listen(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_sta_dpp_stop_listen(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int set_qos_map(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int send_qos_map_conf(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
|
|
int nbr_add(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int nbr_del(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int nbr_list(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int nbr_request(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int btm_request(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int assoc_control(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int vsie_add(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *ureq, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int vsie_del(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *ureq, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_sta_status(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_sta_stats(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_sta_disconnect_ap(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_sta_4addr(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_status(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_help_command(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg, const char *command);
|
|
|
|
int wl_help(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_wps_help(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wifi_set_debug(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_apmld_help(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_apmld_status(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_apmld_stats(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_apmld_assoclist(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_apmld_stations(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_apmld_disconnect_sta(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_mldsta_status(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_mldsta_stats(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
int wl_mldsta_disconnect_ap(struct ubus_context *ctx, struct ubus_object *obj,
|
|
struct ubus_request_data *req, const char *method,
|
|
struct blob_attr *msg);
|
|
|
|
|
|
#ifndef blobmsg_add_macaddr
|
|
#define blobmsg_add_macaddr(b, f, v) \
|
|
do { \
|
|
char _vstr[18] = {0}; \
|
|
hwaddr_ntoa((v), _vstr); \
|
|
blobmsg_add_string(b, f, _vstr);\
|
|
} while (0)
|
|
#endif
|
|
|
|
#endif /* WIFIMNGR_H */
|