forked from Minki/linux
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>
This commit is contained in:
parent
ae552ac278
commit
14224923c3
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user