2 * Copyright 2007-2012 Siemens AG
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.
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.
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>
20 #include <linux/if_arp.h>
22 #include <net/mac802154.h>
23 #include <net/ieee802154_netdev.h>
24 #include <net/cfg802154.h>
26 #include "ieee802154_i.h"
27 #include "driver-ops.h"
29 void mac802154_dev_set_short_addr(struct net_device
*dev
, __le16 val
)
31 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
33 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
35 spin_lock_bh(&sdata
->mib_lock
);
36 sdata
->short_addr
= val
;
37 spin_unlock_bh(&sdata
->mib_lock
);
40 __le16
mac802154_dev_get_short_addr(const struct net_device
*dev
)
42 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
45 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
47 spin_lock_bh(&sdata
->mib_lock
);
48 ret
= sdata
->short_addr
;
49 spin_unlock_bh(&sdata
->mib_lock
);
54 __le16
mac802154_dev_get_pan_id(const struct net_device
*dev
)
56 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
59 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
61 spin_lock_bh(&sdata
->mib_lock
);
63 spin_unlock_bh(&sdata
->mib_lock
);
68 void mac802154_dev_set_pan_id(struct net_device
*dev
, __le16 val
)
70 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
72 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
74 spin_lock_bh(&sdata
->mib_lock
);
76 spin_unlock_bh(&sdata
->mib_lock
);
79 u8
mac802154_dev_get_dsn(const struct net_device
*dev
)
81 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
83 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
88 void mac802154_dev_set_page_channel(struct net_device
*dev
, u8 page
, u8 chan
)
90 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
91 struct ieee802154_local
*local
= sdata
->local
;
94 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
96 res
= drv_set_channel(local
, page
, chan
);
98 pr_debug("set_channel failed\n");
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
);
108 int mac802154_get_params(struct net_device
*dev
,
109 struct ieee802154_llsec_params
*params
)
111 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
114 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
116 mutex_lock(&sdata
->sec_mtx
);
117 res
= mac802154_llsec_get_params(&sdata
->sec
, params
);
118 mutex_unlock(&sdata
->sec_mtx
);
123 int mac802154_set_params(struct net_device
*dev
,
124 const struct ieee802154_llsec_params
*params
,
127 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
130 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
132 mutex_lock(&sdata
->sec_mtx
);
133 res
= mac802154_llsec_set_params(&sdata
->sec
, params
, changed
);
134 mutex_unlock(&sdata
->sec_mtx
);
140 int mac802154_add_key(struct net_device
*dev
,
141 const struct ieee802154_llsec_key_id
*id
,
142 const struct ieee802154_llsec_key
*key
)
144 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
147 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
149 mutex_lock(&sdata
->sec_mtx
);
150 res
= mac802154_llsec_key_add(&sdata
->sec
, id
, key
);
151 mutex_unlock(&sdata
->sec_mtx
);
156 int mac802154_del_key(struct net_device
*dev
,
157 const struct ieee802154_llsec_key_id
*id
)
159 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
162 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
164 mutex_lock(&sdata
->sec_mtx
);
165 res
= mac802154_llsec_key_del(&sdata
->sec
, id
);
166 mutex_unlock(&sdata
->sec_mtx
);
172 int mac802154_add_dev(struct net_device
*dev
,
173 const struct ieee802154_llsec_device
*llsec_dev
)
175 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
178 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
180 mutex_lock(&sdata
->sec_mtx
);
181 res
= mac802154_llsec_dev_add(&sdata
->sec
, llsec_dev
);
182 mutex_unlock(&sdata
->sec_mtx
);
187 int mac802154_del_dev(struct net_device
*dev
, __le64 dev_addr
)
189 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
192 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
194 mutex_lock(&sdata
->sec_mtx
);
195 res
= mac802154_llsec_dev_del(&sdata
->sec
, dev_addr
);
196 mutex_unlock(&sdata
->sec_mtx
);
202 int mac802154_add_devkey(struct net_device
*dev
,
204 const struct ieee802154_llsec_device_key
*key
)
206 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
209 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
211 mutex_lock(&sdata
->sec_mtx
);
212 res
= mac802154_llsec_devkey_add(&sdata
->sec
, device_addr
, key
);
213 mutex_unlock(&sdata
->sec_mtx
);
218 int mac802154_del_devkey(struct net_device
*dev
,
220 const struct ieee802154_llsec_device_key
*key
)
222 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
225 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
227 mutex_lock(&sdata
->sec_mtx
);
228 res
= mac802154_llsec_devkey_del(&sdata
->sec
, device_addr
, key
);
229 mutex_unlock(&sdata
->sec_mtx
);
235 int mac802154_add_seclevel(struct net_device
*dev
,
236 const struct ieee802154_llsec_seclevel
*sl
)
238 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
241 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
243 mutex_lock(&sdata
->sec_mtx
);
244 res
= mac802154_llsec_seclevel_add(&sdata
->sec
, sl
);
245 mutex_unlock(&sdata
->sec_mtx
);
250 int mac802154_del_seclevel(struct net_device
*dev
,
251 const struct ieee802154_llsec_seclevel
*sl
)
253 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
256 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
258 mutex_lock(&sdata
->sec_mtx
);
259 res
= mac802154_llsec_seclevel_del(&sdata
->sec
, sl
);
260 mutex_unlock(&sdata
->sec_mtx
);
266 void mac802154_lock_table(struct net_device
*dev
)
268 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
270 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
272 mutex_lock(&sdata
->sec_mtx
);
275 void mac802154_get_table(struct net_device
*dev
,
276 struct ieee802154_llsec_table
**t
)
278 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
280 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
282 *t
= &sdata
->sec
.table
;
285 void mac802154_unlock_table(struct net_device
*dev
)
287 struct ieee802154_sub_if_data
*sdata
= IEEE802154_DEV_TO_SUB_IF(dev
);
289 BUG_ON(dev
->type
!= ARPHRD_IEEE802154
);
291 mutex_unlock(&sdata
->sec_mtx
);