diff -aur systemd-228-1/src/network/networkd-link.c systemd-228-1a/src/network/networkd-link.c
--- systemd-228-1/src/network/networkd-link.c 2016-05-18 16:19:06.757698227 -0700
+++ systemd-228-1a/src/network/networkd-link.c 2016-05-18 16:25:20.219453171 -0700
@@ -134,6 +134,26 @@
return link->network->ip_forward & ADDRESS_FAMILY_IPV6;
}
+static bool link_ipv6_disabled(Link *link) {
+ const char *p = NULL;
+ int r;
+ if (link->flags & IFF_LOOPBACK)
+ return true;
+ /* Make this a NOP if IPv6 is not available */
+ if (!socket_ipv6_is_supported())
+ return true;
+
+ p = strjoina("/proc/sys/net/ipv6/conf/", link->ifname, "/disable_ipv6");
+ _cleanup_free_ char *val = NULL;
+ r = read_one_line_file(p, &val);
+ if (r < 0)
+ log_link_warning_errno(link, r, "Cannot read ipv6 state for interface: %m");
+ if (streq(val, "0"))
+ return false;
+
+ return true;
+}
+
bool link_ipv6_accept_ra_enabled(Link *link) {
if (link->flags & IFF_LOOPBACK)
return false;
@@ -614,7 +634,7 @@
!link->ipv4ll_route)
return;
- if (link_ipv6ll_enabled(link))
+ if (!link_ipv6_disabled(link) && link_ipv6ll_enabled(link))
if (in_addr_is_null(AF_INET6, (const union in_addr_union*) &link->ipv6ll_address) > 0)
return;