linux/net/wireless/ap.c
<<
>>
Prefs
   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
  10int __cfg80211_stop_ap(struct cfg80211_registered_device *rdev,
  11                       struct net_device *dev, bool notify)
  12{
  13        struct wireless_dev *wdev = dev->ieee80211_ptr;
  14        int err;
  15
  16        ASSERT_WDEV_LOCK(wdev);
  17
  18        if (!rdev->ops->stop_ap)
  19                return -EOPNOTSUPP;
  20
  21        if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
  22            dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
  23                return -EOPNOTSUPP;
  24
  25        if (!wdev->beacon_interval)
  26                return -ENOENT;
  27
  28        err = rdev_stop_ap(rdev, dev);
  29        if (!err) {
  30                wdev->conn_owner_nlportid = 0;
  31                wdev->beacon_interval = 0;
  32                memset(&wdev->chandef, 0, sizeof(wdev->chandef));
  33                wdev->ssid_len = 0;
  34                rdev_set_qos_map(rdev, dev, NULL);
  35                if (notify)
  36                        nl80211_send_ap_stopped(wdev);
  37
  38                /* Should we apply the grace period during beaconing interface
  39                 * shutdown also?
  40                 */
  41                cfg80211_sched_dfs_chan_update(rdev);
  42        }
  43
  44        schedule_work(&cfg80211_disconnect_work);
  45
  46        return err;
  47}
  48
  49int cfg80211_stop_ap(struct cfg80211_registered_device *rdev,
  50                     struct net_device *dev, bool notify)
  51{
  52        struct wireless_dev *wdev = dev->ieee80211_ptr;
  53        int err;
  54
  55        wdev_lock(wdev);
  56        err = __cfg80211_stop_ap(rdev, dev, notify);
  57        wdev_unlock(wdev);
  58
  59        return err;
  60}
  61