+ return;
+ }
+ /* For 32-bit process */
+ while (pr && i < PRLSTSIZ) {
+ struct nd_pfxrouter *pfr;
+ int j;
+
+ (void) in6_embedscope(&prl_32->prefix[i].prefix,
+ &pr->ndpr_prefix, NULL, NULL);
+ prl_32->prefix[i].raflags = pr->ndpr_raf;
+ prl_32->prefix[i].prefixlen = pr->ndpr_plen;
+ prl_32->prefix[i].vltime = pr->ndpr_vltime;
+ prl_32->prefix[i].pltime = pr->ndpr_pltime;
+ prl_32->prefix[i].if_index = pr->ndpr_ifp->if_index;
+ prl_32->prefix[i].expire = pr->ndpr_expire;
+
+ pfr = pr->ndpr_advrtrs.lh_first;
+ j = 0;
+ while (pfr) {
+ if (j < DRLSTSIZ) {
+#define RTRADDR prl_32->prefix[i].advrtr[j]
+ RTRADDR = pfr->router->rtaddr;
+ if (IN6_IS_ADDR_LINKLOCAL(&RTRADDR)) {
+ /* XXX: hack for KAME */
+ RTRADDR.s6_addr16[1] = 0;
+ } else {
+ log(LOG_ERR,
+ "a router(%s) advertises "
+ "a prefix with "
+ "non-link local address\n",
+ ip6_sprintf(&RTRADDR));
+ }
+#undef RTRADDR
+ }
+ j++;
+ pfr = pfr->pfr_next;
+ }
+ prl_32->prefix[i].advrtrs = j;
+ prl_32->prefix[i].origin = PR_ORIG_RA;
+
+ i++;
+ pr = pr->ndpr_next;
+ }
+
+ for (rpp = LIST_FIRST(&rr_prefix); rpp;
+ rpp = LIST_NEXT(rpp, rp_entry)) {
+ if (i >= PRLSTSIZ)
+ break;
+ (void) in6_embedscope(&prl_32->prefix[i].prefix,
+ &pr->ndpr_prefix, NULL, NULL);
+ prl_32->prefix[i].raflags = rpp->rp_raf;
+ prl_32->prefix[i].prefixlen = rpp->rp_plen;
+ prl_32->prefix[i].vltime = rpp->rp_vltime;
+ prl_32->prefix[i].pltime = rpp->rp_pltime;
+ prl_32->prefix[i].if_index = rpp->rp_ifp->if_index;
+ prl_32->prefix[i].expire = rpp->rp_expire;
+ prl_32->prefix[i].advrtrs = 0;
+ prl_32->prefix[i].origin = rpp->rp_origin;
+ i++;
+ }
+}
+
+int
+nd6_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp)
+{
+ struct in6_ndireq *ndi = (struct in6_ndireq *)data;
+ struct in6_ondireq *ondi = (struct in6_ondireq *)data;
+ struct nd_defrouter *dr, any;
+ struct nd_prefix *pr;
+ struct rtentry *rt;
+ int i = ifp->if_index, error = 0;
+
+ switch (cmd) {
+ case SIOCGDRLST_IN6_32:
+ case SIOCGDRLST_IN6_64:
+ /*
+ * obsolete API, use sysctl under net.inet6.icmp6
+ */
+ lck_mtx_lock(nd6_mutex);
+ nd6_siocgdrlst(data, cmd == SIOCGDRLST_IN6_64);