Skip to content

Commit

Permalink
datapath-windows:Correct checksum for DNAT action
Browse files Browse the repository at this point in the history
While testing OVS-windows flows for the DNAT action, the checksum
In TCP header is set incorrectly when TCP offload is enabled by
Default. As a result, the packet will be dropped on receiver linuxVM.

>>>sample flow default configuration on both Windows VM and Linux VM
(src=40.0.1.2,dst=10.150.0.1) --dnat--> (src=40.0.1.2,dst==30.1.0.2)
Without the fix for some TCP packet(40.0.1.2->30.1.0.2 with payload
len 207) the TCP checksum will be pseduo header checksum and the value
is 0x01d6. With the fix the checksum will be 0x47ee, it could be got
the correct TCP checksum on the receiver Linux VM.

Signed-off-by: Wilson Peng<pweisong@vmware.com>
Signed-off-by: Anand Kumar<kumaranand@vmware.com>
Acked-by: Alin-Gabriel Serdean <aserdean@ovn.org>
Signed-off-by: Alin-Gabriel Serdean <aserdean@ovn.org>
  • Loading branch information
pweisong authored and aserdean committed Jul 21, 2021
1 parent bbdf047 commit b5a0232
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions datapath-windows/ovsext/Actions.c
Expand Up @@ -1550,9 +1550,21 @@ OvsUpdateAddressAndPort(OvsForwardingContext *ovsFwdCtx,
if (tcpHdr) {
portField = &tcpHdr->dest;
checkField = &tcpHdr->check;
l4Offload = isTx ? (BOOLEAN)csumInfo.Transmit.TcpChecksum :
((BOOLEAN)csumInfo.Receive.TcpChecksumSucceeded ||
(BOOLEAN)csumInfo.Receive.TcpChecksumFailed);
} else if (udpHdr) {
portField = &udpHdr->dest;
checkField = &udpHdr->check;
l4Offload = isTx ? (BOOLEAN)csumInfo.Transmit.UdpChecksum :
((BOOLEAN)csumInfo.Receive.UdpChecksumSucceeded ||
(BOOLEAN)csumInfo.Receive.UdpChecksumFailed);
}

if (l4Offload) {
*checkField = IPPseudoChecksum(&ipHdr->saddr, &newAddr,
tcpHdr ? IPPROTO_TCP : IPPROTO_UDP,
ntohs(ipHdr->tot_len) - ipHdr->ihl * 4);
}
}

Expand Down

0 comments on commit b5a0232

Please sign in to comment.