From cf6f5bb5584382732b6c5abdabd4d8519e6352c0 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 27 Nov 2018 12:09:52 +0100 Subject: [PATCH 1/2] network: add sd_dhcp_route_get_option() accessor Since sd_dhcp_lease_get_routes() returns the list of all routes, the caller may need to differenciate whether the route was option 33 (static-routes) or 121 (classless-static-route). Add an accessor for the internal field. --- src/libsystemd-network/sd-dhcp-lease.c | 6 ++++++ src/systemd/sd-dhcp-lease.h | 1 + 2 files changed, 7 insertions(+) diff --git a/src/libsystemd-network/sd-dhcp-lease.c b/src/libsystemd-network/sd-dhcp-lease.c index a90c01d7db..c2455c7133 100644 --- a/src/libsystemd-network/sd-dhcp-lease.c +++ b/src/libsystemd-network/sd-dhcp-lease.c @@ -1299,3 +1299,9 @@ int sd_dhcp_route_get_gateway(sd_dhcp_route *route, struct in_addr *gateway) { *gateway = route->gw_addr; return 0; } + +int sd_dhcp_route_get_option(sd_dhcp_route *route) { + assert_return(route, -EINVAL); + + return route->option; +} diff --git a/src/systemd/sd-dhcp-lease.h b/src/systemd/sd-dhcp-lease.h index 2a60145f5b..4875f10555 100644 --- a/src/systemd/sd-dhcp-lease.h +++ b/src/systemd/sd-dhcp-lease.h @@ -57,6 +57,7 @@ int sd_dhcp_lease_get_timezone(sd_dhcp_lease *lease, const char **timezone); int sd_dhcp_route_get_destination(sd_dhcp_route *route, struct in_addr *destination); int sd_dhcp_route_get_destination_prefix_length(sd_dhcp_route *route, uint8_t *length); int sd_dhcp_route_get_gateway(sd_dhcp_route *route, struct in_addr *gateway); +int sd_dhcp_route_get_option(sd_dhcp_route *route); _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_dhcp_lease, sd_dhcp_lease_unref); From 3476951cbb5ee5d015e86e645340e9310c84579e Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Tue, 27 Nov 2018 12:18:29 +0100 Subject: [PATCH 2/2] network: use sd_dhcp_route_get_option() accessor in link_set_dhcp_routes() --- src/network/networkd-dhcp4.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 45b784d023..597791e02b 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -4,7 +4,6 @@ #include #include "alloc-util.h" -#include "dhcp-lease-internal.h" #include "hostname-util.h" #include "parse-util.h" #include "netdev/vrf.h" @@ -87,11 +86,14 @@ static int link_set_dhcp_routes(Link *link) { log_link_debug_errno(link, n, "DHCP error: could not get routes: %m"); for (i = 0; i < n; i++) { - if (static_routes[i]->option == SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE) + switch (sd_dhcp_route_get_option(static_routes[i])) { + case SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE: classless_route = true; - - if (static_routes[i]->option == SD_DHCP_OPTION_STATIC_ROUTE) + break; + case SD_DHCP_OPTION_STATIC_ROUTE: static_route = true; + break; + } } for (i = 0; i < n; i++) { @@ -99,7 +101,8 @@ static int link_set_dhcp_routes(Link *link) { /* if the DHCP server returns both a Classless Static Routes option and a Static Routes option, the DHCP client MUST ignore the Static Routes option. */ - if (classless_route && static_routes[i]->option == SD_DHCP_OPTION_STATIC_ROUTE) + if (classless_route && + sd_dhcp_route_get_option(static_routes[i]) != SD_DHCP_OPTION_CLASSLESS_STATIC_ROUTE) continue; r = route_new(&route);