[ofa-general] Re: [PATCH] IB/ipoib: fix thinko in packet length checks

Michael S. Tsirkin mst at dev.mellanox.co.il
Thu Mar 22 10:51:32 PDT 2007


> Quoting Roland Dreier <rdreier at cisco.com>:
> Subject: Re: [PATCH] IB/ipoib: fix thinko in packet length checks
> 
>  > > After this change, the code looks like:
>  > > 
>  > > 	if (unlikely(skb->len > tx->mtu)) {
>  > > 		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
>  > > 			   skb->len, tx->mtu);
>  > > 		++priv->stats.tx_dropped;
>  > > 		++priv->stats.tx_errors;
>  > > 		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
>  > > 		return;
>  > > 	}
>  > > 
>  > > so why is the test against just tx->mtu, while ipoib_cm_skb_too_long()
>  > > is passed an mtu of tx->mtu - IPOIB_ENCAP_LEN?
>  > 
>  > I actually copied this from datagram code.
>  > 
>  > What ipoib_cm_skb_too_long does is set the dest MTU metric.
> 
> Right, but this code sets the dest MTU to tx->mtu - IPOIB_ENCAP_LEN if
> it sees a packet longer than tx->mtu.  Shouldn't the initial test be
> against tx->mtu - IPOIB_ENCAP_LEN too?

Packets that we get here include IPOIB_ENCAP_LEN, right?
But the MTU that we set is for length of datagram, so we
subtract IPOIB_ENCAP_LEN.

>  > So look at this logic in datagram mode:
>  > 	if (new_mtu > IPOIB_PACKET_SIZE - IPOIB_ENCAP_LEN) {
>  > 		return -EINVAL;
>  > 	}
>  > 
>  > Why is the max MTU set to IPOIB_PACKET_SIZE - IPOIB_ENCAP_LEN and
>  > not to IPOIB_PACKET_SIZE?
> 
> Because the largest MTU we can handle is the biggest message we can
> receive minus the 4 byte encapsulation overhead.  In other words, if
> we can handle 2048 byte UD messages, then we shouldn't allow a
> datagram MTU above 2044.  The same reasoning applies to ethernet, so
> an ethernet interface has an MTU of 1500, because ethernet can send
> 1514 byte packets but space has to be left for the 14 bytes of
> src/dest/ethertype fields.
> 
> Or am I missing something here?

So same here.

-- 
MST



More information about the general mailing list