[OE-core] [PATCH] systemd: cherry-pick patch fixing networkd gateway route handling

Maciej Borzecki maciej.borzecki at open-rnd.pl
Thu Jan 8 15:46:03 UTC 2015


On 01/08 12:14, Otavio Salvador wrote:
> On Thu, Jan 8, 2015 at 6:43 AM, Maciej Borzecki
> <maciej.borzecki at open-rnd.pl> wrote:
> > Cherry-picking a patch that fixes gateway route handling in
> > systemd-networkd. The patch adds a source IP to the automatically added gateway
> > static route, this thus allowing for proper communication in case a static or
> > IPv4 LL address is used alongside a dynamically obtained one.
> >
> > (From systemd rev: 46b0c76e2c355c0d0cc4792abb98cde07b28bc5)
> >
> > Signed-off-by: Maciej Borzecki <maciej.borzecki at open-rnd.pl>
> > Signed-off-by: Maciek Borzecki <maciek.borzecki at gmail.com>
> > ---
> >  ...d-preferred-source-to-dhcp4-gateway-route.patch | 109 +++++++++++++++++++++
> >  meta/recipes-core/systemd/systemd_216.bb           |   1 +
> >  2 files changed, 110 insertions(+)
> >  create mode 100644 meta/recipes-core/systemd/systemd/0001-networkd-add-preferred-source-to-dhcp4-gateway-route.patch
> >
> > diff --git a/meta/recipes-core/systemd/systemd/0001-networkd-add-preferred-source-to-dhcp4-gateway-route.patch b/meta/recipes-core/systemd/systemd/0001-networkd-add-preferred-source-to-dhcp4-gateway-route.patch
> > new file mode 100644
> > index 0000000..1a9e8ee
> > --- /dev/null
> > +++ b/meta/recipes-core/systemd/systemd/0001-networkd-add-preferred-source-to-dhcp4-gateway-route.patch
> > @@ -0,0 +1,109 @@
> > +From 46b0c76e2c355c0d0cc4792abb98cde07b28bc53 Mon Sep 17 00:00:00 2001
> > +From: Emil Renner Berthing <systemd at esmil.dk>
> > +Date: Fri, 5 Sep 2014 11:56:02 +0200
> > +Subject: [PATCH] networkd: add preferred source to dhcp4 gateway route
> > +
> > +This makes DHCPv4 and IPv4LL coexist peacefully.
> > +
> > +[tomegun: apply to both the dhcp routes, use in_addr_is_null() rather than a
> > +separate variable to indicate when prefsrc should be applied]
>
> Missing Upstream-Status field.

I'm guessing

Upstream-Status: backport

is the correct stanza?

