Lines Matching refs:imo
213 struct ip_moptions imo; /* ip_moptions */ member
272 struct ip_moptions *imo, struct ip_out_args *ipoa) in ip_output() argument
274 return ip_output_list(m0, 0, opt, ro, flags, imo, ipoa); in ip_output()
292 struct route *ro, int flags, struct ip_moptions *imo, in ip_output_list() argument
400 imo = NULL; in ip_output_list()
678 imo != NULL && (ifp = imo->imo_multicast_ifp) != NULL) { in ip_output_list()
923 if (imo != NULL) { in ip_output_list()
924 IMO_LOCK(imo); in ip_output_list()
925 vif = imo->imo_multicast_vif; in ip_output_list()
926 ttl = imo->imo_multicast_ttl; in ip_output_list()
927 loop = imo->imo_multicast_loop; in ip_output_list()
931 if (imo->imo_multicast_ifp != NULL) { in ip_output_list()
932 ifp = imo->imo_multicast_ifp; in ip_output_list()
934 IMO_UNLOCK(imo); in ip_output_list()
942 if (imo == NULL || vif == -1) { in ip_output_list()
978 if (inm != NULL && (imo == NULL || loop)) { in ip_output_list()
992 if (imo != NULL) { in ip_output_list()
2894 imo_addref(struct ip_moptions *imo, int locked) in imo_addref() argument
2897 IMO_LOCK(imo); in imo_addref()
2899 IMO_LOCK_ASSERT_HELD(imo); in imo_addref()
2902 if (++imo->imo_refcnt == 0) { in imo_addref()
2903 panic("%s: imo %p wraparound refcnt", __func__, imo); in imo_addref()
2905 } else if (imo->imo_trace != NULL) { in imo_addref()
2906 (*imo->imo_trace)(imo, TRUE); in imo_addref()
2910 IMO_UNLOCK(imo); in imo_addref()
2915 imo_remref(struct ip_moptions *imo) in imo_remref() argument
2917 IMO_LOCK(imo); in imo_remref()
2918 if (imo->imo_refcnt == 0) { in imo_remref()
2919 panic("%s: imo %p negative refcnt", __func__, imo); in imo_remref()
2921 } else if (imo->imo_trace != NULL) { in imo_remref()
2922 (*imo->imo_trace)(imo, FALSE); in imo_remref()
2925 --imo->imo_refcnt; in imo_remref()
2926 if (imo->imo_refcnt > 0) { in imo_remref()
2927 IMO_UNLOCK(imo); in imo_remref()
2931 IMO_PURGE_LOCKED(imo); in imo_remref()
2933 IMO_UNLOCK(imo); in imo_remref()
2935 kfree_type_counted_by(struct in_multi *, imo->imo_max_memberships, imo->imo_membership); in imo_remref()
2936 kfree_type_counted_by(struct in_mfilter, imo->imo_max_filters, imo->imo_mfilters); in imo_remref()
2938 lck_mtx_destroy(&imo->imo_lock, &ifa_mtx_grp); in imo_remref()
2940 if (!(imo->imo_debug & IFD_ALLOC)) { in imo_remref()
2941 panic("%s: imo %p cannot be freed", __func__, imo); in imo_remref()
2944 zfree(imo_zone, imo); in imo_remref()
2948 imo_trace(struct ip_moptions *imo, int refhold) in imo_trace() argument
2950 struct ip_moptions_dbg *imo_dbg = (struct ip_moptions_dbg *)imo; in imo_trace()
2955 if (!(imo->imo_debug & IFD_DEBUG)) { in imo_trace()
2956 panic("%s: imo %p has no debug structure", __func__, imo); in imo_trace()
2974 struct ip_moptions *imo; in ip_allocmoptions() local
2976 imo = zalloc_flags(imo_zone, how | Z_ZERO); in ip_allocmoptions()
2977 if (imo != NULL) { in ip_allocmoptions()
2978 lck_mtx_init(&imo->imo_lock, &ifa_mtx_grp, &ifa_mtx_attr); in ip_allocmoptions()
2979 imo->imo_debug |= IFD_ALLOC; in ip_allocmoptions()
2981 imo->imo_debug |= IFD_DEBUG; in ip_allocmoptions()
2982 imo->imo_trace = imo_trace; in ip_allocmoptions()
2984 IMO_ADDREF(imo); in ip_allocmoptions()
2987 return imo; in ip_allocmoptions()