root/usr.sbin/bsnmpd/modules/snmp_wlan/wlan_snmp.h
/*-
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Copyright (c) 2010 The FreeBSD Foundation
 *
 * This software was developed by Shteryana Sotirova Shopova under
 * sponsorship from the FreeBSD Foundation.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#define WLAN_IFMODE_MAX                         WlanIfaceOperatingModeType_tdma
#define WLAN_COUNTRY_CODE_SIZE                  3
#define WLAN_BGSCAN_IDLE_MIN                    100 /* XXX */
#define WLAN_SCAN_VALID_MIN                     10 /* XXX */
#define WLAN_TDMA_MAXSLOTS                      2 /* XXX */

struct wlan_iface;

struct wlan_peer {
        uint8_t                         pmac[IEEE80211_ADDR_LEN]; /* key */
        uint16_t                        associd;
        uint16_t                        vlan;
        uint16_t                        frequency;
        uint32_t                        fflags;
        uint8_t                         txrate;
        int8_t                          rssi;
        uint16_t                        idle;
        uint16_t                        txseqs;
        uint16_t                        rxseqs;
        uint16_t                        txpower;
        uint8_t                         capinfo;
        uint32_t                        state;
        uint16_t                        local_id;
        uint16_t                        peer_id;
        SLIST_ENTRY(wlan_peer)          wp;
};

SLIST_HEAD(wlan_peerlist, wlan_peer);

struct wlan_scan_result {
        uint8_t                         ssid[IEEE80211_NWID_LEN + 1];
        uint8_t                         bssid[IEEE80211_ADDR_LEN];
        uint8_t                         opchannel;
        int8_t                          rssi;
        uint16_t                        frequency;
        int8_t                          noise;
        uint16_t                        bintval;
        uint8_t                         capinfo;
        struct wlan_iface               *pwif;
        SLIST_ENTRY(wlan_scan_result)   wsr;
};

SLIST_HEAD(wlan_scanlist, wlan_scan_result);

struct wlan_mac_mac {
        uint8_t                         mac[IEEE80211_ADDR_LEN];
        enum RowStatus                  mac_status;
        SLIST_ENTRY(wlan_mac_mac)       wm;
};

SLIST_HEAD(wlan_maclist, wlan_mac_mac);

struct wlan_mesh_route {
        struct ieee80211req_mesh_route  imroute;
        enum RowStatus                  mroute_status;
        SLIST_ENTRY(wlan_mesh_route)    wr;
};

SLIST_HEAD(wlan_mesh_routes, wlan_mesh_route);

struct wlan_iface {
        char                            wname[IFNAMSIZ];
        uint32_t                        index;
        char                            pname[IFNAMSIZ];
        enum WlanIfaceOperatingModeType mode;
        uint32_t                        flags;
        uint8_t                         dbssid[IEEE80211_ADDR_LEN];
        uint8_t                         dlmac[IEEE80211_ADDR_LEN];
        enum RowStatus                  status;
        enum wlanIfaceState             state;
        uint8_t                         internal;

        uint32_t                        drivercaps;
        uint32_t                        cryptocaps;
        uint32_t                        htcaps;

