ip6: pad RDNSS and DNSSL lifetimes to a minimum lifetime value (rh #60055)
[NetworkManager.git] / src / ip6-manager / nm-ip6-manager.c
index f5e66bd..8f05ddc 100644 (file)
@@ -598,11 +598,12 @@ dump_address_change (NMIP6Device *device, struct nlmsghdr *hdr, struct rtnl_addr
 {
        char *event;
        struct nl_addr *addr;
-       char addr_str[40];
+       char addr_str[40] = "none";
 
        event = hdr->nlmsg_type == RTM_NEWADDR ? "new" : "lost";
        addr = rtnl_addr_get_local (rtnladdr);
-       nl_addr2str (addr, addr_str, 40);
+       if (addr)
+               nl_addr2str (addr, addr_str, 40);
 
        nm_log_dbg (LOGD_IP6, "(%s) %s address: %s", device_get_iface (device), event, addr_str);
 }
@@ -612,15 +613,17 @@ dump_route_change (NMIP6Device *device, struct nlmsghdr *hdr, struct rtnl_route
 {
        char *event;
        struct nl_addr *dst;
-       char dst_str[40];
+       char dst_str[40] = "none";
        struct nl_addr *gateway;
-       char gateway_str[40];
+       char gateway_str[40] = "none";
 
        event = hdr->nlmsg_type == RTM_NEWROUTE ? "new" : "lost";
        dst = rtnl_route_get_dst (rtnlroute);
        gateway = rtnl_route_get_gateway (rtnlroute);
-       nl_addr2str (dst, dst_str, 40);
-       nl_addr2str (gateway, gateway_str, 40);
+       if (dst)
+               nl_addr2str (dst, dst_str, 40);
+       if (gateway)
+               nl_addr2str (gateway, gateway_str, 40);
 
        nm_log_dbg (LOGD_IP6, "(%s) %s route: %s via %s",device_get_iface (device), event, dst_str, gateway_str);
 }
@@ -643,11 +646,6 @@ process_address_change (NMIP6Manager *manager, struct nl_msg *msg)
        }
 
        device = nm_ip6_manager_get_device (manager, rtnl_addr_get_ifindex (rtnladdr));
-       if (!device) {
-               nm_log_dbg (LOGD_IP6, "ignoring message for unknown device");
-               rtnl_addr_put (rtnladdr);
-               return NULL;
-       }
 
        old_size = nl_cache_nitems (priv->addr_cache);
        nl_cache_include (priv->addr_cache, (struct nl_object *)rtnladdr, NULL, NULL);
@@ -684,11 +682,6 @@ process_route_change (NMIP6Manager *manager, struct nl_msg *msg)
        }
 
        device = nm_ip6_manager_get_device (manager, rtnl_route_get_oif (rtnlroute));
-       if (!device) {
-               nm_log_dbg (LOGD_IP6, "ignoring message for unknown device");
-               rtnl_route_put (rtnlroute);
-               return NULL;
-       }
 
        old_size = nl_cache_nitems (priv->route_cache);
        nl_cache_include (priv->route_cache, (struct nl_object *)rtnlroute, NULL, NULL);
@@ -755,7 +748,9 @@ process_nduseropt_rdnss (NMIP6Device *device, struct nd_opt_hdr *opt)
         */
        server.expires = ntohl (rdnss_opt->nd_opt_rdnss_lifetime);
        if (server.expires > 0)
-               server.expires += now + 10;
+               if (server.expires < 7200)
+                       server.expires = 7200;
+               server.expires += now;
 
        for (addr = (struct in6_addr *) (rdnss_opt + 1); opt_len >= 2; addr++, opt_len -= 2) {
                char buf[INET6_ADDRSTRLEN + 1];
@@ -886,7 +881,9 @@ process_nduseropt_dnssl (NMIP6Device *device, struct nd_opt_hdr *opt)
         */
        domain.expires = ntohl (dnssl_opt->nd_opt_dnssl_lifetime);
        if (domain.expires > 0)
-               domain.expires += now + 10;
+               if (domain.expires < 7200)
+                       domain.expires = 7200;
+               domain.expires += now;
 
        while (opt_len) {
                const char *domain_str;
@@ -1277,8 +1274,6 @@ nm_ip6_manager_get_ip6_config (NMIP6Manager *manager, int ifindex)
        struct rtnl_route *rtnlroute;
        struct nl_addr *nldest, *nlgateway;
        struct in6_addr *dest, *gateway;
-       gboolean defgw_set = FALSE;
-       struct in6_addr defgw;
        uint32_t metric;
        NMIP6Route *ip6route;
        int i;
@@ -1329,9 +1324,8 @@ nm_ip6_manager_get_ip6_config (NMIP6Manager *manager, int ifindex)
 
                if (rtnl_route_get_dst_len (rtnlroute) == 0) {
                        /* Default gateway route; don't add to normal routes but to each address */
-                       if (!defgw_set) {
-                               memcpy (&defgw, gateway, sizeof (defgw));
-                               defgw_set = TRUE;
+                       if (!nm_ip6_config_get_gateway (config)) {
+                               nm_ip6_config_set_gateway (config, gateway);
                        }
                        continue;
                }
@@ -1367,8 +1361,9 @@ nm_ip6_manager_get_ip6_config (NMIP6Manager *manager, int ifindex)
                nm_ip6_address_set_prefix (ip6addr, rtnl_addr_get_prefixlen (rtnladdr));
                nm_ip6_address_set_address (ip6addr, addr);
                nm_ip6_config_take_address (config, ip6addr);
-               if (defgw_set)
-                       nm_ip6_address_set_gateway (ip6addr, &defgw);
+               gateway = nm_ip6_config_get_gateway (config);
+               if (gateway)
+                       nm_ip6_address_set_gateway (ip6addr, gateway);
        }
 
        /* Add DNS servers */