[ovs-dev] [PATCH 1/2] [PATCH v2] datapath-windows: Move UDP checksum computation to Offload.c

Nithin Raju nithin at vmware.com
Mon May 23 16:44:31 UTC 2016


I am assuming that you¹ve run some tests using VXLAN tunnels.

Acked-by: Nithin Raju <nithin at vmware.com>

Thanks for the patch.

-----Original Message-----
From: dev <dev-bounces at openvswitch.org> on behalf of Yin Lin
<linyi at vmware.com>
Date: Friday, May 20, 2016 at 1:57 PM
To: "dev at openvswitch.org" <dev at openvswitch.org>
Subject: [ovs-dev] [PATCH 1/2] [PATCH v2] 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 at vmware.com>
>
>---
>Do not copy the inner ethernet header as it's not used.
>---
> datapath-windows/ovsext/Offload.c | 45
>++++++++++++++++++++++++++++++++++++
> datapath-windows/ovsext/Offload.h |  6 ++++-
> datapath-windows/ovsext/Vxlan.c   | 48
>+++------------------------------------
> 3 files changed, 53 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..765f5f1 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;
>     PUINT8 bufferStart;
>     NDIS_STATUS status;
> 
>@@ -422,7 +380,7 @@ OvsDecapVxlan(POVS_SWITCH_CONTEXT switchContext,
>     curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
>     packetLength = NET_BUFFER_DATA_LENGTH(curNb);
>     tunnelSize = OvsGetVxlanTunHdrSize();
>-    if (packetLength <= tunnelSize) {
>+    if (packetLength < tunnelSize) {
>         return NDIS_STATUS_INVALID_LENGTH;
>     }
> 
>@@ -430,7 +388,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,
>+                                tunnelSize, 0,
>                                 TRUE /*copy NBL info */);
> 
>     if (*newNbl == NULL) {
>-- 
>2.8.0.windows.1
>
>_______________________________________________
>dev mailing list
>dev at openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=pN
>HQcdr7B40b4h6Yb7FIedI1dnBsxdDuTLBYD3JqV80&m=ed3rw91Fbmr_3IU_J19Y9VqqCJovOL
>yadtVsX7FMZJk&s=caADgIyDKIbhmpzi2d-pv7jLLBmraoU1tFSjQr84V-4&e= 




More information about the dev mailing list