[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