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 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()
397 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) && in ipoib_mcast_join_complete()
400 if (mcast->logcount < 20) { in ipoib_mcast_join_complete()
404 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ? "sendonly " : "", in ipoib_mcast_join_complete()
405 mcast->mcmember.mgid.raw, status); in ipoib_mcast_join_complete()
408 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ? "sendonly " : "", in ipoib_mcast_join_complete()
409 mcast->mcmember.mgid.raw, status); in ipoib_mcast_join_complete()
413 mcast->logcount++; in ipoib_mcast_join_complete()
416 if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) && in ipoib_mcast_join_complete()
417 mcast->backoff >= 2) { in ipoib_mcast_join_complete()
427 mcast->backoff = 1; in ipoib_mcast_join_complete()
429 while (!skb_queue_empty(&mcast->pkt_queue)) { in ipoib_mcast_join_complete()
431 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue)); in ipoib_mcast_join_complete()
437 __ipoib_mcast_schedule_join_thread(priv, mcast, 1); in ipoib_mcast_join_complete()
449 mcast->mc = NULL; in ipoib_mcast_join_complete()
451 mcast->mc = multicast; in ipoib_mcast_join_complete()
452 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join_complete()
454 complete(&mcast->done); in ipoib_mcast_join_complete()
462 static int ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast) in ipoib_mcast_join() argument
476 ipoib_dbg_mcast(priv, "joining MGID %pI6\n", mcast->mcmember.mgid.raw); in ipoib_mcast_join()
478 rec.mgid = mcast->mcmember.mgid; in ipoib_mcast_join()
488 if (mcast != priv->broadcast) { in ipoib_mcast_join()
531 if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) in ipoib_mcast_join()
539 ipoib_mcast_join_complete, mcast); in ipoib_mcast_join()
545 __ipoib_mcast_schedule_join_thread(priv, mcast, 1); in ipoib_mcast_join()
546 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join()
548 complete(&mcast->done); in ipoib_mcast_join()
561 struct ipoib_mcast *mcast = NULL; in ipoib_mcast_join_task() local
609 mcast = priv->broadcast; in ipoib_mcast_join_task()
610 if (mcast->backoff > 1 && in ipoib_mcast_join_task()
611 time_before(jiffies, mcast->delay_until)) { in ipoib_mcast_join_task()
612 delay_until = mcast->delay_until; in ipoib_mcast_join_task()
613 mcast = NULL; in ipoib_mcast_join_task()
623 list_for_each_entry(mcast, &priv->multicast_list, list) { in ipoib_mcast_join_task()
624 if (IS_ERR_OR_NULL(mcast->mc) && in ipoib_mcast_join_task()
625 !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) && in ipoib_mcast_join_task()
626 (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) || in ipoib_mcast_join_task()
627 !skb_queue_empty(&mcast->pkt_queue))) { in ipoib_mcast_join_task()
628 if (mcast->backoff == 1 || in ipoib_mcast_join_task()
629 time_after_eq(jiffies, mcast->delay_until)) { in ipoib_mcast_join_task()
631 init_completion(&mcast->done); in ipoib_mcast_join_task()
632 set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join_task()
633 if (ipoib_mcast_join(dev, mcast)) { in ipoib_mcast_join_task()
638 time_before(mcast->delay_until, delay_until)) in ipoib_mcast_join_task()
639 delay_until = mcast->delay_until; in ipoib_mcast_join_task()
643 mcast = NULL; in ipoib_mcast_join_task()
652 if (mcast) { in ipoib_mcast_join_task()
653 init_completion(&mcast->done); in ipoib_mcast_join_task()
654 set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags); in ipoib_mcast_join_task()
655 ipoib_mcast_join(dev, mcast); in ipoib_mcast_join_task()
690 int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast) in ipoib_mcast_leave() argument
695 if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) in ipoib_mcast_leave()
698 if (!IS_ERR_OR_NULL(mcast->mc)) in ipoib_mcast_leave()
699 ib_sa_free_multicast(mcast->mc); in ipoib_mcast_leave()
701 if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) { in ipoib_mcast_leave()
703 mcast->mcmember.mgid.raw); in ipoib_mcast_leave()
706 ret = ib_detach_mcast(priv->qp, &mcast->mcmember.mgid, in ipoib_mcast_leave()
707 be16_to_cpu(mcast->mcmember.mlid)); in ipoib_mcast_leave()
710 } else if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) in ipoib_mcast_leave()
720 struct ipoib_mcast *mcast; in ipoib_mcast_send() local
734 mcast = __ipoib_mcast_find(dev, mgid); in ipoib_mcast_send()
735 if (!mcast || !mcast->ah) { in ipoib_mcast_send()
736 if (!mcast) { in ipoib_mcast_send()
741 mcast = ipoib_mcast_alloc(dev, 0); in ipoib_mcast_send()
742 if (!mcast) { in ipoib_mcast_send()
750 set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags); in ipoib_mcast_send()
751 memcpy(mcast->mcmember.mgid.raw, mgid, in ipoib_mcast_send()
753 __ipoib_mcast_add(dev, mcast); in ipoib_mcast_send()
754 list_add_tail(&mcast->list, &priv->multicast_list); in ipoib_mcast_send()
756 if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE) in ipoib_mcast_send()
757 skb_queue_tail(&mcast->pkt_queue, skb); in ipoib_mcast_send()
762 if (!test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) { in ipoib_mcast_send()
774 kref_get(&mcast->ah->ref); in ipoib_mcast_send()
775 neigh->ah = mcast->ah; in ipoib_mcast_send()
776 list_add_tail(&neigh->list, &mcast->neigh_list); in ipoib_mcast_send()
780 ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN); in ipoib_mcast_send()
794 struct ipoib_mcast *mcast, *tmcast; in ipoib_mcast_dev_flush() local
801 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { in ipoib_mcast_dev_flush()
802 list_del(&mcast->list); in ipoib_mcast_dev_flush()
803 rb_erase(&mcast->rb_node, &priv->multicast_tree); in ipoib_mcast_dev_flush()
804 list_add_tail(&mcast->list, &remove_list); in ipoib_mcast_dev_flush()
819 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) in ipoib_mcast_dev_flush()
820 if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) in ipoib_mcast_dev_flush()
821 wait_for_completion(&mcast->done); in ipoib_mcast_dev_flush()
823 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { in ipoib_mcast_dev_flush()
824 ipoib_mcast_leave(dev, mcast); in ipoib_mcast_dev_flush()
825 ipoib_mcast_free(mcast); in ipoib_mcast_dev_flush()
846 struct ipoib_mcast *mcast, *tmcast; in ipoib_mcast_restart_task() local
871 list_for_each_entry(mcast, &priv->multicast_list, list) in ipoib_mcast_restart_task()
872 clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); in ipoib_mcast_restart_task()
883 mcast = __ipoib_mcast_find(dev, &mgid); in ipoib_mcast_restart_task()
884 if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_mcast_restart_task()
909 if (mcast) { in ipoib_mcast_restart_task()
911 list_move_tail(&mcast->list, &remove_list); in ipoib_mcast_restart_task()
913 rb_replace_node(&mcast->rb_node, in ipoib_mcast_restart_task()
922 if (mcast) in ipoib_mcast_restart_task()
923 set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags); in ipoib_mcast_restart_task()
927 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) { in ipoib_mcast_restart_task()
928 if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) && in ipoib_mcast_restart_task()
929 !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) { in ipoib_mcast_restart_task()
931 mcast->mcmember.mgid.raw); in ipoib_mcast_restart_task()
933 rb_erase(&mcast->rb_node, &priv->multicast_tree); in ipoib_mcast_restart_task()
936 list_move_tail(&mcast->list, &remove_list); in ipoib_mcast_restart_task()
948 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) in ipoib_mcast_restart_task()
949 if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) in ipoib_mcast_restart_task()
950 wait_for_completion(&mcast->done); in ipoib_mcast_restart_task()
952 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { in ipoib_mcast_restart_task()
953 ipoib_mcast_leave(mcast->dev, mcast); in ipoib_mcast_restart_task()
954 ipoib_mcast_free(mcast); in ipoib_mcast_restart_task()
992 struct ipoib_mcast *mcast; in ipoib_mcast_iter_next() local
1000 mcast = rb_entry(n, struct ipoib_mcast, rb_node); in ipoib_mcast_iter_next()
1002 if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw, in ipoib_mcast_iter_next()
1004 iter->mgid = mcast->mcmember.mgid; in ipoib_mcast_iter_next()
1005 iter->created = mcast->created; in ipoib_mcast_iter_next()
1006 iter->queuelen = skb_queue_len(&mcast->pkt_queue); in ipoib_mcast_iter_next()
1007 iter->complete = !!mcast->ah; in ipoib_mcast_iter_next()
1008 iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY)); in ipoib_mcast_iter_next()