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