mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
net: hsr: sync hw addr of slave2 according to slave1 hw addr on PRP
In order to work properly PRP requires slave1 and slave2 to share the same MAC address. To ease the configuration process on userspace tools, sync the slave2 MAC address with slave1. In addition, when deleting the port from the list, restore the original MAC address. Signed-off-by: Fernando Fernandez Mancera <ffmancera@riseup.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6a325aed13
commit
b65999e723
@ -761,6 +761,11 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
|
||||
if (res)
|
||||
goto err_unregister;
|
||||
|
||||
if (protocol_version == PRP_V1) {
|
||||
eth_hw_addr_set(slave[1], slave[0]->dev_addr);
|
||||
call_netdevice_notifiers(NETDEV_CHANGEADDR, slave[1]);
|
||||
}
|
||||
|
||||
if (interlink) {
|
||||
res = hsr_add_port(hsr, interlink, HSR_PT_INTERLINK, extack);
|
||||
if (res)
|
||||
|
@ -78,6 +78,15 @@ static int hsr_netdev_notify(struct notifier_block *nb, unsigned long event,
|
||||
eth_hw_addr_set(master->dev, dev->dev_addr);
|
||||
call_netdevice_notifiers(NETDEV_CHANGEADDR,
|
||||
master->dev);
|
||||
|
||||
if (hsr->prot_version == PRP_V1) {
|
||||
port = hsr_port_get_hsr(hsr, HSR_PT_SLAVE_B);
|
||||
if (port) {
|
||||
eth_hw_addr_set(port->dev, dev->dev_addr);
|
||||
call_netdevice_notifiers(NETDEV_CHANGEADDR,
|
||||
port->dev);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Make sure we recognize frames from ourselves in hsr_rcv() */
|
||||
|
@ -155,6 +155,7 @@ struct hsr_port {
|
||||
struct hsr_priv *hsr;
|
||||
enum hsr_port_type type;
|
||||
struct rcu_head rcu;
|
||||
unsigned char original_macaddress[ETH_ALEN];
|
||||
};
|
||||
|
||||
struct hsr_frame_info;
|
||||
|
@ -196,6 +196,7 @@ int hsr_add_port(struct hsr_priv *hsr, struct net_device *dev,
|
||||
port->hsr = hsr;
|
||||
port->dev = dev;
|
||||
port->type = type;
|
||||
ether_addr_copy(port->original_macaddress, dev->dev_addr);
|
||||
|
||||
if (type != HSR_PT_MASTER) {
|
||||
res = hsr_portdev_setup(hsr, dev, port, extack);
|
||||
@ -232,6 +233,7 @@ void hsr_del_port(struct hsr_port *port)
|
||||
if (!port->hsr->fwd_offloaded)
|
||||
dev_set_promiscuity(port->dev, -1);
|
||||
netdev_upper_dev_unlink(port->dev, master->dev);
|
||||
eth_hw_addr_set(port->dev, port->original_macaddress);
|
||||
}
|
||||
|
||||
kfree_rcu(port, rcu);
|
||||
|
Loading…
Reference in New Issue
Block a user