Lines Matching refs:rt

143 #define RT_REFCNT_TRACE(rt)   printf("%s:%d: rt=%p refcnt=%d\n", \  argument
144 __func__, __LINE__, (rt), (rt)->rt_refcnt)
146 #define RT_REFCNT_TRACE(rt) do {} while (0) argument
330 rt_destroy(struct rtentry *rt) in rt_destroy() argument
332 if (rt->_rt_key != NULL) in rt_destroy()
333 sockaddr_free(rt->_rt_key); in rt_destroy()
334 if (rt->rt_gateway != NULL) in rt_destroy()
335 sockaddr_free(rt->rt_gateway); in rt_destroy()
336 if (rt_gettag(rt) != NULL) in rt_destroy()
337 sockaddr_free(rt_gettag(rt)); in rt_destroy()
338 rt->_rt_key = rt->rt_gateway = rt->rt_tag = NULL; in rt_destroy()
342 rt_setkey(struct rtentry *rt, const struct sockaddr *key, int flags) in rt_setkey() argument
344 if (rt->_rt_key == key) in rt_setkey()
347 if (rt->_rt_key != NULL) in rt_setkey()
348 sockaddr_free(rt->_rt_key); in rt_setkey()
349 rt->_rt_key = sockaddr_dup(key, flags); in rt_setkey()
351 rt->rt_nodes->rn_key = (const char *)rt->_rt_key; in rt_setkey()
352 return rt->_rt_key; in rt_setkey()
356 rt_get_ifa(struct rtentry *rt) in rt_get_ifa() argument
360 ifa = rt->rt_ifa; in rt_get_ifa()
364 else if (ifa->ifa_seqno != NULL && *ifa->ifa_seqno == rt->rt_ifa_seqno) in rt_get_ifa()
368 ifa = (*ifa->ifa_getifa)(ifa, rt_getkey(rt)); in rt_get_ifa()
371 rt_replace_ifa(rt, ifa); in rt_get_ifa()
377 rt_set_ifa1(struct rtentry *rt, struct ifaddr *ifa) in rt_set_ifa1() argument
379 rt->rt_ifa = ifa; in rt_set_ifa1()
381 rt->rt_ifa_seqno = *ifa->ifa_seqno; in rt_set_ifa1()
388 rt_ifa_connected(const struct rtentry *rt, const struct ifaddr *ifa) in rt_ifa_connected() argument
393 key = rt_getkey(rt); in rt_ifa_connected()
394 dst = rt->rt_flags & RTF_HOST ? ifa->ifa_dstaddr : ifa->ifa_addr; in rt_ifa_connected()
399 if ((rt->rt_flags & RTF_HOST) == 0 && ifa->ifa_netmask) { in rt_ifa_connected()
409 rt_replace_ifa(struct rtentry *rt, struct ifaddr *ifa) in rt_replace_ifa() argument
413 if (rt->rt_ifa == ifa) in rt_replace_ifa()
416 if (rt->rt_ifa != ifa && in rt_replace_ifa()
417 rt->rt_ifa->ifa_flags & IFA_ROUTE && in rt_replace_ifa()
418 rt_ifa_connected(rt, rt->rt_ifa)) in rt_replace_ifa()
422 (void *)rt->_rt_key, (void *)rt->rt_ifa); in rt_replace_ifa()
423 rt->rt_ifa->ifa_flags &= ~IFA_ROUTE; in rt_replace_ifa()
424 if (rt_ifa_connected(rt, ifa)) { in rt_replace_ifa()
427 (void *)rt->_rt_key, (void *)ifa); in rt_replace_ifa()
433 old = rt->rt_ifa; in rt_replace_ifa()
434 rt_set_ifa1(rt, ifa); in rt_replace_ifa()
439 rt_set_ifa(struct rtentry *rt, struct ifaddr *ifa) in rt_set_ifa() argument
442 rt_set_ifa1(rt, ifa); in rt_set_ifa()
515 dump_rt(const struct rtentry *rt) in dump_rt() argument
520 log(LOG_DEBUG, "p=%p ", rt); in dump_rt()
521 if (rt->_rt_key == NULL) { in dump_rt()
524 sockaddr_format(rt->_rt_key, buf, sizeof(buf)); in dump_rt()
527 if (rt->rt_gateway == NULL) { in dump_rt()
530 sockaddr_format(rt->_rt_key, buf, sizeof(buf)); in dump_rt()
533 log(LOG_DEBUG, "flags=%x ", rt->rt_flags); in dump_rt()
534 if (rt->rt_ifp == NULL) { in dump_rt()
537 log(LOG_DEBUG, "if=%s ", rt->rt_ifp->if_xname); in dump_rt()
552 struct rtentry *rt; in rtalloc1_locked() local
563 rt = rt_matchaddr(rtbl, dst); in rtalloc1_locked()
564 if (rt == NULL) in rtalloc1_locked()
567 if (!ISSET(rt->rt_flags, RTF_UP)) in rtalloc1_locked()
571 if (ISSET(rt->rt_flags, RTF_UPDATING) && in rtalloc1_locked()
590 rt_ref(rt); in rtalloc1_locked()
591 RT_REFCNT_TRACE(rt); in rtalloc1_locked()
594 return rt; in rtalloc1_locked()
611 struct rtentry *rt; in rtalloc1() local
614 rt = rtalloc1_locked(dst, report, true, false); in rtalloc1()
617 return rt; in rtalloc1()
621 rt_ref(struct rtentry *rt) in rt_ref() argument
624 KASSERTMSG(rt->rt_refcnt >= 0, "rt_refcnt=%d", rt->rt_refcnt); in rt_ref()
625 atomic_inc_uint(&rt->rt_refcnt); in rt_ref()
629 rt_unref(struct rtentry *rt) in rt_unref() argument
632 KASSERT(rt != NULL); in rt_unref()
633 KASSERTMSG(rt->rt_refcnt > 0, "refcnt=%d", rt->rt_refcnt); in rt_unref()
635 atomic_dec_uint(&rt->rt_refcnt); in rt_unref()
636 if (!ISSET(rt->rt_flags, RTF_UP) || ISSET(rt->rt_flags, RTF_UPDATING)) { in rt_unref()
638 cv_broadcast(&rt->rt_cv); in rt_unref()
661 rt_wait_refcnt(const char *title, struct rtentry *rt, int cnt) in rt_wait_refcnt() argument
664 while (rt->rt_refcnt > cnt) { in rt_wait_refcnt()
666 __func__, title, rt->rt_refcnt); in rt_wait_refcnt()
667 cv_wait(&rt->rt_cv, &rt_free_global.lock); in rt_wait_refcnt()
669 __func__, title, rt->rt_refcnt); in rt_wait_refcnt()
675 rt_wait_psref(struct rtentry *rt) in rt_wait_psref() argument
678 psref_target_destroy(&rt->rt_psref, rt_psref_class); in rt_wait_psref()
679 psref_target_init(&rt->rt_psref, rt_psref_class); in rt_wait_psref()
683 _rt_free(struct rtentry *rt) in _rt_free() argument
695 RT_REFCNT_TRACE(rt); in _rt_free()
696 KASSERTMSG(rt->rt_refcnt >= 0, "refcnt=%d", rt->rt_refcnt); in _rt_free()
697 rt_wait_refcnt("free", rt, 0); in _rt_free()
699 psref_target_destroy(&rt->rt_psref, rt_psref_class); in _rt_free()
702 rt_assert_inactive(rt); in _rt_free()
704 ifa = rt->rt_ifa; in _rt_free()
705 rt->rt_ifa = NULL; in _rt_free()
707 rt->rt_ifp = NULL; in _rt_free()
708 cv_destroy(&rt->rt_cv); in _rt_free()
709 rt_destroy(rt); in _rt_free()
710 pool_put(&rtentry_pool, rt); in _rt_free()
718 struct rtentry *rt; in rt_free_work() local
721 if ((rt = SLIST_FIRST(&rt_free_global.queue)) == NULL) { in rt_free_work()
728 atomic_dec_uint(&rt->rt_refcnt); in rt_free_work()
729 _rt_free(rt); in rt_free_work()
734 rt_free(struct rtentry *rt) in rt_free() argument
737 KASSERTMSG(rt->rt_refcnt > 0, "rt_refcnt=%d", rt->rt_refcnt); in rt_free()
739 atomic_dec_uint(&rt->rt_refcnt); in rt_free()
740 _rt_free(rt); in rt_free()
746 SLIST_INSERT_HEAD(&rt_free_global.queue, rt, rt_free); in rt_free()
770 rt_update_prepare(struct rtentry *rt) in rt_update_prepare() argument
773 dlog(LOG_DEBUG, "%s: updating rt=%p lwp=%p\n", __func__, rt, curlwp); in rt_update_prepare()
777 if (!ISSET(rt->rt_flags, RTF_UP)) { in rt_update_prepare()
781 rt->rt_flags |= RTF_UPDATING; in rt_update_prepare()
787 __func__, rt, curlwp); in rt_update_prepare()
790 __func__, rt, curlwp); in rt_update_prepare()
797 rt_wait_refcnt("update", rt, 1); in rt_update_prepare()
798 rt_wait_psref(rt); in rt_update_prepare()
804 rt_update_finish(struct rtentry *rt) in rt_update_finish() argument
808 rt->rt_flags &= ~RTF_UPDATING; in rt_update_finish()
817 dlog(LOG_DEBUG, "%s: updated rt=%p lwp=%p\n", __func__, rt, curlwp); in rt_update_finish()
833 struct rtentry *rt; in rtredirect() local
845 rt = rtalloc1(dst, 0); in rtredirect()
852 if (!(flags & RTF_DONE) && rt && in rtredirect()
853 (sockaddr_cmp(src, rt->rt_gateway) != 0 || rt->rt_ifa != ifa)) in rtredirect()
872 if (rt == NULL || (rt_mask(rt) && rt_mask(rt)->sa_len < 2)) in rtredirect()
878 if (rt->rt_flags & RTF_GATEWAY) { in rtredirect()
879 if (((rt->rt_flags & RTF_HOST) == 0) && (flags & RTF_HOST)) { in rtredirect()
885 if (rt != NULL) in rtredirect()
886 rt_unref(rt); in rtredirect()
894 rt = NULL; in rtredirect()
895 error = rtrequest1(RTM_ADD, &info, &rt); in rtredirect()
896 if (rt != NULL) in rtredirect()
897 flags = rt->rt_flags; in rtredirect()
899 rt_newmsg_dynamic(RTM_ADD, rt); in rtredirect()
909 error = rt_update_prepare(rt); in rtredirect()
913 error = rt_setgate(rt, gateway); in rtredirect()
915 rt->rt_flags |= RTF_MODIFIED; in rtredirect()
920 rt_update_finish(rt); in rtredirect()
934 if (rt) { in rtredirect()
936 *rtp = rt; in rtredirect()
938 rt_unref(rt); in rtredirect()
959 rtdeletemsg(struct rtentry *rt) in rtdeletemsg() argument
971 info.rti_info[RTAX_DST] = rt_getkey(rt); in rtdeletemsg()
972 info.rti_info[RTAX_NETMASK] = rt_mask(rt); in rtdeletemsg()
973 info.rti_info[RTAX_GATEWAY] = rt->rt_gateway; in rtdeletemsg()
974 info.rti_flags = rt->rt_flags; in rtdeletemsg()
1012 struct rtentry *rt; in ifa_ifwithroute_psref() local
1014 rt = rtalloc1_locked(gateway, 0, true, true); in ifa_ifwithroute_psref()
1015 if (rt == NULL) in ifa_ifwithroute_psref()
1017 if (rt->rt_flags & RTF_GATEWAY) { in ifa_ifwithroute_psref()
1018 rt_unref(rt); in ifa_ifwithroute_psref()
1026 IFADDR_READER_FOREACH(ifa, rt->rt_ifp) { in ifa_ifwithroute_psref()
1027 if (ifa == rt->rt_ifa) in ifa_ifwithroute_psref()
1033 rt_unref(rt); in ifa_ifwithroute_psref()
1145 struct rtentry *rt; in rtrequest1() local
1174 if ((rt = rt_lookup(rtbl, dst, netmask)) == NULL) in rtrequest1()
1176 if ((rt = rt_deladdr(rtbl, dst, netmask)) == NULL) in rtrequest1()
1178 rt->rt_flags &= ~RTF_UP; in rtrequest1()
1179 ifa = rt->rt_ifa; in rtrequest1()
1181 rt_ifa_connected(rt, ifa)) { in rtrequest1()
1184 (void *)rt->_rt_key, (void *)ifa); in rtrequest1()
1188 ifa->ifa_rtrequest(RTM_DELETE, rt, info); in rtrequest1()
1192 *ret_nrt = rt; in rtrequest1()
1193 rt_ref(rt); in rtrequest1()
1194 RT_REFCNT_TRACE(rt); in rtrequest1()
1199 rt_timer_remove_all(rt); in rtrequest1()
1206 rt_ref(rt); in rtrequest1()
1207 RT_REFCNT_TRACE(rt); in rtrequest1()
1208 rt_free(rt); in rtrequest1()
1223 rt = pool_get(&rtentry_pool, PR_NOWAIT); in rtrequest1()
1224 if (rt == NULL) in rtrequest1()
1226 memset(rt, 0, sizeof(*rt)); in rtrequest1()
1227 rt->rt_flags = RTF_UP | (flags & ~RTF_DONTCHANGEIFA); in rtrequest1()
1228 LIST_INIT(&rt->rt_timer); in rtrequest1()
1230 RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key); in rtrequest1()
1234 rt_setkey(rt, (struct sockaddr *)&maskeddst, M_NOWAIT); in rtrequest1()
1236 rt_setkey(rt, dst, M_NOWAIT); in rtrequest1()
1238 RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key); in rtrequest1()
1239 if (rt_getkey(rt) == NULL || in rtrequest1()
1240 rt_setgate(rt, gateway) != 0) { in rtrequest1()
1241 pool_put(&rtentry_pool, rt); in rtrequest1()
1245 rt_set_ifa(rt, ifa); in rtrequest1()
1248 tag = rt_settag(rt, info->rti_info[RTAX_TAG]); in rtrequest1()
1252 RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key); in rtrequest1()
1259 rt->rt_ifp = ifa2->ifa_ifp; in rtrequest1()
1261 rt->rt_ifp = ifa->ifa_ifp; in rtrequest1()
1263 rt->rt_ifp = ifa->ifa_ifp; in rtrequest1()
1265 cv_init(&rt->rt_cv, "rtentry"); in rtrequest1()
1266 psref_target_init(&rt->rt_psref, rt_psref_class); in rtrequest1()
1268 RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key); in rtrequest1()
1269 rc = rt_addaddr(rtbl, rt, netmask); in rtrequest1()
1270 RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key); in rtrequest1()
1273 cv_destroy(&rt->rt_cv); in rtrequest1()
1274 rt_destroy(rt); in rtrequest1()
1275 pool_put(&rtentry_pool, rt); in rtrequest1()
1278 RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key); in rtrequest1()
1280 ifa->ifa_rtrequest(req, rt, info); in rtrequest1()
1286 RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key); in rtrequest1()
1288 *ret_nrt = rt; in rtrequest1()
1289 rt_ref(rt); in rtrequest1()
1290 RT_REFCNT_TRACE(rt); in rtrequest1()
1302 if ((rt = rt_lookup(rtbl, dst, netmask)) == NULL) in rtrequest1()
1305 *ret_nrt = rt; in rtrequest1()
1306 rt_ref(rt); in rtrequest1()
1307 RT_REFCNT_TRACE(rt); in rtrequest1()
1323 rt_setgate(struct rtentry *rt, const struct sockaddr *gate) in rt_setgate() argument
1328 KASSERT(rt->_rt_key != NULL); in rt_setgate()
1329 RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key); in rt_setgate()
1335 old = rt->rt_gateway; in rt_setgate()
1336 rt->rt_gateway = new; in rt_setgate()
1340 KASSERT(rt->_rt_key != NULL); in rt_setgate()
1341 RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key); in rt_setgate()
1343 if (rt->rt_flags & RTF_GATEWAY) { in rt_setgate()
1357 if ((rt->rt_rmx.rmx_locks & RTV_MTU) == 0 && in rt_setgate()
1358 rt->rt_rmx.rmx_mtu && in rt_setgate()
1359 rt->rt_rmx.rmx_mtu > gwrt->rt_rmx.rmx_mtu) { in rt_setgate()
1360 rt->rt_rmx.rmx_mtu = gwrt->rt_rmx.rmx_mtu; in rt_setgate()
1365 KASSERT(rt->_rt_key != NULL); in rt_setgate()
1366 RT_DPRINTF("rt->_rt_key = %p\n", (void *)rt->_rt_key); in rt_setgate()
1371 rt_update_get_ifa(const struct rt_addrinfo *info, const struct rtentry *rt, in rt_update_get_ifa() argument
1416 ifa = ifa_ifwithroute_psref(rt->rt_flags, rt_getkey(rt), in rt_update_get_ifa()
1432 rt_update(struct rtentry *rt, struct rt_addrinfo *info, void *rtm) in rt_update() argument
1447 sockaddr_cmp(info->rti_info[RTAX_GATEWAY], rt->rt_gateway) != 0; in rt_update()
1460 error = rt_setgate(rt, info->rti_info[RTAX_GATEWAY]); in rt_update()
1466 tag = rt_settag(rt, info->rti_info[RTAX_TAG]); in rt_update()
1477 new_ifa = rt_update_get_ifa(info, rt, &new_ifp, &psref_new_ifp, in rt_update()
1484 struct ifaddr *oifa = rt->rt_ifa; in rt_update()
1488 oifa->ifa_rtrequest(RTM_DELETE, rt, info); in rt_update()
1489 rt_replace_ifa(rt, ifa); in rt_update()
1490 rt->rt_ifp = new_ifp; in rt_update()
1499 if (new_ifp && rt->rt_ifp != new_ifp && !if_is_deactivated(new_ifp)) { in rt_update()
1500 rt->rt_ifp = new_ifp; in rt_update()
1503 rt_setmetrics(rtm, rt); in rt_update()
1504 if (rt->rt_flags != info->rti_flags) { in rt_update()
1505 rt->rt_flags = (info->rti_flags & ~PRESERVED_RTF) | in rt_update()
1506 (rt->rt_flags & PRESERVED_RTF); in rt_update()
1508 if (rt->rt_ifa->ifa_rtrequest) in rt_update()
1509 rt->rt_ifa->ifa_rtrequest(RTM_ADD, rt, info); in rt_update()
1511 if (ifp_changed && rt_mask(rt) != NULL) in rt_update()
1512 lltable_prefix_free(rt_getkey(rt)->sa_family, rt_getkey(rt), in rt_update()
1513 rt_mask(rt), 0); in rt_update()
1550 rt_newmsg(const int cmd, const struct rtentry *rt) in rt_newmsg() argument
1555 info.rti_info[RTAX_DST] = rt_getkey(rt); in rt_newmsg()
1556 info.rti_info[RTAX_GATEWAY] = rt->rt_gateway; in rt_newmsg()
1557 info.rti_info[RTAX_NETMASK] = rt_mask(rt); in rt_newmsg()
1558 if (rt->rt_ifp) { in rt_newmsg()
1559 info.rti_info[RTAX_IFP] = rt->rt_ifp->if_dl->ifa_addr; in rt_newmsg()
1560 info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr; in rt_newmsg()
1563 rt_missmsg(cmd, &info, rt->rt_flags, 0); in rt_newmsg()
1570 rt_newmsg_dynamic(const int cmd, const struct rtentry *rt) in rt_newmsg_dynamic() argument
1573 struct sockaddr *gateway = rt->rt_gateway; in rt_newmsg_dynamic()
1600 info.rti_info[RTAX_DST] = rt_getkey(rt); in rt_newmsg_dynamic()
1602 info.rti_info[RTAX_NETMASK] = rt_mask(rt); in rt_newmsg_dynamic()
1603 if (rt->rt_ifp) { in rt_newmsg_dynamic()
1604 info.rti_info[RTAX_IFP] = rt->rt_ifp->if_dl->ifa_addr; in rt_newmsg_dynamic()
1605 info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr; in rt_newmsg_dynamic()
1608 rt_missmsg(cmd, &info, rt->rt_flags, 0); in rt_newmsg_dynamic()
1618 struct rtentry *rt; in rtinit() local
1633 if ((rt = rtalloc1(dst, 0)) != NULL) { in rtinit()
1634 if (rt->rt_ifa != ifa) { in rtinit()
1635 rt_unref(rt); in rtinit()
1639 rt_unref(rt); in rtinit()
1661 rt = nrt; in rtinit()
1662 RT_REFCNT_TRACE(rt); in rtinit()
1665 rt_newmsg(cmd, rt); in rtinit()
1666 rt_free(rt); in rtinit()
1670 ifa->ifa_rtrequest(RTM_LLINFO_UPD, rt, &info); in rtinit()
1671 rt_newmsg(RTM_CHANGE, rt); in rtinit()
1672 rt_unref(rt); in rtinit()
1675 KASSERT(rt->rt_ifa == ifa); in rtinit()
1676 rt_newmsg(cmd, rt); in rtinit()
1677 rt_unref(rt); in rtinit()
1678 RT_REFCNT_TRACE(rt); in rtinit()
1691 struct rtentry *rt; in rt_ifa_addlocal() local
1695 rt = rtalloc1(ifa->ifa_addr, 0); in rt_ifa_addlocal()
1697 if (rt != NULL) in rt_ifa_addlocal()
1698 dump_rt(rt); in rt_ifa_addlocal()
1700 if (rt == NULL || (rt->rt_flags & RTF_HOST) == 0 || in rt_ifa_addlocal()
1701 (rt->rt_ifp->if_flags & IFF_LOOPBACK) == 0) in rt_ifa_addlocal()
1727 if (rt != NULL) in rt_ifa_addlocal()
1728 rt_unref(rt); in rt_ifa_addlocal()
1739 struct rtentry *rt; in rt_ifa_remlocal() local
1742 rt = rtalloc1(ifa->ifa_addr, 0); in rt_ifa_remlocal()
1752 if (rt != NULL && in rt_ifa_remlocal()
1753 (rt->rt_flags & RTF_HOST) && in rt_ifa_remlocal()
1754 (rt->rt_ifp->if_flags & IFF_LOOPBACK)) in rt_ifa_remlocal()
1761 e = rtdeletemsg(rt); in rt_ifa_remlocal()
1763 rt_unref(rt); in rt_ifa_remlocal()
1764 rt_free(rt); in rt_ifa_remlocal()
1765 rt = NULL; in rt_ifa_remlocal()
1770 int error = rt_update_prepare(rt); in rt_ifa_remlocal()
1772 rt_replace_ifa(rt, alt_ifa); in rt_ifa_remlocal()
1773 rt_update_finish(rt); in rt_ifa_remlocal()
1782 rt_replace_ifa(rt, alt_ifa); in rt_ifa_remlocal()
1784 rt_newmsg(RTM_CHANGE, rt); in rt_ifa_remlocal()
1788 if (rt != NULL) in rt_ifa_remlocal()
1789 rt_unref(rt); in rt_ifa_remlocal()
1908 rt_timer_remove_all(struct rtentry *rt) in rt_timer_remove_all() argument
1913 while ((r = LIST_FIRST(&rt->rt_timer)) != NULL) { in rt_timer_remove_all()
1926 rt_timer_add(struct rtentry *rt, in rt_timer_add() argument
1938 LIST_FOREACH(r, &rt->rt_timer, rtt_link) { in rt_timer_add()
1959 r->rtt_rt = rt; in rt_timer_add()
1963 LIST_INSERT_HEAD(&rt->rt_timer, r, rtt_link); in rt_timer_add()
2016 struct rtentry *rt; in _rtcache_init() local
2023 rt = rtalloc1(rtcache_getdst(ro), flag); in _rtcache_init()
2024 if (rt != NULL) { in _rtcache_init()
2026 if (ISSET(rt->rt_flags, RTF_UP)) { in _rtcache_init()
2027 ro->_ro_rt = rt; in _rtcache_init()
2029 rtcache_ref(rt, ro); in _rtcache_init()
2032 rt_unref(rt); in _rtcache_init()
2064 struct rtentry *rt; in rtcache_copy() local
2071 rt = rtcache_validate(old_ro); in rtcache_copy()
2080 new_ro->_ro_rt = rt; in rtcache_copy()
2085 rtcache_unref(rt, old_ro); in rtcache_copy()
2091 rtcache_trace(const char *func, struct rtentry *rt, struct route *ro) in rtcache_trace() argument
2097 cpu_index(curcpu()), curlwp, &ro->ro_psref, &rt->rt_psref); in rtcache_trace()
2099 #define RTCACHE_PSREF_TRACE(rt, ro) rtcache_trace(__func__, (rt), (ro)) argument
2101 #define RTCACHE_PSREF_TRACE(rt, ro) do {} while (0) argument
2105 rtcache_ref(struct rtentry *rt, struct route *ro) in rtcache_ref() argument
2108 KASSERT(rt != NULL); in rtcache_ref()
2111 RTCACHE_PSREF_TRACE(rt, ro); in rtcache_ref()
2115 psref_acquire(&ro->ro_psref, &rt->rt_psref, rt_psref_class); in rtcache_ref()
2120 rtcache_unref(struct rtentry *rt, struct route *ro) in rtcache_unref() argument
2123 if (rt == NULL) in rtcache_unref()
2127 psref_release(&ro->ro_psref, &rt->rt_psref, rt_psref_class); in rtcache_unref()
2129 RTCACHE_PSREF_TRACE(rt, ro); in rtcache_unref()
2136 struct rtentry *rt = NULL; in rtcache_validate() local
2145 rt = NULL; in rtcache_validate()
2149 rt = ro->_ro_rt; in rtcache_validate()
2150 if (rt == NULL) in rtcache_validate()
2153 if ((rt->rt_flags & RTF_UP) == 0) { in rtcache_validate()
2154 rt = NULL; in rtcache_validate()
2158 if (ISSET(rt->rt_flags, RTF_UPDATING)) { in rtcache_validate()
2166 rt = NULL; in rtcache_validate()
2170 rtcache_ref(rt, ro); in rtcache_validate()
2173 return rt; in rtcache_validate()
2181 struct rtentry *rt = NULL; in rtcache_lookup2() local
2192 rt = rtcache_validate(ro); in rtcache_lookup2()
2193 if (rt == NULL) { in rtcache_lookup2()
2202 return rt; in rtcache_lookup2()
2207 rt = _rtcache_init(ro, clone); in rtcache_lookup2()
2211 return rt; in rtcache_lookup2()
2274 rt_settag(struct rtentry *rt, const struct sockaddr *tag) in rt_settag() argument
2276 if (rt->rt_tag != tag) { in rt_settag()
2277 if (rt->rt_tag != NULL) in rt_settag()
2278 sockaddr_free(rt->rt_tag); in rt_settag()
2279 rt->rt_tag = sockaddr_dup(tag, M_ZERO | M_NOWAIT); in rt_settag()
2281 return rt->rt_tag; in rt_settag()
2285 rt_gettag(const struct rtentry *rt) in rt_gettag() argument
2287 return rt->rt_tag; in rt_gettag()
2291 rt_check_reject_route(const struct rtentry *rt, const struct ifnet *ifp) in rt_check_reject_route() argument
2294 if ((rt->rt_flags & RTF_REJECT) != 0) { in rt_check_reject_route()
2297 return (rt->rt_flags & RTF_HOST) ? in rt_check_reject_route()
2299 else if (rt->rt_rmx.rmx_expire == 0 || in rt_check_reject_route()
2300 time_uptime < rt->rt_rmx.rmx_expire) in rt_check_reject_route()
2301 return (rt->rt_flags & RTF_GATEWAY) ? in rt_check_reject_route()
2316 struct rtentry *rt, *retrt = NULL; in rt_delete_matched_entries() local
2320 rt = rtbl_search_matched_entry(family, f, v); in rt_delete_matched_entries()
2321 if (rt == NULL) { in rt_delete_matched_entries()
2326 rt_ref(rt); in rt_delete_matched_entries()
2327 RT_REFCNT_TRACE(rt); in rt_delete_matched_entries()
2331 error = rtrequest(RTM_DELETE, rt_getkey(rt), rt->rt_gateway, in rt_delete_matched_entries()
2332 rt_mask(rt), rt->rt_flags, &retrt); in rt_delete_matched_entries()
2334 KASSERT(retrt == rt); in rt_delete_matched_entries()
2339 rt_unref(rt); in rt_delete_matched_entries()
2340 RT_REFCNT_TRACE(rt); in rt_delete_matched_entries()
2344 rt_unref(rt); in rt_delete_matched_entries()
2345 RT_REFCNT_TRACE(rt); in rt_delete_matched_entries()
2348 "error = %d\n", rt->rt_ifp->if_xname, rt, error); in rt_delete_matched_entries()
2372 struct rtentry *rt; in rt_replace_ifa_matched_entries() local
2376 rt = rtbl_search_matched_entry(family, f, v); in rt_replace_ifa_matched_entries()
2377 if (rt == NULL) { in rt_replace_ifa_matched_entries()
2382 rt_ref(rt); in rt_replace_ifa_matched_entries()
2383 RT_REFCNT_TRACE(rt); in rt_replace_ifa_matched_entries()
2388 error = rt_update_prepare(rt); in rt_replace_ifa_matched_entries()
2390 rt_replace_ifa(rt, ifa); in rt_replace_ifa_matched_entries()
2391 rt_update_finish(rt); in rt_replace_ifa_matched_entries()
2392 rt_newmsg(RTM_CHANGE, rt); in rt_replace_ifa_matched_entries()
2401 rt_replace_ifa(rt, ifa); in rt_replace_ifa_matched_entries()
2402 rt_newmsg(RTM_CHANGE, rt); in rt_replace_ifa_matched_entries()
2404 rt_unref(rt); in rt_replace_ifa_matched_entries()
2405 RT_REFCNT_TRACE(rt); in rt_replace_ifa_matched_entries()
2473 db_show_rtentry(struct rtentry *rt, void *w) in db_show_rtentry() argument
2475 db_printf("rtentry=%p", rt); in db_show_rtentry()
2478 rt->rt_flags, rt->rt_refcnt, in db_show_rtentry()
2479 rt->rt_use, (uint64_t)rt->rt_expire); in db_show_rtentry()
2481 db_printf(" key="); db_print_sa(rt_getkey(rt)); in db_show_rtentry()
2482 db_printf(" mask="); db_print_sa(rt_mask(rt)); in db_show_rtentry()
2483 db_printf(" gw="); db_print_sa(rt->rt_gateway); in db_show_rtentry()
2485 db_printf(" ifp=%p ", rt->rt_ifp); in db_show_rtentry()
2486 if (rt->rt_ifp) in db_show_rtentry()
2487 db_printf("(%s)", rt->rt_ifp->if_xname); in db_show_rtentry()
2491 db_printf(" ifa=%p\n", rt->rt_ifa); in db_show_rtentry()
2492 db_print_ifa(rt->rt_ifa); in db_show_rtentry()
2495 rt->rt_gwroute, rt->rt_llinfo); in db_show_rtentry()