mirror of
				https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux
				synced 2025-11-04 08:34:47 +10:00 
			
		
		
		
	mac80211: fix cfg80211 hooks for master interface
The master interface is a virtual interface that is registered to mac80211, changing that does not seem like a good idea at the moment. However, since it has no sdata, we cannot accept any configuration for it. This patch makes the cfg80211 hooks reject any such attempt. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
		
							parent
							
								
									bba95fefb8
								
							
						
					
					
						commit
						14db74bcc3
					
				@ -81,6 +81,7 @@ static int ieee80211_change_iface(struct wiphy *wiphy, int ifindex,
 | 
			
		||||
				  enum nl80211_iftype type, u32 *flags,
 | 
			
		||||
				  struct vif_params *params)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct net_device *dev;
 | 
			
		||||
	enum ieee80211_if_types itype;
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
@ -95,6 +96,9 @@ static int ieee80211_change_iface(struct wiphy *wiphy, int ifindex,
 | 
			
		||||
	if (itype == IEEE80211_IF_TYPE_INVALID)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	ret = ieee80211_if_change_type(sdata, itype);
 | 
			
		||||
@ -117,12 +121,16 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
			     u8 key_idx, u8 *mac_addr,
 | 
			
		||||
			     struct key_params *params)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct sta_info *sta = NULL;
 | 
			
		||||
	enum ieee80211_key_alg alg;
 | 
			
		||||
	struct ieee80211_key *key;
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	switch (params->cipher) {
 | 
			
		||||
@ -167,10 +175,14 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
			     u8 key_idx, u8 *mac_addr)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct sta_info *sta;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	rcu_read_lock();
 | 
			
		||||
@ -211,7 +223,8 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
			     void (*callback)(void *cookie,
 | 
			
		||||
					      struct key_params *params))
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct sta_info *sta = NULL;
 | 
			
		||||
	u8 seq[6] = {0};
 | 
			
		||||
	struct key_params params;
 | 
			
		||||
@ -220,6 +233,11 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
	u16 iv16;
 | 
			
		||||
	int err = -ENOENT;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	rcu_read_lock();
 | 
			
		||||
 | 
			
		||||
	if (mac_addr) {
 | 
			
		||||
@ -293,8 +311,12 @@ static int ieee80211_config_default_key(struct wiphy *wiphy,
 | 
			
		||||
					struct net_device *dev,
 | 
			
		||||
					u8 key_idx)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	rcu_read_lock();
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
@ -475,9 +497,15 @@ static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata,
 | 
			
		||||
static int ieee80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
				struct beacon_parameters *params)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct beacon_data *old;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	if (sdata->vif.type != IEEE80211_IF_TYPE_AP)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
@ -492,9 +520,15 @@ static int ieee80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
static int ieee80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
				struct beacon_parameters *params)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct beacon_data *old;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	if (sdata->vif.type != IEEE80211_IF_TYPE_AP)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
@ -508,9 +542,15 @@ static int ieee80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
 | 
			
		||||
static int ieee80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct beacon_data *old;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	if (sdata->vif.type != IEEE80211_IF_TYPE_AP)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
@ -646,11 +686,14 @@ static void sta_apply_parameters(struct ieee80211_local *local,
 | 
			
		||||
static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
				 u8 *mac, struct station_parameters *params)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct sta_info *sta;
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev || params->vlan == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	/* Prevent a race with changing the rate control algorithm */
 | 
			
		||||
	if (!netif_running(dev))
 | 
			
		||||
		return -ENETDOWN;
 | 
			
		||||
@ -701,10 +744,15 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
static int ieee80211_del_station(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
				 u8 *mac)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
	struct ieee80211_local *local = sdata->local;
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct sta_info *sta;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	if (mac) {
 | 
			
		||||
		rcu_read_lock();
 | 
			
		||||
 | 
			
		||||
@ -730,10 +778,13 @@ static int ieee80211_change_station(struct wiphy *wiphy,
 | 
			
		||||
				    u8 *mac,
 | 
			
		||||
				    struct station_parameters *params)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct sta_info *sta;
 | 
			
		||||
	struct ieee80211_sub_if_data *vlansdata;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev || params->vlan == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	rcu_read_lock();
 | 
			
		||||
 | 
			
		||||
	/* XXX: get sta belonging to dev */
 | 
			
		||||
@ -752,7 +803,7 @@ static int ieee80211_change_station(struct wiphy *wiphy,
 | 
			
		||||
			return -EINVAL;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		sta->sdata = IEEE80211_DEV_TO_SUB_IF(params->vlan);
 | 
			
		||||
		sta->sdata = vlansdata;
 | 
			
		||||
		ieee80211_send_layer2_update(sta);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -767,15 +818,20 @@ static int ieee80211_change_station(struct wiphy *wiphy,
 | 
			
		||||
static int ieee80211_add_mpath(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
				 u8 *dst, u8 *next_hop)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct mesh_path *mpath;
 | 
			
		||||
	struct sta_info *sta;
 | 
			
		||||
	int err;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	if (!netif_running(dev))
 | 
			
		||||
		return -ENETDOWN;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	if (sdata->vif.type != IEEE80211_IF_TYPE_MESH_POINT)
 | 
			
		||||
		return -ENOTSUPP;
 | 
			
		||||
 | 
			
		||||
@ -817,14 +873,19 @@ static int ieee80211_change_mpath(struct wiphy *wiphy,
 | 
			
		||||
				    struct net_device *dev,
 | 
			
		||||
				    u8 *dst, u8 *next_hop)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct mesh_path *mpath;
 | 
			
		||||
	struct sta_info *sta;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	if (!netif_running(dev))
 | 
			
		||||
		return -ENETDOWN;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	if (sdata->vif.type != IEEE80211_IF_TYPE_MESH_POINT)
 | 
			
		||||
		return -ENOTSUPP;
 | 
			
		||||
 | 
			
		||||
@ -891,9 +952,15 @@ static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
			       u8 *dst, u8 *next_hop, struct mpath_info *pinfo)
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct mesh_path *mpath;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	if (sdata->vif.type != IEEE80211_IF_TYPE_MESH_POINT)
 | 
			
		||||
		return -ENOTSUPP;
 | 
			
		||||
 | 
			
		||||
@ -913,9 +980,15 @@ static int ieee80211_dump_mpath(struct wiphy *wiphy, struct net_device *dev,
 | 
			
		||||
				 int idx, u8 *dst, u8 *next_hop,
 | 
			
		||||
				 struct mpath_info *pinfo)
 | 
			
		||||
{
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
	struct ieee80211_local *local = wiphy_priv(wiphy);
 | 
			
		||||
	struct ieee80211_sub_if_data *sdata;
 | 
			
		||||
	struct mesh_path *mpath;
 | 
			
		||||
 | 
			
		||||
	if (dev == local->mdev)
 | 
			
		||||
		return -EOPNOTSUPP;
 | 
			
		||||
 | 
			
		||||
	sdata = IEEE80211_DEV_TO_SUB_IF(dev);
 | 
			
		||||
 | 
			
		||||
	if (sdata->vif.type != IEEE80211_IF_TYPE_MESH_POINT)
 | 
			
		||||
		return -ENOTSUPP;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user