diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c index a7ac53a2f00d..af3bb1b86d7a 100644 --- a/net/mac80211/ibss.c +++ b/net/mac80211/ibss.c @@ -1886,6 +1886,7 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata) skb_queue_purge(&sdata->skb_queue); del_timer_sync(&sdata->u.ibss.timer); + pr_info("DC %s: del_timer_sync\n", __func__); return 0; } diff --git a/net/mac80211/ocb.c b/net/mac80211/ocb.c index 7c1a735b9eee..1428b1857aef 100644 --- a/net/mac80211/ocb.c +++ b/net/mac80211/ocb.c @@ -234,6 +234,7 @@ int ieee80211_ocb_leave(struct ieee80211_sub_if_data *sdata) skb_queue_purge(&sdata->skb_queue); del_timer_sync(&sdata->u.ocb.housekeeping_timer); + pr_info("DC %s: del_timer_sync\n", __func__); /* If the timer fired while we waited for it, it will have * requeued the work. Now the work will be running again * but will not rearm the timer again because it checks diff --git a/net/wireless/ibss.c b/net/wireless/ibss.c index 8f98e546becf..0730ffd92f1d 100644 --- a/net/wireless/ibss.c +++ b/net/wireless/ibss.c @@ -162,8 +162,10 @@ static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext) ASSERT_WDEV_LOCK(wdev); - kfree_sensitive(wdev->connect_keys); - wdev->connect_keys = NULL; + if(wdev->connect_keys) { + kfree_sensitive(wdev->connect_keys); + wdev->connect_keys = NULL; + } rdev_set_qos_map(rdev, dev, NULL); @@ -207,9 +209,6 @@ int __cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, ASSERT_WDEV_LOCK(wdev); - if (!wdev->ssid_len) - return -ENOLINK; - err = rdev_leave_ibss(rdev, dev); if (err) diff --git a/net/wireless/ocb.c b/net/wireless/ocb.c index 2d26a6d980bf..fe677f974d13 100644 --- a/net/wireless/ocb.c +++ b/net/wireless/ocb.c @@ -67,6 +67,7 @@ int __cfg80211_leave_ocb(struct cfg80211_registered_device *rdev, if (!rdev->ops->leave_ocb) return -EOPNOTSUPP; + pr_info("DC %s:\n", __func__); err = rdev_leave_ocb(rdev, dev); if (!err) memset(&wdev->chandef, 0, sizeof(wdev->chandef)); @@ -80,6 +81,7 @@ int cfg80211_leave_ocb(struct cfg80211_registered_device *rdev, struct wireless_dev *wdev = dev->ieee80211_ptr; int err; + pr_info("DC %s:\n", __func__); wdev_lock(wdev); err = __cfg80211_leave_ocb(rdev, dev); wdev_unlock(wdev); diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h index 8b1358d04ca2..fac59c7789d9 100644 --- a/net/wireless/rdev-ops.h +++ b/net/wireless/rdev-ops.h @@ -379,6 +379,7 @@ static inline int rdev_leave_ocb(struct cfg80211_registered_device *rdev, { int ret; trace_rdev_leave_ocb(&rdev->wiphy, dev); + pr_info("DC %s:\n", __func__); ret = rdev->ops->leave_ocb(&rdev->wiphy, dev); trace_rdev_return_int(&rdev->wiphy, ret); return ret; diff --git a/net/wireless/util.c b/net/wireless/util.c index 1bf0200f562a..ab62a164e6fa 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -1055,6 +1055,10 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev, break; case NL80211_IFTYPE_MESH_POINT: /* mesh should be handled? */ + cfg80211_leave_mesh(rdev, dev); + break; + case NL80211_IFTYPE_OCB: + cfg80211_leave_ocb(rdev, dev); break; default: break;