From 93e583aaba6f50fbd24aca71189a80fd77277edf Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 6 Nov 2023 15:28:12 +0900 Subject: [PATCH 1/3] Revert "ndisc: Also set link hoplimit" This reverts commit 0ba8374bb8a7032ca13ba98d10e8d7c3378ca9c6. - link->network->ipv6_hop_limit must not be updated, as it may be used by multiple interfaces, - We may receive multiple RA from multiple routers with different hop limit, and we should not make the default hop limit flicking, - First of all, there is no reason that we need to update the default hop limit, - The original issue should be caused by the hash and compare functions for Route object. --- src/network/networkd-ndisc.c | 7 +------ src/network/networkd-sysctl.c | 2 +- src/network/networkd-sysctl.h | 1 - 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index f4f662cf965..08af9c73b99 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -199,12 +199,7 @@ static int ndisc_request_route(Route *in, Link *link, sd_ndisc_router *rt) { r = sd_ndisc_router_get_hop_limit(rt, &hop_limit); if (r < 0 && r != -ENODATA) return log_link_warning_errno(link, r, "Failed to get default router hop limit from RA: %m"); - - link->network->ipv6_hop_limit = hop_limit; - r = link_set_ipv6_hop_limit(link); - if (r < 0) - log_link_warning_errno(link, r, "Cannot set IPv6 hop limit for interface, ignoring: %m"); - } + } route->source = NETWORK_CONFIG_SOURCE_NDISC; route->provider.in6 = router; diff --git a/src/network/networkd-sysctl.c b/src/network/networkd-sysctl.c index 1a5dffe6f59..0b8169a0176 100644 --- a/src/network/networkd-sysctl.c +++ b/src/network/networkd-sysctl.c @@ -165,7 +165,7 @@ static int link_set_ipv6_dad_transmits(Link *link) { return sysctl_write_ip_property_int(AF_INET6, link->ifname, "dad_transmits", link->network->ipv6_dad_transmits); } -int link_set_ipv6_hop_limit(Link *link) { +static int link_set_ipv6_hop_limit(Link *link) { assert(link); /* Make this a NOP if IPv6 is not available */ diff --git a/src/network/networkd-sysctl.h b/src/network/networkd-sysctl.h index 99243f7a25d..064438462c0 100644 --- a/src/network/networkd-sysctl.h +++ b/src/network/networkd-sysctl.h @@ -28,7 +28,6 @@ typedef enum IPReversePathFilter { int link_set_sysctl(Link *link); int link_set_ipv6_mtu(Link *link); -int link_set_ipv6_hop_limit(Link *link); const char* ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions i) _const_; IPv6PrivacyExtensions ipv6_privacy_extensions_from_string(const char *s) _pure_; From 39713b075ff4f190715c6c1dad34cc461e2afb6c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 6 Nov 2023 15:42:53 +0900 Subject: [PATCH 2/3] network: fix indentation Follow-up for f141b2c053527cdf2500dae5cd4f470ed964b436. --- src/network/networkd-ndisc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 08af9c73b99..ab9eeb13a5d 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -195,7 +195,7 @@ static int ndisc_request_route(Route *in, Link *link, sd_ndisc_router *rt) { return log_link_warning_errno(link, r, "Failed to get default router MTU from RA: %m"); } - if (link->network->ipv6_accept_ra_use_hop_limit) { + if (link->network->ipv6_accept_ra_use_hop_limit) { r = sd_ndisc_router_get_hop_limit(rt, &hop_limit); if (r < 0 && r != -ENODATA) return log_link_warning_errno(link, r, "Failed to get default router hop limit from RA: %m"); @@ -212,7 +212,6 @@ static int ndisc_request_route(Route *in, Link *link, sd_ndisc_router *rt) { route->quickack = link->network->ipv6_accept_ra_quickack; if (route->mtu == 0) route->mtu = mtu; - if (route->hop_limit == 0) route->hop_limit = hop_limit; From 986e182352a70328fb0cb9c451d263c5aeb9715a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 6 Nov 2023 15:46:39 +0900 Subject: [PATCH 3/3] network: do not try to set invalid value for IPv6 hop limit --- man/systemd.network.xml | 6 +++--- src/network/networkd-network-gperf.gperf | 2 +- src/network/networkd-network.c | 1 - src/network/networkd-network.h | 2 +- src/network/networkd-sysctl.c | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/man/systemd.network.xml b/man/systemd.network.xml index ece60926c7e..f065cfcafa7 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -864,9 +864,9 @@ Table=1234 IPv6HopLimit= - Configures IPv6 Hop Limit. For each router that forwards the packet, the hop limit is - decremented by 1. When the hop limit field reaches zero, the packet is discarded. When unset, - the kernel's default will be used. + Configures IPv6 Hop Limit. Takes an integer in the range 1…255. For each router that + forwards the packet, the hop limit is decremented by 1. When the hop limit field reaches zero, the + packet is discarded. When unset, the kernel's default will be used. diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 6323f6b2128..080f72dc2cd 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -130,7 +130,7 @@ Network.IPv6PrivacyExtensions, config_parse_ipv6_privacy_extension Network.IPv6AcceptRA, config_parse_tristate, 0, offsetof(Network, ipv6_accept_ra) Network.IPv6AcceptRouterAdvertisements, config_parse_tristate, 0, offsetof(Network, ipv6_accept_ra) Network.IPv6DuplicateAddressDetection, config_parse_int, 0, offsetof(Network, ipv6_dad_transmits) -Network.IPv6HopLimit, config_parse_int, 0, offsetof(Network, ipv6_hop_limit) +Network.IPv6HopLimit, config_parse_uint8, 0, offsetof(Network, ipv6_hop_limit) Network.IPv6ProxyNDP, config_parse_tristate, 0, offsetof(Network, ipv6_proxy_ndp) Network.IPv6MTUBytes, config_parse_mtu, AF_INET6, offsetof(Network, ipv6_mtu) Network.IPv4AcceptLocal, config_parse_tristate, 0, offsetof(Network, ipv4_accept_local) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 9ef28d283b7..fbda52f8f31 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -466,7 +466,6 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi .ipv4_route_localnet = -1, .ipv6_privacy_extensions = _IPV6_PRIVACY_EXTENSIONS_INVALID, .ipv6_dad_transmits = -1, - .ipv6_hop_limit = -1, .ipv6_proxy_ndp = -1, .proxy_arp = -1, .ipv4_rp_filter = _IP_REVERSE_PATH_FILTER_INVALID, diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index 00a6b50310f..021e7f9182b 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -323,7 +323,7 @@ struct Network { int ipv4_accept_local; int ipv4_route_localnet; int ipv6_dad_transmits; - int ipv6_hop_limit; + uint8_t ipv6_hop_limit; int proxy_arp; uint32_t ipv6_mtu; IPv6PrivacyExtensions ipv6_privacy_extensions; diff --git a/src/network/networkd-sysctl.c b/src/network/networkd-sysctl.c index 0b8169a0176..2ac6c3527bc 100644 --- a/src/network/networkd-sysctl.c +++ b/src/network/networkd-sysctl.c @@ -178,7 +178,7 @@ static int link_set_ipv6_hop_limit(Link *link) { if (!link->network) return 0; - if (link->network->ipv6_hop_limit < 0) + if (link->network->ipv6_hop_limit <= 0) return 0; return sysctl_write_ip_property_int(AF_INET6, link->ifname, "hop_limit", link->network->ipv6_hop_limit);