59 lines
2.1 KiB
Diff
59 lines
2.1 KiB
Diff
|
From 14224923c3600bae2ac4dcae3bf0c3d4dc2812be Mon Sep 17 00:00:00 2001
|
||
|
From: Rob Taglang <rob@taglang.io>
|
||
|
Date: Thu, 3 May 2018 17:13:06 -0400
|
||
|
Subject: net: ethernet: sun: niu set correct packet size in skb
|
||
|
|
||
|
Currently, skb->len and skb->data_len are set to the page size, not
|
||
|
the packet size. This causes the frame check sequence to not be
|
||
|
located at the "end" of the packet resulting in ethernet frame check
|
||
|
errors. The driver does work currently, but stricter kernel facing
|
||
|
networking solutions like OpenVSwitch will drop these packets as
|
||
|
invalid.
|
||
|
|
||
|
These changes set the packet size correctly so that these errors no
|
||
|
longer occur. The length does not include the frame check sequence, so
|
||
|
that subtraction was removed.
|
||
|
|
||
|
Tested on Oracle/SUN Multithreaded 10-Gigabit Ethernet Network
|
||
|
Controller [108e:abcd] and validated in wireshark.
|
||
|
|
||
|
Signed-off-by: Rob Taglang <rob@taglang.io>
|
||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||
|
---
|
||
|
drivers/net/ethernet/sun/niu.c | 5 ++---
|
||
|
1 file changed, 2 insertions(+), 3 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c
|
||
|
index f081de4..88c1247 100644
|
||
|
--- a/drivers/net/ethernet/sun/niu.c
|
||
|
+++ b/drivers/net/ethernet/sun/niu.c
|
||
|
@@ -3443,7 +3443,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np,
|
||
|
|
||
|
len = (val & RCR_ENTRY_L2_LEN) >>
|
||
|
RCR_ENTRY_L2_LEN_SHIFT;
|
||
|
- len -= ETH_FCS_LEN;
|
||
|
+ append_size = len + ETH_HLEN + ETH_FCS_LEN;
|
||
|
|
||
|
addr = (val & RCR_ENTRY_PKT_BUF_ADDR) <<
|
||
|
RCR_ENTRY_PKT_BUF_ADDR_SHIFT;
|
||
|
@@ -3453,7 +3453,6 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np,
|
||
|
RCR_ENTRY_PKTBUFSZ_SHIFT];
|
||
|
|
||
|
off = addr & ~PAGE_MASK;
|
||
|
- append_size = rcr_size;
|
||
|
if (num_rcr == 1) {
|
||
|
int ptype;
|
||
|
|
||
|
@@ -3466,7 +3465,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np,
|
||
|
else
|
||
|
skb_checksum_none_assert(skb);
|
||
|
} else if (!(val & RCR_ENTRY_MULTI))
|
||
|
- append_size = len - skb->len;
|
||
|
+ append_size = append_size - skb->len;
|
||
|
|
||
|
niu_rx_skb_append(skb, page, off, append_size, rcr_size);
|
||
|
if ((page->index + rp->rbr_block_size) - rcr_size == addr) {
|
||
|
--
|
||
|
cgit v1.1
|