Lines Matching defs:imo

193 	struct ip_moptions	imo;			/* ip_moptions */
227 struct ip_moptions *imo, struct ip_out_args *ipoa)
229 return (ip_output_list(m0, 0, opt, ro, flags, imo, ipoa));
247 struct route *ro, int flags, struct ip_moptions *imo,
355 imo = NULL;
650 imo != NULL && (ifp = imo->imo_multicast_ifp) != NULL) {
884 if (imo != NULL) {
885 IMO_LOCK(imo);
886 vif = imo->imo_multicast_vif;
887 ttl = imo->imo_multicast_ttl;
888 loop = imo->imo_multicast_loop;
891 if (imo->imo_multicast_ifp != NULL)
892 ifp = imo->imo_multicast_ifp;
893 IMO_UNLOCK(imo);
901 if (imo == NULL || vif == -1) {
935 if (inm != NULL && (imo == NULL || loop)) {
945 if (imo != NULL) {
2896 imo_addref(struct ip_moptions *imo, int locked)
2899 IMO_LOCK(imo);
2901 IMO_LOCK_ASSERT_HELD(imo);
2903 if (++imo->imo_refcnt == 0) {
2904 panic("%s: imo %p wraparound refcnt\n", __func__, imo);
2906 } else if (imo->imo_trace != NULL) {
2907 (*imo->imo_trace)(imo, TRUE);
2911 IMO_UNLOCK(imo);
2915 imo_remref(struct ip_moptions *imo)
2919 IMO_LOCK(imo);
2920 if (imo->imo_refcnt == 0) {
2921 panic("%s: imo %p negative refcnt", __func__, imo);
2923 } else if (imo->imo_trace != NULL) {
2924 (*imo->imo_trace)(imo, FALSE);
2927 --imo->imo_refcnt;
2928 if (imo->imo_refcnt > 0) {
2929 IMO_UNLOCK(imo);
2933 for (i = 0; i < imo->imo_num_memberships; ++i) {
2936 imf = imo->imo_mfilters ? &imo->imo_mfilters[i] : NULL;
2940 (void) in_leavegroup(imo->imo_membership[i], imf);
2945 INM_REMREF(imo->imo_membership[i]);
2946 imo->imo_membership[i] = NULL;
2948 imo->imo_num_memberships = 0;
2949 if (imo->imo_mfilters != NULL) {
2950 FREE(imo->imo_mfilters, M_INMFILTER);
2951 imo->imo_mfilters = NULL;
2953 if (imo->imo_membership != NULL) {
2954 FREE(imo->imo_membership, M_IPMOPTS);
2955 imo->imo_membership = NULL;
2957 IMO_UNLOCK(imo);
2959 lck_mtx_destroy(&imo->imo_lock, ifa_mtx_grp);
2961 if (!(imo->imo_debug & IFD_ALLOC)) {
2962 panic("%s: imo %p cannot be freed", __func__, imo);
2965 zfree(imo_zone, imo);
2969 imo_trace(struct ip_moptions *imo, int refhold)
2971 struct ip_moptions_dbg *imo_dbg = (struct ip_moptions_dbg *)imo;
2976 if (!(imo->imo_debug & IFD_DEBUG)) {
2977 panic("%s: imo %p has no debug structure", __func__, imo);
2995 struct ip_moptions *imo;
2997 imo = (how == M_WAITOK) ? zalloc(imo_zone) : zalloc_noblock(imo_zone);
2998 if (imo != NULL) {
2999 bzero(imo, imo_size);
3000 lck_mtx_init(&imo->imo_lock, ifa_mtx_grp, ifa_mtx_attr);
3001 imo->imo_debug |= IFD_ALLOC;
3003 imo->imo_debug |= IFD_DEBUG;
3004 imo->imo_trace = imo_trace;
3006 IMO_ADDREF(imo);
3009 return (imo);