From bfc27f614262c54fd7fb3b47bb5a3c7d714e9e59 Mon Sep 17 00:00:00 2001 From: Paul Boca Date: Mon, 6 Jun 2016 16:45:04 +0000 Subject: datapath-windows: Add VLAN support to STT Add VLAN to STT header and on receive applyit to encapsulated packet Signed-off-by: Paul-Daniel Boca Acked-by: Sairam Venugopal Signed-off-by: Ben Pfaff --- datapath-windows/ovsext/Stt.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'datapath-windows/ovsext/Stt.c') diff --git a/datapath-windows/ovsext/Stt.c b/datapath-windows/ovsext/Stt.c index c93db7548..934525510 100644 --- a/datapath-windows/ovsext/Stt.c +++ b/datapath-windows/ovsext/Stt.c @@ -156,6 +156,7 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport, PUINT8 bufferStart; ULONG mss = 0; NDIS_TCP_LARGE_SEND_OFFLOAD_NET_BUFFER_LIST_INFO lsoInfo; + PVOID vlanTagValue; curNb = NET_BUFFER_LIST_FIRST_NB(curNbl); @@ -173,6 +174,7 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport, NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo; csumInfo.Value = NET_BUFFER_LIST_INFO(curNbl, TcpIpChecksumNetBufferListInfo); + vlanTagValue = NET_BUFFER_LIST_INFO(curNbl, Ieee8021QNetBufferListInfo); *newNbl = OvsPartialCopyNBL(switchContext, curNbl, 0, headRoom, FALSE /*copy NblInfo*/); if (*newNbl == NULL) { @@ -310,8 +312,16 @@ OvsDoEncapStt(POVS_VPORT_ENTRY vport, sttHdr->mss = 0; } - sttHdr->reserved = 0; + /* Set VLAN tag */ sttHdr->vlanTCI = 0; + if (vlanTagValue) { + PNDIS_NET_BUFFER_LIST_8021Q_INFO vlanTag = + (PNDIS_NET_BUFFER_LIST_8021Q_INFO)(PVOID *)&vlanTagValue; + sttHdr->vlanTCI = htons(vlanTag->TagHeader.VlanId | OVSWIN_VLAN_CFI | + (vlanTag->TagHeader.UserPriority << 13)); + } + + sttHdr->reserved = 0; sttHdr->key = tunKey->tunnelId; /* Zero out stt padding */ *(uint16 *)(sttHdr + 1) = 0; @@ -899,6 +909,16 @@ OvsDecapStt(POVS_SWITCH_CONTEXT switchContext, tunKey->ttl = ipHdr->ttl; tunKey->pad = 0; + /* Apply VLAN tag if present */ + if (ntohs(sttHdr->vlanTCI) & OVSWIN_VLAN_CFI) { + NDIS_NET_BUFFER_LIST_8021Q_INFO vlanTag; + vlanTag.Value = 0; + vlanTag.TagHeader.VlanId = ntohs(sttHdr->vlanTCI) & 0xfff; + vlanTag.TagHeader.UserPriority = ntohs(sttHdr->vlanTCI) >> 13; + NET_BUFFER_LIST_INFO(*newNbl, + Ieee8021QNetBufferListInfo) = vlanTag.Value; + } + /* Set Checksum and LSO offload flags */ OvsDecapSetOffloads(newNbl, sttHdr); -- cgit v1.2.1