        uint32_t                        packet_burst;
        uint8_t                         country_code[WLAN_COUNTRY_CODE_SIZE];
        enum WlanRegDomainCode          reg_domain;
        uint8_t                         desired_ssid[IEEE80211_NWID_LEN + 1];
        uint32_t                        desired_channel;
        enum TruthValue                 dyn_frequency;
        enum TruthValue                 fast_frames;
        enum TruthValue                 dturbo;
        int32_t                         tx_power;
        int32_t                         frag_threshold;
        int32_t                         rts_threshold;
        enum TruthValue                 priv_subscribe;
        enum TruthValue                 bg_scan;
        int32_t                         bg_scan_idle;
        int32_t                         bg_scan_interval;
        int32_t                         beacons_missed;
        uint8_t                         desired_bssid[IEEE80211_ADDR_LEN];
        enum wlanIfaceRoamingMode       roam_mode;
        enum TruthValue                 dot11d;
        enum TruthValue                 dot11h;
        enum TruthValue                 dynamic_wds;
        enum TruthValue                 power_save;
        enum TruthValue                 ap_bridge;
        int32_t                         beacon_interval;
        int32_t                         dtim_period;
        enum TruthValue                 hide_ssid;
        enum TruthValue                 inact_process;
        enum wlanIfaceDot11gProtMode    do11g_protect;
        enum TruthValue                 dot11g_pure;
        enum TruthValue                 dot11n_pure;
        enum WlanIfaceDot11nPduType     ampdu;
        int32_t                         ampdu_density;
        int32_t                         ampdu_limit;
        enum WlanIfaceDot11nPduType     amsdu;
        int32_t                         amsdu_limit;
        enum TruthValue                 ht_enabled;
        enum TruthValue                 ht_compatible;
        enum wlanIfaceDot11nHTProtMode  ht_prot_mode;
        enum TruthValue                 rifs;
        enum TruthValue                 short_gi;
        enum wlanIfaceDot11nSMPSMode    smps_mode;
        int32_t                         tdma_slot;
        int32_t                         tdma_slot_count;
        int32_t                         tdma_slot_length;
        int32_t                         tdma_binterval;

        struct wlan_peerlist            peerlist;
        struct ieee80211_stats          stats;
        uint32_t                        nchannels;
        struct ieee80211_channel        *chanlist;
        struct ieee80211_roamparams_req roamparams;
        struct ieee80211_txparams_req   txparams;

        uint32_t                        scan_flags;
        uint32_t                        scan_duration;
        uint32_t                        scan_mindwell;
        uint32_t                        scan_maxdwell;
        enum wlanScanConfigStatus       scan_status;
        struct wlan_scanlist            scanlist;

        uint8_t                         wepsupported;
        enum wlanWepMode                wepmode;
        int32_t                         weptxkey;

        uint8_t                         macsupported;
        enum wlanMACAccessControlPolicy mac_policy;
        uint32_t                        mac_nacls;
        struct wlan_maclist             mac_maclist;

        uint32_t                        mesh_ttl;
        enum wlanMeshPeeringEnabled     mesh_peering;
        enum wlanMeshForwardingEnabled  mesh_forwarding;
        enum wlanMeshMetric             mesh_metric;
        enum wlanMeshPath               mesh_path;
        enum wlanHWMPRootMode           hwmp_root_mode;
        uint32_t                        hwmp_max_hops;
        struct wlan_mesh_routes         mesh_routelist;

        SLIST_ENTRY(wlan_iface)         w_if;
};

enum wlan_syscl {
        WLAN_MESH_RETRY_TO = 0,
        WLAN_MESH_HOLDING_TO,
        WLAN_MESH_CONFIRM_TO,
        WLAN_MESH_MAX_RETRIES,
        WLAN_HWMP_TARGET_ONLY,
        WLAN_HWMP_REPLY_FORWARD,
        WLAN_HWMP_PATH_LIFETIME,
        WLAN_HWMP_ROOT_TO,
        WLAN_HWMP_ROOT_INT,
        WLAN_HWMP_RANN_INT,
        WLAN_HWMP_INACTIVITY_TO,
        WLAN_SYSCTL_MAX
};

struct wlan_config {
        int32_t                         mesh_retryto;
        int32_t                         mesh_holdingto;
        int32_t                         mesh_confirmto;
        int32_t                         mesh_maxretries;
        int32_t                         hwmp_targetonly;
        int32_t                         hwmp_replyforward;
        int32_t                         hwmp_pathlifetime;
        int32_t                         hwmp_roottimeout;
        int32_t                         hwmp_rootint;
        int32_t                         hwmp_rannint;
        int32_t                         hwmp_inact;
};

