[ovs-dev] [PATCH 2/3] [PATCH v1] Move UDP checksum computation to Offload.c

Yin Lin linyi at vmware.com
Thu May 19 21:49:24 UTC 2016


UDP checksum computation is shared by both vxlan and geneve on Windows.
Move the function so that the code can be shared.
---
 datapath-windows/ovsext/Offload.c | 45 +++++++++++++++++++++++++++++++++++
 datapath-windows/ovsext/Offload.h |  6 ++++-
 datapath-windows/ovsext/Vxlan.c   | 49 ++++-----------------------------------
 3 files changed, 54 insertions(+), 46 deletions(-)

diff --git a/datapath-windows/ovsext/Offload.c b/datapath-windows/ovsext/Offload.c
index 1e43a9e..921c732 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
diff --git a/datapath-windows/ovsext/Offload.h b/datapath-windows/ovsext/Offload.h
index b5cae2f..d3731b1 100644
--- a/datapath-windows/ovsext/Offload.h
+++ b/datapath-windows/ovsext/Offload.h
@@ -35,7 +35,11 @@ NDIS_STATUS OvsValidateIPChecksum(PNET_BUFFER_LIST curNbl,
                                   POVS_PACKET_HDR_INFO hdrInfo);
 NDIS_STATUS OvsValidateUDPChecksum(PNET_BUFFER_LIST curNbl,
                                    BOOLEAN udpCsumZero);
-
+NDIS_STATUS OvsCalculateUDPChecksum(PNET_BUFFER_LIST curNbl,
+                                    PNET_BUFFER curNb,
+                                    IPHdr *ipHdr,
+                                    UDPHdr *udpHdr,
+                                    UINT32 packetLength);
 
 ULONG OVSGetTcpMSS(PNET_BUFFER_LIST nbl);
 
diff --git a/datapath-windows/ovsext/Vxlan.c b/datapath-windows/ovsext/Vxlan.c
index 20214cb..d0529cd 100644
--- a/datapath-windows/ovsext/Vxlan.c
+++ b/datapath-windows/ovsext/Vxlan.c
@@ -353,48 +353,6 @@ OvsEncapVxlan(POVS_VPORT_ENTRY vport,
                            switchContext, newNbl);
 }
 
-/*
- *----------------------------------------------------------------------------
- * OvsCalculateUDPChecksum
- *     Calculate UDP checksum
- *----------------------------------------------------------------------------
- */
-static __inline 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;
-}
 
 /*
  *----------------------------------------------------------------------------
@@ -414,7 +372,7 @@ OvsDecapVxlan(POVS_SWITCH_CONTEXT switchContext,
     IPHdr *ipHdr;
     UDPHdr *udpHdr;
     VXLANHdr *vxlanHdr;
-    UINT32 tunnelSize = 0, packetLength = 0;
+    UINT32 tunnelSize, packetLength, copySize;
     PUINT8 bufferStart;
     NDIS_STATUS status;
 
@@ -422,7 +380,8 @@ OvsDecapVxlan(POVS_SWITCH_CONTEXT switchContext,
     curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
     packetLength = NET_BUFFER_DATA_LENGTH(curNb);
     tunnelSize = OvsGetVxlanTunHdrSize();
-    if (packetLength <= tunnelSize) {
+    copySize = tunnelSize + OVS_DEFAULT_COPY_SIZE;
+    if (packetLength < copySize) {
         return NDIS_STATUS_INVALID_LENGTH;
     }
 
@@ -430,7 +389,7 @@ OvsDecapVxlan(POVS_SWITCH_CONTEXT switchContext,
      * Create a copy of the NBL so that we have all the headers in one MDL.
      */
     *newNbl = OvsPartialCopyNBL(switchContext, curNbl,
-                                tunnelSize + OVS_DEFAULT_COPY_SIZE, 0,
+                                copySize, 0,
                                 TRUE /*copy NBL info */);
 
     if (*newNbl == NULL) {
-- 
2.8.0.windows.1




More information about the dev mailing list