Lines Matching refs:mcast
62 static void ipoib_mcast_free(struct ipoib_mcast *mcast) in ipoib_mcast_free() argument
64 if_t dev = mcast->priv->dev; in ipoib_mcast_free()
67 ipoib_dbg_mcast(mcast->priv, "deleting multicast group %16D\n", in ipoib_mcast_free()
68 mcast->mcmember.mgid.raw, ":"); in ipoib_mcast_free()
70 if (mcast->ah) in ipoib_mcast_free()
71 ipoib_put_ah(mcast->ah); in ipoib_mcast_free()
73 tx_dropped = mcast->pkt_queue.ifq_len; in ipoib_mcast_free()
74 _IF_DRAIN(&mcast->pkt_queue); /* XXX Locking. */ in ipoib_mcast_free()
78 kfree(mcast); in ipoib_mcast_free()
84 struct ipoib_mcast *mcast; in ipoib_mcast_alloc() local
86 mcast = kzalloc(sizeof *mcast, can_sleep ? GFP_KERNEL : GFP_ATOMIC); in ipoib_mcast_alloc()
87 if (!mcast) in ipoib_mcast_alloc()
90 mcast->priv = priv; in ipoib_mcast_alloc()
91 mcast->created = jiffies; in ipoib_mcast_alloc()
92 mcast->backoff = 1; in ipoib_mcast_alloc()
94 INIT_LIST_HEAD(&mcast->list); in ipoib_mcast_alloc()
95 bzero(&mcast->pkt_queue, sizeof(mcast->pkt_queue)); in ipoib_mcast_alloc()
97 return mcast; in ipoib_mcast_alloc()
106 struct ipoib_mcast *mcast; in __ipoib_mcast_find() local
109 mcast = rb_entry(n, struct ipoib_mcast, rb_node); in __ipoib_mcast_find()
111 ret = memcmp(mgid, mcast->mcmember.mgid.raw, in __ipoib_mcast_find()
118 return mcast; in __ipoib_mcast_find()
125 struct ipoib_mcast *mcast) in __ipoib_mcast_add() argument
136 ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw, in __ipoib_mcast_add()
146 rb_link_node(&mcast->rb_node, pn, n); in __ipoib_mcast_add()
147 rb_insert_color(&mcast->rb_node, &priv->multicast_tree); in __ipoib_mcast_add()
152 static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, in ipoib_mcast_join_finish() argument
155 struct ipoib_dev_priv *priv = mcast->priv; in ipoib_mcast_join_finish()
162 mcast->mcmember = *mcmember; in ipoib_mcast_join_finish()
165 if (!memcmp(mcast->mcmember.mgid.raw, if_getbroadcastaddr(dev) + 4, in ipoib_mcast_join_finish()
178 if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_mcast_join_finish()
179 if (test_and_set_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { in ipoib_mcast_join_finish()
181 mcast->mcmember.mgid.raw, ":"); in ipoib_mcast_join_finish()
186 ret = ipoib_mcast_attach(priv, be16_to_cpu(mcast->mcmember.mlid), in ipoib_mcast_join_finish()
187 &mcast->mcmember.mgid, set_qkey); in ipoib_mcast_join_finish()
190 mcast->mcmember.mgid.raw, ":"); in ipoib_mcast_join_finish()
192 clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags); in ipoib_mcast_join_finish()
199 .dlid = be16_to_cpu(mcast->mcmember.mlid), in ipoib_mcast_join_finish()
201 .sl = mcast->mcmember.sl, in ipoib_mcast_join_finish()
203 .static_rate = mcast->mcmember.rate, in ipoib_mcast_join_finish()
205 .flow_label = be32_to_cpu(mcast->mcmember.flow_label), in ipoib_mcast_join_finish()
206 .hop_limit = mcast->mcmember.hop_limit, in ipoib_mcast_join_finish()
208 .traffic_class = mcast->mcmember.traffic_class in ipoib_mcast_join_finish()
211 av.grh.dgid = mcast->mcmember.mgid; in ipoib_mcast_join_finish()
218 mcast->ah = ah; in ipoib_mcast_join_finish()
222 mcast->mcmember.mgid.raw, ":", in ipoib_mcast_join_finish()
223 mcast->ah->ah, in ipoib_mcast_join_finish()
224 be16_to_cpu(mcast->mcmember.mlid), in ipoib_mcast_join_finish()
225 mcast->mcmember.sl); in ipoib_mcast_join_finish()
232 while (mcast->pkt_queue.ifq_len) { in ipoib_mcast_join_finish()
234 _IF_DEQUEUE(&mcast->pkt_queue, mb); in ipoib_mcast_join_finish()
249 struct ipoib_mcast *mcast = multicast->context; in ipoib_mcast_sendonly_join_complete() local
250 struct ipoib_dev_priv *priv = mcast->priv; in ipoib_mcast_sendonly_join_complete()
257 status = ipoib_mcast_join_finish(mcast, &multicast->rec); in ipoib_mcast_sendonly_join_complete()
260 if (mcast->logcount++ < 20) in ipoib_mcast_sendonly_join_complete()
262 mcast->mcmember.mgid.raw, ":", status); in ipoib_mcast_sendonly_join_complete()
265 if_inc_counter(priv->dev, IFCOUNTER_OERRORS, mcast->pkt_queue.ifq_len); in ipoib_mcast_sendonly_join_complete()
266 _IF_DRAIN(&mcast->pkt_queue); in ipoib_mcast_sendonly_join_complete()
270 &mcast->flags); in ipoib_mcast_sendonly_join_complete()
275 static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast) in ipoib_mcast_sendonly_join() argument
277 struct ipoib_dev_priv *priv = mcast->priv; in ipoib_mcast_sendonly_join()
292 if (test_and_set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { in ipoib_mcast_sendonly_join()
297 rec.mgid = mcast->mcmember.mgid; in ipoib_mcast_sendonly_join()
301 mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, in ipoib_mcast_sendonly_join()
309 mcast); in ipoib_mcast_sendonly_join()
310 if (IS_ERR(mcast->mc)) { in ipoib_mcast_sendonly_join()
311 ret = PTR_ERR(mcast->mc); in ipoib_mcast_sendonly_join()
312 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_sendonly_join()
317 mcast->mcmember.mgid.raw, ":"); in ipoib_mcast_sendonly_join()
345 struct ipoib_mcast *mcast = multicast->context; in ipoib_mcast_join_complete() local
346 struct ipoib_dev_priv *priv = mcast->priv; in ipoib_mcast_join_complete()
349 mcast->mcmember.mgid.raw, ":", status); in ipoib_mcast_join_complete()
356 status = ipoib_mcast_join_finish(mcast, &multicast->rec); in ipoib_mcast_join_complete()
359 mcast->backoff = 1; in ipoib_mcast_join_complete()
370 if (mcast == priv->broadcast) in ipoib_mcast_join_complete()
376 if (mcast->logcount++ < 20) { in ipoib_mcast_join_complete()
379 mcast->mcmember.mgid.raw, ":", status); in ipoib_mcast_join_complete()
382 mcast->mcmember.mgid.raw, ":", status); in ipoib_mcast_join_complete()
386 mcast->backoff *= 2; in ipoib_mcast_join_complete()
387 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) in ipoib_mcast_join_complete()
388 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; in ipoib_mcast_join_complete()
391 status = test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join_complete()
397 mcast->backoff * HZ); in ipoib_mcast_join_complete()
405 struct ipoib_mcast *mcast, int create) in ipoib_mcast_join() argument
414 mcast->mcmember.mgid.raw, ":"); in ipoib_mcast_join()
416 rec.mgid = mcast->mcmember.mgid; in ipoib_mcast_join()
449 set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join()
450 mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, priv->port, in ipoib_mcast_join()
452 ipoib_mcast_join_complete, mcast); in ipoib_mcast_join()
453 if (IS_ERR(mcast->mc)) { in ipoib_mcast_join()
454 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join()
455 ret = PTR_ERR(mcast->mc); in ipoib_mcast_join()
458 mcast->backoff *= 2; in ipoib_mcast_join()
459 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) in ipoib_mcast_join()
460 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; in ipoib_mcast_join()
466 mcast->backoff * HZ); in ipoib_mcast_join()
539 struct ipoib_mcast *mcast = NULL; in ipoib_mcast_join_task() local
542 list_for_each_entry(mcast, &priv->multicast_list, list) { in ipoib_mcast_join_task()
543 if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) in ipoib_mcast_join_task()
544 && !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) in ipoib_mcast_join_task()
545 && !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { in ipoib_mcast_join_task()
552 if (&mcast->list == &priv->multicast_list) { in ipoib_mcast_join_task()
557 ipoib_mcast_join(priv, mcast, 1); in ipoib_mcast_join_task()
606 static int ipoib_mcast_leave(struct ipoib_dev_priv *priv, struct ipoib_mcast *mcast) in ipoib_mcast_leave() argument
610 if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) in ipoib_mcast_leave()
611 ib_sa_free_multicast(mcast->mc); in ipoib_mcast_leave()
613 if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { in ipoib_mcast_leave()
615 mcast->mcmember.mgid.raw, ":"); in ipoib_mcast_leave()
618 ret = ib_detach_mcast(priv->qp, &mcast->mcmember.mgid, in ipoib_mcast_leave()
619 be16_to_cpu(mcast->mcmember.mlid)); in ipoib_mcast_leave()
631 struct ipoib_mcast *mcast; in ipoib_mcast_send() local
641 mcast = __ipoib_mcast_find(priv, mgid); in ipoib_mcast_send()
642 if (!mcast) { in ipoib_mcast_send()
647 mcast = ipoib_mcast_alloc(priv, 0); in ipoib_mcast_send()
648 if (!mcast) { in ipoib_mcast_send()
656 set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags); in ipoib_mcast_send()
657 memcpy(mcast->mcmember.mgid.raw, mgid, sizeof (union ib_gid)); in ipoib_mcast_send()
658 __ipoib_mcast_add(priv, mcast); in ipoib_mcast_send()
659 list_add_tail(&mcast->list, &priv->multicast_list); in ipoib_mcast_send()
662 if (!mcast->ah) { in ipoib_mcast_send()
663 if (mcast->pkt_queue.ifq_len < IPOIB_MAX_MCAST_QUEUE) { in ipoib_mcast_send()
664 _IF_ENQUEUE(&mcast->pkt_queue, mb); in ipoib_mcast_send()
670 if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) in ipoib_mcast_send()
673 else if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) in ipoib_mcast_send()
674 ipoib_mcast_sendonly_join(mcast); in ipoib_mcast_send()
680 mcast = NULL; in ipoib_mcast_send()
684 if (mcast && mcast->ah) in ipoib_mcast_send()
685 ipoib_send(priv, mb, mcast->ah, IB_MULTICAST_QPN); in ipoib_mcast_send()
691 struct ipoib_mcast *mcast, *tmcast; in ipoib_mcast_dev_flush() local
698 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { in ipoib_mcast_dev_flush()
699 list_del(&mcast->list); in ipoib_mcast_dev_flush()
700 rb_erase(&mcast->rb_node, &priv->multicast_tree); in ipoib_mcast_dev_flush()
701 list_add_tail(&mcast->list, &remove_list); in ipoib_mcast_dev_flush()
712 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { in ipoib_mcast_dev_flush()
713 ipoib_mcast_leave(priv, mcast); in ipoib_mcast_dev_flush()
714 ipoib_mcast_free(mcast); in ipoib_mcast_dev_flush()
749 struct ipoib_mcast *mcast; in ipoib_process_maddr() local
763 mcast = __ipoib_mcast_find(priv, &mgid); in ipoib_process_maddr()
764 if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_process_maddr()
789 if (mcast) { in ipoib_process_maddr()
791 list_move_tail(&mcast->list, &ctx->remove_list); in ipoib_process_maddr()
793 rb_replace_node(&mcast->rb_node, in ipoib_process_maddr()
802 if (mcast) in ipoib_process_maddr()
803 set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); in ipoib_process_maddr()
813 struct ipoib_mcast *mcast, *tmcast; in ipoib_mcast_restart() local
829 list_for_each_entry(mcast, &priv->multicast_list, list) in ipoib_mcast_restart()
830 clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); in ipoib_mcast_restart()
837 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { in ipoib_mcast_restart()
838 if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) && in ipoib_mcast_restart()
839 !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_mcast_restart()
841 mcast->mcmember.mgid.raw, ":"); in ipoib_mcast_restart()
843 rb_erase(&mcast->rb_node, &priv->multicast_tree); in ipoib_mcast_restart()
846 list_move_tail(&mcast->list, &ctx.remove_list); in ipoib_mcast_restart()
853 list_for_each_entry_safe(mcast, tmcast, &ctx.remove_list, list) { in ipoib_mcast_restart()
854 ipoib_mcast_leave(mcast->priv, mcast); in ipoib_mcast_restart()
855 ipoib_mcast_free(mcast); in ipoib_mcast_restart()
887 struct ipoib_mcast *mcast; in ipoib_mcast_iter_next() local
895 mcast = rb_entry(n, struct ipoib_mcast, rb_node); in ipoib_mcast_iter_next()
897 if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw, in ipoib_mcast_iter_next()
899 iter->mgid = mcast->mcmember.mgid; in ipoib_mcast_iter_next()
900 iter->created = mcast->created; in ipoib_mcast_iter_next()
901 iter->queuelen = mcast->pkt_queue.ifq_len; in ipoib_mcast_iter_next()
902 iter->complete = !!mcast->ah; in ipoib_mcast_iter_next()
903 iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY)); in ipoib_mcast_iter_next()