xref: /openbmc/linux/net/mac802154/mib.c (revision 6c33a6f4)
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 }
220