• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/infiniband/ulp/ipoib/

Lines Matching refs:mcast

60 /* Used for all multicast joins (broadcast, IPv4 mcast and IPv6 mcast) */
91 static void ipoib_mcast_free(struct ipoib_mcast *mcast)
93 struct net_device *dev = mcast->dev;
101 IPOIB_GID_ARG(mcast->mcmember.mgid));
105 list_for_each_entry_safe(neigh, tmp, &mcast->neigh_list, list) {
108 * here, because we know that mcast->ah will always
119 if (mcast->ah)
120 ipoib_put_ah(mcast->ah);
122 while (!skb_queue_empty(&mcast->pkt_queue)) {
124 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
131 kfree(mcast);
137 struct ipoib_mcast *mcast;
139 mcast = kzalloc(sizeof *mcast, can_sleep ? GFP_KERNEL : GFP_ATOMIC);
140 if (!mcast)
143 mcast->dev = dev;
144 mcast->created = jiffies;
145 mcast->backoff = 1;
147 INIT_LIST_HEAD(&mcast->list);
148 INIT_LIST_HEAD(&mcast->neigh_list);
149 skb_queue_head_init(&mcast->pkt_queue);
151 return mcast;
160 struct ipoib_mcast *mcast;
163 mcast = rb_entry(n, struct ipoib_mcast, rb_node);
165 ret = memcmp(mgid, mcast->mcmember.mgid.raw,
172 return mcast;
178 static int __ipoib_mcast_add(struct net_device *dev, struct ipoib_mcast *mcast)
190 ret = memcmp(mcast->mcmember.mgid.raw, tmcast->mcmember.mgid.raw,
200 rb_link_node(&mcast->rb_node, pn, n);
201 rb_insert_color(&mcast->rb_node, &priv->multicast_tree);
206 static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast,
209 struct net_device *dev = mcast->dev;
214 mcast->mcmember = *mcmember;
217 if (!memcmp(mcast->mcmember.mgid.raw, priv->dev->broadcast + 4,
223 if (!test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
224 if (test_and_set_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
227 IPOIB_GID_ARG(mcast->mcmember.mgid));
232 ret = ipoib_mcast_attach(dev, be16_to_cpu(mcast->mcmember.mlid),
233 &mcast->mcmember.mgid);
237 IPOIB_GID_ARG(mcast->mcmember.mgid));
239 clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags);
246 .dlid = be16_to_cpu(mcast->mcmember.mlid),
248 .sl = mcast->mcmember.sl,
250 .static_rate = mcast->mcmember.rate,
252 .flow_label = be32_to_cpu(mcast->mcmember.flow_label),
253 .hop_limit = mcast->mcmember.hop_limit,
255 .traffic_class = mcast->mcmember.traffic_class
258 av.grh.dgid = mcast->mcmember.mgid;
265 mcast->ah = ah;
270 IPOIB_GID_ARG(mcast->mcmember.mgid),
271 mcast->ah->ah,
272 be16_to_cpu(mcast->mcmember.mlid),
273 mcast->mcmember.sl);
279 while (!skb_queue_empty(&mcast->pkt_queue)) {
280 struct sk_buff *skb = skb_dequeue(&mcast->pkt_queue);
303 struct ipoib_mcast *mcast = multicast->context;
304 struct net_device *dev = mcast->dev;
312 status = ipoib_mcast_join_finish(mcast, &multicast->rec);
315 if (mcast->logcount++ < 20)
318 IPOIB_GID_ARG(mcast->mcmember.mgid), status);
322 while (!skb_queue_empty(&mcast->pkt_queue)) {
324 dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
330 &mcast->flags);
335 static int ipoib_mcast_sendonly_join(struct ipoib_mcast *mcast)
337 struct net_device *dev = mcast->dev;
349 if (test_and_set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags)) {
354 rec.mgid = mcast->mcmember.mgid;
358 mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca,
366 mcast);
367 if (IS_ERR(mcast->mc)) {
368 ret = PTR_ERR(mcast->mc);
369 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
375 IPOIB_GID_ARG(mcast->mcmember.mgid));
384 struct ipoib_mcast *mcast = multicast->context;
385 struct net_device *dev = mcast->dev;
390 IPOIB_GID_ARG(mcast->mcmember.mgid), status);
397 status = ipoib_mcast_join_finish(mcast, &multicast->rec);
400 mcast->backoff = 1;
407 if (mcast == priv->broadcast)
413 if (mcast->logcount++ < 20) {
417 IPOIB_GID_ARG(mcast->mcmember.mgid),
422 IPOIB_GID_ARG(mcast->mcmember.mgid),
427 mcast->backoff *= 2;
428 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS)
429 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS;
432 status = test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
438 mcast->backoff * HZ);
445 static void ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast,
456 IPOIB_GID_ARG(mcast->mcmember.mgid));
458 rec.mgid = mcast->mcmember.mgid;
491 set_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
492 mcast->mc = ib_sa_join_multicast(&ipoib_sa_client, priv->ca, priv->port,
494 ipoib_mcast_join_complete, mcast);
495 if (IS_ERR(mcast->mc)) {
496 clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags);
497 ret = PTR_ERR(mcast->mc);
500 mcast->backoff *= 2;
501 if (mcast->backoff > IPOIB_MAX_BACKOFF_SECONDS)
502 mcast->backoff = IPOIB_MAX_BACKOFF_SECONDS;
508 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);
638 static int ipoib_mcast_leave(struct net_device *dev, struct ipoib_mcast *mcast)
643 if (test_and_clear_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
644 ib_sa_free_multicast(mcast->mc);
646 if (test_and_clear_bit(IPOIB_MCAST_FLAG_ATTACHED, &mcast->flags)) {
648 IPOIB_GID_ARG(mcast->mcmember.mgid));
651 ret = ipoib_mcast_detach(dev, be16_to_cpu(mcast->mcmember.mlid),
652 &mcast->mcmember.mgid);
663 struct ipoib_mcast *mcast;
679 mcast = __ipoib_mcast_find(dev, mgid);
680 if (!mcast) {
685 mcast = ipoib_mcast_alloc(dev, 0);
686 if (!mcast) {
694 set_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags);
695 memcpy(mcast->mcmember.mgid.raw, mgid, sizeof (union ib_gid));
696 __ipoib_mcast_add(dev, mcast);
697 list_add_tail(&mcast->list, &priv->multicast_list);
700 if (!mcast->ah) {
701 if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
702 skb_queue_tail(&mcast->pkt_queue, skb);
708 if (test_bit(IPOIB_MCAST_FLAG_BUSY, &mcast->flags))
711 else if (test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags))
712 ipoib_mcast_sendonly_join(mcast);
718 mcast = NULL;
722 if (mcast && mcast->ah) {
729 kref_get(&mcast->ah->ref);
730 neigh->ah = mcast->ah;
731 list_add_tail(&neigh->list, &mcast->neigh_list);
735 ipoib_send(dev, skb, mcast->ah, IB_MULTICAST_QPN);
746 struct ipoib_mcast *mcast, *tmcast;
753 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) {
754 list_del(&mcast->list);
755 rb_erase(&mcast->rb_node, &priv->multicast_tree);
756 list_add_tail(&mcast->list, &remove_list);
767 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) {
768 ipoib_mcast_leave(dev, mcast);
769 ipoib_mcast_free(mcast);
779 struct ipoib_mcast *mcast, *tmcast;
798 list_for_each_entry(mcast, &priv->multicast_list, list)
799 clear_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
811 mcast = __ipoib_mcast_find(dev, &mgid);
812 if (!mcast || test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
829 if (mcast) {
831 list_move_tail(&mcast->list, &remove_list);
833 rb_replace_node(&mcast->rb_node,
842 if (mcast)
843 set_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags);
847 list_for_each_entry_safe(mcast, tmcast, &priv->multicast_list, list) {
848 if (!test_bit(IPOIB_MCAST_FLAG_FOUND, &mcast->flags) &&
849 !test_bit(IPOIB_MCAST_FLAG_SENDONLY, &mcast->flags)) {
851 IPOIB_GID_ARG(mcast->mcmember.mgid));
853 rb_erase(&mcast->rb_node, &priv->multicast_tree);
856 list_move_tail(&mcast->list, &remove_list);
865 list_for_each_entry_safe(mcast, tmcast, &remove_list, list) {
866 ipoib_mcast_leave(mcast->dev, mcast);
867 ipoib_mcast_free(mcast);
899 struct ipoib_mcast *mcast;
907 mcast = rb_entry(n, struct ipoib_mcast, rb_node);
909 if (memcmp(iter->mgid.raw, mcast->mcmember.mgid.raw,
911 iter->mgid = mcast->mcmember.mgid;
912 iter->created = mcast->created;
913 iter->queuelen = skb_queue_len(&mcast->pkt_queue);
914 iter->complete = !!mcast->ah;
915 iter->send_only = !!(mcast->flags & (1 << IPOIB_MCAST_FLAG_SENDONLY));