blob: ef05b3bd9a638ac5f42d4abd6540e28ec0cf8dfc [file] [log] [blame]
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +00001/*
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 *
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000013 * 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>
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +010023#include <net/ieee802154_netdev.h>
Alexander Aring5ad60d32014-10-25 09:41:02 +020024#include <net/cfg802154.h>
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000025
Alexander Aring0f1556b2014-10-25 09:41:00 +020026#include "ieee802154_i.h"
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000027
alex.bluesman.smirnov@gmail.com66b69d42012-06-25 23:24:51 +000028struct phy_chan_notify_work {
29 struct work_struct work;
30 struct net_device *dev;
31};
32
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000033struct hw_addr_filt_notify_work {
34 struct work_struct work;
35 struct net_device *dev;
36 unsigned long changed;
37};
38
Alexander Aringa5e1ec52014-10-25 17:16:35 +020039static struct ieee802154_local *mac802154_slave_get_priv(struct net_device *dev)
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000040{
Alexander Aring036562f2014-10-25 17:16:36 +020041 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000042
43 BUG_ON(dev->type != ARPHRD_IEEE802154);
44
Alexander Aring036562f2014-10-25 17:16:36 +020045 return sdata->hw;
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000046}
47
48static void hw_addr_notify(struct work_struct *work)
49{
50 struct hw_addr_filt_notify_work *nw = container_of(work,
51 struct hw_addr_filt_notify_work, work);
Alexander Aringa5e1ec52014-10-25 17:16:35 +020052 struct ieee802154_local *local = mac802154_slave_get_priv(nw->dev);
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000053 int res;
54
Alexander Aringa5e1ec52014-10-25 17:16:35 +020055 res = local->ops->set_hw_addr_filt(&local->hw, &local->hw.hw_filt,
56 nw->changed);
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000057 if (res)
58 pr_debug("failed changed mask %lx\n", nw->changed);
59
60 kfree(nw);
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000061}
62
63static void set_hw_addr_filt(struct net_device *dev, unsigned long changed)
64{
Alexander Aring036562f2014-10-25 17:16:36 +020065 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000066 struct hw_addr_filt_notify_work *work;
67
68 work = kzalloc(sizeof(*work), GFP_ATOMIC);
69 if (!work)
70 return;
71
72 INIT_WORK(&work->work, hw_addr_notify);
73 work->dev = dev;
74 work->changed = changed;
Alexander Aring036562f2014-10-25 17:16:36 +020075 queue_work(sdata->hw->dev_workqueue, &work->work);
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +000076}
77
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +010078void mac802154_dev_set_short_addr(struct net_device *dev, __le16 val)
alex.bluesman.smirnov@gmail.com48e44d52012-06-25 23:24:50 +000079{
Alexander Aring036562f2014-10-25 17:16:36 +020080 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
alex.bluesman.smirnov@gmail.com48e44d52012-06-25 23:24:50 +000081
82 BUG_ON(dev->type != ARPHRD_IEEE802154);
83
Alexander Aring036562f2014-10-25 17:16:36 +020084 spin_lock_bh(&sdata->mib_lock);
85 sdata->short_addr = val;
86 spin_unlock_bh(&sdata->mib_lock);
alex.bluesman.smirnov@gmail.com48e44d52012-06-25 23:24:50 +000087
Alexander Aring036562f2014-10-25 17:16:36 +020088 if ((sdata->hw->ops->set_hw_addr_filt) &&
89 (sdata->hw->hw.hw_filt.short_addr != sdata->short_addr)) {
90 sdata->hw->hw.hw_filt.short_addr = sdata->short_addr;
Alexander Aring57205c12014-10-25 05:25:09 +020091 set_hw_addr_filt(dev, IEEE802154_AFILT_SADDR_CHANGED);
alex.bluesman.smirnov@gmail.com48e44d52012-06-25 23:24:50 +000092 }
93}
94
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +010095__le16 mac802154_dev_get_short_addr(const struct net_device *dev)
alex.bluesman.smirnov@gmail.come885a472012-07-10 21:22:44 +000096{
Alexander Aring036562f2014-10-25 17:16:36 +020097 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +010098 __le16 ret;
alex.bluesman.smirnov@gmail.come885a472012-07-10 21:22:44 +000099
100 BUG_ON(dev->type != ARPHRD_IEEE802154);
101
Alexander Aring036562f2014-10-25 17:16:36 +0200102 spin_lock_bh(&sdata->mib_lock);
103 ret = sdata->short_addr;
104 spin_unlock_bh(&sdata->mib_lock);
alex.bluesman.smirnov@gmail.come885a472012-07-10 21:22:44 +0000105
106 return ret;
107}
108
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +0000109void mac802154_dev_set_ieee_addr(struct net_device *dev)
110{
Alexander Aring036562f2014-10-25 17:16:36 +0200111 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
112 struct ieee802154_local *local = sdata->hw;
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +0000113
Alexander Aring036562f2014-10-25 17:16:36 +0200114 sdata->extended_addr = ieee802154_devaddr_from_raw(dev->dev_addr);
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100115
Alexander Aringa5e1ec52014-10-25 17:16:35 +0200116 if (local->ops->set_hw_addr_filt &&
Alexander Aring036562f2014-10-25 17:16:36 +0200117 local->hw.hw_filt.ieee_addr != sdata->extended_addr) {
118 local->hw.hw_filt.ieee_addr = sdata->extended_addr;
Alexander Aring57205c12014-10-25 05:25:09 +0200119 set_hw_addr_filt(dev, IEEE802154_AFILT_IEEEADDR_CHANGED);
alex.bluesman.smirnov@gmail.comef2486f2012-05-15 20:50:26 +0000120 }
121}
alex.bluesman.smirnov@gmail.comdcbe4f92012-06-25 23:24:49 +0000122
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100123__le16 mac802154_dev_get_pan_id(const struct net_device *dev)
alex.bluesman.smirnov@gmail.comdcbe4f92012-06-25 23:24:49 +0000124{
Alexander Aring036562f2014-10-25 17:16:36 +0200125 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100126 __le16 ret;
alex.bluesman.smirnov@gmail.comdcbe4f92012-06-25 23:24:49 +0000127
128 BUG_ON(dev->type != ARPHRD_IEEE802154);
129
Alexander Aring036562f2014-10-25 17:16:36 +0200130 spin_lock_bh(&sdata->mib_lock);
131 ret = sdata->pan_id;
132 spin_unlock_bh(&sdata->mib_lock);
alex.bluesman.smirnov@gmail.comdcbe4f92012-06-25 23:24:49 +0000133
134 return ret;
135}
136
Phoebe Buckheisterb70ab2e2014-03-14 21:23:59 +0100137void mac802154_dev_set_pan_id(struct net_device *dev, __le16 val)
alex.bluesman.smirnov@gmail.comdcbe4f92012-06-25 23:24:49 +0000138{
Alexander Aring036562f2014-10-25 17:16:36 +0200139 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
alex.bluesman.smirnov@gmail.comdcbe4f92012-06-25 23:24:49 +0000140
141 BUG_ON(dev->type != ARPHRD_IEEE802154);
142
Alexander Aring036562f2014-10-25 17:16:36 +0200143 spin_lock_bh(&sdata->mib_lock);
144 sdata->pan_id = val;
145 spin_unlock_bh(&sdata->mib_lock);
alex.bluesman.smirnov@gmail.comdcbe4f92012-06-25 23:24:49 +0000146
Alexander Aring036562f2014-10-25 17:16:36 +0200147 if ((sdata->hw->ops->set_hw_addr_filt) &&
148 (sdata->hw->hw.hw_filt.pan_id != sdata->pan_id)) {
149 sdata->hw->hw.hw_filt.pan_id = sdata->pan_id;
Alexander Aring57205c12014-10-25 05:25:09 +0200150 set_hw_addr_filt(dev, IEEE802154_AFILT_PANID_CHANGED);
alex.bluesman.smirnov@gmail.comdcbe4f92012-06-25 23:24:49 +0000151 }
152}
alex.bluesman.smirnov@gmail.com66b69d42012-06-25 23:24:51 +0000153
Tony Cheneau04835462013-03-25 17:59:29 +0000154u8 mac802154_dev_get_dsn(const struct net_device *dev)
155{
Alexander Aring036562f2014-10-25 17:16:36 +0200156 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Tony Cheneau04835462013-03-25 17:59:29 +0000157
158 BUG_ON(dev->type != ARPHRD_IEEE802154);
159
Alexander Aring036562f2014-10-25 17:16:36 +0200160 return sdata->dsn++;
Tony Cheneau04835462013-03-25 17:59:29 +0000161}
162
alex.bluesman.smirnov@gmail.com66b69d42012-06-25 23:24:51 +0000163static void phy_chan_notify(struct work_struct *work)
164{
165 struct phy_chan_notify_work *nw = container_of(work,
166 struct phy_chan_notify_work, work);
Alexander Aringa5e1ec52014-10-25 17:16:35 +0200167 struct ieee802154_local *local = mac802154_slave_get_priv(nw->dev);
Alexander Aring036562f2014-10-25 17:16:36 +0200168 struct ieee802154_sub_if_data *sdata = netdev_priv(nw->dev);
alex.bluesman.smirnov@gmail.com66b69d42012-06-25 23:24:51 +0000169 int res;
170
Alexander Aring036562f2014-10-25 17:16:36 +0200171 mutex_lock(&sdata->hw->phy->pib_lock);
172 res = local->ops->set_channel(&local->hw, sdata->page, sdata->chan);
Varka Bhadram4710d802014-07-02 09:01:09 +0530173 if (res) {
alex.bluesman.smirnov@gmail.com66b69d42012-06-25 23:24:51 +0000174 pr_debug("set_channel failed\n");
Varka Bhadram4710d802014-07-02 09:01:09 +0530175 } else {
Alexander Aring036562f2014-10-25 17:16:36 +0200176 sdata->hw->phy->current_channel = sdata->chan;
177 sdata->hw->phy->current_page = sdata->page;
Alan Ott9f7f78b2013-04-05 13:03:10 +0000178 }
Alexander Aring036562f2014-10-25 17:16:36 +0200179 mutex_unlock(&sdata->hw->phy->pib_lock);
alex.bluesman.smirnov@gmail.com66b69d42012-06-25 23:24:51 +0000180
181 kfree(nw);
182}
183
184void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan)
185{
Alexander Aring036562f2014-10-25 17:16:36 +0200186 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
alex.bluesman.smirnov@gmail.com66b69d42012-06-25 23:24:51 +0000187 struct phy_chan_notify_work *work;
188
189 BUG_ON(dev->type != ARPHRD_IEEE802154);
190
Alexander Aring036562f2014-10-25 17:16:36 +0200191 spin_lock_bh(&sdata->mib_lock);
192 sdata->page = page;
193 sdata->chan = chan;
194 spin_unlock_bh(&sdata->mib_lock);
alex.bluesman.smirnov@gmail.com66b69d42012-06-25 23:24:51 +0000195
Alexander Aring036562f2014-10-25 17:16:36 +0200196 mutex_lock(&sdata->hw->phy->pib_lock);
197 if (sdata->hw->phy->current_channel != sdata->chan ||
198 sdata->hw->phy->current_page != sdata->page) {
199 mutex_unlock(&sdata->hw->phy->pib_lock);
Alan Ott9f7f78b2013-04-05 13:03:10 +0000200
alex.bluesman.smirnov@gmail.com66b69d42012-06-25 23:24:51 +0000201 work = kzalloc(sizeof(*work), GFP_ATOMIC);
202 if (!work)
203 return;
204
205 INIT_WORK(&work->work, phy_chan_notify);
206 work->dev = dev;
Alexander Aring036562f2014-10-25 17:16:36 +0200207 queue_work(sdata->hw->dev_workqueue, &work->work);
Varka Bhadram4710d802014-07-02 09:01:09 +0530208 } else {
Alexander Aring036562f2014-10-25 17:16:36 +0200209 mutex_unlock(&sdata->hw->phy->pib_lock);
Varka Bhadram4710d802014-07-02 09:01:09 +0530210 }
alex.bluesman.smirnov@gmail.com66b69d42012-06-25 23:24:51 +0000211}
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200212
213
214int mac802154_get_params(struct net_device *dev,
215 struct ieee802154_llsec_params *params)
216{
Alexander Aring036562f2014-10-25 17:16:36 +0200217 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200218 int res;
219
220 BUG_ON(dev->type != ARPHRD_IEEE802154);
221
Alexander Aring036562f2014-10-25 17:16:36 +0200222 mutex_lock(&sdata->sec_mtx);
223 res = mac802154_llsec_get_params(&sdata->sec, params);
224 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200225
226 return res;
227}
228
229int mac802154_set_params(struct net_device *dev,
230 const struct ieee802154_llsec_params *params,
231 int changed)
232{
Alexander Aring036562f2014-10-25 17:16:36 +0200233 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200234 int res;
235
236 BUG_ON(dev->type != ARPHRD_IEEE802154);
237
Alexander Aring036562f2014-10-25 17:16:36 +0200238 mutex_lock(&sdata->sec_mtx);
239 res = mac802154_llsec_set_params(&sdata->sec, params, changed);
240 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200241
242 return res;
243}
244
245
246int mac802154_add_key(struct net_device *dev,
247 const struct ieee802154_llsec_key_id *id,
248 const struct ieee802154_llsec_key *key)
249{
Alexander Aring036562f2014-10-25 17:16:36 +0200250 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200251 int res;
252
253 BUG_ON(dev->type != ARPHRD_IEEE802154);
254
Alexander Aring036562f2014-10-25 17:16:36 +0200255 mutex_lock(&sdata->sec_mtx);
256 res = mac802154_llsec_key_add(&sdata->sec, id, key);
257 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200258
259 return res;
260}
261
262int mac802154_del_key(struct net_device *dev,
263 const struct ieee802154_llsec_key_id *id)
264{
Alexander Aring036562f2014-10-25 17:16:36 +0200265 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200266 int res;
267
268 BUG_ON(dev->type != ARPHRD_IEEE802154);
269
Alexander Aring036562f2014-10-25 17:16:36 +0200270 mutex_lock(&sdata->sec_mtx);
271 res = mac802154_llsec_key_del(&sdata->sec, id);
272 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200273
274 return res;
275}
276
277
278int mac802154_add_dev(struct net_device *dev,
279 const struct ieee802154_llsec_device *llsec_dev)
280{
Alexander Aring036562f2014-10-25 17:16:36 +0200281 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200282 int res;
283
284 BUG_ON(dev->type != ARPHRD_IEEE802154);
285
Alexander Aring036562f2014-10-25 17:16:36 +0200286 mutex_lock(&sdata->sec_mtx);
287 res = mac802154_llsec_dev_add(&sdata->sec, llsec_dev);
288 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200289
290 return res;
291}
292
293int mac802154_del_dev(struct net_device *dev, __le64 dev_addr)
294{
Alexander Aring036562f2014-10-25 17:16:36 +0200295 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200296 int res;
297
298 BUG_ON(dev->type != ARPHRD_IEEE802154);
299
Alexander Aring036562f2014-10-25 17:16:36 +0200300 mutex_lock(&sdata->sec_mtx);
301 res = mac802154_llsec_dev_del(&sdata->sec, dev_addr);
302 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200303
304 return res;
305}
306
307
308int mac802154_add_devkey(struct net_device *dev,
309 __le64 device_addr,
310 const struct ieee802154_llsec_device_key *key)
311{
Alexander Aring036562f2014-10-25 17:16:36 +0200312 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200313 int res;
314
315 BUG_ON(dev->type != ARPHRD_IEEE802154);
316
Alexander Aring036562f2014-10-25 17:16:36 +0200317 mutex_lock(&sdata->sec_mtx);
318 res = mac802154_llsec_devkey_add(&sdata->sec, device_addr, key);
319 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200320
321 return res;
322}
323
324int mac802154_del_devkey(struct net_device *dev,
325 __le64 device_addr,
326 const struct ieee802154_llsec_device_key *key)
327{
Alexander Aring036562f2014-10-25 17:16:36 +0200328 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200329 int res;
330
331 BUG_ON(dev->type != ARPHRD_IEEE802154);
332
Alexander Aring036562f2014-10-25 17:16:36 +0200333 mutex_lock(&sdata->sec_mtx);
334 res = mac802154_llsec_devkey_del(&sdata->sec, device_addr, key);
335 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200336
337 return res;
338}
339
340
341int mac802154_add_seclevel(struct net_device *dev,
342 const struct ieee802154_llsec_seclevel *sl)
343{
Alexander Aring036562f2014-10-25 17:16:36 +0200344 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200345 int res;
346
347 BUG_ON(dev->type != ARPHRD_IEEE802154);
348
Alexander Aring036562f2014-10-25 17:16:36 +0200349 mutex_lock(&sdata->sec_mtx);
350 res = mac802154_llsec_seclevel_add(&sdata->sec, sl);
351 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200352
353 return res;
354}
355
356int mac802154_del_seclevel(struct net_device *dev,
357 const struct ieee802154_llsec_seclevel *sl)
358{
Alexander Aring036562f2014-10-25 17:16:36 +0200359 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200360 int res;
361
362 BUG_ON(dev->type != ARPHRD_IEEE802154);
363
Alexander Aring036562f2014-10-25 17:16:36 +0200364 mutex_lock(&sdata->sec_mtx);
365 res = mac802154_llsec_seclevel_del(&sdata->sec, sl);
366 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200367
368 return res;
369}
370
371
372void mac802154_lock_table(struct net_device *dev)
373{
Alexander Aring036562f2014-10-25 17:16:36 +0200374 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200375
376 BUG_ON(dev->type != ARPHRD_IEEE802154);
377
Alexander Aring036562f2014-10-25 17:16:36 +0200378 mutex_lock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200379}
380
381void mac802154_get_table(struct net_device *dev,
382 struct ieee802154_llsec_table **t)
383{
Alexander Aring036562f2014-10-25 17:16:36 +0200384 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200385
386 BUG_ON(dev->type != ARPHRD_IEEE802154);
387
Alexander Aring036562f2014-10-25 17:16:36 +0200388 *t = &sdata->sec.table;
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200389}
390
391void mac802154_unlock_table(struct net_device *dev)
392{
Alexander Aring036562f2014-10-25 17:16:36 +0200393 struct ieee802154_sub_if_data *sdata = netdev_priv(dev);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200394
395 BUG_ON(dev->type != ARPHRD_IEEE802154);
396
Alexander Aring036562f2014-10-25 17:16:36 +0200397 mutex_unlock(&sdata->sec_mtx);
Phoebe Buckheister29e02372014-05-16 17:46:42 +0200398}