Commit b65999e7 authored by Fernando Fernandez Mancera's avatar Fernando Fernandez Mancera Committed by David S. Miller
Browse files

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: default avatarFernando Fernandez Mancera <ffmancera@riseup.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6a325aed
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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)
+9 −0
Original line number Diff line number Diff line
@@ -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() */
+1 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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);