Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / net / wireless / ocb.c
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 }