mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
net: add IFF_NO_ADDRCONF and use it in bonding to prevent ipv6 addrconf
Currently, in bonding it reused the IFF_SLAVE flag and checked it in ipv6 addrconf to prevent ipv6 addrconf. However, it is not a proper flag to use for no ipv6 addrconf, for bonding it has to move IFF_SLAVE flag setting ahead of dev_open() in bond_enslave(). Also, IFF_MASTER/SLAVE are historical flags used in bonding and eql, as Jiri mentioned, the new devices like Team, Failover do not use this flag. So as Jiri suggested, this patch adds IFF_NO_ADDRCONF in priv_flags of the device to indicate no ipv6 addconf, and uses it in bonding and moves IFF_SLAVE flag setting back to its original place. Signed-off-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
1280d4b76f
commit
8a321cf7be
@ -1632,13 +1632,19 @@ static int bond_master_upper_dev_link(struct bonding *bond, struct slave *slave,
|
||||
{
|
||||
struct netdev_lag_upper_info lag_upper_info;
|
||||
enum netdev_lag_tx_type type;
|
||||
int err;
|
||||
|
||||
type = bond_lag_tx_type(bond);
|
||||
lag_upper_info.tx_type = type;
|
||||
lag_upper_info.hash_type = bond_lag_hash_type(bond, type);
|
||||
|
||||
return netdev_master_upper_dev_link(slave->dev, bond->dev, slave,
|
||||
&lag_upper_info, extack);
|
||||
err = netdev_master_upper_dev_link(slave->dev, bond->dev, slave,
|
||||
&lag_upper_info, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
slave->dev->flags |= IFF_SLAVE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void bond_upper_dev_unlink(struct bonding *bond, struct slave *slave)
|
||||
@ -1950,8 +1956,8 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
|
||||
}
|
||||
}
|
||||
|
||||
/* set slave flag before open to prevent IPv6 addrconf */
|
||||
slave_dev->flags |= IFF_SLAVE;
|
||||
/* set no_addrconf flag before open to prevent IPv6 addrconf */
|
||||
slave_dev->priv_flags |= IFF_NO_ADDRCONF;
|
||||
|
||||
/* open the slave since the application closed it */
|
||||
res = dev_open(slave_dev, extack);
|
||||
@ -2254,7 +2260,7 @@ err_close:
|
||||
dev_close(slave_dev);
|
||||
|
||||
err_restore_mac:
|
||||
slave_dev->flags &= ~IFF_SLAVE;
|
||||
slave_dev->priv_flags &= ~IFF_NO_ADDRCONF;
|
||||
if (!bond->params.fail_over_mac ||
|
||||
BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) {
|
||||
/* XXX TODO - fom follow mode needs to change master's
|
||||
@ -2446,6 +2452,8 @@ static int __bond_release_one(struct net_device *bond_dev,
|
||||
/* close slave before restoring its mac address */
|
||||
dev_close(slave_dev);
|
||||
|
||||
slave_dev->priv_flags &= ~IFF_NO_ADDRCONF;
|
||||
|
||||
if (bond->params.fail_over_mac != BOND_FOM_ACTIVE ||
|
||||
BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP) {
|
||||
/* restore original ("permanent") mac address */
|
||||
|
@ -1662,6 +1662,7 @@ struct net_device_ops {
|
||||
* @IFF_FAILOVER: device is a failover master device
|
||||
* @IFF_FAILOVER_SLAVE: device is lower dev of a failover master device
|
||||
* @IFF_L3MDEV_RX_HANDLER: only invoke the rx handler of L3 master device
|
||||
* @IFF_NO_ADDRCONF: prevent ipv6 addrconf
|
||||
* @IFF_TX_SKB_NO_LINEAR: device/driver is capable of xmitting frames with
|
||||
* skb_headlen(skb) == 0 (data starts from frag0)
|
||||
* @IFF_CHANGE_PROTO_DOWN: device supports setting carrier via IFLA_PROTO_DOWN
|
||||
@ -1697,7 +1698,7 @@ enum netdev_priv_flags {
|
||||
IFF_FAILOVER = 1<<27,
|
||||
IFF_FAILOVER_SLAVE = 1<<28,
|
||||
IFF_L3MDEV_RX_HANDLER = 1<<29,
|
||||
/* was IFF_LIVE_RENAME_OK */
|
||||
IFF_NO_ADDRCONF = BIT_ULL(30),
|
||||
IFF_TX_SKB_NO_LINEAR = BIT_ULL(31),
|
||||
IFF_CHANGE_PROTO_DOWN = BIT_ULL(32),
|
||||
};
|
||||
|
@ -3320,7 +3320,7 @@ static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route)
|
||||
return;
|
||||
|
||||
/* no link local addresses on devices flagged as slaves */
|
||||
if (idev->dev->flags & IFF_SLAVE)
|
||||
if (idev->dev->priv_flags & IFF_NO_ADDRCONF)
|
||||
return;
|
||||
|
||||
ipv6_addr_set(&addr, htonl(0xFE800000), 0, 0, 0);
|
||||
@ -3560,7 +3560,7 @@ static int addrconf_notify(struct notifier_block *this, unsigned long event,
|
||||
if (idev && idev->cnf.disable_ipv6)
|
||||
break;
|
||||
|
||||
if (dev->flags & IFF_SLAVE) {
|
||||
if (dev->priv_flags & IFF_NO_ADDRCONF) {
|
||||
if (event == NETDEV_UP && !IS_ERR_OR_NULL(idev) &&
|
||||
dev->flags & IFF_UP && dev->flags & IFF_MULTICAST)
|
||||
ipv6_mc_up(idev);
|
||||
|
Loading…
Reference in New Issue
Block a user