summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Stt.c
diff options
context:
space:
mode:
authorPaul Boca <pboca@cloudbasesolutions.com>2016-06-06 16:45:04 +0000
committerBen Pfaff <blp@ovn.org>2016-06-07 10:52:17 -0700
commitbfc27f614262c54fd7fb3b47bb5a3c7d714e9e59 (patch)
treeac7876c76bada58ed89d0bff9069120447e0c049 /datapath-windows/ovsext/Stt.c
parentc3e85147d9067c9c19451ad36505bcf70eb470b9 (diff)
downloadopenvswitch-bfc27f614262c54fd7fb3b47bb5a3c7d714e9e59.tar.gz
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 <pboca@cloudbasesolutions.com> Acked-by: Sairam Venugopal <vsairam@vmware.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'datapath-windows/ovsext/Stt.c')
-rw-r--r--datapath-windows/ovsext/Stt.c22
1 files changed, 21 insertions, 1 deletions
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);