Lines Matching refs:dce

139 	dce_t	*dce, *nextdce;  in dcb_reclaim()  local
147 for (dce = dcb->dcb_dce; dce != NULL; dce = nextdce) { in dcb_reclaim()
148 nextdce = dce->dce_next; in dcb_reclaim()
150 mutex_enter(&dce->dce_lock); in dcb_reclaim()
151 if ((dce->dce_flags & DCEF_PMTU) && in dcb_reclaim()
152 TICK_TO_SEC(ddi_get_lbolt64()) - dce->dce_last_change_time > in dcb_reclaim()
154 dce->dce_flags &= ~DCEF_PMTU; in dcb_reclaim()
155 mutex_exit(&dce->dce_lock); in dcb_reclaim()
156 dce_increment_generation(dce); in dcb_reclaim()
158 mutex_exit(&dce->dce_lock); in dcb_reclaim()
162 hash = RANDOM_HASH((uint64_t)((uintptr_t)dce | seed)); in dcb_reclaim()
164 if (dce->dce_flags & DCEF_PMTU) { in dcb_reclaim()
178 dce_delete_locked(dcb, dce); in dcb_reclaim()
179 dce_refrele(dce); in dcb_reclaim()
342 dce_t *dce, *nextdce; in dce_bucket_clean() local
346 for (dce = dcb->dcb_dce; dce != NULL; dce = nextdce) { in dce_bucket_clean()
347 nextdce = dce->dce_next; in dce_bucket_clean()
348 if ((!specific_ifindex) || dce->dce_ifindex == ifindex) { in dce_bucket_clean()
349 dce_delete_locked(dcb, dce); in dce_bucket_clean()
350 dce_refrele(dce); in dce_bucket_clean()
384 dce_t *dce; in dce_get_default() local
386 dce = ipst->ips_dce_default; in dce_get_default()
387 dce_refhold(dce); in dce_get_default()
388 return (dce); in dce_get_default()
439 dce_t *dce; in dce_lookup_v4() local
448 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) { in dce_lookup_v4()
449 if (dce->dce_v4addr == dst) { in dce_lookup_v4()
450 mutex_enter(&dce->dce_lock); in dce_lookup_v4()
451 if (!DCE_IS_CONDEMNED(dce)) { in dce_lookup_v4()
452 dce_refhold(dce); in dce_lookup_v4()
454 *generationp = dce->dce_generation; in dce_lookup_v4()
455 mutex_exit(&dce->dce_lock); in dce_lookup_v4()
457 return (dce); in dce_lookup_v4()
459 mutex_exit(&dce->dce_lock); in dce_lookup_v4()
464 dce = ipst->ips_dce_default; in dce_lookup_v4()
465 dce_refhold(dce); in dce_lookup_v4()
466 return (dce); in dce_lookup_v4()
480 dce_t *dce; in dce_lookup_v6() local
489 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) { in dce_lookup_v6()
490 if (IN6_ARE_ADDR_EQUAL(&dce->dce_v6addr, dst) && in dce_lookup_v6()
491 dce->dce_ifindex == ifindex) { in dce_lookup_v6()
492 mutex_enter(&dce->dce_lock); in dce_lookup_v6()
493 if (!DCE_IS_CONDEMNED(dce)) { in dce_lookup_v6()
494 dce_refhold(dce); in dce_lookup_v6()
496 *generationp = dce->dce_generation; in dce_lookup_v6()
497 mutex_exit(&dce->dce_lock); in dce_lookup_v6()
499 return (dce); in dce_lookup_v6()
501 mutex_exit(&dce->dce_lock); in dce_lookup_v6()
506 dce = ipst->ips_dce_default; in dce_lookup_v6()
507 dce_refhold(dce); in dce_lookup_v6()
508 return (dce); in dce_lookup_v6()
522 dce_t *dce; in dce_lookup_and_add_v4() local
533 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) { in dce_lookup_and_add_v4()
534 if (dce->dce_v4addr == dst) { in dce_lookup_and_add_v4()
535 mutex_enter(&dce->dce_lock); in dce_lookup_and_add_v4()
536 if (!DCE_IS_CONDEMNED(dce)) { in dce_lookup_and_add_v4()
537 dce_refhold(dce); in dce_lookup_and_add_v4()
538 mutex_exit(&dce->dce_lock); in dce_lookup_and_add_v4()
540 return (dce); in dce_lookup_and_add_v4()
542 mutex_exit(&dce->dce_lock); in dce_lookup_and_add_v4()
545 dce = kmem_cache_alloc(dce_cache, KM_NOSLEEP); in dce_lookup_and_add_v4()
546 if (dce == NULL) { in dce_lookup_and_add_v4()
550 bzero(dce, sizeof (dce_t)); in dce_lookup_and_add_v4()
551 dce->dce_ipst = ipst; /* No netstack_hold */ in dce_lookup_and_add_v4()
552 dce->dce_v4addr = dst; in dce_lookup_and_add_v4()
553 dce->dce_generation = DCE_GENERATION_INITIAL; in dce_lookup_and_add_v4()
554 dce->dce_ipversion = IPV4_VERSION; in dce_lookup_and_add_v4()
555 dce->dce_last_change_time = TICK_TO_SEC(ddi_get_lbolt64()); in dce_lookup_and_add_v4()
556 dce_refhold(dce); /* For the hash list */ in dce_lookup_and_add_v4()
560 dcb->dcb_dce->dce_ptpn = &dce->dce_next; in dce_lookup_and_add_v4()
561 dce->dce_next = dcb->dcb_dce; in dce_lookup_and_add_v4()
562 dce->dce_ptpn = &dcb->dcb_dce; in dce_lookup_and_add_v4()
563 dcb->dcb_dce = dce; in dce_lookup_and_add_v4()
564 dce->dce_bucket = dcb; in dce_lookup_and_add_v4()
566 dce_refhold(dce); /* For the caller */ in dce_lookup_and_add_v4()
570 dce->dce_ident = ipst->ips_dce_default->dce_ident + 1; in dce_lookup_and_add_v4()
573 return (dce); in dce_lookup_and_add_v4()
588 dce_t *dce; in dce_lookup_and_add_v6() local
602 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) { in dce_lookup_and_add_v6()
603 if (IN6_ARE_ADDR_EQUAL(&dce->dce_v6addr, dst) && in dce_lookup_and_add_v6()
604 dce->dce_ifindex == ifindex) { in dce_lookup_and_add_v6()
605 mutex_enter(&dce->dce_lock); in dce_lookup_and_add_v6()
606 if (!DCE_IS_CONDEMNED(dce)) { in dce_lookup_and_add_v6()
607 dce_refhold(dce); in dce_lookup_and_add_v6()
608 mutex_exit(&dce->dce_lock); in dce_lookup_and_add_v6()
610 return (dce); in dce_lookup_and_add_v6()
612 mutex_exit(&dce->dce_lock); in dce_lookup_and_add_v6()
616 dce = kmem_cache_alloc(dce_cache, KM_NOSLEEP); in dce_lookup_and_add_v6()
617 if (dce == NULL) { in dce_lookup_and_add_v6()
621 bzero(dce, sizeof (dce_t)); in dce_lookup_and_add_v6()
622 dce->dce_ipst = ipst; /* No netstack_hold */ in dce_lookup_and_add_v6()
623 dce->dce_v6addr = *dst; in dce_lookup_and_add_v6()
624 dce->dce_ifindex = ifindex; in dce_lookup_and_add_v6()
625 dce->dce_generation = DCE_GENERATION_INITIAL; in dce_lookup_and_add_v6()
626 dce->dce_ipversion = IPV6_VERSION; in dce_lookup_and_add_v6()
627 dce->dce_last_change_time = TICK_TO_SEC(ddi_get_lbolt64()); in dce_lookup_and_add_v6()
628 dce_refhold(dce); /* For the hash list */ in dce_lookup_and_add_v6()
632 dcb->dcb_dce->dce_ptpn = &dce->dce_next; in dce_lookup_and_add_v6()
633 dce->dce_next = dcb->dcb_dce; in dce_lookup_and_add_v6()
634 dce->dce_ptpn = &dcb->dcb_dce; in dce_lookup_and_add_v6()
635 dcb->dcb_dce = dce; in dce_lookup_and_add_v6()
636 dce->dce_bucket = dcb; in dce_lookup_and_add_v6()
638 dce_refhold(dce); /* For the caller */ in dce_lookup_and_add_v6()
642 dce->dce_ident = ipst->ips_dce_default->dce_ident + 1; in dce_lookup_and_add_v6()
644 return (dce); in dce_lookup_and_add_v6()
656 dce_setuinfo(dce_t *dce, iulp_t *uinfo) in dce_setuinfo() argument
664 mutex_enter(&dce->dce_lock); in dce_setuinfo()
671 if (dce->dce_uinfo.iulp_rtt != 0) { in dce_setuinfo()
672 dce->dce_uinfo.iulp_rtt = (dce->dce_uinfo.iulp_rtt + in dce_setuinfo()
675 dce->dce_uinfo.iulp_rtt = uinfo->iulp_rtt + in dce_setuinfo()
678 if (dce->dce_uinfo.iulp_rtt_sd != 0) { in dce_setuinfo()
679 dce->dce_uinfo.iulp_rtt_sd = in dce_setuinfo()
680 (dce->dce_uinfo.iulp_rtt_sd + in dce_setuinfo()
683 dce->dce_uinfo.iulp_rtt_sd = uinfo->iulp_rtt_sd + in dce_setuinfo()
688 if (dce->dce_flags & DCEF_PMTU) { in dce_setuinfo()
689 dce->dce_pmtu = MIN(uinfo->iulp_mtu, dce->dce_pmtu); in dce_setuinfo()
691 dce->dce_pmtu = MIN(uinfo->iulp_mtu, IP_MAXPACKET); in dce_setuinfo()
692 dce->dce_flags |= DCEF_PMTU; in dce_setuinfo()
694 dce->dce_last_change_time = TICK_TO_SEC(ddi_get_lbolt64()); in dce_setuinfo()
697 if (dce->dce_uinfo.iulp_ssthresh != 0) in dce_setuinfo()
698 dce->dce_uinfo.iulp_ssthresh = in dce_setuinfo()
700 dce->dce_uinfo.iulp_ssthresh) >> 1; in dce_setuinfo()
702 dce->dce_uinfo.iulp_ssthresh = uinfo->iulp_ssthresh; in dce_setuinfo()
705 dce->dce_flags |= DCEF_UINFO; in dce_setuinfo()
706 mutex_exit(&dce->dce_lock); in dce_setuinfo()
713 dce_t *dce; in dce_update_uinfo_v4() local
715 dce = dce_lookup_and_add_v4(dst, ipst); in dce_update_uinfo_v4()
716 if (dce == NULL) in dce_update_uinfo_v4()
719 dce_setuinfo(dce, uinfo); in dce_update_uinfo_v4()
720 dce_refrele(dce); in dce_update_uinfo_v4()
728 dce_t *dce; in dce_update_uinfo_v6() local
730 dce = dce_lookup_and_add_v6(dst, ifindex, ipst); in dce_update_uinfo_v6()
731 if (dce == NULL) in dce_update_uinfo_v6()
734 dce_setuinfo(dce, uinfo); in dce_update_uinfo_v6()
735 dce_refrele(dce); in dce_update_uinfo_v6()
755 dce_make_condemned(dce_t *dce) in dce_make_condemned() argument
757 ip_stack_t *ipst = dce->dce_ipst; in dce_make_condemned()
759 mutex_enter(&dce->dce_lock); in dce_make_condemned()
760 ASSERT(!DCE_IS_CONDEMNED(dce)); in dce_make_condemned()
761 dce->dce_generation = DCE_GENERATION_CONDEMNED; in dce_make_condemned()
762 mutex_exit(&dce->dce_lock); in dce_make_condemned()
771 dce_increment_generation(dce_t *dce) in dce_increment_generation() argument
775 mutex_enter(&dce->dce_lock); in dce_increment_generation()
776 if (!DCE_IS_CONDEMNED(dce)) { in dce_increment_generation()
777 generation = dce->dce_generation + 1; in dce_increment_generation()
781 dce->dce_generation = generation; in dce_increment_generation()
783 mutex_exit(&dce->dce_lock); in dce_increment_generation()
795 dce_t *dce; in dce_increment_all_generations() local
803 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) { in dce_increment_all_generations()
804 if (DCE_IS_CONDEMNED(dce)) in dce_increment_all_generations()
806 dce_increment_generation(dce); in dce_increment_all_generations()
818 dce_delete_locked(dcb_t *dcb, dce_t *dce) in dce_delete_locked() argument
820 dce->dce_bucket = NULL; in dce_delete_locked()
821 *dce->dce_ptpn = dce->dce_next; in dce_delete_locked()
822 if (dce->dce_next != NULL) in dce_delete_locked()
823 dce->dce_next->dce_ptpn = dce->dce_ptpn; in dce_delete_locked()
824 dce->dce_ptpn = NULL; in dce_delete_locked()
825 dce->dce_next = NULL; in dce_delete_locked()
827 dce_make_condemned(dce); in dce_delete_locked()
831 dce_inactive(dce_t *dce) in dce_inactive() argument
833 ip_stack_t *ipst = dce->dce_ipst; in dce_inactive()
835 ASSERT(!(dce->dce_flags & DCEF_DEFAULT)); in dce_inactive()
836 ASSERT(dce->dce_ptpn == NULL); in dce_inactive()
837 ASSERT(dce->dce_bucket == NULL); in dce_inactive()
840 if (DCE_IS_CONDEMNED(dce)) in dce_inactive()
843 kmem_cache_free(dce_cache, dce); in dce_inactive()
847 dce_refrele(dce_t *dce) in dce_refrele() argument
849 ASSERT(dce->dce_refcnt != 0); in dce_refrele()
850 if (atomic_dec_32_nv(&dce->dce_refcnt) == 0) in dce_refrele()
851 dce_inactive(dce); in dce_refrele()
855 dce_refhold(dce_t *dce) in dce_refhold() argument
857 atomic_inc_32(&dce->dce_refcnt); in dce_refhold()
858 ASSERT(dce->dce_refcnt != 0); in dce_refhold()
863 dce_refrele_notr(dce_t *dce) in dce_refrele_notr() argument
865 ASSERT(dce->dce_refcnt != 0); in dce_refrele_notr()
866 if (atomic_dec_32_nv(&dce->dce_refcnt) == 0) in dce_refrele_notr()
867 dce_inactive(dce); in dce_refrele_notr()
871 dce_refhold_notr(dce_t *dce) in dce_refhold_notr() argument
873 atomic_inc_32(&dce->dce_refcnt); in dce_refhold_notr()
874 ASSERT(dce->dce_refcnt != 0); in dce_refhold_notr()
885 dce_t *dce; in ip_snmp_get_mib2_ip_dce() local
906 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) { in ip_snmp_get_mib2_ip_dce()
907 dest_cache.DestIpv4Address = dce->dce_v4addr; in ip_snmp_get_mib2_ip_dce()
908 dest_cache.DestFlags = dce->dce_flags; in ip_snmp_get_mib2_ip_dce()
909 if (dce->dce_flags & DCEF_PMTU) in ip_snmp_get_mib2_ip_dce()
910 dest_cache.DestPmtu = dce->dce_pmtu; in ip_snmp_get_mib2_ip_dce()
913 dest_cache.DestIdent = dce->dce_ident; in ip_snmp_get_mib2_ip_dce()
916 dce->dce_last_change_time; in ip_snmp_get_mib2_ip_dce()
948 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) { in ip_snmp_get_mib2_ip_dce()
949 dest_cache.DestIpv6Address = dce->dce_v6addr; in ip_snmp_get_mib2_ip_dce()
950 dest_cache.DestFlags = dce->dce_flags; in ip_snmp_get_mib2_ip_dce()
951 if (dce->dce_flags & DCEF_PMTU) in ip_snmp_get_mib2_ip_dce()
952 dest_cache.DestPmtu = dce->dce_pmtu; in ip_snmp_get_mib2_ip_dce()
955 dest_cache.DestIdent = dce->dce_ident; in ip_snmp_get_mib2_ip_dce()
956 if (IN6_IS_ADDR_LINKSCOPE(&dce->dce_v6addr)) in ip_snmp_get_mib2_ip_dce()
957 dest_cache.DestIfindex = dce->dce_ifindex; in ip_snmp_get_mib2_ip_dce()
961 dce->dce_last_change_time; in ip_snmp_get_mib2_ip_dce()