]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
networkd: add support for configure IPv6 DAD
authorSusant Sahani <ssahani@gmail.com>
Mon, 12 Oct 2015 09:01:10 +0000 (14:31 +0530)
committerSusant Sahani <ssahani@gmail.com>
Fri, 16 Oct 2015 05:23:20 +0000 (10:53 +0530)
Configures Ipv6 Duplicate Address Detection.

10

src/network/networkd-link.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h

index f6cc1f8ee2d69c04e0314a6e022a32b3d6ed07ec..9d97089576c75e2d55f074544a7a5a1d8b8fafce 100644 (file)
@@ -1850,6 +1850,37 @@ static int link_set_ipv6_accept_ra(Link *link) {
         return 0;
 }
 
+static int link_set_ipv6_dad_transmits(Link *link) {
+        char buf[DECIMAL_STR_MAX(unsigned) + 1];
+        const char *p = NULL;
+        int r;
+
+        /* Make this a NOP if IPv6 is not available */
+        if (!socket_ipv6_is_supported())
+                return 0;
+
+        if (link->flags & IFF_LOOPBACK)
+                return 0;
+
+        if (link->network->ipv6_dad_transmits < 0)
+                return 0;
+
+        p = strjoina("/proc/sys/net/ipv6/conf/", link->ifname, "/dad_transmits");
+
+        xsprintf(buf, "%u", link->network->ipv6_dad_transmits);
+
+        r = write_string_file(p, buf, 0);
+        if (r < 0) {
+                /* If the right value is set anyway, don't complain */
+                if (verify_one_line_file(p, buf) > 0)
+                        return 0;
+
+                log_link_warning_errno(link, r, "Cannot set IPv6 dad transmits for interface: %m");
+        }
+
+        return 0;
+}
+
 static int link_configure(Link *link) {
         int r;
 
@@ -1877,6 +1908,10 @@ static int link_configure(Link *link) {
         if (r < 0)
                 return r;
 
+        r = link_set_ipv6_dad_transmits(link);
+        if (r < 0)
+                return r;
+
         if (link_ipv4ll_enabled(link)) {
                 r = ipv4ll_configure(link);
                 if (r < 0)
index b6f70e191dee7056f0d475f1ada4a7928c587160..cc01dc24c9565e41b76119272245af4af3a647e2 100644 (file)
@@ -51,6 +51,7 @@ Network.IPForward,                      config_parse_address_family_boolean_with
 Network.IPMasquerade,                   config_parse_bool,                              0,                             offsetof(Network, ip_masquerade)
 Network.IPv6PrivacyExtensions,          config_parse_ipv6_privacy_extensions,           0,                             offsetof(Network, ipv6_privacy_extensions)
 Network.IPv6AcceptRouterAdvertisements, config_parse_tristate,                          0,                             offsetof(Network, ipv6_accept_ra)
+Network.IPv6DuplicateAddressDetection,  config_parse_int,                               0,                             offsetof(Network, ipv6_dad_transmits)
 Network.BindCarrier,                    config_parse_strv,                              0,                             offsetof(Network, bind_carrier)
 Address.Address,                        config_parse_address,                           0,                             0
 Address.Peer,                           config_parse_address,                           0,                             0
index bdee7f1923897f587479dcdf4ddcd6b0ffaf944f..5b8ca305bc6225db4ed75066b829524f5ff80e84 100644 (file)
@@ -121,6 +121,7 @@ static int network_load_one(Manager *manager, const char *filename) {
 
         network->ipv6_privacy_extensions = IPV6_PRIVACY_EXTENSIONS_NO;
         network->ipv6_accept_ra = -1;
+        network->ipv6_dad_transmits = -1;
 
         r = config_parse(NULL, filename, file,
                          "Match\0"
index 2a43b6b347e0bbceed605e0b3a2edea5733ecb03..c2872908b5b7daa7fea073694e3682afe02b454d 100644 (file)
@@ -121,6 +121,7 @@ struct Network {
         bool ip_masquerade;
 
         int ipv6_accept_ra;
+        int ipv6_dad_transmits;
 
         union in_addr_union ipv6_token;
         IPv6PrivacyExtensions ipv6_privacy_extensions;