hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/net/macvlan.c
....@@ -1,10 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Copyright (c) 2007 Patrick McHardy <kaber@trash.net>
3
- *
4
- * This program is free software; you can redistribute it and/or
5
- * modify it under the terms of the GNU General Public License as
6
- * published by the Free Software Foundation; either version 2 of
7
- * the License, or (at your option) any later version.
84 *
95 * The code this is based on carried the following copyright notice:
106 * ---
....@@ -24,6 +20,7 @@
2420 #include <linux/notifier.h>
2521 #include <linux/netdevice.h>
2622 #include <linux/etherdevice.h>
23
+#include <linux/net_tstamp.h>
2724 #include <linux/ethtool.h>
2825 #include <linux/if_arp.h>
2926 #include <linux/if_vlan.h>
....@@ -34,6 +31,7 @@
3431 #include <net/rtnetlink.h>
3532 #include <net/xfrm.h>
3633 #include <linux/netpoll.h>
34
+#include <linux/phy.h>
3735
3836 #define MACVLAN_HASH_BITS 8
3937 #define MACVLAN_HASH_SIZE (1<<MACVLAN_HASH_BITS)
....@@ -119,15 +117,14 @@
119117 return rtnl_dereference(dev->rx_handler_data);
120118 }
121119
122
-#define macvlan_port_exists(dev) (dev->priv_flags & IFF_MACVLAN_PORT)
123
-
124120 static struct macvlan_dev *macvlan_hash_lookup(const struct macvlan_port *port,
125121 const unsigned char *addr)
126122 {
127123 struct macvlan_dev *vlan;
128124 u32 idx = macvlan_eth_hash(addr);
129125
130
- hlist_for_each_entry_rcu(vlan, &port->vlan_hash[idx], hlist) {
126
+ hlist_for_each_entry_rcu(vlan, &port->vlan_hash[idx], hlist,
127
+ lockdep_rtnl_is_held()) {
131128 if (ether_addr_equal_64bits(vlan->dev->dev_addr, addr))
132129 return vlan;
133130 }
....@@ -142,7 +139,7 @@
142139 u32 idx = macvlan_eth_hash(addr);
143140 struct hlist_head *h = &vlan->port->vlan_source_hash[idx];
144141
145
- hlist_for_each_entry_rcu(entry, h, hlist) {
142
+ hlist_for_each_entry_rcu(entry, h, hlist, lockdep_rtnl_is_held()) {
146143 if (ether_addr_equal_64bits(entry->addr, addr) &&
147144 entry->vlan == vlan)
148145 return entry;
....@@ -337,7 +334,7 @@
337334
338335 if (src)
339336 dev_put(src->dev);
340
- kfree_skb(skb);
337
+ consume_skb(skb);
341338
342339 cond_resched();
343340 }
....@@ -549,12 +546,11 @@
549546 static inline netdev_tx_t macvlan_netpoll_send_skb(struct macvlan_dev *vlan, struct sk_buff *skb)
550547 {
551548 #ifdef CONFIG_NET_POLL_CONTROLLER
552
- if (vlan->netpoll)
553
- netpoll_send_skb(vlan->netpoll, skb);
549
+ return netpoll_send_skb(vlan->netpoll, skb);
554550 #else
555551 BUG();
556
-#endif
557552 return NETDEV_TX_OK;
553
+#endif
558554 }
559555
560556 static netdev_tx_t macvlan_start_xmit(struct sk_buff *skb,
....@@ -752,7 +748,7 @@
752748
753749 if (vlan->mode == MACVLAN_MODE_PASSTHRU) {
754750 macvlan_set_addr_change(vlan->port);
755
- return dev_set_mac_address(vlan->lowerdev, addr);
751
+ return dev_set_mac_address(vlan->lowerdev, addr, NULL);
756752 }
757753
758754 if (macvlan_addr_busy(vlan->port, addr->sa_data))
....@@ -832,6 +828,33 @@
832828 return 0;
833829 }
834830
831
+static int macvlan_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
832
+{
833
+ struct net_device *real_dev = macvlan_dev_real_dev(dev);
834
+ const struct net_device_ops *ops = real_dev->netdev_ops;
835
+ struct ifreq ifrr;
836
+ int err = -EOPNOTSUPP;
837
+
838
+ strscpy(ifrr.ifr_name, real_dev->name, IFNAMSIZ);
839
+ ifrr.ifr_ifru = ifr->ifr_ifru;
840
+
841
+ switch (cmd) {
842
+ case SIOCSHWTSTAMP:
843
+ if (!net_eq(dev_net(dev), &init_net))
844
+ break;
845
+ fallthrough;
846
+ case SIOCGHWTSTAMP:
847
+ if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
848
+ err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
849
+ break;
850
+ }
851
+
852
+ if (!err)
853
+ ifr->ifr_ifru = ifrr.ifr_ifru;
854
+
855
+ return err;
856
+}
857
+
835858 /*
836859 * macvlan network devices have devices nesting below it and are a special
837860 * "super class" of normal network devices; split their locks off into a
....@@ -854,17 +877,11 @@
854877 #define MACVLAN_STATE_MASK \
855878 ((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT))
856879
857
-static int macvlan_get_nest_level(struct net_device *dev)
858
-{
859
- return ((struct macvlan_dev *)netdev_priv(dev))->nest_level;
860
-}
861
-
862880 static void macvlan_set_lockdep_class(struct net_device *dev)
863881 {
864882 netdev_lockdep_set_classes(dev);
865
- lockdep_set_class_and_subclass(&dev->addr_list_lock,
866
- &macvlan_netdev_addr_lock_key,
867
- macvlan_get_nest_level(dev));
883
+ lockdep_set_class(&dev->addr_list_lock,
884
+ &macvlan_netdev_addr_lock_key);
868885 }
869886
870887 static int macvlan_init(struct net_device *dev)
....@@ -884,7 +901,6 @@
884901 dev->gso_max_size = lowerdev->gso_max_size;
885902 dev->gso_max_segs = lowerdev->gso_max_segs;
886903 dev->hard_header_len = lowerdev->hard_header_len;
887
-
888904 macvlan_set_lockdep_class(dev);
889905
890906 vlan->pcpu_stats = netdev_alloc_pcpu_stats(struct vlan_pcpu_stats);
....@@ -971,7 +987,8 @@
971987 static int macvlan_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
972988 struct net_device *dev,
973989 const unsigned char *addr, u16 vid,
974
- u16 flags)
990
+ u16 flags,
991
+ struct netlink_ext_ack *extack)
975992 {
976993 struct macvlan_dev *vlan = netdev_priv(dev);
977994 int err = -EINVAL;
....@@ -1027,6 +1044,26 @@
10271044 const struct macvlan_dev *vlan = netdev_priv(dev);
10281045
10291046 return __ethtool_get_link_ksettings(vlan->lowerdev, cmd);
1047
+}
1048
+
1049
+static int macvlan_ethtool_get_ts_info(struct net_device *dev,
1050
+ struct ethtool_ts_info *info)
1051
+{
1052
+ struct net_device *real_dev = macvlan_dev_real_dev(dev);
1053
+ const struct ethtool_ops *ops = real_dev->ethtool_ops;
1054
+ struct phy_device *phydev = real_dev->phydev;
1055
+
1056
+ if (phy_has_tsinfo(phydev)) {
1057
+ return phy_ts_info(phydev, info);
1058
+ } else if (ops->get_ts_info) {
1059
+ return ops->get_ts_info(real_dev, info);
1060
+ } else {
1061
+ info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
1062
+ SOF_TIMESTAMPING_SOFTWARE;
1063
+ info->phc_index = -1;
1064
+ }
1065
+
1066
+ return 0;
10301067 }
10311068
10321069 static netdev_features_t macvlan_fix_features(struct net_device *dev,
....@@ -1088,7 +1125,7 @@
10881125
10891126 vlan->netpoll = NULL;
10901127
1091
- __netpoll_free_async(netpoll);
1128
+ __netpoll_free(netpoll);
10921129 }
10931130 #endif /* CONFIG_NET_POLL_CONTROLLER */
10941131
....@@ -1103,6 +1140,7 @@
11031140 .get_link = ethtool_op_get_link,
11041141 .get_link_ksettings = macvlan_ethtool_get_link_ksettings,
11051142 .get_drvinfo = macvlan_ethtool_get_drvinfo,
1143
+ .get_ts_info = macvlan_ethtool_get_ts_info,
11061144 };
11071145
11081146 static const struct net_device_ops macvlan_netdev_ops = {
....@@ -1112,6 +1150,7 @@
11121150 .ndo_stop = macvlan_stop,
11131151 .ndo_start_xmit = macvlan_start_xmit,
11141152 .ndo_change_mtu = macvlan_change_mtu,
1153
+ .ndo_do_ioctl = macvlan_do_ioctl,
11151154 .ndo_fix_features = macvlan_fix_features,
11161155 .ndo_change_rx_flags = macvlan_change_rx_flags,
11171156 .ndo_set_mac_address = macvlan_set_mac_address,
....@@ -1123,7 +1162,6 @@
11231162 .ndo_fdb_add = macvlan_fdb_add,
11241163 .ndo_fdb_del = macvlan_fdb_del,
11251164 .ndo_fdb_dump = ndo_dflt_fdb_dump,
1126
- .ndo_get_lock_subclass = macvlan_get_nest_level,
11271165 #ifdef CONFIG_NET_POLL_CONTROLLER
11281166 .ndo_poll_controller = macvlan_dev_poll_controller,
11291167 .ndo_netpoll_setup = macvlan_dev_netpoll_setup,
....@@ -1131,13 +1169,14 @@
11311169 #endif
11321170 .ndo_get_iflink = macvlan_dev_get_iflink,
11331171 .ndo_features_check = passthru_features_check,
1172
+ .ndo_change_proto_down = dev_change_proto_down_generic,
11341173 };
11351174
11361175 void macvlan_common_setup(struct net_device *dev)
11371176 {
11381177 ether_setup(dev);
11391178
1140
- dev->min_mtu = 0;
1179
+ /* ether_setup() has set dev->min_mtu to ETH_MIN_MTU. */
11411180 dev->max_mtu = ETH_MAX_MTU;
11421181 dev->priv_flags &= ~IFF_TX_SKB_SHARING;
11431182 netif_keep_dst(dev);
....@@ -1221,7 +1260,7 @@
12211260
12221261 sa.sa_family = port->dev->type;
12231262 memcpy(&sa.sa_data, port->perm_addr, port->dev->addr_len);
1224
- dev_set_mac_address(port->dev, &sa);
1263
+ dev_set_mac_address(port->dev, &sa, NULL);
12251264 }
12261265
12271266 kfree(port);
....@@ -1398,7 +1437,7 @@
13981437 if (!tb[IFLA_ADDRESS])
13991438 eth_hw_addr_random(dev);
14001439
1401
- if (!macvlan_port_exists(lowerdev)) {
1440
+ if (!netif_is_macvlan_port(lowerdev)) {
14021441 err = macvlan_port_create(lowerdev);
14031442 if (err < 0)
14041443 return err;
....@@ -1419,7 +1458,6 @@
14191458 vlan->dev = dev;
14201459 vlan->port = port;
14211460 vlan->set_features = MACVLAN_FEATURES;
1422
- vlan->nest_level = dev_get_nest_level(lowerdev) + 1;
14231461
14241462 vlan->mode = MACVLAN_MODE_VEPA;
14251463 if (data && data[IFLA_MACVLAN_MODE])
....@@ -1471,8 +1509,10 @@
14711509 /* the macvlan port may be freed by macvlan_uninit when fail to register.
14721510 * so we destroy the macvlan port only when it's valid.
14731511 */
1474
- if (create && macvlan_port_get_rtnl(lowerdev))
1512
+ if (create && macvlan_port_get_rtnl(lowerdev)) {
1513
+ macvlan_flush_sources(port, vlan);
14751514 macvlan_port_destroy(port->dev);
1515
+ }
14761516 return err;
14771517 }
14781518 EXPORT_SYMBOL_GPL(macvlan_common_newlink);
....@@ -1574,7 +1614,7 @@
15741614 struct hlist_head *h = &vlan->port->vlan_source_hash[i];
15751615 struct macvlan_source_entry *entry;
15761616
1577
- hlist_for_each_entry_rcu(entry, h, hlist) {
1617
+ hlist_for_each_entry_rcu(entry, h, hlist, lockdep_rtnl_is_held()) {
15781618 if (entry->vlan != vlan)
15791619 continue;
15801620 if (nla_put(skb, IFLA_MACVLAN_MACADDR, ETH_ALEN, entry->addr))
....@@ -1597,7 +1637,7 @@
15971637 if (nla_put_u32(skb, IFLA_MACVLAN_MACADDR_COUNT, vlan->macaddr_count))
15981638 goto nla_put_failure;
15991639 if (vlan->macaddr_count > 0) {
1600
- nest = nla_nest_start(skb, IFLA_MACVLAN_MACADDR_DATA);
1640
+ nest = nla_nest_start_noflag(skb, IFLA_MACVLAN_MACADDR_DATA);
16011641 if (nest == NULL)
16021642 goto nla_put_failure;
16031643
....@@ -1658,7 +1698,7 @@
16581698 struct macvlan_port *port;
16591699 LIST_HEAD(list_kill);
16601700
1661
- if (!macvlan_port_exists(dev))
1701
+ if (!netif_is_macvlan_port(dev))
16621702 return NOTIFY_DONE;
16631703
16641704 port = macvlan_port_get_rtnl(dev);