Lines Matching refs:mcast

71 					       struct ipoib_mcast *mcast,  in __ipoib_mcast_schedule_join_thread()  argument
82 if (mcast && delay) { in __ipoib_mcast_schedule_join_thread()
86 mcast->backoff *= 2; in __ipoib_mcast_schedule_join_thread()
87 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS) in __ipoib_mcast_schedule_join_thread()
88 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS; in __ipoib_mcast_schedule_join_thread()
89 mcast->delay_until = jiffies + (mcast->backoff * HZ); in __ipoib_mcast_schedule_join_thread()
109 static void ipoib_mcast_free(struct ipoib_mcast *mcast) in ipoib_mcast_free() argument
111 struct net_device *dev = mcast->dev; in ipoib_mcast_free()
115 mcast->mcmember.mgid.raw); in ipoib_mcast_free()
118 ipoib_del_neighs_by_gid(dev, mcast->mcmember.mgid.raw); in ipoib_mcast_free()
120 if (mcast->ah) in ipoib_mcast_free()
121 ipoib_put_ah(mcast->ah); in ipoib_mcast_free()
123 while (!skb_queue_empty(&mcast->pkt_queue)) { in ipoib_mcast_free()
125 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue)); in ipoib_mcast_free()
132 kfree(mcast); in ipoib_mcast_free()
138 struct ipoib_mcast *mcast; in ipoib_mcast_alloc() local
140 mcast = kzalloc(sizeof *mcast, can_sleep ? GFP_KERNEL : GFP_ATOMIC); in ipoib_mcast_alloc()
141 if (!mcast) in ipoib_mcast_alloc()
144 mcast->dev = dev; in ipoib_mcast_alloc()
145 mcast->created = jiffies; in ipoib_mcast_alloc()
146 mcast->delay_until = jiffies; in ipoib_mcast_alloc()
147 mcast->backoff = 1; in ipoib_mcast_alloc()
149 INIT_LIST_HEAD(&mcast->list); in ipoib_mcast_alloc()
150 INIT_LIST_HEAD(&mcast->neigh_list); in ipoib_mcast_alloc()
151 skb_queue_head_init(&mcast->pkt_queue); in ipoib_mcast_alloc()
153 return mcast; in ipoib_mcast_alloc()
162 struct ipoib_mcast *mcast; in __ipoib_mcast_find() local
165 mcast = rb_entry(n, struct ipoib_mcast, rb_node); in __ipoib_mcast_find()
167 ret = memcmp(mgid, mcast->mcmember.mgid.raw, in __ipoib_mcast_find()
174 return mcast; in __ipoib_mcast_find()
180 static int __ipoib_mcast_add(struct net_device *dev, struct ipoib_mcast *mcast) in __ipoib_mcast_add() argument
192 ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw, in __ipoib_mcast_add()
202 rb_link_node(&mcast->rb_node, pn, n); in __ipoib_mcast_add()
203 rb_insert_color(&mcast->rb_node, &priv->multicast_tree); in __ipoib_mcast_add()
208 static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, in ipoib_mcast_join_finish() argument
211 struct net_device *dev = mcast->dev; in ipoib_mcast_join_finish()
217 mcast->mcmember = *mcmember; in ipoib_mcast_join_finish()
222 if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4, in ipoib_mcast_join_finish()
252 if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_mcast_join_finish()
253 if (test_and_set_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { in ipoib_mcast_join_finish()
255 mcast->mcmember.mgid.raw); in ipoib_mcast_join_finish()
260 ret = ipoib_mcast_attach(dev, be16_to_cpu(mcast->mcmember.mlid), in ipoib_mcast_join_finish()
261 &mcast->mcmember.mgid, set_qkey); in ipoib_mcast_join_finish()
264 mcast->mcmember.mgid.raw); in ipoib_mcast_join_finish()
266 clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags); in ipoib_mcast_join_finish()
273 .dlid = be16_to_cpu(mcast->mcmember.mlid), in ipoib_mcast_join_finish()
275 .sl = mcast->mcmember.sl, in ipoib_mcast_join_finish()
277 .static_rate = mcast->mcmember.rate, in ipoib_mcast_join_finish()
279 .flow_label = be32_to_cpu(mcast->mcmember.flow_label), in ipoib_mcast_join_finish()
280 .hop_limit = mcast->mcmember.hop_limit, in ipoib_mcast_join_finish()
282 .traffic_class = mcast->mcmember.traffic_class in ipoib_mcast_join_finish()
285 av.grh.dgid = mcast->mcmember.mgid; in ipoib_mcast_join_finish()
295 mcast->ah = ah; in ipoib_mcast_join_finish()
299 mcast->mcmember.mgid.raw, in ipoib_mcast_join_finish()
300 mcast->ah->ah, in ipoib_mcast_join_finish()
301 be16_to_cpu(mcast->mcmember.mlid), in ipoib_mcast_join_finish()
302 mcast->mcmember.sl); in ipoib_mcast_join_finish()
308 while (!skb_queue_empty(&mcast->pkt_queue)) { in ipoib_mcast_join_finish()
309 struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue); in ipoib_mcast_join_finish()
360 struct ipoib_mcast *mcast = multicast->context; in ipoib_mcast_join_complete() local
361 struct net_device *dev = mcast->dev; in ipoib_mcast_join_complete()
365 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ? in ipoib_mcast_join_complete()
367 mcast->mcmember.mgid.raw, status); in ipoib_mcast_join_complete()
376 status = ipoib_mcast_join_finish(mcast, &multicast->rec); in ipoib_mcast_join_complete()
379 mcast->backoff = 1; in ipoib_mcast_join_complete()
380 mcast->delay_until = jiffies; in ipoib_mcast_join_complete()
389 if (mcast == priv->broadcast) { in ipoib_mcast_join_complete()
396 if (mcast->logcount++ < 20) { in ipoib_mcast_join_complete()
399 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ? "sendonly " : "", in ipoib_mcast_join_complete()
400 mcast->mcmember.mgid.raw, status); in ipoib_mcast_join_complete()
403 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ? "sendonly " : "", in ipoib_mcast_join_complete()
404 mcast->mcmember.mgid.raw, status); in ipoib_mcast_join_complete()
408 if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) && in ipoib_mcast_join_complete()
409 mcast->backoff >= 2) { in ipoib_mcast_join_complete()
419 mcast->backoff = 1; in ipoib_mcast_join_complete()
421 while (!skb_queue_empty(&mcast->pkt_queue)) { in ipoib_mcast_join_complete()
423 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue)); in ipoib_mcast_join_complete()
429 __ipoib_mcast_schedule_join_thread(priv, mcast, 1); in ipoib_mcast_join_complete()
441 mcast->mc = NULL; in ipoib_mcast_join_complete()
443 mcast->mc = multicast; in ipoib_mcast_join_complete()
444 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join_complete()
446 complete(&mcast->done); in ipoib_mcast_join_complete()
451 static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast, in ipoib_mcast_join() argument
462 ipoib_dbg_mcast(priv, "joining MGID %pI6\n", mcast->mcmember.mgid.raw); in ipoib_mcast_join()
464 rec.mgid = mcast->mcmember.mgid; in ipoib_mcast_join()
499 ipoib_mcast_join_complete, mcast); in ipoib_mcast_join()
505 __ipoib_mcast_schedule_join_thread(priv, mcast, 1); in ipoib_mcast_join()
506 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join()
508 complete(&mcast->done); in ipoib_mcast_join()
519 struct ipoib_mcast *mcast = NULL; in ipoib_mcast_join_task() local
568 mcast = priv->broadcast; in ipoib_mcast_join_task()
570 if (mcast->backoff > 1 && in ipoib_mcast_join_task()
571 time_before(jiffies, mcast->delay_until)) { in ipoib_mcast_join_task()
572 delay_until = mcast->delay_until; in ipoib_mcast_join_task()
573 mcast = NULL; in ipoib_mcast_join_task()
583 list_for_each_entry(mcast, &priv->multicast_list, list) { in ipoib_mcast_join_task()
584 if (IS_ERR_OR_NULL(mcast->mc) && in ipoib_mcast_join_task()
585 !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) && in ipoib_mcast_join_task()
586 (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) || in ipoib_mcast_join_task()
587 !skb_queue_empty(&mcast->pkt_queue))) { in ipoib_mcast_join_task()
588 if (mcast->backoff == 1 || in ipoib_mcast_join_task()
589 time_after_eq(jiffies, mcast->delay_until)) { in ipoib_mcast_join_task()
591 init_completion(&mcast->done); in ipoib_mcast_join_task()
592 set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join_task()
593 if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) in ipoib_mcast_join_task()
598 ipoib_mcast_join(dev, mcast, create); in ipoib_mcast_join_task()
601 time_before(mcast->delay_until, delay_until)) in ipoib_mcast_join_task()
602 delay_until = mcast->delay_until; in ipoib_mcast_join_task()
606 mcast = NULL; in ipoib_mcast_join_task()
615 if (mcast) { in ipoib_mcast_join_task()
616 init_completion(&mcast->done); in ipoib_mcast_join_task()
617 set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join_task()
620 if (mcast) in ipoib_mcast_join_task()
621 ipoib_mcast_join(dev, mcast, create); in ipoib_mcast_join_task()
654 static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) in ipoib_mcast_leave() argument
659 if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) in ipoib_mcast_leave()
662 if (!IS_ERR_OR_NULL(mcast->mc)) in ipoib_mcast_leave()
663 ib_sa_free_multicast(mcast->mc); in ipoib_mcast_leave()
665 if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { in ipoib_mcast_leave()
667 mcast->mcmember.mgid.raw); in ipoib_mcast_leave()
670 ret = ib_detach_mcast(priv->qp, &mcast->mcmember.mgid, in ipoib_mcast_leave()
671 be16_to_cpu(mcast->mcmember.mlid)); in ipoib_mcast_leave()
674 } else if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) in ipoib_mcast_leave()
684 struct ipoib_mcast *mcast; in ipoib_mcast_send() local
698 mcast = __ipoib_mcast_find(dev, mgid); in ipoib_mcast_send()
699 if (!mcast || !mcast->ah) { in ipoib_mcast_send()
700 if (!mcast) { in ipoib_mcast_send()
705 mcast = ipoib_mcast_alloc(dev, 0); in ipoib_mcast_send()
706 if (!mcast) { in ipoib_mcast_send()
714 set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags); in ipoib_mcast_send()
715 memcpy(mcast->mcmember.mgid.raw, mgid, in ipoib_mcast_send()
717 __ipoib_mcast_add(dev, mcast); in ipoib_mcast_send()
718 list_add_tail(&mcast->list, &priv->multicast_list); in ipoib_mcast_send()
720 if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE) in ipoib_mcast_send()
721 skb_queue_tail(&mcast->pkt_queue, skb); in ipoib_mcast_send()
726 if (!test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { in ipoib_mcast_send()
738 kref_get(&mcast->ah->ref); in ipoib_mcast_send()
739 neigh->ah = mcast->ah; in ipoib_mcast_send()
740 list_add_tail(&neigh->list, &mcast->neigh_list); in ipoib_mcast_send()
744 ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN); in ipoib_mcast_send()
758 struct ipoib_mcast *mcast, *tmcast; in ipoib_mcast_dev_flush() local
765 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { in ipoib_mcast_dev_flush()
766 list_del(&mcast->list); in ipoib_mcast_dev_flush()
767 rb_erase(&mcast->rb_node, &priv->multicast_tree); in ipoib_mcast_dev_flush()
768 list_add_tail(&mcast->list, &remove_list); in ipoib_mcast_dev_flush()
783 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) in ipoib_mcast_dev_flush()
784 if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) in ipoib_mcast_dev_flush()
785 wait_for_completion(&mcast->done); in ipoib_mcast_dev_flush()
787 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { in ipoib_mcast_dev_flush()
788 ipoib_mcast_leave(dev, mcast); in ipoib_mcast_dev_flush()
789 ipoib_mcast_free(mcast); in ipoib_mcast_dev_flush()
810 struct ipoib_mcast *mcast, *tmcast; in ipoib_mcast_restart_task() local
835 list_for_each_entry(mcast, &priv->multicast_list, list) in ipoib_mcast_restart_task()
836 clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); in ipoib_mcast_restart_task()
847 mcast = __ipoib_mcast_find(dev, &mgid); in ipoib_mcast_restart_task()
848 if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_mcast_restart_task()
873 if (mcast) { in ipoib_mcast_restart_task()
875 list_move_tail(&mcast->list, &remove_list); in ipoib_mcast_restart_task()
877 rb_replace_node(&mcast->rb_node, in ipoib_mcast_restart_task()
886 if (mcast) in ipoib_mcast_restart_task()
887 set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); in ipoib_mcast_restart_task()
891 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { in ipoib_mcast_restart_task()
892 if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) && in ipoib_mcast_restart_task()
893 !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_mcast_restart_task()
895 mcast->mcmember.mgid.raw); in ipoib_mcast_restart_task()
897 rb_erase(&mcast->rb_node, &priv->multicast_tree); in ipoib_mcast_restart_task()
900 list_move_tail(&mcast->list, &remove_list); in ipoib_mcast_restart_task()
912 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) in ipoib_mcast_restart_task()
913 if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) in ipoib_mcast_restart_task()
914 wait_for_completion(&mcast->done); in ipoib_mcast_restart_task()
916 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { in ipoib_mcast_restart_task()
917 ipoib_mcast_leave(mcast->dev, mcast); in ipoib_mcast_restart_task()
918 ipoib_mcast_free(mcast); in ipoib_mcast_restart_task()
956 struct ipoib_mcast *mcast; in ipoib_mcast_iter_next() local
964 mcast = rb_entry(n, struct ipoib_mcast, rb_node); in ipoib_mcast_iter_next()
966 if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw, in ipoib_mcast_iter_next()
968 iter->mgid = mcast->mcmember.mgid; in ipoib_mcast_iter_next()
969 iter->created = mcast->created; in ipoib_mcast_iter_next()
970 iter->queuelen = skb_queue_len(&mcast->pkt_queue); in ipoib_mcast_iter_next()
971 iter->complete = !!mcast->ah; in ipoib_mcast_iter_next()
972 iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY)); in ipoib_mcast_iter_next()