Lines Matching defs:mcast

62 static void ipoib_mcast_free(struct ipoib_mcast *mcast)
64 struct ifnet *dev = mcast->priv->dev;
67 ipoib_dbg_mcast(mcast->priv, "deleting multicast group %16D\n",
68 mcast->mcmember.mgid.raw, ":");
70 if (mcast->ah)
71 ipoib_put_ah(mcast->ah);
73 tx_dropped = mcast->pkt_queue.ifq_len;
74 _IF_DRAIN(&mcast->pkt_queue); /* XXX Locking. */
78 kfree(mcast);
84 struct ipoib_mcast *mcast;
86 mcast = kzalloc(sizeof *mcast, can_sleep ? GFP_KERNEL : GFP_ATOMIC);
87 if (!mcast)
90 mcast->priv = priv;
91 mcast->created = jiffies;
92 mcast->backoff = 1;
94 INIT_LIST_HEAD(&mcast->list);
95 bzero(&mcast->pkt_queue, sizeof(mcast->pkt_queue));
97 return mcast;
106 struct ipoib_mcast *mcast;
109 mcast = rb_entry(n, struct ipoib_mcast, rb_node);
111 ret = memcmp(mgid, mcast->mcmember.mgid.raw,
118 return mcast;
125 struct ipoib_mcast *mcast)
136 ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw,
146 rb_link_node(&mcast->rb_node, pn, n);
147 rb_insert_color(&mcast->rb_node, &priv->multicast_tree);
152 static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
155 struct ipoib_dev_priv *priv = mcast->priv;
161 mcast->mcmember = *mcmember;
164 if (!memcmp(mcast->mcmember.mgid.raw, dev->if_broadcastaddr + 4,
177 if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
178 if (test_and_set_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
180 mcast->mcmember.mgid.raw, ":");
185 ret = ipoib_mcast_attach(priv, be16_to_cpu(mcast->mcmember.mlid),
186 &mcast->mcmember.mgid, set_qkey);
189 mcast->mcmember.mgid.raw, ":");
191 clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags);
198 .dlid = be16_to_cpu(mcast->mcmember.mlid),
200 .sl = mcast->mcmember.sl,
202 .static_rate = mcast->mcmember.rate,
204 .flow_label = be32_to_cpu(mcast->mcmember.flow_label),
205 .hop_limit = mcast->mcmember.hop_limit,
207 .traffic_class = mcast->mcmember.traffic_class
210 av.grh.dgid = mcast->mcmember.mgid;
217 mcast->ah = ah;
221 mcast->mcmember.mgid.raw, ":",
222 mcast->ah->ah,
223 be16_to_cpu(mcast->mcmember.mlid),
224 mcast->mcmember.sl);
229 while (mcast->pkt_queue.ifq_len) {
231 _IF_DEQUEUE(&mcast->pkt_queue, mb);
245 struct ipoib_mcast *mcast = multicast->context;
246 struct ipoib_dev_priv *priv = mcast->priv;
253 status = ipoib_mcast_join_finish(mcast, &multicast->rec);
256 if (mcast->logcount++ < 20)
258 mcast->mcmember.mgid.raw, ":", status);
261 if_inc_counter(priv->dev, IFCOUNTER_OERRORS, mcast->pkt_queue.ifq_len);
262 _IF_DRAIN(&mcast->pkt_queue);
266 &mcast->flags);
271 static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast)
273 struct ipoib_dev_priv *priv = mcast->priv;
288 if (test_and_set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) {
293 rec.mgid = mcast->mcmember.mgid;
297 mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca,
305 mcast);
306 if (IS_ERR(mcast->mc)) {
307 ret = PTR_ERR(mcast->mc);
308 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
313 mcast->mcmember.mgid.raw, ":");
341 struct ipoib_mcast *mcast = multicast->context;
342 struct ipoib_dev_priv *priv = mcast->priv;
345 mcast->mcmember.mgid.raw, ":", status);
352 status = ipoib_mcast_join_finish(mcast, &multicast->rec);
355 mcast->backoff = 1;
366 if (mcast == priv->broadcast)
372 if (mcast->logcount++ < 20) {
375 mcast->mcmember.mgid.raw, ":", status);
378 mcast->mcmember.mgid.raw, ":", status);
382 mcast->backoff *= 2;
383 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS)
384 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS;
387 status = test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
393 mcast->backoff * HZ);
401 struct ipoib_mcast *mcast, int create)
410 mcast->mcmember.mgid.raw, ":");
412 rec.mgid = mcast->mcmember.mgid;
445 set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
446 mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, priv->port,
448 ipoib_mcast_join_complete, mcast);
449 if (IS_ERR(mcast->mc)) {
450 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
451 ret = PTR_ERR(mcast->mc);
454 mcast->backoff *= 2;
455 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS)
456 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS;
462 mcast->backoff * HZ);
535 struct ipoib_mcast *mcast = NULL;
538 list_for_each_entry(mcast, &priv->multicast_list, list) {
539 if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)
540 && !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)
541 && !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
548 if (&mcast->list == &priv->multicast_list) {
553 ipoib_mcast_join(priv, mcast, 1);
602 static int ipoib_mcast_leave(struct ipoib_dev_priv *priv, struct ipoib_mcast *mcast)
606 if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
607 ib_sa_free_multicast(mcast->mc);
609 if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
611 mcast->mcmember.mgid.raw, ":");
614 ret = ib_detach_mcast(priv->qp, &mcast->mcmember.mgid,
615 be16_to_cpu(mcast->mcmember.mlid));
627 struct ipoib_mcast *mcast;
637 mcast = __ipoib_mcast_find(priv, mgid);
638 if (!mcast) {
643 mcast = ipoib_mcast_alloc(priv, 0);
644 if (!mcast) {
652 set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags);
653 memcpy(mcast->mcmember.mgid.raw, mgid, sizeof (union ib_gid));
654 __ipoib_mcast_add(priv, mcast);
655 list_add_tail(&mcast->list, &priv->multicast_list);
658 if (!mcast->ah) {
659 if (mcast->pkt_queue.ifq_len < IPOIB_MAX_MCAST_QUEUE) {
660 _IF_ENQUEUE(&mcast->pkt_queue, mb);
666 if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
669 else if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
670 ipoib_mcast_sendonly_join(mcast);
676 mcast = NULL;
680 if (mcast && mcast->ah)
681 ipoib_send(priv, mb, mcast->ah, IB_MULTICAST_QPN);
687 struct ipoib_mcast *mcast, *tmcast;
694 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) {
695 list_del(&mcast->list);
696 rb_erase(&mcast->rb_node, &priv->multicast_tree);
697 list_add_tail(&mcast->list, &remove_list);
708 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) {
709 ipoib_mcast_leave(priv, mcast);
710 ipoib_mcast_free(mcast);
739 struct ipoib_mcast *mcast, *tmcast;
759 list_for_each_entry(mcast, &priv->multicast_list, list)
760 clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
779 mcast = __ipoib_mcast_find(priv, &mgid);
780 if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
805 if (mcast) {
807 list_move_tail(&mcast->list, &remove_list);
809 rb_replace_node(&mcast->rb_node,
818 if (mcast)
819 set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
823 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) {
824 if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) &&
825 !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
827 mcast->mcmember.mgid.raw, ":");
829 rb_erase(&mcast->rb_node, &priv->multicast_tree);
832 list_move_tail(&mcast->list, &remove_list);
840 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) {
841 ipoib_mcast_leave(mcast->priv, mcast);
842 ipoib_mcast_free(mcast);
874 struct ipoib_mcast *mcast;
882 mcast = rb_entry(n, struct ipoib_mcast, rb_node);
884 if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw,
886 iter->mgid = mcast->mcmember.mgid;
887 iter->created = mcast->created;
888 iter->queuelen = mcast->pkt_queue.ifq_len;
889 iter->complete = !!mcast->ah;
890 iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY));