0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/ieee80211.h>
0013 #include <net/cfg80211.h>
0014 #include "nl80211.h"
0015 #include "core.h"
0016 #include "rdev-ops.h"
0017
0018 int __cfg80211_join_ocb(struct cfg80211_registered_device *rdev,
0019 struct net_device *dev,
0020 struct ocb_setup *setup)
0021 {
0022 struct wireless_dev *wdev = dev->ieee80211_ptr;
0023 int err;
0024
0025 ASSERT_WDEV_LOCK(wdev);
0026
0027 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB)
0028 return -EOPNOTSUPP;
0029
0030 if (!rdev->ops->join_ocb)
0031 return -EOPNOTSUPP;
0032
0033 if (WARN_ON(!setup->chandef.chan))
0034 return -EINVAL;
0035
0036 err = rdev_join_ocb(rdev, dev, setup);
0037 if (!err)
0038 wdev->u.ocb.chandef = setup->chandef;
0039
0040 return err;
0041 }
0042
0043 int cfg80211_join_ocb(struct cfg80211_registered_device *rdev,
0044 struct net_device *dev,
0045 struct ocb_setup *setup)
0046 {
0047 struct wireless_dev *wdev = dev->ieee80211_ptr;
0048 int err;
0049
0050 wdev_lock(wdev);
0051 err = __cfg80211_join_ocb(rdev, dev, setup);
0052 wdev_unlock(wdev);
0053
0054 return err;
0055 }
0056
0057 int __cfg80211_leave_ocb(struct cfg80211_registered_device *rdev,
0058 struct net_device *dev)
0059 {
0060 struct wireless_dev *wdev = dev->ieee80211_ptr;
0061 int err;
0062
0063 ASSERT_WDEV_LOCK(wdev);
0064
0065 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB)
0066 return -EOPNOTSUPP;
0067
0068 if (!rdev->ops->leave_ocb)
0069 return -EOPNOTSUPP;
0070
0071 err = rdev_leave_ocb(rdev, dev);
0072 if (!err)
0073 memset(&wdev->u.ocb.chandef, 0, sizeof(wdev->u.ocb.chandef));
0074
0075 return err;
0076 }
0077
0078 int cfg80211_leave_ocb(struct cfg80211_registered_device *rdev,
0079 struct net_device *dev)
0080 {
0081 struct wireless_dev *wdev = dev->ieee80211_ptr;
0082 int err;
0083
0084 wdev_lock(wdev);
0085 err = __cfg80211_leave_ocb(rdev, dev);
0086 wdev_unlock(wdev);
0087
0088 return err;
0089 }