2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2014-11-03 12:33:18 +03:00
/*
* OCB mode implementation
*
* Copyright : ( c ) 2014 Czech Technical University in Prague
* ( c ) 2014 Volkswagen Group Research
2022-04-14 17:50:57 +03:00
* Copyright ( C ) 2022 Intel Corporation
2014-11-03 12:33:18 +03:00
* Author : Rostislav Lisovy < rostislav . lisovy @ fel . cvut . cz >
* Funded by : Volkswagen Group Research
*/
# include <linux/ieee80211.h>
# include <net/cfg80211.h>
# include "nl80211.h"
# include "core.h"
# include "rdev-ops.h"
int __cfg80211_join_ocb ( struct cfg80211_registered_device * rdev ,
struct net_device * dev ,
struct ocb_setup * setup )
{
struct wireless_dev * wdev = dev - > ieee80211_ptr ;
int err ;
ASSERT_WDEV_LOCK ( wdev ) ;
if ( dev - > ieee80211_ptr - > iftype ! = NL80211_IFTYPE_OCB )
return - EOPNOTSUPP ;
2015-11-10 00:02:09 +03:00
if ( ! rdev - > ops - > join_ocb )
return - EOPNOTSUPP ;
2014-11-03 12:33:18 +03:00
if ( WARN_ON ( ! setup - > chandef . chan ) )
return - EINVAL ;
err = rdev_join_ocb ( rdev , dev , setup ) ;
if ( ! err )
2022-04-14 17:50:57 +03:00
wdev - > u . ocb . chandef = setup - > chandef ;
2014-11-03 12:33:18 +03:00
return err ;
}
int cfg80211_join_ocb ( struct cfg80211_registered_device * rdev ,
struct net_device * dev ,
struct ocb_setup * setup )
{
struct wireless_dev * wdev = dev - > ieee80211_ptr ;
int err ;
wdev_lock ( wdev ) ;
err = __cfg80211_join_ocb ( rdev , dev , setup ) ;
wdev_unlock ( wdev ) ;
return err ;
}
int __cfg80211_leave_ocb ( struct cfg80211_registered_device * rdev ,
struct net_device * dev )
{
struct wireless_dev * wdev = dev - > ieee80211_ptr ;
int err ;
ASSERT_WDEV_LOCK ( wdev ) ;
if ( dev - > ieee80211_ptr - > iftype ! = NL80211_IFTYPE_OCB )
return - EOPNOTSUPP ;
if ( ! rdev - > ops - > leave_ocb )
return - EOPNOTSUPP ;
err = rdev_leave_ocb ( rdev , dev ) ;
if ( ! err )
2022-04-14 17:50:57 +03:00
memset ( & wdev - > u . ocb . chandef , 0 , sizeof ( wdev - > u . ocb . chandef ) ) ;
2014-11-03 12:33:18 +03:00
return err ;
}
int cfg80211_leave_ocb ( struct cfg80211_registered_device * rdev ,
struct net_device * dev )
{
struct wireless_dev * wdev = dev - > ieee80211_ptr ;
int err ;
wdev_lock ( wdev ) ;
err = __cfg80211_leave_ocb ( rdev , dev ) ;
wdev_unlock ( wdev ) ;
return err ;
}