Message ID | 1458763289-95167-2-git-send-email-pgynther@google.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On Wed, 2016-03-23 at 13:01 -0700, Petri Gynther wrote: > skb_len needs to be skb_headlen(skb) in bcmgenet_xmit_single(). > > Fragmented skbs can have only Ethernet + IP + TCP headers (14+20+20=54 bytes) > in the linear buffer, followed by the rest in fragments. Bumping skb_len to > ETH_ZLEN would be incorrect for this case, as it would introduce garbage > between TCP header and the fragment data. > > This also works with regular/non-fragmented small packets < ETH_ZLEN bytes. > Successfully tested this on GENETv3 with 42-byte ARP frames. > > For testing, I used: > ethtool -K eth0 tx-checksum-ipv4 off > ethtool -K eth0 tx-checksum-ipv6 off > echo 0 > /proc/sys/net/ipv4/tcp_timestamps > > Signed-off-by: Petri Gynther <pgynther@google.com> > --- > drivers/net/ethernet/broadcom/genet/bcmgenet.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c > index 9990582..00da239 100644 > --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c > +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c > @@ -1298,7 +1298,7 @@ static int bcmgenet_xmit_single(struct net_device *dev, > > tx_cb_ptr->skb = skb; > > - skb_len = skb_headlen(skb) < ETH_ZLEN ? ETH_ZLEN : skb_headlen(skb); > + skb_len = skb_headlen(skb); > > mapping = dma_map_single(kdev, skb->data, skb_len, DMA_TO_DEVICE); > ret = dma_mapping_error(kdev, mapping); Acked-by: Eric Dumazet <edumazet@google.com>
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 9990582..00da239 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -1298,7 +1298,7 @@ static int bcmgenet_xmit_single(struct net_device *dev, tx_cb_ptr->skb = skb; - skb_len = skb_headlen(skb) < ETH_ZLEN ? ETH_ZLEN : skb_headlen(skb); + skb_len = skb_headlen(skb); mapping = dma_map_single(kdev, skb->data, skb_len, DMA_TO_DEVICE); ret = dma_mapping_error(kdev, mapping);
skb_len needs to be skb_headlen(skb) in bcmgenet_xmit_single(). Fragmented skbs can have only Ethernet + IP + TCP headers (14+20+20=54 bytes) in the linear buffer, followed by the rest in fragments. Bumping skb_len to ETH_ZLEN would be incorrect for this case, as it would introduce garbage between TCP header and the fragment data. This also works with regular/non-fragmented small packets < ETH_ZLEN bytes. Successfully tested this on GENETv3 with 42-byte ARP frames. For testing, I used: ethtool -K eth0 tx-checksum-ipv4 off ethtool -K eth0 tx-checksum-ipv6 off echo 0 > /proc/sys/net/ipv4/tcp_timestamps Signed-off-by: Petri Gynther <pgynther@google.com> --- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)