Acked-by: Nithin Raju <nit...@vmware.com> -----Original Message----- From: dev <dev-boun...@openvswitch.org> on behalf of Yin Lin <li...@vmware.com> Date: Tuesday, May 24, 2016 at 4:28 PM To: "dev@openvswitch.org" <dev@openvswitch.org> Subject: [ovs-dev] [PATCH 1/2] [PATCH v5] 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<li...@vmware.com> > >--- >No change. >--- > 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@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=DV573G5Nm1KYYsvraAv8aW_078HZVy >7ejmporp4E0cU&s=Zj-B1UnV-7FH6Q1TbmqVon95G94S2rPvAvFoUUJS3KI&e= _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev