Lines Matching defs:dce
67 * That entry holds both the IP ident value and the dce generation number.
126 * Reclaim a fraction of dce's in the dcb.
134 dce_t *dce, *nextdce;
142 for (dce = dcb->dcb_dce; dce != NULL; dce = nextdce) {
143 nextdce = dce->dce_next;
145 mutex_enter(&dce->dce_lock);
146 if ((dce->dce_flags & DCEF_PMTU) &&
147 TICK_TO_SEC(ddi_get_lbolt64()) - dce->dce_last_change_time >
149 dce->dce_flags &= ~DCEF_PMTU;
150 mutex_exit(&dce->dce_lock);
151 dce_increment_generation(dce);
153 mutex_exit(&dce->dce_lock);
157 hash = RANDOM_HASH((uint64_t)((uintptr_t)dce | seed));
159 if (dce->dce_flags & DCEF_PMTU) {
173 dce_delete_locked(dcb, dce);
174 dce_refrele(dce);
198 * Walk all CONNs that can have a reference on an ire, nce or dce.
354 dce_t *dce;
356 dce = ipst->ips_dce_default;
357 dce_refhold(dce);
358 return (dce);
409 dce_t *dce;
418 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
419 if (dce->dce_v4addr == dst) {
420 mutex_enter(&dce->dce_lock);
421 if (!DCE_IS_CONDEMNED(dce)) {
422 dce_refhold(dce);
424 *generationp = dce->dce_generation;
425 mutex_exit(&dce->dce_lock);
427 return (dce);
429 mutex_exit(&dce->dce_lock);
434 dce = ipst->ips_dce_default;
435 dce_refhold(dce);
436 return (dce);
450 dce_t *dce;
459 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
460 if (IN6_ARE_ADDR_EQUAL(&dce->dce_v6addr, dst) &&
461 dce->dce_ifindex == ifindex) {
462 mutex_enter(&dce->dce_lock);
463 if (!DCE_IS_CONDEMNED(dce)) {
464 dce_refhold(dce);
466 *generationp = dce->dce_generation;
467 mutex_exit(&dce->dce_lock);
469 return (dce);
471 mutex_exit(&dce->dce_lock);
476 dce = ipst->ips_dce_default;
477 dce_refhold(dce);
478 return (dce);
492 dce_t *dce;
503 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
504 if (dce->dce_v4addr == dst) {
505 mutex_enter(&dce->dce_lock);
506 if (!DCE_IS_CONDEMNED(dce)) {
507 dce_refhold(dce);
508 mutex_exit(&dce->dce_lock);
510 return (dce);
512 mutex_exit(&dce->dce_lock);
515 dce = kmem_cache_alloc(dce_cache, KM_NOSLEEP);
516 if (dce == NULL) {
520 bzero(dce, sizeof (dce_t));
521 dce->dce_ipst = ipst; /* No netstack_hold */
522 dce->dce_v4addr = dst;
523 dce->dce_generation = DCE_GENERATION_INITIAL;
524 dce->dce_ipversion = IPV4_VERSION;
525 dce->dce_last_change_time = TICK_TO_SEC(ddi_get_lbolt64());
526 dce_refhold(dce); /* For the hash list */
530 dcb->dcb_dce->dce_ptpn = &dce->dce_next;
531 dce->dce_next = dcb->dcb_dce;
532 dce->dce_ptpn = &dcb->dcb_dce;
533 dcb->dcb_dce = dce;
534 dce->dce_bucket = dcb;
536 dce_refhold(dce); /* For the caller */
540 dce->dce_ident = ipst->ips_dce_default->dce_ident + 1;
543 return (dce);
558 dce_t *dce;
572 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
573 if (IN6_ARE_ADDR_EQUAL(&dce->dce_v6addr, dst) &&
574 dce->dce_ifindex == ifindex) {
575 mutex_enter(&dce->dce_lock);
576 if (!DCE_IS_CONDEMNED(dce)) {
577 dce_refhold(dce);
578 mutex_exit(&dce->dce_lock);
580 return (dce);
582 mutex_exit(&dce->dce_lock);
586 dce = kmem_cache_alloc(dce_cache, KM_NOSLEEP);
587 if (dce == NULL) {
591 bzero(dce, sizeof (dce_t));
592 dce->dce_ipst = ipst; /* No netstack_hold */
593 dce->dce_v6addr = *dst;
594 dce->dce_ifindex = ifindex;
595 dce->dce_generation = DCE_GENERATION_INITIAL;
596 dce->dce_ipversion = IPV6_VERSION;
597 dce->dce_last_change_time = TICK_TO_SEC(ddi_get_lbolt64());
598 dce_refhold(dce); /* For the hash list */
602 dcb->dcb_dce->dce_ptpn = &dce->dce_next;
603 dce->dce_next = dcb->dcb_dce;
604 dce->dce_ptpn = &dcb->dcb_dce;
605 dcb->dcb_dce = dce;
606 dce->dce_bucket = dcb;
608 dce_refhold(dce); /* For the caller */
612 dce->dce_ident = ipst->ips_dce_default->dce_ident + 1;
614 return (dce);
618 * Set/update uinfo. Creates a per-destination dce if none exists.
626 dce_setuinfo(dce_t *dce, iulp_t *uinfo)
634 mutex_enter(&dce->dce_lock);
641 if (dce->dce_uinfo.iulp_rtt != 0) {
642 dce->dce_uinfo.iulp_rtt = (dce->dce_uinfo.iulp_rtt +
645 dce->dce_uinfo.iulp_rtt = uinfo->iulp_rtt +
648 if (dce->dce_uinfo.iulp_rtt_sd != 0) {
649 dce->dce_uinfo.iulp_rtt_sd =
650 (dce->dce_uinfo.iulp_rtt_sd +
653 dce->dce_uinfo.iulp_rtt_sd = uinfo->iulp_rtt_sd +
658 if (dce->dce_flags & DCEF_PMTU) {
659 dce->dce_pmtu = MIN(uinfo->iulp_mtu, dce->dce_pmtu);
661 dce->dce_pmtu = MIN(uinfo->iulp_mtu, IP_MAXPACKET);
662 dce->dce_flags |= DCEF_PMTU;
664 dce->dce_last_change_time = TICK_TO_SEC(ddi_get_lbolt64());
667 if (dce->dce_uinfo.iulp_ssthresh != 0)
668 dce->dce_uinfo.iulp_ssthresh =
670 dce->dce_uinfo.iulp_ssthresh) >> 1;
672 dce->dce_uinfo.iulp_ssthresh = uinfo->iulp_ssthresh;
675 dce->dce_flags |= DCEF_UINFO;
676 mutex_exit(&dce->dce_lock);
683 dce_t *dce;
685 dce = dce_lookup_and_add_v4(dst, ipst);
686 if (dce == NULL)
689 dce_setuinfo(dce, uinfo);
690 dce_refrele(dce);
698 dce_t *dce;
700 dce = dce_lookup_and_add_v6(dst, ifindex, ipst);
701 if (dce == NULL)
704 dce_setuinfo(dce, uinfo);
705 dce_refrele(dce);
725 dce_make_condemned(dce_t *dce)
727 ip_stack_t *ipst = dce->dce_ipst;
729 mutex_enter(&dce->dce_lock);
730 ASSERT(!DCE_IS_CONDEMNED(dce));
731 dce->dce_generation = DCE_GENERATION_CONDEMNED;
732 mutex_exit(&dce->dce_lock);
741 dce_increment_generation(dce_t *dce)
745 mutex_enter(&dce->dce_lock);
746 if (!DCE_IS_CONDEMNED(dce)) {
747 generation = dce->dce_generation + 1;
751 dce->dce_generation = generation;
753 mutex_exit(&dce->dce_lock);
765 dce_t *dce;
773 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
774 if (DCE_IS_CONDEMNED(dce))
776 dce_increment_generation(dce);
788 dce_delete_locked(dcb_t *dcb, dce_t *dce)
790 dce->dce_bucket = NULL;
791 *dce->dce_ptpn = dce->dce_next;
792 if (dce->dce_next != NULL)
793 dce->dce_next->dce_ptpn = dce->dce_ptpn;
794 dce->dce_ptpn = NULL;
795 dce->dce_next = NULL;
797 dce_make_condemned(dce);
801 dce_inactive(dce_t *dce)
803 ip_stack_t *ipst = dce->dce_ipst;
805 ASSERT(!(dce->dce_flags & DCEF_DEFAULT));
806 ASSERT(dce->dce_ptpn == NULL);
807 ASSERT(dce->dce_bucket == NULL);
810 if (DCE_IS_CONDEMNED(dce))
813 kmem_cache_free(dce_cache, dce);
817 dce_refrele(dce_t *dce)
819 ASSERT(dce->dce_refcnt != 0);
820 if (atomic_dec_32_nv(&dce->dce_refcnt) == 0)
821 dce_inactive(dce);
825 dce_refhold(dce_t *dce)
827 atomic_inc_32(&dce->dce_refcnt);
828 ASSERT(dce->dce_refcnt != 0);
833 dce_refrele_notr(dce_t *dce)
835 ASSERT(dce->dce_refcnt != 0);
836 if (atomic_dec_32_nv(&dce->dce_refcnt) == 0)
837 dce_inactive(dce);
841 dce_refhold_notr(dce_t *dce)
843 atomic_inc_32(&dce->dce_refcnt);
844 ASSERT(dce->dce_refcnt != 0);
855 dce_t *dce;
876 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
877 dest_cache.DestIpv4Address = dce->dce_v4addr;
878 dest_cache.DestFlags = dce->dce_flags;
879 if (dce->dce_flags & DCEF_PMTU)
880 dest_cache.DestPmtu = dce->dce_pmtu;
883 dest_cache.DestIdent = dce->dce_ident;
886 dce->dce_last_change_time;
918 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
919 dest_cache.DestIpv6Address = dce->dce_v6addr;
920 dest_cache.DestFlags = dce->dce_flags;
921 if (dce->dce_flags & DCEF_PMTU)
922 dest_cache.DestPmtu = dce->dce_pmtu;
925 dest_cache.DestIdent = dce->dce_ident;
926 if (IN6_IS_ADDR_LINKSCOPE(&dce->dce_v6addr))
927 dest_cache.DestIfindex = dce->dce_ifindex;
931 dce->dce_last_change_time;
959 dce_t *dce, *nextdce;
965 for (dce = dcb->dcb_dce; dce != NULL; dce = nextdce) {
966 nextdce = dce->dce_next;
967 if (dce->dce_ifindex == ifindex) {
968 dce_delete_locked(dcb, dce);
969 dce_refrele(dce);