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()
2924 imo_addref(struct ip_moptions *imo, int locked) in imo_addref() argument
2927 IMO_LOCK(imo); in imo_addref()
2929 IMO_LOCK_ASSERT_HELD(imo); in imo_addref()
2932 if (++imo->imo_refcnt == 0) { in imo_addref()
2933 panic("%s: imo %p wraparound refcnt", __func__, imo); in imo_addref()
2935 } else if (imo->imo_trace != NULL) { in imo_addref()
2936 (*imo->imo_trace)(imo, TRUE); in imo_addref()
2940 IMO_UNLOCK(imo); in imo_addref()
2945 imo_remref(struct ip_moptions *imo) in imo_remref() argument
2947 IMO_LOCK(imo); in imo_remref()
2948 if (imo->imo_refcnt == 0) { in imo_remref()
2949 panic("%s: imo %p negative refcnt", __func__, imo); in imo_remref()
2951 } else if (imo->imo_trace != NULL) { in imo_remref()
2952 (*imo->imo_trace)(imo, FALSE); in imo_remref()
2955 --imo->imo_refcnt; in imo_remref()
2956 if (imo->imo_refcnt > 0) { in imo_remref()
2957 IMO_UNLOCK(imo); in imo_remref()
2961 IMO_PURGE_LOCKED(imo); in imo_remref()
2963 IMO_UNLOCK(imo); in imo_remref()
2965 kfree_type_counted_by(struct in_multi *, imo->imo_max_memberships, imo->imo_membership); in imo_remref()
2966 kfree_type_counted_by(struct in_mfilter, imo->imo_max_filters, imo->imo_mfilters); in imo_remref()
2968 lck_mtx_destroy(&imo->imo_lock, &ifa_mtx_grp); in imo_remref()
2970 if (!(imo->imo_debug & IFD_ALLOC)) { in imo_remref()
2971 panic("%s: imo %p cannot be freed", __func__, imo); in imo_remref()
2974 zfree(imo_zone, imo); in imo_remref()
2978 imo_trace(struct ip_moptions *imo, int refhold) in imo_trace() argument
2980 struct ip_moptions_dbg *imo_dbg = (struct ip_moptions_dbg *)imo; in imo_trace()
2985 if (!(imo->imo_debug & IFD_DEBUG)) { in imo_trace()
2986 panic("%s: imo %p has no debug structure", __func__, imo); in imo_trace()
3004 struct ip_moptions *imo; in ip_allocmoptions() local
3006 imo = zalloc_flags(imo_zone, how | Z_ZERO); in ip_allocmoptions()
3007 if (imo != NULL) { in ip_allocmoptions()
3008 lck_mtx_init(&imo->imo_lock, &ifa_mtx_grp, &ifa_mtx_attr); in ip_allocmoptions()
3009 imo->imo_debug |= IFD_ALLOC; in ip_allocmoptions()
3011 imo->imo_debug |= IFD_DEBUG; in ip_allocmoptions()
3012 imo->imo_trace = imo_trace; in ip_allocmoptions()
3014 IMO_ADDREF(imo); in ip_allocmoptions()
3017 return imo; in ip_allocmoptions()