Eli Cohen wrote:
--- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c
@@ -418,14 +449,35 @@ void ipoib_send(struct net_device *dev, struct sk_buff
*skb,
{
+ int hlen;
+ void *phead;
+
+ if (!skb_is_gso(skb)) {
+ 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 + IPOIB_ENCAP_LEN);
+ ++dev->stats.tx_dropped;
+ ++dev->stats.tx_errors;
+ ipoib_cm_skb_too_long(dev, skb, priv->mcast_mtu);
+ return;
+ }
+ phead = 0;
+ hlen = 0;
+ } else {
+ /*
+ * LSO header is limited to max 60 bytes
+ */
+ if (unlikely((ip_hdr(skb)->ihl + tcp_hdr(skb)->doff) > 15)) {
+ ipoib_warn(priv, "ip(%d) and tcp(%d) headers too long,
dropping skb\n",
+ ip_hdr(skb)->ihl << 2, tcp_hdr(skb)->doff <<
2);
+ goto drop;
+ }
is the 60 bytes being a limitation of the connectX HW, the Linux kernel
stack or some "lso spec"?
+ hlen = ((ip_hdr(skb)->ihl + tcp_hdr(skb)->doff) << 2) +
IPOIB_ENCAP_LEN;
+ phead = skb->data;
Looking in e1000 tso code (eg
http://lxr.linux.no/linux/drivers/net/e1000/e1000_main.c#L2884) I see
that the header len is gotten by
skb_transport_offset(skb) + tcp_hdrlen(skb), is that what
((ip_hdr(skb)->ihl + tcp_hdr(skb)->doff) << 2) gives?
@@ -470,6 +521,12 @@ void ipoib_send(struct net_device *dev, struct sk_buff
*skb,
netif_stop_queue(dev);
}
}
+ return;
+
+drop:
+ ++dev->stats.tx_errors;
+ dev_kfree_skb_any(skb);
+ return;
shouldn't the tx_dropped counter be incremented here?
Or.
_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general
To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general