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 --- |