Commit 413f142c authored by David Wilder's avatar David Wilder Committed by Jakub Kicinski

ibmveth: Identify ingress large send packets.

Ingress large send packets are identified by either:
The IBMVETH_RXQ_LRG_PKT flag in the receive buffer
or with a -1 placed in the ip header checksum.
The method used depends on firmware version. Frame
geometry and sufficient header validation is performed by the
hypervisor eliminating the need for further header checks here.

Fixes: 7b596738 ("ibmveth: set correct gso_size and gso_type")
Signed-off-by: default avatarDavid Wilder <dwilder@us.ibm.com>
Reviewed-by: default avatarThomas Falcon <tlfalcon@linux.ibm.com>
Reviewed-by: default avatarCristobal Forno <cris.forno@ibm.com>
Reviewed-by: default avatarPradeep Satyanarayana <pradeeps@linux.vnet.ibm.com>
Acked-by: default avatarWillem de Bruijn <willemb@google.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 5ce9ad81
...@@ -1349,6 +1349,7 @@ static int ibmveth_poll(struct napi_struct *napi, int budget) ...@@ -1349,6 +1349,7 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
int offset = ibmveth_rxq_frame_offset(adapter); int offset = ibmveth_rxq_frame_offset(adapter);
int csum_good = ibmveth_rxq_csum_good(adapter); int csum_good = ibmveth_rxq_csum_good(adapter);
int lrg_pkt = ibmveth_rxq_large_packet(adapter); int lrg_pkt = ibmveth_rxq_large_packet(adapter);
__sum16 iph_check = 0;
skb = ibmveth_rxq_get_buffer(adapter); skb = ibmveth_rxq_get_buffer(adapter);
...@@ -1385,7 +1386,17 @@ static int ibmveth_poll(struct napi_struct *napi, int budget) ...@@ -1385,7 +1386,17 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
skb_put(skb, length); skb_put(skb, length);
skb->protocol = eth_type_trans(skb, netdev); skb->protocol = eth_type_trans(skb, netdev);
if (length > netdev->mtu + ETH_HLEN) { /* PHYP without PLSO support places a -1 in the ip
* checksum for large send frames.
*/
if (skb->protocol == cpu_to_be16(ETH_P_IP)) {
struct iphdr *iph = (struct iphdr *)skb->data;
iph_check = iph->check;
}
if ((length > netdev->mtu + ETH_HLEN) ||
lrg_pkt || iph_check == 0xffff) {
ibmveth_rx_mss_helper(skb, mss, lrg_pkt); ibmveth_rx_mss_helper(skb, mss, lrg_pkt);
adapter->rx_large_packets++; adapter->rx_large_packets++;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment