ceph: avoid use-after-free in ceph_fl_release_lock()
[platform/kernel/linux-rpi.git] / net / mac802154 / mib.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright 2007-2012 Siemens AG
4  *
5  * Written by:
6  * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
7  * Sergey Lapin <slapin@ossfans.org>
8  * Maxim Gorbachyov <maxim.gorbachev@siemens.com>
9  * Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
10  */
11
12 #include <linux/if_arp.h>
13
14 #include <net/mac802154.h>
15 #include <net/ieee802154_netdev.h>
16 #include <net/cfg802154.h>
17
18 #include "ieee802154_i.h"
19 #include "driver-ops.h"
20
21 void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan)
22 {
23         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
24         struct ieee802154_local *local = sdata->local;
25         int res;
26
27         ASSERT_RTNL();
28
29         BUG_ON(dev->type != ARPHRD_IEEE802154);
30
31         res = drv_set_channel(local, page, chan);
32         if (res) {
33                 pr_debug("set_channel failed\n");
34         } else {
35                 local->phy->current_channel = chan;
36                 local->phy->current_page = page;
37         }
38 }
39
40 int mac802154_get_params(struct net_device *dev,
41                          struct ieee802154_llsec_params *params)
42 {
43         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
44         int res;
45
46         BUG_ON(dev->type != ARPHRD_IEEE802154);
47
48         mutex_lock(&sdata->sec_mtx);
49         res = mac802154_llsec_get_params(&sdata->sec, params);
50         mutex_unlock(&sdata->sec_mtx);
51
52         return res;
53 }
54
55 int mac802154_set_params(struct net_device *dev,
56                          const struct ieee802154_llsec_params *params,
57                          int changed)
58 {
59         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
60         int res;
61
62         BUG_ON(dev->type != ARPHRD_IEEE802154);
63
64         mutex_lock(&sdata->sec_mtx);
65         res = mac802154_llsec_set_params(&sdata->sec, params, changed);
66         mutex_unlock(&sdata->sec_mtx);
67
68         return res;
69 }
70
71 int mac802154_add_key(struct net_device *dev,
72                       const struct ieee802154_llsec_key_id *id,
73                       const struct ieee802154_llsec_key *key)
74 {
75         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
76         int res;
77
78         BUG_ON(dev->type != ARPHRD_IEEE802154);
79
80         mutex_lock(&sdata->sec_mtx);
81         res = mac802154_llsec_key_add(&sdata->sec, id, key);
82         mutex_unlock(&sdata->sec_mtx);
83
84         return res;
85 }
86
87 int mac802154_del_key(struct net_device *dev,
88                       const struct ieee802154_llsec_key_id *id)
89 {
90         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
91         int res;
92
93         BUG_ON(dev->type != ARPHRD_IEEE802154);
94
95         mutex_lock(&sdata->sec_mtx);
96         res = mac802154_llsec_key_del(&sdata->sec, id);
97         mutex_unlock(&sdata->sec_mtx);
98
99         return res;
100 }
101
102 int mac802154_add_dev(struct net_device *dev,
103                       const struct ieee802154_llsec_device *llsec_dev)
104 {
105         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
106         int res;
107
108         BUG_ON(dev->type != ARPHRD_IEEE802154);
109
110         mutex_lock(&sdata->sec_mtx);
111         res = mac802154_llsec_dev_add(&sdata->sec, llsec_dev);
112         mutex_unlock(&sdata->sec_mtx);
113
114         return res;
115 }
116
117 int mac802154_del_dev(struct net_device *dev, __le64 dev_addr)
118 {
119         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
120         int res;
121
122         BUG_ON(dev->type != ARPHRD_IEEE802154);
123
124         mutex_lock(&sdata->sec_mtx);
125         res = mac802154_llsec_dev_del(&sdata->sec, dev_addr);
126         mutex_unlock(&sdata->sec_mtx);
127
128         return res;
129 }
130
131 int mac802154_add_devkey(struct net_device *dev,
132                          __le64 device_addr,
133                          const struct ieee802154_llsec_device_key *key)
134 {
135         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
136         int res;
137
138         BUG_ON(dev->type != ARPHRD_IEEE802154);
139
140         mutex_lock(&sdata->sec_mtx);
141         res = mac802154_llsec_devkey_add(&sdata->sec, device_addr, key);
142         mutex_unlock(&sdata->sec_mtx);
143
144         return res;
145 }
146
147 int mac802154_del_devkey(struct net_device *dev,
148                          __le64 device_addr,
149                          const struct ieee802154_llsec_device_key *key)
150 {
151         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
152         int res;
153
154         BUG_ON(dev->type != ARPHRD_IEEE802154);
155
156         mutex_lock(&sdata->sec_mtx);
157         res = mac802154_llsec_devkey_del(&sdata->sec, device_addr, key);
158         mutex_unlock(&sdata->sec_mtx);
159
160         return res;
161 }
162
163 int mac802154_add_seclevel(struct net_device *dev,
164                            const struct ieee802154_llsec_seclevel *sl)
165 {
166         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
167         int res;
168
169         BUG_ON(dev->type != ARPHRD_IEEE802154);
170
171         mutex_lock(&sdata->sec_mtx);
172         res = mac802154_llsec_seclevel_add(&sdata->sec, sl);
173         mutex_unlock(&sdata->sec_mtx);
174
175         return res;
176 }
177
178 int mac802154_del_seclevel(struct net_device *dev,
179                            const struct ieee802154_llsec_seclevel *sl)
180 {
181         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
182         int res;
183
184         BUG_ON(dev->type != ARPHRD_IEEE802154);
185
186         mutex_lock(&sdata->sec_mtx);
187         res = mac802154_llsec_seclevel_del(&sdata->sec, sl);
188         mutex_unlock(&sdata->sec_mtx);
189
190         return res;
191 }
192
193 void mac802154_lock_table(struct net_device *dev)
194 {
195         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
196
197         BUG_ON(dev->type != ARPHRD_IEEE802154);
198
199         mutex_lock(&sdata->sec_mtx);
200 }
201
202 void mac802154_get_table(struct net_device *dev,
203                          struct ieee802154_llsec_table **t)
204 {
205         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
206
207         BUG_ON(dev->type != ARPHRD_IEEE802154);
208
209         *t = &sdata->sec.table;
210 }
211
212 void mac802154_unlock_table(struct net_device *dev)
213 {
214         struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
215
216         BUG_ON(dev->type != ARPHRD_IEEE802154);
217
218         mutex_unlock(&sdata->sec_mtx);
219 }