Lines Matching defs:ifma

198 	struct ifmultiaddr	ifma;			/* ifmultiaddr */
2680 struct ifmultiaddr *ifma;
2682 ifma = (how == M_WAITOK) ? zalloc(ifma_zone) :
2685 if (ifma != NULL) {
2686 bzero(ifma, ifma_size);
2687 lck_mtx_init(&ifma->ifma_lock, ifa_mtx_grp, ifa_mtx_attr);
2688 ifma->ifma_debug |= IFD_ALLOC;
2690 ifma->ifma_debug |= IFD_DEBUG;
2691 ifma->ifma_trace = ifma_trace;
2694 return (ifma);
2698 ifma_free(struct ifmultiaddr *ifma)
2700 IFMA_LOCK(ifma);
2702 if (ifma->ifma_protospec != NULL) {
2703 panic("%s: Protospec not NULL for ifma=%p", __func__, ifma);
2705 } else if ((ifma->ifma_flags & IFMAF_ANONYMOUS) ||
2706 ifma->ifma_anoncnt != 0) {
2707 panic("%s: Freeing ifma=%p with outstanding anon req",
2708 __func__, ifma);
2710 } else if (ifma->ifma_debug & IFD_ATTACHED) {
2711 panic("%s: ifma=%p attached to ifma_ifp=%p is being freed",
2712 __func__, ifma, ifma->ifma_ifp);
2714 } else if (!(ifma->ifma_debug & IFD_ALLOC)) {
2715 panic("%s: ifma %p cannot be freed", __func__, ifma);
2717 } else if (ifma->ifma_refcount != 0) {
2718 panic("%s: non-zero refcount ifma=%p", __func__, ifma);
2720 } else if (ifma->ifma_reqcnt != 0) {
2721 panic("%s: non-zero reqcnt ifma=%p", __func__, ifma);
2723 } else if (ifma->ifma_ifp != NULL) {
2724 panic("%s: non-NULL ifma_ifp=%p for ifma=%p", __func__,
2725 ifma->ifma_ifp, ifma);
2727 } else if (ifma->ifma_ll != NULL) {
2728 panic("%s: non-NULL ifma_ll=%p for ifma=%p", __func__,
2729 ifma->ifma_ll, ifma);
2732 ifma->ifma_debug &= ~IFD_ALLOC;
2733 if ((ifma->ifma_debug & (IFD_DEBUG | IFD_TRASHED)) ==
2736 TAILQ_REMOVE(&ifma_trash_head, (struct ifmultiaddr_dbg *)ifma,
2739 ifma->ifma_debug &= ~IFD_TRASHED;
2741 IFMA_UNLOCK(ifma);
2743 if (ifma->ifma_addr != NULL) {
2744 FREE(ifma->ifma_addr, M_IFADDR);
2745 ifma->ifma_addr = NULL;
2747 lck_mtx_destroy(&ifma->ifma_lock, ifa_mtx_grp);
2748 zfree(ifma_zone, ifma);
2752 ifma_trace(struct ifmultiaddr *ifma, int refhold)
2754 struct ifmultiaddr_dbg *ifma_dbg = (struct ifmultiaddr_dbg *)ifma;
2759 if (!(ifma->ifma_debug & IFD_DEBUG)) {
2760 panic("%s: ifma %p has no debug structure", __func__, ifma);
2776 ifma_addref(struct ifmultiaddr *ifma, int locked)
2779 IFMA_LOCK(ifma);
2781 IFMA_LOCK_ASSERT_HELD(ifma);
2783 if (++ifma->ifma_refcount == 0) {
2784 panic("%s: ifma=%p wraparound refcnt", __func__, ifma);
2786 } else if (ifma->ifma_trace != NULL) {
2787 (*ifma->ifma_trace)(ifma, TRUE);
2790 IFMA_UNLOCK(ifma);
2794 ifma_remref(struct ifmultiaddr *ifma)
2798 IFMA_LOCK(ifma);
2800 if (ifma->ifma_refcount == 0) {
2801 panic("%s: ifma=%p negative refcnt", __func__, ifma);
2803 } else if (ifma->ifma_trace != NULL) {
2804 (*ifma->ifma_trace)(ifma, FALSE);
2807 --ifma->ifma_refcount;
2808 if (ifma->ifma_refcount > 0) {
2809 IFMA_UNLOCK(ifma);
2813 ll = ifma->ifma_ll;
2814 ifma->ifma_ifp = NULL;
2815 ifma->ifma_ll = NULL;
2816 IFMA_UNLOCK(ifma);
2817 ifma_free(ifma); /* deallocate it */
2824 if_attach_ifma(struct ifnet *ifp, struct ifmultiaddr *ifma, int anon)
2827 IFMA_LOCK_ASSERT_HELD(ifma);
2829 if (ifma->ifma_ifp != ifp) {
2831 ifma->ifma_ifp, ifp);
2833 } else if (ifma->ifma_debug & IFD_ATTACHED) {
2834 panic("%s: Attempt to attach an already attached ifma=%p",
2835 __func__, ifma);
2837 } else if (anon && (ifma->ifma_flags & IFMAF_ANONYMOUS)) {
2838 panic("%s: ifma=%p unexpected IFMAF_ANONYMOUS", __func__, ifma);
2840 } else if (ifma->ifma_debug & IFD_TRASHED) {
2841 panic("%s: Attempt to reattach a detached ifma=%p",
2842 __func__, ifma);
2846 ifma->ifma_reqcnt++;
2847 VERIFY(ifma->ifma_reqcnt == 1);
2848 IFMA_ADDREF_LOCKED(ifma);
2849 ifma->ifma_debug |= IFD_ATTACHED;
2851 ifma->ifma_anoncnt++;
2852 VERIFY(ifma->ifma_anoncnt == 1);
2853 ifma->ifma_flags |= IFMAF_ANONYMOUS;
2856 LIST_INSERT_HEAD(&ifp->if_multiaddrs, ifma, ifma_link);
2860 if_detach_ifma(struct ifnet *ifp, struct ifmultiaddr *ifma, int anon)
2863 IFMA_LOCK_ASSERT_HELD(ifma);
2865 if (ifma->ifma_reqcnt == 0) {
2866 panic("%s: ifma=%p negative reqcnt", __func__, ifma);
2868 } else if (anon && !(ifma->ifma_flags & IFMAF_ANONYMOUS)) {
2869 panic("%s: ifma=%p missing IFMAF_ANONYMOUS", __func__, ifma);
2871 } else if (anon && ifma->ifma_anoncnt == 0) {
2872 panic("%s: ifma=%p negative anonreqcnt", __func__, ifma);
2874 } else if (ifma->ifma_ifp != ifp) {
2876 ifma->ifma_ifp, ifp);
2881 --ifma->ifma_anoncnt;
2882 if (ifma->ifma_anoncnt > 0)
2884 ifma->ifma_flags &= ~IFMAF_ANONYMOUS;
2887 --ifma->ifma_reqcnt;
2888 if (ifma->ifma_reqcnt > 0)
2891 if (ifma->ifma_protospec != NULL) {
2892 panic("%s: Protospec not NULL for ifma=%p", __func__, ifma);
2894 } else if ((ifma->ifma_flags & IFMAF_ANONYMOUS) ||
2895 ifma->ifma_anoncnt != 0) {
2896 panic("%s: Detaching ifma=%p with outstanding anon req",
2897 __func__, ifma);
2899 } else if (!(ifma->ifma_debug & IFD_ATTACHED)) {
2900 panic("%s: Attempt to detach an unattached address ifma=%p",
2901 __func__, ifma);
2903 } else if (ifma->ifma_debug & IFD_TRASHED) {
2904 panic("%s: ifma %p is already in trash list", __func__, ifma);
2911 ifma->ifma_debug &= ~IFD_ATTACHED;
2912 LIST_REMOVE(ifma, ifma_link);
2916 if (ifma->ifma_debug & IFD_DEBUG) {
2918 IFMA_CONVERT_LOCK(ifma);
2921 (struct ifmultiaddr_dbg *)ifma, ifma_trash_link);
2923 ifma->ifma_debug |= IFD_TRASHED;
2939 struct ifmultiaddr *ifma;
2941 for (ifma = LIST_FIRST(&ifp->if_multiaddrs); ifma != NULL;
2942 ifma = LIST_NEXT(ifma, ifma_link)) {
2943 IFMA_LOCK_SPIN(ifma);
2944 if (!equal(sa, ifma->ifma_addr)) {
2945 IFMA_UNLOCK(ifma);
2949 VERIFY(!(ifma->ifma_flags & IFMAF_ANONYMOUS) ||
2950 ifma->ifma_anoncnt != 0);
2951 VERIFY((ifma->ifma_flags & IFMAF_ANONYMOUS) ||
2952 ifma->ifma_anoncnt == 0);
2953 ifma->ifma_anoncnt++;
2954 if (!(ifma->ifma_flags & IFMAF_ANONYMOUS)) {
2955 VERIFY(ifma->ifma_anoncnt == 1);
2956 ifma->ifma_flags |= IFMAF_ANONYMOUS;
2959 if (!anon || ifma->ifma_anoncnt == 1) {
2960 ifma->ifma_reqcnt++;
2961 VERIFY(ifma->ifma_reqcnt > 1);
2964 *retifma = ifma;
2965 IFMA_ADDREF_LOCKED(ifma);
2967 IFMA_UNLOCK(ifma);
3093 struct ifmultiaddr *ifma = NULL;
3158 ifma = ifma_alloc(M_WAITOK);
3159 if (ifma == NULL) {
3176 if (if_addmulti_doesexist(ifp, llsa, &ifma->ifma_ll, 0) == 0) {
3181 VERIFY(ifma->ifma_ll->ifma_ifp == ifp);
3188 /* add extra refcnt for ifma */
3191 ifma->ifma_ll = llifma;
3196 VERIFY(!anon || ifma->ifma_ll == NULL);
3198 ifma->ifma_addr = dupsa;
3199 ifma->ifma_ifp = ifp;
3200 IFMA_LOCK(ifma);
3201 if_attach_ifma(ifp, ifma, anon);
3202 IFMA_ADDREF_LOCKED(ifma); /* for this routine */
3204 *retifma = ifma;
3207 lladdr = (ifma->ifma_addr->sa_family == AF_UNSPEC ||
3208 ifma->ifma_addr->sa_family == AF_LINK);
3209 IFMA_UNLOCK(ifma);
3212 rt_newmaddrmsg(RTM_NEWMADDR, ifma);
3213 IFMA_REMREF(ifma); /* for this routine */
3229 if (ifma != NULL)
3230 ifma_free(ifma);
3256 if_delmulti_ifma(struct ifmultiaddr *ifma)
3258 return (if_delmulti_common(ifma, NULL, NULL, 0));
3278 if_delmulti_common(struct ifmultiaddr *ifma, struct ifnet *ifp,
3286 VERIFY(ifma != NULL || (ifp != NULL && sa != NULL));
3288 if (ifma != NULL)
3289 ifp = ifma->ifma_ifp;
3300 if (ifma == NULL) {
3301 for (ifma = LIST_FIRST(&ifp->if_multiaddrs); ifma != NULL;
3302 ifma = LIST_NEXT(ifma, ifma_link)) {
3303 IFMA_LOCK(ifma);
3304 if (!equal(sa, ifma->ifma_addr) ||
3305 (anon && !(ifma->ifma_flags & IFMAF_ANONYMOUS))) {
3306 VERIFY(!(ifma->ifma_flags & IFMAF_ANONYMOUS) ||
3307 ifma->ifma_anoncnt != 0);
3308 IFMA_UNLOCK(ifma);
3314 if (ifma == NULL) {
3321 IFMA_LOCK(ifma);
3323 IFMA_LOCK_ASSERT_HELD(ifma);
3324 IFMA_ADDREF_LOCKED(ifma); /* for this routine */
3325 lastref = if_detach_ifma(ifp, ifma, anon);
3326 VERIFY(!lastref || (!(ifma->ifma_debug & IFD_ATTACHED) &&
3327 ifma->ifma_reqcnt == 0));
3328 VERIFY(!anon || ifma->ifma_ll == NULL);
3329 ll = ifma->ifma_ll;
3330 lladdr = (ifma->ifma_addr->sa_family == AF_UNSPEC ||
3331 ifma->ifma_addr->sa_family == AF_LINK);
3332 IFMA_UNLOCK(ifma);
3341 rt_newmaddrmsg(RTM_DELMADDR, ifma);
3354 IFMA_REMREF(ifma); /* for if_multiaddrs list */
3358 IFMA_REMREF(ifma); /* for this routine */