IB/ipoib: Fix thinko in packet length checks
authorMichael S. Tsirkin <mst@dev.mellanox.co.il>
Wed, 21 Mar 2007 13:45:05 +0000 (15:45 +0200)
committerRoland Dreier <rolandd@cisco.com>
Thu, 22 Mar 2007 21:40:16 +0000 (14:40 -0700)
The packet length checks in ipoib are broken: we add 4 bytes (IPoIB
encapsulation header) when sending a packet, not 20 bytes (hardware
address length) to each packet.  Therefore, if connected mode is
enabled so that the interface MTU is larger than the multicast MTU,
IPoIB may end up trying to send too-long multicast packets.  For
example, multicast is broken if a message of size 2048 bytes is sent
on an interface with UD MTU 2048, because 2048 is bigger than the real
limit of 2044 but the code tests against the wrong limit of 2060.

This patch fixes <https://bugs.openfabrics.org/show_bug.cgi?id=418>,
submitted by Scott Weitzenkamp <sweitzen@cisco.com>.

Signed-off-by: Michael S. Tsirkin <mst@dev.mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/ulp/ipoib/ipoib_cm.c
drivers/infiniband/ulp/ipoib/ipoib_ib.c

index 467564074e9334f80f49764d182ccff5f96c1ef7..e70492db74f636eadd46a52bbc951a33e85e09bc 100644 (file)
@@ -452,7 +452,7 @@ void ipoib_cm_send(struct net_device *dev, struct sk_buff *skb, struct ipoib_cm_
                           skb->len, tx->mtu);
                ++priv->stats.tx_dropped;
                ++priv->stats.tx_errors;
-               ipoib_cm_skb_too_long(dev, skb, tx->mtu - INFINIBAND_ALEN);
+               ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
                return;
        }
 
index f2aa923ddbeaf7a39bbaf2ae11cbf1c2180067da..ba0ee5cf2ad75cf4ea89b2f754dc6e98cf314572 100644 (file)
@@ -328,9 +328,9 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb,
        struct ipoib_tx_buf *tx_req;
        u64 addr;
 
-       if (unlikely(skb->len > priv->mcast_mtu + INFINIBAND_ALEN)) {
+       if (unlikely(skb->len > priv->mcast_mtu + IPOIB_ENCAP_LEN)) {
                ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
-                          skb->len, priv->mcast_mtu + INFINIBAND_ALEN);
+                          skb->len, priv->mcast_mtu + IPOIB_ENCAP_LEN);
                ++priv->stats.tx_dropped;
                ++priv->stats.tx_errors;
                ipoib_cm_skb_too_long(dev, skb, priv->mcast_mtu);