>
> > +---
> > + src/network/networkd-dhcp4.c | 11 +++++++++++
> > + src/network/networkd-route.c | 22 ++++++++++++++++++++++
> > + src/network/networkd.h       |  1 +
> > + 3 files changed, 34 insertions(+)
> > +
> > +diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c
> > +index 5e4ff2b80b796ea33de24b9c80076f408f6db63d..b87fa730826daba3650477c430495523ab09054d 100644
> > +--- a/src/network/networkd-dhcp4.c
> > ++++ b/src/network/networkd-dhcp4.c
> > +@@ -67,9 +67,18 @@ static int link_set_dhcp_routes(Link *link) {
> > +                 return r;
> > +         }
> > +         if (r >= 0) {
> > ++                struct in_addr address;
> > +                 _cleanup_route_free_ Route *route = NULL;
> > +                 _cleanup_route_free_ Route *route_gw = NULL;
> > +
> > ++                r = sd_dhcp_lease_get_address(link->dhcp_lease, &address);
> > ++                if (r < 0) {
> > ++                        log_warning_link(link,
> > ++                                         "DHCP error: could not get address: %s",
> > ++                                         strerror(-r));
> > ++                        return r;
> > ++                }
> > ++
> > +                 r = route_new_dynamic(&route, RTPROT_DHCP);
> > +                 if (r < 0) {
> > +                         log_error_link(link,
> > +@@ -92,6 +101,7 @@ static int link_set_dhcp_routes(Link *link) {
> > +                 route_gw->family = AF_INET;
> > +                 route_gw->dst_addr.in = gateway;
> > +                 route_gw->dst_prefixlen = 32;
> > ++                route_gw->prefsrc_addr.in = address;
> > +                 route_gw->scope = RT_SCOPE_LINK;
> > +                 route_gw->metrics = DHCP_ROUTE_METRIC;
> > +
> > +@@ -107,6 +117,7 @@ static int link_set_dhcp_routes(Link *link) {
> > +
> > +                 route->family = AF_INET;
> > +                 route->in_addr.in = gateway;
> > ++                route->prefsrc_addr.in = address;
> > +                 route->metrics = DHCP_ROUTE_METRIC;
> > +
> > +                 r = route_configure(route, link, &dhcp4_route_handler);
> > +diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c
> > +index aead4fbb9e8d47df66c2c892132d9c78e5650a68..10d8cd902a8c16147eb52bb4aa0d01781054ed1b 100644
> > +--- a/src/network/networkd-route.c
> > ++++ b/src/network/networkd-route.c
> > +@@ -144,6 +144,17 @@ int route_drop(Route *route, Link *link,
> > +                 }
> > +         }
> > +
> > ++        if (!in_addr_is_null(route->family, &route->prefsrc_addr)) {
> > ++                if (route->family == AF_INET)
> > ++                        r = sd_rtnl_message_append_in_addr(req, RTA_PREFSRC, &route->prefsrc_addr.in);
> > ++                else if (route->family == AF_INET6)
> > ++                        r = sd_rtnl_message_append_in6_addr(req, RTA_PREFSRC, &route->prefsrc_addr.in6);
> > ++                if (r < 0) {
> > ++                        log_error("Could not append RTA_PREFSRC attribute: %s", strerror(-r));
> > ++                        return r;
> > ++                }
> > ++        }
> > ++
> > +         r = sd_rtnl_message_route_set_scope(req, route->scope);
> > +         if (r < 0) {
> > +                 log_error("Could not set scope: %s", strerror(-r));
> > +@@ -218,6 +229,17 @@ int route_configure(Route *route, Link *link,
> > +                 }
> > +         }
> > +
> > ++        if (!in_addr_is_null(route->family, &route->prefsrc_addr)) {
> > ++                if (route->family == AF_INET)
> > ++                        r = sd_rtnl_message_append_in_addr(req, RTA_PREFSRC, &route->prefsrc_addr.in);
> > ++                else if (route->family == AF_INET6)
> > ++                        r = sd_rtnl_message_append_in6_addr(req, RTA_PREFSRC, &route->prefsrc_addr.in6);
> > ++                if (r < 0) {
> > ++                        log_error("Could not append RTA_PREFSRC attribute: %s", strerror(-r));
> > ++                        return r;
> > ++                }
> > ++        }
> > ++
> > +         r = sd_rtnl_message_route_set_scope(req, route->scope);
> > +         if (r < 0) {
> > +                 log_error("Could not set scope: %s", strerror(-r));
> > +diff --git a/src/network/networkd.h b/src/network/networkd.h
> > +index ab5df1aa3c57952dc9549f2da85332dd966771f4..c6e6b22c383e04413fffed24031410c2695dc190 100644
> > +--- a/src/network/networkd.h
> > ++++ b/src/network/networkd.h
> > +@@ -150,6 +150,7 @@ struct Route {
> > +
> > +         union in_addr_union in_addr;
> > +         union in_addr_union dst_addr;
> > ++        union in_addr_union prefsrc_addr;
> > +
> > +         LIST_FIELDS(Route, routes);
> > + };
> > +--
> > +1.9.3
> > +
> > diff --git a/meta/recipes-core/systemd/systemd_216.bb b/meta/recipes-core/systemd/systemd_216.bb
> > index 536b7be..d82fd7c 100644
> > --- a/meta/recipes-core/systemd/systemd_216.bb
> > +++ b/meta/recipes-core/systemd/systemd_216.bb
> > @@ -34,6 +34,7 @@ SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;branch=master;protocol=
> >             file://0001-missing.h-add-fake-__NR_memfd_create-for-MIPS.patch \
> >             file://0001-Make-root-s-home-directory-configurable.patch \
> >             file://0001-systemd-user-avoid-using-system-auth.patch \
> > +           file://0001-networkd-add-preferred-source-to-dhcp4-gateway-route.patch \
> >             file://touchscreen.rules \
> >             file://00-create-volatile.conf \
> >             file://init \
> > --
> > 1.9.3
> >
>
>
>
> --
> Otavio Salvador                             O.S. Systems
> http://www.ossystems.com.br        http://code.ossystems.com.br
> Mobile: +55 (53) 9981-7854            Mobile: +1 (347) 903-9750

--
Maciej Borzęcki
Senior Software Developer at Open-RnD Sp. z o.o., Poland
www.open-rnd.pl
mobile: +48 889 117 365, fax: +48 42 657 9079


Niniejsza wiadomość wraz z załącznikami może
zawierać chronione prawem lub poufne informacje i została
wysłana wyłącznie do wiadomości i użytku osób, do których
została zaadresowana. Jeśli wiadomość została otrzymana
przypadkowo zabrania się jej kopiowania lub rozsyłania do osób
trzecich. W takim przypadku uprasza się o natychmiastowe
zniszczenie wiadomości oraz poinformowanie nadawcy o
zaistniałej sytuacji za pomocą wiadomości zwrotnej.
Dziękujemy.

This message, including any attachments hereto,
may contain privileged or confidential information and is sent
solely for the attention and use of the intended addressee(s).
If you are not an intended addressee, you may neither use this
message nor copy or deliver it to anyone. In such case, you
should immediately destroy this message and kindly notify the
sender by reply email. Thank you.



More information about the Openembedded-core mailing list