Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * OCB mode implementation
0004  *
0005  * Copyright: (c) 2014 Czech Technical University in Prague
0006  *            (c) 2014 Volkswagen Group Research
0007  * Copyright (C) 2022 Intel Corporation
0008  * Author:    Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz>
0009  * Funded by: Volkswagen Group Research
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 }