diff options
Diffstat (limited to 'net/wireless/core.h')
| -rw-r--r-- | net/wireless/core.h | 100 | 
1 files changed, 48 insertions, 52 deletions
diff --git a/net/wireless/core.h b/net/wireless/core.h index 9ad43c619c5..7e3a3cef7df 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h @@ -62,14 +62,13 @@ struct cfg80211_registered_device {  	struct rb_root bss_tree;  	u32 bss_generation;  	struct cfg80211_scan_request *scan_req; /* protected by RTNL */ +	struct sk_buff *scan_msg;  	struct cfg80211_sched_scan_request *sched_scan_req;  	unsigned long suspend_at;  	struct work_struct scan_done_wk;  	struct work_struct sched_scan_results_wk; -#ifdef CONFIG_NL80211_TESTMODE -	struct genl_info *testmode_info; -#endif +	struct genl_info *cur_cmd_info;  	struct work_struct conn_work;  	struct work_struct event_work; @@ -81,13 +80,17 @@ struct cfg80211_registered_device {  	struct cfg80211_coalesce *coalesce; +	spinlock_t destroy_list_lock; +	struct list_head destroy_list; +	struct work_struct destroy_work; +  	/* must be last because of the way we do wiphy_priv(),  	 * and it should at least be aligned to NETDEV_ALIGN */  	struct wiphy wiphy __aligned(NETDEV_ALIGN);  };  static inline -struct cfg80211_registered_device *wiphy_to_dev(struct wiphy *wiphy) +struct cfg80211_registered_device *wiphy_to_rdev(struct wiphy *wiphy)  {  	BUG_ON(!wiphy);  	return container_of(wiphy, struct cfg80211_registered_device, wiphy); @@ -167,7 +170,6 @@ static inline void wdev_unlock(struct wireless_dev *wdev)  	mutex_unlock(&wdev->mtx);  } -#define ASSERT_RDEV_LOCK(rdev) ASSERT_RTNL()  #define ASSERT_WDEV_LOCK(wdev) lockdep_assert_held(&(wdev)->mtx)  static inline bool cfg80211_has_monitors_only(struct cfg80211_registered_device *rdev) @@ -183,6 +185,7 @@ enum cfg80211_event_type {  	EVENT_ROAMED,  	EVENT_DISCONNECTED,  	EVENT_IBSS_JOINED, +	EVENT_STOPPED,  };  struct cfg80211_event { @@ -212,6 +215,7 @@ struct cfg80211_event {  		} dc;  		struct {  			u8 bssid[ETH_ALEN]; +			struct ieee80211_channel *channel;  		} ij;  	};  }; @@ -233,23 +237,26 @@ struct cfg80211_beacon_registration {  	u32 nlportid;  }; +struct cfg80211_iface_destroy { +	struct list_head list; +	u32 nlportid; +}; + +void cfg80211_destroy_ifaces(struct cfg80211_registered_device *rdev); +  /* free object */ -extern void cfg80211_dev_free(struct cfg80211_registered_device *rdev); +void cfg80211_dev_free(struct cfg80211_registered_device *rdev); -extern int cfg80211_dev_rename(struct cfg80211_registered_device *rdev, -			       char *newname); +int cfg80211_dev_rename(struct cfg80211_registered_device *rdev, +			char *newname);  void ieee80211_set_bitrate_flags(struct wiphy *wiphy); -void cfg80211_bss_expire(struct cfg80211_registered_device *dev); -void cfg80211_bss_age(struct cfg80211_registered_device *dev, +void cfg80211_bss_expire(struct cfg80211_registered_device *rdev); +void cfg80211_bss_age(struct cfg80211_registered_device *rdev,                        unsigned long age_secs);  /* IBSS */ -int __cfg80211_join_ibss(struct cfg80211_registered_device *rdev, -			 struct net_device *dev, -			 struct cfg80211_ibss_params *params, -			 struct cfg80211_cached_keys *connkeys);  int cfg80211_join_ibss(struct cfg80211_registered_device *rdev,  		       struct net_device *dev,  		       struct cfg80211_ibss_params *params, @@ -259,7 +266,8 @@ int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,  			  struct net_device *dev, bool nowext);  int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,  			struct net_device *dev, bool nowext); -void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid); +void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, +			    struct ieee80211_channel *channel);  int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,  			    struct wireless_dev *wdev); @@ -274,6 +282,8 @@ int cfg80211_join_mesh(struct cfg80211_registered_device *rdev,  		       struct net_device *dev,  		       struct mesh_setup *setup,  		       const struct mesh_config *conf); +int __cfg80211_leave_mesh(struct cfg80211_registered_device *rdev, +			  struct net_device *dev);  int cfg80211_leave_mesh(struct cfg80211_registered_device *rdev,  			struct net_device *dev);  int cfg80211_set_mesh_channel(struct cfg80211_registered_device *rdev, @@ -281,8 +291,10 @@ int cfg80211_set_mesh_channel(struct cfg80211_registered_device *rdev,  			      struct cfg80211_chan_def *chandef);  /* AP */ +int __cfg80211_stop_ap(struct cfg80211_registered_device *rdev, +		       struct net_device *dev, bool notify);  int cfg80211_stop_ap(struct cfg80211_registered_device *rdev, -		     struct net_device *dev); +		     struct net_device *dev, bool notify);  /* MLME */  int cfg80211_mlme_auth(struct cfg80211_registered_device *rdev, @@ -317,9 +329,8 @@ void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlpid);  void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev);  int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev,  			  struct wireless_dev *wdev, -			  struct ieee80211_channel *chan, bool offchan, -			  unsigned int wait, const u8 *buf, size_t len, -			  bool no_cck, bool dont_wait_for_ack, u64 *cookie); +			  struct cfg80211_mgmt_tx_params *params, +			  u64 *cookie);  void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa,  			       const struct ieee80211_ht_cap *ht_capa_mask);  void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa, @@ -364,7 +375,8 @@ int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev,  				   struct key_params *params, int key_idx,  				   bool pairwise, const u8 *mac_addr);  void __cfg80211_scan_done(struct work_struct *wk); -void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, bool leak); +void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, +			   bool send_message);  void __cfg80211_sched_scan_results(struct work_struct *wk);  int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,  			       bool driver_initiated); @@ -383,13 +395,17 @@ int cfg80211_can_use_iftype_chan(struct cfg80211_registered_device *rdev,  				 u8 radar_detect);  /** - * cfg80211_chandef_dfs_required - checks if radar detection is required + * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable   * @wiphy: the wiphy to validate against   * @chandef: the channel definition to check - * Return: 1 if radar detection is required, 0 if it is not, < 0 on error + * + * Checks if chandef is usable and we can/need start CAC on such channel. + * + * Return: Return true if all channels available and at least + *	   one channel require CAC (NL80211_DFS_USABLE)   */ -int cfg80211_chandef_dfs_required(struct wiphy *wiphy, -				  const struct cfg80211_chan_def *c); +bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy, +				 const struct cfg80211_chan_def *chandef);  void cfg80211_set_dfs_state(struct wiphy *wiphy,  			    const struct cfg80211_chan_def *chandef, @@ -397,32 +413,9 @@ void cfg80211_set_dfs_state(struct wiphy *wiphy,  void cfg80211_dfs_channels_update_work(struct work_struct *work); - -static inline int -cfg80211_can_change_interface(struct cfg80211_registered_device *rdev, -			      struct wireless_dev *wdev, -			      enum nl80211_iftype iftype) -{ -	return cfg80211_can_use_iftype_chan(rdev, wdev, iftype, NULL, -					    CHAN_MODE_UNDEFINED, 0); -} - -static inline int -cfg80211_can_add_interface(struct cfg80211_registered_device *rdev, -			   enum nl80211_iftype iftype) -{ -	return cfg80211_can_change_interface(rdev, NULL, iftype); -} - -static inline int -cfg80211_can_use_chan(struct cfg80211_registered_device *rdev, -		      struct wireless_dev *wdev, -		      struct ieee80211_channel *chan, -		      enum cfg80211_chan_mode chanmode) -{ -	return cfg80211_can_use_iftype_chan(rdev, wdev, wdev->iftype, -					    chan, chanmode, 0); -} +unsigned int +cfg80211_chandef_dfs_cac_time(struct wiphy *wiphy, +			      const struct cfg80211_chan_def *chandef);  static inline unsigned int elapsed_jiffies_msecs(unsigned long start)  { @@ -431,13 +424,14 @@ static inline unsigned int elapsed_jiffies_msecs(unsigned long start)  	if (end >= start)  		return jiffies_to_msecs(end - start); -	return jiffies_to_msecs(end + (MAX_JIFFY_OFFSET - start) + 1); +	return jiffies_to_msecs(end + (ULONG_MAX - start) + 1);  }  void  cfg80211_get_chan_state(struct wireless_dev *wdev,  		        struct ieee80211_channel **chan, -		        enum cfg80211_chan_mode *chanmode); +		        enum cfg80211_chan_mode *chanmode, +		        u8 *radar_detect);  int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,  				 struct cfg80211_chan_def *chandef); @@ -452,6 +446,8 @@ int cfg80211_validate_beacon_int(struct cfg80211_registered_device *rdev,  void cfg80211_update_iface_num(struct cfg80211_registered_device *rdev,  			       enum nl80211_iftype iftype, int num); +void __cfg80211_leave(struct cfg80211_registered_device *rdev, +		      struct wireless_dev *wdev);  void cfg80211_leave(struct cfg80211_registered_device *rdev,  		    struct wireless_dev *wdev);  | 
