dhcpv6-ia: don't always send reconf accept option (FS#1377)
[project/odhcpd.git] / src / router.c
index c35cd12..e62282b 100644 (file)
@@ -48,7 +48,7 @@ int router_init(void)
        // Open ICMPv6 socket
        int sock = socket(AF_INET6, SOCK_RAW | SOCK_CLOEXEC, IPPROTO_ICMPV6);
        if (sock < 0 && errno != EAFNOSUPPORT) {
-               syslog(LOG_ERR, "Failed to open RAW-socket: %s", strerror(errno));
+               syslog(LOG_ERR, "Failed to open RAW-socket: %m");
                return -1;
        }
 
@@ -82,8 +82,7 @@ int router_init(void)
        odhcpd_register(&router_event);
 
        if (!(fp_route = fopen("/proc/net/ipv6_route", "r")))
-               syslog(LOG_ERR, "Failed to open routing table: %s",
-                               strerror(errno));
+               syslog(LOG_ERR, "Failed to open routing table: %m");
 
        netlink_add_netevent_handler(&router_netevent_handler);
 
@@ -380,6 +379,11 @@ static uint64_t send_router_advert(struct interface *iface, const struct in6_add
                        continue;
                }
 
+               if (odhcpd_bmemcmp(&addr->addr, &iface->pio_filter_addr,
+                               iface->pio_filter_length) != 0 ||
+                               addr->prefix < iface->pio_filter_length)
+                       continue; // PIO filtered out of this RA
+
                struct nd_opt_prefix_info *p = NULL;
                for (size_t i = 0; i < pfxs_cnt; ++i) {
                        if (addr->prefix == pfxs[i].nd_opt_pi_prefix_len &&