network: read link specific sysctl value
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 14 Jun 2019 00:42:51 +0000 (09:42 +0900)
committerMichael Biebl <biebl@debian.org>
Thu, 18 Jul 2019 17:38:23 +0000 (18:38 +0100)
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
src/network/networkd-link.c
src/network/networkd-link.h
src/network/networkd-manager.c
src/network/networkd-manager.h
src/network/networkd-route.c
src/network/networkd-routing-policy-rule.c

index a9f65e52b74e3f13ecb90c9edba09f1cc85b81e2..e0ee896383dd325cfc16fb226d084f838434c068 100644 (file)
@@ -565,7 +565,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;
         }
index 13852af7043cc85634891107692a4b4765a6a568..3cfdf4ab01aa06ac8ae82555c2cf4070008567d0 100644 (file)
@@ -28,6 +28,7 @@
 #include "stdio-util.h"
 #include "string-table.h"
 #include "strv.h"
+#include "sysctl-util.h"
 #include "tmpfile-util.h"
 #include "util.h"
 #include "virt.h"
@@ -39,6 +40,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);
 
@@ -51,7 +66,7 @@ static bool link_dhcp6_enabled(Link *link) {
         if (!link->network)
                 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;
@@ -111,7 +126,7 @@ static bool link_ipv6ll_enabled(Link *link) {
         if (streq_ptr(link->kind, "wireguard"))
                 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;
@@ -126,7 +141,7 @@ static bool link_ipv6_enabled(Link *link) {
         if (link->network->bridge)
                 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. */
@@ -208,7 +223,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;
@@ -476,6 +491,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);
index dcb1ea68dd987ae5ad170dbdc298edb38a2bdb73..6adea64f62ae09613cf2d463a65c8d50fb98e4c8 100644 (file)
@@ -128,6 +128,8 @@ typedef struct Link {
 
         Hashmap *bound_by_links;
         Hashmap *bound_to_links;
+
+        int sysctl_ipv6_enabled;
 } Link;
 
 typedef int (*link_netlink_message_handler_t)(sd_netlink*, sd_netlink_message*, Link*);
@@ -209,6 +211,8 @@ int link_send_changed(Link *link, const char *property, ...) _sentinel_;
 #define LOG_LINK_MESSAGE(link, fmt, ...) "MESSAGE=%s: " fmt, (link)->ifname, ##__VA_ARGS__
 #define LOG_LINK_INTERFACE(link) "INTERFACE=%s", (link)->ifname
 
+int link_sysctl_ipv6_enabled(Link *link);
+
 #define ADDRESS_FMT_VAL(address)                   \
         be32toh((address).s_addr) >> 24,           \
         (be32toh((address).s_addr) >> 16) & 0xFFu, \
index f32bc7f3bcf51edd25e6ce037daccfd387657e0a..acb9a7540502fc0cff2e2f67ca4ecd49367c50b0 100644 (file)
@@ -1361,8 +1361,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;
@@ -1861,18 +1859,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;
-}
index d292d76b361c737d94798e008a821412b3d31d52..289ca962165aa200818459247827dff4d8e7a78d 100644 (file)
@@ -58,8 +58,6 @@ struct Manager {
         Set *rules;
         Set *rules_foreign;
         Set *rules_saved;
-
-        int sysctl_ipv6_enabled;
 };
 
 extern const sd_bus_vtable manager_vtable[];
@@ -97,6 +95,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);
index 5b7e0197f40ab303829cfb58a28ad678e51650ee..67b0ab435c85d06f723810ca8c28a5013c048424 100644 (file)
@@ -509,7 +509,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;
         }
index 0b62a0e638f186e710ee60d7e056f76c25ea2dad..2378ed27225404f15d5682c50e3825869f74e4cb 100644 (file)
@@ -492,7 +492,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;
         }