hc
2024-05-10 61598093bbdd283a7edc367d900f223070ead8d2
kernel/drivers/net/ieee802154/mac802154_hwsim.c
....@@ -1,17 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * HWSIM IEEE 802.15.4 interface
34 *
45 * (C) 2018 Mojatau, Alexander Aring <aring@mojatau.com>
56 * Copyright 2007-2012 Siemens AG
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License version 2
9
- * as published by the Free Software Foundation.
10
- *
11
- * This program is distributed in the hope that it will be useful,
12
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
- * GNU General Public License for more details.
157 *
168 * Based on fakelb, original Written by:
179 * Sergey Lapin <slapin@ossfans.org>
....@@ -36,8 +28,6 @@
3628
3729 static LIST_HEAD(hwsim_phys);
3830 static DEFINE_MUTEX(hwsim_phys_lock);
39
-
40
-static LIST_HEAD(hwsim_ifup_phys);
4131
4232 static struct platform_device *mac802154hwsim_dev;
4333
....@@ -85,7 +75,6 @@
8575 struct list_head edges;
8676
8777 struct list_head list;
88
- struct list_head list_ifup;
8978 };
9079
9180 static int hwsim_add_one(struct genl_info *info, struct device *dev,
....@@ -159,9 +148,6 @@
159148 struct hwsim_phy *phy = hw->priv;
160149
161150 phy->suspended = false;
162
- list_add_rcu(&phy->list_ifup, &hwsim_ifup_phys);
163
- synchronize_rcu();
164
-
165151 return 0;
166152 }
167153
....@@ -170,8 +156,6 @@
170156 struct hwsim_phy *phy = hw->priv;
171157
172158 phy->suspended = true;
173
- list_del_rcu(&phy->list_ifup);
174
- synchronize_rcu();
175159 }
176160
177161 static int
....@@ -235,14 +219,16 @@
235219 return 0;
236220 }
237221
238
- nl_edges = nla_nest_start(skb, MAC802154_HWSIM_ATTR_RADIO_EDGES);
222
+ nl_edges = nla_nest_start_noflag(skb,
223
+ MAC802154_HWSIM_ATTR_RADIO_EDGES);
239224 if (!nl_edges) {
240225 rcu_read_unlock();
241226 return -ENOBUFS;
242227 }
243228
244229 list_for_each_entry_rcu(e, &phy->edges, list) {
245
- nl_edge = nla_nest_start(skb, MAC802154_HWSIM_ATTR_RADIO_EDGE);
230
+ nl_edge = nla_nest_start_noflag(skb,
231
+ MAC802154_HWSIM_ATTR_RADIO_EDGE);
246232 if (!nl_edge) {
247233 rcu_read_unlock();
248234 nla_nest_cancel(skb, nl_edges);
....@@ -436,9 +422,7 @@
436422 !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
437423 return -EINVAL;
438424
439
- if (nla_parse_nested(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX,
440
- info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE],
441
- hwsim_edge_policy, NULL))
425
+ if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], hwsim_edge_policy, NULL))
442426 return -EINVAL;
443427
444428 if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID])
....@@ -500,9 +484,7 @@
500484 !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
501485 return -EINVAL;
502486
503
- if (nla_parse_nested(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX,
504
- info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE],
505
- hwsim_edge_policy, NULL))
487
+ if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], hwsim_edge_policy, NULL))
506488 return -EINVAL;
507489
508490 if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID])
....@@ -540,7 +522,7 @@
540522 static int hwsim_set_edge_lqi(struct sk_buff *msg, struct genl_info *info)
541523 {
542524 struct nlattr *edge_attrs[MAC802154_HWSIM_EDGE_ATTR_MAX + 1];
543
- struct hwsim_edge_info *einfo;
525
+ struct hwsim_edge_info *einfo, *einfo_old;
544526 struct hwsim_phy *phy_v0;
545527 struct hwsim_edge *e;
546528 u32 v0, v1;
....@@ -550,9 +532,7 @@
550532 !info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
551533 return -EINVAL;
552534
553
- if (nla_parse_nested(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX,
554
- info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE],
555
- hwsim_edge_policy, NULL))
535
+ if (nla_parse_nested_deprecated(edge_attrs, MAC802154_HWSIM_EDGE_ATTR_MAX, info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE], hwsim_edge_policy, NULL))
556536 return -EINVAL;
557537
558538 if (!edge_attrs[MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID] ||
....@@ -580,8 +560,10 @@
580560 list_for_each_entry_rcu(e, &phy_v0->edges, list) {
581561 if (e->endpoint->idx == v1) {
582562 einfo->lqi = lqi;
583
- rcu_assign_pointer(e->info, einfo);
563
+ einfo_old = rcu_replace_pointer(e->info, einfo,
564
+ lockdep_is_held(&hwsim_phys_lock));
584565 rcu_read_unlock();
566
+ kfree_rcu(einfo_old, rcu);
585567 mutex_unlock(&hwsim_phys_lock);
586568 return 0;
587569 }
....@@ -603,40 +585,40 @@
603585 };
604586
605587 /* Generic Netlink operations array */
606
-static const struct genl_ops hwsim_nl_ops[] = {
588
+static const struct genl_small_ops hwsim_nl_ops[] = {
607589 {
608590 .cmd = MAC802154_HWSIM_CMD_NEW_RADIO,
609
- .policy = hwsim_genl_policy,
591
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
610592 .doit = hwsim_new_radio_nl,
611593 .flags = GENL_UNS_ADMIN_PERM,
612594 },
613595 {
614596 .cmd = MAC802154_HWSIM_CMD_DEL_RADIO,
615
- .policy = hwsim_genl_policy,
597
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
616598 .doit = hwsim_del_radio_nl,
617599 .flags = GENL_UNS_ADMIN_PERM,
618600 },
619601 {
620602 .cmd = MAC802154_HWSIM_CMD_GET_RADIO,
621
- .policy = hwsim_genl_policy,
603
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
622604 .doit = hwsim_get_radio_nl,
623605 .dumpit = hwsim_dump_radio_nl,
624606 },
625607 {
626608 .cmd = MAC802154_HWSIM_CMD_NEW_EDGE,
627
- .policy = hwsim_genl_policy,
609
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
628610 .doit = hwsim_new_edge_nl,
629611 .flags = GENL_UNS_ADMIN_PERM,
630612 },
631613 {
632614 .cmd = MAC802154_HWSIM_CMD_DEL_EDGE,
633
- .policy = hwsim_genl_policy,
615
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
634616 .doit = hwsim_del_edge_nl,
635617 .flags = GENL_UNS_ADMIN_PERM,
636618 },
637619 {
638620 .cmd = MAC802154_HWSIM_CMD_SET_EDGE,
639
- .policy = hwsim_genl_policy,
621
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
640622 .doit = hwsim_set_edge_lqi,
641623 .flags = GENL_UNS_ADMIN_PERM,
642624 },
....@@ -646,9 +628,10 @@
646628 .name = "MAC802154_HWSIM",
647629 .version = 1,
648630 .maxattr = MAC802154_HWSIM_ATTR_MAX,
631
+ .policy = hwsim_genl_policy,
649632 .module = THIS_MODULE,
650
- .ops = hwsim_nl_ops,
651
- .n_ops = ARRAY_SIZE(hwsim_nl_ops),
633
+ .small_ops = hwsim_nl_ops,
634
+ .n_small_ops = ARRAY_SIZE(hwsim_nl_ops),
652635 .mcgrps = hwsim_mcgrps,
653636 .n_mcgrps = ARRAY_SIZE(hwsim_mcgrps),
654637 };