| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Rob Taglang <[email protected]>
- Date: Thu, 3 May 2018 17:13:06 -0400
- Subject: [PATCH] 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 <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- Signed-off-by: Thomas Lamprecht <[email protected]>
- ---
- 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 06001bacbe0f..64f1b3a3afa8 100644
- --- a/drivers/net/ethernet/sun/niu.c
- +++ b/drivers/net/ethernet/sun/niu.c
- @@ -3442,7 +3442,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;
- @@ -3452,7 +3452,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;
-
- @@ -3465,7 +3464,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) {
|