Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0 2 : : #include <linux/ieee80211.h> 3 : : #include <linux/export.h> 4 : : #include <net/cfg80211.h> 5 : : #include "nl80211.h" 6 : : #include "core.h" 7 : : #include "rdev-ops.h" 8 : : 9 : : 10 : 0 : int __cfg80211_stop_ap(struct cfg80211_registered_device *rdev, 11 : : struct net_device *dev, bool notify) 12 : : { 13 : 0 : struct wireless_dev *wdev = dev->ieee80211_ptr; 14 : : int err; 15 : : 16 : : ASSERT_WDEV_LOCK(wdev); 17 : : 18 : 0 : if (!rdev->ops->stop_ap) 19 : : return -EOPNOTSUPP; 20 : : 21 : 0 : if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP && 22 : : dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO) 23 : : return -EOPNOTSUPP; 24 : : 25 : 0 : if (!wdev->beacon_interval) 26 : : return -ENOENT; 27 : : 28 : 0 : err = rdev_stop_ap(rdev, dev); 29 : 0 : if (!err) { 30 : 0 : wdev->conn_owner_nlportid = 0; 31 : 0 : wdev->beacon_interval = 0; 32 : 0 : memset(&wdev->chandef, 0, sizeof(wdev->chandef)); 33 : 0 : wdev->ssid_len = 0; 34 : 0 : rdev_set_qos_map(rdev, dev, NULL); 35 : 0 : if (notify) 36 : 0 : nl80211_send_ap_stopped(wdev); 37 : : 38 : : /* Should we apply the grace period during beaconing interface 39 : : * shutdown also? 40 : : */ 41 : 0 : cfg80211_sched_dfs_chan_update(rdev); 42 : : } 43 : : 44 : : schedule_work(&cfg80211_disconnect_work); 45 : : 46 : 0 : return err; 47 : : } 48 : : 49 : 0 : int cfg80211_stop_ap(struct cfg80211_registered_device *rdev, 50 : : struct net_device *dev, bool notify) 51 : : { 52 : 0 : struct wireless_dev *wdev = dev->ieee80211_ptr; 53 : : int err; 54 : : 55 : : wdev_lock(wdev); 56 : 0 : err = __cfg80211_stop_ap(rdev, dev, notify); 57 : : wdev_unlock(wdev); 58 : : 59 : 0 : return err; 60 : : }