[ovs-dev] [PATCH v2 1/3] datapath-windows: Add UDP checksum verifications for VXLAN

Nithin Raju nithin at vmware.com
Tue May 31 16:52:40 UTC 2016


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

-----Original Message-----
From: dev <dev-bounces at openvswitch.org> on behalf of Alin Serdean
<aserdean at cloudbasesolutions.com>
Date: Tuesday, May 24, 2016 at 9:14 AM
To: "dev at openvswitch.org" <dev at openvswitch.org>
Subject: [ovs-dev] [PATCH v2 1/3] datapath-windows: Add UDP checksum
verifications for VXLAN

>Introduce UDP checksum if it was specified in the tunnel information
>on Tx.
>
>Set the tunnel checksum information flag on the flow if the
>UDP checksum was non zero on the Rx.
>
>Signed-off-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
>---
>v2: Address comments
>---
> datapath-windows/ovsext/Vxlan.c | 43
>+++++++++++++++++++++++++++++++----------
> 1 file changed, 33 insertions(+), 10 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Vxlan.c
>b/datapath-windows/ovsext/Vxlan.c
>index 20214cb..520f313 100644
>--- a/datapath-windows/ovsext/Vxlan.c
>+++ b/datapath-windows/ovsext/Vxlan.c
>@@ -192,6 +192,7 @@ OvsDoEncapVxlan(POVS_VPORT_ENTRY vport,
>     UINT32 headRoom = OvsGetVxlanTunHdrSize();
>     UINT32 packetLength;
>     ULONG mss = 0;
>+    NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
> 
>     /*
>      * XXX: the assumption currently is that the NBL is owned by OVS, and
>@@ -230,7 +231,6 @@ OvsDoEncapVxlan(POVS_VPORT_ENTRY vport,
>             OVS_LOG_ERROR("Unable to copy NBL");
>             return NDIS_STATUS_FAILURE;
>         }
>-        NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
>         csumInfo.Value = NET_BUFFER_LIST_INFO(curNbl,
>                  
>TcpIpChecksumNetBufferListInfo);
>         status = OvsApplySWChecksumOnNB(layers, *newNbl, &csumInfo);
>@@ -249,7 +249,8 @@ OvsDoEncapVxlan(POVS_VPORT_ENTRY vport,
>         }
> 
>         curMdl = NET_BUFFER_CURRENT_MDL(curNb);
>-        bufferStart = (PUINT8)MmGetSystemAddressForMdlSafe(curMdl,
>LowPagePriority);
>+        bufferStart = (PUINT8)MmGetSystemAddressForMdlSafe(curMdl,
>+                 
>LowPagePriority);
>         if (!bufferStart) {
>             status = NDIS_STATUS_RESOURCES;
>             goto ret_error;
>@@ -257,7 +258,8 @@ OvsDoEncapVxlan(POVS_VPORT_ENTRY vport,
> 
>         bufferStart += NET_BUFFER_CURRENT_MDL_OFFSET(curNb);
>         if (NET_BUFFER_NEXT_NB(curNb)) {
>-            OVS_LOG_TRACE("nb length %u next %u",
>NET_BUFFER_DATA_LENGTH(curNb),
>+            OVS_LOG_TRACE("nb length %u next %u",
>+                          NET_BUFFER_DATA_LENGTH(curNb),
>                           NET_BUFFER_DATA_LENGTH(curNb->Next));
>         }
> 
>@@ -288,7 +290,6 @@ OvsDoEncapVxlan(POVS_VPORT_ENTRY vport,
>         ipHdr->daddr = fwdInfo->dstIpAddr;
> 
>         ipHdr->check = 0;
>-        ipHdr->check = IPChecksum((UINT8 *)ipHdr, sizeof *ipHdr, 0);
> 
>         /* UDP header */
>         udpHdr = (UDPHdr *)((PCHAR)ipHdr + sizeof *ipHdr);
>@@ -296,7 +297,13 @@ OvsDoEncapVxlan(POVS_VPORT_ENTRY vport,
>         udpHdr->dest = htons(vportVxlan->dstPort);
>         udpHdr->len = htons(NET_BUFFER_DATA_LENGTH(curNb) - headRoom +
>                             sizeof *udpHdr + sizeof *vxlanHdr);
>-        udpHdr->check = 0;
>+
>+        if (tunKey->flags & OVS_TNL_F_CSUM) {
>+            udpHdr->check = IPPseudoChecksum(&ipHdr->saddr,
>&ipHdr->daddr,
>+                                             IPPROTO_UDP,
>ntohs(udpHdr->len));
>+        } else {
>+            udpHdr->check = 0;
>+        }
> 
>         /* VXLAN header */
>         vxlanHdr = (VXLANHdr *)((PCHAR)udpHdr + sizeof *udpHdr);
>@@ -308,6 +315,17 @@ OvsDoEncapVxlan(POVS_VPORT_ENTRY vport,
>         vxlanHdr->instanceID = 1;
>         vxlanHdr->reserved2 = 0;
>     }
>+
>+    csumInfo.Value = 0;
>+    csumInfo.Transmit.IpHeaderChecksum = 1;
>+    csumInfo.Transmit.IsIPv4 = 1;
>+    if (tunKey->flags & OVS_TNL_F_CSUM) {
>+        csumInfo.Transmit.UdpChecksum = 1;
>+    }
>+    NET_BUFFER_LIST_INFO(curNbl,
>+                         TcpIpChecksumNetBufferListInfo) =
>csumInfo.Value;
>+
>+
>     return STATUS_SUCCESS;
> 
> ret_error:
>@@ -466,7 +484,9 @@ OvsDecapVxlan(POVS_SWITCH_CONTEXT switchContext,
> 
>     /* Calculate and verify UDP checksum if NIC didn't do it. */
>     if (udpHdr->check != 0) {
>-        status = OvsCalculateUDPChecksum(curNbl, curNb, ipHdr, udpHdr,
>packetLength);
>+        tunKey->flags |= OVS_TNL_F_CSUM;
>+        status = OvsCalculateUDPChecksum(curNbl, curNb, ipHdr, udpHdr,
>+                                         packetLength);
>         if (status != NDIS_STATUS_SUCCESS) {
>             goto dropNbl;
>         }
>@@ -474,10 +494,10 @@ OvsDecapVxlan(POVS_SWITCH_CONTEXT switchContext,
> 
>     vxlanHdr = (VXLANHdr *)((PCHAR)udpHdr + sizeof *udpHdr);
>     if (vxlanHdr->instanceID) {
>-        tunKey->flags = OVS_TNL_F_KEY;
>+        tunKey->flags |= OVS_TNL_F_KEY;
>         tunKey->tunnelId = VXLAN_VNI_TO_TUNNELID(vxlanHdr->vxlanID);
>     } else {
>-        tunKey->flags = 0;
>+        tunKey->flags &= ~OVS_TNL_F_KEY;
>         tunKey->tunnelId = 0;
>     }
> 
>@@ -520,6 +540,9 @@ OvsSlowPathDecapVxlan(const PNET_BUFFER_LIST packet,
>         udp = OvsGetUdp(packet, layers.l4Offset, &udpStorage);
>         if (udp) {
>             layers.l7Offset = layers.l4Offset + sizeof *udp;
>+            if (udp->check != 0) {
>+                tunnelKey->flags |= OVS_TNL_F_CSUM;
>+            }
>         } else {
>             break;
>         }
>@@ -535,10 +558,10 @@ OvsSlowPathDecapVxlan(const PNET_BUFFER_LIST packet,
>             tunnelKey->ttl = nh->ttl;
>             tunnelKey->tos = nh->tos;
>             if (VxlanHeader->instanceID) {
>-                tunnelKey->flags = OVS_TNL_F_KEY;
>+                tunnelKey->flags |= OVS_TNL_F_KEY;
>                 tunnelKey->tunnelId =
>VXLAN_VNI_TO_TUNNELID(VxlanHeader->vxlanID);
>             } else {
>-                tunnelKey->flags = 0;
>+                tunnelKey->flags &= ~OVS_TNL_F_KEY;
>                 tunnelKey->tunnelId = 0;
>             }
>         } else {
>-- 
>1.9.5.msysgit.0
>_______________________________________________
>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=CZoDvmqSN9Zvk8-FNokC1WTA-aJY2_
>kwHHafyc9xAfY&s=XRTCYjyZutxVwrPqbOoF-UZfe0AnEm3cWMsYR0ksVXs&e= 




More information about the dev mailing list