diff options
author | Paul Boca <pboca@cloudbasesolutions.com> | 2016-06-06 16:45:00 +0000 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2016-06-07 10:52:05 -0700 |
commit | c3e85147d9067c9c19451ad36505bcf70eb470b9 (patch) | |
tree | 4cae12c3d7784a86e8b4deebff2b52636fddff8a /datapath-windows/ovsext/User.c | |
parent | ab7fc30e13b4f07acb659b6801d4f98ddba2f1a6 (diff) | |
download | openvswitch-c3e85147d9067c9c19451ad36505bcf70eb470b9.tar.gz |
datapath-windows: Improved offloading on STT tunnel
*Added OvsExtractLayers - populates only the layers field without unnecessary
memory operations for flow part
*If in STT header the flags are 0 then force packets checksums calculation
on receive.
*Ensure correct pseudo checksum is set for LSO both on send and receive.
Linux includes the segment length to TCP pseudo-checksum conforming to
RFC 793 but in case of LSO Windows expects this to be only on
Source IP Address, Destination IP Address, and Protocol.
*Fragment expiration on rx side of STT was set to 30 seconds, but the correct
timeout would be TTL of the packet
Signed-off-by: Paul-Daniel Boca <pboca@cloudbasesolutions.com>
Acked-by: Sairam Venugopal <vsairam@vmware.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'datapath-windows/ovsext/User.c')
-rw-r--r-- | datapath-windows/ovsext/User.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c index 92a71e171..c7ac28456 100644 --- a/datapath-windows/ovsext/User.c +++ b/datapath-windows/ovsext/User.c @@ -768,7 +768,8 @@ OvsCreateAndAddPackets(PVOID userData, NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO tsoInfo; UINT32 packetLength; - tsoInfo.Value = NET_BUFFER_LIST_INFO(nbl, TcpLargeSendNetBufferListInfo); + tsoInfo.Value = NET_BUFFER_LIST_INFO(nbl, + TcpLargeSendNetBufferListInfo); nb = NET_BUFFER_LIST_FIRST_NB(nbl); packetLength = NET_BUFFER_DATA_LENGTH(nb); @@ -870,7 +871,8 @@ OvsCompletePacketHeader(UINT8 *packet, (UINT32 *)&ipHdr->DestinationAddress, IPPROTO_TCP, hdrInfoOut->l4PayLoad); } else { - PIPV6_HEADER ipv6Hdr = (PIPV6_HEADER)(packet + hdrInfoIn->l3Offset); + PIPV6_HEADER ipv6Hdr = (PIPV6_HEADER)(packet + + hdrInfoIn->l3Offset); hdrInfoOut->l4PayLoad = (UINT16)(ntohs(ipv6Hdr->PayloadLength) + hdrInfoIn->l3Offset + sizeof(IPV6_HEADER)- @@ -884,9 +886,9 @@ OvsCompletePacketHeader(UINT8 *packet, hdrInfoOut->tcpCsumNeeded = 1; ovsUserStats.recalTcpCsum++; } else if (!isRecv) { - if (csumInfo.Transmit.TcpChecksum) { + if (hdrInfoIn->isTcp && csumInfo.Transmit.TcpChecksum) { hdrInfoOut->tcpCsumNeeded = 1; - } else if (csumInfo.Transmit.UdpChecksum) { + } else if (hdrInfoIn->isUdp && csumInfo.Transmit.UdpChecksum) { hdrInfoOut->udpCsumNeeded = 1; } if (hdrInfoOut->tcpCsumNeeded || hdrInfoOut->udpCsumNeeded) { @@ -896,7 +898,8 @@ OvsCompletePacketHeader(UINT8 *packet, hdrInfoOut->tcpCsumNeeded ? IPPROTO_TCP : IPPROTO_UDP; #endif if (hdrInfoIn->isIPv4) { - PIPV4_HEADER ipHdr = (PIPV4_HEADER)(packet + hdrInfoIn->l3Offset); + PIPV4_HEADER ipHdr = (PIPV4_HEADER)(packet + + hdrInfoIn->l3Offset); hdrInfoOut->l4PayLoad = (UINT16)(ntohs(ipHdr->TotalLength) - (ipHdr->HeaderLength << 2)); #ifdef DBG @@ -1004,8 +1007,8 @@ OvsCreateQueueNlPacket(PVOID userData, csumInfo.Value = NET_BUFFER_LIST_INFO(nbl, TcpIpChecksumNetBufferListInfo); if (isRecv && (csumInfo.Receive.TcpChecksumFailed || - (csumInfo.Receive.UdpChecksumFailed && !hdrInfo->udpCsumZero) || - csumInfo.Receive.IpChecksumFailed)) { + (csumInfo.Receive.UdpChecksumFailed && !hdrInfo->udpCsumZero) || + csumInfo.Receive.IpChecksumFailed)) { OVS_LOG_INFO("Packet dropped due to checksum failure."); ovsUserStats.dropDuetoChecksum++; return NULL; |