1 /* 2 * Wireless configuration interface internals. 3 * 4 * Copyright 2006-2009 Johannes Berg <johannes@sipsolutions.net> 5 */ 6 #ifndef __NET_WIRELESS_CORE_H 7 #define __NET_WIRELESS_CORE_H 8 #include <linux/mutex.h> 9 #include <linux/list.h> 10 #include <linux/netdevice.h> 11 #include <linux/kref.h> 12 #include <linux/rbtree.h> 13 #include <linux/debugfs.h> 14 #include <linux/rfkill.h> 15 #include <linux/workqueue.h> 16 #include <net/genetlink.h> 17 #include <net/cfg80211.h> 18 #include "reg.h" 19 20 struct cfg80211_registered_device { 21 const struct cfg80211_ops *ops; 22 struct list_head list; 23 /* we hold this mutex during any call so that 24 * we cannot do multiple calls at once, and also 25 * to avoid the deregister call to proceed while 26 * any call is in progress */ 27 struct mutex mtx; 28 29 /* rfkill support */ 30 struct rfkill_ops rfkill_ops; 31 struct rfkill *rfkill; 32 struct work_struct rfkill_sync; 33 34 /* ISO / IEC 3166 alpha2 for which this device is receiving 35 * country IEs on, this can help disregard country IEs from APs 36 * on the same alpha2 quickly. The alpha2 may differ from 37 * cfg80211_regdomain's alpha2 when an intersection has occurred. 38 * If the AP is reconfigured this can also be used to tell us if 39 * the country on the country IE changed. */ 40 char country_ie_alpha2[2]; 41 42 /* If a Country IE has been received this tells us the environment 43 * which its telling us its in. This defaults to ENVIRON_ANY */ 44 enum environment_cap env; 45 46 /* wiphy index, internal only */ 47 int wiphy_idx; 48 49 /* associate netdev list */ 50 struct mutex devlist_mtx; 51 struct list_head netdev_list; 52 53 /* BSSes/scanning */ 54 spinlock_t bss_lock; 55 struct list_head bss_list; 56 struct rb_root bss_tree; 57 u32 bss_generation; 58 struct cfg80211_scan_request *scan_req; /* protected by RTNL */ 59 unsigned long suspend_at; 60 61 #ifdef CONFIG_CFG80211_DEBUGFS 62 /* Debugfs entries */ 63 struct wiphy_debugfsdentries { 64 struct dentry *rts_threshold; 65 struct dentry *fragmentation_threshold; 66 struct dentry *short_retry_limit; 67 struct dentry *long_retry_limit; 68 struct dentry *ht40allow_map; 69 } debugfs; 70 #endif 71 72 /* must be last because of the way we do wiphy_priv(), 73 * and it should at least be aligned to NETDEV_ALIGN */ 74 struct wiphy wiphy __attribute__((__aligned__(NETDEV_ALIGN))); 75 }; 76 77 static inline 78 struct cfg80211_registered_device *wiphy_to_dev(struct wiphy *wiphy) 79 { 80 BUG_ON(!wiphy); 81 return container_of(wiphy, struct cfg80211_registered_device, wiphy); 82 } 83 84 /* Note 0 is valid, hence phy0 */ 85 static inline 86 bool wiphy_idx_valid(int wiphy_idx) 87 { 88 return (wiphy_idx >= 0); 89 } 90 91 extern struct mutex cfg80211_mutex; 92 extern struct list_head cfg80211_drv_list; 93 94 #define assert_cfg80211_lock() WARN_ON(!mutex_is_locked(&cfg80211_mutex)) 95 96 /* 97 * You can use this to mark a wiphy_idx as not having an associated wiphy. 98 * It guarantees cfg80211_drv_by_wiphy_idx(wiphy_idx) will return NULL 99 */ 100 #define WIPHY_IDX_STALE -1 101 102 struct cfg80211_internal_bss { 103 struct list_head list; 104 struct rb_node rbn; 105 unsigned long ts; 106 struct kref ref; 107 bool hold, ies_allocated; 108 109 /* must be last because of priv member */ 110 struct cfg80211_bss pub; 111 }; 112 113 struct cfg80211_registered_device *cfg80211_drv_by_wiphy_idx(int wiphy_idx); 114 int get_wiphy_idx(struct wiphy *wiphy); 115 116 struct cfg80211_registered_device * 117 __cfg80211_drv_from_info(struct genl_info *info); 118 119 /* 120 * This function returns a pointer to the driver 121 * that the genl_info item that is passed refers to. 122 * If successful, it returns non-NULL and also locks 123 * the driver's mutex! 124 * 125 * This means that you need to call cfg80211_put_dev() 126 * before being allowed to acquire &cfg80211_mutex! 127 * 128 * This is necessary because we need to lock the global 129 * mutex to get an item off the list safely, and then 130 * we lock the drv mutex so it doesn't go away under us. 131 * 132 * We don't want to keep cfg80211_mutex locked 133 * for all the time in order to allow requests on 134 * other interfaces to go through at the same time. 135 * 136 * The result of this can be a PTR_ERR and hence must 137 * be checked with IS_ERR() for errors. 138 */ 139 extern struct cfg80211_registered_device * 140 cfg80211_get_dev_from_info(struct genl_info *info); 141 142 /* requires cfg80211_drv_mutex to be held! */ 143 struct wiphy *wiphy_idx_to_wiphy(int wiphy_idx); 144 145 /* identical to cfg80211_get_dev_from_info but only operate on ifindex */ 146 extern struct cfg80211_registered_device * 147 cfg80211_get_dev_from_ifindex(int ifindex); 148 149 extern void cfg80211_put_dev(struct cfg80211_registered_device *drv); 150 151 /* free object */ 152 extern void cfg80211_dev_free(struct cfg80211_registered_device *drv); 153 154 extern int cfg80211_dev_rename(struct cfg80211_registered_device *drv, 155 char *newname); 156 157 void ieee80211_set_bitrate_flags(struct wiphy *wiphy); 158 void wiphy_update_regulatory(struct wiphy *wiphy, 159 enum nl80211_reg_initiator setby); 160 161 void cfg80211_bss_expire(struct cfg80211_registered_device *dev); 162 void cfg80211_bss_age(struct cfg80211_registered_device *dev, 163 unsigned long age_secs); 164 165 /* IBSS */ 166 int cfg80211_join_ibss(struct cfg80211_registered_device *rdev, 167 struct net_device *dev, 168 struct cfg80211_ibss_params *params); 169 void cfg80211_clear_ibss(struct net_device *dev, bool nowext); 170 int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, 171 struct net_device *dev, bool nowext); 172 173 /* internal helpers */ 174 int cfg80211_validate_key_settings(struct key_params *params, int key_idx, 175 const u8 *mac_addr); 176 177 #endif /* __NET_WIRELESS_CORE_H */ 178