[systemd-commits] 3 commits - src/libsystemd src/network

Patrik Flykt pflykt at kemper.freedesktop.org
Fri Mar 27 04:58:38 PDT 2015


 src/libsystemd/sd-rtnl/rtnl-types.c |    2 -
 src/network/networkd-address.c      |   20 ++++++++++++++-
 src/network/networkd-dhcp6.c        |   46 +++---------------------------------
 src/network/networkd-link.c         |    4 ++-
 src/network/networkd.h              |    2 -
 5 files changed, 26 insertions(+), 48 deletions(-)

New commits:
commit 47d45d3cde45d6545367570264e4e3636bc9e345
Author: Patrik Flykt <patrik.flykt at linux.intel.com>
Date:   Wed Mar 25 13:22:43 2015 +0200

    networkd-dhcp6: Do not handle prefix expiry
    
    Expiring prefixes need not be handled anymore as the kernel has been
    instructed not to create routes for DHCPv6 assigned addresses via the
    IFA_F_NOPREFIXROUTE flag.

diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c
index 283a7d6..e863f4b 100644
--- a/src/network/networkd-dhcp6.c
+++ b/src/network/networkd-dhcp6.c
@@ -86,42 +86,6 @@ static int dhcp6_address_update(Link *link, struct in6_addr *ip6_addr,
         return r;
 }
 
