[ovs-dev] [PATCH] datapath-windows: Account for VLAN tag in tunnel Decap

Shashank Ram rams at vmware.com
Tue Nov 28 16:00:50 UTC 2017


We can wait for 2.9, thanks!

On 11/28/17, 8:53 PM, "Alin Serdean" <aserdean at cloudbasesolutions.com> wrote:

    It makes sense, but unfortunately it would be a stretch. The patch adds a feature.
    
    Can you wait until 2.9 is out, or do you have a use case for 2.8 which you want to fulfill?
    
    Thanks,
    Alin.
    
    > -----Original Message-----
    > From: Shashank Ram [mailto:rams at vmware.com]
    > Sent: Tuesday, November 28, 2017 3:33 PM
    > To: dev at openvswitch.org; Alin Serdean
    > <aserdean at cloudbasesolutions.com>
    > Subject: Re: [ovs-dev] [PATCH] datapath-windows: Account for VLAN tag in
    > tunnel Decap
    > 
    > Alin, do you think it makes sense to also apply this on 2.8?
    > 
    > --
    > Thanks,
    > Shashank
    > 
    > On 11/28/17, 11:47 AM, "ovs-dev-bounces at openvswitch.org on behalf of
    > Shashank Ram" <ovs-dev-bounces at openvswitch.org on behalf of
    > rams at vmware.com> wrote:
    > 
    >     Alin, can we apply this patch? It’s been sitting around in the mailing list for a
    > week without any reviews after an ACK.
    > 
    > 
    > 
    >     --
    > 
    >     Thanks,
    > 
    >     Shashank
    > 
    > 
    > 
    >     On 11/21/17, 11:18 PM, "Anand Kumar" <kumaranand at vmware.com>
    > wrote:
    > 
    > 
    > 
    >         Acked-by: Anand Kumar <kumaranand at vmware.com>
    > 
    > 
    > 
    >         Thanks,
    > 
    >         Anand Kumar
    > 
    > 
    > 
    >         On 11/20/17, 3:06 PM, "ovs-dev-bounces at openvswitch.org on behalf of
    > Shashank Ram" <ovs-dev-bounces at openvswitch.org on behalf of
    > rams at vmware.com> wrote:
    > 
    > 
    > 
    >             Decap functions for tunneling protocols do not compute
    > 
    >             the packet header offsets correctly when there is a VLAN
    > 
    >             tag in the L2 header. This results in incorrect checksum
    > 
    >             computation causing the packet to be dropped.
    > 
    > 
    > 
    >             This patch adds support to account for the VLAN tag in the
    > 
    >             packet if its present, and makes use of the OvsExtractLayers()
    > 
    >             function to correctly compute the header offsets for different
    > 
    >             layers.
    > 
    > 
    > 
    >             Testing done:
    > 
    >             - Tested Geneve, STT, Vxlan and Gre and verified that there
    > 
    >               are no regressions.
    > 
    >             - Verified that packets with VLAN tags are correctly handled
    > 
    >               in the decap code of all tunneling protocols. Previously,
    > 
    >               this would result in packet drops due to invalid checksums
    > 
    >               being computed.
    > 
    >             - Verified that non-VLAN tagged packets are handled correctly.
    > 
    > 
    > 
    >             Signed-off-by: Shashank Ram <rams at vmware.com>
    > 
    >             ---
    > 
    >              datapath-windows/ovsext/Geneve.c  | 14 +++++++++----
    > 
    >              datapath-windows/ovsext/Geneve.h  |  6 ++++++
    > 
    >              datapath-windows/ovsext/Gre.c     | 29 ++++++++++++++++----------
    > 
    >              datapath-windows/ovsext/Gre.h     | 16 ++++++++++++++
    > 
    >              datapath-windows/ovsext/Offload.c | 10 +++++----
    > 
    >              datapath-windows/ovsext/Offload.h |  3 ++-
    > 
    >              datapath-windows/ovsext/Stt.c     | 44
    > +++++++++++++++++++++++++++------------
    > 
    >              datapath-windows/ovsext/Stt.h     |  6 ++++++
    > 
    >              datapath-windows/ovsext/Vxlan.c   | 14 +++++++++----
    > 
    >              datapath-windows/ovsext/Vxlan.h   |  6 ++++++
    > 
    >              10 files changed, 111 insertions(+), 37 deletions(-)
    > 
    > 
    > 
    >             diff --git a/datapath-windows/ovsext/Geneve.c b/datapath-
    > windows/ovsext/Geneve.c
    > 
    >             index 6dca69b..210716d 100644
    > 
    >             --- a/datapath-windows/ovsext/Geneve.c
    > 
    >             +++ b/datapath-windows/ovsext/Geneve.c
    > 
    >             @@ -262,10 +262,16 @@ NDIS_STATUS
    > OvsDecapGeneve(POVS_SWITCH_CONTEXT switchContext,
    > 
    >                  PUINT8 bufferStart;
    > 
    >                  PVOID optStart;
    > 
    >                  NDIS_STATUS status;
    > 
    >             +    OVS_PACKET_HDR_INFO layers = { 0 };
    > 
    >             +
    > 
    >             +    status = OvsExtractLayers(curNbl, &layers);
    > 
    >             +    if (status != NDIS_STATUS_SUCCESS) {
    > 
    >             +        return status;
    > 
    >             +    }
    > 
    > 
    > 
    >                  /* Check the length of the UDP payload */
    > 
    >                  curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
    > 
    >             -    tunnelSize = OvsGetGeneveTunHdrMinSize();
    > 
    >             +    tunnelSize = OvsGetGeneveTunHdrSizeFromLayers(&layers);
    > 
    >                  packetLength = NET_BUFFER_DATA_LENGTH(curNb);
    > 
    >                  if (packetLength <= tunnelSize) {
    > 
    >                      return NDIS_STATUS_INVALID_LENGTH;
    > 
    >             @@ -295,13 +301,13 @@ NDIS_STATUS
    > OvsDecapGeneve(POVS_SWITCH_CONTEXT switchContext,
    > 
    > 
    > 
    >                  ethHdr = (EthHdr *)bufferStart;
    > 
    >                  /* XXX: Handle IP options. */
    > 
    >             -    ipHdr = (IPHdr *)((PCHAR)ethHdr + sizeof *ethHdr);
    > 
    >             +    ipHdr = (IPHdr *)(bufferStart + layers.l3Offset);
    > 
    >                  tunKey->src = ipHdr->saddr;
    > 
    >                  tunKey->dst = ipHdr->daddr;
    > 
    >                  tunKey->tos = ipHdr->tos;
    > 
    >                  tunKey->ttl = ipHdr->ttl;
    > 
    >                  tunKey->pad = 0;
    > 
    >             -    udpHdr = (UDPHdr *)((PCHAR)ipHdr + sizeof *ipHdr);
    > 
    >             +    udpHdr = (UDPHdr *)(bufferStart + layers.l4Offset);
    > 
    > 
    > 
    >                  /* Validate if NIC has indicated checksum failure. */
    > 
    >                  status = OvsValidateUDPChecksum(curNbl, udpHdr->check == 0);
    > 
    >             @@ -312,7 +318,7 @@ NDIS_STATUS
    > OvsDecapGeneve(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);
    > 
    >             +                                         packetLength, &layers);
    > 
    >                      tunKey->flags |= OVS_TNL_F_CSUM;
    > 
    >                      if (status != NDIS_STATUS_SUCCESS) {
    > 
    >                          goto dropNbl;
    > 
    >             diff --git a/datapath-windows/ovsext/Geneve.h b/datapath-
    > windows/ovsext/Geneve.h
    > 
    >             index 019c0dd..db758dd 100644
    > 
    >             --- a/datapath-windows/ovsext/Geneve.h
    > 
    >             +++ b/datapath-windows/ovsext/Geneve.h
    > 
    >             @@ -113,6 +113,12 @@ OvsGetGeneveTunHdrMaxSize(VOID)
    > 
    >                  return OvsGetGeneveTunHdrMinSize() + TUN_OPT_MAX_LEN;
    > 
    >              }
    > 
    > 
    > 
    >             +static __inline UINT32
    > 
    >             +OvsGetGeneveTunHdrSizeFromLayers(POVS_PACKET_HDR_INFO
    > layers)
    > 
    >             +{
    > 
    >             +    return layers->l7Offset + sizeof(GeneveHdr);
    > 
    >             +}
    > 
    >             +
    > 
    >              #define GENEVE_UDP_PORT 6081
    > 
    >              #define GENEVE_UDP_PORT_NBO 0xC117
    > 
    >              #define GENEVE_VER 0
    > 
    >             diff --git a/datapath-windows/ovsext/Gre.c b/datapath-
    > windows/ovsext/Gre.c
    > 
    >             index f095742..1f38ee7 100644
    > 
    >             --- a/datapath-windows/ovsext/Gre.c
    > 
    >             +++ b/datapath-windows/ovsext/Gre.c
    > 
    >             @@ -317,35 +317,42 @@ OvsDecapGre(POVS_SWITCH_CONTEXT
    > switchContext,
    > 
    >                  GREHdr *greHdr;
    > 
    >                  UINT32 tunnelSize, packetLength;
    > 
    >                  UINT32 headRoom = 0;
    > 
    >             +    UINT32 maxGreLen;
    > 
    >                  PUINT8 bufferStart;
    > 
    >                  NDIS_STATUS status = NDIS_STATUS_SUCCESS;
    > 
    >                  PCHAR tempBuf = NULL;
    > 
    >             +    OVS_PACKET_HDR_INFO layers;
    > 
    > 
    > 
    >                  ASSERT(*newNbl == NULL);
    > 
    > 
    > 
    >                  *newNbl = NULL;
    > 
    >             +    status = OvsExtractLayers(curNbl, &layers);
    > 
    >             +    if (status != NDIS_STATUS_SUCCESS) {
    > 
    >             +        return status;
    > 
    >             +    }
    > 
    > 
    > 
    >                  curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
    > 
    >                  packetLength = NET_BUFFER_DATA_LENGTH(curNb);
    > 
    >                  curMdl = NET_BUFFER_CURRENT_MDL(curNb);
    > 
    >             -    tunnelSize = GreTunHdrSize(0);
    > 
    >             +    tunnelSize = GreTunHdrSizeFromLayers(0, &layers);
    > 
    >                  if (packetLength <= tunnelSize) {
    > 
    >                      return NDIS_STATUS_INVALID_LENGTH;
    > 
    >                  }
    > 
    > 
    > 
    >             +    maxGreLen = GreMaxLengthFromLayers(&layers);
    > 
    >                  /* Get a contiguous buffer for the maximum length of a GRE header
    > */
    > 
    >             -    bufferStart = NdisGetDataBuffer(curNb, OVS_MAX_GRE_LGTH,
    > NULL, 1, 0);
    > 
    >             +    bufferStart = NdisGetDataBuffer(curNb, maxGreLen, NULL, 1, 0);
    > 
    >                  if (!bufferStart) {
    > 
    >                      /* Documentation is unclear on where the packet can be
    > fragmented.
    > 
    >                       * For the moment allocate the buffer needed to get the
    > maximum length
    > 
    >                       * of a GRE header contiguous */
    > 
    >             -        tempBuf = OvsAllocateMemoryWithTag(OVS_MAX_GRE_LGTH,
    > OVS_GRE_POOL_TAG);
    > 
    >             +        tempBuf = OvsAllocateMemoryWithTag(maxGreLen,
    > OVS_GRE_POOL_TAG);
    > 
    >                      if (!tempBuf) {
    > 
    >                          status = NDIS_STATUS_RESOURCES;
    > 
    >                          goto end;
    > 
    >                      }
    > 
    >             -        RtlZeroMemory(tempBuf, OVS_MAX_GRE_LGTH);
    > 
    >             -        bufferStart = NdisGetDataBuffer(curNb, OVS_MAX_GRE_LGTH,
    > tempBuf,
    > 
    >             +        RtlZeroMemory(tempBuf, maxGreLen);
    > 
    >             +        bufferStart = NdisGetDataBuffer(curNb, maxGreLen, tempBuf,
    > 
    >                                                      1, 0);
    > 
    >                      if (!bufferStart) {
    > 
    >                          status = NDIS_STATUS_RESOURCES;
    > 
    >             @@ -354,9 +361,9 @@ OvsDecapGre(POVS_SWITCH_CONTEXT
    > switchContext,
    > 
    >                  }
    > 
    > 
    > 
    >                  ethHdr = (EthHdr *)bufferStart;
    > 
    >             -    headRoom += sizeof *ethHdr;
    > 
    >             +    headRoom += layers.l3Offset;
    > 
    > 
    > 
    >             -    ipHdr = (IPHdr *)((PCHAR)ethHdr + sizeof *ethHdr);
    > 
    >             +    ipHdr = (IPHdr *)(bufferStart + layers.l3Offset);
    > 
    >                  tunKey->src = ipHdr->saddr;
    > 
    >                  tunKey->dst = ipHdr->daddr;
    > 
    >                  tunKey->tos = ipHdr->tos;
    > 
    >             @@ -364,10 +371,10 @@ OvsDecapGre(POVS_SWITCH_CONTEXT
    > switchContext,
    > 
    >                  tunKey->pad = 0;
    > 
    >                  headRoom += sizeof *ipHdr;
    > 
    > 
    > 
    >             -    greHdr = (GREHdr *)((PCHAR)ipHdr + sizeof *ipHdr);
    > 
    >             +    greHdr = (GREHdr *)(bufferStart + layers.l4Offset);
    > 
    >                  headRoom += sizeof *greHdr;
    > 
    > 
    > 
    >             -    tunnelSize = GreTunHdrSize(greHdr->flags);
    > 
    >             +    tunnelSize = GreTunHdrSizeFromLayers(greHdr->flags, &layers);
    > 
    > 
    > 
    >                  /* Verify the packet length after looking at the GRE flags*/
    > 
    >                  if (packetLength <= tunnelSize) {
    > 
    >             @@ -390,8 +397,8 @@ OvsDecapGre(POVS_SWITCH_CONTEXT
    > switchContext,
    > 
    >                      UINT16 chksum =
    > 
    >                          CalculateChecksumNB(curNb,
    > 
    >                                              (UINT16)(NET_BUFFER_DATA_LENGTH(curNb) -
    > 
    >             -                                (ipHdr->ihl * 4 + sizeof *ethHdr)),
    > 
    >             -                                ipHdr->ihl * 4 + sizeof *ethHdr);
    > 
    >             +                                layers.l4Offset),
    > 
    >             +                                layers.l4Offset);
    > 
    >                      if (prevChksum != chksum) {
    > 
    >                          status = STATUS_NDIS_INVALID_PACKET;
    > 
    >                          goto end;
    > 
    >             diff --git a/datapath-windows/ovsext/Gre.h b/datapath-
    > windows/ovsext/Gre.h
    > 
    >             index c45df8f..45f3f59 100644
    > 
    >             --- a/datapath-windows/ovsext/Gre.h
    > 
    >             +++ b/datapath-windows/ovsext/Gre.h
    > 
    >             @@ -103,4 +103,20 @@ GreTunHdrSize(UINT16 flags)
    > 
    >                  return sum;
    > 
    >              }
    > 
    > 
    > 
    >             +static __inline UINT32
    > 
    >             +GreTunHdrSizeFromLayers(UINT16 flags, POVS_PACKET_HDR_INFO
    > layers)
    > 
    >             +{
    > 
    >             +    UINT32 sum = layers->l4Offset + sizeof(GREHdr);
    > 
    >             +    sum += (flags & GRE_CSUM) ? 4 : 0;
    > 
    >             +    sum += (flags & GRE_KEY) ? 4 : 0;
    > 
    >             +
    > 
    >             +    return sum;
    > 
    >             +}
    > 
    >             +
    > 
    >             +static __inline UINT32
    > 
    >             +GreMaxLengthFromLayers(POVS_PACKET_HDR_INFO layers)
    > 
    >             +{
    > 
    >             +    return (layers->l4Offset + sizeof(GREHdr) + 12);
    > 
    >             +}
    > 
    >             +
    > 
    >              #endif /*__GRE_H_ */
    > 
    >             diff --git a/datapath-windows/ovsext/Offload.c b/datapath-
    > windows/ovsext/Offload.c
    > 
    >             index 0905c80..7b75e0a 100644
    > 
    >             --- a/datapath-windows/ovsext/Offload.c
    > 
    >             +++ b/datapath-windows/ovsext/Offload.c
    > 
    >             @@ -612,7 +612,8 @@ OvsCalculateUDPChecksum(PNET_BUFFER_LIST
    > curNbl,
    > 
    >                                      PNET_BUFFER curNb,
    > 
    >                                      IPHdr *ipHdr,
    > 
    >                                      UDPHdr *udpHdr,
    > 
    >             -                        UINT32 packetLength)
    > 
    >             +                        UINT32 packetLength,
    > 
    >             +                        POVS_PACKET_HDR_INFO layers)
    > 
    >              {
    > 
    >                  NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
    > 
    >                  UINT16 checkSum;
    > 
    >             @@ -625,16 +626,17 @@
    > OvsCalculateUDPChecksum(PNET_BUFFER_LIST curNbl,
    > 
    > 
    > 
    >                      checkSum = udpHdr->check;
    > 
    > 
    > 
    >             -        l4Payload = packetLength - sizeof(EthHdr) - ipHdr->ihl * 4;
    > 
    >             +        l4Payload = packetLength - layers->l4Offset;
    > 
    >                      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);
    > 
    >             +                                            layers->l4Offset);
    > 
    >                      if (checkSum != udpHdr->check) {
    > 
    >             -            OVS_LOG_TRACE("UDP checksum incorrect.");
    > 
    >             +            OVS_LOG_ERROR("UDP checksum incorrect, expected %u, got
    > %u",
    > 
    >             +                          udpHdr->check, checkSum);
    > 
    >                          return NDIS_STATUS_INVALID_PACKET;
    > 
    >                      }
    > 
    >                  }
    > 
    >             diff --git a/datapath-windows/ovsext/Offload.h b/datapath-
    > windows/ovsext/Offload.h
    > 
    >             index d3731b1..b2a0b6f 100644
    > 
    >             --- a/datapath-windows/ovsext/Offload.h
    > 
    >             +++ b/datapath-windows/ovsext/Offload.h
    > 
    >             @@ -39,7 +39,8 @@ NDIS_STATUS
    > OvsCalculateUDPChecksum(PNET_BUFFER_LIST curNbl,
    > 
    >                                                  PNET_BUFFER curNb,
    > 
    >                                                  IPHdr *ipHdr,
    > 
    >                                                  UDPHdr *udpHdr,
    > 
    >             -                                    UINT32 packetLength);
    > 
    >             +                                    UINT32 packetLength,
    > 
    >             +                                    POVS_PACKET_HDR_INFO layers);
    > 
    > 
    > 
    >              ULONG OVSGetTcpMSS(PNET_BUFFER_LIST nbl);
    > 
    > 
    > 
    >             diff --git a/datapath-windows/ovsext/Stt.c b/datapath-
    > windows/ovsext/Stt.c
    > 
    >             index f98070f..8eb7167 100644
    > 
    >             --- a/datapath-windows/ovsext/Stt.c
    > 
    >             +++ b/datapath-windows/ovsext/Stt.c
    > 
    >             @@ -415,9 +415,23 @@ ret_error:
    > 
    >               *----------------------------------------------------------------------------
    > 
    >               */
    > 
    >              static __inline NDIS_STATUS
    > 
    >             -OvsValidateTCPChecksum(PNET_BUFFER_LIST curNbl, PNET_BUFFER
    > curNb)
    > 
    >             +OvsValidateTCPChecksum(PNET_BUFFER_LIST curNbl,
    > 
    >             +                       PNET_BUFFER curNb,
    > 
    >             +                       POVS_PACKET_HDR_INFO layers)
    > 
    >              {
    > 
    >             +    PUINT8 buf;
    > 
    >             +    PMDL curMdl;
    > 
    >                  NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
    > 
    >             +    NDIS_STATUS status;
    > 
    >             +
    > 
    >             +    curMdl = NET_BUFFER_CURRENT_MDL(curNb);
    > 
    >             +    buf = (PUINT8)MmGetSystemAddressForMdlSafe(curMdl,
    > LowPagePriority)
    > 
    >             +        + NET_BUFFER_CURRENT_MDL_OFFSET(curNb);
    > 
    >             +    if (!buf) {
    > 
    >             +        status = NDIS_STATUS_INVALID_PACKET;
    > 
    >             +        return status;
    > 
    >             +    }
    > 
    >             +
    > 
    >                  csumInfo.Value = NET_BUFFER_LIST_INFO(curNbl,
    > 
    >                                                        TcpIpChecksumNetBufferListInfo);
    > 
    > 
    > 
    >             @@ -433,23 +447,22 @@
    > OvsValidateTCPChecksum(PNET_BUFFER_LIST curNbl, PNET_BUFFER curNb)
    > 
    >                      return NDIS_STATUS_SUCCESS;
    > 
    >                  }
    > 
    > 
    > 
    >             -    EthHdr *eth = (EthHdr *)NdisGetDataBuffer(curNb, sizeof(EthHdr),
    > 
    >             -                                              NULL, 1, 0);
    > 
    >             -    if (eth == NULL) {
    > 
    >             +    EthHdr *ethHdr = (EthHdr *)buf;
    > 
    >             +    if (ethHdr == NULL) {
    > 
    >                      return NDIS_STATUS_RESOURCES;
    > 
    >                  }
    > 
    > 
    > 
    >             -    if (eth->Type == ntohs(NDIS_ETH_TYPE_IPV4)) {
    > 
    >             -        IPHdr *ip = (IPHdr *)((PCHAR)eth + sizeof *eth);
    > 
    >             -        UINT32 l4Payload = ntohs(ip->tot_len) - ip->ihl * 4;
    > 
    >             -        TCPHdr *tcp = (TCPHdr *)((PCHAR)ip + ip->ihl * 4);
    > 
    >             +    if (ethHdr->Type == ntohs(NDIS_ETH_TYPE_IPV4)) {
    > 
    >             +        IPHdr *ipHdr = (IPHdr *)(buf + layers->l3Offset);
    > 
    >             +        UINT32 l4Payload = ntohs(ipHdr->tot_len) - ipHdr->ihl * 4;
    > 
    >             +        TCPHdr *tcp = (TCPHdr *)(buf + layers->l4Offset);
    > 
    >                      checkSum = tcp->check;
    > 
    > 
    > 
    >                      tcp->check = 0;
    > 
    >             -        tcp->check = IPPseudoChecksum(&ip->saddr, &ip->daddr,
    > 
    >             +        tcp->check = IPPseudoChecksum(&ipHdr->saddr, &ipHdr->daddr,
    > 
    >                                                    IPPROTO_TCP, (UINT16)l4Payload);
    > 
    >                      tcp->check = CalculateChecksumNB(curNb, (UINT16)(l4Payload),
    > 
    >             -                                         sizeof(EthHdr) + ip->ihl * 4);
    > 
    >             +                                         layers->l4Offset);
    > 
    >                      if (checkSum != tcp->check) {
    > 
    >                          return NDIS_STATUS_INVALID_PACKET;
    > 
    >                      }
    > 
    >             @@ -912,18 +925,24 @@ OvsDecapStt(POVS_SWITCH_CONTEXT
    > switchContext,
    > 
    >                  SttHdr *sttHdr;
    > 
    >                  char *sttBuf[STT_HDR_LEN];
    > 
    >                  UINT32 advanceCnt, hdrLen;
    > 
    >             +    OVS_PACKET_HDR_INFO layers = { 0 };
    > 
    >             +
    > 
    >             +    status = OvsExtractLayers(curNbl, &layers);
    > 
    >             +    if (status != NDIS_STATUS_SUCCESS) {
    > 
    >             +        return status;
    > 
    >             +    }
    > 
    > 
    > 
    >                  curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
    > 
    >                  ASSERT(NET_BUFFER_NEXT_NB(curNb) == NULL);
    > 
    > 
    > 
    >                  /* Validate the TCP Checksum */
    > 
    >             -    status = OvsValidateTCPChecksum(curNbl, curNb);
    > 
    >             +    status = OvsValidateTCPChecksum(curNbl, curNb, &layers);
    > 
    >                  if (status != NDIS_STATUS_SUCCESS) {
    > 
    >                      return status;
    > 
    >                  }
    > 
    > 
    > 
    >                  /* Skip Eth header */
    > 
    >             -    hdrLen = sizeof(EthHdr);
    > 
    >             +    hdrLen = layers.l3Offset;
    > 
    >                  NdisAdvanceNetBufferDataStart(curNb, hdrLen, FALSE, NULL);
    > 
    >                  advanceCnt = hdrLen;
    > 
    > 
    > 
    >             @@ -996,7 +1015,6 @@ OvsDecapStt(POVS_SWITCH_CONTEXT
    > switchContext,
    > 
    >                  tunKey->pad = 0;
    > 
    > 
    > 
    >                  /* Handle ECN */
    > 
    >             -    OVS_PACKET_HDR_INFO layers = {0};
    > 
    >                  if (0 != ipHdr->tos) {
    > 
    >                      status = OvsExtractLayers(*newNbl, &layers);
    > 
    >                      if (status != NDIS_STATUS_SUCCESS) {
    > 
    >             diff --git a/datapath-windows/ovsext/Stt.h b/datapath-
    > windows/ovsext/Stt.h
    > 
    >             index 988a1c1..2999dcf 100644
    > 
    >             --- a/datapath-windows/ovsext/Stt.h
    > 
    >             +++ b/datapath-windows/ovsext/Stt.h
    > 
    >             @@ -115,4 +115,10 @@ OvsGetSttTunHdrSize(VOID)
    > 
    >                                STT_HDR_LEN;
    > 
    >              }
    > 
    > 
    > 
    >             +static __inline UINT32
    > 
    >             +OvsGetSttTunHdrSizeFromLayers(POVS_PACKET_HDR_INFO layers)
    > 
    >             +{
    > 
    >             +    return layers->l7Offset + STT_HDR_LEN;
    > 
    >             +}
    > 
    >             +
    > 
    >              #endif /*__OVS_STT_H_ */
    > 
    >             diff --git a/datapath-windows/ovsext/Vxlan.c b/datapath-
    > windows/ovsext/Vxlan.c
    > 
    >             index f66a7e5..47c734e 100644
    > 
    >             --- a/datapath-windows/ovsext/Vxlan.c
    > 
    >             +++ b/datapath-windows/ovsext/Vxlan.c
    > 
    >             @@ -391,11 +391,17 @@ OvsDecapVxlan(POVS_SWITCH_CONTEXT
    > switchContext,
    > 
    >                  UINT32 tunnelSize, packetLength;
    > 
    >                  PUINT8 bufferStart;
    > 
    >                  NDIS_STATUS status;
    > 
    >             +    OVS_PACKET_HDR_INFO layers = { 0 };
    > 
    >             +
    > 
    >             +    status = OvsExtractLayers(curNbl, &layers);
    > 
    >             +    if (status != NDIS_STATUS_SUCCESS) {
    > 
    >             +        return status;
    > 
    >             +    }
    > 
    > 
    > 
    >                  /* Check the length of the UDP payload */
    > 
    >                  curNb = NET_BUFFER_LIST_FIRST_NB(curNbl);
    > 
    >                  packetLength = NET_BUFFER_DATA_LENGTH(curNb);
    > 
    >             -    tunnelSize = OvsGetVxlanTunHdrSize();
    > 
    >             +    tunnelSize = OvsGetVxlanTunHdrSizeFromLayers(&layers);
    > 
    >                  if (packetLength < tunnelSize) {
    > 
    >                      return NDIS_STATUS_INVALID_LENGTH;
    > 
    >                  }
    > 
    >             @@ -424,13 +430,13 @@ OvsDecapVxlan(POVS_SWITCH_CONTEXT
    > switchContext,
    > 
    > 
    > 
    >                  ethHdr = (EthHdr *)bufferStart;
    > 
    >                  /* XXX: Handle IP options. */
    > 
    >             -    ipHdr = (IPHdr *)((PCHAR)ethHdr + sizeof *ethHdr);
    > 
    >             +    ipHdr = (IPHdr *)(bufferStart + layers.l3Offset);
    > 
    >                  tunKey->src = ipHdr->saddr;
    > 
    >                  tunKey->dst = ipHdr->daddr;
    > 
    >                  tunKey->tos = ipHdr->tos;
    > 
    >                  tunKey->ttl = ipHdr->ttl;
    > 
    >                  tunKey->pad = 0;
    > 
    >             -    udpHdr = (UDPHdr *)((PCHAR)ipHdr + sizeof *ipHdr);
    > 
    >             +    udpHdr = (UDPHdr *)(bufferStart + layers.l4Offset);
    > 
    > 
    > 
    >                  /* Validate if NIC has indicated checksum failure. */
    > 
    >                  status = OvsValidateUDPChecksum(curNbl, udpHdr->check == 0);
    > 
    >             @@ -442,7 +448,7 @@ OvsDecapVxlan(POVS_SWITCH_CONTEXT
    > switchContext,
    > 
    >                  if (udpHdr->check != 0) {
    > 
    >                      tunKey->flags |= OVS_TNL_F_CSUM;
    > 
    >                      status = OvsCalculateUDPChecksum(curNbl, curNb, ipHdr, udpHdr,
    > 
    >             -                                         packetLength);
    > 
    >             +                                         packetLength, &layers);
    > 
    >                      if (status != NDIS_STATUS_SUCCESS) {
    > 
    >                          goto dropNbl;
    > 
    >                      }
    > 
    >             diff --git a/datapath-windows/ovsext/Vxlan.h b/datapath-
    > windows/ovsext/Vxlan.h
    > 
    >             index f4a8bce..e2fb2dc 100644
    > 
    >             --- a/datapath-windows/ovsext/Vxlan.h
    > 
    >             +++ b/datapath-windows/ovsext/Vxlan.h
    > 
    >             @@ -85,6 +85,12 @@ OvsGetVxlanTunHdrSize(VOID)
    > 
    >                         sizeof (VXLANHdr);
    > 
    >              }
    > 
    > 
    > 
    >             +static __inline UINT32
    > 
    >             +OvsGetVxlanTunHdrSizeFromLayers(POVS_PACKET_HDR_INFO
    > layers)
    > 
    >             +{
    > 
    >             +    return layers->l7Offset + sizeof(VXLANHdr);
    > 
    >             +}
    > 
    >             +
    > 
    >              #define VXLAN_UDP_PORT 4789
    > 
    >              #define VXLAN_UDP_PORT_NBO 0xB512
    > 
    > 
    > 
    >             --
    > 
    >             2.9.3.windows.2
    > 
    > 
    > 
    >             _______________________________________________
    > 
    >             dev mailing list
    > 
    >             dev at openvswitch.org
    > 
    >             https://urldefense.proofpoint.com/v2/url?u=https-
    > 3A__mail.openvswitch.org_mailman_listinfo_ovs-
    > 2Ddev&d=DwICAg&c=uilaK90D4TOVoH58JNXRgQ&r=Q5z9tBe-
    > nAOpE7LIHSPV8uy5-
    > 437agMXvkeHHMkR8Us&m=D0utmw3G7vLMAP0UXCFgKRcy931hJWPgIXKM
    > grmGJqM&s=jmbejHYt1Q1p8EvSxBKvLnOwA2vantRX8ojkYb6dTGg&e=
    > 
    > 
    > 
    > 
    > 
    > 
    > 
    > 
    > 
    > 
    > 
    > 
    > 
    >     _______________________________________________
    >     dev mailing list
    >     dev at openvswitch.org
    >     https://urldefense.proofpoint.com/v2/url?u=https-
    > 3A__mail.openvswitch.org_mailman_listinfo_ovs-
    > 2Ddev&d=DwIGaQ&c=uilaK90D4TOVoH58JNXRgQ&r=6OuVHk-
    > mnufSWzkKa74UkQ&m=69x7AUStqbwRjJUoJFIuYtelOvIdpscbhCBsEqud1TM
    > &s=2sTWUsTsIC76cA-S4CRfkCqa9ItksgvVH-I0vmOXKTc&e=
    > 
    
    



More information about the dev mailing list