Bluetooth: Cancel the Sniff timer
[platform/kernel/linux-starfive.git] / drivers / net / ieee802154 / mac802154_hwsim.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * HWSIM IEEE 802.15.4 interface
4  *
5  * (C) 2018 Mojatau, Alexander Aring <aring@mojatau.com>
6  * Copyright 2007-2012 Siemens AG
7  *
8  * Based on fakelb, original Written by:
9  * Sergey Lapin <slapin@ossfans.org>
10  * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
11  * Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
12  */
13
14 #include <linux/module.h>
15 #include <linux/timer.h>
16 #include <linux/platform_device.h>
17 #include <linux/rtnetlink.h>
18 #include <linux/netdevice.h>
19 #include <linux/device.h>
20 #include <linux/spinlock.h>
21 #include <net/ieee802154_netdev.h>
22 #include <net/mac802154.h>
23 #include <net/cfg802154.h>
24 #include <net/genetlink.h>
25 #include "mac802154_hwsim.h"
26
27 MODULE_DESCRIPTION("Software simulator of IEEE 802.15.4 radio(s) for mac802154");
28 MODULE_LICENSE("GPL");
29
30 static LIST_HEAD(hwsim_phys);
31 static DEFINE_MUTEX(hwsim_phys_lock);
32
33 static struct platform_device *mac802154hwsim_dev;
34
35 /* MAC802154_HWSIM netlink family */
36 static struct genl_family hwsim_genl_family;
37
38 static int hwsim_radio_idx;
39
40 enum hwsim_multicast_groups {
41         HWSIM_MCGRP_CONFIG,
42 };
43
44 static const struct genl_multicast_group hwsim_mcgrps[] = {
45         [HWSIM_MCGRP_CONFIG] = { .name = "config", },
46 };
47
48 struct hwsim_pib {
49         u8 page;
50         u8 channel;
51         struct ieee802154_hw_addr_filt filt;
52         enum ieee802154_filtering_level filt_level;
53
54         struct rcu_head rcu;
55 };
56
57 struct hwsim_edge_info {
58         u8 lqi;
59
60         struct rcu_head rcu;
61 };
62
63 struct hwsim_edge {
64         struct hwsim_phy *endpoint;
65         struct hwsim_edge_info __rcu *info;
66
67         struct list_head list;
68         struct rcu_head rcu;
69 };
70
71 struct hwsim_phy {
72         struct ieee802154_hw *hw;
73         u32 idx;
74
75         struct hwsim_pib __rcu *pib;
76
77         bool suspended;
78         struct list_head edges;
79
80         struct list_head list;
81 };
82
83 static int hwsim_add_one(struct genl_info *info, struct device *dev,
84                          bool init);
85 static void hwsim_del(struct hwsim_phy *phy);
86
87 static int hwsim_hw_ed(struct ieee802154_hw *hw, u8 *level)
88 {
89         *level = 0xbe;
90
91         return 0;
92 }
93
94 static int hwsim_update_pib(struct ieee802154_hw *hw, u8 page, u8 channel,
95                             struct ieee802154_hw_addr_filt *filt,
96                             enum ieee802154_filtering_level filt_level)
97 {
98         struct hwsim_phy *phy = hw->priv;
99         struct hwsim_pib *pib, *pib_old;
100
101         pib = kzalloc(sizeof(*pib), GFP_ATOMIC);
102         if (!pib)
103                 return -ENOMEM;
104
105         pib_old = rtnl_dereference(phy->pib);
106
107         pib->page = page;
108         pib->channel = channel;
109         pib->filt.short_addr = filt->short_addr;
110         pib->filt.pan_id = filt->pan_id;
111         pib->filt.ieee_addr = filt->ieee_addr;
112         pib->filt.pan_coord = filt->pan_coord;
113         pib->filt_level = filt_level;
114
115         rcu_assign_pointer(phy->pib, pib);
116         kfree_rcu(pib_old, rcu);
117         return 0;
118 }
119
120 static int hwsim_hw_channel(struct ieee802154_hw *hw, u8 page, u8 channel)
121 {
122         struct hwsim_phy *phy = hw->priv;
123         struct hwsim_pib *pib;
124         int ret;
125
126         rcu_read_lock();
127         pib = rcu_dereference(phy->pib);
128         ret = hwsim_update_pib(hw, page, channel, &pib->filt, pib->filt_level);
129         rcu_read_unlock();
130
131         return ret;
132 }
133
134 static int hwsim_hw_addr_filt(struct ieee802154_hw *hw,
135                               struct ieee802154_hw_addr_filt *filt,
136                               unsigned long changed)
137 {
138         struct hwsim_phy *phy = hw->priv;
139         struct hwsim_pib *pib;
140         int ret;
141
142         rcu_read_lock();
143         pib = rcu_dereference(phy->pib);
144         ret = hwsim_update_pib(hw, pib->page, pib->channel, filt, pib->filt_level);
145         rcu_read_unlock();
146
147         return ret;
148 }
149
150 static void hwsim_hw_receive(struct ieee802154_hw *hw, struct sk_buff *skb,
151                              u8 lqi)
152 {
153         struct ieee802154_hdr hdr;
154         struct hwsim_phy *phy = hw->priv;
155         struct hwsim_pib *pib;
156
157         rcu_read_lock();
158         pib = rcu_dereference(phy->pib);
159
160         if (!pskb_may_pull(skb, 3)) {
161                 dev_dbg(hw->parent, "invalid frame\n");
162                 goto drop;
163         }
164
165         memcpy(&hdr, skb->data, 3);
166
167         /* Level 4 filtering: Frame fields validity */
168         if (pib->filt_level == IEEE802154_FILTERING_4_FRAME_FIELDS) {
169                 /* a) Drop reserved frame types */
170                 switch (mac_cb(skb)->type) {
171                 case IEEE802154_FC_TYPE_BEACON:
172                 case IEEE802154_FC_TYPE_DATA:
173                 case IEEE802154_FC_TYPE_ACK:
174                 case IEEE802154_FC_TYPE_MAC_CMD:
175                         break;
176                 default:
177                         dev_dbg(hw->parent, "unrecognized frame type 0x%x\n",
178                                 mac_cb(skb)->type);
179                         goto drop;
180                 }
181
182                 /* b) Drop reserved frame versions */
183                 switch (hdr.fc.version) {
184                 case IEEE802154_2003_STD:
185                 case IEEE802154_2006_STD:
186                 case IEEE802154_STD:
187                         break;
188                 default:
189                         dev_dbg(hw->parent,
190                                 "unrecognized frame version 0x%x\n",
191                                 hdr.fc.version);
192                         goto drop;
193                 }
194
195                 /* c) PAN ID constraints */
196                 if ((mac_cb(skb)->dest.mode == IEEE802154_ADDR_LONG ||
197                      mac_cb(skb)->dest.mode == IEEE802154_ADDR_SHORT) &&
198                     mac_cb(skb)->dest.pan_id != pib->filt.pan_id &&
199                     mac_cb(skb)->dest.pan_id != cpu_to_le16(IEEE802154_PANID_BROADCAST)) {
200                         dev_dbg(hw->parent,
201                                 "unrecognized PAN ID %04x\n",
202                                 le16_to_cpu(mac_cb(skb)->dest.pan_id));
203                         goto drop;
204                 }
205
206                 /* d1) Short address constraints */
207                 if (mac_cb(skb)->dest.mode == IEEE802154_ADDR_SHORT &&
208                     mac_cb(skb)->dest.short_addr != pib->filt.short_addr &&
209                     mac_cb(skb)->dest.short_addr != cpu_to_le16(IEEE802154_ADDR_BROADCAST)) {
210                         dev_dbg(hw->parent,
211                                 "unrecognized short address %04x\n",
212                                 le16_to_cpu(mac_cb(skb)->dest.short_addr));
213                         goto drop;
214                 }
215
216                 /* d2) Extended address constraints */
217                 if (mac_cb(skb)->dest.mode == IEEE802154_ADDR_LONG &&
218                     mac_cb(skb)->dest.extended_addr != pib->filt.ieee_addr) {
219                         dev_dbg(hw->parent,
220                                 "unrecognized long address 0x%016llx\n",
221                                 mac_cb(skb)->dest.extended_addr);
222                         goto drop;
223                 }
224
225                 /* d4) Specific PAN coordinator case (no parent) */
226                 if ((mac_cb(skb)->type == IEEE802154_FC_TYPE_DATA ||
227                      mac_cb(skb)->type == IEEE802154_FC_TYPE_MAC_CMD) &&
228                     mac_cb(skb)->dest.mode == IEEE802154_ADDR_NONE) {
229                         dev_dbg(hw->parent,
230                                 "relaying is not supported\n");
231                         goto drop;
232                 }
233
234                 /* e) Beacon frames follow specific PAN ID rules */
235                 if (mac_cb(skb)->type == IEEE802154_FC_TYPE_BEACON &&
236                     pib->filt.pan_id != cpu_to_le16(IEEE802154_PANID_BROADCAST) &&
237                     mac_cb(skb)->dest.pan_id != pib->filt.pan_id) {
238                         dev_dbg(hw->parent,
239                                 "invalid beacon PAN ID %04x\n",
240                                 le16_to_cpu(mac_cb(skb)->dest.pan_id));
241                         goto drop;
242                 }
243         }
244
245         rcu_read_unlock();
246
247         ieee802154_rx_irqsafe(hw, skb, lqi);
248
249         return;
250
251 drop:
252         rcu_read_unlock();
253         kfree_skb(skb);
254 }
255
256 static int hwsim_hw_xmit(struct ieee802154_hw *hw, struct sk_buff *skb)
257 {
258         struct hwsim_phy *current_phy = hw->priv;
259         struct hwsim_pib *current_pib, *endpoint_pib;
260         struct hwsim_edge_info *einfo;
261         struct hwsim_edge *e;
262
263         WARN_ON(current_phy->suspended);
264
265         rcu_read_lock();
266         current_pib = rcu_dereference(current_phy->pib);
267         list_for_each_entry_rcu(e, &current_phy->edges, list) {
268                 /* Can be changed later in rx_irqsafe, but this is only a
269                  * performance tweak. Received radio should drop the frame
270                  * in mac802154 stack anyway... so we don't need to be
271                  * 100% of locking here to check on suspended
272                  */
273                 if (e->endpoint->suspended)
274                         continue;
275
276                 endpoint_pib = rcu_dereference(e->endpoint->pib);
277                 if (current_pib->page == endpoint_pib->page &&
278                     current_pib->channel == endpoint_pib->channel) {
279                         struct sk_buff *newskb = pskb_copy(skb, GFP_ATOMIC);
280
281                         einfo = rcu_dereference(e->info);
282                         if (newskb)
283                                 hwsim_hw_receive(e->endpoint->hw, newskb, einfo->lqi);
284                 }
285         }
286         rcu_read_unlock();
287
288         ieee802154_xmit_complete(hw, skb, false);
289         return 0;
290 }
291
292 static int hwsim_hw_start(struct ieee802154_hw *hw)
293 {
294         struct hwsim_phy *phy = hw->priv;
295
296         phy->suspended = false;
297
298         return 0;
299 }
300
301 static void hwsim_hw_stop(struct ieee802154_hw *hw)
302 {
303         struct hwsim_phy *phy = hw->priv;
304
305         phy->suspended = true;
306 }
307
308 static int
309 hwsim_set_promiscuous_mode(struct ieee802154_hw *hw, const bool on)
310 {
311         enum ieee802154_filtering_level filt_level;
312         struct hwsim_phy *phy = hw->priv;
313         struct hwsim_pib *pib;
314         int ret;
315
316         if (on)
317                 filt_level = IEEE802154_FILTERING_NONE;
318         else
319                 filt_level = IEEE802154_FILTERING_4_FRAME_FIELDS;
320
321         rcu_read_lock();
322         pib = rcu_dereference(phy->pib);
323         ret = hwsim_update_pib(hw, pib->page, pib->channel, &pib->filt, filt_level);
324         rcu_read_unlock();
325
326         return ret;
327 }
328
329 static const struct ieee802154_ops hwsim_ops = {
330         .owner = THIS_MODULE,
331         .xmit_async = hwsim_hw_xmit,
332         .ed = hwsim_hw_ed,
333         .set_channel = hwsim_hw_channel,
334         .start = hwsim_hw_start,
335         .stop = hwsim_hw_stop,
336         .set_promiscuous_mode = hwsim_set_promiscuous_mode,
337         .set_hw_addr_filt = hwsim_hw_addr_filt,
338 };
339
340 static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info)
341 {
342         return hwsim_add_one(info, &mac802154hwsim_dev->dev, false);
343 }
344
345 static int hwsim_del_radio_nl(struct sk_buff *msg, struct genl_info *info)
346 {
347         struct hwsim_phy *phy, *tmp;
348         s64 idx = -1;
349
350         if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID])
351                 return -EINVAL;
352
353         idx = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]);
354
355         mutex_lock(&hwsim_phys_lock);
356         list_for_each_entry_safe(phy, tmp, &hwsim_phys, list) {
357                 if (idx == phy->idx) {
358                         hwsim_del(phy);
359                         mutex_unlock(&hwsim_phys_lock);
360                         return 0;
361                 }
362         }
363         mutex_unlock(&hwsim_phys_lock);
364
365         return -ENODEV;
366 }
367
368 static int append_radio_msg(struct sk_buff *skb, struct hwsim_phy *phy)
369 {
370         struct nlattr *nl_edges, *nl_edge;
371         struct hwsim_edge_info *einfo;
372         struct hwsim_edge *e;
373         int ret;
374
375         ret = nla_put_u32(skb, MAC802154_HWSIM_ATTR_RADIO_ID, phy->idx);
376         if (ret < 0)
377                 return ret;
378
379         rcu_read_lock();
380         if (list_empty(&phy->edges)) {
381                 rcu_read_unlock();
382                 return 0;
383         }
384
385         nl_edges = nla_nest_start_noflag(skb,
386                                          MAC802154_HWSIM_ATTR_RADIO_EDGES);
387         if (!nl_edges) {
388                 rcu_read_unlock();
389                 return -ENOBUFS;
390         }
391
392         list_for_each_entry_rcu(e, &phy->edges, list) {
393                 nl_edge = nla_nest_start_noflag(skb,
394                                                 MAC802154_HWSIM_ATTR_RADIO_EDGE);
395                 if (!nl_edge) {
396                         rcu_read_unlock();
397                         nla_nest_cancel(skb, nl_edges);
398                         return -ENOBUFS;
399                 }
400
401                 ret = nla_put_u32(skb, MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID,
402                                   e->endpoint->idx);
403                 if (ret < 0) {
404                         rcu_read_unlock();
405                         nla_nest_cancel(skb, nl_edge);
406                         nla_nest_cancel(skb, nl_edges);
407                         return ret;
408                 }
409
410                 einfo = rcu_dereference(e->info);
411                 ret = nla_put_u8(skb, MAC802154_HWSIM_EDGE_ATTR_LQI,
412                                  einfo->lqi);
413                 if (ret < 0) {
414                         rcu_read_unlock();
415                         nla_nest_cancel(skb, nl_edge);
416                         nla_nest_cancel(skb, nl_edges);
417                         return ret;
418                 }
419
420                 nla_nest_end(skb, nl_edge);
421         }
422         rcu_read_unlock();
423
424         nla_nest_end(skb, nl_edges);
425
426         return 0;
427 }
428
429 static int hwsim_get_radio(struct sk_buff *skb, struct hwsim_phy *phy,
430                            u32 portid, u32 seq,
431                            struct netlink_callback *cb, int flags)
432 {
433         void *hdr;
434         int res;
435
436         hdr = genlmsg_put(skb, portid, seq, &hwsim_genl_family, flags,
437                           MAC802154_HWSIM_CMD_GET_RADIO);
438         if (!hdr)
439                 return -EMSGSIZE;
440
441         if (cb)
442                 genl_dump_check_consistent(cb, hdr);
443
444         res = append_radio_msg(skb, phy);
445         if (res < 0)
446                 goto out_err;
447
448         genlmsg_end(skb, hdr);
449         return 0;
450
451 out_err:
452         genlmsg_cancel(skb, hdr);
453         return res;
454 }
455
456 static int hwsim_get_radio_nl(struct sk_buff *msg, struct genl_info *info)
457 {
458         struct hwsim_phy *phy;
459         struct sk_buff *skb;
460         int idx, res = -ENODEV;
461
462         if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID])
463                 return -EINVAL;
464         idx = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]);
465
466         mutex_lock(&hwsim_phys_lock);
467         list_for_each_entry(phy, &hwsim_phys, list) {
468                 if (phy->idx != idx)
469                         continue;
470
471                 skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
472                 if (!skb) {
473                         res = -ENOMEM;
474                         goto out_err;
475                 }
476
477                 res = hwsim_get_radio(skb, phy, info->snd_portid,
478                                       info->snd_seq, NULL, 0);
479                 if (res < 0) {
480                         nlmsg_free(skb);
481                         goto out_err;
482                 }
483
484                 res = genlmsg_reply(skb, info);
485                 break;
486         }
487
488 out_err:
489         mutex_unlock(&hwsim_phys_lock);
490
491         return res;
492 }
493
494 static int hwsim_dump_radio_nl(struct sk_buff *skb,
495                                struct netlink_callback *cb)
496 {
497         int idx = cb->args[0];
498         struct hwsim_phy *phy;
499         int res;
500
501         mutex_lock(&hwsim_phys_lock);
502
503         if (idx == hwsim_radio_idx)
504                 goto done;
505
506         list_for_each_entry(phy, &hwsim_phys, list) {
507                 if (phy->idx < idx)
508                         continue;
509
510                 res = hwsim_get_radio(skb, phy, NETLINK_CB(cb->skb).portid,
511                                       cb->nlh->nlmsg_seq, cb, NLM_F_MULTI);
512                 if (res < 0)
513                         break;
514
515                 idx = phy->idx + 1;
516         }
517
518         cb->args[0] = idx;
519
520 done:
521         mutex_unlock(&hwsim_phys_lock);
522         return skb->len;
523 }
524
525 /* caller need to held hwsim_phys_lock */
526 static struct hwsim_phy *hwsim_get_radio_by_id(uint32_t idx)
527 {
528         struct hwsim_phy *phy;
529
530         list_for_each_entry(phy, &hwsim_phys, list) {
531                 if (phy->idx == idx)
532                         return phy;
533         }
534
535         return NULL;
536 }
537
538 static const struct nla_policy hwsim_edge_policy[MAC802154_HWSIM_EDGE_ATTR_MAX + 1] = {
539         [MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID] = { .type = NLA_U32 },
540         [MAC802154_HWSIM_EDGE_ATTR_LQI] = { .type = NLA_U8 },
541 };
542
543 static struct hwsim_edge *hwsim_alloc_edge(struct hwsim_phy *endpoint, u8 lqi)
544 {
545         struct hwsim_edge_info *einfo;
546         struct hwsim_edge *e;
547
548         e = kzalloc(sizeof(*e), GFP_KERNEL);
549         if (!e)
550                 return NULL;
551
552         einfo = kzalloc(sizeof(*einfo), GFP_KERNEL);
553         if (!einfo) {
554                 kfree(e);
555                 return NULL;
556         }
557
558         einfo->lqi = 0xff;
559         rcu_assign_pointer(e->info, einfo);
560         e->endpoint = endpoint;
561
562         return e;
563 }
564
565 static void hwsim_free_edge(struct hwsim_edge *e)
566 {
567         struct hwsim_edge_info *einfo;
568
569         rcu_read_lock();
570         einfo = rcu_dereference(e->info);
571         rcu_read_unlock();
572
573         kfree_rcu(einfo, rcu);
574         kfree_rcu(e, rcu);
575 }
576
577 static int hwsim_new_edge_nl(struct sk_buff *msg, struct genl_info *info)
578 {
579         struct nlattr *edge_attrs[MAC802154_HWSIM_EDGE_ATTR_MAX + 1];
580         struct hwsim_phy *phy_v0, *phy_v1;
581         struct hwsim_edge *e;
582         u32 v0, v1;
583
584         if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] ||
585             !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
586                 return -EINVAL;
587
588         if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], hwsim_edge_policy, NULL))
589                 return -EINVAL;
590
591         if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID])
592                 return -EINVAL;
593
594         v0 = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]);
595         v1 = nla_get_u32(edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID]);
596
597         if (v0 == v1)
598                 return -EINVAL;
599
600         mutex_lock(&hwsim_phys_lock);
601         phy_v0 = hwsim_get_radio_by_id(v0);
602         if (!phy_v0) {
603                 mutex_unlock(&hwsim_phys_lock);
604                 return -ENOENT;
605         }
606
607         phy_v1 = hwsim_get_radio_by_id(v1);
608         if (!phy_v1) {
609                 mutex_unlock(&hwsim_phys_lock);
610                 return -ENOENT;
611         }
612
613         rcu_read_lock();
614         list_for_each_entry_rcu(e, &phy_v0->edges, list) {
615                 if (e->endpoint->idx == v1) {
616                         mutex_unlock(&hwsim_phys_lock);
617                         rcu_read_unlock();
618                         return -EEXIST;
619                 }
620         }
621         rcu_read_unlock();
622
623         e = hwsim_alloc_edge(phy_v1, 0xff);
624         if (!e) {
625                 mutex_unlock(&hwsim_phys_lock);
626                 return -ENOMEM;
627         }
628         list_add_rcu(&e->list, &phy_v0->edges);
629         /* wait until changes are done under hwsim_phys_lock lock
630          * should prevent of calling this function twice while
631          * edges list has not the changes yet.
632          */
633         synchronize_rcu();
634         mutex_unlock(&hwsim_phys_lock);
635
636         return 0;
637 }
638
639 static int hwsim_del_edge_nl(struct sk_buff *msg, struct genl_info *info)
640 {
641         struct nlattr *edge_attrs[MAC802154_HWSIM_EDGE_ATTR_MAX + 1];
642         struct hwsim_phy *phy_v0;
643         struct hwsim_edge *e;
644         u32 v0, v1;
645
646         if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] ||
647             !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
648                 return -EINVAL;
649
650         if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], hwsim_edge_policy, NULL))
651                 return -EINVAL;
652
653         if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID])
654                 return -EINVAL;
655
656         v0 = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]);
657         v1 = nla_get_u32(edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID]);
658
659         mutex_lock(&hwsim_phys_lock);
660         phy_v0 = hwsim_get_radio_by_id(v0);
661         if (!phy_v0) {
662                 mutex_unlock(&hwsim_phys_lock);
663                 return -ENOENT;
664         }
665
666         rcu_read_lock();
667         list_for_each_entry_rcu(e, &phy_v0->edges, list) {
668                 if (e->endpoint->idx == v1) {
669                         rcu_read_unlock();
670                         list_del_rcu(&e->list);
671                         hwsim_free_edge(e);
672                         /* same again - wait until list changes are done */
673                         synchronize_rcu();
674                         mutex_unlock(&hwsim_phys_lock);
675                         return 0;
676                 }
677         }
678         rcu_read_unlock();
679
680         mutex_unlock(&hwsim_phys_lock);
681
682         return -ENOENT;
683 }
684
685 static int hwsim_set_edge_lqi(struct sk_buff *msg, struct genl_info *info)
686 {
687         struct nlattr *edge_attrs[MAC802154_HWSIM_EDGE_ATTR_MAX + 1];
688         struct hwsim_edge_info *einfo, *einfo_old;
689         struct hwsim_phy *phy_v0;
690         struct hwsim_edge *e;
691         u32 v0, v1;
692         u8 lqi;
693
694         if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] ||
695             !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
696                 return -EINVAL;
697
698         if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], hwsim_edge_policy, NULL))
699                 return -EINVAL;
700
701         if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID] ||
702             !edge_attrs[MAC802154_HWSIM_EDGE_ATTR_LQI])
703                 return -EINVAL;
704
705         v0 = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]);
706         v1 = nla_get_u32(edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID]);
707         lqi = nla_get_u8(edge_attrs[MAC802154_HWSIM_EDGE_ATTR_LQI]);
708
709         mutex_lock(&hwsim_phys_lock);
710         phy_v0 = hwsim_get_radio_by_id(v0);
711         if (!phy_v0) {
712                 mutex_unlock(&hwsim_phys_lock);
713                 return -ENOENT;
714         }
715
716         einfo = kzalloc(sizeof(*einfo), GFP_KERNEL);
717         if (!einfo) {
718                 mutex_unlock(&hwsim_phys_lock);
719                 return -ENOMEM;
720         }
721
722         rcu_read_lock();
723         list_for_each_entry_rcu(e, &phy_v0->edges, list) {
724                 if (e->endpoint->idx == v1) {
725                         einfo->lqi = lqi;
726                         einfo_old = rcu_replace_pointer(e->info, einfo,
727                                                         lockdep_is_held(&hwsim_phys_lock));
728                         rcu_read_unlock();
729                         kfree_rcu(einfo_old, rcu);
730                         mutex_unlock(&hwsim_phys_lock);
731                         return 0;
732                 }
733         }
734         rcu_read_unlock();
735
736         kfree(einfo);
737         mutex_unlock(&hwsim_phys_lock);
738
739         return -ENOENT;
740 }
741
742 /* MAC802154_HWSIM netlink policy */
743
744 static const struct nla_policy hwsim_genl_policy[MAC802154_HWSIM_ATTR_MAX + 1] = {
745         [MAC802154_HWSIM_ATTR_RADIO_ID] = { .type = NLA_U32 },
746         [MAC802154_HWSIM_ATTR_RADIO_EDGE] = { .type = NLA_NESTED },
747         [MAC802154_HWSIM_ATTR_RADIO_EDGES] = { .type = NLA_NESTED },
748 };
749
750 /* Generic Netlink operations array */
751 static const struct genl_small_ops hwsim_nl_ops[] = {
752         {
753                 .cmd = MAC802154_HWSIM_CMD_NEW_RADIO,
754                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
755                 .doit = hwsim_new_radio_nl,
756                 .flags = GENL_UNS_ADMIN_PERM,
757         },
758         {
759                 .cmd = MAC802154_HWSIM_CMD_DEL_RADIO,
760                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
761                 .doit = hwsim_del_radio_nl,
762                 .flags = GENL_UNS_ADMIN_PERM,
763         },
764         {
765                 .cmd = MAC802154_HWSIM_CMD_GET_RADIO,
766                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
767                 .doit = hwsim_get_radio_nl,
768                 .dumpit = hwsim_dump_radio_nl,
769         },
770         {
771                 .cmd = MAC802154_HWSIM_CMD_NEW_EDGE,
772                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
773                 .doit = hwsim_new_edge_nl,
774                 .flags = GENL_UNS_ADMIN_PERM,
775         },
776         {
777                 .cmd = MAC802154_HWSIM_CMD_DEL_EDGE,
778                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
779                 .doit = hwsim_del_edge_nl,
780                 .flags = GENL_UNS_ADMIN_PERM,
781         },
782         {
783                 .cmd = MAC802154_HWSIM_CMD_SET_EDGE,
784                 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
785                 .doit = hwsim_set_edge_lqi,
786                 .flags = GENL_UNS_ADMIN_PERM,
787         },
788 };
789
790 static struct genl_family hwsim_genl_family __ro_after_init = {
791         .name = "MAC802154_HWSIM",
792         .version = 1,
793         .maxattr = MAC802154_HWSIM_ATTR_MAX,
794         .policy = hwsim_genl_policy,
795         .module = THIS_MODULE,
796         .small_ops = hwsim_nl_ops,
797         .n_small_ops = ARRAY_SIZE(hwsim_nl_ops),
798         .resv_start_op = MAC802154_HWSIM_CMD_NEW_EDGE + 1,
799         .mcgrps = hwsim_mcgrps,
800         .n_mcgrps = ARRAY_SIZE(hwsim_mcgrps),
801 };
802
803 static void hwsim_mcast_config_msg(struct sk_buff *mcast_skb,
804                                    struct genl_info *info)
805 {
806         if (info)
807                 genl_notify(&hwsim_genl_family, mcast_skb, info,
808                             HWSIM_MCGRP_CONFIG, GFP_KERNEL);
809         else
810                 genlmsg_multicast(&hwsim_genl_family, mcast_skb, 0,
811                                   HWSIM_MCGRP_CONFIG, GFP_KERNEL);
812 }
813
814 static void hwsim_mcast_new_radio(struct genl_info *info, struct hwsim_phy *phy)
815 {
816         struct sk_buff *mcast_skb;
817         void *data;
818
819         mcast_skb = genlmsg_new(GENLMSG_DEFAULT_SIZE, GFP_KERNEL);
820         if (!mcast_skb)
821                 return;
822
823         data = genlmsg_put(mcast_skb, 0, 0, &hwsim_genl_family, 0,
824                            MAC802154_HWSIM_CMD_NEW_RADIO);
825         if (!data)
826                 goto out_err;
827
828         if (append_radio_msg(mcast_skb, phy) < 0)
829                 goto out_err;
830
831         genlmsg_end(mcast_skb, data);
832
833         hwsim_mcast_config_msg(mcast_skb, info);
834         return;
835
836 out_err:
837         genlmsg_cancel(mcast_skb, data);
838         nlmsg_free(mcast_skb);
839 }
840
841 static void hwsim_edge_unsubscribe_me(struct hwsim_phy *phy)
842 {
843         struct hwsim_phy *tmp;
844         struct hwsim_edge *e;
845
846         rcu_read_lock();
847         /* going to all phy edges and remove phy from it */
848         list_for_each_entry(tmp, &hwsim_phys, list) {
849                 list_for_each_entry_rcu(e, &tmp->edges, list) {
850                         if (e->endpoint->idx == phy->idx) {
851                                 list_del_rcu(&e->list);
852                                 hwsim_free_edge(e);
853                         }
854                 }
855         }
856         rcu_read_unlock();
857
858         synchronize_rcu();
859 }
860
861 static int hwsim_subscribe_all_others(struct hwsim_phy *phy)
862 {
863         struct hwsim_phy *sub;
864         struct hwsim_edge *e;
865
866         list_for_each_entry(sub, &hwsim_phys, list) {
867                 e = hwsim_alloc_edge(sub, 0xff);
868                 if (!e)
869                         goto me_fail;
870
871                 list_add_rcu(&e->list, &phy->edges);
872         }
873
874         list_for_each_entry(sub, &hwsim_phys, list) {
875                 e = hwsim_alloc_edge(phy, 0xff);
876                 if (!e)
877                         goto sub_fail;
878
879                 list_add_rcu(&e->list, &sub->edges);
880         }
881
882         return 0;
883
884 sub_fail:
885         hwsim_edge_unsubscribe_me(phy);
886 me_fail:
887         rcu_read_lock();
888         list_for_each_entry_rcu(e, &phy->edges, list) {
889                 list_del_rcu(&e->list);
890                 hwsim_free_edge(e);
891         }
892         rcu_read_unlock();
893         return -ENOMEM;
894 }
895
896 static int hwsim_add_one(struct genl_info *info, struct device *dev,
897                          bool init)
898 {
899         struct ieee802154_hw *hw;
900         struct hwsim_phy *phy;
901         struct hwsim_pib *pib;
902         int idx;
903         int err;
904
905         idx = hwsim_radio_idx++;
906
907         hw = ieee802154_alloc_hw(sizeof(*phy), &hwsim_ops);
908         if (!hw)
909                 return -ENOMEM;
910
911         phy = hw->priv;
912         phy->hw = hw;
913
914         /* 868 MHz BPSK 802.15.4-2003 */
915         hw->phy->supported.channels[0] |= 1;
916         /* 915 MHz BPSK 802.15.4-2003 */
917         hw->phy->supported.channels[0] |= 0x7fe;
918         /* 2.4 GHz O-QPSK 802.15.4-2003 */
919         hw->phy->supported.channels[0] |= 0x7FFF800;
920         /* 868 MHz ASK 802.15.4-2006 */
921         hw->phy->supported.channels[1] |= 1;
922         /* 915 MHz ASK 802.15.4-2006 */
923         hw->phy->supported.channels[1] |= 0x7fe;
924         /* 868 MHz O-QPSK 802.15.4-2006 */
925         hw->phy->supported.channels[2] |= 1;
926         /* 915 MHz O-QPSK 802.15.4-2006 */
927         hw->phy->supported.channels[2] |= 0x7fe;
928         /* 2.4 GHz CSS 802.15.4a-2007 */
929         hw->phy->supported.channels[3] |= 0x3fff;
930         /* UWB Sub-gigahertz 802.15.4a-2007 */
931         hw->phy->supported.channels[4] |= 1;
932         /* UWB Low band 802.15.4a-2007 */
933         hw->phy->supported.channels[4] |= 0x1e;
934         /* UWB High band 802.15.4a-2007 */
935         hw->phy->supported.channels[4] |= 0xffe0;
936         /* 750 MHz O-QPSK 802.15.4c-2009 */
937         hw->phy->supported.channels[5] |= 0xf;
938         /* 750 MHz MPSK 802.15.4c-2009 */
939         hw->phy->supported.channels[5] |= 0xf0;
940         /* 950 MHz BPSK 802.15.4d-2009 */
941         hw->phy->supported.channels[6] |= 0x3ff;
942         /* 950 MHz GFSK 802.15.4d-2009 */
943         hw->phy->supported.channels[6] |= 0x3ffc00;
944
945         ieee802154_random_extended_addr(&hw->phy->perm_extended_addr);
946
947         /* hwsim phy channel 13 as default */
948         hw->phy->current_channel = 13;
949         pib = kzalloc(sizeof(*pib), GFP_KERNEL);
950         if (!pib) {
951                 err = -ENOMEM;
952                 goto err_pib;
953         }
954
955         pib->channel = 13;
956         pib->filt.short_addr = cpu_to_le16(IEEE802154_ADDR_BROADCAST);
957         pib->filt.pan_id = cpu_to_le16(IEEE802154_PANID_BROADCAST);
958         rcu_assign_pointer(phy->pib, pib);
959         phy->idx = idx;
960         INIT_LIST_HEAD(&phy->edges);
961
962         hw->flags = IEEE802154_HW_PROMISCUOUS;
963         hw->parent = dev;
964
965         err = ieee802154_register_hw(hw);
966         if (err)
967                 goto err_reg;
968
969         mutex_lock(&hwsim_phys_lock);
970         if (init) {
971                 err = hwsim_subscribe_all_others(phy);
972                 if (err < 0) {
973                         mutex_unlock(&hwsim_phys_lock);
974                         goto err_subscribe;
975                 }
976         }
977         list_add_tail(&phy->list, &hwsim_phys);
978         mutex_unlock(&hwsim_phys_lock);
979
980         hwsim_mcast_new_radio(info, phy);
981
982         return idx;
983
984 err_subscribe:
985         ieee802154_unregister_hw(phy->hw);
986 err_reg:
987         kfree(pib);
988 err_pib:
989         ieee802154_free_hw(phy->hw);
990         return err;
991 }
992
993 static void hwsim_del(struct hwsim_phy *phy)
994 {
995         struct hwsim_pib *pib;
996         struct hwsim_edge *e;
997
998         hwsim_edge_unsubscribe_me(phy);
999
1000         list_del(&phy->list);
1001
1002         rcu_read_lock();
1003         list_for_each_entry_rcu(e, &phy->edges, list) {
1004                 list_del_rcu(&e->list);
1005                 hwsim_free_edge(e);
1006         }
1007         pib = rcu_dereference(phy->pib);
1008         rcu_read_unlock();
1009
1010         kfree_rcu(pib, rcu);
1011
1012         ieee802154_unregister_hw(phy->hw);
1013         ieee802154_free_hw(phy->hw);
1014 }
1015
1016 static int hwsim_probe(struct platform_device *pdev)
1017 {
1018         struct hwsim_phy *phy, *tmp;
1019         int err, i;
1020
1021         for (i = 0; i < 2; i++) {
1022                 err = hwsim_add_one(NULL, &pdev->dev, true);
1023                 if (err < 0)
1024                         goto err_slave;
1025         }
1026
1027         dev_info(&pdev->dev, "Added 2 mac802154 hwsim hardware radios\n");
1028         return 0;
1029
1030 err_slave:
1031         mutex_lock(&hwsim_phys_lock);
1032         list_for_each_entry_safe(phy, tmp, &hwsim_phys, list)
1033                 hwsim_del(phy);
1034         mutex_unlock(&hwsim_phys_lock);
1035         return err;
1036 }
1037
1038 static int hwsim_remove(struct platform_device *pdev)
1039 {
1040         struct hwsim_phy *phy, *tmp;
1041
1042         mutex_lock(&hwsim_phys_lock);
1043         list_for_each_entry_safe(phy, tmp, &hwsim_phys, list)
1044                 hwsim_del(phy);
1045         mutex_unlock(&hwsim_phys_lock);
1046
1047         return 0;
1048 }
1049
1050 static struct platform_driver mac802154hwsim_driver = {
1051         .probe = hwsim_probe,
1052         .remove = hwsim_remove,
1053         .driver = {
1054                         .name = "mac802154_hwsim",
1055         },
1056 };
1057
1058 static __init int hwsim_init_module(void)
1059 {
1060         int rc;
1061
1062         rc = genl_register_family(&hwsim_genl_family);
1063         if (rc)
1064                 return rc;
1065
1066         mac802154hwsim_dev = platform_device_register_simple("mac802154_hwsim",
1067                                                              -1, NULL, 0);
1068         if (IS_ERR(mac802154hwsim_dev)) {
1069                 rc = PTR_ERR(mac802154hwsim_dev);
1070                 goto platform_dev;
1071         }
1072
1073         rc = platform_driver_register(&mac802154hwsim_driver);
1074         if (rc < 0)
1075                 goto platform_drv;
1076
1077         return 0;
1078
1079 platform_drv:
1080         platform_device_unregister(mac802154hwsim_dev);
1081 platform_dev:
1082         genl_unregister_family(&hwsim_genl_family);
1083         return rc;
1084 }
1085
1086 static __exit void hwsim_remove_module(void)
1087 {
1088         genl_unregister_family(&hwsim_genl_family);
1089         platform_driver_unregister(&mac802154hwsim_driver);
1090         platform_device_unregister(mac802154hwsim_dev);
1091 }
1092
1093 module_init(hwsim_init_module);
1094 module_exit(hwsim_remove_module);