linux/net/wireless/core.h
<<
>>
Prefs
   1/*
   2 * Wireless configuration interface internals.
   3 *
   4 * Copyright 2006-2010  Johannes Berg <johannes@sipsolutions.net>
   5 */
   6#ifndef __NET_WIRELESS_CORE_H
   7#define __NET_WIRELESS_CORE_H
   8#include <linux/list.h>
   9#include <linux/netdevice.h>
  10#include <linux/rbtree.h>
  11#include <linux/debugfs.h>
  12#include <linux/rfkill.h>
  13#include <linux/workqueue.h>
  14#include <linux/rtnetlink.h>
  15#include <net/genetlink.h>
  16#include <net/cfg80211.h>
  17#include "reg.h"
  18
  19
  20#define WIPHY_IDX_INVALID       -1
  21
  22struct cfg80211_registered_device {
  23        const struct cfg80211_ops *ops;
  24        struct list_head list;
  25
  26        /* rfkill support */
  27        struct rfkill_ops rfkill_ops;
  28        struct rfkill *rfkill;
  29        struct work_struct rfkill_sync;
  30
  31        /* ISO / IEC 3166 alpha2 for which this device is receiving
  32         * country IEs on, this can help disregard country IEs from APs
  33         * on the same alpha2 quickly. The alpha2 may differ from
  34         * cfg80211_regdomain's alpha2 when an intersection has occurred.
  35         * If the AP is reconfigured this can also be used to tell us if
  36         * the country on the country IE changed. */
  37        char country_ie_alpha2[2];
  38
  39        /*
  40         * the driver requests the regulatory core to set this regulatory
  41         * domain as the wiphy's. Only used for %REGULATORY_WIPHY_SELF_MANAGED
  42         * devices using the regulatory_set_wiphy_regd() API
  43         */
  44        const struct ieee80211_regdomain *requested_regd;
  45
  46        /* If a Country IE has been received this tells us the environment
  47         * which its telling us its in. This defaults to ENVIRON_ANY */
  48        enum environment_cap env;
  49
  50        /* wiphy index, internal only */
  51        int wiphy_idx;
  52
  53        /* protected by RTNL */
  54        int devlist_generation, wdev_id;
  55        int opencount;
  56        wait_queue_head_t dev_wait;
  57
  58        struct list_head beacon_registrations;
  59        spinlock_t beacon_registrations_lock;
  60
  61        struct list_head mlme_unreg;
  62        spinlock_t mlme_unreg_lock;
  63        struct work_struct mlme_unreg_wk;
  64
  65        /* protected by RTNL only */
  66        int num_running_ifaces;
  67        int num_running_monitor_ifaces;
  68
  69        /* BSSes/scanning */
  70        spinlock_t bss_lock;
  71        struct list_head bss_list;
  72        struct rb_root bss_tree;
  73        u32 bss_generation;
  74        u32 bss_entries;
  75        struct cfg80211_scan_request *scan_req; /* protected by RTNL */
  76        struct sk_buff *scan_msg;
  77        struct list_head sched_scan_req_list;
  78        unsigned long suspend_at;
  79        struct work_struct scan_done_wk;
  80
  81        struct genl_info *cur_cmd_info;
  82
  83        struct work_struct conn_work;
  84        struct work_struct event_work;
  85
  86        struct delayed_work dfs_update_channels_wk;
  87
  88        /* netlink port which started critical protocol (0 means not started) */
  89        u32 crit_proto_nlportid;
  90
  91        struct cfg80211_coalesce *coalesce;
  92
  93        struct work_struct destroy_work;
  94        struct work_struct sched_scan_stop_wk;
  95        struct work_struct sched_scan_res_wk;
  96
  97        struct cfg80211_chan_def radar_chandef;
  98        struct work_struct propagate_radar_detect_wk;
  99
 100        struct cfg80211_chan_def cac_done_chandef;
 101        struct work_struct propagate_cac_done_wk;
 102
 103        /* must be last because of the way we do wiphy_priv(),
 104         * and it should at least be aligned to NETDEV_ALIGN */
 105        struct wiphy wiphy __aligned(NETDEV_ALIGN);
 106};
 107
 108static inline
 109struct cfg80211_registered_device *wiphy_to_rdev(struct wiphy *wiphy)
 110{
 111        BUG_ON(!wiphy);
 112        return container_of(wiphy, struct cfg80211_registered_device, wiphy);
 113}
 114
 115static inline void
 116cfg80211_rdev_free_wowlan(struct cfg80211_registered_device *rdev)
 117{
 118#ifdef CONFIG_PM
 119        int i;
 120
 121        if (!rdev->wiphy.wowlan_config)
 122                return;
 123        for (i = 0; i < rdev->wiphy.wowlan_config->n_patterns; i++)
 124                kfree(rdev->wiphy.wowlan_config->patterns[i].mask);
 125        kfree(rdev->wiphy.wowlan_config->patterns);
 126        if (rdev->wiphy.wowlan_config->tcp &&
 127            rdev->wiphy.wowlan_config->tcp->sock)
 128                sock_release(rdev->wiphy.wowlan_config->tcp->sock);
 129        kfree(rdev->wiphy.wowlan_config->tcp);
 130        kfree(rdev->wiphy.wowlan_config->nd_config);
 131        kfree(rdev->wiphy.wowlan_config);
 132#endif
 133}
 134
 135extern struct workqueue_struct *cfg80211_wq;
 136extern struct list_head cfg80211_rdev_list;
 137extern int cfg80211_rdev_list_generation;
 138
 139struct cfg80211_internal_bss {
 140        struct list_head list;
 141        struct list_head hidden_list;
 142        struct rb_node rbn;
 143        u64 ts_boottime;
 144        unsigned long ts;
 145        unsigned long refcount;
 146        atomic_t hold;
 147
 148        /* time at the start of the reception of the first octet of the
 149         * timestamp field of the last beacon/probe received for this BSS.
 150         * The time is the TSF of the BSS specified by %parent_bssid.
 151         */
 152        u64 parent_tsf;
 153
 154        /* the BSS according to which %parent_tsf is set. This is set to
 155         * the BSS that the interface that requested the scan was connected to
 156         * when the beacon/probe was received.
 157         */
 158        u8 parent_bssid[ETH_ALEN] __aligned(2);
 159
 160        /* must be last because of priv member */
 161        struct cfg80211_bss pub;
 162};
 163
 164static inline struct cfg80211_internal_bss *bss_from_pub(struct cfg80211_bss *pub)
 165{
 166        return container_of(pub, struct cfg80211_internal_bss, pub);
 167}
 168
 169static inline void cfg80211_hold_bss(struct cfg80211_internal_bss *bss)
 170{
 171        atomic_inc(&bss->hold);
 172}
 173
 174static inline void cfg80211_unhold_bss(struct cfg80211_internal_bss *bss)
 175{
 176        int r = atomic_dec_return(&bss->hold);
 177        WARN_ON(r < 0);
 178}
 179
 180
 181struct cfg80211_registered_device *cfg80211_rdev_by_wiphy_idx(int wiphy_idx);
 182int get_wiphy_idx(struct wiphy *wiphy);
 183
 184struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx);
 185
 186int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
 187                          struct net *net);
 188
 189static inline void wdev_lock(struct wireless_dev *wdev)
 190        __acquires(wdev)
 191{
 192        mutex_lock(&wdev->mtx);
 193        __acquire(wdev->mtx);
 194}
 195
 196static inline void wdev_unlock(struct wireless_dev *wdev)
 197        __releases(wdev)
 198{
 199        __release(wdev->mtx);
 200        mutex_unlock(&wdev->mtx);
 201}
 202
 203#define ASSERT_WDEV_LOCK(wdev) lockdep_assert_held(&(wdev)->mtx)
 204
 205static inline bool cfg80211_has_monitors_only(struct cfg80211_registered_device *rdev)
 206{
 207        ASSERT_RTNL();
 208
 209        return rdev->num_running_ifaces == rdev->num_running_monitor_ifaces &&
 210               rdev->num_running_ifaces > 0;
 211}
 212
 213enum cfg80211_event_type {
 214        EVENT_CONNECT_RESULT,
 215        EVENT_ROAMED,
 216        EVENT_DISCONNECTED,
 217        EVENT_IBSS_JOINED,
 218        EVENT_STOPPED,
 219};
 220
 221struct cfg80211_event {
 222        struct list_head list;
 223        enum cfg80211_event_type type;
 224
 225        union {
 226                struct cfg80211_connect_resp_params cr;
 227                struct cfg80211_roam_info rm;
 228                struct {
 229                        const u8 *ie;
 230                        size_t ie_len;
 231                        u16 reason;
 232                        bool locally_generated;
 233                } dc;
 234                struct {
 235                        u8 bssid[ETH_ALEN];
 236                        struct ieee80211_channel *channel;
 237                } ij;
 238        };
 239};
 240
 241struct cfg80211_cached_keys {
 242        struct key_params params[CFG80211_MAX_WEP_KEYS];
 243        u8 data[CFG80211_MAX_WEP_KEYS][WLAN_KEY_LEN_WEP104];
 244        int def;
 245};
 246
 247enum cfg80211_chan_mode {
 248        CHAN_MODE_UNDEFINED,
 249        CHAN_MODE_SHARED,
 250        CHAN_MODE_EXCLUSIVE,
 251};
 252
 253struct cfg80211_beacon_registration {
 254        struct list_head list;
 255        u32 nlportid;
 256};
 257
 258struct cfg80211_cqm_config {
 259        u32 rssi_hyst;
 260        s32 last_rssi_event_value;
 261        int n_rssi_thresholds;
 262        s32 rssi_thresholds[0];
 263};
 264
 265void cfg80211_destroy_ifaces(struct cfg80211_registered_device *rdev);
 266
 267/* free object */
 268void cfg80211_dev_free(struct cfg80211_registered_device *rdev);
 269
 270int cfg80211_dev_rename(struct cfg80211_registered_device *rdev,
 271                        char *newname);
 272
 273void ieee80211_set_bitrate_flags(struct wiphy *wiphy);
 274
 275void cfg80211_bss_expire(struct cfg80211_registered_device *rdev);
 276void cfg80211_bss_age(struct cfg80211_registered_device *rdev,
 277                      unsigned long age_secs);
 278
 279/* IBSS */
 280int cfg80211_join_ibss(struct cfg80211_registered_device *rdev,
 281                       struct net_device *dev,
 282                       struct cfg80211_ibss_params *params,
 283                       struct cfg80211_cached_keys *connkeys);
 284void cfg80211_clear_ibss(struct net_device *dev, bool nowext);
 285int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
 286                          struct net_device *dev, bool nowext);
 287int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
 288                        struct net_device *dev, bool nowext);
 289void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
 290                            struct ieee80211_channel *channel);
 291int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
 292                            struct wireless_dev *wdev);
 293
 294/* mesh */
 295extern const struct mesh_config default_mesh_config;
 296extern const struct mesh_setup default_mesh_setup;
 297int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
 298                         struct net_device *dev,
 299                         struct mesh_setup *setup,
 300                         const struct mesh_config *conf);
 301int cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
 302                       struct net_device *dev,
 303                       struct mesh_setup *setup,
 304                       const struct mesh_config *conf);
 305int __cfg80211_leave_mesh(struct cfg80211_registered_device *rdev,
 306                          struct net_device *dev);
 307int cfg80211_leave_mesh(struct cfg80211_registered_device *rdev,
 308                        struct net_device *dev);
 309int cfg80211_set_mesh_channel(struct cfg80211_registered_device *rdev,
 310                              struct wireless_dev *wdev,
 311                              struct cfg80211_chan_def *chandef);
 312
 313/* OCB */
 314int __cfg80211_join_ocb(struct cfg80211_registered_device *rdev,
 315                        struct net_device *dev,
 316                        struct ocb_setup *setup);
 317int cfg80211_join_ocb(struct cfg80211_registered_device *rdev,
 318                      struct net_device *dev,
 319                      struct ocb_setup *setup);
 320int __cfg80211_leave_ocb(struct cfg80211_registered_device *rdev,
 321                         struct net_device *dev);
 322int cfg80211_leave_ocb(struct cfg80211_registered_device *rdev,
 323                       struct net_device *dev);
 324
 325/* AP */
 326int __cfg80211_stop_ap(struct cfg80211_registered_device *rdev,
 327                       struct net_device *dev, bool notify);
 328int cfg80211_stop_ap(struct cfg80211_registered_device *rdev,
 329                     struct net_device *dev, bool notify);
 330
 331/* MLME */
 332int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev,
 333                       struct net_device *dev,
 334                       struct ieee80211_channel *chan,
 335                       enum nl80211_auth_type auth_type,
 336                       const u8 *bssid,
 337                       const u8 *ssid, int ssid_len,
 338                       const u8 *ie, int ie_len,
 339                       const u8 *key, int key_len, int key_idx,
 340                       const u8 *auth_data, int auth_data_len);
 341int cfg80211_mlme_assoc(struct cfg80211_registered_device *rdev,
 342                        struct net_device *dev,
 343                        struct ieee80211_channel *chan,
 344                        const u8 *bssid,
 345                        const u8 *ssid, int ssid_len,
 346                        struct cfg80211_assoc_request *req);
 347int cfg80211_mlme_deauth(struct cfg80211_registered_device *rdev,
 348                         struct net_device *dev, const u8 *bssid,
 349                         const u8 *ie, int ie_len, u16 reason,
 350                         bool local_state_change);
 351int cfg80211_mlme_disassoc(struct cfg80211_registered_device *rdev,
 352                           struct net_device *dev, const u8 *bssid,
 353                           const u8 *ie, int ie_len, u16 reason,
 354                           bool local_state_change);
 355void cfg80211_mlme_down(struct cfg80211_registered_device *rdev,
 356                        struct net_device *dev);
 357int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_pid,
 358                                u16 frame_type, const u8 *match_data,
 359                                int match_len);
 360void cfg80211_mlme_unreg_wk(struct work_struct *wk);
 361void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlpid);
 362void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev);
 363int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,
 364                          struct wireless_dev *wdev,
 365                          struct cfg80211_mgmt_tx_params *params,
 366                          u64 *cookie);
 367void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa,
 368                               const struct ieee80211_ht_cap *ht_capa_mask);
 369void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa,
 370                                const struct ieee80211_vht_cap *vht_capa_mask);
 371
 372/* SME events */
 373int cfg80211_connect(struct cfg80211_registered_device *rdev,
 374                     struct net_device *dev,
 375                     struct cfg80211_connect_params *connect,
 376                     struct cfg80211_cached_keys *connkeys,
 377                     const u8 *prev_bssid);
 378void __cfg80211_connect_result(struct net_device *dev,
 379                               struct cfg80211_connect_resp_params *params,
 380                               bool wextev);
 381void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
 382                             size_t ie_len, u16 reason, bool from_ap);
 383int cfg80211_disconnect(struct cfg80211_registered_device *rdev,
 384                        struct net_device *dev, u16 reason,
 385                        bool wextev);
 386void __cfg80211_roamed(struct wireless_dev *wdev,
 387                       struct cfg80211_roam_info *info);
 388int cfg80211_mgd_wext_connect(struct cfg80211_registered_device *rdev,
 389                              struct wireless_dev *wdev);
 390void cfg80211_autodisconnect_wk(struct work_struct *work);
 391
 392/* SME implementation */
 393void cfg80211_conn_work(struct work_struct *work);
 394void cfg80211_sme_scan_done(struct net_device *dev);
 395bool cfg80211_sme_rx_assoc_resp(struct wireless_dev *wdev, u16 status);
 396void cfg80211_sme_rx_auth(struct wireless_dev *wdev, const u8 *buf, size_t len);
 397void cfg80211_sme_disassoc(struct wireless_dev *wdev);
 398void cfg80211_sme_deauth(struct wireless_dev *wdev);
 399void cfg80211_sme_auth_timeout(struct wireless_dev *wdev);
 400void cfg80211_sme_assoc_timeout(struct wireless_dev *wdev);
 401void cfg80211_sme_abandon_assoc(struct wireless_dev *wdev);
 402
 403/* internal helpers */
 404bool cfg80211_supported_cipher_suite(struct wiphy *wiphy, u32 cipher);
 405int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,
 406                                   struct key_params *params, int key_idx,
 407                                   bool pairwise, const u8 *mac_addr);
 408void __cfg80211_scan_done(struct work_struct *wk);
 409void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
 410                           bool send_message);
 411void cfg80211_add_sched_scan_req(struct cfg80211_registered_device *rdev,
 412                                 struct cfg80211_sched_scan_request *req);
 413int cfg80211_sched_scan_req_possible(struct cfg80211_registered_device *rdev,
 414                                     bool want_multi);
 415void cfg80211_sched_scan_results_wk(struct work_struct *work);
 416int cfg80211_stop_sched_scan_req(struct cfg80211_registered_device *rdev,
 417                                 struct cfg80211_sched_scan_request *req,
 418                                 bool driver_initiated);
 419int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
 420                               u64 reqid, bool driver_initiated);
 421void cfg80211_upload_connect_keys(struct wireless_dev *wdev);
 422int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
 423                          struct net_device *dev, enum nl80211_iftype ntype,
 424                          struct vif_params *params);
 425void cfg80211_process_rdev_events(struct cfg80211_registered_device *rdev);
 426void cfg80211_process_wdev_events(struct wireless_dev *wdev);
 427
 428bool cfg80211_does_bw_fit_range(const struct ieee80211_freq_range *freq_range,
 429                                u32 center_freq_khz, u32 bw_khz);
 430
 431/**
 432 * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable
 433 * @wiphy: the wiphy to validate against
 434 * @chandef: the channel definition to check
 435 *
 436 * Checks if chandef is usable and we can/need start CAC on such channel.
 437 *
 438 * Return: Return true if all channels available and at least
 439 *         one channel require CAC (NL80211_DFS_USABLE)
 440 */
 441bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
 442                                 const struct cfg80211_chan_def *chandef);
 443
 444void cfg80211_set_dfs_state(struct wiphy *wiphy,
 445                            const struct cfg80211_chan_def *chandef,
 446                            enum nl80211_dfs_state dfs_state);
 447
 448void cfg80211_dfs_channels_update_work(struct work_struct *work);
 449
 450unsigned int
 451cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy,
 452                              const struct cfg80211_chan_def *chandef);
 453
 454void cfg80211_sched_dfs_chan_update(struct cfg80211_registered_device *rdev);
 455
 456bool cfg80211_any_wiphy_oper_chan(struct wiphy *wiphy,
 457                                  struct ieee80211_channel *chan);
 458
 459bool cfg80211_beaconing_iface_active(struct wireless_dev *wdev);
 460
 461bool cfg80211_is_sub_chan(struct cfg80211_chan_def *chandef,
 462                          struct ieee80211_channel *chan);
 463
 464static inline unsigned int elapsed_jiffies_msecs(unsigned long start)
 465{
 466        unsigned long end = jiffies;
 467
 468        if (end >= start)
 469                return jiffies_to_msecs(end - start);
 470
 471        return jiffies_to_msecs(end + (ULONG_MAX - start) + 1);
 472}
 473
 474void
 475cfg80211_get_chan_state(struct wireless_dev *wdev,
 476                        struct ieee80211_channel **chan,
 477                        enum cfg80211_chan_mode *chanmode,
 478                        u8 *radar_detect);
 479
 480int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,
 481                                 struct cfg80211_chan_def *chandef);
 482
 483int ieee80211_get_ratemask(struct ieee80211_supported_band *sband,
 484                           const u8 *rates, unsigned int n_rates,
 485                           u32 *mask);
 486
 487int cfg80211_validate_beacon_int(struct cfg80211_registered_device *rdev,
 488                                 enum nl80211_iftype iftype, u32 beacon_int);
 489
 490void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,
 491                               enum nl80211_iftype iftype, int num);
 492
 493void __cfg80211_leave(struct cfg80211_registered_device *rdev,
 494                      struct wireless_dev *wdev);
 495void cfg80211_leave(struct cfg80211_registered_device *rdev,
 496                    struct wireless_dev *wdev);
 497
 498void cfg80211_stop_p2p_device(struct cfg80211_registered_device *rdev,
 499                              struct wireless_dev *wdev);
 500
 501void cfg80211_stop_nan(struct cfg80211_registered_device *rdev,
 502                       struct wireless_dev *wdev);
 503
 504#define CFG80211_MAX_NUM_DIFFERENT_CHANNELS 10
 505
 506#ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS
 507#define CFG80211_DEV_WARN_ON(cond)      WARN_ON(cond)
 508#else
 509/*
 510 * Trick to enable using it as a condition,
 511 * and also not give a warning when it's
 512 * not used that way.
 513 */
 514#define CFG80211_DEV_WARN_ON(cond)      ({bool __r = (cond); __r; })
 515#endif
 516
 517void cfg80211_cqm_config_free(struct wireless_dev *wdev);
 518
 519#endif /* __NET_WIRELESS_CORE_H */
 520