From: Thomas Lamprecht Date: Fri, 8 Jun 2018 09:17:16 +0000 (+0200) Subject: backport SUN NICs fix for OVS use X-Git-Url: https://git.proxmox.com/?p=pve-kernel.git;a=commitdiff_plain;h=d3722c5c8ac65120ef4793794651b288cd37a530;ds=sidebyside backport SUN NICs fix for OVS use See: https://pve.proxmox.com/pipermail/pve-user/2018-June/169567.html Signed-off-by: Thomas Lamprecht --- diff --git a/patches/kernel/0009-net-ethernet-sun-niu-set-correct-packet-size-in-skb.patch b/patches/kernel/0009-net-ethernet-sun-niu-set-correct-packet-size-in-skb.patch new file mode 100644 index 0000000..3f58da8 --- /dev/null +++ b/patches/kernel/0009-net-ethernet-sun-niu-set-correct-packet-size-in-skb.patch @@ -0,0 +1,58 @@ +From 14224923c3600bae2ac4dcae3bf0c3d4dc2812be Mon Sep 17 00:00:00 2001 +From: Rob Taglang +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 +Signed-off-by: David S. Miller +Signed-off-by: Thomas Lamprecht +--- + 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