Acked-by: Paul-Daniel Boca <pb...@cloudbasesolutions.com>

> -----Original Message-----
> From: dev [mailto:dev-boun...@openvswitch.org] On Behalf Of Alin Serdean
> Sent: Tuesday, May 24, 2016 7:14 PM
> To: dev@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 <aserd...@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@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to