From ca1196b60c3263604e8534d8088abf97afe6a644 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 14 Jun 2019 09:42:51 +0900 Subject: [PATCH] network: read link specific sysctl value This introduce link_sysctl_ipv6_enabled() and replaces manager_sysctl_ipv6_enabled() with it. (cherry picked from commit bafa9641446852f7fa15ca12d08a223d345c78ea) Gbp-Pq: Name network-read-link-specific-sysctl-value.patch --- src/network/networkd-address.c | 2 +- src/network/networkd-link.c | 23 ++++++++++++++++++---- src/network/networkd-link.h | 4 ++++ src/network/networkd-manager.c | 17 ---------------- src/network/networkd-manager.h | 4 ---- src/network/networkd-route.c | 2 +- src/network/networkd-routing-policy-rule.c | 2 +- 7 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index bf8f6ab5..40da62fb 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -566,7 +566,7 @@ int address_configure( assert(link->manager->rtnl); assert(callback); - if (address->family == AF_INET6 && manager_sysctl_ipv6_enabled(link->manager) == 0) { + if (address->family == AF_INET6 && link_sysctl_ipv6_enabled(link) == 0) { log_link_warning(link, "An IPv6 address is requested, but IPv6 is disabled by sysctl, ignoring."); return 0; } diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 91c828e8..e3d4efbd 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -60,6 +60,20 @@ DUID* link_get_duid(Link *link) { return &link->manager->duid; } +int link_sysctl_ipv6_enabled(Link *link) { + _cleanup_free_ char *value = NULL; + int r; + + r = sysctl_read_ip_property(AF_INET6, link->ifname, "disable_ipv6", &value); + if (r < 0) + return log_link_warning_errno(link, r, + "Failed to read net.ipv6.conf.%s.disable_ipv6 sysctl property: %m", + link->ifname); + + link->sysctl_ipv6_enabled = value[0] == '0'; + return link->sysctl_ipv6_enabled; +} + static bool link_dhcp6_enabled(Link *link) { assert(link); @@ -75,7 +89,7 @@ static bool link_dhcp6_enabled(Link *link) { if (link->network->bond) return false; - if (manager_sysctl_ipv6_enabled(link->manager) == 0) + if (link_sysctl_ipv6_enabled(link) == 0) return false; return link->network->dhcp & ADDRESS_FAMILY_IPV6; @@ -147,7 +161,7 @@ static bool link_ipv6ll_enabled(Link *link) { if (link->network->bond) return false; - if (manager_sysctl_ipv6_enabled(link->manager) == 0) + if (link_sysctl_ipv6_enabled(link) == 0) return false; return link->network->link_local & ADDRESS_FAMILY_IPV6; @@ -162,7 +176,7 @@ static bool link_ipv6_enabled(Link *link) { if (link->network->bond) return false; - if (manager_sysctl_ipv6_enabled(link->manager) == 0) + if (link_sysctl_ipv6_enabled(link) == 0) return false; /* DHCPv6 client will not be started if no IPv6 link-local address is configured. */ @@ -244,7 +258,7 @@ static bool link_ipv6_forward_enabled(Link *link) { if (link->network->ip_forward == _ADDRESS_FAMILY_BOOLEAN_INVALID) return false; - if (manager_sysctl_ipv6_enabled(link->manager) == 0) + if (link_sysctl_ipv6_enabled(link) == 0) return false; return link->network->ip_forward & ADDRESS_FAMILY_IPV6; @@ -560,6 +574,7 @@ static int link_new(Manager *manager, sd_netlink_message *message, Link **ret) { .rtnl_extended_attrs = true, .ifindex = ifindex, .iftype = iftype, + .sysctl_ipv6_enabled = -1, }; link->ifname = strdup(ifname); diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index e65246c8..f2e53cc5 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -122,6 +122,8 @@ typedef struct Link { Hashmap *bound_by_links; Hashmap *bound_to_links; Hashmap *slaves; + + int sysctl_ipv6_enabled; } Link; typedef int (*link_netlink_message_handler_t)(sd_netlink*, sd_netlink_message*, Link*); @@ -180,6 +182,8 @@ uint32_t link_get_vrf_table(Link *link); uint32_t link_get_dhcp_route_table(Link *link); uint32_t link_get_ipv6_accept_ra_route_table(Link *link); +int link_sysctl_ipv6_enabled(Link *link); + #define ADDRESS_FMT_VAL(address) \ be32toh((address).s_addr) >> 24, \ (be32toh((address).s_addr) >> 16) & 0xFFu, \ diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 9075b0a1..05107da8 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -1378,8 +1378,6 @@ int manager_new(Manager **ret) { if (!m->state_file) return -ENOMEM; - m->sysctl_ipv6_enabled = -1; - r = sd_event_default(&m->event); if (r < 0) return r; @@ -1878,18 +1876,3 @@ int manager_request_product_uuid(Manager *m, Link *link) { return 0; } - -int manager_sysctl_ipv6_enabled(Manager *manager) { - _cleanup_free_ char *value = NULL; - int r; - - if (manager->sysctl_ipv6_enabled >= 0) - return manager->sysctl_ipv6_enabled; - - r = sysctl_read_ip_property(AF_INET6, "all", "disable_ipv6", &value); - if (r < 0) - return log_warning_errno(r, "Failed to read net.ipv6.conf.all.disable_ipv6 sysctl property: %m"); - - manager->sysctl_ipv6_enabled = value[0] == '0'; - return manager->sysctl_ipv6_enabled; -} diff --git a/src/network/networkd-manager.h b/src/network/networkd-manager.h index 35ab6bed..33f80bf1 100644 --- a/src/network/networkd-manager.h +++ b/src/network/networkd-manager.h @@ -56,8 +56,6 @@ struct Manager { Set *rules; Set *rules_foreign; Set *rules_saved; - - int sysctl_ipv6_enabled; }; extern const sd_bus_vtable manager_vtable[]; @@ -95,6 +93,4 @@ Link *manager_dhcp6_prefix_get(Manager *m, struct in6_addr *addr); int manager_dhcp6_prefix_add(Manager *m, struct in6_addr *addr, Link *link); int manager_dhcp6_prefix_remove_all(Manager *m, Link *link); -int manager_sysctl_ipv6_enabled(Manager *manager); - DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_free); diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 56a9c82e..ae56402c 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -498,7 +498,7 @@ int route_configure( assert(IN_SET(route->family, AF_INET, AF_INET6)); assert(callback); - if (route->family == AF_INET6 && manager_sysctl_ipv6_enabled(link->manager) == 0) { + if (route->family == AF_INET6 && link_sysctl_ipv6_enabled(link) == 0) { log_link_warning(link, "An IPv6 route is requested, but IPv6 is disabled by sysctl, ignoring."); return 0; } diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index d2b6f10d..5ac8718a 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -484,7 +484,7 @@ int routing_policy_rule_configure(RoutingPolicyRule *rule, Link *link, link_netl assert(link->manager); assert(link->manager->rtnl); - if (rule->family == AF_INET6 && manager_sysctl_ipv6_enabled(link->manager) == 0) { + if (rule->family == AF_INET6 && link_sysctl_ipv6_enabled(link) == 0) { log_link_warning(link, "An IPv6 routing policy rule is requested, but IPv6 is disabled by sysctl, ignoring."); return 0; } -- 2.30.2