Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 66780
b: refs/heads/master
c: 5b2812e
h: refs/heads/master
v: v3
  • Loading branch information
Johannes Berg authored and David S. Miller committed Oct 10, 2007
1 parent 6b40757 commit ba1c0f3
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b4219952356baa162368f2f5dab6421a5dbc5e15
refs/heads/master: 5b2812e925c8e976852867f8d760637c5926d817
19 changes: 16 additions & 3 deletions trunk/net/mac80211/ieee80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,6 @@ void ieee80211_if_mgmt_setup(struct net_device *dev)
dev->open = ieee80211_mgmt_open;
dev->stop = ieee80211_mgmt_stop;
dev->type = ARPHRD_IEEE80211_PRISM;
dev->uninit = ieee80211_if_reinit;
dev->destructor = ieee80211_if_free;
}

Expand Down Expand Up @@ -551,7 +550,6 @@ void ieee80211_if_setup(struct net_device *dev)
dev->change_mtu = ieee80211_change_mtu;
dev->open = ieee80211_open;
dev->stop = ieee80211_stop;
dev->uninit = ieee80211_if_reinit;
dev->destructor = ieee80211_if_free;
}

Expand Down Expand Up @@ -1242,6 +1240,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
goto fail_dev;

ieee80211_debugfs_add_netdev(IEEE80211_DEV_TO_SUB_IF(local->mdev));
ieee80211_if_set_type(local->mdev, IEEE80211_IF_TYPE_AP);

result = ieee80211_init_rate_ctrl_alg(local, NULL);
if (result < 0) {
Expand Down Expand Up @@ -1346,8 +1345,22 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw)
* because the driver cannot be handing us frames any
* more and the tasklet is killed.
*/
list_for_each_entry_safe(sdata, tmp, &local->interfaces, list)

/*
* First, we remove all non-master interfaces. Do this because they
* may have bss pointer dependency on the master, and when we free
* the master these would be freed as well, breaking our list
* iteration completely.
*/
list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
if (sdata->dev == local->mdev)
continue;
list_del(&sdata->list);
__ieee80211_if_del(local, sdata);
}

/* then, finally, remove the master interface */
__ieee80211_if_del(local, IEEE80211_DEV_TO_SUB_IF(local->mdev));

rtnl_unlock();

Expand Down
37 changes: 28 additions & 9 deletions trunk/net/mac80211/ieee80211_iface.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,12 @@ int ieee80211_if_add_mgmt(struct ieee80211_local *local)
if (ret)
goto fail;

/*
* Called even when register_netdevice fails, it would
* oops if assigned before initialising the rest.
*/
ndev->uninit = ieee80211_if_reinit;

ieee80211_debugfs_add_netdev(nsdata);

if (local->open_count > 0)
Expand Down Expand Up @@ -155,12 +161,27 @@ void ieee80211_if_set_type(struct net_device *dev, int type)
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
int oldtype = sdata->type;

dev->hard_start_xmit = ieee80211_subif_start_xmit;

/*
* We need to call this function on the master interface
* which already has a hard_start_xmit routine assigned
* which must not be changed.
*/
if (!dev->hard_start_xmit)
dev->hard_start_xmit = ieee80211_subif_start_xmit;

/*
* Called even when register_netdevice fails, it would
* oops if assigned before initialising the rest.
*/
dev->uninit = ieee80211_if_reinit;

/* most have no BSS pointer */
sdata->bss = NULL;
sdata->type = type;

switch (type) {
case IEEE80211_IF_TYPE_WDS:
sdata->bss = NULL;
/* nothing special */
break;
case IEEE80211_IF_TYPE_VLAN:
sdata->u.vlan.ap = NULL;
Expand Down Expand Up @@ -213,6 +234,7 @@ void ieee80211_if_reinit(struct net_device *dev)
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
struct sta_info *sta;
struct sk_buff *skb;

ASSERT_RTNL();

Expand Down Expand Up @@ -246,12 +268,9 @@ void ieee80211_if_reinit(struct net_device *dev)
kfree(sdata->u.ap.beacon_tail);
kfree(sdata->u.ap.generic_elem);

if (dev != local->mdev) {
struct sk_buff *skb;
while ((skb = skb_dequeue(&sdata->u.ap.ps_bc_buf))) {
local->total_ps_buffered--;
dev_kfree_skb(skb);
}
while ((skb = skb_dequeue(&sdata->u.ap.ps_bc_buf))) {
local->total_ps_buffered--;
dev_kfree_skb(skb);
}

break;
Expand Down

0 comments on commit ba1c0f3

Please sign in to comment.