Backport a patch to situations where the current node receives an RA
packet from itself, which triggers systemd-networkd to put the link into
a failed state which turns off internal RA functionality.

Signed-off-by: William A. Kennington III <[email protected]>
---
 ...le-ignoring-ll-gateway-being-link-ll.patch | 68 +++++++++++++++++++
 meta/recipes-core/systemd/systemd_247.6.bb    |  1 +
 2 files changed, 69 insertions(+)
 create mode 100644 
meta/recipes-core/systemd/systemd/0001-networkd-handle-ignoring-ll-gateway-being-link-ll.patch

diff --git 
a/meta/recipes-core/systemd/systemd/0001-networkd-handle-ignoring-ll-gateway-being-link-ll.patch
 
b/meta/recipes-core/systemd/systemd/0001-networkd-handle-ignoring-ll-gateway-being-link-ll.patch
new file mode 100644
index 0000000000..47e81a6c38
--- /dev/null
+++ 
b/meta/recipes-core/systemd/systemd/0001-networkd-handle-ignoring-ll-gateway-being-link-ll.patch
@@ -0,0 +1,68 @@
+From 40c6396bfd1e83f80dde31f4886bb1dbf155012d Mon Sep 17 00:00:00 2001
+From: Devon Pringle <[email protected]>
+Date: Mon, 14 Dec 2020 14:22:18 +1000
+Subject: [PATCH] networkd: handle ignoring ll gateway being link ll
+
+In the event where network discovery gets a route with the gateway being
+the interfaces local link address, networkd will fail the interface.
+
+systemd-networkd[44319]: br_lan: Configuring route: dst: 
fdcd:41a4:5559:ec03::/64, src: n/a, gw: fe80::e4da:7eff:fe77:5c5e, prefsrc: 
n/a, scope: global, table: main, proto: ra, type: unicast
+systemd-networkd[44319]: br_lan: Could not set NDisc route or address: Gateway 
can not be a local address. Invalid argument
+systemd-networkd[44319]: br_lan: Failed
+systemd-networkd[44319]: br_lan: State changed: configuring -> failed
+
+This patch, instead of allowing the interface to fail, will instead log
+the event and skip setting the route.
+
+Upstream-Status: Backport 
[https://github.com/systemd/systemd/commit/221019166f315252304b3459902ead613b905de5]
+---
+ src/network/networkd-ndisc.c | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c
+index d2aa3db175..41591900e9 100644
+--- a/src/network/networkd-ndisc.c
++++ b/src/network/networkd-ndisc.c
+@@ -820,7 +820,7 @@ static int ndisc_router_process_onlink_prefix(Link *link, 
sd_ndisc_router *rt) {
+ 
+ static int ndisc_router_process_route(Link *link, sd_ndisc_router *rt) {
+         _cleanup_(route_freep) Route *route = NULL;
+-        struct in6_addr gateway;
++        union in_addr_union gateway;
+         uint32_t lifetime;
+         unsigned preference, prefixlen;
+         usec_t time_now;
+@@ -835,10 +835,20 @@ static int ndisc_router_process_route(Link *link, 
sd_ndisc_router *rt) {
+         if (lifetime == 0)
+                 return 0;
+ 
+-        r = sd_ndisc_router_get_address(rt, &gateway);
++        r = sd_ndisc_router_get_address(rt, &gateway.in6);
+         if (r < 0)
+                 return log_link_error_errno(link, r, "Failed to get gateway 
address from RA: %m");
+ 
++        if (address_exists(link, AF_INET6, &gateway)) {
++                _cleanup_free_ char *buf = NULL;
++
++                if (DEBUG_LOGGING) {
++                        (void) in_addr_to_string(AF_INET6, &gateway, &buf);
++                        log_link_debug(link, "Advertised route gateway, %s, 
is local to the link, ignoring route", strnull(buf));
++                }
++                return 0;
++        }
++
+         r = sd_ndisc_router_route_get_prefixlen(rt, &prefixlen);
+         if (r < 0)
+                 return log_link_error_errno(link, r, "Failed to get route 
prefix length: %m");
+@@ -860,7 +870,7 @@ static int ndisc_router_process_route(Link *link, 
sd_ndisc_router *rt) {
+         route->priority = link->network->dhcp6_route_metric;
+         route->protocol = RTPROT_RA;
+         route->pref = preference;
+-        route->gw.in6 = gateway;
++        route->gw.in6 = gateway.in6;
+         route->gw_family = AF_INET6;
+         route->dst_prefixlen = prefixlen;
+         route->lifetime = time_now + lifetime * USEC_PER_SEC;
+-- 
+2.31.1.607.g51e8a6a459-goog
+
diff --git a/meta/recipes-core/systemd/systemd_247.6.bb 
b/meta/recipes-core/systemd/systemd_247.6.bb
index fb4acf2d37..dc04908922 100644
--- a/meta/recipes-core/systemd/systemd_247.6.bb
+++ b/meta/recipes-core/systemd/systemd_247.6.bb
@@ -28,6 +28,7 @@ SRC_URI += "file://touchscreen.rules \
            
file://0027-proc-dont-trigger-mount-error-with-invalid-options-o.patch \
            file://0001-analyze-resolve-executable-path-if-it-is-relative.patch 
\
            
file://0001-network-neighbor-Always-add-neighbors-with-replace.patch \
+           file://0001-networkd-handle-ignoring-ll-gateway-being-link-ll.patch 
\
            "
 
 # patches needed by musl
-- 
2.31.1.751.gd2f1c929bd-goog

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#152014): 
https://lists.openembedded.org/g/openembedded-core/message/152014
Mute This Topic: https://lists.openembedded.org/mt/82899809/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to