-static int dhcp6_prefix_expired(Link *link) {
-        int r;
-        sd_dhcp6_lease *lease;
-        struct in6_addr *expired_prefix, ip6_addr;
-        uint8_t expired_prefixlen;
-        uint32_t lifetime_preferred, lifetime_valid;
-
-        r = sd_icmp6_ra_get_expired_prefix(link->icmp6_router_discovery,
-                                        &expired_prefix, &expired_prefixlen);
-        if (r < 0)
-                return r;
-
-        r = sd_dhcp6_client_get_lease(link->dhcp6_client, &lease);
-        if (r < 0)
-                return r;
-
-        sd_dhcp6_lease_reset_address_iter(lease);
-
-        while (sd_dhcp6_lease_get_address(lease, &ip6_addr,
-                                                &lifetime_preferred,
-                                                &lifetime_valid) >= 0) {
-
-                r = sd_icmp6_prefix_match(expired_prefix, expired_prefixlen,
-                                        &ip6_addr);
-                if (r >= 0) {
-                        r = dhcp6_address_update(link, &ip6_addr, 128,
-                                                lifetime_preferred,
-                                                lifetime_valid);
-
-                        return r;
-                }
-        }
-
-        return 0;
-}
-
 static int dhcp6_lease_address_acquired(sd_dhcp6_client *client, Link *link) {
         int r;
         sd_dhcp6_lease *lease;
@@ -310,6 +274,7 @@ static void icmp6_router_handler(sd_icmp6_nd *nd, int event, void *userdata) {
 
         switch(event) {
         case ICMP6_EVENT_ROUTER_ADVERTISMENT_NONE:
+        case ICMP6_EVENT_ROUTER_ADVERTISMENT_PREFIX_EXPIRED:
                 return;
 
         case ICMP6_EVENT_ROUTER_ADVERTISMENT_TIMEOUT:
@@ -319,11 +284,6 @@ static void icmp6_router_handler(sd_icmp6_nd *nd, int event, void *userdata) {
 
                 break;
 
-        case ICMP6_EVENT_ROUTER_ADVERTISMENT_PREFIX_EXPIRED:
-                dhcp6_prefix_expired(link);
-
-                break;
-
         default:
                 if (event < 0)
                         log_link_warning(link, "ICMPv6 error: %s",

commit 851c9f82736c89d423b244a292e153ec7124d309
Author: Patrik Flykt <patrik.flykt at linux.intel.com>
Date:   Mon Feb 2 13:13:17 2015 +0200

    systemd-networkd: Use IFA_F_NOPREFIXROUTE with IPv6 addresses
    
    The IFA_F_NOPREFIXROUTE flag prevents the kernel from creating new onlink
    prefixes when a DHCPv6 IPv6 address with a prefix length is set from user
    space. IPv6 routing will follow the onlink status from Router Advertisment
    Prefix Information options or any manually set route, which is the correct
    thing to do.
    
    As this flag has a larger value than what fits into an unsigned char, update
    the flag attribute to an uint32_t and set it with an IFA_FLAGS attribute
    when writing netlink messages to the kernel.

diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c
index 255ff77..85acc49 100644
--- a/src/network/networkd-address.c
+++ b/src/network/networkd-address.c
@@ -209,10 +209,18 @@ int address_update(Address *address, Link *link,
         if (r < 0)
                 return log_error_errno(r, "Could not set prefixlen: %m");
 
-        r = sd_rtnl_message_addr_set_flags(req, IFA_F_PERMANENT);
+        address->flags |= IFA_F_PERMANENT;
+
+        r = sd_rtnl_message_addr_set_flags(req, address->flags & 0xff);
         if (r < 0)
                 return log_error_errno(r, "Could not set flags: %m");
 
+        if (address->flags & ~0xff) {
+                r = sd_rtnl_message_append_u32(req, IFA_FLAGS, address->flags);
+                if (r < 0)
+                        return log_error_errno(r, "Could not set extended flags: %m");
+        }
+
         r = sd_rtnl_message_addr_set_scope(req, address->scope);
         if (r < 0)
                 return log_error_errno(r, "Could not set scope: %m");
@@ -335,10 +343,18 @@ int address_configure(Address *address, Link *link,
         if (r < 0)
                 return log_error_errno(r, "Could not set prefixlen: %m");
 
-        r = sd_rtnl_message_addr_set_flags(req, IFA_F_PERMANENT);
+        address->flags |= IFA_F_PERMANENT;
+
+        r = sd_rtnl_message_addr_set_flags(req, (address->flags & 0xff));
         if (r < 0)
                 return log_error_errno(r, "Could not set flags: %m");
 
+        if (address->flags & ~0xff) {
+                r = sd_rtnl_message_append_u32(req, IFA_FLAGS, address->flags);
+                if (r < 0)
+                        return log_error_errno(r, "Could not set extended flags: %m");
+        }
+
         r = sd_rtnl_message_addr_set_scope(req, address->scope);
         if (r < 0)
                 return log_error_errno(r, "Could not set scope: %m");
diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c
index bcfad4c..283a7d6 100644
--- a/src/network/networkd-dhcp6.c
+++ b/src/network/networkd-dhcp6.c
@@ -65,7 +65,9 @@ static int dhcp6_address_update(Link *link, struct in6_addr *ip6_addr,
 
         addr->family = AF_INET6;
         memcpy(&addr->in_addr.in6, ip6_addr, sizeof(*ip6_addr));
-        addr->prefixlen = prefixlen;
+
+        addr->flags = IFA_F_NOPREFIXROUTE;
+        addr->prefixlen = 64;
 
         addr->cinfo.ifa_prefered = lifetime_preferred;
         addr->cinfo.ifa_valid = lifetime_valid;
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 842ca1c..437c598 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -1831,6 +1831,7 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *use
         Link *link = NULL;
         uint16_t type;
         _cleanup_address_free_ Address *address = NULL;
+        unsigned char flags;
         Address *existing;
         char buf[INET6_ADDRSTRLEN], valid_buf[FORMAT_TIMESPAN_MAX];
         const char *valid_str = NULL;
@@ -1894,11 +1895,12 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *use
                 return 0;
         }
 
-        r = sd_rtnl_message_addr_get_flags(message, &address->flags);
+        r = sd_rtnl_message_addr_get_flags(message, &flags);
         if (r < 0) {
                 log_link_warning(link, "rtnl: received address with invalid flags, ignoring");
                 return 0;
         }
+        address->flags = flags;
 
         switch (address->family) {
         case AF_INET:
diff --git a/src/network/networkd.h b/src/network/networkd.h
index 8bdc2be..c26d64e 100644
--- a/src/network/networkd.h
+++ b/src/network/networkd.h
@@ -173,7 +173,7 @@ struct Address {
         int family;
         unsigned char prefixlen;
         unsigned char scope;
-        unsigned char flags;
+        uint32_t flags;
         char *label;
 
         struct in_addr broadcast;

commit 350e7a14dd66d79cbc94f4b49b6a58ccb8a4d1c1
Author: Patrik Flykt <patrik.flykt at linux.intel.com>
Date:   Wed Mar 25 13:19:21 2015 +0200

    sd-rtnl: Always enable IFA_FLAGS
    
    IFA_FLAGS is a discrete value and has no preprocessor #define defined for
    it. Fix this by always using the value.

diff --git a/src/libsystemd/sd-rtnl/rtnl-types.c b/src/libsystemd/sd-rtnl/rtnl-types.c
index bf7278f..5ae4790 100644
--- a/src/libsystemd/sd-rtnl/rtnl-types.c
+++ b/src/libsystemd/sd-rtnl/rtnl-types.c
@@ -358,9 +358,7 @@ static const NLType rtnl_address_types[IFA_MAX + 1] = {
         [IFA_ANYCAST],
         [IFA_MULTICAST],
 */
-#ifdef IFA_FLAGS
         [IFA_FLAGS]             = { .type = NLA_U32 },
-#endif
 };
 
 static const NLTypeSystem rtnl_address_type_system = {



More information about the systemd-commits mailing list