Lines Matching defs:rt

280 arp_llinfo_purge(struct rtentry *rt)
282 struct llinfo_arp *la = rt->rt_llinfo;
284 RT_LOCK_ASSERT_HELD(rt);
285 VERIFY(rt->rt_llinfo_purge == arp_llinfo_purge && la != NULL);
288 RT_CONVERT_LOCK(rt);
296 arp_llinfo_get_ri(struct rtentry *rt, struct rt_reach_info *ri)
298 struct llinfo_arp *la = rt->rt_llinfo;
318 arp_llinfo_get_iflri(struct rtentry *rt, struct ifnet_llreach_info *iflri)
320 struct llinfo_arp *la = rt->rt_llinfo;
424 arp_llreach_alloc(struct rtentry *rt, struct ifnet *ifp, void *addr,
427 VERIFY(rt->rt_expire == 0 || rt->rt_rmx.rmx_expire != 0);
428 VERIFY(rt->rt_expire != 0 || rt->rt_rmx.rmx_expire == 0);
430 rt->rt_expire != 0 && rt->rt_ifp != lo_ifp &&
433 struct llinfo_arp *la = rt->rt_llinfo;
438 RT_CONVERT_LOCK(rt);
450 VERIFY(rt->rt_llinfo_purge != NULL);
451 rt->rt_llinfo_purge(rt);
480 &SIN(rt_key(rt))->sin_addr, tmp, sizeof (tmp)));
491 struct rtentry *rt = la->la_rt;
495 RT_LOCK_ASSERT_HELD(rt);
497 if (rt->rt_refcnt > 0 && (sdl = SDL(rt->rt_gateway)) &&
501 rt->rt_flags &= ~RTF_REJECT;
502 RT_UNLOCK(rt);
510 if (rt->rt_refcnt == 0)
511 rt_clear_idleref(rt);
512 RT_UNLOCK(rt);
519 RT_UNLOCK(rt);
520 rtrequest_locked(RTM_DELETE, rt_key(rt), NULL, rt_mask(rt),
536 struct rtentry *rt = la->la_rt;
538 RT_LOCK(rt);
539 VERIFY(rt->rt_expire == 0 || rt->rt_rmx.rmx_expire != 0);
540 VERIFY(rt->rt_expire != 0 || rt->rt_rmx.rmx_expire == 0);
541 if (rt->rt_expire && rt->rt_expire <= timenow)
544 RT_UNLOCK(rt);
550 arp_validate(struct rtentry *rt)
552 struct llinfo_arp *la = rt->rt_llinfo;
554 RT_LOCK_ASSERT_HELD(rt);
560 rt_set_idleref(rt);
581 struct rtentry *rt,
584 struct sockaddr *gate = rt->rt_gateway;
585 struct llinfo_arp *la = rt->rt_llinfo;
594 RT_LOCK_ASSERT_HELD(rt);
596 if (rt->rt_flags & RTF_GATEWAY)
607 if ((rt->rt_flags & RTF_HOST) == 0 && rt_mask(rt) != NULL &&
608 SIN(rt_mask(rt))->sin_addr.s_addr != 0xffffffff)
609 rt->rt_flags |= RTF_CLONING;
610 if (rt->rt_flags & RTF_CLONING) {
614 if (rt_setgate(rt, rt_key(rt),
616 gate = rt->rt_gateway;
617 SDL(gate)->sdl_type = rt->rt_ifp->if_type;
618 SDL(gate)->sdl_index = rt->rt_ifp->if_index;
623 rt_setexpire(rt, MAX(timenow, 1));
628 if (rt->rt_flags & RTF_ANNOUNCE) {
631 RT_UNLOCK(rt);
632 dlil_send_arp(rt->rt_ifp, ARPOP_REQUEST,
633 SDL(gate), rt_key(rt), NULL, rt_key(rt), 0);
634 RT_LOCK(rt);
644 SDL(gate)->sdl_type = rt->rt_ifp->if_type;
645 SDL(gate)->sdl_index = rt->rt_ifp->if_index;
652 rt->rt_llinfo = la = arp_llinfo_alloc();
658 rt->rt_llinfo_get_ri = arp_llinfo_get_ri;
659 rt->rt_llinfo_get_iflri = arp_llinfo_get_iflri;
660 rt->rt_llinfo_purge = arp_llinfo_purge;
661 rt->rt_llinfo_free = arp_llinfo_free;
665 la->la_rt = rt;
666 rt->rt_flags |= RTF_LLINFO;
676 if (IN_MULTICAST(ntohl(SIN(rt_key(rt))->sin_addr.s_addr))) {
677 RT_UNLOCK(rt);
678 dlil_resolve_multi(rt->rt_ifp, rt_key(rt), gate,
680 RT_LOCK(rt);
681 rt_setexpire(rt, 0);
683 else if (in_broadcast(SIN(rt_key(rt))->sin_addr, rt->rt_ifp)) {
686 ifnet_llbroadcast_copy_bytes(rt->rt_ifp,
693 rt_setexpire(rt, MAX(timenow, 1));
694 } else if (IN_LINKLOCAL(ntohl(SIN(rt_key(rt))->sin_addr.s_addr))) {
703 rt->rt_flags |= RTF_STATIC;
707 RT_CONVERT_LOCK(rt);
708 IFA_LOCK_SPIN(rt->rt_ifa);
709 if (SIN(rt_key(rt))->sin_addr.s_addr ==
710 (IA_SIN(rt->rt_ifa))->sin_addr.s_addr) {
711 IFA_UNLOCK(rt->rt_ifa);
723 rt_setexpire(rt, 0);
724 ifnet_lladdr_copy_bytes(rt->rt_ifp, LLADDR(SDL(gate)),
725 SDL(gate)->sdl_alen = rt->rt_ifp->if_addrlen);
727 if (rt->rt_ifp != lo_ifp) {
731 if (rt->rt_llinfo_purge != NULL)
732 rt->rt_llinfo_purge(rt);
738 if (rt->rt_if_ref_fn != NULL) {
739 rt->rt_if_ref_fn(lo_ifp, 1);
740 rt->rt_if_ref_fn(rt->rt_ifp, -1);
743 rt->rt_ifp = lo_ifp;
746 IFA_UNLOCK(rt->rt_ifa);
756 * itself is to be freed. rt->rt_llinfo still points to
767 if (rt->rt_llinfo_purge != NULL)
768 rt->rt_llinfo_purge(rt);
770 rt->rt_flags &= ~RTF_LLINFO;
816 route_t rt;
830 rt = rtalloc1_scoped((struct sockaddr*)&sin, create, 0, ifscope);
831 if (rt == NULL)
834 RT_LOCK(rt);
836 if (rt->rt_flags & RTF_GATEWAY) {
839 } else if (!(rt->rt_flags & RTF_LLINFO)) {
842 } else if (rt->rt_gateway->sa_family != AF_LINK) {
861 if (rt->rt_refcnt == 1 &&
862 (rt->rt_flags & (RTF_WASCLONED | RTF_STATIC)) ==
869 rt->rt_flags |= RTF_CONDEMNED;
870 RT_UNLOCK(rt);
871 rtrequest(RTM_DELETE, rt_key(rt), rt->rt_gateway,
872 rt_mask(rt), rt->rt_flags, 0);
873 rtfree(rt);
875 RT_REMREF_LOCKED(rt);
876 RT_UNLOCK(rt);
882 * Caller releases reference and does RT_UNLOCK(rt).
884 *route = rt;