Skip to content

Commit

Permalink
datapath-windows: Remove the workaround in NAT for TCP checksum
Browse files Browse the repository at this point in the history
When checksum offload is enabled, compute checksum using the
TCP pseudo header.

Signed-off-by: Anand Kumar <[email protected]>
Acked-by: Alin Gabriel Serdean <[email protected]>
Signed-off-by: Alin Gabriel Serdean <[email protected]>
  • Loading branch information
Anandkumar26 authored and aserdean committed Oct 16, 2017
1 parent 9006dc7 commit 7468ec7
Showing 1 changed file with 11 additions and 49 deletions.
60 changes: 11 additions & 49 deletions datapath-windows/ovsext/Actions.c
Original file line number Diff line number Diff line change
Expand Up @@ -1528,6 +1528,11 @@ OvsUpdateAddressAndPort(OvsForwardingContext *ovsFwdCtx,
((BOOLEAN)csumInfo.Receive.UdpChecksumSucceeded ||
(BOOLEAN)csumInfo.Receive.UdpChecksumFailed);
}
if (l4Offload) {
*checkField = IPPseudoChecksum(&newAddr, &ipHdr->daddr,
tcpHdr ? IPPROTO_TCP : IPPROTO_UDP,
ntohs(ipHdr->tot_len) - ipHdr->ihl * 4);
}
} else {
addrField = &ipHdr->daddr;
if (tcpHdr) {
Expand All @@ -1538,19 +1543,13 @@ OvsUpdateAddressAndPort(OvsForwardingContext *ovsFwdCtx,
checkField = &udpHdr->check;
}
}

if (*addrField != newAddr) {
UINT32 oldAddr = *addrField;
if (checkField && *checkField != 0) {
if (l4Offload) {
/* Recompute IP pseudo checksum */
*checkField = ~(*checkField);
*checkField = ChecksumUpdate32(*checkField, oldAddr,
newAddr);
*checkField = ~(*checkField);
} else {
*checkField = ChecksumUpdate32(*checkField, oldAddr,
newAddr);
}
if (checkField && *checkField != 0 && !l4Offload) {
/* Recompute total checksum. */
*checkField = ChecksumUpdate32(*checkField, oldAddr,
newAddr);
}
if (ipHdr->check != 0) {
ipHdr->check = ChecksumUpdate32(ipHdr->check, oldAddr,
Expand All @@ -1561,49 +1560,12 @@ OvsUpdateAddressAndPort(OvsForwardingContext *ovsFwdCtx,

if (portField && *portField != newPort) {
if (checkField && !l4Offload) {
/* Recompute total checksum. */
*checkField = ChecksumUpdate16(*checkField, *portField,
newPort);
}
*portField = newPort;
}
PNET_BUFFER_LIST curNbl = ovsFwdCtx->curNbl;
PNET_BUFFER_LIST newNbl = NULL;
if (layers->isTcp) {
UINT32 mss = OVSGetTcpMSS(curNbl);
if (mss) {
OVS_LOG_TRACE("l4Offset %d", layers->l4Offset);
newNbl = OvsTcpSegmentNBL(ovsFwdCtx->switchContext, curNbl, layers,
mss, 0, FALSE);
if (newNbl == NULL) {
OVS_LOG_ERROR("Unable to segment NBL");
return NDIS_STATUS_FAILURE;
}
/* Clear out LSO flags after this point */
NET_BUFFER_LIST_INFO(newNbl, TcpLargeSendNetBufferListInfo) = 0;
}
}
/* If we didn't split the packet above, make a copy now */
if (newNbl == NULL) {
csumInfo.Value = NET_BUFFER_LIST_INFO(curNbl,
TcpIpChecksumNetBufferListInfo);
OvsApplySWChecksumOnNB(layers, curNbl, &csumInfo);
}

if (newNbl) {
curNbl = newNbl;
OvsCompleteNBLForwardingCtx(ovsFwdCtx,
L"Complete after cloning NBL for encapsulation");
OvsInitForwardingCtx(ovsFwdCtx, ovsFwdCtx->switchContext,
newNbl, ovsFwdCtx->srcVportNo, 0,
NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL(newNbl),
ovsFwdCtx->completionList,
&ovsFwdCtx->layers, FALSE);
ovsFwdCtx->curNbl = newNbl;
}

NET_BUFFER_LIST_INFO(curNbl,
TcpIpChecksumNetBufferListInfo) = 0;

return NDIS_STATUS_SUCCESS;
}

Expand Down

0 comments on commit 7468ec7

Please sign in to comment.