2012-06-29 14:46:56 +04:00
# include <linux/ieee80211.h>
# include <linux/export.h>
# include <net/cfg80211.h>
# include "nl80211.h"
# include "core.h"
2012-06-27 18:19:42 +04:00
# include "rdev-ops.h"
2012-06-29 14:46:56 +04:00
static int __cfg80211_stop_ap ( struct cfg80211_registered_device * rdev ,
2014-02-25 17:33:38 +04:00
struct net_device * dev , bool notify )
2012-06-29 14:46:56 +04:00
{
struct wireless_dev * wdev = dev - > ieee80211_ptr ;
int err ;
ASSERT_WDEV_LOCK ( wdev ) ;
if ( ! rdev - > ops - > stop_ap )
return - EOPNOTSUPP ;
if ( dev - > ieee80211_ptr - > iftype ! = NL80211_IFTYPE_AP & &
dev - > ieee80211_ptr - > iftype ! = NL80211_IFTYPE_P2P_GO )
return - EOPNOTSUPP ;
if ( ! wdev - > beacon_interval )
return - ENOENT ;
2012-06-27 18:19:42 +04:00
err = rdev_stop_ap ( rdev , dev ) ;
2012-06-29 14:46:58 +04:00
if ( ! err ) {
2012-06-29 14:46:56 +04:00
wdev - > beacon_interval = 0 ;
2014-01-29 17:22:27 +04:00
memset ( & wdev - > chandef , 0 , sizeof ( wdev - > chandef ) ) ;
2012-11-07 15:52:19 +04:00
wdev - > ssid_len = 0 ;
2013-12-17 11:01:30 +04:00
rdev_set_qos_map ( rdev , dev , NULL ) ;
2014-02-25 17:33:38 +04:00
if ( notify )
nl80211_send_ap_stopped ( wdev ) ;
2012-06-29 14:46:58 +04:00
}
2012-06-29 14:46:56 +04:00
return err ;
}
int cfg80211_stop_ap ( struct cfg80211_registered_device * rdev ,
2014-02-25 17:33:38 +04:00
struct net_device * dev , bool notify )
2012-06-29 14:46:56 +04:00
{
struct wireless_dev * wdev = dev - > ieee80211_ptr ;
int err ;
wdev_lock ( wdev ) ;
2014-02-25 17:33:38 +04:00
err = __cfg80211_stop_ap ( rdev , dev , notify ) ;
2012-06-29 14:46:56 +04:00
wdev_unlock ( wdev ) ;
return err ;
}