summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Offload.c
diff options
context:
space:
mode:
authorYin Lin <linyi@vmware.com>2016-05-24 23:28:03 +0000
committerBen Pfaff <blp@ovn.org>2016-06-01 10:32:37 -0700
commit85165b3cd91cf9b858879897cf00cf313a632a38 (patch)
tree4de66fce88643727d11f1a11c1d0c6856e82e200 /datapath-windows/ovsext/Offload.c
parent4c16ee484e2f3c7888ec33e8260f868605568027 (diff)
downloadopenvswitch-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.c45
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