Commit f3947e2d authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

mac80211: push interface checks down

This patch pushes the "netif_running()" and "same type as before"
checks down into ieee80211_if_change_type() to centralise the
logic instead of duplicating it for cfg80211 and wext.
Signed-off-by: default avatarJohannes Berg <johannes@sipsolutions.net>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 75636525
...@@ -84,22 +84,22 @@ static int ieee80211_change_iface(struct wiphy *wiphy, int ifindex, ...@@ -84,22 +84,22 @@ static int ieee80211_change_iface(struct wiphy *wiphy, int ifindex,
struct net_device *dev; struct net_device *dev;
enum ieee80211_if_types itype; enum ieee80211_if_types itype;
struct ieee80211_sub_if_data *sdata; struct ieee80211_sub_if_data *sdata;
int ret;
/* we're under RTNL */ /* we're under RTNL */
dev = __dev_get_by_index(&init_net, ifindex); dev = __dev_get_by_index(&init_net, ifindex);
if (!dev) if (!dev)
return -ENODEV; return -ENODEV;
if (netif_running(dev))
return -EBUSY;
itype = nl80211_type_to_mac80211_type(type); itype = nl80211_type_to_mac80211_type(type);
if (itype == IEEE80211_IF_TYPE_INVALID) if (itype == IEEE80211_IF_TYPE_INVALID)
return -EINVAL; return -EINVAL;
sdata = IEEE80211_DEV_TO_SUB_IF(dev); sdata = IEEE80211_DEV_TO_SUB_IF(dev);
ieee80211_if_change_type(sdata, itype); ret = ieee80211_if_change_type(sdata, itype);
if (ret)
return ret;
if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len) if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
ieee80211_if_sta_set_mesh_id(&sdata->u.sta, ieee80211_if_sta_set_mesh_id(&sdata->u.sta,
......
...@@ -930,8 +930,8 @@ void ieee80211_if_setup(struct net_device *dev); ...@@ -930,8 +930,8 @@ void ieee80211_if_setup(struct net_device *dev);
int ieee80211_if_add(struct ieee80211_local *local, const char *name, int ieee80211_if_add(struct ieee80211_local *local, const char *name,
struct net_device **new_dev, enum ieee80211_if_types type, struct net_device **new_dev, enum ieee80211_if_types type,
struct vif_params *params); struct vif_params *params);
void ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
enum ieee80211_if_types type); enum ieee80211_if_types type);
void ieee80211_if_remove(struct net_device *dev); void ieee80211_if_remove(struct net_device *dev);
void ieee80211_remove_interfaces(struct ieee80211_local *local); void ieee80211_remove_interfaces(struct ieee80211_local *local);
......
...@@ -138,9 +138,23 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata, ...@@ -138,9 +138,23 @@ static void ieee80211_setup_sdata(struct ieee80211_sub_if_data *sdata,
ieee80211_debugfs_add_netdev(sdata); ieee80211_debugfs_add_netdev(sdata);
} }
void ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
enum ieee80211_if_types type) enum ieee80211_if_types type)
{ {
ASSERT_RTNL();
if (type == sdata->vif.type)
return 0;
/*
* We could, here, on changes between IBSS/STA/MESH modes,
* invoke an MLME function instead that disassociates etc.
* and goes into the requested mode.
*/
if (netif_running(sdata->dev))
return -EBUSY;
/* Purge and reset type-dependent state. */ /* Purge and reset type-dependent state. */
ieee80211_teardown_sdata(sdata->dev); ieee80211_teardown_sdata(sdata->dev);
ieee80211_setup_sdata(sdata, type); ieee80211_setup_sdata(sdata, type);
...@@ -149,6 +163,8 @@ void ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata, ...@@ -149,6 +163,8 @@ void ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
sdata->basic_rates = 0; sdata->basic_rates = 0;
sdata->drop_unencrypted = 0; sdata->drop_unencrypted = 0;
sdata->sequence = 0; sdata->sequence = 0;
return 0;
} }
int ieee80211_if_add(struct ieee80211_local *local, const char *name, int ieee80211_if_add(struct ieee80211_local *local, const char *name,
......
...@@ -296,14 +296,7 @@ static int ieee80211_ioctl_siwmode(struct net_device *dev, ...@@ -296,14 +296,7 @@ static int ieee80211_ioctl_siwmode(struct net_device *dev,
return -EINVAL; return -EINVAL;
} }
if (type == sdata->vif.type) return ieee80211_if_change_type(sdata, type);
return 0;
if (netif_running(dev))
return -EBUSY;
ieee80211_if_change_type(sdata, type);
return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment