diff options
author | Yin Lin <linyi@vmware.com> | 2016-05-24 23:28:03 +0000 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2016-06-01 10:32:37 -0700 |
commit | 85165b3cd91cf9b858879897cf00cf313a632a38 (patch) | |
tree | 4de66fce88643727d11f1a11c1d0c6856e82e200 /datapath-windows/ovsext/Offload.c | |
parent | 4c16ee484e2f3c7888ec33e8260f868605568027 (diff) | |
download | openvswitch-85165b3cd91cf9b858879897cf00cf313a632a38.tar.gz |
datapath-windows: Move UDP checksum computation to Offload.c
UDP checksum computation is shared by both vxlan and geneve on Windows.
Move the function so that the code can be shared.
Signed-off-by: Yin Lin <linyi@vmware.com>
Acked-by: Nithin Raju <nithin@vmware.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'datapath-windows/ovsext/Offload.c')
-rw-r--r-- | datapath-windows/ovsext/Offload.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/datapath-windows/ovsext/Offload.c b/datapath-windows/ovsext/Offload.c index 1e43a9e71..921c732cf 100644 --- a/datapath-windows/ovsext/Offload.c +++ b/datapath-windows/ovsext/Offload.c @@ -597,6 +597,51 @@ OvsValidateUDPChecksum(PNET_BUFFER_LIST curNbl, BOOLEAN udpCsumZero) /* + *---------------------------------------------------------------------------- + * OvsCalculateUDPChecksum + * Calculate UDP checksum + *---------------------------------------------------------------------------- + */ +NDIS_STATUS +OvsCalculateUDPChecksum(PNET_BUFFER_LIST curNbl, + PNET_BUFFER curNb, + IPHdr *ipHdr, + UDPHdr *udpHdr, + UINT32 packetLength) +{ + NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo; + UINT16 checkSum; + + csumInfo.Value = NET_BUFFER_LIST_INFO(curNbl, TcpIpChecksumNetBufferListInfo); + + /* Next check if UDP checksum has been calculated. */ + if (!csumInfo.Receive.UdpChecksumSucceeded) { + UINT32 l4Payload; + + checkSum = udpHdr->check; + + l4Payload = packetLength - sizeof(EthHdr) - ipHdr->ihl * 4; + udpHdr->check = 0; + udpHdr->check = + IPPseudoChecksum((UINT32 *)&ipHdr->saddr, + (UINT32 *)&ipHdr->daddr, + IPPROTO_UDP, (UINT16)l4Payload); + udpHdr->check = CalculateChecksumNB(curNb, (UINT16)l4Payload, + sizeof(EthHdr) + ipHdr->ihl * 4); + if (checkSum != udpHdr->check) { + OVS_LOG_TRACE("UDP checksum incorrect."); + return NDIS_STATUS_INVALID_PACKET; + } + } + + csumInfo.Receive.UdpChecksumSucceeded = 1; + NET_BUFFER_LIST_INFO(curNbl, TcpIpChecksumNetBufferListInfo) = csumInfo.Value; + return NDIS_STATUS_SUCCESS; +} + + + +/* * OvsApplySWChecksumOnNB -- * * This function calculates and sets the required sofware offloads given by |