Skip to content

Commit fc486c2

Browse files
Guillaume NaultPaolo Abeni
Guillaume Nault
authored and
Paolo Abeni
committed
Revert "gre: Fix IPv6 link-local address generation."
This reverts commit 183185a. 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: 183185a ("gre: Fix IPv6 link-local address generation.") Signed-off-by: Guillaume Nault <[email protected]> Link: https://patch.msgid.link/8b1ce738eb15dd841aab9ef888640cab4f6ccfea.1742418408.git.gnault@redhat.com Acked-by: Stanislav Fomichev <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 355d940 commit fc486c2

File tree

1 file changed

+6
-9
lines changed

1 file changed

+6
-9
lines changed

net/ipv6/addrconf.c

+6-9
Original file line numberDiff line numberDiff line change
@@ -3209,13 +3209,16 @@ static void add_v4_addrs(struct inet6_dev *idev)
32093209
struct in6_addr addr;
32103210
struct net_device *dev;
32113211
struct net *net = dev_net(idev->dev);
3212-
int scope, plen;
3212+
int scope, plen, offset = 0;
32133213
u32 pflags = 0;
32143214

32153215
ASSERT_RTNL();
32163216

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

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

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

0 commit comments

Comments
 (0)