slave.c (0498277ee17bb40cef43e0c9064b06c25f9bda29) slave.c (920a33cd72314f4ea96b5224fa8c7d4472d81880)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * net/dsa/slave.c - Slave device handling
4 * Copyright (c) 2008-2009 Marvell Semiconductor
5 */
6
7#include <linux/list.h>
8#include <linux/etherdevice.h>

--- 2685 unchanged lines hidden (view full) ---

2694 }
2695
2696 if (is_vlan_dev(info->upper_dev))
2697 return dsa_slave_check_8021q_upper(dev, info);
2698
2699 return NOTIFY_DONE;
2700}
2701
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * net/dsa/slave.c - Slave device handling
4 * Copyright (c) 2008-2009 Marvell Semiconductor
5 */
6
7#include <linux/list.h>
8#include <linux/etherdevice.h>

--- 2685 unchanged lines hidden (view full) ---

2694 }
2695
2696 if (is_vlan_dev(info->upper_dev))
2697 return dsa_slave_check_8021q_upper(dev, info);
2698
2699 return NOTIFY_DONE;
2700}
2701
2702/* Don't allow bridging of DSA masters, since the bridge layer rx_handler
2703 * prevents the DSA fake ethertype handler to be invoked, so we don't get the
2704 * chance to strip off and parse the DSA switch tag protocol header (the bridge
2705 * layer just returns RX_HANDLER_CONSUMED, stopping RX processing for these
2706 * frames).
2707 * The only case where that would not be an issue is when bridging can already
2708 * be offloaded, such as when the DSA master is itself a DSA or plain switchdev
2709 * port, and is bridged only with other ports from the same hardware device.
2710 */
2711static int
2712dsa_bridge_prechangelower_sanity_check(struct net_device *new_lower,
2713 struct netdev_notifier_changeupper_info *info)
2714{
2715 struct net_device *br = info->upper_dev;
2716 struct netlink_ext_ack *extack;
2717 struct net_device *lower;
2718 struct list_head *iter;
2719
2720 if (!netif_is_bridge_master(br))
2721 return NOTIFY_DONE;
2722
2723 if (!info->linking)
2724 return NOTIFY_DONE;
2725
2726 extack = netdev_notifier_info_to_extack(&info->info);
2727
2728 netdev_for_each_lower_dev(br, lower, iter) {
2729 if (!netdev_uses_dsa(new_lower) && !netdev_uses_dsa(lower))
2730 continue;
2731
2732 if (!netdev_port_same_parent_id(lower, new_lower)) {
2733 NL_SET_ERR_MSG(extack,
2734 "Cannot do software bridging with a DSA master");
2735 return notifier_from_errno(-EINVAL);
2736 }
2737 }
2738
2739 return NOTIFY_DONE;
2740}
2741
2702static int dsa_slave_netdevice_event(struct notifier_block *nb,
2703 unsigned long event, void *ptr)
2704{
2705 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
2706
2707 switch (event) {
2708 case NETDEV_PRECHANGEUPPER: {
2709 struct netdev_notifier_changeupper_info *info = ptr;
2710 int err;
2711
2712 err = dsa_slave_prechangeupper_sanity_check(dev, info);
2713 if (notifier_to_errno(err))
2714 return err;
2715
2742static int dsa_slave_netdevice_event(struct notifier_block *nb,
2743 unsigned long event, void *ptr)
2744{
2745 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
2746
2747 switch (event) {
2748 case NETDEV_PRECHANGEUPPER: {
2749 struct netdev_notifier_changeupper_info *info = ptr;
2750 int err;
2751
2752 err = dsa_slave_prechangeupper_sanity_check(dev, info);
2753 if (notifier_to_errno(err))
2754 return err;
2755
2756 err = dsa_bridge_prechangelower_sanity_check(dev, info);
2757 if (notifier_to_errno(err))
2758 return err;
2759
2716 err = dsa_slave_prechangeupper(dev, ptr);
2717 if (notifier_to_errno(err))
2718 return err;
2719
2720 err = dsa_slave_lag_prechangeupper(dev, ptr);
2721 if (notifier_to_errno(err))
2722 return err;
2723

--- 349 unchanged lines hidden ---
2760 err = dsa_slave_prechangeupper(dev, ptr);
2761 if (notifier_to_errno(err))
2762 return err;
2763
2764 err = dsa_slave_lag_prechangeupper(dev, ptr);
2765 if (notifier_to_errno(err))
2766 return err;
2767

--- 349 unchanged lines hidden ---