int wlan_ioctl_init(void);
int wlan_kmodules_load(void);
int wlan_check_media(char *);
int wlan_config_state(struct wlan_iface *, uint8_t);
int wlan_get_opmode(struct wlan_iface *wif);
int wlan_get_local_addr(struct wlan_iface *wif);
int wlan_get_parent(struct wlan_iface *wif);
int wlan_get_driver_caps(struct wlan_iface *wif);
uint8_t wlan_channel_state_to_snmp(uint8_t cstate);
uint32_t wlan_channel_flags_to_snmp(uint32_t cflags);
int wlan_get_channel_list(struct wlan_iface *wif);
int wlan_get_roam_params(struct wlan_iface *wif);
int wlan_get_tx_params(struct wlan_iface *wif);
int wlan_set_tx_params(struct wlan_iface *wif, int32_t pmode);
int wlan_clone_create(struct wlan_iface *);
int wlan_clone_destroy(struct wlan_iface *wif);
int wlan_config_get_dssid(struct wlan_iface *wif);
int wlan_config_set_dssid(struct wlan_iface *wif, char *ssid, int slen);
int wlan_config_get_ioctl(struct wlan_iface *wif, int which);
int wlan_config_set_ioctl(struct wlan_iface *wif, int which, int val,
    char *strval, int len);
int wlan_set_scan_config(struct wlan_iface *wif);
int wlan_get_scan_results(struct wlan_iface *wif);
int wlan_get_stats(struct wlan_iface *wif);
int wlan_get_wepmode(struct wlan_iface *wif);
int wlan_set_wepmode(struct wlan_iface *wif);
int wlan_get_weptxkey(struct wlan_iface *wif);
int wlan_set_weptxkey(struct wlan_iface *wif);
int wlan_get_wepkeys(struct wlan_iface *wif);
int wlan_set_wepkeys(struct wlan_iface *wif);
int wlan_get_mac_policy(struct wlan_iface *wif);
int wlan_set_mac_policy(struct wlan_iface *wif);
int wlan_flush_mac_mac(struct wlan_iface *wif);
int wlan_get_mac_acl_macs(struct wlan_iface *wif);
int wlan_add_mac_acl_mac(struct wlan_iface *wif, struct wlan_mac_mac *mmac);
int wlan_del_mac_acl_mac(struct wlan_iface *wif, struct wlan_mac_mac *mmac);

int32_t wlan_do_sysctl(struct wlan_config *cfg, enum wlan_syscl which, int set);
int wlan_mesh_config_get(struct wlan_iface *wif, int which);
int wlan_mesh_config_set(struct wlan_iface *wif, int which);
int wlan_mesh_flush_routes(struct wlan_iface *wif);
int wlan_mesh_add_route(struct wlan_iface *wif, struct wlan_mesh_route *wmr);
int wlan_mesh_del_route(struct wlan_iface *wif, struct wlan_mesh_route *wmr);
int wlan_mesh_get_routelist(struct wlan_iface *wif);
int wlan_hwmp_config_get(struct wlan_iface *wif, int which);
int wlan_hwmp_config_set(struct wlan_iface *wif, int which);

/* XXX: static */

int wlan_peer_set_vlan(struct wlan_iface *wif, struct wlan_peer *wip, int vlan);
int wlan_get_peerinfo(struct wlan_iface *wif);

/* XXX*/
struct wlan_peer *wlan_new_peer(const uint8_t *pmac);
void wlan_free_peer(struct wlan_peer *wip);
int wlan_add_peer(struct wlan_iface *wif, struct wlan_peer *wip);

struct wlan_scan_result * wlan_scan_new_result(const uint8_t *ssid,
    const uint8_t *bssid);
void wlan_scan_free_result(struct wlan_scan_result *sr);
int wlan_scan_add_result(struct wlan_iface *wif, struct wlan_scan_result *sr);

struct wlan_mac_mac *wlan_mac_new_mac(const uint8_t *mac);
void wlan_mac_free_mac(struct wlan_mac_mac *wmm);
int wlan_mac_add_mac(struct wlan_iface *wif, struct wlan_mac_mac *wmm);

struct wlan_mesh_route *wlan_mesh_new_route(const uint8_t *dstmac);
int wlan_mesh_add_rtentry(struct wlan_iface *wif, struct wlan_mesh_route *wmr);
void wlan_mesh_free_route(struct wlan_mesh_route *wmr);