Lines Matching refs:imo
214 struct ip_moptions imo; /* ip_moptions */ member
273 struct ip_moptions *imo, struct ip_out_args *ipoa) in ip_output() argument
275 return ip_output_list(m0, 0, opt, ro, flags, imo, ipoa); in ip_output()
293 struct route *ro, int flags, struct ip_moptions *imo, in ip_output_list() argument
403 imo = NULL; in ip_output_list()
684 imo != NULL && (ifp = imo->imo_multicast_ifp) != NULL) { in ip_output_list()
941 if (imo != NULL) { in ip_output_list()
942 IMO_LOCK(imo); in ip_output_list()
943 vif = imo->imo_multicast_vif; in ip_output_list()
944 ttl = imo->imo_multicast_ttl; in ip_output_list()
945 loop = imo->imo_multicast_loop; in ip_output_list()
949 if (imo->imo_multicast_ifp != NULL) { in ip_output_list()
950 ifp = imo->imo_multicast_ifp; in ip_output_list()
952 IMO_UNLOCK(imo); in ip_output_list()
960 if (imo == NULL || vif == -1) { in ip_output_list()
996 if (inm != NULL && (imo == NULL || loop)) { in ip_output_list()
1010 if (imo != NULL) { in ip_output_list()
2933 imo_addref(struct ip_moptions *imo, int locked) in imo_addref() argument
2936 IMO_LOCK(imo); in imo_addref()
2938 IMO_LOCK_ASSERT_HELD(imo); in imo_addref()
2941 if (++imo->imo_refcnt == 0) { in imo_addref()
2942 panic("%s: imo %p wraparound refcnt", __func__, imo); in imo_addref()
2944 } else if (imo->imo_trace != NULL) { in imo_addref()
2945 (*imo->imo_trace)(imo, TRUE); in imo_addref()
2949 IMO_UNLOCK(imo); in imo_addref()
2954 imo_remref(struct ip_moptions *imo) in imo_remref() argument
2956 IMO_LOCK(imo); in imo_remref()
2957 if (imo->imo_refcnt == 0) { in imo_remref()
2958 panic("%s: imo %p negative refcnt", __func__, imo); in imo_remref()
2960 } else if (imo->imo_trace != NULL) { in imo_remref()
2961 (*imo->imo_trace)(imo, FALSE); in imo_remref()
2964 --imo->imo_refcnt; in imo_remref()
2965 if (imo->imo_refcnt > 0) { in imo_remref()
2966 IMO_UNLOCK(imo); in imo_remref()
2970 IMO_PURGE_LOCKED(imo); in imo_remref()
2972 IMO_UNLOCK(imo); in imo_remref()
2974 kfree_type_counted_by(struct in_multi *, imo->imo_max_memberships, imo->imo_membership); in imo_remref()
2975 kfree_type_counted_by(struct in_mfilter, imo->imo_max_filters, imo->imo_mfilters); in imo_remref()
2977 lck_mtx_destroy(&imo->imo_lock, &ifa_mtx_grp); in imo_remref()
2979 if (!(imo->imo_debug & IFD_ALLOC)) { in imo_remref()
2980 panic("%s: imo %p cannot be freed", __func__, imo); in imo_remref()
2983 zfree(imo_zone, imo); in imo_remref()
2987 imo_trace(struct ip_moptions *imo, int refhold) in imo_trace() argument
2989 struct ip_moptions_dbg *imo_dbg = (struct ip_moptions_dbg *)imo; in imo_trace()
2994 if (!(imo->imo_debug & IFD_DEBUG)) { in imo_trace()
2995 panic("%s: imo %p has no debug structure", __func__, imo); in imo_trace()
3013 struct ip_moptions *imo; in ip_allocmoptions() local
3015 imo = zalloc_flags(imo_zone, how | Z_ZERO); in ip_allocmoptions()
3016 if (imo != NULL) { in ip_allocmoptions()
3017 lck_mtx_init(&imo->imo_lock, &ifa_mtx_grp, &ifa_mtx_attr); in ip_allocmoptions()
3018 imo->imo_debug |= IFD_ALLOC; in ip_allocmoptions()
3020 imo->imo_debug |= IFD_DEBUG; in ip_allocmoptions()
3021 imo->imo_trace = imo_trace; in ip_allocmoptions()
3023 IMO_ADDREF(imo); in ip_allocmoptions()
3026 return imo; in ip_allocmoptions()