1 // SPDX-License-Identifier: GPL-2.0-only 1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 2 /* 3 * OCB mode implementation 3 * OCB mode implementation 4 * 4 * 5 * Copyright: (c) 2014 Czech Technical Univers 5 * Copyright: (c) 2014 Czech Technical University in Prague 6 * (c) 2014 Volkswagen Group Resear 6 * (c) 2014 Volkswagen Group Research 7 * Copyright (C) 2022-2023 Intel Corporation << 8 * Author: Rostislav Lisovy <rostislav.liso 7 * Author: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz> 9 * Funded by: Volkswagen Group Research 8 * Funded by: Volkswagen Group Research 10 */ 9 */ 11 10 12 #include <linux/ieee80211.h> 11 #include <linux/ieee80211.h> 13 #include <net/cfg80211.h> 12 #include <net/cfg80211.h> 14 #include "nl80211.h" 13 #include "nl80211.h" 15 #include "core.h" 14 #include "core.h" 16 #include "rdev-ops.h" 15 #include "rdev-ops.h" 17 16 18 int cfg80211_join_ocb(struct cfg80211_register !! 17 int __cfg80211_join_ocb(struct cfg80211_registered_device *rdev, 19 struct net_device *dev, !! 18 struct net_device *dev, 20 struct ocb_setup *setup) !! 19 struct ocb_setup *setup) 21 { 20 { 22 struct wireless_dev *wdev = dev->ieee8 21 struct wireless_dev *wdev = dev->ieee80211_ptr; 23 int err; 22 int err; 24 23 25 lockdep_assert_wiphy(wdev->wiphy); !! 24 ASSERT_WDEV_LOCK(wdev); 26 25 27 if (dev->ieee80211_ptr->iftype != NL80 26 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 28 return -EOPNOTSUPP; 27 return -EOPNOTSUPP; 29 28 30 if (!rdev->ops->join_ocb) 29 if (!rdev->ops->join_ocb) 31 return -EOPNOTSUPP; 30 return -EOPNOTSUPP; 32 31 33 if (WARN_ON(!setup->chandef.chan)) 32 if (WARN_ON(!setup->chandef.chan)) 34 return -EINVAL; 33 return -EINVAL; 35 34 36 err = rdev_join_ocb(rdev, dev, setup); 35 err = rdev_join_ocb(rdev, dev, setup); 37 if (!err) 36 if (!err) 38 wdev->u.ocb.chandef = setup->c !! 37 wdev->chandef = setup->chandef; 39 38 40 return err; 39 return err; 41 } 40 } 42 41 43 int cfg80211_leave_ocb(struct cfg80211_registe !! 42 int cfg80211_join_ocb(struct cfg80211_registered_device *rdev, 44 struct net_device *dev) !! 43 struct net_device *dev, >> 44 struct ocb_setup *setup) 45 { 45 { 46 struct wireless_dev *wdev = dev->ieee8 46 struct wireless_dev *wdev = dev->ieee80211_ptr; 47 int err; 47 int err; 48 48 49 lockdep_assert_wiphy(wdev->wiphy); !! 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); 50 63 51 if (dev->ieee80211_ptr->iftype != NL80 64 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 52 return -EOPNOTSUPP; 65 return -EOPNOTSUPP; 53 66 54 if (!rdev->ops->leave_ocb) 67 if (!rdev->ops->leave_ocb) 55 return -EOPNOTSUPP; 68 return -EOPNOTSUPP; 56 69 57 if (!wdev->u.ocb.chandef.chan) << 58 return -ENOTCONN; << 59 << 60 err = rdev_leave_ocb(rdev, dev); 70 err = rdev_leave_ocb(rdev, dev); 61 if (!err) 71 if (!err) 62 memset(&wdev->u.ocb.chandef, 0 !! 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); 63 86 64 return err; 87 return err; 65 } 88 } 66 89
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.