IB/ipoib: Verify address handle validity on send
authorMoni Shoua <monis@voltaire.com>
Wed, 10 Oct 2007 02:43:37 +0000 (19:43 -0700)
committerJeff Garzik <jeff@garzik.org>
Mon, 15 Oct 2007 18:20:45 +0000 (14:20 -0400)
When the bonding device senses a carrier loss of its active slave it replaces
that slave with a new one. In between the times when the carrier of an IPoIB
device goes down and ipoib_neigh is destroyed, it is possible that the
bonding driver will send a packet on a new slave that uses an old ipoib_neigh.
This patch detects and prevents this from happenning.

Signed-off-by: Moni Shoua <monis at voltaire.com>
Signed-off-by: Or Gerlitz <ogerlitz at voltaire.com>
Acked-by: Roland Dreier <rdreier@cisco.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/infiniband/ulp/ipoib/ipoib_main.c

index cae026c4ebe86f5954449e30194884819c158597..362610d870e4328935f8be02f4ffaa0faae96ea6 100644 (file)
@@ -692,9 +692,10 @@ static int ipoib_start_xmit(struct sk_buff *skb, struct net_device *dev)
                                goto out;
                        }
                } else if (neigh->ah) {
-                       if (unlikely(memcmp(&neigh->dgid.raw,
+                       if (unlikely((memcmp(&neigh->dgid.raw,
                                            skb->dst->neighbour->ha + 4,
-                                           sizeof(union ib_gid)))) {
+                                           sizeof(union ib_gid))) ||
+                                        (neigh->dev != dev))) {
                                spin_lock(&priv->lock);
                                /*
                                 * It's safe to call ipoib_put_ah() inside