1
0
mirror of https://github.com/systemd/systemd synced 2025-10-06 00:13:24 +02:00

test: allow to run test-local-addresses with IPv6 disabled by default, and assume RTA_VIA is always supported (#38039)

This commit is contained in:
Luca Boccassi
2025-07-03 09:58:02 +01:00
committed by GitHub
2 changed files with 161 additions and 178 deletions

View File

@@ -10,10 +10,9 @@
#include "in-addr-util.h" #include "in-addr-util.h"
#include "local-addresses.h" #include "local-addresses.h"
#include "netlink-util.h" #include "netlink-util.h"
#include "sysctl-util.h"
#include "tests.h" #include "tests.h"
static bool support_rta_via = false;
static void print_local_addresses(const struct local_address *a, size_t n) { static void print_local_addresses(const struct local_address *a, size_t n) {
FOREACH_ARRAY(i, a, n) FOREACH_ARRAY(i, a, n)
log_debug("%s ifindex=%i scope=%u priority=%"PRIu32" weight=%"PRIu32" address=%s", log_debug("%s ifindex=%i scope=%u priority=%"PRIu32" weight=%"PRIu32" address=%s",
@@ -25,50 +24,42 @@ TEST(local_addresses) {
struct local_address *a = NULL; struct local_address *a = NULL;
int n; int n;
n = local_addresses(NULL, 0, AF_INET, &a); ASSERT_OK(n = local_addresses(NULL, 0, AF_INET, &a));
assert_se(n >= 0);
log_debug("/* Local Addresses(ifindex:0, AF_INET) */"); log_debug("/* Local Addresses(ifindex:0, AF_INET) */");
print_local_addresses(a, n); print_local_addresses(a, n);
a = mfree(a); a = mfree(a);
n = local_addresses(NULL, 0, AF_INET6, &a); ASSERT_OK(n = local_addresses(NULL, 0, AF_INET6, &a));
assert_se(n >= 0);
log_debug("/* Local Addresses(ifindex:0, AF_INET6) */"); log_debug("/* Local Addresses(ifindex:0, AF_INET6) */");
print_local_addresses(a, n); print_local_addresses(a, n);
a = mfree(a); a = mfree(a);
n = local_addresses(NULL, 0, AF_UNSPEC, &a); ASSERT_OK(n = local_addresses(NULL, 0, AF_UNSPEC, &a));
assert_se(n >= 0);
log_debug("/* Local Addresses(ifindex:0, AF_UNSPEC) */"); log_debug("/* Local Addresses(ifindex:0, AF_UNSPEC) */");
print_local_addresses(a, n); print_local_addresses(a, n);
a = mfree(a); a = mfree(a);
n = local_addresses(NULL, 1, AF_INET, &a); ASSERT_OK(n = local_addresses(NULL, 1, AF_INET, &a));
assert_se(n >= 0);
log_debug("/* Local Addresses(ifindex:1, AF_INET) */"); log_debug("/* Local Addresses(ifindex:1, AF_INET) */");
print_local_addresses(a, n); print_local_addresses(a, n);
a = mfree(a); a = mfree(a);
n = local_addresses(NULL, 1, AF_INET6, &a); ASSERT_OK(n = local_addresses(NULL, 1, AF_INET6, &a));
assert_se(n >= 0);
log_debug("/* Local Addresses(ifindex:1, AF_INET6) */"); log_debug("/* Local Addresses(ifindex:1, AF_INET6) */");
print_local_addresses(a, n); print_local_addresses(a, n);
a = mfree(a); a = mfree(a);
n = local_addresses(NULL, 1, AF_UNSPEC, &a); ASSERT_OK(n = local_addresses(NULL, 1, AF_UNSPEC, &a));
assert_se(n >= 0);
log_debug("/* Local Addresses(ifindex:1, AF_UNSPEC) */"); log_debug("/* Local Addresses(ifindex:1, AF_UNSPEC) */");
print_local_addresses(a, n); print_local_addresses(a, n);
a = mfree(a); a = mfree(a);
n = local_gateways(NULL, 0, AF_UNSPEC, &a); ASSERT_OK(n = local_gateways(NULL, 0, AF_UNSPEC, &a));
assert_se(n >= 0);
log_debug("/* Local Gateways */"); log_debug("/* Local Gateways */");
print_local_addresses(a, n); print_local_addresses(a, n);
a = mfree(a); a = mfree(a);
n = local_outbounds(NULL, 0, AF_UNSPEC, &a); ASSERT_OK(n = local_outbounds(NULL, 0, AF_UNSPEC, &a));
assert_se(n >= 0);
log_debug("/* Local Outbounds */"); log_debug("/* Local Outbounds */");
print_local_addresses(a, n); print_local_addresses(a, n);
free(a); free(a);
@@ -81,36 +72,38 @@ static void check_local_addresses(sd_netlink *rtnl, int ifindex, int request_ifi
log_debug("/* Local Addresses (ifindex:%i, %s) */", request_ifindex, family == AF_UNSPEC ? "AF_UNSPEC" : af_to_name(family)); log_debug("/* Local Addresses (ifindex:%i, %s) */", request_ifindex, family == AF_UNSPEC ? "AF_UNSPEC" : af_to_name(family));
n = local_addresses(rtnl, request_ifindex, family, &a); ASSERT_OK(n = local_addresses(rtnl, request_ifindex, family, &a));
assert_se(n >= 0);
print_local_addresses(a, n); print_local_addresses(a, n);
assert_se(in_addr_from_string(AF_INET, "10.123.123.123", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET, "10.123.123.123", &u));
assert_se(has_local_address(a, n, ASSERT_EQ(has_local_address(a, n,
&(struct local_address) { &(struct local_address) {
.ifindex = ifindex, .ifindex = ifindex,
.scope = RT_SCOPE_UNIVERSE, .scope = RT_SCOPE_UNIVERSE,
.family = AF_INET, .family = AF_INET,
.address = u, .address = u,
}) == IN_SET(family, AF_UNSPEC, AF_INET)); }),
IN_SET(family, AF_UNSPEC, AF_INET));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:0:123::123", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:0:123::123", &u));
assert_se(has_local_address(a, n, ASSERT_EQ(has_local_address(a, n,
&(struct local_address) { &(struct local_address) {
.ifindex = ifindex, .ifindex = ifindex,
.scope = RT_SCOPE_UNIVERSE, .scope = RT_SCOPE_UNIVERSE,
.family = AF_INET6, .family = AF_INET6,
.address = u, .address = u,
}) == IN_SET(family, AF_UNSPEC, AF_INET6)); }),
IN_SET(family, AF_UNSPEC, AF_INET6));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::123", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::123", &u));
assert_se(has_local_address(a, n, ASSERT_EQ(has_local_address(a, n,
&(struct local_address) { &(struct local_address) {
.ifindex = ifindex, .ifindex = ifindex,
.scope = RT_SCOPE_UNIVERSE, .scope = RT_SCOPE_UNIVERSE,
.family = AF_INET6, .family = AF_INET6,
.address = u, .address = u,
}) == IN_SET(family, AF_UNSPEC, AF_INET6)); }),
IN_SET(family, AF_UNSPEC, AF_INET6));
} }
static void check_local_gateways(sd_netlink *rtnl, int ifindex, int request_ifindex, int family) { static void check_local_gateways(sd_netlink *rtnl, int ifindex, int request_ifindex, int family) {
@@ -120,36 +113,38 @@ static void check_local_gateways(sd_netlink *rtnl, int ifindex, int request_ifin
log_debug("/* Local Gateways (ifindex:%i, %s) */", request_ifindex, family == AF_UNSPEC ? "AF_UNSPEC" : af_to_name(family)); log_debug("/* Local Gateways (ifindex:%i, %s) */", request_ifindex, family == AF_UNSPEC ? "AF_UNSPEC" : af_to_name(family));
n = local_gateways(rtnl, request_ifindex, family, &a); ASSERT_OK(n = local_gateways(rtnl, request_ifindex, family, &a));
assert_se(n >= 0);
print_local_addresses(a, n); print_local_addresses(a, n);
assert_se(in_addr_from_string(AF_INET, "10.123.0.1", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET, "10.123.0.1", &u));
assert_se(has_local_address(a, n, ASSERT_EQ(has_local_address(a, n,
&(struct local_address) { &(struct local_address) {
.ifindex = ifindex, .ifindex = ifindex,
.priority = 1234, .priority = 1234,
.family = AF_INET, .family = AF_INET,
.address = u, .address = u,
}) == IN_SET(family, AF_UNSPEC, AF_INET)); }),
IN_SET(family, AF_UNSPEC, AF_INET));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:0:123::1", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:0:123::1", &u));
assert_se(has_local_address(a, n, ASSERT_EQ(has_local_address(a, n,
&(struct local_address) { &(struct local_address) {
.ifindex = ifindex, .ifindex = ifindex,
.priority = 1234, .priority = 1234,
.family = AF_INET6, .family = AF_INET6,
.address = u, .address = u,
}) == (family == AF_UNSPEC && support_rta_via)); }),
family == AF_UNSPEC);
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u));
assert_se(has_local_address(a, n, ASSERT_EQ(has_local_address(a, n,
&(struct local_address) { &(struct local_address) {
.ifindex = ifindex, .ifindex = ifindex,
.priority = 1234, .priority = 1234,
.family = AF_INET6, .family = AF_INET6,
.address = u, .address = u,
}) == IN_SET(family, AF_UNSPEC, AF_INET6)); }),
IN_SET(family, AF_UNSPEC, AF_INET6));
} }
static void check_local_outbounds(sd_netlink *rtnl, int ifindex, int request_ifindex, int family, const char *ipv6_expected) { static void check_local_outbounds(sd_netlink *rtnl, int ifindex, int request_ifindex, int family, const char *ipv6_expected) {
@@ -160,33 +155,35 @@ static void check_local_outbounds(sd_netlink *rtnl, int ifindex, int request_ifi
log_debug("/* Local Outbounds (ifindex:%i, %s, expected_ipv6_address=%s) */", log_debug("/* Local Outbounds (ifindex:%i, %s, expected_ipv6_address=%s) */",
request_ifindex, family == AF_UNSPEC ? "AF_UNSPEC" : af_to_name(family), ipv6_expected); request_ifindex, family == AF_UNSPEC ? "AF_UNSPEC" : af_to_name(family), ipv6_expected);
n = local_outbounds(rtnl, request_ifindex, family, &a); ASSERT_OK(n = local_outbounds(rtnl, request_ifindex, family, &a));
assert_se(n >= 0);
print_local_addresses(a, n); print_local_addresses(a, n);
assert_se(in_addr_from_string(AF_INET, "10.123.123.123", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET, "10.123.123.123", &u));
assert_se(has_local_address(a, n, ASSERT_EQ(has_local_address(a, n,
&(struct local_address) { &(struct local_address) {
.ifindex = ifindex, .ifindex = ifindex,
.family = AF_INET, .family = AF_INET,
.address = u, .address = u,
}) == IN_SET(family, AF_UNSPEC, AF_INET)); }),
IN_SET(family, AF_UNSPEC, AF_INET));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:0:123::123", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:0:123::123", &u));
assert_se(has_local_address(a, n, ASSERT_EQ(has_local_address(a, n,
&(struct local_address) { &(struct local_address) {
.ifindex = ifindex, .ifindex = ifindex,
.family = AF_INET6, .family = AF_INET6,
.address = u, .address = u,
}) == (family == AF_UNSPEC && support_rta_via)); }),
family == AF_UNSPEC);
assert_se(in_addr_from_string(AF_INET6, ipv6_expected, &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, ipv6_expected, &u));
assert_se(has_local_address(a, n, ASSERT_EQ(has_local_address(a, n,
&(struct local_address) { &(struct local_address) {
.ifindex = ifindex, .ifindex = ifindex,
.family = AF_INET6, .family = AF_INET6,
.address = u, .address = u,
}) == IN_SET(family, AF_UNSPEC, AF_INET6)); }),
IN_SET(family, AF_UNSPEC, AF_INET6));
} }
TEST(local_addresses_with_dummy) { TEST(local_addresses_with_dummy) {
@@ -195,108 +192,106 @@ TEST(local_addresses_with_dummy) {
union in_addr_union u; union in_addr_union u;
int r, ifindex; int r, ifindex;
assert_se(sd_netlink_open(&rtnl) >= 0); ASSERT_OK(sd_netlink_open(&rtnl));
/* Create a dummy interface */ /* Create a dummy interface */
assert_se(sd_rtnl_message_new_link(rtnl, &message, RTM_NEWLINK, 0) >= 0); ASSERT_OK(sd_rtnl_message_new_link(rtnl, &message, RTM_NEWLINK, 0));
assert_se(sd_netlink_message_append_string(message, IFLA_IFNAME, "test-local-addr") >= 0); ASSERT_OK(sd_netlink_message_append_string(message, IFLA_IFNAME, "test-local-addr"));
assert_se(sd_netlink_message_open_container(message, IFLA_LINKINFO) >= 0); ASSERT_OK(sd_netlink_message_open_container(message, IFLA_LINKINFO));
assert_se(sd_netlink_message_append_string(message, IFLA_INFO_KIND, "dummy") >= 0); ASSERT_OK(sd_netlink_message_append_string(message, IFLA_INFO_KIND, "dummy"));
r = sd_netlink_call(rtnl, message, 0, NULL); r = sd_netlink_call(rtnl, message, 0, NULL);
if (r == -EPERM) if (r == -EPERM)
return (void) log_tests_skipped("missing required capabilities"); return (void) log_tests_skipped("missing required capabilities");
if (r == -EOPNOTSUPP) if (r == -EOPNOTSUPP)
return (void) log_tests_skipped("dummy network interface is not supported"); return (void) log_tests_skipped("dummy network interface is not supported");
assert_se(r >= 0); ASSERT_OK(r);
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
/* Get ifindex */ /* Get ifindex */
assert_se(sd_rtnl_message_new_link(rtnl, &message, RTM_GETLINK, 0) >= 0); ASSERT_OK(sd_rtnl_message_new_link(rtnl, &message, RTM_GETLINK, 0));
assert_se(sd_netlink_message_append_string(message, IFLA_IFNAME, "test-local-addr") >= 0); ASSERT_OK(sd_netlink_message_append_string(message, IFLA_IFNAME, "test-local-addr"));
assert_se(sd_netlink_call(rtnl, message, 0, &reply) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, &reply));
assert_se(sd_rtnl_message_link_get_ifindex(reply, &ifindex) >= 0); ASSERT_OK(sd_rtnl_message_link_get_ifindex(reply, &ifindex));
assert_se(ifindex > 0); ASSERT_GT(ifindex, 0);
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
reply = sd_netlink_message_unref(reply); reply = sd_netlink_message_unref(reply);
/* Enable IPv6 for the case that it is disabled by default. */
ASSERT_OK(sysctl_write_ip_property_boolean(AF_INET6, "test-local-addr", "disable_ipv6", false, /* shadow = */ NULL));
/* Bring the interface up */ /* Bring the interface up */
assert_se(sd_rtnl_message_new_link(rtnl, &message, RTM_SETLINK, ifindex) >= 0); ASSERT_OK(sd_rtnl_message_new_link(rtnl, &message, RTM_SETLINK, ifindex));
assert_se(sd_rtnl_message_link_set_flags(message, IFF_UP, IFF_UP) >= 0); ASSERT_OK(sd_rtnl_message_link_set_flags(message, IFF_UP, IFF_UP));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
/* Add an IPv4 address */ /* Add an IPv4 address */
assert_se(sd_rtnl_message_new_addr_update(rtnl, &message, ifindex, AF_INET) >= 0); ASSERT_OK(sd_rtnl_message_new_addr_update(rtnl, &message, ifindex, AF_INET));
assert_se(sd_rtnl_message_addr_set_scope(message, RT_SCOPE_UNIVERSE) >= 0); ASSERT_OK(sd_rtnl_message_addr_set_scope(message, RT_SCOPE_UNIVERSE));
assert_se(sd_rtnl_message_addr_set_prefixlen(message, 16) >= 0); ASSERT_OK(sd_rtnl_message_addr_set_prefixlen(message, 16));
assert_se(in_addr_from_string(AF_INET, "10.123.123.123", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET, "10.123.123.123", &u));
assert_se(sd_netlink_message_append_in_addr(message, IFA_LOCAL, &u.in) >= 0); ASSERT_OK(sd_netlink_message_append_in_addr(message, IFA_LOCAL, &u.in));
assert_se(in_addr_from_string(AF_INET, "10.123.255.255", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET, "10.123.255.255", &u));
assert_se(sd_netlink_message_append_in_addr(message, IFA_BROADCAST, &u.in) >= 0); ASSERT_OK(sd_netlink_message_append_in_addr(message, IFA_BROADCAST, &u.in));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
/* Add IPv6 addresses */ /* Add IPv6 addresses */
assert_se(sd_rtnl_message_new_addr_update(rtnl, &message, ifindex, AF_INET6) >= 0); ASSERT_OK(sd_rtnl_message_new_addr_update(rtnl, &message, ifindex, AF_INET6));
assert_se(sd_rtnl_message_addr_set_scope(message, RT_SCOPE_UNIVERSE) >= 0); ASSERT_OK(sd_rtnl_message_addr_set_scope(message, RT_SCOPE_UNIVERSE));
assert_se(sd_rtnl_message_addr_set_prefixlen(message, 64) >= 0); ASSERT_OK(sd_rtnl_message_addr_set_prefixlen(message, 64));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:0:123::123", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:0:123::123", &u));
assert_se(sd_netlink_message_append_in6_addr(message, IFA_LOCAL, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, IFA_LOCAL, &u.in6));
assert_se(sd_netlink_message_append_u32(message, IFA_FLAGS, IFA_F_NODAD) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, IFA_FLAGS, IFA_F_NODAD));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
assert_se(sd_rtnl_message_new_addr_update(rtnl, &message, ifindex, AF_INET6) >= 0); ASSERT_OK(sd_rtnl_message_new_addr_update(rtnl, &message, ifindex, AF_INET6));
assert_se(sd_rtnl_message_addr_set_scope(message, RT_SCOPE_UNIVERSE) >= 0); ASSERT_OK(sd_rtnl_message_addr_set_scope(message, RT_SCOPE_UNIVERSE));
assert_se(sd_rtnl_message_addr_set_prefixlen(message, 64) >= 0); ASSERT_OK(sd_rtnl_message_addr_set_prefixlen(message, 64));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::123", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::123", &u));
assert_se(sd_netlink_message_append_in6_addr(message, IFA_LOCAL, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, IFA_LOCAL, &u.in6));
assert_se(sd_netlink_message_append_u32(message, IFA_FLAGS, IFA_F_NODAD) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, IFA_FLAGS, IFA_F_NODAD));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
/* Add an IPv4 default gateway (RTA_GATEWAY) */ /* Add an IPv4 default gateway (RTA_GATEWAY) */
assert_se(sd_rtnl_message_new_route(rtnl, &message, RTM_NEWROUTE, AF_INET, RTPROT_STATIC) >= 0); ASSERT_OK(sd_rtnl_message_new_route(rtnl, &message, RTM_NEWROUTE, AF_INET, RTPROT_STATIC));
assert_se(sd_rtnl_message_route_set_scope(message, RT_SCOPE_UNIVERSE) >= 0); ASSERT_OK(sd_rtnl_message_route_set_scope(message, RT_SCOPE_UNIVERSE));
assert_se(sd_rtnl_message_route_set_type(message, RTN_UNICAST) >= 0); ASSERT_OK(sd_rtnl_message_route_set_type(message, RTN_UNICAST));
assert_se(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234));
assert_se(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN));
assert_se(in_addr_from_string(AF_INET, "10.123.0.1", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET, "10.123.0.1", &u));
assert_se(sd_netlink_message_append_in_addr(message, RTA_GATEWAY, &u.in) >= 0); ASSERT_OK(sd_netlink_message_append_in_addr(message, RTA_GATEWAY, &u.in));
assert_se(sd_netlink_message_append_u32(message, RTA_OIF, ifindex) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_OIF, ifindex));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
/* Add an IPv4 default gateway (RTA_VIA) */ /* Add an IPv4 default gateway (RTA_VIA) */
assert_se(sd_rtnl_message_new_route(rtnl, &message, RTM_NEWROUTE, AF_INET, RTPROT_STATIC) >= 0); ASSERT_OK(sd_rtnl_message_new_route(rtnl, &message, RTM_NEWROUTE, AF_INET, RTPROT_STATIC));
assert_se(sd_rtnl_message_route_set_scope(message, RT_SCOPE_UNIVERSE) >= 0); ASSERT_OK(sd_rtnl_message_route_set_scope(message, RT_SCOPE_UNIVERSE));
assert_se(sd_rtnl_message_route_set_type(message, RTN_UNICAST) >= 0); ASSERT_OK(sd_rtnl_message_route_set_type(message, RTN_UNICAST));
assert_se(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234));
assert_se(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:0:123::1", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:0:123::1", &u));
assert_se(sd_netlink_message_append_data(message, RTA_VIA, ASSERT_OK(sd_netlink_message_append_data(message, RTA_VIA,
&(RouteVia) { &(RouteVia) {
.family = AF_INET6, .family = AF_INET6,
.address = u, .address = u,
}, sizeof(RouteVia)) >= 0); }, sizeof(RouteVia)));
assert_se(sd_netlink_message_append_u32(message, RTA_OIF, ifindex) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_OIF, ifindex));
r = sd_netlink_call(rtnl, message, 0, NULL); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
if (r == -EINVAL)
log_debug_errno(r, "RTA_VIA is not supported, ignoring: %m");
else
assert_se(r >= 0);
support_rta_via = r >= 0;
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
/* Add an IPv6 default gateway */ /* Add an IPv6 default gateway */
assert_se(sd_rtnl_message_new_route(rtnl, &message, RTM_NEWROUTE, AF_INET6, RTPROT_STATIC) >= 0); ASSERT_OK(sd_rtnl_message_new_route(rtnl, &message, RTM_NEWROUTE, AF_INET6, RTPROT_STATIC));
assert_se(sd_rtnl_message_route_set_type(message, RTN_UNICAST) >= 0); ASSERT_OK(sd_rtnl_message_route_set_type(message, RTN_UNICAST));
assert_se(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234));
assert_se(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u));
assert_se(sd_netlink_message_append_in6_addr(message, RTA_GATEWAY, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, RTA_GATEWAY, &u.in6));
assert_se(sd_netlink_message_append_u32(message, RTA_OIF, ifindex) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_OIF, ifindex));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
/* Check */ /* Check */
@@ -320,36 +315,36 @@ TEST(local_addresses_with_dummy) {
check_local_outbounds(rtnl, ifindex, ifindex, AF_INET6, "2001:db8:1:123::123"); check_local_outbounds(rtnl, ifindex, ifindex, AF_INET6, "2001:db8:1:123::123");
/* Add one more IPv6 address. */ /* Add one more IPv6 address. */
assert_se(sd_rtnl_message_new_addr_update(rtnl, &message, ifindex, AF_INET6) >= 0); ASSERT_OK(sd_rtnl_message_new_addr_update(rtnl, &message, ifindex, AF_INET6));
assert_se(sd_rtnl_message_addr_set_scope(message, RT_SCOPE_UNIVERSE) >= 0); ASSERT_OK(sd_rtnl_message_addr_set_scope(message, RT_SCOPE_UNIVERSE));
assert_se(sd_rtnl_message_addr_set_prefixlen(message, 64) >= 0); ASSERT_OK(sd_rtnl_message_addr_set_prefixlen(message, 64));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::124", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::124", &u));
assert_se(sd_netlink_message_append_in6_addr(message, IFA_LOCAL, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, IFA_LOCAL, &u.in6));
assert_se(sd_netlink_message_append_u32(message, IFA_FLAGS, IFA_F_NODAD) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, IFA_FLAGS, IFA_F_NODAD));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
/* Replace the previous IPv6 default gateway with one with preferred source address. */ /* Replace the previous IPv6 default gateway with one with preferred source address. */
assert_se(sd_rtnl_message_new_route(rtnl, &message, RTM_DELROUTE, AF_INET6, RTPROT_STATIC) >= 0); ASSERT_OK(sd_rtnl_message_new_route(rtnl, &message, RTM_DELROUTE, AF_INET6, RTPROT_STATIC));
assert_se(sd_rtnl_message_route_set_type(message, RTN_UNICAST) >= 0); ASSERT_OK(sd_rtnl_message_route_set_type(message, RTN_UNICAST));
assert_se(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234));
assert_se(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u));
assert_se(sd_netlink_message_append_in6_addr(message, RTA_GATEWAY, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, RTA_GATEWAY, &u.in6));
assert_se(sd_netlink_message_append_u32(message, RTA_OIF, ifindex) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_OIF, ifindex));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
assert_se(sd_rtnl_message_new_route(rtnl, &message, RTM_NEWROUTE, AF_INET6, RTPROT_STATIC) >= 0); ASSERT_OK(sd_rtnl_message_new_route(rtnl, &message, RTM_NEWROUTE, AF_INET6, RTPROT_STATIC));
assert_se(sd_rtnl_message_route_set_type(message, RTN_UNICAST) >= 0); ASSERT_OK(sd_rtnl_message_route_set_type(message, RTN_UNICAST));
assert_se(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234));
assert_se(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u));
assert_se(sd_netlink_message_append_in6_addr(message, RTA_GATEWAY, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, RTA_GATEWAY, &u.in6));
assert_se(sd_netlink_message_append_u32(message, RTA_OIF, ifindex) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_OIF, ifindex));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::123", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::123", &u));
assert_se(sd_netlink_message_append_in6_addr(message, RTA_PREFSRC, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, RTA_PREFSRC, &u.in6));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
/* Check again. */ /* Check again. */
@@ -361,28 +356,28 @@ TEST(local_addresses_with_dummy) {
check_local_outbounds(rtnl, ifindex, ifindex, AF_INET6, "2001:db8:1:123::123"); check_local_outbounds(rtnl, ifindex, ifindex, AF_INET6, "2001:db8:1:123::123");
/* Replace the preferred source address. */ /* Replace the preferred source address. */
assert_se(sd_rtnl_message_new_route(rtnl, &message, RTM_DELROUTE, AF_INET6, RTPROT_STATIC) >= 0); ASSERT_OK(sd_rtnl_message_new_route(rtnl, &message, RTM_DELROUTE, AF_INET6, RTPROT_STATIC));
assert_se(sd_rtnl_message_route_set_type(message, RTN_UNICAST) >= 0); ASSERT_OK(sd_rtnl_message_route_set_type(message, RTN_UNICAST));
assert_se(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234));
assert_se(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u));
assert_se(sd_netlink_message_append_in6_addr(message, RTA_GATEWAY, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, RTA_GATEWAY, &u.in6));
assert_se(sd_netlink_message_append_u32(message, RTA_OIF, ifindex) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_OIF, ifindex));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::123", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::123", &u));
assert_se(sd_netlink_message_append_in6_addr(message, RTA_PREFSRC, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, RTA_PREFSRC, &u.in6));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
assert_se(sd_rtnl_message_new_route(rtnl, &message, RTM_NEWROUTE, AF_INET6, RTPROT_STATIC) >= 0); ASSERT_OK(sd_rtnl_message_new_route(rtnl, &message, RTM_NEWROUTE, AF_INET6, RTPROT_STATIC));
assert_se(sd_rtnl_message_route_set_type(message, RTN_UNICAST) >= 0); ASSERT_OK(sd_rtnl_message_route_set_type(message, RTN_UNICAST));
assert_se(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_PRIORITY, 1234));
assert_se(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_TABLE, RT_TABLE_MAIN));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::1", &u));
assert_se(sd_netlink_message_append_in6_addr(message, RTA_GATEWAY, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, RTA_GATEWAY, &u.in6));
assert_se(sd_netlink_message_append_u32(message, RTA_OIF, ifindex) >= 0); ASSERT_OK(sd_netlink_message_append_u32(message, RTA_OIF, ifindex));
assert_se(in_addr_from_string(AF_INET6, "2001:db8:1:123::124", &u) >= 0); ASSERT_OK(in_addr_from_string(AF_INET6, "2001:db8:1:123::124", &u));
assert_se(sd_netlink_message_append_in6_addr(message, RTA_PREFSRC, &u.in6) >= 0); ASSERT_OK(sd_netlink_message_append_in6_addr(message, RTA_PREFSRC, &u.in6));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
/* Check again. */ /* Check again. */
@@ -394,8 +389,8 @@ TEST(local_addresses_with_dummy) {
check_local_outbounds(rtnl, ifindex, ifindex, AF_INET6, "2001:db8:1:123::124"); check_local_outbounds(rtnl, ifindex, ifindex, AF_INET6, "2001:db8:1:123::124");
/* Cleanup */ /* Cleanup */
assert_se(sd_rtnl_message_new_link(rtnl, &message, RTM_DELLINK, ifindex) >= 0); ASSERT_OK(sd_rtnl_message_new_link(rtnl, &message, RTM_DELLINK, ifindex));
assert_se(sd_netlink_call(rtnl, message, 0, NULL) >= 0); ASSERT_OK(sd_netlink_call(rtnl, message, 0, NULL));
message = sd_netlink_message_unref(message); message = sd_netlink_message_unref(message);
} }

