Lines Matching defs:pr

501 		struct nd_prefix pr;
536 bzero(&pr, sizeof(pr));
537 lck_mtx_init(&pr.ndpr_lock, ifa_mtx_grp, ifa_mtx_attr);
538 NDPR_LOCK(&pr);
539 pr.ndpr_prefix.sin6_family = AF_INET6;
540 pr.ndpr_prefix.sin6_len = sizeof(pr.ndpr_prefix);
541 pr.ndpr_prefix.sin6_addr = pi->nd_opt_pi_prefix;
542 pr.ndpr_ifp = m->m_pkthdr.rcvif;
544 pr.ndpr_raf_onlink = (pi->nd_opt_pi_flags_reserved &
546 pr.ndpr_raf_auto = (pi->nd_opt_pi_flags_reserved &
548 pr.ndpr_plen = pi->nd_opt_pi_prefix_len;
549 pr.ndpr_vltime = ntohl(pi->nd_opt_pi_valid_time);
550 pr.ndpr_pltime =
565 pr.ndpr_raf_auto = 0;
573 pr.ndpr_raf_auto = 0;
576 if (in6_init_prefix_ltimes(&pr)) {
577 NDPR_UNLOCK(&pr);
578 lck_mtx_destroy(&pr.ndpr_lock, ifa_mtx_grp);
581 NDPR_UNLOCK(&pr);
583 (void)prelist_update(&pr, dr, m, mcast);
584 lck_mtx_destroy(&pr.ndpr_lock, ifa_mtx_grp);
602 bcopy(&pr.ndpr_prefix, &prfl->pr.ndpr_prefix,
603 sizeof (prfl->pr.ndpr_prefix));
604 prfl->pr.ndpr_raf = pr.ndpr_raf;
605 prfl->pr.ndpr_plen = pr.ndpr_plen;
606 prfl->pr.ndpr_vltime = pr.ndpr_vltime;
607 prfl->pr.ndpr_pltime = pr.ndpr_pltime;
608 prfl->pr.ndpr_expire = pr.ndpr_expire;
609 prfl->pr.ndpr_stateflags = pr.ndpr_stateflags;
610 prfl->pr.ndpr_addrcnt = pr.ndpr_addrcnt;
611 prfl->pr.ndpr_ifp = pr.ndpr_ifp;
1027 struct nd_prefix *pr;
1068 for (pr = nd_prefix.lh_first; pr; pr = pr->ndpr_next) {
1071 NDPR_LOCK(pr);
1072 if ((pfxrtr = pfxrtr_lookup(pr, dr)) != NULL)
1074 NDPR_UNLOCK(pr);
1919 pfxrtr_lookup(struct nd_prefix *pr, struct nd_defrouter *dr)
1924 NDPR_LOCK_ASSERT_HELD(pr);
1926 for (search = pr->ndpr_advrtrs.lh_first; search;
1936 pfxrtr_add(struct nd_prefix *pr, struct nd_defrouter *dr)
1941 NDPR_LOCK_ASSERT_NOTHELD(pr);
1949 NDPR_LOCK(pr);
1950 LIST_INSERT_HEAD(&pr->ndpr_advrtrs, new, pfr_entry);
1951 NDPR_UNLOCK(pr);
1966 nd6_prefix_lookup(struct nd_prefix *pr)
1973 if (pr->ndpr_ifp == search->ndpr_ifp &&
1974 pr->ndpr_plen == search->ndpr_plen &&
1975 in6_are_prefix_equal(&pr->ndpr_prefix.sin6_addr,
1976 &search->ndpr_prefix.sin6_addr, pr->ndpr_plen)) {
1991 struct nd_prefix *pr, *pr_next;
1997 pr = nd_prefix.lh_first;
1999 while (pr) {
2000 pr_next = pr->ndpr_next;
2001 NDPR_LOCK(pr);
2002 if (pr->ndpr_ifp != ifp ||
2003 IN6_IS_ADDR_LINKLOCAL(&pr->ndpr_prefix.sin6_addr) ||
2004 ((pr->ndpr_stateflags & NDPRF_DETACHED) == 0 &&
2005 !LIST_EMPTY(&pr->ndpr_advrtrs))) {
2006 NDPR_UNLOCK(pr);
2007 pr = pr_next;
2010 NDPR_UNLOCK(pr);
2021 IN6_IFF_AUTOCONF && ia->ia6_ndpr == pr) {
2034 pr = nd_prefix.lh_first;
2040 NDPR_LOCK(pr);
2041 if (pr->ndpr_addrcnt == 0) {
2042 NDPR_ADDREF_LOCKED(pr);
2043 prelist_remove(pr);
2044 NDPR_UNLOCK(pr);
2045 NDPR_REMREF(pr);
2047 NDPR_UNLOCK(pr);
2049 pr = pr_next;
2056 nd6_prelist_add(struct nd_prefix *pr, struct nd_defrouter *dr,
2060 struct ifnet *ifp = pr->ndpr_ifp;
2103 NDPR_LOCK(pr);
2104 new->ndpr_ifp = pr->ndpr_ifp;
2105 new->ndpr_prefix = pr->ndpr_prefix;
2106 new->ndpr_plen = pr->ndpr_plen;
2107 new->ndpr_vltime = pr->ndpr_vltime;
2108 new->ndpr_pltime = pr->ndpr_pltime;
2109 new->ndpr_flags = pr->ndpr_flags;
2110 if (pr->ndpr_stateflags & NDPRF_STATIC)
2112 NDPR_UNLOCK(pr);
2181 prelist_remove(struct nd_prefix *pr)
2184 struct ifnet *ifp = pr->ndpr_ifp;
2188 NDPR_LOCK_ASSERT_HELD(pr);
2191 pr->ndpr_vltime = 0;
2192 pr->ndpr_pltime = 0;
2196 * of pr->ndpr_raf_onlink and pr->ndpr_raf_auto not to confuse users
2200 if ((pr->ndpr_stateflags & NDPRF_ONLINK)) {
2201 NDPR_ADDREF_LOCKED(pr);
2202 NDPR_UNLOCK(pr);
2204 if ((e = nd6_prefix_offlink(pr)) != 0) {
2207 ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
2208 pr->ndpr_plen, if_name(ifp), e));
2212 NDPR_LOCK(pr);
2213 if (NDPR_REMREF_LOCKED(pr) == NULL)
2217 if (pr->ndpr_addrcnt > 0)
2221 LIST_REMOVE(pr, ndpr_entry);
2222 pr->ndpr_debug &= ~IFD_ATTACHED;
2225 for (pfr = pr->ndpr_advrtrs.lh_first; pfr; pfr = next) {
2242 if (NDPR_REMREF_LOCKED(pr) == NULL) {
2243 panic("%s: unexpected (missing) refcnt ndpr=%p", __func__, pr);
2260 struct nd_prefix *pr;
2283 if ((pr = nd6_prefix_lookup(new)) != NULL) {
2285 * nd6_prefix_lookup() ensures that pr and new have the same
2295 NDPR_LOCK(pr);
2297 pr->ndpr_raf_onlink = 1;
2299 pr->ndpr_raf_auto = 1;
2301 pr->ndpr_vltime = new->ndpr_vltime;
2302 pr->ndpr_pltime = new->ndpr_pltime;
2303 pr->ndpr_preferred = new->ndpr_preferred;
2304 pr->ndpr_expire = new->ndpr_expire;
2308 (pr->ndpr_stateflags & NDPRF_ONLINK) == 0) {
2311 NDPR_UNLOCK(pr);
2312 if ((e = nd6_prefix_onlink(pr)) != 0) {
2317 ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
2318 pr->ndpr_plen, if_name(pr->ndpr_ifp), e));
2321 NDPR_LOCK(pr);
2324 if (dr && pfxrtr_lookup(pr, dr) == NULL) {
2325 NDPR_UNLOCK(pr);
2326 pfxrtr_add(pr, dr);
2328 NDPR_UNLOCK(pr);
2368 pr = newpr;
2374 * Note that pr must be non NULL at this point.
2437 * one. (pr is never NULL here)
2439 if (ifa6->ia6_ndpr != pr) {
2536 in6_init_address_ltimes(pr, &lt6_tmp,
2568 NDPR_LOCK(pr);
2569 if (ifidlen + pr->ndpr_plen != 128) {
2573 pr->ndpr_plen, if_name(ifp)));
2574 NDPR_UNLOCK(pr);
2577 NDPR_UNLOCK(pr);
2581 * note that we should use pr (not new) for reference.
2584 NDPR_LOCK(pr);
2585 ia6->ia6_ndpr = pr;
2586 NDPR_ADDREF_LOCKED(pr); /* for addr reference */
2587 pr->ndpr_addrcnt++;
2588 VERIFY(pr->ndpr_addrcnt != 0);
2589 NDPR_UNLOCK(pr);
2633 if (pr != NULL)
2634 NDPR_REMREF(pr);
2757 struct nd_prefix *pr;
2759 pr = (how == M_WAITOK) ? zalloc(ndpr_zone) : zalloc_noblock(ndpr_zone);
2760 if (pr != NULL) {
2761 bzero(pr, ndpr_size);
2762 lck_mtx_init(&pr->ndpr_lock, ifa_mtx_grp, ifa_mtx_attr);
2763 RB_INIT(&pr->ndpr_prproxy_sols);
2764 pr->ndpr_debug |= IFD_ALLOC;
2766 pr->ndpr_debug |= IFD_DEBUG;
2767 pr->ndpr_trace = ndpr_trace;
2770 return (pr);
2774 ndpr_free(struct nd_prefix *pr)
2776 NDPR_LOCK(pr);
2777 if (pr->ndpr_debug & IFD_ATTACHED) {
2778 panic("%s: attached ndpr %p is being freed", __func__, pr);
2780 } else if (!(pr->ndpr_debug & IFD_ALLOC)) {
2781 panic("%s: ndpr %p cannot be freed", __func__, pr);
2783 } else if (pr->ndpr_rt != NULL) {
2784 panic("%s: ndpr %p route %p not freed", __func__, pr,
2785 pr->ndpr_rt);
2787 } else if (pr->ndpr_prproxy_sols_cnt != 0) {
2789 __func__, pr, pr->ndpr_prproxy_sols_cnt);
2791 } else if (!RB_EMPTY(&pr->ndpr_prproxy_sols)) {
2792 panic("%s: ndpr %p non-empty solicitors tree", __func__, pr);
2795 pr->ndpr_debug &= ~IFD_ALLOC;
2796 NDPR_UNLOCK(pr);
2798 lck_mtx_destroy(&pr->ndpr_lock, ifa_mtx_grp);
2799 zfree(ndpr_zone, pr);
2803 ndpr_trace(struct nd_prefix *pr, int refhold)
2805 struct nd_prefix_dbg *pr_dbg = (struct nd_prefix_dbg *)pr;
2810 if (!(pr->ndpr_debug & IFD_DEBUG)) {
2811 panic("%s: ndpr %p has no debug structure", __func__, pr);
2884 find_pfxlist_reachable_router(struct nd_prefix *pr)
2891 NDPR_LOCK_ASSERT_HELD(pr);
2893 for (pfxrtr = LIST_FIRST(&pr->ndpr_advrtrs); pfxrtr;
2895 NDPR_UNLOCK(pr);
2906 NDPR_LOCK(pr);
2913 NDPR_LOCK(pr);
2915 NDPR_LOCK_ASSERT_HELD(pr);
2937 struct nd_prefix *pr, *prclear;
2959 pr = nd_prefix.lh_first;
2960 while (pr) {
2961 NDPR_LOCK(pr);
2962 if (pr->ndpr_stateflags & NDPRF_PROCESSED) {
2963 NDPR_UNLOCK(pr);
2964 pr = pr->ndpr_next;
2967 NDPR_ADDREF_LOCKED(pr);
2968 if (pr->ndpr_raf_onlink && find_pfxlist_reachable_router(pr) &&
2969 (pr->ndpr_debug & IFD_ATTACHED)) {
2970 NDPR_UNLOCK(pr);
2971 NDPR_REMREF(pr);
2974 pr->ndpr_stateflags |= NDPRF_PROCESSED;
2975 NDPR_UNLOCK(pr);
2976 NDPR_REMREF(pr);
2982 pr = nd_prefix.lh_first;
2994 if (pr == NULL) {
3012 if (pr != NULL || (TAILQ_FIRST(&nd_defrouter) && pfxrtr == NULL)) {
3022 pr = nd_prefix.lh_first;
3023 while (pr) {
3024 NDPR_LOCK(pr);
3030 if (pr->ndpr_raf_onlink == 0 ||
3031 pr->ndpr_stateflags & NDPRF_PROCESSED ||
3032 pr->ndpr_stateflags & NDPRF_STATIC) {
3033 NDPR_UNLOCK(pr);
3034 pr = pr->ndpr_next;
3037 NDPR_ADDREF_LOCKED(pr);
3038 if ((pr->ndpr_stateflags & NDPRF_DETACHED) == 0 &&
3039 find_pfxlist_reachable_router(pr) == NULL &&
3040 (pr->ndpr_debug & IFD_ATTACHED))
3041 pr->ndpr_stateflags |= NDPRF_DETACHED;
3042 if ((pr->ndpr_stateflags & NDPRF_DETACHED) != 0 &&
3043 find_pfxlist_reachable_router(pr) != NULL &&
3044 (pr->ndpr_debug & IFD_ATTACHED))
3045 pr->ndpr_stateflags &= ~NDPRF_DETACHED;
3046 pr->ndpr_stateflags |= NDPRF_PROCESSED;
3047 NDPR_UNLOCK(pr);
3048 NDPR_REMREF(pr);
3055 pr = nd_prefix.lh_first;
3059 for (pr = nd_prefix.lh_first; pr; pr = pr->ndpr_next) {
3060 NDPR_LOCK(pr);
3061 if (pr->ndpr_raf_onlink == 0 ||
3062 pr->ndpr_stateflags & NDPRF_STATIC) {
3063 NDPR_UNLOCK(pr);
3066 if ((pr->ndpr_stateflags & NDPRF_DETACHED) != 0)
3067 pr->ndpr_stateflags &= ~NDPRF_DETACHED;
3068 NDPR_UNLOCK(pr);
3091 pr = nd_prefix.lh_first;
3092 while (pr) {
3095 NDPR_LOCK(pr);
3096 if (pr->ndpr_raf_onlink == 0 ||
3097 pr->ndpr_stateflags & NDPRF_STATIC) {
3098 NDPR_UNLOCK(pr);
3099 pr = pr->ndpr_next;
3102 if ((pr->ndpr_stateflags & NDPRF_DETACHED) != 0 &&
3103 (pr->ndpr_stateflags & NDPRF_ONLINK) != 0) {
3104 NDPR_UNLOCK(pr);
3106 if ((e = nd6_prefix_offlink(pr)) != 0) {
3110 ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
3111 pr->ndpr_plen, e));
3114 pr = nd_prefix.lh_first;
3117 if ((pr->ndpr_stateflags & NDPRF_DETACHED) == 0 &&
3118 (pr->ndpr_stateflags & NDPRF_ONLINK) == 0 &&
3119 pr->ndpr_raf_onlink) {
3120 NDPR_UNLOCK(pr);
3121 if ((e = nd6_prefix_onlink(pr)) != 0) {
3125 ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
3126 pr->ndpr_plen, e));
3129 NDPR_UNLOCK(pr);
3131 pr = pr->ndpr_next;
3242 nd6_prefix_equal_lookup(struct nd_prefix *pr, boolean_t primary_only)
3249 if (opr == pr)
3257 if (opr->ndpr_plen == pr->ndpr_plen &&
3258 in6_are_prefix_equal(&pr->ndpr_prefix.sin6_addr,
3259 &opr->ndpr_prefix.sin6_addr, pr->ndpr_plen) &&
3279 struct nd_prefix *pr, *opr;
3287 for (pr = nd_prefix.lh_first; pr; pr = pr->ndpr_next) {
3288 NDPR_LOCK(pr);
3289 if (!(pr->ndpr_stateflags & NDPRF_ONLINK)) {
3290 NDPR_UNLOCK(pr);
3293 if (pr->ndpr_ifp == ifp &&
3294 (pr->ndpr_stateflags & NDPRF_IFSCOPE) &&
3295 !IN6_IS_ADDR_LINKLOCAL(&pr->ndpr_prefix.sin6_addr)) {
3296 NDPR_UNLOCK(pr);
3299 NDPR_UNLOCK(pr);
3302 if (pr == NULL)
3306 opr = nd6_prefix_equal_lookup(pr, TRUE);
3321 __func__, ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
3322 pr->ndpr_plen, if_name(pr->ndpr_ifp)));
3326 err = nd6_prefix_offlink(pr);
3331 __func__, ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
3332 pr->ndpr_plen, if_name(pr->ndpr_ifp), err));
3347 err = nd6_prefix_onlink_scoped(pr, IFSCOPE_NONE);
3351 __func__, ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
3352 pr->ndpr_plen, if_name(pr->ndpr_ifp), err));
3358 __func__, ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
3359 pr->ndpr_plen, if_name(pr->ndpr_ifp),
3364 if_name(pr->ndpr_ifp),
3365 ip6_sprintf(&pr->ndpr_prefix.sin6_addr), pr->ndpr_plen,
3374 nd6_prefix_onlink_common(struct nd_prefix *pr, boolean_t force_scoped,
3378 struct ifnet *ifp = pr->ndpr_ifp;
3388 NDPR_LOCK(pr);
3389 if ((pr->ndpr_stateflags & NDPRF_ONLINK) != 0) {
3392 "on-link\n", ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
3393 pr->ndpr_plen, if_name(pr->ndpr_ifp),
3394 (pr->ndpr_stateflags & NDPRF_IFSCOPE) ? 1 : 0);
3395 NDPR_UNLOCK(pr);
3398 NDPR_UNLOCK(pr);
3405 opr = nd6_prefix_equal_lookup(pr, FALSE);
3421 opr = nd6_prefix_equal_lookup(pr, TRUE);
3444 NDPR_LOCK(pr);
3455 ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
3456 pr->ndpr_plen, if_name(ifp)));
3457 NDPR_UNLOCK(pr);
3467 mask6.sin6_addr = pr->ndpr_mask;
3468 prefix = pr->ndpr_prefix;
3469 if ((rt = pr->ndpr_rt) != NULL)
3470 pr->ndpr_rt = NULL;
3471 NDPR_ADDREF_LOCKED(pr); /* keep reference for this routine */
3472 NDPR_UNLOCK(pr);
3507 NDPR_LOCK(pr);
3509 NDPR_LOCK(pr);
3513 ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
3514 pr->ndpr_plen, if_name(ifp),
3520 NDPR_LOCK_ASSERT_HELD(pr);
3522 pr->ndpr_stateflags &= ~(NDPRF_IFSCOPE | NDPRF_PRPROXY);
3531 VERIFY(pr->ndpr_prproxy_sols_cnt == 0);
3532 VERIFY(RB_EMPTY(&pr->ndpr_prproxy_sols));
3539 pr->ndpr_rt = rt; /* keep reference from rtrequest */
3540 pr->ndpr_stateflags |= NDPRF_ONLINK;
3542 pr->ndpr_stateflags |= NDPRF_IFSCOPE;
3545 !IN6_IS_ADDR_LINKLOCAL(&pr->ndpr_prefix.sin6_addr)) {
3554 pr->ndpr_stateflags |= NDPRF_PRPROXY;
3561 prproxy = (pr->ndpr_stateflags & NDPRF_PRPROXY);
3562 VERIFY(!prproxy || !(pr->ndpr_stateflags & NDPRF_IFSCOPE));
3563 NDPR_UNLOCK(pr);
3573 nd6_prproxy_prelist_update(pr, prproxy ? pr : NULL);
3575 NDPR_REMREF(pr); /* release reference for this routine */
3584 nd6_prefix_onlink(struct nd_prefix *pr)
3586 return (nd6_prefix_onlink_common(pr, FALSE, IFSCOPE_NONE));
3590 nd6_prefix_onlink_scoped(struct nd_prefix *pr, unsigned int ifscope)
3592 return (nd6_prefix_onlink_common(pr, TRUE, ifscope));
3596 nd6_prefix_offlink(struct nd_prefix *pr)
3599 struct ifnet *ifp = pr->ndpr_ifp;
3608 NDPR_LOCK(pr);
3609 if ((pr->ndpr_stateflags & NDPRF_ONLINK) == 0) {
3612 "off-link\n", ip6_sprintf(&pr->ndpr_prefix.sin6_addr),
3613 pr->ndpr_plen, if_name(pr->ndpr_ifp),
3614 (pr->ndpr_stateflags & NDPRF_IFSCOPE) ? 1 : 0));
3615 NDPR_UNLOCK(pr);
3622 bcopy(&pr->ndpr_prefix.sin6_addr, &sa6.sin6_addr,
3627 bcopy(&pr->ndpr_mask, &mask6.sin6_addr, sizeof(struct in6_addr));
3628 prefix = pr->ndpr_prefix;
3629 plen = pr->ndpr_plen;
3630 if ((ndpr_rt = pr->ndpr_rt) != NULL)
3631 pr->ndpr_rt = NULL;
3632 NDPR_ADDREF_LOCKED(pr); /* keep reference for this routine */
3633 NDPR_UNLOCK(pr);
3635 ifscope = (pr->ndpr_stateflags & NDPRF_IFSCOPE) ?
3663 if (opr == pr) {
3720 NDPR_LOCK(pr);
3721 prproxy = (pr->ndpr_stateflags & NDPRF_PRPROXY);
3722 VERIFY(!prproxy || !(pr->ndpr_stateflags & NDPRF_IFSCOPE));
3723 pr->ndpr_stateflags &= ~(NDPRF_ONLINK | NDPRF_IFSCOPE | NDPRF_PRPROXY);
3724 if (pr->ndpr_prproxy_sols_cnt > 0) {
3726 nd6_prproxy_sols_reap(pr);
3727 VERIFY(pr->ndpr_prproxy_sols_cnt == 0);
3728 VERIFY(RB_EMPTY(&pr->ndpr_prproxy_sols));
3730 NDPR_UNLOCK(pr);
3738 nd6_prproxy_prelist_update(pr, prproxy ? pr : NULL);
3740 NDPR_REMREF(pr); /* release reference for this routine */
3748 struct nd_prefix *pr,
3751 struct ifnet *ifp = pr->ndpr_ifp;
3784 NDPR_LOCK(pr);
3785 prefixlen = pr->ndpr_plen;
3793 NDPR_UNLOCK(pr);
3810 bcopy(&pr->ndpr_prefix.sin6_addr, &ifra.ifra_addr.sin6_addr,
3834 ifra.ifra_lifetime.ia6t_vltime = pr->ndpr_vltime;
3835 ifra.ifra_lifetime.ia6t_pltime = pr->ndpr_pltime;
3841 NDPR_UNLOCK(pr);