Lines Matching refs:imo

191 	struct ip_moptions	imo;			/* ip_moptions */
229 struct ip_moptions *imo,
233 error = ip_output_list(m0, 0, opt, ro, flags, imo, ipoa);
265 struct ip_moptions *imo,
336 imo = NULL;
602 imo != NULL && (ifp = imo->imo_multicast_ifp) != NULL) {
792 if (imo != NULL) {
793 IMO_LOCK(imo);
794 vif = imo->imo_multicast_vif;
795 ttl = imo->imo_multicast_ttl;
796 loop = imo->imo_multicast_loop;
799 if (imo->imo_multicast_ifp != NULL)
800 ifp = imo->imo_multicast_ifp;
801 IMO_UNLOCK(imo);
814 if (imo == NULL || vif == -1) {
847 if (inm != NULL && (imo == NULL || loop)) {
857 if (imo != NULL) {
928 imo = NULL;
929 if (ip_mforward(ip, ifp, m, imo) != 0) {
2865 imo_addref(struct ip_moptions *imo, int locked)
2868 IMO_LOCK(imo);
2870 IMO_LOCK_ASSERT_HELD(imo);
2872 if (++imo->imo_refcnt == 0) {
2873 panic("%s: imo %p wraparound refcnt\n", __func__, imo);
2875 } else if (imo->imo_trace != NULL) {
2876 (*imo->imo_trace)(imo, TRUE);
2880 IMO_UNLOCK(imo);
2884 imo_remref(struct ip_moptions *imo)
2888 IMO_LOCK(imo);
2889 if (imo->imo_refcnt == 0) {
2890 panic("%s: imo %p negative refcnt", __func__, imo);
2892 } else if (imo->imo_trace != NULL) {
2893 (*imo->imo_trace)(imo, FALSE);
2896 --imo->imo_refcnt;
2897 if (imo->imo_refcnt > 0) {
2898 IMO_UNLOCK(imo);
2902 for (i = 0; i < imo->imo_num_memberships; ++i) {
2905 imf = imo->imo_mfilters ? &imo->imo_mfilters[i] : NULL;
2909 (void) in_leavegroup(imo->imo_membership[i], imf);
2914 INM_REMREF(imo->imo_membership[i]);
2915 imo->imo_membership[i] = NULL;
2917 imo->imo_num_memberships = 0;
2918 if (imo->imo_mfilters != NULL) {
2919 FREE(imo->imo_mfilters, M_INMFILTER);
2920 imo->imo_mfilters = NULL;
2922 if (imo->imo_membership != NULL) {
2923 FREE(imo->imo_membership, M_IPMOPTS);
2924 imo->imo_membership = NULL;
2926 IMO_UNLOCK(imo);
2928 lck_mtx_destroy(&imo->imo_lock, ifa_mtx_grp);
2930 if (!(imo->imo_debug & IFD_ALLOC)) {
2931 panic("%s: imo %p cannot be freed", __func__, imo);
2934 zfree(imo_zone, imo);
2938 imo_trace(struct ip_moptions *imo, int refhold)
2940 struct ip_moptions_dbg *imo_dbg = (struct ip_moptions_dbg *)imo;
2945 if (!(imo->imo_debug & IFD_DEBUG)) {
2946 panic("%s: imo %p has no debug structure", __func__, imo);
2964 struct ip_moptions *imo;
2966 imo = (how == M_WAITOK) ? zalloc(imo_zone) : zalloc_noblock(imo_zone);
2967 if (imo != NULL) {
2968 bzero(imo, imo_size);
2969 lck_mtx_init(&imo->imo_lock, ifa_mtx_grp, ifa_mtx_attr);
2970 imo->imo_debug |= IFD_ALLOC;
2972 imo->imo_debug |= IFD_DEBUG;
2973 imo->imo_trace = imo_trace;
2975 IMO_ADDREF(imo);
2978 return (imo);