Lines Matching defs:dce

64  * That entry holds both the IP ident value and the dce generation number.
111 * Reclaim a fraction of dce's in the dcb.
119 dce_t *dce, *nextdce;
122 for (dce = dcb->dcb_dce; dce != NULL; dce = nextdce) {
123 nextdce = dce->dce_next;
125 mutex_enter(&dce->dce_lock);
126 if ((dce->dce_flags & DCEF_PMTU) &&
127 TICK_TO_SEC(ddi_get_lbolt64()) - dce->dce_last_change_time >
129 dce->dce_flags &= ~DCEF_PMTU;
130 mutex_exit(&dce->dce_lock);
131 dce_increment_generation(dce);
133 mutex_exit(&dce->dce_lock);
135 hash = RANDOM_HASH((uint64_t)(uintptr_t)dce);
136 if (dce->dce_flags & DCEF_PMTU) {
145 dce_delete_locked(dcb, dce);
146 dce_refrele(dce);
170 * Walk all CONNs that can have a reference on an ire, nce or dce.
275 dce_t *dce;
277 dce = ipst->ips_dce_default;
278 dce_refhold(dce);
279 return (dce);
330 dce_t *dce;
339 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
340 if (dce->dce_v4addr == dst) {
341 mutex_enter(&dce->dce_lock);
342 if (!DCE_IS_CONDEMNED(dce)) {
343 dce_refhold(dce);
345 *generationp = dce->dce_generation;
346 mutex_exit(&dce->dce_lock);
348 return (dce);
350 mutex_exit(&dce->dce_lock);
355 dce = ipst->ips_dce_default;
356 dce_refhold(dce);
357 return (dce);
371 dce_t *dce;
380 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
381 if (IN6_ARE_ADDR_EQUAL(&dce->dce_v6addr, dst) &&
382 dce->dce_ifindex == ifindex) {
383 mutex_enter(&dce->dce_lock);
384 if (!DCE_IS_CONDEMNED(dce)) {
385 dce_refhold(dce);
387 *generationp = dce->dce_generation;
388 mutex_exit(&dce->dce_lock);
390 return (dce);
392 mutex_exit(&dce->dce_lock);
397 dce = ipst->ips_dce_default;
398 dce_refhold(dce);
399 return (dce);
413 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);
423 mutex_exit(&dce->dce_lock);
425 return (dce);
427 mutex_exit(&dce->dce_lock);
430 dce = kmem_cache_alloc(dce_cache, KM_NOSLEEP);
431 if (dce == NULL) {
435 bzero(dce, sizeof (dce_t));
436 dce->dce_ipst = ipst; /* No netstack_hold */
437 dce->dce_v4addr = dst;
438 dce->dce_generation = DCE_GENERATION_INITIAL;
439 dce->dce_ipversion = IPV4_VERSION;
440 dce->dce_last_change_time = TICK_TO_SEC(ddi_get_lbolt64());
441 dce_refhold(dce); /* For the hash list */
445 dcb->dcb_dce->dce_ptpn = &dce->dce_next;
446 dce->dce_next = dcb->dcb_dce;
447 dce->dce_ptpn = &dcb->dcb_dce;
448 dcb->dcb_dce = dce;
449 dce->dce_bucket = dcb;
450 dce_refhold(dce); /* For the caller */
454 dce->dce_ident = ipst->ips_dce_default->dce_ident + 1;
457 return (dce);
472 dce_t *dce;
480 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
481 if (IN6_ARE_ADDR_EQUAL(&dce->dce_v6addr, dst) &&
482 dce->dce_ifindex == ifindex) {
483 mutex_enter(&dce->dce_lock);
484 if (!DCE_IS_CONDEMNED(dce)) {
485 dce_refhold(dce);
486 mutex_exit(&dce->dce_lock);
488 return (dce);
490 mutex_exit(&dce->dce_lock);
494 dce = kmem_cache_alloc(dce_cache, KM_NOSLEEP);
495 if (dce == NULL) {
499 bzero(dce, sizeof (dce_t));
500 dce->dce_ipst = ipst; /* No netstack_hold */
501 dce->dce_v6addr = *dst;
502 dce->dce_ifindex = ifindex;
503 dce->dce_generation = DCE_GENERATION_INITIAL;
504 dce->dce_ipversion = IPV6_VERSION;
505 dce->dce_last_change_time = TICK_TO_SEC(ddi_get_lbolt64());
506 dce_refhold(dce); /* For the hash list */
510 dcb->dcb_dce->dce_ptpn = &dce->dce_next;
511 dce->dce_next = dcb->dcb_dce;
512 dce->dce_ptpn = &dcb->dcb_dce;
513 dcb->dcb_dce = dce;
514 dce->dce_bucket = dcb;
516 dce_refhold(dce); /* For the caller */
520 dce->dce_ident = ipst->ips_dce_default->dce_ident + 1;
522 return (dce);
526 * Set/update uinfo. Creates a per-destination dce if none exists.
534 dce_setuinfo(dce_t *dce, iulp_t *uinfo)
542 mutex_enter(&dce->dce_lock);
549 if (dce->dce_uinfo.iulp_rtt != 0) {
550 dce->dce_uinfo.iulp_rtt = (dce->dce_uinfo.iulp_rtt +
553 dce->dce_uinfo.iulp_rtt = uinfo->iulp_rtt +
556 if (dce->dce_uinfo.iulp_rtt_sd != 0) {
557 dce->dce_uinfo.iulp_rtt_sd =
558 (dce->dce_uinfo.iulp_rtt_sd +
561 dce->dce_uinfo.iulp_rtt_sd = uinfo->iulp_rtt_sd +
566 if (dce->dce_flags & DCEF_PMTU) {
567 dce->dce_pmtu = MIN(uinfo->iulp_mtu, dce->dce_pmtu);
569 dce->dce_pmtu = MIN(uinfo->iulp_mtu, IP_MAXPACKET);
570 dce->dce_flags |= DCEF_PMTU;
572 dce->dce_last_change_time = TICK_TO_SEC(ddi_get_lbolt64());
575 if (dce->dce_uinfo.iulp_ssthresh != 0)
576 dce->dce_uinfo.iulp_ssthresh =
578 dce->dce_uinfo.iulp_ssthresh) >> 1;
580 dce->dce_uinfo.iulp_ssthresh = uinfo->iulp_ssthresh;
583 dce->dce_flags |= DCEF_UINFO;
584 mutex_exit(&dce->dce_lock);
591 dce_t *dce;
593 dce = dce_lookup_and_add_v4(dst, ipst);
594 if (dce == NULL)
597 dce_setuinfo(dce, uinfo);
598 dce_refrele(dce);
606 dce_t *dce;
608 dce = dce_lookup_and_add_v6(dst, ifindex, ipst);
609 if (dce == NULL)
612 dce_setuinfo(dce, uinfo);
613 dce_refrele(dce);
633 dce_make_condemned(dce_t *dce)
635 ip_stack_t *ipst = dce->dce_ipst;
637 mutex_enter(&dce->dce_lock);
638 ASSERT(!DCE_IS_CONDEMNED(dce));
639 dce->dce_generation = DCE_GENERATION_CONDEMNED;
640 mutex_exit(&dce->dce_lock);
649 dce_increment_generation(dce_t *dce)
653 mutex_enter(&dce->dce_lock);
654 if (!DCE_IS_CONDEMNED(dce)) {
655 generation = dce->dce_generation + 1;
659 dce->dce_generation = generation;
661 mutex_exit(&dce->dce_lock);
673 dce_t *dce;
681 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
682 if (DCE_IS_CONDEMNED(dce))
684 dce_increment_generation(dce);
696 dce_delete_locked(dcb_t *dcb, dce_t *dce)
698 dce->dce_bucket = NULL;
699 *dce->dce_ptpn = dce->dce_next;
700 if (dce->dce_next != NULL)
701 dce->dce_next->dce_ptpn = dce->dce_ptpn;
702 dce->dce_ptpn = NULL;
703 dce->dce_next = NULL;
705 dce_make_condemned(dce);
709 dce_inactive(dce_t *dce)
711 ip_stack_t *ipst = dce->dce_ipst;
713 ASSERT(!(dce->dce_flags & DCEF_DEFAULT));
714 ASSERT(dce->dce_ptpn == NULL);
715 ASSERT(dce->dce_bucket == NULL);
718 if (DCE_IS_CONDEMNED(dce))
721 kmem_cache_free(dce_cache, dce);
725 dce_refrele(dce_t *dce)
727 ASSERT(dce->dce_refcnt != 0);
728 if (atomic_add_32_nv(&dce->dce_refcnt, -1) == 0)
729 dce_inactive(dce);
733 dce_refhold(dce_t *dce)
735 atomic_add_32(&dce->dce_refcnt, 1);
736 ASSERT(dce->dce_refcnt != 0);
741 dce_refrele_notr(dce_t *dce)
743 ASSERT(dce->dce_refcnt != 0);
744 if (atomic_add_32_nv(&dce->dce_refcnt, -1) == 0)
745 dce_inactive(dce);
749 dce_refhold_notr(dce_t *dce)
751 atomic_add_32(&dce->dce_refcnt, 1);
752 ASSERT(dce->dce_refcnt != 0);
763 dce_t *dce;
784 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
785 dest_cache.DestIpv4Address = dce->dce_v4addr;
786 dest_cache.DestFlags = dce->dce_flags;
787 if (dce->dce_flags & DCEF_PMTU)
788 dest_cache.DestPmtu = dce->dce_pmtu;
791 dest_cache.DestIdent = dce->dce_ident;
794 dce->dce_last_change_time;
826 for (dce = dcb->dcb_dce; dce != NULL; dce = dce->dce_next) {
827 dest_cache.DestIpv6Address = dce->dce_v6addr;
828 dest_cache.DestFlags = dce->dce_flags;
829 if (dce->dce_flags & DCEF_PMTU)
830 dest_cache.DestPmtu = dce->dce_pmtu;
833 dest_cache.DestIdent = dce->dce_ident;
834 if (IN6_IS_ADDR_LINKSCOPE(&dce->dce_v6addr))
835 dest_cache.DestIfindex = dce->dce_ifindex;
839 dce->dce_last_change_time;
867 dce_t *dce, *nextdce;
873 for (dce = dcb->dcb_dce; dce != NULL; dce = nextdce) {
874 nextdce = dce->dce_next;
875 if (dce->dce_ifindex == ifindex) {
876 dce_delete_locked(dcb, dce);
877 dce_refrele(dce);