View File

@@ -239,17 +239,6 @@ def expectedFailureIfNexthopIsNotAvailable():
return f return f
def expectedFailureIfRTA_VIAIsNotSupported():
def f(func):
call_quiet('ip link add dummy98 type dummy')
call_quiet('ip link set up dev dummy98')
call_quiet('ip route add 2001:1234:5:8fff:ff:ff:ff:fe/128 dev dummy98')
rc = call_quiet('ip route add 10.10.10.10 via inet6 2001:1234:5:8fff:ff:ff:ff:fe dev dummy98')
remove_link('dummy98')
return func if rc == 0 else unittest.expectedFailure(func)
return f
def expectedFailureIfAlternativeNameIsNotAvailable(): def expectedFailureIfAlternativeNameIsNotAvailable():
def f(func): def f(func):
call_quiet('ip link add dummy98 type dummy') call_quiet('ip link add dummy98 type dummy')
@@ -4510,7 +4499,6 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
self.assertRegex(output, 'local fe80:[a-f0-9:]* table local proto kernel metric 0 pref medium', output) self.assertRegex(output, 'local fe80:[a-f0-9:]* table local proto kernel metric 0 pref medium', output)
self.assertIn('multicast ff00::/8 table local proto kernel metric 256 pref medium', output) self.assertIn('multicast ff00::/8 table local proto kernel metric 256 pref medium', output)
@expectedFailureIfRTA_VIAIsNotSupported()
def test_route_via_ipv6(self): def test_route_via_ipv6(self):
copy_network_unit('25-route-via-ipv6.network', '12-dummy.netdev') copy_network_unit('25-route-via-ipv6.network', '12-dummy.netdev')
start_networkd() start_networkd()