• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/infiniband/ulp/ipoib/

Lines Matching refs:mcast

68 static void ipoib_mcast_free(struct ipoib_mcast *mcast)
70 struct net_device *dev = mcast->dev;
76 mcast->mcmember.mgid.raw);
80 list_for_each_entry_safe(neigh, tmp, &mcast->neigh_list, list) {
83 * here, because we know that mcast->ah will always
94 if (mcast->ah)
95 ipoib_put_ah(mcast->ah);
97 while (!skb_queue_empty(&mcast->pkt_queue)) {
99 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
106 kfree(mcast);
112 struct ipoib_mcast *mcast;
114 mcast = kzalloc(sizeof *mcast, can_sleep ? GFP_KERNEL : GFP_ATOMIC);
115 if (!mcast)
118 mcast->dev = dev;
119 mcast->created = jiffies;
120 mcast->backoff = 1;
122 INIT_LIST_HEAD(&mcast->list);
123 INIT_LIST_HEAD(&mcast->neigh_list);
124 skb_queue_head_init(&mcast->pkt_queue);
126 return mcast;
135 struct ipoib_mcast *mcast;
138 mcast = rb_entry(n, struct ipoib_mcast, rb_node);
140 ret = memcmp(mgid, mcast->mcmember.mgid.raw,
147 return mcast;
153 static int __ipoib_mcast_add(struct net_device *dev, struct ipoib_mcast *mcast)
165 ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw,
175 rb_link_node(&mcast->rb_node, pn, n);
176 rb_insert_color(&mcast->rb_node, &priv->multicast_tree);
181 static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
184 struct net_device *dev = mcast->dev;
190 mcast->mcmember = *mcmember;
193 if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4,
206 if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
207 if (test_and_set_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
209 mcast->mcmember.mgid.raw);
214 ret = ipoib_mcast_attach(dev, be16_to_cpu(mcast->mcmember.mlid),
215 &mcast->mcmember.mgid, set_qkey);
218 mcast->mcmember.mgid.raw);
220 clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags);
227 .dlid = be16_to_cpu(mcast->mcmember.mlid),
229 .sl = mcast->mcmember.sl,
231 .static_rate = mcast->mcmember.rate,
233 .flow_label = be32_to_cpu(mcast->mcmember.flow_label),
234 .hop_limit = mcast->mcmember.hop_limit,
236 .traffic_class = mcast->mcmember.traffic_class
239 av.grh.dgid = mcast->mcmember.mgid;
246 mcast->ah = ah;
250 mcast->mcmember.mgid.raw,
251 mcast->ah->ah,
252 be16_to_cpu(mcast->mcmember.mlid),
253 mcast->mcmember.sl);
259 while (!skb_queue_empty(&mcast->pkt_queue)) {
260 struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue);
283 struct ipoib_mcast *mcast = multicast->context;
284 struct net_device *dev = mcast->dev;
291 status = ipoib_mcast_join_finish(mcast, &multicast->rec);
294 if (mcast->logcount++ < 20)
296 mcast->mcmember.mgid.raw, status);
300 while (!skb_queue_empty(&mcast->pkt_queue)) {
302 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
308 &mcast->flags);
313 static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast)
315 struct net_device *dev = mcast->dev;
327 if (test_and_set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) {
332 rec.mgid = mcast->mcmember.mgid;
336 mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca,
344 mcast);
345 if (IS_ERR(mcast->mc)) {
346 ret = PTR_ERR(mcast->mc);
347 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
352 mcast->mcmember.mgid.raw);
383 struct ipoib_mcast *mcast = multicast->context;
384 struct net_device *dev = mcast->dev;
388 mcast->mcmember.mgid.raw, status);
395 status = ipoib_mcast_join_finish(mcast, &multicast->rec);
398 mcast->backoff = 1;
409 if (mcast == priv->broadcast)
415 if (mcast->logcount++ < 20) {
418 mcast->mcmember.mgid.raw, status);
421 mcast->mcmember.mgid.raw, status);
425 mcast->backoff *= 2;
426 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS)
427 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS;
430 status = test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
436 mcast->backoff * HZ);
443 static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast,
453 ipoib_dbg_mcast(priv, "joining MGID %pI6\n", mcast->mcmember.mgid.raw);
455 rec.mgid = mcast->mcmember.mgid;
488 set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
489 mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, priv->port,
491 ipoib_mcast_join_complete, mcast);
492 if (IS_ERR(mcast->mc)) {
493 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
494 ret = PTR_ERR(mcast->mc);
497 mcast->backoff *= 2;
498 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS)
499 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS;
505 mcast->backoff * HZ);
566 struct ipoib_mcast *mcast = NULL;
569 list_for_each_entry(mcast, &priv->multicast_list, list) {
570 if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)
571 && !test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)
572 && !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
579 if (&mcast->list == &priv->multicast_list) {
584 ipoib_mcast_join(dev, mcast, 1);
632 static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast)
637 if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
638 ib_sa_free_multicast(mcast->mc);
640 if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
642 mcast->mcmember.mgid.raw);
645 ret = ib_detach_mcast(priv->qp, &mcast->mcmember.mgid,
646 be16_to_cpu(mcast->mcmember.mlid));
657 struct ipoib_mcast *mcast;
670 mcast = __ipoib_mcast_find(dev, mgid);
671 if (!mcast) {
676 mcast = ipoib_mcast_alloc(dev, 0);
677 if (!mcast) {
685 set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags);
686 memcpy(mcast->mcmember.mgid.raw, mgid, sizeof (union ib_gid));
687 __ipoib_mcast_add(dev, mcast);
688 list_add_tail(&mcast->list, &priv->multicast_list);
691 if (!mcast->ah) {
692 if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
693 skb_queue_tail(&mcast->pkt_queue, skb);
699 if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
702 else if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
703 ipoib_mcast_sendonly_join(mcast);
709 mcast = NULL;
713 if (mcast && mcast->ah) {
721 kref_get(&mcast->ah->ref);
722 neigh->ah = mcast->ah;
723 list_add_tail(&neigh->list, &mcast->neigh_list);
728 ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN);
740 struct ipoib_mcast *mcast, *tmcast;
747 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) {
748 list_del(&mcast->list);
749 rb_erase(&mcast->rb_node, &priv->multicast_tree);
750 list_add_tail(&mcast->list, &remove_list);
761 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) {
762 ipoib_mcast_leave(dev, mcast);
763 ipoib_mcast_free(mcast);
784 struct ipoib_mcast *mcast, *tmcast;
804 list_for_each_entry(mcast, &priv->multicast_list, list)
805 clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
816 mcast = __ipoib_mcast_find(dev, &mgid);
817 if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
842 if (mcast) {
844 list_move_tail(&mcast->list, &remove_list);
846 rb_replace_node(&mcast->rb_node,
855 if (mcast)
856 set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
860 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) {
861 if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) &&
862 !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
864 mcast->mcmember.mgid.raw);
866 rb_erase(&mcast->rb_node, &priv->multicast_tree);
869 list_move_tail(&mcast->list, &remove_list);
878 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) {
879 ipoib_mcast_leave(mcast->dev, mcast);
880 ipoib_mcast_free(mcast);
912 struct ipoib_mcast *mcast;
920 mcast = rb_entry(n, struct ipoib_mcast, rb_node);
922 if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw,
924 iter->mgid = mcast->mcmember.mgid;
925 iter->created = mcast->created;
926 iter->queuelen = skb_queue_len(&mcast->pkt_queue);
927 iter->complete = !!mcast->ah;
928 iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY));