Lines Matching defs:mcast
74 struct ipoib_mcast *mcast,
85 if (mcast && delay) {
89 mcast->backoff *= 2;
90 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS)
91 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS;
92 mcast->delay_until = jiffies + (mcast->backoff * HZ);
94 * Mark this mcast for its delay, but restart the
112 static void ipoib_mcast_free(struct ipoib_mcast *mcast)
114 struct net_device *dev = mcast->dev;
118 mcast->mcmember.mgid.raw);
120 /* remove all neigh connected to this mcast */
121 ipoib_del_neighs_by_gid(dev, mcast->mcmember.mgid.raw);
123 if (mcast->ah)
124 ipoib_put_ah(mcast->ah);
126 while (!skb_queue_empty(&mcast->pkt_queue)) {
128 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
135 kfree(mcast);
140 struct ipoib_mcast *mcast;
142 mcast = kzalloc(sizeof(*mcast), GFP_ATOMIC);
143 if (!mcast)
146 mcast->dev = dev;
147 mcast->created = jiffies;
148 mcast->delay_until = jiffies;
149 mcast->backoff = 1;
151 INIT_LIST_HEAD(&mcast->list);
152 INIT_LIST_HEAD(&mcast->neigh_list);
153 skb_queue_head_init(&mcast->pkt_queue);
155 return mcast;
164 struct ipoib_mcast *mcast;
167 mcast = rb_entry(n, struct ipoib_mcast, rb_node);
169 ret = memcmp(mgid, mcast->mcmember.mgid.raw,
176 return mcast;
182 static int __ipoib_mcast_add(struct net_device *dev, struct ipoib_mcast *mcast)
194 ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw,
204 rb_link_node(&mcast->rb_node, pn, n);
205 rb_insert_color(&mcast->rb_node, &priv->multicast_tree);
210 static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
213 struct net_device *dev = mcast->dev;
222 mcast->mcmember = *mcmember;
227 if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4,
234 /*update priv member according to the new mcast*/
242 /* assume if the admin and the mcast are the same both can be changed */
256 if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
257 if (test_and_set_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
259 mcast->mcmember.mgid.raw);
264 ret = rn->attach_mcast(dev, priv->ca, &mcast->mcmember.mgid,
265 be16_to_cpu(mcast->mcmember.mlid),
269 mcast->mcmember.mgid.raw);
271 clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags);
278 rdma_ah_set_dlid(&av, be16_to_cpu(mcast->mcmember.mlid)),
280 rdma_ah_set_sl(&av, mcast->mcmember.sl);
281 rdma_ah_set_static_rate(&av, mcast->mcmember.rate);
283 rdma_ah_set_grh(&av, &mcast->mcmember.mgid,
284 be32_to_cpu(mcast->mcmember.flow_label),
285 0, mcast->mcmember.hop_limit,
286 mcast->mcmember.traffic_class);
296 mcast->ah = ah;
300 mcast->mcmember.mgid.raw,
301 mcast->ah->ah,
302 be16_to_cpu(mcast->mcmember.mlid),
303 mcast->mcmember.sl);
307 while (!skb_queue_empty(&mcast->pkt_queue)) {
308 struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue);
369 struct ipoib_mcast *mcast = multicast->context;
370 struct net_device *dev = mcast->dev;
374 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ?
376 mcast->mcmember.mgid.raw, status);
385 status = ipoib_mcast_join_finish(mcast, &multicast->rec);
388 mcast->backoff = 1;
389 mcast->delay_until = jiffies;
398 if (mcast == priv->broadcast) {
406 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) &&
409 if (mcast->logcount < 20) {
413 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ? "sendonly " : "",
414 mcast->mcmember.mgid.raw, status);
417 test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ? "sendonly " : "",
418 mcast->mcmember.mgid.raw, status);
422 mcast->logcount++;
425 if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) &&
426 mcast->backoff >= 2) {
431 * mcast list as an unjoined group. If we want to
436 mcast->backoff = 1;
438 while (!skb_queue_empty(&mcast->pkt_queue)) {
440 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
446 __ipoib_mcast_schedule_join_thread(priv, mcast, 1);
454 * Make sure to set mcast->mc before we clear the busy flag to avoid
455 * racing with code that checks for BUSY before checking mcast->mc
458 mcast->mc = NULL;
460 mcast->mc = multicast;
461 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
463 complete(&mcast->done);
471 static int ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast)
485 init_completion(&mcast->done);
486 set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
488 ipoib_dbg_mcast(priv, "joining MGID %pI6\n", mcast->mcmember.mgid.raw);
490 rec.mgid = mcast->mcmember.mgid;
500 if (mcast != priv->broadcast) {
540 if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) &&
548 ipoib_mcast_join_complete, mcast);
553 __ipoib_mcast_schedule_join_thread(priv, mcast, 1);
554 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
555 complete(&mcast->done);
568 struct ipoib_mcast *mcast = NULL;
621 mcast = priv->broadcast;
622 if (mcast->backoff > 1 &&
623 time_before(jiffies, mcast->delay_until)) {
624 delay_until = mcast->delay_until;
625 mcast = NULL;
635 list_for_each_entry(mcast, &priv->multicast_list, list) {
636 if (IS_ERR_OR_NULL(mcast->mc) &&
637 !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags) &&
638 (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags) ||
639 !skb_queue_empty(&mcast->pkt_queue))) {
640 if (mcast->backoff == 1 ||
641 time_after_eq(jiffies, mcast->delay_until)) {
643 if (ipoib_mcast_join(dev, mcast)) {
648 time_before(mcast->delay_until, delay_until))
649 delay_until = mcast->delay_until;
653 mcast = NULL;
662 if (mcast)
663 ipoib_mcast_join(dev, mcast);
689 static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast)
695 if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
698 if (!IS_ERR_OR_NULL(mcast->mc))
699 ib_sa_free_multicast(mcast->mc);
701 if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
703 mcast->mcmember.mgid.raw);
706 ret = rn->detach_mcast(dev, priv->ca, &mcast->mcmember.mgid,
707 be16_to_cpu(mcast->mcmember.mlid));
710 } else if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
726 struct ipoib_mcast *mcast = __ipoib_mcast_find(priv->dev, mgid);
728 if (mcast && test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
729 list_del(&mcast->list);
730 rb_erase(&mcast->rb_node, &priv->multicast_tree);
731 list_add_tail(&mcast->list, remove_list);
738 struct ipoib_mcast *mcast, *tmcast;
744 list_for_each_entry_safe(mcast, tmcast, remove_list, list)
745 if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
746 wait_for_completion(&mcast->done);
748 list_for_each_entry_safe(mcast, tmcast, remove_list, list) {
749 ipoib_mcast_leave(mcast->dev, mcast);
750 ipoib_mcast_free(mcast);
758 struct ipoib_mcast *mcast;
772 mcast = __ipoib_mcast_find(dev, mgid);
773 if (!mcast || !mcast->ah) {
774 if (!mcast) {
779 mcast = ipoib_mcast_alloc(dev);
780 if (!mcast) {
788 set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags);
789 memcpy(mcast->mcmember.mgid.raw, mgid,
791 __ipoib_mcast_add(dev, mcast);
792 list_add_tail(&mcast->list, &priv->multicast_list);
794 if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE) {
797 skb_queue_tail(&mcast->pkt_queue, skb);
802 if (!test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) {
814 * once to mcast list.
817 kref_get(&mcast->ah->ref);
818 neigh->ah = mcast->ah;
820 list_add_tail(&neigh->list, &mcast->neigh_list);
824 mcast->ah->last_send = rn->send(dev, skb, mcast->ah->ah,
839 struct ipoib_mcast *mcast, *tmcast;
847 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) {
848 list_del(&mcast->list);
849 rb_erase(&mcast->rb_node, &priv->multicast_tree);
850 list_add_tail(&mcast->list, &remove_list);
882 struct ipoib_mcast *mcast, *tmcast;
905 list_for_each_entry(mcast, &priv->multicast_list, list)
906 clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
917 mcast = __ipoib_mcast_find(dev, &mgid);
918 if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
943 if (mcast) {
945 list_move_tail(&mcast->list, &remove_list);
947 rb_replace_node(&mcast->rb_node,
956 if (mcast)
957 set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
961 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) {
962 if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) &&
963 !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
965 mcast->mcmember.mgid.raw);
967 rb_erase(&mcast->rb_node, &priv->multicast_tree);
970 list_move_tail(&mcast->list, &remove_list);
1014 struct ipoib_mcast *mcast;
1022 mcast = rb_entry(n, struct ipoib_mcast, rb_node);
1024 if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw,
1026 iter->mgid = mcast->mcmember.mgid;
1027 iter->created = mcast->created;
1028 iter->queuelen = skb_queue_len(&mcast->pkt_queue);
1029 iter->complete = !!mcast->ah;
1030 iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY));