Linux Audio

Check our new training course

Loading...
  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
 29void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan)
 30{
 31	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 32	struct ieee802154_local *local = sdata->local;
 33	int res;
 34
 35	ASSERT_RTNL();
 36
 37	BUG_ON(dev->type != ARPHRD_IEEE802154);
 38
 39	res = drv_set_channel(local, page, chan);
 40	if (res) {
 41		pr_debug("set_channel failed\n");
 42	} else {
 43		local->phy->current_channel = chan;
 44		local->phy->current_page = page;
 45	}
 46}
 47
 48int mac802154_get_params(struct net_device *dev,
 49			 struct ieee802154_llsec_params *params)
 50{
 51	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 52	int res;
 53
 54	BUG_ON(dev->type != ARPHRD_IEEE802154);
 55
 56	mutex_lock(&sdata->sec_mtx);
 57	res = mac802154_llsec_get_params(&sdata->sec, params);
 58	mutex_unlock(&sdata->sec_mtx);
 59
 60	return res;
 61}
 62
 63int mac802154_set_params(struct net_device *dev,
 64			 const struct ieee802154_llsec_params *params,
 65			 int changed)
 66{
 67	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 68	int res;
 69
 70	BUG_ON(dev->type != ARPHRD_IEEE802154);
 71
 72	mutex_lock(&sdata->sec_mtx);
 73	res = mac802154_llsec_set_params(&sdata->sec, params, changed);
 74	mutex_unlock(&sdata->sec_mtx);
 75
 76	return res;
 77}
 78
 79int mac802154_add_key(struct net_device *dev,
 80		      const struct ieee802154_llsec_key_id *id,
 81		      const struct ieee802154_llsec_key *key)
 82{
 83	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 84	int res;
 85
 86	BUG_ON(dev->type != ARPHRD_IEEE802154);
 87
 88	mutex_lock(&sdata->sec_mtx);
 89	res = mac802154_llsec_key_add(&sdata->sec, id, key);
 90	mutex_unlock(&sdata->sec_mtx);
 91
 92	return res;
 93}
 94
 95int mac802154_del_key(struct net_device *dev,
 96		      const struct ieee802154_llsec_key_id *id)
 97{
 98	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 99	int res;
100
101	BUG_ON(dev->type != ARPHRD_IEEE802154);
102
103	mutex_lock(&sdata->sec_mtx);
104	res = mac802154_llsec_key_del(&sdata->sec, id);
105	mutex_unlock(&sdata->sec_mtx);
106
107	return res;
108}
109
110int mac802154_add_dev(struct net_device *dev,
111		      const struct ieee802154_llsec_device *llsec_dev)
112{
113	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
114	int res;
115
116	BUG_ON(dev->type != ARPHRD_IEEE802154);
117
118	mutex_lock(&sdata->sec_mtx);
119	res = mac802154_llsec_dev_add(&sdata->sec, llsec_dev);
120	mutex_unlock(&sdata->sec_mtx);
121
122	return res;
123}
124
125int mac802154_del_dev(struct net_device *dev, __le64 dev_addr)
126{
127	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
128	int res;
129
130	BUG_ON(dev->type != ARPHRD_IEEE802154);
131
132	mutex_lock(&sdata->sec_mtx);
133	res = mac802154_llsec_dev_del(&sdata->sec, dev_addr);
134	mutex_unlock(&sdata->sec_mtx);
135
136	return res;
137}
138
139int mac802154_add_devkey(struct net_device *dev,
140			 __le64 device_addr,
141			 const struct ieee802154_llsec_device_key *key)
142{
143	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
144	int res;
145
146	BUG_ON(dev->type != ARPHRD_IEEE802154);
147
148	mutex_lock(&sdata->sec_mtx);
149	res = mac802154_llsec_devkey_add(&sdata->sec, device_addr, key);
150	mutex_unlock(&sdata->sec_mtx);
151
152	return res;
153}
154
155int mac802154_del_devkey(struct net_device *dev,
156			 __le64 device_addr,
157			 const struct ieee802154_llsec_device_key *key)
158{
159	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
160	int res;
161
162	BUG_ON(dev->type != ARPHRD_IEEE802154);
163
164	mutex_lock(&sdata->sec_mtx);
165	res = mac802154_llsec_devkey_del(&sdata->sec, device_addr, key);
166	mutex_unlock(&sdata->sec_mtx);
167
168	return res;
169}
170
171int mac802154_add_seclevel(struct net_device *dev,
172			   const struct ieee802154_llsec_seclevel *sl)
173{
174	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
175	int res;
176
177	BUG_ON(dev->type != ARPHRD_IEEE802154);
178
179	mutex_lock(&sdata->sec_mtx);
180	res = mac802154_llsec_seclevel_add(&sdata->sec, sl);
181	mutex_unlock(&sdata->sec_mtx);
182
183	return res;
184}
185
186int mac802154_del_seclevel(struct net_device *dev,
187			   const struct ieee802154_llsec_seclevel *sl)
188{
189	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
190	int res;
191
192	BUG_ON(dev->type != ARPHRD_IEEE802154);
193
194	mutex_lock(&sdata->sec_mtx);
195	res = mac802154_llsec_seclevel_del(&sdata->sec, sl);
196	mutex_unlock(&sdata->sec_mtx);
197
198	return res;
199}
200
201void mac802154_lock_table(struct net_device *dev)
202{
203	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
204
205	BUG_ON(dev->type != ARPHRD_IEEE802154);
206
207	mutex_lock(&sdata->sec_mtx);
208}
209
210void mac802154_get_table(struct net_device *dev,
211			 struct ieee802154_llsec_table **t)
212{
213	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
214
215	BUG_ON(dev->type != ARPHRD_IEEE802154);
216
217	*t = &sdata->sec.table;
218}
219
220void mac802154_unlock_table(struct net_device *dev)
221{
222	struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
223
224	BUG_ON(dev->type != ARPHRD_IEEE802154);
225
226	mutex_unlock(&sdata->sec_mtx);
227}