Lines Matching refs:ifma

194 	struct ifmultiaddr	ifma;			/* ifmultiaddr */
2505 struct ifmultiaddr *ifma;
2507 ifma = (how == M_WAITOK) ? zalloc(ifma_zone) :
2510 if (ifma != NULL) {
2511 bzero(ifma, ifma_size);
2512 lck_mtx_init(&ifma->ifma_lock, ifa_mtx_grp, ifa_mtx_attr);
2513 ifma->ifma_debug |= IFD_ALLOC;
2515 ifma->ifma_debug |= IFD_DEBUG;
2516 ifma->ifma_trace = ifma_trace;
2519 return (ifma);
2523 ifma_free(struct ifmultiaddr *ifma)
2525 IFMA_LOCK(ifma);
2527 if (ifma->ifma_protospec != NULL) {
2528 panic("%s: Protospec not NULL for ifma=%p", __func__, ifma);
2530 } else if ((ifma->ifma_flags & IFMAF_ANONYMOUS) ||
2531 ifma->ifma_anoncnt != 0) {
2532 panic("%s: Freeing ifma=%p with outstanding anon req",
2533 __func__, ifma);
2535 } else if (ifma->ifma_debug & IFD_ATTACHED) {
2536 panic("%s: ifma=%p attached to ifma_ifp=%p is being freed",
2537 __func__, ifma, ifma->ifma_ifp);
2539 } else if (!(ifma->ifma_debug & IFD_ALLOC)) {
2540 panic("%s: ifma %p cannot be freed", __func__, ifma);
2542 } else if (ifma->ifma_refcount != 0) {
2543 panic("%s: non-zero refcount ifma=%p", __func__, ifma);
2545 } else if (ifma->ifma_reqcnt != 0) {
2546 panic("%s: non-zero reqcnt ifma=%p", __func__, ifma);
2548 } else if (ifma->ifma_ifp != NULL) {
2549 panic("%s: non-NULL ifma_ifp=%p for ifma=%p", __func__,
2550 ifma->ifma_ifp, ifma);
2552 } else if (ifma->ifma_ll != NULL) {
2553 panic("%s: non-NULL ifma_ll=%p for ifma=%p", __func__,
2554 ifma->ifma_ll, ifma);
2557 ifma->ifma_debug &= ~IFD_ALLOC;
2558 if ((ifma->ifma_debug & (IFD_DEBUG | IFD_TRASHED)) ==
2561 TAILQ_REMOVE(&ifma_trash_head, (struct ifmultiaddr_dbg *)ifma,
2564 ifma->ifma_debug &= ~IFD_TRASHED;
2566 IFMA_UNLOCK(ifma);
2568 if (ifma->ifma_addr != NULL) {
2569 FREE(ifma->ifma_addr, M_IFADDR);
2570 ifma->ifma_addr = NULL;
2572 lck_mtx_destroy(&ifma->ifma_lock, ifa_mtx_grp);
2573 zfree(ifma_zone, ifma);
2577 ifma_trace(struct ifmultiaddr *ifma, int refhold)
2579 struct ifmultiaddr_dbg *ifma_dbg = (struct ifmultiaddr_dbg *)ifma;
2584 if (!(ifma->ifma_debug & IFD_DEBUG)) {
2585 panic("%s: ifma %p has no debug structure", __func__, ifma);
2601 ifma_addref(struct ifmultiaddr *ifma, int locked)
2604 IFMA_LOCK(ifma);
2606 IFMA_LOCK_ASSERT_HELD(ifma);
2608 if (++ifma->ifma_refcount == 0) {
2609 panic("%s: ifma=%p wraparound refcnt", __func__, ifma);
2611 } else if (ifma->ifma_trace != NULL) {
2612 (*ifma->ifma_trace)(ifma, TRUE);
2615 IFMA_UNLOCK(ifma);
2619 ifma_remref(struct ifmultiaddr *ifma)
2623 IFMA_LOCK(ifma);
2625 if (ifma->ifma_refcount == 0) {
2626 panic("%s: ifma=%p negative refcnt", __func__, ifma);
2628 } else if (ifma->ifma_trace != NULL) {
2629 (*ifma->ifma_trace)(ifma, FALSE);
2632 --ifma->ifma_refcount;
2633 if (ifma->ifma_refcount > 0) {
2634 IFMA_UNLOCK(ifma);
2638 ll = ifma->ifma_ll;
2639 ifma->ifma_ifp = NULL;
2640 ifma->ifma_ll = NULL;
2641 IFMA_UNLOCK(ifma);
2642 ifma_free(ifma); /* deallocate it */
2649 if_attach_ifma(struct ifnet *ifp, struct ifmultiaddr *ifma, int anon)
2652 IFMA_LOCK_ASSERT_HELD(ifma);
2654 if (ifma->ifma_ifp != ifp) {
2656 ifma->ifma_ifp, ifp);
2658 } else if (ifma->ifma_debug & IFD_ATTACHED) {
2659 panic("%s: Attempt to attach an already attached ifma=%p",
2660 __func__, ifma);
2662 } else if (anon && (ifma->ifma_flags & IFMAF_ANONYMOUS)) {
2663 panic("%s: ifma=%p unexpected IFMAF_ANONYMOUS", __func__, ifma);
2665 } else if (ifma->ifma_debug & IFD_TRASHED) {
2666 panic("%s: Attempt to reattach a detached ifma=%p",
2667 __func__, ifma);
2671 ifma->ifma_reqcnt++;
2672 VERIFY(ifma->ifma_reqcnt == 1);
2673 IFMA_ADDREF_LOCKED(ifma);
2674 ifma->ifma_debug |= IFD_ATTACHED;
2676 ifma->ifma_anoncnt++;
2677 VERIFY(ifma->ifma_anoncnt == 1);
2678 ifma->ifma_flags |= IFMAF_ANONYMOUS;
2681 LIST_INSERT_HEAD(&ifp->if_multiaddrs, ifma, ifma_link);
2685 if_detach_ifma(struct ifnet *ifp, struct ifmultiaddr *ifma, int anon)
2688 IFMA_LOCK_ASSERT_HELD(ifma);
2690 if (ifma->ifma_reqcnt == 0) {
2691 panic("%s: ifma=%p negative reqcnt", __func__, ifma);
2693 } else if (anon && !(ifma->ifma_flags & IFMAF_ANONYMOUS)) {
2694 panic("%s: ifma=%p missing IFMAF_ANONYMOUS", __func__, ifma);
2696 } else if (anon && ifma->ifma_anoncnt == 0) {
2697 panic("%s: ifma=%p negative anonreqcnt", __func__, ifma);
2699 } else if (ifma->ifma_ifp != ifp) {
2701 ifma->ifma_ifp, ifp);
2706 --ifma->ifma_anoncnt;
2707 if (ifma->ifma_anoncnt > 0)
2709 ifma->ifma_flags &= ~IFMAF_ANONYMOUS;
2712 --ifma->ifma_reqcnt;
2713 if (ifma->ifma_reqcnt > 0)
2716 if (ifma->ifma_protospec != NULL) {
2717 panic("%s: Protospec not NULL for ifma=%p", __func__, ifma);
2719 } else if ((ifma->ifma_flags & IFMAF_ANONYMOUS) ||
2720 ifma->ifma_anoncnt != 0) {
2721 panic("%s: Detaching ifma=%p with outstanding anon req",
2722 __func__, ifma);
2724 } else if (!(ifma->ifma_debug & IFD_ATTACHED)) {
2725 panic("%s: Attempt to detach an unattached address ifma=%p",
2726 __func__, ifma);
2728 } else if (ifma->ifma_debug & IFD_TRASHED) {
2729 panic("%s: ifma %p is already in trash list", __func__, ifma);
2736 ifma->ifma_debug &= ~IFD_ATTACHED;
2737 LIST_REMOVE(ifma, ifma_link);
2741 if (ifma->ifma_debug & IFD_DEBUG) {
2743 IFMA_CONVERT_LOCK(ifma);
2746 (struct ifmultiaddr_dbg *)ifma, ifma_trash_link);
2748 ifma->ifma_debug |= IFD_TRASHED;
2764 struct ifmultiaddr *ifma;
2766 for (ifma = LIST_FIRST(&ifp->if_multiaddrs); ifma != NULL;
2767 ifma = LIST_NEXT(ifma, ifma_link)) {
2768 IFMA_LOCK_SPIN(ifma);
2769 if (!equal(sa, ifma->ifma_addr)) {
2770 IFMA_UNLOCK(ifma);
2774 VERIFY(!(ifma->ifma_flags & IFMAF_ANONYMOUS) ||
2775 ifma->ifma_anoncnt != 0);
2776 VERIFY((ifma->ifma_flags & IFMAF_ANONYMOUS) ||
2777 ifma->ifma_anoncnt == 0);
2778 ifma->ifma_anoncnt++;
2779 if (!(ifma->ifma_flags & IFMAF_ANONYMOUS)) {
2780 VERIFY(ifma->ifma_anoncnt == 1);
2781 ifma->ifma_flags |= IFMAF_ANONYMOUS;
2784 if (!anon || ifma->ifma_anoncnt == 1) {
2785 ifma->ifma_reqcnt++;
2786 VERIFY(ifma->ifma_reqcnt > 1);
2789 *retifma = ifma;
2790 IFMA_ADDREF_LOCKED(ifma);
2792 IFMA_UNLOCK(ifma);
2918 struct ifmultiaddr *ifma = NULL;
2983 ifma = ifma_alloc(M_WAITOK);
2984 if (ifma == NULL) {
3001 if (if_addmulti_doesexist(ifp, llsa, &ifma->ifma_ll, 0) == 0) {
3006 VERIFY(ifma->ifma_ll->ifma_ifp == ifp);
3013 /* add extra refcnt for ifma */
3016 ifma->ifma_ll = llifma;
3021 VERIFY(!anon || ifma->ifma_ll == NULL);
3023 ifma->ifma_addr = dupsa;
3024 ifma->ifma_ifp = ifp;
3025 IFMA_LOCK(ifma);
3026 if_attach_ifma(ifp, ifma, anon);
3027 IFMA_ADDREF_LOCKED(ifma); /* for this routine */
3029 *retifma = ifma;
3032 lladdr = (ifma->ifma_addr->sa_family == AF_UNSPEC ||
3033 ifma->ifma_addr->sa_family == AF_LINK);
3034 IFMA_UNLOCK(ifma);
3037 rt_newmaddrmsg(RTM_NEWMADDR, ifma);
3038 IFMA_REMREF(ifma); /* for this routine */
3054 if (ifma != NULL)
3055 ifma_free(ifma);
3081 if_delmulti_ifma(struct ifmultiaddr *ifma)
3083 return (if_delmulti_common(ifma, NULL, NULL, 0));
3103 if_delmulti_common(struct ifmultiaddr *ifma, struct ifnet *ifp,
3111 VERIFY(ifma != NULL || (ifp != NULL && sa != NULL));
3113 if (ifma != NULL)
3114 ifp = ifma->ifma_ifp;
3125 if (ifma == NULL) {
3126 for (ifma = LIST_FIRST(&ifp->if_multiaddrs); ifma != NULL;
3127 ifma = LIST_NEXT(ifma, ifma_link)) {
3128 IFMA_LOCK(ifma);
3129 if (!equal(sa, ifma->ifma_addr) ||
3130 (anon && !(ifma->ifma_flags & IFMAF_ANONYMOUS))) {
3131 VERIFY(!(ifma->ifma_flags & IFMAF_ANONYMOUS) ||
3132 ifma->ifma_anoncnt != 0);
3133 IFMA_UNLOCK(ifma);
3139 if (ifma == NULL) {
3146 IFMA_LOCK(ifma);
3148 IFMA_LOCK_ASSERT_HELD(ifma);
3149 IFMA_ADDREF_LOCKED(ifma); /* for this routine */
3150 lastref = if_detach_ifma(ifp, ifma, anon);
3151 VERIFY(!lastref || (!(ifma->ifma_debug & IFD_ATTACHED) &&
3152 ifma->ifma_reqcnt == 0));
3153 VERIFY(!anon || ifma->ifma_ll == NULL);
3154 ll = ifma->ifma_ll;
3155 lladdr = (ifma->ifma_addr->sa_family == AF_UNSPEC ||
3156 ifma->ifma_addr->sa_family == AF_LINK);
3157 IFMA_UNLOCK(ifma);
3166 rt_newmaddrmsg(RTM_DELMADDR, ifma);
3179 IFMA_REMREF(ifma); /* for if_multiaddrs list */
3183 IFMA_REMREF(ifma); /* for this routine */