1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * OCB mode implementation 4 * 5 * Copyright: (c) 2014 Czech Technical University in Prague 6 * (c) 2014 Volkswagen Group Research 7 * Copyright (C) 2022-2023 Intel Corporation 8 * Author: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz> 9 * Funded by: Volkswagen Group Research 10 */ 11 12 #include <linux/ieee80211.h> 13 #include <net/cfg80211.h> 14 #include "nl80211.h" 15 #include "core.h" 16 #include "rdev-ops.h" 17 18 int cfg80211_join_ocb(struct cfg80211_registered_device *rdev, 19 struct net_device *dev, 20 struct ocb_setup *setup) 21 { 22 struct wireless_dev *wdev = dev->ieee80211_ptr; 23 int err; 24 25 lockdep_assert_wiphy(wdev->wiphy); 26 27 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 28 return -EOPNOTSUPP; 29 30 if (!rdev->ops->join_ocb) 31 return -EOPNOTSUPP; 32 33 if (WARN_ON(!setup->chandef.chan)) 34 return -EINVAL; 35 36 err = rdev_join_ocb(rdev, dev, setup); 37 if (!err) 38 wdev->u.ocb.chandef = setup->chandef; 39 40 return err; 41 } 42 43 int cfg80211_leave_ocb(struct cfg80211_registered_device *rdev, 44 struct net_device *dev) 45 { 46 struct wireless_dev *wdev = dev->ieee80211_ptr; 47 int err; 48 49 lockdep_assert_wiphy(wdev->wiphy); 50 51 if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_OCB) 52 return -EOPNOTSUPP; 53 54 if (!rdev->ops->leave_ocb) 55 return -EOPNOTSUPP; 56 57 if (!wdev->u.ocb.chandef.chan) 58 return -ENOTCONN; 59 60 err = rdev_leave_ocb(rdev, dev); 61 if (!err) 62 memset(&wdev->u.ocb.chandef, 0, sizeof(wdev->u.ocb.chandef)); 63 64 return err; 65 } 66