pio->length);
}
+static void router_clear_duplicated_ra_pio(struct interface *iface)
+{
+ size_t pio_cnt = iface->pio_cnt;
+ char ipv6_str[INET6_ADDRSTRLEN];
+
+ for (size_t i = 0; i < iface->pio_cnt; i++) {
+ struct ra_pio *pio_a = &iface->pios[i];
+ size_t j = i + 1;
+
+ while (j < iface->pio_cnt) {
+ struct ra_pio *pio_b = &iface->pios[j];
+
+ if (pio_a->length == pio_b->length &&
+ !memcmp(&pio_a->prefix, &pio_b->prefix, sizeof(struct in6_addr))) {
+ warn("rfc9096: %s: clear duplicated %s/%u",
+ iface->ifname,
+ inet_ntop(AF_INET6, &pio_a->prefix, ipv6_str, sizeof(ipv6_str)),
+ pio_a->length);
+
+ if (j + 1 < iface->pio_cnt)
+ iface->pios[j] = iface->pios[iface->pio_cnt - 1];
+
+ iface->pio_cnt--;
+ } else {
+ j++;
+ }
+ }
+ }
+
+ if (iface->pio_cnt != pio_cnt) {
+ struct ra_pio *new_pios = realloc(iface->pios, sizeof(struct ra_pio) * iface->pio_cnt);
+
+ if (new_pios)
+ iface->pios = new_pios;
+ }
+}
+
static void router_clear_expired_ra_pio(time_t now,
struct interface *iface)
{
}
}
+ router_clear_duplicated_ra_pio(iface);
+
iov[IOV_RA_PFXS].iov_base = (char *)pfxs;
iov[IOV_RA_PFXS].iov_len = pfxs_cnt * sizeof(*pfxs);