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:[email protected]]
> Sent: Tuesday, November 28, 2017 3:33 PM
> To: [email protected]; Alin Serdean
> <[email protected]>
> 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, "[email protected] on behalf of
> Shashank Ram" <[email protected] on behalf of
> [email protected]> 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" <[email protected]>
> wrote:
> 
> 
> 
>         Acked-by: Anand Kumar <[email protected]>
> 
> 
> 
>         Thanks,
> 
>         Anand Kumar
> 
> 
> 
>         On 11/20/17, 3:06 PM, "[email protected] on behalf of
> Shashank Ram" <[email protected] on behalf of
> [email protected]> 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 <[email protected]>
> 
>             ---
> 
>              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
> 
>             [email protected]
> 
>             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
>     [email protected]
>     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=
> 

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to