xref: /openbmc/linux/net/mac802154/mib.c (revision 4f3db074)
1 /*
2  * Copyright 2007-2012 Siemens AG
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2
6  * as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * Written by:
14  * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
15  * Sergey Lapin <slapin@ossfans.org>
16  * Maxim Gorbachyov <maxim.gorbachev@siemens.com>
17  * Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
18  */
19 
20 #include <linux/if_arp.h>
21 
22 #include <net/mac802154.h>
23 #include <net/ieee802154_netdev.h>
24 #include <net/cfg802154.h>
25 
26 #include "ieee802154_i.h"
27 #include "driver-ops.h"
28 
29 void mac802154_dev_set_short_addr(struct net_device *dev, __le16 val)
30 {
31 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
32 
33 	BUG_ON(dev->type != ARPHRD_IEEE802154);
34 
35 	spin_lock_bh(&sdata->mib_lock);
36 	sdata->wpan_dev.short_addr = val;
37 	spin_unlock_bh(&sdata->mib_lock);
38 }
39 
40 __le16 mac802154_dev_get_short_addr(const struct net_device *dev)
41 {
42 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
43 	__le16 ret;
44 
45 	BUG_ON(dev->type != ARPHRD_IEEE802154);
46 
47 	spin_lock_bh(&sdata->mib_lock);
48 	ret = sdata->wpan_dev.short_addr;
49 	spin_unlock_bh(&sdata->mib_lock);
50 
51 	return ret;
52 }
53 
54 __le16 mac802154_dev_get_pan_id(const struct net_device *dev)
55 {
56 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
57 	__le16 ret;
58 
59 	BUG_ON(dev->type != ARPHRD_IEEE802154);
60 
61 	spin_lock_bh(&sdata->mib_lock);
62 	ret = sdata->wpan_dev.pan_id;
63 	spin_unlock_bh(&sdata->mib_lock);
64 
65 	return ret;
66 }
67 
68 void mac802154_dev_set_pan_id(struct net_device *dev, __le16 val)
69 {
70 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
71 
72 	BUG_ON(dev->type != ARPHRD_IEEE802154);
73 
74 	spin_lock_bh(&sdata->mib_lock);
75 	sdata->wpan_dev.pan_id = val;
76 	spin_unlock_bh(&sdata->mib_lock);
77 }
78 
79 u8 mac802154_dev_get_dsn(const struct net_device *dev)
80 {
81 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
82 
83 	BUG_ON(dev->type != ARPHRD_IEEE802154);
84 
85 	return sdata->wpan_dev.dsn++;
86 }
87 
88 void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan)
89 {
90 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
91 	struct ieee802154_local *local = sdata->local;
92 	int res;
93 
94 	BUG_ON(dev->type != ARPHRD_IEEE802154);
95 
96 	res = drv_set_channel(local, page, chan);
97 	if (res) {
98 		pr_debug("set_channel failed\n");
99 	} else {
100 		mutex_lock(&local->phy->pib_lock);
101 		local->phy->current_channel = chan;
102 		local->phy->current_page = page;
103 		mutex_unlock(&local->phy->pib_lock);
104 	}
105 }
106 
107 int mac802154_get_params(struct net_device *dev,
108 			 struct ieee802154_llsec_params *params)
109 {
110 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
111 	int res;
112 
113 	BUG_ON(dev->type != ARPHRD_IEEE802154);
114 
115 	mutex_lock(&sdata->sec_mtx);
116 	res = mac802154_llsec_get_params(&sdata->sec, params);
117 	mutex_unlock(&sdata->sec_mtx);
118 
119 	return res;
120 }
121 
122 int mac802154_set_params(struct net_device *dev,
123 			 const struct ieee802154_llsec_params *params,
124 			 int changed)
125 {
126 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
127 	int res;
128 
129 	BUG_ON(dev->type != ARPHRD_IEEE802154);
130 
131 	mutex_lock(&sdata->sec_mtx);
132 	res = mac802154_llsec_set_params(&sdata->sec, params, changed);
133 	mutex_unlock(&sdata->sec_mtx);
134 
135 	return res;
136 }
137 
138 int mac802154_add_key(struct net_device *dev,
139 		      const struct ieee802154_llsec_key_id *id,
140 		      const struct ieee802154_llsec_key *key)
141 {
142 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
143 	int res;
144 
145 	BUG_ON(dev->type != ARPHRD_IEEE802154);
146 
147 	mutex_lock(&sdata->sec_mtx);
148 	res = mac802154_llsec_key_add(&sdata->sec, id, key);
149 	mutex_unlock(&sdata->sec_mtx);
150 
151 	return res;
152 }
153 
154 int mac802154_del_key(struct net_device *dev,
155 		      const struct ieee802154_llsec_key_id *id)
156 {
157 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
158 	int res;
159 
160 	BUG_ON(dev->type != ARPHRD_IEEE802154);
161 
162 	mutex_lock(&sdata->sec_mtx);
163 	res = mac802154_llsec_key_del(&sdata->sec, id);
164 	mutex_unlock(&sdata->sec_mtx);
165 
166 	return res;
167 }
168 
169 int mac802154_add_dev(struct net_device *dev,
170 		      const struct ieee802154_llsec_device *llsec_dev)
171 {
172 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
173 	int res;
174 
175 	BUG_ON(dev->type != ARPHRD_IEEE802154);
176 
177 	mutex_lock(&sdata->sec_mtx);
178 	res = mac802154_llsec_dev_add(&sdata->sec, llsec_dev);
179 	mutex_unlock(&sdata->sec_mtx);
180 
181 	return res;
182 }
183 
184 int mac802154_del_dev(struct net_device *dev, __le64 dev_addr)
185 {
186 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
187 	int res;
188 
189 	BUG_ON(dev->type != ARPHRD_IEEE802154);
190 
191 	mutex_lock(&sdata->sec_mtx);
192 	res = mac802154_llsec_dev_del(&sdata->sec, dev_addr);
193 	mutex_unlock(&sdata->sec_mtx);
194 
195 	return res;
196 }
197 
198 int mac802154_add_devkey(struct net_device *dev,
199 			 __le64 device_addr,
200 			 const struct ieee802154_llsec_device_key *key)
201 {
202 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
203 	int res;
204 
205 	BUG_ON(dev->type != ARPHRD_IEEE802154);
206 
207 	mutex_lock(&sdata->sec_mtx);
208 	res = mac802154_llsec_devkey_add(&sdata->sec, device_addr, key);
209 	mutex_unlock(&sdata->sec_mtx);
210 
211 	return res;
212 }
213 
214 int mac802154_del_devkey(struct net_device *dev,
215 			 __le64 device_addr,
216 			 const struct ieee802154_llsec_device_key *key)
217 {
218 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
219 	int res;
220 
221 	BUG_ON(dev->type != ARPHRD_IEEE802154);
222 
223 	mutex_lock(&sdata->sec_mtx);
224 	res = mac802154_llsec_devkey_del(&sdata->sec, device_addr, key);
225 	mutex_unlock(&sdata->sec_mtx);
226 
227 	return res;
228 }
229 
230 int mac802154_add_seclevel(struct net_device *dev,
231 			   const struct ieee802154_llsec_seclevel *sl)
232 {
233 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
234 	int res;
235 
236 	BUG_ON(dev->type != ARPHRD_IEEE802154);
237 
238 	mutex_lock(&sdata->sec_mtx);
239 	res = mac802154_llsec_seclevel_add(&sdata->sec, sl);
240 	mutex_unlock(&sdata->sec_mtx);
241 
242 	return res;
243 }
244 
245 int mac802154_del_seclevel(struct net_device *dev,
246 			   const struct ieee802154_llsec_seclevel *sl)
247 {
248 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
249 	int res;
250 
251 	BUG_ON(dev->type != ARPHRD_IEEE802154);
252 
253 	mutex_lock(&sdata->sec_mtx);
254 	res = mac802154_llsec_seclevel_del(&sdata->sec, sl);
255 	mutex_unlock(&sdata->sec_mtx);
256 
257 	return res;
258 }
259 
260 void mac802154_lock_table(struct net_device *dev)
261 {
262 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
263 
264 	BUG_ON(dev->type != ARPHRD_IEEE802154);
265 
266 	mutex_lock(&sdata->sec_mtx);
267 }
268 
269 void mac802154_get_table(struct net_device *dev,
270 			 struct ieee802154_llsec_table **t)
271 {
272 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
273 
274 	BUG_ON(dev->type != ARPHRD_IEEE802154);
275 
276 	*t = &sdata->sec.table;
277 }
278 
279 void mac802154_unlock_table(struct net_device *dev)
280 {
281 	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
282 
283 	BUG_ON(dev->type != ARPHRD_IEEE802154);
284 
285 	mutex_unlock(&sdata->sec_mtx);
286 }
287