Commit fc486c2d authored by Guillaume Nault's avatar Guillaume Nault Committed by Paolo Abeni
Browse files

Revert "gre: Fix IPv6 link-local address generation."

This reverts commit 183185a1.

This patch broke net/forwarding/ip6gre_custom_multipath_hash.sh in some
circumstances (https://lore.kernel.org/netdev/Z9RIyKZDNoka53EO@mini-arch/

).
Let's revert it while the problem is being investigated.

Fixes: 183185a1 ("gre: Fix IPv6 link-local address generation.")
Signed-off-by: default avatarGuillaume Nault <gnault@redhat.com>
Link: https://patch.msgid.link/8b1ce738eb15dd841aab9ef888640cab4f6ccfea.1742418408.git.gnault@redhat.com


Acked-by: default avatarStanislav Fomichev <sdf@fomichev.me>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 355d940f
Loading
Loading
Loading
Loading
+6 −9
Original line number Diff line number Diff line
@@ -3209,13 +3209,16 @@ static void add_v4_addrs(struct inet6_dev *idev)
	struct in6_addr addr;
	struct net_device *dev;
	struct net *net = dev_net(idev->dev);
	int scope, plen;
	int scope, plen, offset = 0;
	u32 pflags = 0;

	ASSERT_RTNL();

	memset(&addr, 0, sizeof(struct in6_addr));
	memcpy(&addr.s6_addr32[3], idev->dev->dev_addr, 4);
	/* in case of IP6GRE the dev_addr is an IPv6 and therefore we use only the last 4 bytes */
	if (idev->dev->addr_len == sizeof(struct in6_addr))
		offset = sizeof(struct in6_addr) - 4;
	memcpy(&addr.s6_addr32[3], idev->dev->dev_addr + offset, 4);

	if (!(idev->dev->flags & IFF_POINTOPOINT) && idev->dev->type == ARPHRD_SIT) {
		scope = IPV6_ADDR_COMPATv4;
@@ -3526,13 +3529,7 @@ static void addrconf_gre_config(struct net_device *dev)
		return;
	}

	/* Generate the IPv6 link-local address using addrconf_addr_gen(),
	 * unless we have an IPv4 GRE device not bound to an IP address and
	 * which is in EUI64 mode (as __ipv6_isatap_ifid() would fail in this
	 * case). Such devices fall back to add_v4_addrs() instead.
	 */
	if (!(dev->type == ARPHRD_IPGRE && *(__be32 *)dev->dev_addr == 0 &&
	      idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64)) {
	if (dev->type == ARPHRD_ETHER) {
		addrconf_addr_gen(idev, true);
		return;
	}