1 /* 2 * OCB mode implementation 3 * 4 * Copyright: (c) 2014 Czech Technical University in Prague 5 * (c) 2014 Volkswagen Group Research 6 * Author: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz> 7 * Funded by: Volkswagen Group Research 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License version 2 as 11 * published by the Free Software Foundation. 12 */ 13 14 #include <linux/ieee80211.h> 15 #include <net/cfg80211.h> 16 #include "nl80211.h" 17 #include "core.h" 18 #include "rdev-ops.h" 19 20 int __cfg80211_join_ocb(struct cfg80211_registered_device *rdev, 21 struct net_device *dev, 22 struct ocb_setup *setup) 23 { 24 struct wireless_dev *wdev = dev->ieee80211_ptr; 25 int err; 26 27 ASSERT_WDEV_LOCK(wdev); 28 29 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 30 return -EOPNOTSUPP; 31 32 if (WARN_ON(!setup->chandef.chan)) 33 return -EINVAL; 34 35 err = rdev_join_ocb(rdev, dev, setup); 36 if (!err) 37 wdev->chandef = setup->chandef; 38 39 return err; 40 } 41 42 int cfg80211_join_ocb(struct cfg80211_registered_device *rdev, 43 struct net_device *dev, 44 struct ocb_setup *setup) 45 { 46 struct wireless_dev *wdev = dev->ieee80211_ptr; 47 int err; 48 49 wdev_lock(wdev); 50 err = __cfg80211_join_ocb(rdev, dev, setup); 51 wdev_unlock(wdev); 52 53 return err; 54 } 55 56 int __cfg80211_leave_ocb(struct cfg80211_registered_device *rdev, 57 struct net_device *dev) 58 { 59 struct wireless_dev *wdev = dev->ieee80211_ptr; 60 int err; 61 62 ASSERT_WDEV_LOCK(wdev); 63 64 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 65 return -EOPNOTSUPP; 66 67 if (!rdev->ops->leave_ocb) 68 return -EOPNOTSUPP; 69 70 err = rdev_leave_ocb(rdev, dev); 71 if (!err) 72 memset(&wdev->chandef, 0, sizeof(wdev->chandef)); 73 74 return err; 75 } 76 77 int cfg80211_leave_ocb(struct cfg80211_registered_device *rdev, 78 struct net_device *dev) 79 { 80 struct wireless_dev *wdev = dev->ieee80211_ptr; 81 int err; 82 83 wdev_lock(wdev); 84 err = __cfg80211_leave_ocb(rdev, dev); 85 wdev_unlock(wdev); 86 87 return err; 88 } 89