[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