Lines Matching refs:in6m

182 	struct in6_multi	in6m;			/* in6_multi */
488 * We already joined this group; return the in6m
3084 struct in6_multi *in6m;
3086 in6m = (how == M_WAITOK) ? zalloc(in6m_zone) :
3088 if (in6m != NULL) {
3089 bzero(in6m, in6m_size);
3090 lck_mtx_init(&in6m->in6m_lock, in6_multihead_lock_grp,
3092 in6m->in6m_debug |= IFD_ALLOC;
3094 in6m->in6m_debug |= IFD_DEBUG;
3095 in6m->in6m_trace = in6m_trace;
3098 return (in6m);
3102 in6_multi_free(struct in6_multi *in6m)
3104 IN6M_LOCK(in6m);
3105 if (in6m->in6m_debug & IFD_ATTACHED) {
3106 panic("%s: attached in6m=%p is being freed", __func__, in6m);
3108 } else if (in6m->in6m_ifma != NULL) {
3109 panic("%s: ifma not NULL for in6m=%p", __func__, in6m);
3111 } else if (!(in6m->in6m_debug & IFD_ALLOC)) {
3112 panic("%s: in6m %p cannot be freed", __func__, in6m);
3114 } else if (in6m->in6m_refcount != 0) {
3115 panic("%s: non-zero refcount in6m=%p", __func__, in6m);
3117 } else if (in6m->in6m_reqcnt != 0) {
3118 panic("%s: non-zero reqcnt in6m=%p", __func__, in6m);
3123 IF_DRAIN(&in6m->in6m_scq);
3125 in6m->in6m_debug &= ~IFD_ALLOC;
3126 if ((in6m->in6m_debug & (IFD_DEBUG | IFD_TRASHED)) ==
3129 TAILQ_REMOVE(&in6m_trash_head, (struct in6_multi_dbg *)in6m,
3132 in6m->in6m_debug &= ~IFD_TRASHED;
3134 IN6M_UNLOCK(in6m);
3136 lck_mtx_destroy(&in6m->in6m_lock, in6_multihead_lock_grp);
3137 zfree(in6m_zone, in6m);
3141 in6_multi_attach(struct in6_multi *in6m)
3144 IN6M_LOCK_ASSERT_HELD(in6m);
3146 if (in6m->in6m_debug & IFD_ATTACHED) {
3147 panic("%s: Attempt to attach an already attached in6m=%p",
3148 __func__, in6m);
3150 } else if (in6m->in6m_debug & IFD_TRASHED) {
3151 panic("%s: Attempt to reattach a detached in6m=%p",
3152 __func__, in6m);
3156 in6m->in6m_reqcnt++;
3157 VERIFY(in6m->in6m_reqcnt == 1);
3158 IN6M_ADDREF_LOCKED(in6m);
3159 in6m->in6m_debug |= IFD_ATTACHED;
3164 if ((in6m->in6m_debug & (IFD_DEBUG | IFD_TRASHED)) ==
3167 IN6M_CONVERT_LOCK(in6m);
3169 TAILQ_REMOVE(&in6m_trash_head, (struct in6_multi_dbg *)in6m,
3172 in6m->in6m_debug &= ~IFD_TRASHED;
3175 LIST_INSERT_HEAD(&in6_multihead, in6m, in6m_entry);
3179 in6_multi_detach(struct in6_multi *in6m)
3182 IN6M_LOCK_ASSERT_HELD(in6m);
3184 if (in6m->in6m_reqcnt == 0) {
3185 panic("%s: in6m=%p negative reqcnt", __func__, in6m);
3189 --in6m->in6m_reqcnt;
3190 if (in6m->in6m_reqcnt > 0)
3193 if (!(in6m->in6m_debug & IFD_ATTACHED)) {
3194 panic("%s: Attempt to detach an unattached record in6m=%p",
3195 __func__, in6m);
3197 } else if (in6m->in6m_debug & IFD_TRASHED) {
3198 panic("%s: in6m %p is already in trash list", __func__, in6m);
3205 in6m->in6m_debug &= ~IFD_ATTACHED;
3206 LIST_REMOVE(in6m, in6m_entry);
3208 if (in6m->in6m_debug & IFD_DEBUG) {
3210 IN6M_CONVERT_LOCK(in6m);
3213 (struct in6_multi_dbg *)in6m, in6m_trash_link);
3215 in6m->in6m_debug |= IFD_TRASHED;
3222 in6m_addref(struct in6_multi *in6m, int locked)
3225 IN6M_LOCK_SPIN(in6m);
3227 IN6M_LOCK_ASSERT_HELD(in6m);
3229 if (++in6m->in6m_refcount == 0) {
3230 panic("%s: in6m=%p wraparound refcnt", __func__, in6m);
3232 } else if (in6m->in6m_trace != NULL) {
3233 (*in6m->in6m_trace)(in6m, TRUE);
3236 IN6M_UNLOCK(in6m);
3240 in6m_remref(struct in6_multi *in6m, int locked)
3246 IN6M_LOCK_SPIN(in6m);
3248 IN6M_LOCK_ASSERT_HELD(in6m);
3250 if (in6m->in6m_refcount == 0 || (in6m->in6m_refcount == 1 && locked)) {
3251 panic("%s: in6m=%p negative refcnt", __func__, in6m);
3253 } else if (in6m->in6m_trace != NULL) {
3254 (*in6m->in6m_trace)(in6m, FALSE);
3257 --in6m->in6m_refcount;
3258 if (in6m->in6m_refcount > 0) {
3260 IN6M_UNLOCK(in6m);
3265 * Synchronization with in6_mc_get(). In the event the in6m has been
3268 * the only way to find this in6m is via ifma_protospec. To avoid
3269 * race conditions between the last in6m_remref() of that in6m and its
3272 * before acquiring in6_multihead lock. To prevent the in6m from being
3275 ++in6m->in6m_refcount;
3276 IN6M_UNLOCK(in6m);
3278 IN6M_LOCK_SPIN(in6m);
3279 --in6m->in6m_refcount;
3280 if (in6m->in6m_refcount > 0) {
3281 /* We've lost the race, so abort since in6m is still in use */
3282 IN6M_UNLOCK(in6m);
3286 IN6M_LOCK(in6m);
3289 in6m_purge(in6m);
3290 ifma = in6m->in6m_ifma;
3291 in6m->in6m_ifma = NULL;
3292 in6m->in6m_ifp = NULL;
3293 mli = in6m->in6m_mli;
3294 in6m->in6m_mli = NULL;
3295 IN6M_UNLOCK(in6m);
3301 in6_multi_free(in6m);
3311 in6m_trace(struct in6_multi *in6m, int refhold)
3313 struct in6_multi_dbg *in6m_dbg = (struct in6_multi_dbg *)in6m;
3318 if (!(in6m->in6m_debug & IFD_DEBUG)) {
3319 panic("%s: in6m %p has no debug structure", __func__, in6m);
3463 printf("%s: --- begin in6m %p ---\n", __func__, inm);
3488 printf("%s: --- end in6m %p ---\n", __func__, inm);