diff options
Diffstat (limited to 'net/wireless/ocb.c')
-rw-r--r-- | net/wireless/ocb.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/net/wireless/ocb.c b/net/wireless/ocb.c new file mode 100644 index 000000000000..c00d4a792319 --- /dev/null +++ b/net/wireless/ocb.c | |||
@@ -0,0 +1,88 @@ | |||
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 | } | ||