Lines Matching refs:rt

309 nd6_llinfo_purge(struct rtentry *rt)
311 struct llinfo_nd6 *ln = rt->rt_llinfo;
313 RT_LOCK_ASSERT_HELD(rt);
314 VERIFY(rt->rt_llinfo_purge == nd6_llinfo_purge && ln != NULL);
317 RT_CONVERT_LOCK(rt);
325 nd6_llinfo_get_ri(struct rtentry *rt, struct rt_reach_info *ri)
327 struct llinfo_nd6 *ln = rt->rt_llinfo;
347 nd6_llinfo_get_iflri(struct rtentry *rt, struct ifnet_llreach_info *iflri)
349 struct llinfo_nd6 *ln = rt->rt_llinfo;
667 struct rtentry *rt;
673 /* ln_next/prev/rt is protected by rnh_lock */
675 rt = ln->ln_rt;
676 RT_LOCK(rt);
680 RT_UNLOCK(rt);
685 /* rt->rt_ifp should never be NULL */
686 if ((ifp = rt->rt_ifp) == NULL) {
687 panic("%s: ln(%p) rt(%p) rt_ifp == NULL", __func__,
688 ln, rt);
693 if ((struct llinfo_nd6 *)rt->rt_llinfo != ln) {
695 __func__, rt->rt_llinfo, ln);
700 dst = (struct sockaddr_in6 *)(void *)rt_key(rt);
702 panic("%s: rt(%p) key is NULL ln(%p)", __func__,
703 rt, ln);
711 RT_UNLOCK(rt);
719 RT_UNLOCK(rt);
731 RT_LOCK_ASSERT_HELD(rt);
738 RT_ADDREF_LOCKED(rt);
739 RT_UNLOCK(rt);
748 RT_REMREF(rt);
761 RT_UNLOCK(rt);
766 RT_UNLOCK(rt);
769 nd6_free(rt);
777 ln->ln_expire = rt_expiry(rt, timenow.tv_sec,
780 RT_UNLOCK(rt);
787 RT_UNLOCK(rt);
789 nd6_free(rt);
794 RT_UNLOCK(rt);
804 RT_ADDREF_LOCKED(rt);
805 RT_UNLOCK(rt);
811 RT_REMREF(rt);
815 ln->ln_expire = rt_expiry(rt, timenow.tv_sec,
817 RT_UNLOCK(rt);
824 RT_ADDREF_LOCKED(rt);
825 RT_UNLOCK(rt);
829 RT_REMREF(rt);
831 RT_UNLOCK(rt);
833 nd6_free(rt);
839 RT_UNLOCK(rt);
849 struct rtentry *rt = ln->ln_rt;
852 RT_LOCK_SPIN(rt);
855 RT_UNLOCK(rt);
1287 * Note that rt->rt_ifp may not be the same as ifp,
1295 struct rtentry *rt;
1299 rt = ln->ln_rt;
1300 RT_LOCK(rt);
1301 if (rt->rt_gateway != NULL &&
1302 rt->rt_gateway->sa_family == AF_LINK &&
1303 SDL(rt->rt_gateway)->sdl_index == ifp->if_index) {
1304 RT_UNLOCK(rt);
1315 nd6_free(rt);
1319 RT_UNLOCK(rt);
1328 * responsible for releasing the reference and doing RT_UNLOCK(rt).
1340 struct rtentry *rt;
1352 rt = rtalloc1_scoped_locked((struct sockaddr *)&sin6,
1355 rt = rtalloc1_scoped((struct sockaddr *)&sin6,
1359 if (rt != NULL) {
1360 RT_LOCK(rt);
1361 if ((rt->rt_flags & RTF_LLINFO) == 0) {
1369 RT_UNLOCK(rt);
1371 rtfree_locked(rt);
1373 rtfree(rt);
1374 rt = NULL;
1378 if (rt == NULL) {
1410 ~RTF_CLONING, &rt, ifscope)) != 0) {
1419 if (rt == NULL)
1422 RT_LOCK(rt);
1423 if (rt->rt_llinfo) {
1424 struct llinfo_nd6 *ln = rt->rt_llinfo;
1431 RT_LOCK_ASSERT_HELD(rt);
1438 * XXX: we can't use rt->rt_ifp to check for the interface, since
1441 * use rt->rt_ifa->ifa_ifp, which would specify the REAL
1453 if ((rt->rt_flags & RTF_GATEWAY) || (rt->rt_flags & RTF_LLINFO) == 0 ||
1454 rt->rt_gateway->sa_family != AF_LINK || rt->rt_llinfo == NULL ||
1455 (ifp && rt->rt_ifa->ifa_ifp != ifp &&
1456 !(rt->rt_flags & RTF_PROXY))) {
1457 RT_REMREF_LOCKED(rt);
1458 RT_UNLOCK(rt);
1468 * Caller needs to release reference and call RT_UNLOCK(rt).
1470 return(rt);
1575 struct rtentry *rt;
1589 if ((rt = nd6_lookup(&addr->sin6_addr, 0, ifp, rt_locked)) != NULL) {
1590 RT_LOCK_ASSERT_HELD(rt);
1591 RT_REMREF_LOCKED(rt);
1592 RT_UNLOCK(rt);
1607 struct rtentry *rt)
1614 RT_LOCK_ASSERT_NOTHELD(rt);
1617 RT_LOCK(rt);
1618 RT_ADDREF_LOCKED(rt); /* Extra ref */
1619 ln = rt->rt_llinfo;
1620 in6 = ((struct sockaddr_in6 *)(void *)rt_key(rt))->sin6_addr;
1627 rt->rt_flags |= RTF_CONDEMNED;
1636 rt_key(rt))->sin6_addr, rt->rt_ifp);
1644 RT_UNLOCK(rt);
1646 rt6_flush(&in6, rt->rt_ifp);
1649 RT_UNLOCK(rt);
1667 RT_LOCK_SPIN(rt);
1676 RT_UNLOCK(rt);
1682 defrouter_select(rt->rt_ifp);
1684 RT_LOCK_ASSERT_NOTHELD(rt);
1686 RT_UNLOCK(rt);
1695 (void) rtrequest(RTM_DELETE, rt_key(rt), (struct sockaddr *)0,
1696 rt_mask(rt), 0, (struct rtentry **)0);
1699 rtfree(rt);
1709 struct rtentry *rt,
1719 * If the caller specified "rt", use that. Otherwise, resolve the
1722 if (!rt) {
1726 if ((rt = nd6_lookup(dst6, 0, NULL, 0)) == NULL)
1728 RT_LOCK_ASSERT_HELD(rt);
1730 RT_LOCK(rt);
1731 RT_ADDREF_LOCKED(rt);
1734 if ((rt->rt_flags & RTF_GATEWAY) != 0 ||
1735 (rt->rt_flags & RTF_LLINFO) == 0 ||
1736 !rt->rt_llinfo || !rt->rt_gateway ||
1737 rt->rt_gateway->sa_family != AF_LINK) {
1742 ln = rt->rt_llinfo;
1761 ndi = ND_IFINFO(rt->rt_ifp);
1769 RT_REMREF_LOCKED(rt);
1770 RT_UNLOCK(rt);
1776 struct rtentry *rt,
1779 struct sockaddr *gate = rt->rt_gateway;
1780 struct llinfo_nd6 *ln = rt->rt_llinfo;
1783 struct ifnet *ifp = rt->rt_ifp;
1788 RT_LOCK_ASSERT_HELD(rt);
1790 if ((rt->rt_flags & RTF_GATEWAY))
1793 if (nd6_need_cache(ifp) == 0 && (rt->rt_flags & RTF_HOST) == 0) {
1812 rtkey_to_sa6(rt, &sin6);
1818 RT_ADDREF_LOCKED(rt);
1819 RT_UNLOCK(rt);
1821 RT_LOCK(rt);
1822 RT_REMREF_LOCKED(rt);
1840 rt->rt_flags &= ~RTF_LLINFO;
1851 * if ((rt->rt_flags & RTF_HOST) == 0 &&
1852 * SIN(rt_mask(rt))->sin_addr.s_addr != 0xffffffff)
1853 * rt->rt_flags |= RTF_CLONING;
1855 if ((rt->rt_flags & RTF_CLONING) ||
1856 ((rt->rt_flags & RTF_LLINFO) && ln == NULL)) {
1863 if (rt_setgate(rt, rt_key(rt),
1865 gate = rt->rt_gateway;
1877 if ((rt->rt_flags & RTF_CLONING))
1924 rt->rt_llinfo = ln = nd6_llinfo_alloc();
1929 rt->rt_llinfo_get_ri = nd6_llinfo_get_ri;
1930 rt->rt_llinfo_get_iflri = nd6_llinfo_get_iflri;
1931 rt->rt_llinfo_purge = nd6_llinfo_purge;
1932 rt->rt_llinfo_free = nd6_llinfo_free;
1937 ln->ln_rt = rt;
1949 * When req == RTM_RESOLVE, rt is created and
1958 rt->rt_flags |= RTF_LLINFO;
1995 * check if rt_key(rt) is one of my address assigned
1998 ifa = (struct ifaddr *)in6ifa_ifpwithaddr(rt->rt_ifp,
1999 &SIN6(rt_key(rt))->sin6_addr);
2010 if (rt->rt_ifp != lo_ifp) {
2014 if (rt->rt_llinfo_purge != NULL)
2015 rt->rt_llinfo_purge(rt);
2021 if (rt->rt_if_ref_fn != NULL) {
2022 rt->rt_if_ref_fn(lo_ifp, 1);
2023 rt->rt_if_ref_fn(rt->rt_ifp, -1);
2026 rt->rt_ifp = lo_ifp; /* XXX */
2035 if (ifa != rt->rt_ifa) {
2036 rtsetifa(rt, ifa);
2040 } else if (rt->rt_flags & RTF_ANNOUNCE) {
2051 llsol = SIN6(rt_key(rt))->sin6_addr;
2074 if ((rt->rt_flags & RTF_ANNOUNCE) != 0 &&
2079 llsol = SIN6(rt_key(rt))->sin6_addr;
2097 * itself is to be freed. rt->rt_llinfo still points to
2107 if (rt->rt_llinfo_purge != NULL)
2108 rt->rt_llinfo_purge(rt);
2110 rt->rt_flags &= ~RTF_LLINFO;
2328 struct rtentry *rt;
2553 if ((rt = nd6_lookup(&nb_addr, 0, ifp, 0)) == NULL) {
2557 RT_LOCK_ASSERT_HELD(rt);
2558 ln = rt->rt_llinfo;
2563 RT_REMREF_LOCKED(rt);
2564 RT_UNLOCK(rt);
2590 if ((rt = nd6_lookup(&nb_addr, 0, ifp, 0)) == NULL) {
2594 RT_LOCK_ASSERT_HELD(rt);
2595 ln = rt->rt_llinfo;
2600 RT_REMREF_LOCKED(rt);
2601 RT_UNLOCK(rt);
2660 struct rtentry *rt = NULL;
2690 rt = nd6_lookup(from, 0, ifp, 0);
2691 if (rt == NULL) {
2692 if ((rt = nd6_lookup(from, 1, ifp, 0)) == NULL)
2694 RT_LOCK_ASSERT_HELD(rt);
2697 RT_LOCK_ASSERT_HELD(rt);
2699 if (rt->rt_flags & RTF_STATIC) {
2700 RT_REMREF_LOCKED(rt);
2701 RT_UNLOCK(rt);
2707 if (rt == NULL)
2709 if ((rt->rt_flags & (RTF_GATEWAY | RTF_LLINFO)) != RTF_LLINFO) {
2711 RT_UNLOCK(rt);
2712 nd6_free(rt);
2713 rtfree(rt);
2716 ln = (struct llinfo_nd6 *)rt->rt_llinfo;
2719 if (rt->rt_gateway == NULL)
2721 if (rt->rt_gateway->sa_family != AF_LINK)
2723 sdl = SDL(rt->rt_gateway);
2754 nd6_llreach_alloc(rt, ifp, LLADDR(sdl), sdl->sdl_alen, FALSE);
2792 rtkey_to_sa6(rt, &sin6);
2797 RT_UNLOCK(rt);
2798 nd6_output(ifp, ifp, m, &sin6, rt, NULL);
2799 RT_LOCK(rt);
2884 RT_REMREF_LOCKED(rt);
2885 RT_UNLOCK(rt);
2890 RT_REMREF_LOCKED(rt);
2891 RT_UNLOCK(rt);
2933 struct rtentry *rt = hint0, *hint = hint0;
2940 if (rt != NULL) {
2941 RT_LOCK_SPIN(rt);
2942 RT_ADDREF_LOCKED(rt);
2946 if (rt != NULL)
2947 RT_UNLOCK(rt);
2966 if (rt != NULL) {
2968 * We have a reference to "rt" by now (or below via rtalloc1),
2972 RT_LOCK_ASSERT_HELD(rt);
2973 if (!(rt->rt_flags & RTF_UP)) {
2974 RT_REMREF_LOCKED(rt);
2975 RT_UNLOCK(rt);
2976 if ((hint = rt = rtalloc1_scoped((struct sockaddr *)dst,
2978 RT_LOCK_SPIN(rt);
2979 if (rt->rt_ifp != ifp) {
2981 RT_UNLOCK(rt);
2983 dst, rt, adv);
2984 rtfree(rt);
2992 if (rt->rt_flags & RTF_GATEWAY) {
2997 rtgw_to_sa6(rt, &gw6);
3002 RT_UNLOCK(rt);
3026 RT_LOCK_SPIN(rt);
3027 gw6 = *((struct sockaddr_in6 *)(void *)rt->rt_gateway);
3030 if (!(rt->rt_flags & RTF_UP)) {
3031 RT_UNLOCK(rt);
3036 if ((gwrt = rt->rt_gwroute) == NULL) {
3037 RT_UNLOCK(rt);
3041 RT_CONVERT_LOCK(rt);
3046 * to rt, so no lock ordering issues.
3050 rt->rt_gwroute = NULL;
3052 RT_UNLOCK(rt);
3060 RT_LOCK(rt);
3064 * gateway portion of "rt" has changed.
3066 if (!(rt->rt_flags & RTF_UP) ||
3067 gwrt == NULL || gwrt == rt ||
3068 !equal(SA(&gw6), rt->rt_gateway)) {
3069 if (gwrt == rt) {
3073 RT_UNLOCK(rt);
3085 rt_set_gwroute(rt, rt_key(rt), gwrt);
3086 RT_UNLOCK(rt);
3088 /* Remember to release/free "rt" at the end */
3089 rtrele = rt;
3090 rt = gwrt;
3094 RT_UNLOCK(rt);
3095 /* Remember to release/free "rt" at the end */
3096 rtrele = rt;
3097 rt = gwrt;
3099 VERIFY(rt == gwrt);
3105 * clone (hint) holds a reference to it. rt == gwrt.
3116 rt_revalidate_gwroute(prt, rt);
3122 RT_LOCK_SPIN(rt);
3123 /* rt == gwrt; if it is now down, give up */
3124 if (!(rt->rt_flags & RTF_UP)) {
3125 RT_UNLOCK(rt);
3126 rtfree(rt);
3127 rt = NULL;
3128 /* "rtrele" == original "rt" */
3134 RT_CONVERT_LOCK(rt);
3145 if (rt && (rt->rt_flags & RTF_LLINFO) != 0) {
3146 ln = rt->rt_llinfo;
3161 if (rt != NULL)
3162 RT_UNLOCK(rt);
3164 /* "rtrele" may have been used, so clean up "rt" now */
3165 if (rt != NULL) {
3167 if (rt == hint0)
3168 RT_REMREF(rt);
3170 rtfree(rt);
3173 rt = nd6_lookup(&dst->sin6_addr, 1, ifp, 0);
3174 if (rt != NULL) {
3175 RT_LOCK_ASSERT_HELD(rt);
3176 ln = rt->rt_llinfo;
3178 } else if (rt != NULL) {
3179 RT_LOCK(rt);
3183 if (!ln || !rt) {
3184 if (rt != NULL)
3185 RT_UNLOCK(rt);
3196 "(ln=%p, rt=%p)\n",
3197 ip6_sprintf(&dst->sin6_addr), ln, rt);
3212 ln->ln_expire = rt_expiry(rt, timenow.tv_sec, nd6_gctimer);
3225 ln->ln_expire = rt_expiry(rt, timenow.tv_sec, nd6_delay);
3234 RT_UNLOCK(rt);
3241 RT_LOCK_SPIN(rt);
3246 RT_UNLOCK(rt);
3275 RT_UNLOCK(rt);
3276 /* We still have a reference on rt (for ln) */
3282 RT_UNLOCK(rt);
3290 RT_LOCK_SPIN(rt);
3295 /* Clean up "rt" now while we can */
3296 if (rt == hint0) {
3297 RT_REMREF_LOCKED(rt);
3298 RT_UNLOCK(rt);
3300 RT_UNLOCK(rt);
3301 rtfree_locked(rt);
3303 rt = NULL; /* "rt" has been taken care of */
3310 if (rt != NULL)
3311 RT_LOCK_ASSERT_NOTHELD(rt);
3328 error = dlil_output(origifp, PF_INET6, m, (caddr_t)rt,
3351 if (rt != NULL) {
3352 RT_LOCK_SPIN(rt);
3354 if (rt->rt_llinfo != NULL)
3355 nd6_llreach_use(rt->rt_llinfo);
3356 RT_UNLOCK(rt);
3363 error = dlil_output(ifp, PF_INET6, m, (caddr_t)rt,
3372 /* Clean up "rt" unless it's already been done */
3373 if (rt != NULL) {
3374 RT_LOCK_SPIN(rt);
3375 if (rt == hint0) {
3376 RT_REMREF_LOCKED(rt);
3377 RT_UNLOCK(rt);
3379 RT_UNLOCK(rt);
3380 rtfree(rt);
3435 struct rtentry *rt,
3468 if (rt == NULL) {
3472 RT_LOCK(rt);
3473 if (rt->rt_gateway->sa_family != AF_LINK) {
3475 RT_UNLOCK(rt);
3478 sdl = SDL(rt->rt_gateway);
3482 RT_UNLOCK(rt);
3487 RT_UNLOCK(rt);