Lines Matching defs:imo

189 	struct ip_moptions	imo;			/* ip_moptions */
223 struct ip_moptions *imo, struct ip_out_args *ipoa)
225 return (ip_output_list(m0, 0, opt, ro, flags, imo, ipoa));
243 struct route *ro, int flags, struct ip_moptions *imo,
335 imo = NULL;
628 imo != NULL && (ifp = imo->imo_multicast_ifp) != NULL) {
860 if (imo != NULL) {
861 IMO_LOCK(imo);
862 vif = imo->imo_multicast_vif;
863 ttl = imo->imo_multicast_ttl;
864 loop = imo->imo_multicast_loop;
867 if (imo->imo_multicast_ifp != NULL)
868 ifp = imo->imo_multicast_ifp;
869 IMO_UNLOCK(imo);
882 if (imo == NULL || vif == -1) {
916 if (inm != NULL && (imo == NULL || loop)) {
926 if (imo != NULL) {
1002 imo = NULL;
1003 if (ip_mforward(ip, ifp, m, imo) != 0) {
2872 imo_addref(struct ip_moptions *imo, int locked)
2875 IMO_LOCK(imo);
2877 IMO_LOCK_ASSERT_HELD(imo);
2879 if (++imo->imo_refcnt == 0) {
2880 panic("%s: imo %p wraparound refcnt\n", __func__, imo);
2882 } else if (imo->imo_trace != NULL) {
2883 (*imo->imo_trace)(imo, TRUE);
2887 IMO_UNLOCK(imo);
2891 imo_remref(struct ip_moptions *imo)
2895 IMO_LOCK(imo);
2896 if (imo->imo_refcnt == 0) {
2897 panic("%s: imo %p negative refcnt", __func__, imo);
2899 } else if (imo->imo_trace != NULL) {
2900 (*imo->imo_trace)(imo, FALSE);
2903 --imo->imo_refcnt;
2904 if (imo->imo_refcnt > 0) {
2905 IMO_UNLOCK(imo);
2909 for (i = 0; i < imo->imo_num_memberships; ++i) {
2912 imf = imo->imo_mfilters ? &imo->imo_mfilters[i] : NULL;
2916 (void) in_leavegroup(imo->imo_membership[i], imf);
2921 INM_REMREF(imo->imo_membership[i]);
2922 imo->imo_membership[i] = NULL;
2924 imo->imo_num_memberships = 0;
2925 if (imo->imo_mfilters != NULL) {
2926 FREE(imo->imo_mfilters, M_INMFILTER);
2927 imo->imo_mfilters = NULL;
2929 if (imo->imo_membership != NULL) {
2930 FREE(imo->imo_membership, M_IPMOPTS);
2931 imo->imo_membership = NULL;
2933 IMO_UNLOCK(imo);
2935 lck_mtx_destroy(&imo->imo_lock, ifa_mtx_grp);
2937 if (!(imo->imo_debug & IFD_ALLOC)) {
2938 panic("%s: imo %p cannot be freed", __func__, imo);
2941 zfree(imo_zone, imo);
2945 imo_trace(struct ip_moptions *imo, int refhold)
2947 struct ip_moptions_dbg *imo_dbg = (struct ip_moptions_dbg *)imo;
2952 if (!(imo->imo_debug & IFD_DEBUG)) {
2953 panic("%s: imo %p has no debug structure", __func__, imo);
2971 struct ip_moptions *imo;
2973 imo = (how == M_WAITOK) ? zalloc(imo_zone) : zalloc_noblock(imo_zone);
2974 if (imo != NULL) {
2975 bzero(imo, imo_size);
2976 lck_mtx_init(&imo->imo_lock, ifa_mtx_grp, ifa_mtx_attr);
2977 imo->imo_debug |= IFD_ALLOC;
2979 imo->imo_debug |= IFD_DEBUG;
2980 imo->imo_trace = imo_trace;
2982 IMO_ADDREF(imo);
2985 return (imo);