Lines Matching refs:ncec

113 static	void	nce_cleanup_list(ncec_t *ncec);
114 static void nce_set_ll(ncec_t *ncec, uchar_t *ll_addr);
175 nce_dad(ncec_t *ncec, ill_t *src_ill, boolean_t send_probe) in nce_dad() argument
180 ASSERT(!(ncec->ncec_flags & NCE_F_MCAST)); in nce_dad()
181 ASSERT(!(ncec->ncec_flags & NCE_F_BCAST)); in nce_dad()
182 if (ncec->ncec_ipversion == IPV6_VERSION) { in nce_dad()
184 ncec->ncec_lladdr, ncec->ncec_lladdr_length, in nce_dad()
185 &ipv6_all_zeros, &ncec->ncec_addr, NDP_PROBE); in nce_dad()
190 dropped = arp_probe(ncec); in nce_dad()
193 probe_interval = nce_fuzz_interval(ncec->ncec_xmit_interval, in nce_dad()
197 mutex_enter(&ncec->ncec_lock); in nce_dad()
198 ncec->ncec_pcnt--; in nce_dad()
199 mutex_exit(&ncec->ncec_lock); in nce_dad()
201 nce_restart_timer(ncec, probe_interval); in nce_dad()
208 nce_advert_flags(const ncec_t *ncec) in nce_advert_flags() argument
212 if (ncec->ncec_flags & NCE_F_ISROUTER) in nce_advert_flags()
214 if (!(ncec->ncec_flags & NCE_F_ANYCAST)) in nce_advert_flags()
251 ncec_t *ncec = nce->nce_common; in nce_add_v6_postprocess() local
253 uchar_t *hw_addr = ncec->ncec_lladdr; in nce_add_v6_postprocess()
254 uint_t hw_addr_len = ncec->ncec_lladdr_length; in nce_add_v6_postprocess()
255 ill_t *ill = ncec->ncec_ill; in nce_add_v6_postprocess()
257 uint16_t flags = ncec->ncec_flags; in nce_add_v6_postprocess()
267 if (NCE_PUBLISH(ncec) || !NCE_ISREACHABLE(ncec) || in nce_add_v6_postprocess()
273 if (NCE_PUBLISH(ncec) && ncec->ncec_state == ND_PROBE) { in nce_add_v6_postprocess()
284 nce_dad(ncec, hwaddr_ill, B_TRUE); in nce_add_v6_postprocess()
292 mutex_enter(&ncec->ncec_lock); in nce_add_v6_postprocess()
293 ncec->ncec_unsolicit_count = in nce_add_v6_postprocess()
295 mutex_exit(&ncec->ncec_lock); in nce_add_v6_postprocess()
300 &ncec->ncec_addr, /* Source and target of the adv */ in nce_add_v6_postprocess()
302 nce_advert_flags(ncec)); in nce_add_v6_postprocess()
303 mutex_enter(&ncec->ncec_lock); in nce_add_v6_postprocess()
305 ncec->ncec_unsolicit_count++; in nce_add_v6_postprocess()
307 ncec->ncec_last_time_defended = ddi_get_lbolt(); in nce_add_v6_postprocess()
308 if (ncec->ncec_unsolicit_count != 0) { in nce_add_v6_postprocess()
309 nce_start_timer(ncec, in nce_add_v6_postprocess()
312 mutex_exit(&ncec->ncec_lock); in nce_add_v6_postprocess()
422 nce_remove(ndp_g_t *ndp, ncec_t *ncec, ncec_t **free_nce_list) in nce_remove() argument
429 for (; ncec; ncec = ncec1) { in nce_remove()
430 ncec1 = ncec->ncec_next; in nce_remove()
431 mutex_enter(&ncec->ncec_lock); in nce_remove()
432 if (NCE_ISCONDEMNED(ncec)) { in nce_remove()
433 ptpn = ncec->ncec_ptpn; in nce_remove()
434 ncec1 = ncec->ncec_next; in nce_remove()
438 ncec->ncec_ptpn = NULL; in nce_remove()
439 ncec->ncec_next = NULL; in nce_remove()
440 ncec->ncec_next = *free_nce_list; in nce_remove()
441 *free_nce_list = ncec; in nce_remove()
443 mutex_exit(&ncec->ncec_lock); in nce_remove()
457 ncec_delete(ncec_t *ncec) in ncec_delete() argument
461 int ipversion = ncec->ncec_ipversion; in ncec_delete()
463 ip_stack_t *ipst = ncec->ncec_ipst; in ncec_delete()
471 mutex_enter(&ncec->ncec_lock); in ncec_delete()
472 if (NCE_ISCONDEMNED(ncec)) { in ncec_delete()
474 mutex_exit(&ncec->ncec_lock); in ncec_delete()
481 ASSERT(ncec->ncec_refcnt >= 2); in ncec_delete()
482 ncec->ncec_flags |= NCE_F_CONDEMNED; in ncec_delete()
483 mutex_exit(&ncec->ncec_lock); in ncec_delete()
487 nce_fastpath_list_delete(ncec->ncec_ill, ncec, NULL); in ncec_delete()
490 ncec_cb_dispatch(ncec); in ncec_delete()
497 if (ncec->ncec_timeout_id != 0) { in ncec_delete()
498 (void) untimeout(ncec->ncec_timeout_id); in ncec_delete()
499 ncec->ncec_timeout_id = 0; in ncec_delete()
503 if (ncec->ncec_ptpn == NULL) { in ncec_delete()
525 ptpn = ncec->ncec_ptpn; in ncec_delete()
526 ncec1 = ncec->ncec_next; in ncec_delete()
530 ncec->ncec_ptpn = NULL; in ncec_delete()
531 ncec->ncec_next = NULL; in ncec_delete()
535 ncec_refrele_notr(ncec); in ncec_delete()
539 ncec_inactive(ncec_t *ncec) in ncec_inactive() argument
542 ill_t *ill = ncec->ncec_ill; in ncec_inactive()
543 ip_stack_t *ipst = ncec->ncec_ipst; in ncec_inactive()
545 ASSERT(ncec->ncec_refcnt == 0); in ncec_inactive()
546 ASSERT(MUTEX_HELD(&ncec->ncec_lock)); in ncec_inactive()
549 if (NCE_ISCONDEMNED(ncec)) in ncec_inactive()
553 mpp = &ncec->ncec_qd_mp; in ncec_inactive()
565 ASSERT(list_is_empty(&ncec->ncec_cb)); in ncec_inactive()
566 list_destroy(&ncec->ncec_cb); in ncec_inactive()
570 if (ncec->ncec_lladdr_length > 0) in ncec_inactive()
571 kmem_free(ncec->ncec_lladdr, ncec->ncec_lladdr_length); in ncec_inactive()
574 ncec_trace_cleanup(ncec); in ncec_inactive()
579 (char *), "ncec", (void *), ncec); in ncec_inactive()
581 ncec->ncec_ill = NULL; in ncec_inactive()
594 mutex_destroy(&ncec->ncec_lock); in ncec_inactive()
595 kmem_cache_free(ncec_cache, ncec); in ncec_inactive()
603 ncec_delete_per_ill(ncec_t *ncec, void *arg) in ncec_delete_per_ill() argument
605 if ((ncec != NULL) && ncec->ncec_ill == arg) { in ncec_delete_per_ill()
606 ncec_delete(ncec); in ncec_delete_per_ill()
614 nce_cleanup_list(ncec_t *ncec) in nce_cleanup_list() argument
618 ASSERT(ncec != NULL); in nce_cleanup_list()
619 while (ncec != NULL) { in nce_cleanup_list()
620 ncec_next = ncec->ncec_next; in nce_cleanup_list()
621 ncec->ncec_next = NULL; in nce_cleanup_list()
632 nce_fastpath_list_delete(ncec->ncec_ill, ncec, NULL); in nce_cleanup_list()
639 if (ncec->ncec_timeout_id != 0) { in nce_cleanup_list()
640 (void) untimeout(ncec->ncec_timeout_id); in nce_cleanup_list()
641 ncec->ncec_timeout_id = 0; in nce_cleanup_list()
644 ncec_refrele_notr(ncec); in nce_cleanup_list()
645 ncec = ncec_next; in nce_cleanup_list()
653 nce_restart_dad(ncec_t *ncec) in nce_restart_dad() argument
658 if (ncec == NULL) in nce_restart_dad()
660 ill = ncec->ncec_ill; in nce_restart_dad()
661 mutex_enter(&ncec->ncec_lock); in nce_restart_dad()
662 if (ncec->ncec_state == ND_PROBE) { in nce_restart_dad()
663 mutex_exit(&ncec->ncec_lock); in nce_restart_dad()
665 } else if (ncec->ncec_state == ND_REACHABLE) { in nce_restart_dad()
666 ASSERT(ncec->ncec_lladdr != NULL); in nce_restart_dad()
667 ncec->ncec_state = ND_PROBE; in nce_restart_dad()
668 ncec->ncec_pcnt = ND_MAX_UNICAST_SOLICIT; in nce_restart_dad()
673 mutex_exit(&ncec->ncec_lock); in nce_restart_dad()
676 ncec->ncec_lladdr, ncec->ncec_lladdr_length); in nce_restart_dad()
680 nce_dad(ncec, hwaddr_ill, B_TRUE); in nce_restart_dad()
683 mutex_exit(&ncec->ncec_lock); in nce_restart_dad()
696 ncec_t *ncec; in ncec_lookup_illgrp_v6() local
703 ncec = *((ncec_t **)NCE_HASH_PTR_V6(ipst, *addr)); in ncec_lookup_illgrp_v6()
704 ncec = ncec_lookup_illgrp(ill, addr, ncec); in ncec_lookup_illgrp_v6()
707 return (ncec); in ncec_lookup_illgrp_v6()
716 ncec_t *ncec = NULL; in ncec_lookup_illgrp_v4() local
724 ncec = *((ncec_t **)NCE_HASH_PTR_V4(ipst, *addr)); in ncec_lookup_illgrp_v4()
726 ncec = ncec_lookup_illgrp(ill, &addr6, ncec); in ncec_lookup_illgrp_v4()
729 return (ncec); in ncec_lookup_illgrp_v4()
743 ncec_lookup_illgrp(ill_t *ill, const in6_addr_t *addr, ncec_t *ncec) in ncec_lookup_illgrp() argument
757 for (; ncec != NULL; ncec = ncec->ncec_next) { in ncec_lookup_illgrp()
758 if (ncec->ncec_ill == ill || in ncec_lookup_illgrp()
759 IS_IN_SAME_ILLGRP(ill, ncec->ncec_ill)) { in ncec_lookup_illgrp()
760 if (IN6_ARE_ADDR_EQUAL(&ncec->ncec_addr, addr)) { in ncec_lookup_illgrp()
761 mutex_enter(&ncec->ncec_lock); in ncec_lookup_illgrp()
762 if (!NCE_ISCONDEMNED(ncec)) { in ncec_lookup_illgrp()
763 ncec_refhold_locked(ncec); in ncec_lookup_illgrp()
764 mutex_exit(&ncec->ncec_lock); in ncec_lookup_illgrp()
767 mutex_exit(&ncec->ncec_lock); in ncec_lookup_illgrp()
771 return (ncec); in ncec_lookup_illgrp()
840 ncec_router_to_host(ncec_t *ncec) in ncec_router_to_host() argument
843 ip_stack_t *ipst = ncec->ncec_ipst; in ncec_router_to_host()
845 mutex_enter(&ncec->ncec_lock); in ncec_router_to_host()
846 ncec->ncec_flags &= ~NCE_F_ISROUTER; in ncec_router_to_host()
847 mutex_exit(&ncec->ncec_lock); in ncec_router_to_host()
850 &ncec->ncec_addr, IRE_DEFAULT, ncec->ncec_ill, ALL_ZONES, NULL, in ncec_router_to_host()
864 nce_process(ncec_t *ncec, uchar_t *hw_addr, uint32_t flag, boolean_t is_adv) in nce_process() argument
866 ill_t *ill = ncec->ncec_ill; in nce_process()
872 ASSERT(ncec->ncec_ipversion == IPV6_VERSION); in nce_process()
878 mutex_enter(&ncec->ncec_lock); in nce_process()
879 if (ncec->ncec_state == ND_INCOMPLETE) { in nce_process()
881 mutex_exit(&ncec->ncec_lock); in nce_process()
884 nce_set_ll(ncec, hw_addr); in nce_process()
890 nce_update(ncec, ND_REACHABLE, NULL); in nce_process()
892 nce_update(ncec, ND_STALE, NULL); in nce_process()
894 mutex_exit(&ncec->ncec_lock); in nce_process()
895 nce = nce_fastpath(ncec, B_TRUE, NULL); in nce_process()
896 nce_resolv_ok(ncec); in nce_process()
901 ll_changed = nce_cmp_ll_addr(ncec, hw_addr, hw_addr_len); in nce_process()
905 nce_update(ncec, ND_STALE, hw_addr); in nce_process()
906 mutex_exit(&ncec->ncec_lock); in nce_process()
907 ncec_cb_dispatch(ncec); in nce_process()
912 if (ncec->ncec_state == ND_REACHABLE) { in nce_process()
913 nce_update(ncec, ND_STALE, NULL); in nce_process()
915 mutex_exit(&ncec->ncec_lock); in nce_process()
916 ncec_cb_dispatch(ncec); in nce_process()
920 nce_update(ncec, ND_UNCHANGED, hw_addr); in nce_process()
924 nce_update(ncec, ND_REACHABLE, NULL); in nce_process()
927 nce_update(ncec, ND_STALE, NULL); in nce_process()
930 mutex_exit(&ncec->ncec_lock); in nce_process()
931 if (!(flag & ND_NA_FLAG_ROUTER) && (ncec->ncec_flags & in nce_process()
933 ncec_router_to_host(ncec); in nce_process()
935 ncec_cb_dispatch(ncec); in nce_process()
949 ncec_t *ncec; in ncec_walk_common() local
960 for (ncec = *ncep; ncec != NULL; ncec = ncec1) { in ncec_walk_common()
961 ncec1 = ncec->ncec_next; in ncec_walk_common()
962 if (ill == NULL || ncec->ncec_ill == ill) { in ncec_walk_common()
964 ncec_refhold(ncec); in ncec_walk_common()
965 (*cbf)(ncec, arg1); in ncec_walk_common()
966 ncec_refrele(ncec); in ncec_walk_common()
968 ncec_refhold_notr(ncec); in ncec_walk_common()
969 (*cbf)(ncec, arg1); in ncec_walk_common()
970 ncec_refrele_notr(ncec); in ncec_walk_common()
981 ncec = *ncep; in ncec_walk_common()
982 if (ncec != NULL) { in ncec_walk_common()
983 nce_remove(ndp, ncec, &free_nce_list); in ncec_walk_common()
1112 ncec_mcast_reap_one(ncec_t *ncec, void *arg) in ncec_mcast_reap_one() argument
1118 if (ncec == NULL || ncec->ncec_ill != ill || in ncec_mcast_reap_one()
1119 (ncec->ncec_flags & NCE_F_MCAST) == 0) in ncec_mcast_reap_one()
1122 mutex_enter(&ncec->ncec_lock); in ncec_mcast_reap_one()
1129 ASSERT(ncec->ncec_refcnt >= 2); in ncec_mcast_reap_one()
1130 reapit = (ncec->ncec_refcnt == 2); in ncec_mcast_reap_one()
1131 mutex_exit(&ncec->ncec_lock); in ncec_mcast_reap_one()
1135 ncec_delete(ncec); in ncec_mcast_reap_one()
1305 ncec_t *ncec; in ndp_query() local
1319 ncec = ncec_lookup_illgrp_v6(ill, addr); in ndp_query()
1320 if (ncec == NULL) in ndp_query()
1323 if (!NCE_ISREACHABLE(ncec)) { in ndp_query()
1324 ncec_refrele(ncec); in ndp_query()
1328 bcopy(ncec->ncec_lladdr, (uchar_t *)&lnr->lnr_hdw_addr, in ndp_query()
1330 if (ncec->ncec_flags & NCE_F_ISROUTER) in ndp_query()
1332 if (ncec->ncec_flags & NCE_F_ANYCAST) in ndp_query()
1334 if (ncec->ncec_flags & NCE_F_STATIC) in ndp_query()
1336 ncec_refrele(ncec); in ndp_query()
1377 ip_ndp_resolve(ncec_t *ncec) in ip_ndp_resolve() argument
1384 src_ill = nce_resolve_src(ncec, &sender6); in ip_ndp_resolve()
1387 ms = ncec->ncec_ill->ill_reachable_retrans_time; in ip_ndp_resolve()
1388 nce_restart_timer(ncec, (clock_t)ms); in ip_ndp_resolve()
1391 if (ncec->ncec_ipversion == IPV4_VERSION) in ip_ndp_resolve()
1393 mutex_enter(&ncec->ncec_lock); in ip_ndp_resolve()
1394 if (ncec->ncec_ipversion == IPV6_VERSION) in ip_ndp_resolve()
1395 ms = ndp_solicit(ncec, sender6, src_ill); in ip_ndp_resolve()
1397 ms = arp_request(ncec, sender4, src_ill); in ip_ndp_resolve()
1398 mutex_exit(&ncec->ncec_lock); in ip_ndp_resolve()
1400 if (ncec->ncec_state != ND_REACHABLE) { in ip_ndp_resolve()
1401 if (ncec->ncec_ipversion == IPV6_VERSION) in ip_ndp_resolve()
1402 ndp_resolv_failed(ncec); in ip_ndp_resolve()
1404 arp_resolv_failed(ncec); in ip_ndp_resolve()
1405 ASSERT((ncec->ncec_flags & NCE_F_STATIC) == 0); in ip_ndp_resolve()
1406 nce_make_unreachable(ncec); in ip_ndp_resolve()
1407 ncec_delete(ncec); in ip_ndp_resolve()
1410 nce_restart_timer(ncec, (clock_t)ms); in ip_ndp_resolve()
1428 ndp_solicit(ncec_t *ncec, in6_addr_t src, ill_t *ill) in ndp_solicit() argument
1433 ASSERT(ncec->ncec_ipversion == IPV6_VERSION); in ndp_solicit()
1434 ASSERT(MUTEX_HELD(&ncec->ncec_lock)); in ndp_solicit()
1436 if (ncec->ncec_rcnt == 0) in ndp_solicit()
1439 dst = ncec->ncec_addr; in ndp_solicit()
1440 ncec->ncec_rcnt--; in ndp_solicit()
1441 mutex_exit(&ncec->ncec_lock); in ndp_solicit()
1444 mutex_enter(&ncec->ncec_lock); in ndp_solicit()
1446 ncec->ncec_rcnt++; in ndp_solicit()
1447 return (ncec->ncec_ill->ill_reachable_retrans_time); in ndp_solicit()
1792 ip_nce_conflict(mblk_t *mp, ip_recv_attr_t *ira, ncec_t *ncec) in ip_nce_conflict() argument
1805 ipif = ipif_lookup_addr_v6(&ncec->ncec_addr, ill, ALL_ZONES, in ip_nce_conflict()
1815 IN6_V4MAPPED_TO_IPADDR(&ncec->ncec_addr, ncec_addr); in ip_nce_conflict()
1835 elapsed = (drv_hztousec(now - ncec->ncec_last_time_defended))/1000000; in ip_nce_conflict()
1836 mutex_enter(&ncec->ncec_lock); in ip_nce_conflict()
1837 if ((defs = ncec->ncec_defense_count) > 0 && in ip_nce_conflict()
1843 ncec->ncec_defense_count = defs = 0; in ip_nce_conflict()
1845 ncec->ncec_defense_count++; in ip_nce_conflict()
1846 ncec->ncec_last_time_defended = now; in ip_nce_conflict()
1847 mutex_exit(&ncec->ncec_lock); in ip_nce_conflict()
2534 nce_make_unreachable(ncec_t *ncec) in nce_make_unreachable() argument
2536 mutex_enter(&ncec->ncec_lock); in nce_make_unreachable()
2537 ncec->ncec_state = ND_UNREACHABLE; in nce_make_unreachable()
2538 mutex_exit(&ncec->ncec_lock); in nce_make_unreachable()
2550 ncec_t *ncec = arg; in nce_timer() local
2551 ill_t *ill = ncec->ncec_ill, *src_ill; in nce_timer()
2554 ip_stack_t *ipst = ncec->ncec_ipst; in nce_timer()
2555 boolean_t isv6 = (ncec->ncec_ipversion == IPV6_VERSION); in nce_timer()
2565 ASSERT(ncec != NULL); in nce_timer()
2566 mutex_enter(&ncec->ncec_lock); in nce_timer()
2567 ncec_refhold_locked(ncec); in nce_timer()
2568 ncec->ncec_timeout_id = 0; in nce_timer()
2569 mutex_exit(&ncec->ncec_lock); in nce_timer()
2571 src_ill = nce_resolve_src(ncec, &sender6); in nce_timer()
2575 IN6_V4MAPPED_TO_IPADDR(&ncec->ncec_addr, sender4); in nce_timer()
2580 &ncec->ncec_addr, addrbuf, sizeof (addrbuf)))); in nce_timer()
2582 nce_restart_timer(ncec, ill->ill_reachable_retrans_time); in nce_timer()
2583 ncec_refrele(ncec); in nce_timer()
2589 mutex_enter(&ncec->ncec_lock); in nce_timer()
2593 switch (ncec->ncec_state) { in nce_timer()
2595 ASSERT(ncec->ncec_lladdr != NULL); in nce_timer()
2596 ncec->ncec_state = ND_PROBE; in nce_timer()
2597 ncec->ncec_pcnt = ND_MAX_UNICAST_SOLICIT; in nce_timer()
2599 mutex_exit(&ncec->ncec_lock); in nce_timer()
2603 &sender6, &ncec->ncec_addr, in nce_timer()
2606 dropped = (arp_request(ncec, sender4, src_ill) == 0); in nce_timer()
2607 mutex_exit(&ncec->ncec_lock); in nce_timer()
2610 mutex_enter(&ncec->ncec_lock); in nce_timer()
2611 ncec->ncec_pcnt--; in nce_timer()
2612 mutex_exit(&ncec->ncec_lock); in nce_timer()
2617 "to PROBE\n", AF_INET6, &ncec->ncec_addr); in nce_timer()
2619 nce_restart_timer(ncec, ill->ill_reachable_retrans_time); in nce_timer()
2623 ASSERT(ncec->ncec_pcnt >= -1); in nce_timer()
2624 if (ncec->ncec_pcnt > 0) { in nce_timer()
2632 ncec->ncec_pcnt, in nce_timer()
2634 &ncec->ncec_addr, addrbuf, sizeof (addrbuf)))); in nce_timer()
2635 if (NCE_PUBLISH(ncec)) { in nce_timer()
2636 mutex_exit(&ncec->ncec_lock); in nce_timer()
2643 nce_dad(ncec, src_ill, B_TRUE); in nce_timer()
2647 mutex_exit(&ncec->ncec_lock); in nce_timer()
2652 &sender6, &ncec->ncec_addr, in nce_timer()
2660 dropped = (arp_request(ncec, sender4, in nce_timer()
2662 mutex_exit(&ncec->ncec_lock); in nce_timer()
2665 mutex_enter(&ncec->ncec_lock); in nce_timer()
2666 ncec->ncec_pcnt--; in nce_timer()
2667 mutex_exit(&ncec->ncec_lock); in nce_timer()
2669 nce_restart_timer(ncec, in nce_timer()
2672 } else if (ncec->ncec_pcnt < 0) { in nce_timer()
2675 ncec->ncec_state = ND_UNREACHABLE; in nce_timer()
2676 mutex_exit(&ncec->ncec_lock); in nce_timer()
2681 &ncec->ncec_addr); in nce_timer()
2684 if ((ncec->ncec_flags & NCE_F_STATIC) == 0) in nce_timer()
2685 ncec_delete(ncec); in nce_timer()
2687 } else if (!NCE_PUBLISH(ncec)) { in nce_timer()
2693 ASSERT((ncec->ncec_flags & NCE_F_NONUD) == 0); in nce_timer()
2695 ncec->ncec_pcnt, inet_ntop(AF_INET6, in nce_timer()
2696 &ncec->ncec_addr, addrbuf, sizeof (addrbuf)))); in nce_timer()
2697 ncec->ncec_pcnt--; in nce_timer()
2698 mutex_exit(&ncec->ncec_lock); in nce_timer()
2700 nce_restart_timer(ncec, in nce_timer()
2711 ncec->ncec_state = ND_REACHABLE; in nce_timer()
2712 ncec->ncec_flags &= ~NCE_F_UNVERIFIED; in nce_timer()
2713 mutex_exit(&ncec->ncec_lock); in nce_timer()
2716 &ncec->ncec_addr, ill, ipst); in nce_timer()
2718 IN6_V4MAPPED_TO_IPADDR(&ncec->ncec_addr, in nce_timer()
2746 if (ncec->ncec_unsolicit_count > 0) { in nce_timer()
2747 ncec->ncec_unsolicit_count--; in nce_timer()
2749 dropped = ndp_announce(ncec); in nce_timer()
2751 dropped = arp_announce(ncec); in nce_timer()
2755 ncec->ncec_unsolicit_count++; in nce_timer()
2757 ncec->ncec_last_time_defended = in nce_timer()
2760 if (ncec->ncec_unsolicit_count > 0) { in nce_timer()
2761 nce_restart_timer(ncec, in nce_timer()
2764 nce_restart_timer(ncec, DEFENSE_INTERVAL(isv6)); in nce_timer()
2773 ncec->ncec_state = ND_REACHABLE; in nce_timer()
2774 mutex_exit(&ncec->ncec_lock); in nce_timer()
2788 prevmpp = &ncec->ncec_qd_mp; in nce_timer()
2789 for (mp = ncec->ncec_qd_mp; mp != NULL; mp = nextmp) { in nce_timer()
2792 if (IS_UNDER_IPMP(ill) && ncec->ncec_nprobes > 0) { in nce_timer()
2794 ncec->ncec_nprobes--; in nce_timer()
2804 mutex_exit(&ncec->ncec_lock); in nce_timer()
2805 ip_ndp_resolve(ncec); in nce_timer()
2809 if (((ncec->ncec_flags & NCE_F_UNSOL_ADV) && in nce_timer()
2810 ncec->ncec_unsolicit_count != 0) || in nce_timer()
2811 (NCE_PUBLISH(ncec) && DEFENSE_INTERVAL(isv6) != 0)) { in nce_timer()
2812 if (ncec->ncec_unsolicit_count > 0) { in nce_timer()
2813 ncec->ncec_unsolicit_count--; in nce_timer()
2814 mutex_exit(&ncec->ncec_lock); in nce_timer()
2822 mutex_exit(&ncec->ncec_lock); in nce_timer()
2823 rate_limit = ill_defend_rate_limit(ill, ncec); in nce_timer()
2825 nce_restart_timer(ncec, in nce_timer()
2831 dropped = ndp_announce(ncec); in nce_timer()
2833 dropped = arp_announce(ncec); in nce_timer()
2835 mutex_enter(&ncec->ncec_lock); in nce_timer()
2837 ncec->ncec_unsolicit_count++; in nce_timer()
2839 ncec->ncec_last_time_defended = in nce_timer()
2842 mutex_exit(&ncec->ncec_lock); in nce_timer()
2843 if (ncec->ncec_unsolicit_count != 0) { in nce_timer()
2844 nce_restart_timer(ncec, in nce_timer()
2847 nce_restart_timer(ncec, DEFENSE_INTERVAL(isv6)); in nce_timer()
2850 mutex_exit(&ncec->ncec_lock); in nce_timer()
2854 mutex_exit(&ncec->ncec_lock); in nce_timer()
2858 ncec_refrele(ncec); in nce_timer()
2867 nce_set_ll(ncec_t *ncec, uchar_t *ll_addr) in nce_set_ll() argument
2869 ill_t *ill = ncec->ncec_ill; in nce_set_ll()
2890 bcopy(ll_addr, ncec->ncec_lladdr, ill->ill_nd_lla_len); in nce_set_ll()
2895 nce_cmp_ll_addr(const ncec_t *ncec, const uchar_t *ll_addr, in nce_cmp_ll_addr() argument
2898 ASSERT(ncec->ncec_lladdr != NULL); in nce_cmp_ll_addr()
2901 if (bcmp(ll_addr, ncec->ncec_lladdr, ll_addr_len) != 0) in nce_cmp_ll_addr()
2911 nce_update(ncec_t *ncec, uint16_t new_state, uchar_t *new_ll_addr) in nce_update() argument
2913 ill_t *ill = ncec->ncec_ill; in nce_update()
2919 ASSERT(MUTEX_HELD(&ncec->ncec_lock)); in nce_update()
2929 if ((ncec->ncec_flags & NCE_F_NONUD) && in nce_update()
2930 (ncec->ncec_state != ND_INCOMPLETE)) in nce_update()
2936 ncec->ncec_last = TICK_TO_MSEC(ddi_get_lbolt64()); in nce_update()
2939 ncec->ncec_last = 0; in nce_update()
2941 ncec->ncec_state = new_state; in nce_update()
2942 ncec->ncec_pcnt = ND_MAX_UNICAST_SOLICIT; in nce_update()
2943 ASSERT(ncec->ncec_lladdr != NULL || new_state == ND_INITIAL || in nce_update()
2948 if (need_stop_timer || (ncec->ncec_flags & NCE_F_STATIC)) { in nce_update()
2949 tid = ncec->ncec_timeout_id; in nce_update()
2950 ncec->ncec_timeout_id = 0; in nce_update()
2958 bcopy(new_ll_addr, ncec->ncec_lladdr, in nce_update()
2962 mutex_exit(&ncec->ncec_lock); in nce_update()
2963 if (need_stop_timer || (ncec->ncec_flags & NCE_F_STATIC)) { in nce_update()
2973 nce_fastpath_list_delete(ncec->ncec_ill, ncec, NULL); in nce_update()
2977 nce = nce_fastpath(ncec, B_TRUE, NULL); in nce_update()
2981 mutex_enter(&ncec->ncec_lock); in nce_update()
2985 nce_queue_mp_common(ncec_t *ncec, mblk_t *mp, boolean_t head_insert) in nce_queue_mp_common() argument
2990 ASSERT(MUTEX_HELD(&ncec->ncec_lock)); in nce_queue_mp_common()
2992 for (mpp = &ncec->ncec_qd_mp; *mpp != NULL; mpp = &(*mpp)->b_next) { in nce_queue_mp_common()
2993 if (++count > ncec->ncec_ill->ill_max_buf) { in nce_queue_mp_common()
2994 tmp = ncec->ncec_qd_mp->b_next; in nce_queue_mp_common()
2995 ncec->ncec_qd_mp->b_next = NULL; in nce_queue_mp_common()
3000 BUMP_MIB(ncec->ncec_ill->ill_ip_mib, in nce_queue_mp_common()
3002 ip_drop_output("ipIfStatsOutDiscards", ncec->ncec_qd_mp, in nce_queue_mp_common()
3003 ncec->ncec_ill); in nce_queue_mp_common()
3004 freemsg(ncec->ncec_qd_mp); in nce_queue_mp_common()
3005 ncec->ncec_qd_mp = tmp; in nce_queue_mp_common()
3010 ncec->ncec_nprobes++; in nce_queue_mp_common()
3011 mp->b_next = ncec->ncec_qd_mp; in nce_queue_mp_common()
3012 ncec->ncec_qd_mp = mp; in nce_queue_mp_common()
3043 nce_queue_mp(ncec_t *ncec, mblk_t *mp, boolean_t head_insert) in nce_queue_mp() argument
3045 ASSERT(MUTEX_HELD(&ncec->ncec_lock)); in nce_queue_mp()
3046 nce_queue_mp_common(ncec, mp, head_insert); in nce_queue_mp()
3054 ndp_resolv_failed(ncec_t *ncec) in ndp_resolv_failed() argument
3058 ill_t *ill = ncec->ncec_ill; in ndp_resolv_failed()
3074 inet_ntop(AF_INET6, (char *)&ncec->ncec_addr, buf, sizeof (buf)))); in ndp_resolv_failed()
3075 mutex_enter(&ncec->ncec_lock); in ndp_resolv_failed()
3076 mp = ncec->ncec_qd_mp; in ndp_resolv_failed()
3077 ncec->ncec_qd_mp = NULL; in ndp_resolv_failed()
3078 ncec->ncec_nprobes = 0; in ndp_resolv_failed()
3079 mutex_exit(&ncec->ncec_lock); in ndp_resolv_failed()
3092 ncec_cb_dispatch(ncec); /* finish off waiting callbacks */ in ndp_resolv_failed()
3099 nce_resolv_ok(ncec_t *ncec) in nce_resolv_ok() argument
3105 ill_t *ill = ncec->ncec_ill; in nce_resolv_ok()
3106 boolean_t isv6 = (ncec->ncec_ipversion == IPV6_VERSION); in nce_resolv_ok()
3109 if (IS_IPMP(ncec->ncec_ill)) { in nce_resolv_ok()
3110 nce_resolv_ipmp_ok(ncec); in nce_resolv_ok()
3115 mutex_enter(&ncec->ncec_lock); in nce_resolv_ok()
3116 ASSERT(ncec->ncec_nprobes == 0); in nce_resolv_ok()
3117 mp = ncec->ncec_qd_mp; in nce_resolv_ok()
3118 ncec->ncec_qd_mp = NULL; in nce_resolv_ok()
3119 mutex_exit(&ncec->ncec_lock); in nce_resolv_ok()
3143 nce = nce_lookup(ill, &ncec->ncec_addr); in nce_resolv_ok()
3171 ncec_cb_dispatch(ncec); /* complete callbacks */ in nce_resolv_ok()
3184 ncec_t *ncec; in ndp_sioc_update() local
3253 ncec = nce->nce_common; in ndp_sioc_update()
3254 old_flags = ncec->ncec_flags; in ndp_sioc_update()
3256 ncec_router_to_host(ncec); in ndp_sioc_update()
3273 mutex_enter(&ncec->ncec_lock); in ndp_sioc_update()
3274 ncec->ncec_flags = new_flags; in ndp_sioc_update()
3275 mutex_exit(&ncec->ncec_lock); in ndp_sioc_update()
3282 nce_process(ncec, (uchar_t *)lnr->lnr_hdw_addr, 0, B_FALSE); in ndp_sioc_update()
3293 nce_fastpath_create(ill_t *ill, ncec_t *ncec) in nce_fastpath_create() argument
3298 nce = nce_ill_lookup_then_add(ill, ncec); in nce_fastpath_create()
3310 mutex_enter(&ncec->ncec_lock); in nce_fastpath_create()
3311 if (ncec->ncec_lladdr != NULL) { in nce_fastpath_create()
3312 bcopy(ncec->ncec_lladdr, nce->nce_dlur_mp->b_rptr + in nce_fastpath_create()
3318 mutex_exit(&ncec->ncec_lock); in nce_fastpath_create()
3336 nce_fastpath(ncec_t *ncec, boolean_t trigger_fp_req, nce_t *ncec_nce) in nce_fastpath() argument
3339 ill_t *ill = ncec->ncec_ill; in nce_fastpath()
3345 ipmp_ncec_refresh_nce(ncec); in nce_fastpath()
3355 nce = nce_fastpath_create(ill, ncec); in nce_fastpath()
3375 ncec_t *ncec = nce->nce_common; in nce_fastpath_trigger() local
3386 nce_fastpath_list_delete(ill, ncec, NULL); in nce_fastpath_trigger()
3393 nce_ill_lookup_then_add_locked(ill_t *ill, ncec_t *ncec, list_t *graveyard) in nce_ill_lookup_then_add_locked() argument
3404 mutex_enter(&ncec->ncec_lock); in nce_ill_lookup_then_add_locked()
3409 if (!NCE_ISCONDEMNED(ncec)) { in nce_ill_lookup_then_add_locked()
3410 nce = nce_lookup(ill, &ncec->ncec_addr); in nce_ill_lookup_then_add_locked()
3413 nce = nce_add(ill, ncec, graveyard); in nce_ill_lookup_then_add_locked()
3416 mutex_exit(&ncec->ncec_lock); in nce_ill_lookup_then_add_locked()
3421 nce_ill_lookup_then_add(ill_t *ill, ncec_t *ncec) in nce_ill_lookup_then_add() argument
3428 nce = nce_ill_lookup_then_add_locked(ill, ncec, &graveyard); in nce_ill_lookup_then_add()
3441 nce_fastpath_list_delete(ill_t *ill, ncec_t *ncec, list_t *dead) in nce_fastpath_list_delete() argument
3449 ipmp_ncec_delete_nce(ncec); in nce_fastpath_list_delete()
3455 if (nce->nce_common == ncec) { in nce_fastpath_list_delete()
3513 ncec_t *ncec = nce->nce_common; in nce_fastpath_match_dlur() local
3540 mutex_enter(&ncec->ncec_lock); in nce_fastpath_match_dlur()
3544 mutex_exit(&ncec->ncec_lock); in nce_fastpath_match_dlur()
3548 mutex_exit(&ncec->ncec_lock); in nce_fastpath_match_dlur()
3650 ncec_cache_reclaim(ncec_t *ncec, void *arg) in ncec_cache_reclaim() argument
3652 ip_stack_t *ipst = ncec->ncec_ipst; in ncec_cache_reclaim()
3656 if ((ncec->ncec_flags & in ncec_cache_reclaim()
3662 NCE_ADDR_HASH_V6(ncec->ncec_addr, NCE_TABLE_SIZE); in ncec_cache_reclaim()
3665 ncec_delete(ncec); in ncec_cache_reclaim()
3721 ncec_trace_ref(ncec_t *ncec) in ncec_trace_ref() argument
3723 ASSERT(MUTEX_HELD(&ncec->ncec_lock)); in ncec_trace_ref()
3725 if (ncec->ncec_trace_disable) in ncec_trace_ref()
3728 if (!th_trace_ref(ncec, ncec->ncec_ipst)) { in ncec_trace_ref()
3729 ncec->ncec_trace_disable = B_TRUE; in ncec_trace_ref()
3730 ncec_trace_cleanup(ncec); in ncec_trace_ref()
3735 ncec_untrace_ref(ncec_t *ncec) in ncec_untrace_ref() argument
3737 ASSERT(MUTEX_HELD(&ncec->ncec_lock)); in ncec_untrace_ref()
3739 if (!ncec->ncec_trace_disable) in ncec_untrace_ref()
3740 th_trace_unref(ncec); in ncec_untrace_ref()
3744 ncec_trace_cleanup(const ncec_t *ncec) in ncec_trace_cleanup() argument
3746 th_trace_cleanup(ncec, ncec->ncec_trace_disable); in ncec_trace_cleanup()
3755 arp_resolv_failed(ncec_t *ncec) in arp_resolv_failed() argument
3760 ill_t *ill = ncec->ncec_ill; in arp_resolv_failed()
3761 ip_stack_t *ipst = ncec->ncec_ipst; in arp_resolv_failed()
3776 IN6_V4MAPPED_TO_INADDR(&ncec->ncec_addr, &ipv4addr); in arp_resolv_failed()
3779 mutex_enter(&ncec->ncec_lock); in arp_resolv_failed()
3780 mp = ncec->ncec_qd_mp; in arp_resolv_failed()
3781 ncec->ncec_qd_mp = NULL; in arp_resolv_failed()
3782 ncec->ncec_nprobes = 0; in arp_resolv_failed()
3783 mutex_exit(&ncec->ncec_lock); in arp_resolv_failed()
3801 ncec_cb_dispatch(ncec); /* finish off waiting callbacks */ in arp_resolv_failed()
3966 ncec_t *ncec = nce->nce_common; in nce_add_v4_postprocess() local
3967 uint16_t flags = ncec->ncec_flags; in nce_add_v4_postprocess()
3971 ip_stack_t *ipst = ncec->ncec_ill->ill_ipst; in nce_add_v4_postprocess()
3972 uchar_t *hw_addr = ncec->ncec_lladdr; in nce_add_v4_postprocess()
3981 if (NCE_PUBLISH(ncec) || !NCE_ISREACHABLE(ncec) || (hw_addr == NULL && in nce_add_v4_postprocess()
3982 ncec->ncec_ill->ill_net_type != IRE_IF_NORESOLVER)) in nce_add_v4_postprocess()
3988 if (NCE_PUBLISH(ncec) && ncec->ncec_state == ND_PROBE) { in nce_add_v4_postprocess()
4002 mutex_enter(&ncec->ncec_lock); in nce_add_v4_postprocess()
4003 ncec->ncec_unsolicit_count = in nce_add_v4_postprocess()
4005 mutex_exit(&ncec->ncec_lock); in nce_add_v4_postprocess()
4006 dropped = arp_announce(ncec); in nce_add_v4_postprocess()
4007 mutex_enter(&ncec->ncec_lock); in nce_add_v4_postprocess()
4009 ncec->ncec_unsolicit_count++; in nce_add_v4_postprocess()
4011 ncec->ncec_last_time_defended = ddi_get_lbolt(); in nce_add_v4_postprocess()
4012 if (ncec->ncec_unsolicit_count != 0) { in nce_add_v4_postprocess()
4013 nce_start_timer(ncec, in nce_add_v4_postprocess()
4016 mutex_exit(&ncec->ncec_lock); in nce_add_v4_postprocess()
4024 mutex_enter(&ncec->ncec_lock); in nce_add_v4_postprocess()
4025 if (ncec->ncec_pcnt == 0) { in nce_add_v4_postprocess()
4032 ncec->ncec_unsolicit_count = 0; in nce_add_v4_postprocess()
4033 mutex_exit(&ncec->ncec_lock); in nce_add_v4_postprocess()
4034 nce_restart_timer(ncec, 0); in nce_add_v4_postprocess()
4036 mutex_exit(&ncec->ncec_lock); in nce_add_v4_postprocess()
4037 delay = ((ncec->ncec_flags & NCE_F_FAST) ? in nce_add_v4_postprocess()
4040 nce_dad(ncec, NULL, (delay == 0 ? B_TRUE : B_FALSE)); in nce_add_v4_postprocess()
4052 nce_update_hw_changed(ncec_t *ncec, void *arg) in nce_update_hw_changed() argument
4057 if (ncec->ncec_state != ND_REACHABLE) in nce_update_hw_changed()
4060 IN6_V4MAPPED_TO_IPADDR(&ncec->ncec_addr, ncec_addr); in nce_update_hw_changed()
4064 mutex_enter(&ncec->ncec_lock); in nce_update_hw_changed()
4066 ncec->ncec_flags = hwm->hwm_flags; in nce_update_hw_changed()
4067 nce_update(ncec, ND_STALE, hwm->hwm_hwaddr); in nce_update_hw_changed()
4068 mutex_exit(&ncec->ncec_lock); in nce_update_hw_changed()
4072 ncec_refhold(ncec_t *ncec) in ncec_refhold() argument
4074 mutex_enter(&(ncec)->ncec_lock); in ncec_refhold()
4075 (ncec)->ncec_refcnt++; in ncec_refhold()
4076 ASSERT((ncec)->ncec_refcnt != 0); in ncec_refhold()
4078 ncec_trace_ref(ncec); in ncec_refhold()
4080 mutex_exit(&(ncec)->ncec_lock); in ncec_refhold()
4084 ncec_refhold_notr(ncec_t *ncec) in ncec_refhold_notr() argument
4086 mutex_enter(&(ncec)->ncec_lock); in ncec_refhold_notr()
4087 (ncec)->ncec_refcnt++; in ncec_refhold_notr()
4088 ASSERT((ncec)->ncec_refcnt != 0); in ncec_refhold_notr()
4089 mutex_exit(&(ncec)->ncec_lock); in ncec_refhold_notr()
4093 ncec_refhold_locked(ncec_t *ncec) in ncec_refhold_locked() argument
4095 ASSERT(MUTEX_HELD(&(ncec)->ncec_lock)); in ncec_refhold_locked()
4096 (ncec)->ncec_refcnt++; in ncec_refhold_locked()
4098 ncec_trace_ref(ncec); in ncec_refhold_locked()
4104 ncec_refrele(ncec_t *ncec) in ncec_refrele() argument
4106 mutex_enter(&(ncec)->ncec_lock); in ncec_refrele()
4108 ncec_untrace_ref(ncec); in ncec_refrele()
4110 ASSERT((ncec)->ncec_refcnt != 0); in ncec_refrele()
4111 if (--(ncec)->ncec_refcnt == 0) { in ncec_refrele()
4112 ncec_inactive(ncec); in ncec_refrele()
4114 mutex_exit(&(ncec)->ncec_lock); in ncec_refrele()
4119 ncec_refrele_notr(ncec_t *ncec) in ncec_refrele_notr() argument
4121 mutex_enter(&(ncec)->ncec_lock); in ncec_refrele_notr()
4122 ASSERT((ncec)->ncec_refcnt != 0); in ncec_refrele_notr()
4123 if (--(ncec)->ncec_refcnt == 0) { in ncec_refrele_notr()
4124 ncec_inactive(ncec); in ncec_refrele_notr()
4126 mutex_exit(&(ncec)->ncec_lock); in ncec_refrele_notr()
4134 nce_restart_timer(ncec_t *ncec, uint_t ms) in nce_restart_timer() argument
4138 ASSERT(!MUTEX_HELD(&(ncec)->ncec_lock)); in nce_restart_timer()
4141 mutex_enter(&ncec->ncec_lock); in nce_restart_timer()
4142 tid = ncec->ncec_timeout_id; in nce_restart_timer()
4143 ncec->ncec_timeout_id = 0; in nce_restart_timer()
4145 mutex_exit(&ncec->ncec_lock); in nce_restart_timer()
4147 mutex_enter(&ncec->ncec_lock); in nce_restart_timer()
4151 nce_start_timer(ncec, ms); in nce_restart_timer()
4152 mutex_exit(&ncec->ncec_lock); in nce_restart_timer()
4156 nce_start_timer(ncec_t *ncec, uint_t ms) in nce_start_timer() argument
4158 ASSERT(MUTEX_HELD(&ncec->ncec_lock)); in nce_start_timer()
4163 if (!NCE_ISCONDEMNED(ncec) && ncec->ncec_timeout_id == 0) { in nce_start_timer()
4164 ncec->ncec_timeout_id = timeout(nce_timer, ncec, in nce_start_timer()
4252 ncec_t *ncec = nce->nce_common; in ncec_reschedule() local
4254 ASSERT(ncec->ncec_ill == ncert->ncert_ill); in ncec_reschedule()
4258 if (!NCE_MYADDR(ncec) || ncec->ncec_state != ND_REACHABLE) in ncec_reschedule()
4261 ncec_refhold(ncec); in ncec_reschedule()
4262 ncert->ncert_nces[ncert->ncert_num++] = ncec; in ncec_reschedule()
4266 ncec_refhold(ncec); in ncec_reschedule()
4268 ASSERT(ncec != NULL); in ncec_reschedule()
4270 ncec->ncec_last_time_defended) { in ncec_reschedule()
4272 *ncecs = ncec; in ncec_reschedule()
4273 ncec = ncec_temp; in ncec_reschedule()
4276 ncec_refrele(ncec); in ncec_reschedule()
4290 ncec_t *ncec; in nce_ill_reschedule() local
4310 ncec = ncert->ncert_nces[i]; in nce_ill_reschedule()
4311 mutex_enter(&ncec->ncec_lock); in nce_ill_reschedule()
4312 ncec->ncec_flags |= NCE_F_DELAYED; in nce_ill_reschedule()
4313 mutex_exit(&ncec->ncec_lock); in nce_ill_reschedule()
4335 ill_defend_rate_limit(ill_t *ill, ncec_t *ncec) in ill_defend_rate_limit() argument
4372 mutex_enter(&ncec->ncec_lock); in ill_defend_rate_limit()
4373 if (ncec->ncec_flags & NCE_F_DELAYED) { in ill_defend_rate_limit()
4380 ncec->ncec_flags &= ~NCE_F_DELAYED; in ill_defend_rate_limit()
4381 mutex_exit(&ncec->ncec_lock); in ill_defend_rate_limit()
4385 mutex_exit(&ncec->ncec_lock); in ill_defend_rate_limit()
4417 ndp_announce(ncec_t *ncec) in ndp_announce() argument
4419 return (ndp_xmit(ncec->ncec_ill, ND_NEIGHBOR_ADVERT, ncec->ncec_lladdr, in ndp_announce()
4420 ncec->ncec_lladdr_length, &ncec->ncec_addr, &ipv6_all_hosts_mcast, in ndp_announce()
4421 nce_advert_flags(ncec))); in ndp_announce()
4425 nce_resolve_src(ncec_t *ncec, in6_addr_t *src) in nce_resolve_src() argument
4430 ill_t *ill = ncec->ncec_ill; in nce_resolve_src()
4433 boolean_t is_myaddr = NCE_MYADDR(ncec); in nce_resolve_src()
4434 boolean_t isv6 = (ncec->ncec_ipversion == IPV6_VERSION); in nce_resolve_src()
4441 src6 = ncec->ncec_addr; in nce_resolve_src()
4443 IN6_V4MAPPED_TO_IPADDR(&ncec->ncec_addr, src4); in nce_resolve_src()
4448 mutex_enter(&ncec->ncec_lock); in nce_resolve_src()
4449 mp = ncec->ncec_qd_mp; in nce_resolve_src()
4462 mutex_exit(&ncec->ncec_lock); in nce_resolve_src()
4498 ncec_t *, ncec, ipif_t *, ipif); in nce_resolve_src()
4514 ipif = ipif_select_source_v6(ill, &ncec->ncec_addr, in nce_resolve_src()
4520 IN6_V4MAPPED_TO_IPADDR(&ncec->ncec_addr, nce_addr); in nce_resolve_src()
4530 &ncec->ncec_addr, B_TRUE, in nce_resolve_src()
4534 IN6_V4MAPPED_TO_IPADDR(&ncec->ncec_addr, in nce_resolve_src()
4548 (char *)&ncec->ncec_addr, buf, sizeof (buf)))); in nce_resolve_src()
4549 DTRACE_PROBE1(nce__resolve__no__ipif, ncec_t *, ncec); in nce_resolve_src()
4562 DTRACE_PROBE2(nce__resolve__src__ill, ncec_t *, ncec, in nce_resolve_src()
4573 ncec_t *ncec; in ip_nce_lookup_and_update() local
4584 ncec = nce->nce_common; in ip_nce_lookup_and_update()
4585 mutex_enter(&ncec->ncec_lock); in ip_nce_lookup_and_update()
4586 if (NCE_ISREACHABLE(ncec)) in ip_nce_lookup_and_update()
4590 ncec->ncec_flags = flags; in ip_nce_lookup_and_update()
4591 nce_update(ncec, new_state, hwaddr); in ip_nce_lookup_and_update()
4592 mutex_exit(&ncec->ncec_lock); in ip_nce_lookup_and_update()
4631 ncec_t *ncec; in nce_add_common() local
4680 ncec = *ncep; in nce_add_common()
4681 for (; ncec != NULL; ncec = ncec->ncec_next) { in nce_add_common()
4682 if (ncec->ncec_ill == ill) { in nce_add_common()
4683 if (IN6_ARE_ADDR_EQUAL(&ncec->ncec_addr, addr)) { in nce_add_common()
4698 if (NCE_MYADDR(ncec)) in nce_add_common()
4700 *retnce = nce_ill_lookup_then_add(ill, ncec); in nce_add_common()
4709 ncec = kmem_cache_alloc(ncec_cache, KM_NOSLEEP); in nce_add_common()
4710 if (ncec == NULL) in nce_add_common()
4712 *ncec = nce_nil; in nce_add_common()
4713 ncec->ncec_ill = ill; in nce_add_common()
4714 ncec->ncec_ipversion = (ill->ill_isv6 ? IPV6_VERSION : IPV4_VERSION); in nce_add_common()
4715 ncec->ncec_flags = flags; in nce_add_common()
4716 ncec->ncec_ipst = ipst; /* No netstack_hold */ in nce_add_common()
4732 } else if (IS_IPMP(ill) && NCE_PUBLISH(ncec) && in nce_add_common()
4742 ncec->ncec_xmit_interval = in nce_add_common()
4744 ncec->ncec_pcnt = in nce_add_common()
4746 ncec->ncec_flags |= NCE_F_FAST; in nce_add_common()
4748 ncec->ncec_xmit_interval = in nce_add_common()
4750 ncec->ncec_pcnt = in nce_add_common()
4753 if (NCE_PUBLISH(ncec)) { in nce_add_common()
4754 ncec->ncec_unsolicit_count = in nce_add_common()
4762 ncec->ncec_pcnt = ND_MAX_UNICAST_SOLICIT; in nce_add_common()
4763 if (NCE_PUBLISH(ncec)) { in nce_add_common()
4764 ncec->ncec_unsolicit_count = in nce_add_common()
4768 ncec->ncec_rcnt = ill->ill_xmit_count; in nce_add_common()
4769 ncec->ncec_addr = *addr; in nce_add_common()
4770 ncec->ncec_qd_mp = NULL; in nce_add_common()
4771 ncec->ncec_refcnt = 1; /* for ncec getting created */ in nce_add_common()
4772 mutex_init(&ncec->ncec_lock, NULL, MUTEX_DEFAULT, NULL); in nce_add_common()
4773 ncec->ncec_trace_disable = B_FALSE; in nce_add_common()
4784 ncec->ncec_lladdr = template; in nce_add_common()
4785 ncec->ncec_lladdr_length = hw_addr_len; in nce_add_common()
4786 bzero(ncec->ncec_lladdr, hw_addr_len); in nce_add_common()
4810 ncec->ncec_lladdr, ill->ill_phys_addr_length); in nce_add_common()
4822 ncec->ncec_lladdr, ill->ill_phys_addr_length); in nce_add_common()
4830 ncec->ncec_flags |= NCE_F_NONUD; in nce_add_common()
4848 else if (!NCE_PUBLISH(ncec)) in nce_add_common()
4853 nce_set_ll(ncec, hw_addr); in nce_add_common()
4860 ncec->ncec_flags |= NCE_F_UNVERIFIED; in nce_add_common()
4862 ncec->ncec_state = state; in nce_add_common()
4865 ncec->ncec_last = ncec->ncec_init_time = in nce_add_common()
4868 ncec->ncec_last = 0; in nce_add_common()
4870 ncec->ncec_init_time = TICK_TO_MSEC(ddi_get_lbolt64()); in nce_add_common()
4872 list_create(&ncec->ncec_cb, sizeof (ncec_cb_t), in nce_add_common()
4883 if (ncec->ncec_lladdr != NULL || in nce_add_common()
4885 dlur_mp = ill_dlur_gen(ncec->ncec_lladdr, in nce_add_common()
4904 if (!NCE_MYADDR(ncec) && in nce_add_common()
4907 DTRACE_PROBE1(nce__add__on__down__ill, ncec_t *, ncec); in nce_add_common()
4916 mutex_enter(&ncec->ncec_lock); in nce_add_common()
4917 if ((ncec->ncec_next = *ncep) != NULL) in nce_add_common()
4918 ncec->ncec_next->ncec_ptpn = &ncec->ncec_next; in nce_add_common()
4919 *ncep = ncec; in nce_add_common()
4920 ncec->ncec_ptpn = ncep; in nce_add_common()
4924 (char *), "ncec", (void *), ncec); in nce_add_common()
4931 *retnce = nce_add_impl(ill, ncec, nce, dlur_mp, &graveyard); in nce_add_common()
4932 mutex_exit(&ncec->ncec_lock); in nce_add_common()
4940 if (ncec != NULL) in nce_add_common()
4941 kmem_cache_free(ncec_cache, ncec); in nce_add_common()
5026 nce_add_impl(ill_t *ill, ncec_t *ncec, nce_t *nce, mblk_t *dlur_mp, in nce_add_impl() argument
5031 if ((ncec->ncec_flags & NCE_F_MCAST) != 0) { in nce_add_impl()
5041 nce->nce_common = ncec; in nce_add_impl()
5042 nce->nce_addr = ncec->ncec_addr; in nce_add_impl()
5049 ncec->ncec_refcnt++; /* want ncec_refhold_locked_notr(ncec) */ in nce_add_impl()
5059 nce_add(ill_t *ill, ncec_t *ncec, list_t *graveyard) in nce_add() argument
5065 ASSERT(MUTEX_HELD(&ncec->ncec_lock)); in nce_add()
5070 if (ncec->ncec_lladdr != NULL || in nce_add()
5072 dlur_mp = ill_dlur_gen(ncec->ncec_lladdr, in nce_add()
5084 return (nce_add_impl(ill, ncec, nce, dlur_mp, graveyard)); in nce_add()
5234 nce_resolv_ipmp_ok(ncec_t *ncec) in nce_resolv_ipmp_ok() argument
5240 ill_t *ill = ncec->ncec_ill; in nce_resolv_ipmp_ok()
5241 boolean_t isv6 = (ncec->ncec_ipversion == IPV6_VERSION); in nce_resolv_ipmp_ok()
5249 mutex_enter(&ncec->ncec_lock); in nce_resolv_ipmp_ok()
5250 nprobes = ncec->ncec_nprobes; in nce_resolv_ipmp_ok()
5251 mp = ncec->ncec_qd_mp; in nce_resolv_ipmp_ok()
5252 ncec->ncec_qd_mp = NULL; in nce_resolv_ipmp_ok()
5253 ncec->ncec_nprobes = 0; in nce_resolv_ipmp_ok()
5254 mutex_exit(&ncec->ncec_lock); in nce_resolv_ipmp_ok()
5296 send_ill = ipmp_ill_hold_xmit_ill(ncec->ncec_ill, in nce_resolv_ipmp_ok()
5304 (ncec_t *), ncec, (ipif_t *), in nce_resolv_ipmp_ok()
5314 if (IS_IN_SAME_ILLGRP(send_ill, ncec->ncec_ill)) in nce_resolv_ipmp_ok()
5315 under_nce = nce_fastpath_create(send_ill, ncec); in nce_resolv_ipmp_ok()
5319 if (under_nce != NULL && NCE_ISREACHABLE(ncec)) in nce_resolv_ipmp_ok()
5347 ncec_cb_dispatch(ncec); /* complete callbacks */ in nce_resolv_ipmp_ok()