backport SUN NICs fix for OVS use
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Fri, 8 Jun 2018 09:17:16 +0000 (11:17 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Fri, 8 Jun 2018 09:58:18 +0000 (11:58 +0200)
See: https://pve.proxmox.com/pipermail/pve-user/2018-June/169567.html

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
patches/kernel/0009-net-ethernet-sun-niu-set-correct-packet-size-in-skb.patch [new file with mode: 0644]

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 (file)
index 0000000..3f58da8
--- /dev/null
@@ -0,0 +1,58 @@
+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