#define PRODUCT_VERSION 1,1,5,PRODUCT_BUILD_NUMBER_NUMERIC
#elif defined(VMX86_VPX)
/* this should be kept in sync with the corresponding vpx branch. */
- #define PRODUCT_VERSION 6,6,3,PRODUCT_BUILD_NUMBER_NUMERIC
+ #define PRODUCT_VERSION 6,6,4,PRODUCT_BUILD_NUMBER_NUMERIC
#elif defined(VMX86_HORIZON_VIEW)
#define PRODUCT_VERSION 0,0,0,PRODUCT_BUILD_NUMBER_NUMERIC
// VMX86_DESKTOP must be last because it is the default and is always defined.
*/
#define ESX_VERSION_MAJOR "6"
#define ESX_VERSION_MINOR "6"
-#define ESX_VERSION_MAINT "3"
+#define ESX_VERSION_MAINT "4"
#define ESX_VERSION ESX_VERSION_MAJOR "." ESX_VERSION_MINOR "." \
ESX_VERSION_MAINT
#define ESX_VERSION_THIRD_PARTY ESX_VERSION_MAJOR ESX_VERSION_MINOR \
#define SYSIMAGE_VERSION_EXT_STR \
SYSIMAGE_VERSION "." PRODUCT_BUILD_NUMBER_NUMERIC_STRING
-#define VIM_VERSION "6.6.3"
+#define VIM_VERSION "6.6.4"
/*
*For smooth version bump up for quaterly releases, we need to have a fallback
*mechanism to previous version in all those components which perform version
6.0.0,\
6.5.0"
// Put VPX_VERSION first, because vpx/make/defs.mk doesn't check for suffix.
-#define VPX_VERSION "6.6.3"
+#define VPX_VERSION "6.6.4"
#define VPX_VERSION_MAJOR "6"
#define VPX_VERSION_MINOR "6"
-#define VPX_VERSION_MAINT "3"
+#define VPX_VERSION_MAINT "4"
#define VPX_VERSION_THIRD_PARTY VPX_VERSION_MAJOR VPX_VERSION_MINOR \
VPX_VERSION_MAINT
-#define VPX_VERSION_NUMERIC 6,6,3,PRODUCT_BUILD_NUMBER_NUMERIC
+#define VPX_VERSION_NUMERIC 6,6,4,PRODUCT_BUILD_NUMBER_NUMERIC
// Last supported ESX version by VC.
#define VPX_MIN_HOST_VERSION "6.0.0"
#define MAX_SUPPORTED_VI_VERSION "6.6" //from ovfTool/src/supportedVersions.h
-#define VCDB_CURRENT_SCHEMA_VERSION 663 // from PitCADatabase.h
+#define VCDB_CURRENT_SCHEMA_VERSION 664 // from PitCADatabase.h
#define VPX_RELEASE_UPDATE "0" /* 0 = Pre-release/GA, 1 = Update 1 */
#define VPX_RELEASE_PATCH "0" /* 0 = experimental */
#define VPX_RELEASE VPX_RELEASE_UPDATE "." VPX_RELEASE_PATCH
/* expected database version for current release */
-#define VPXD_VDB_DB_VERSION_ID 663
+#define VPXD_VDB_DB_VERSION_ID 664
#define VPXD_VDB_DB_VERSION_VALUE "VirtualCenter Database 6.6"
// Virtual Appliance Patch Version Number
ETH_HEADER_TYPE_802_1PQ,
ETH_HEADER_TYPE_802_3,
ETH_HEADER_TYPE_802_1PQ_802_3,
+ ETH_HEADER_TYPE_NESTED_802_1PQ,
} Eth_HdrType;
// DIX type fields we care about
union {
Eth_DIX dix; // DIX header follows
Eth_802_3 e802_3; // or 802.3 header follows
+ struct {
+ Eth_802_1pq_Tag tag; // inner VLAN/QOS tag
+ Eth_DIX dix; // DIX header follows
+ } nested802_1pq;
};
}
#include "vmware_pack_end.h"
sizeof(Eth_Address) + \
sizeof(Eth_802_1pq_Tag) + \
sizeof(Eth_802_3))
+#define ETH_HEADER_LEN_NESTED_802_1PQ (sizeof(Eth_Address) + \
+ sizeof(Eth_Address) + \
+ sizeof(Eth_802_1pq_Tag) + \
+ sizeof(Eth_802_1pq_Tag) + \
+ sizeof(Eth_DIX))
#define ETH_MIN_HEADER_LEN (ETH_HEADER_LEN_DIX)
#define ETH_MAX_HEADER_LEN (ETH_HEADER_LEN_802_1PQ_802_3)
*
* ETH_HEADER_TYPE_DIX: typical 14 byte eth header
* ETH_HEADER_TYPE_802_1PQ: DIX+vlan tagging
+ * ETH_HEADER_TYPE_NESTED_802_1PQ: DIX+vlan tagging+DIX+vlan tagging
* ETH_HEADER_TYPE_802_3: 802.3 eth header
* ETH_HEADER_TYPE_802_1PQ_802_3: 802.3 + vlan tag
*
* vlan tagging with dix style type
*/
+ if (UNLIKELY(eh->e802_1pq.dix.typeNBO == ETH_TYPE_802_1PQ_NBO)) {
+ return ETH_HEADER_TYPE_NESTED_802_1PQ;
+ }
+
return ETH_HEADER_TYPE_802_1PQ;
}
Eth_HdrType type = Eth_HeaderType(eh);
switch (type) {
-
- case ETH_HEADER_TYPE_DIX :
- return eh->dix.typeNBO;
+ case ETH_HEADER_TYPE_DIX :
+ return eh->dix.typeNBO;
- case ETH_HEADER_TYPE_802_1PQ :
- return eh->e802_1pq.dix.typeNBO;
+ case ETH_HEADER_TYPE_802_1PQ :
+ return eh->e802_1pq.dix.typeNBO;
- case ETH_HEADER_TYPE_802_3 :
- /*
- * Documentation describes SNAP headers as having ONLY
- * 0x03 as the control fields, not just the lower two bits
- * This prevents the use of Eth_IsLLCControlUFormat.
- */
- if ((eh->e802_3.llc.dsap == 0xaa) &&
- (eh->e802_3.llc.ssap == 0xaa) &&
- (eh->e802_3.llc.control == ETH_LLC_CONTROL_UFRAME)) {
- return eh->e802_3.snap.snapType.typeNBO;
- } else {
- // LLC, no snap header, then no type
- return ETH_TYPE_LLC;
- }
+ case ETH_HEADER_TYPE_NESTED_802_1PQ:
+ return eh->e802_1pq.nested802_1pq.dix.typeNBO;
- case ETH_HEADER_TYPE_802_1PQ_802_3 :
- if ((eh->e802_1pq.e802_3.llc.dsap == 0xaa) &&
- (eh->e802_1pq.e802_3.llc.ssap == 0xaa) &&
- (eh->e802_1pq.e802_3.llc.control == ETH_LLC_CONTROL_UFRAME)) {
- return eh->e802_1pq.e802_3.snap.snapType.typeNBO;
- } else {
- // tagged LLC, no snap header, then no type
- return ETH_TYPE_LLC;
- }
+ case ETH_HEADER_TYPE_802_3 :
+ /*
+ * Documentation describes SNAP headers as having ONLY
+ * 0x03 as the control fields, not just the lower two bits
+ * This prevents the use of Eth_IsLLCControlUFormat.
+ */
+ if ((eh->e802_3.llc.dsap == 0xaa) &&
+ (eh->e802_3.llc.ssap == 0xaa) &&
+ (eh->e802_3.llc.control == ETH_LLC_CONTROL_UFRAME)) {
+ return eh->e802_3.snap.snapType.typeNBO;
+ } else {
+ // LLC, no snap header, then no type
+ return ETH_TYPE_LLC;
+ }
+
+ case ETH_HEADER_TYPE_802_1PQ_802_3 :
+ if ((eh->e802_1pq.e802_3.llc.dsap == 0xaa) &&
+ (eh->e802_1pq.e802_3.llc.ssap == 0xaa) &&
+ (eh->e802_1pq.e802_3.llc.control == ETH_LLC_CONTROL_UFRAME)) {
+ return eh->e802_1pq.e802_3.snap.snapType.typeNBO;
+ } else {
+ // tagged LLC, no snap header, then no type
+ return ETH_TYPE_LLC;
+ }
}
ASSERT(FALSE);
Eth_HdrType type = Eth_HeaderType(eh);
switch (type) {
+ case ETH_HEADER_TYPE_DIX :
+ return ETH_HEADER_LEN_DIX;
- case ETH_HEADER_TYPE_DIX :
- return ETH_HEADER_LEN_DIX;
+ case ETH_HEADER_TYPE_802_1PQ :
+ return ETH_HEADER_LEN_802_1PQ;
- case ETH_HEADER_TYPE_802_1PQ :
- return ETH_HEADER_LEN_802_1PQ;
+ case ETH_HEADER_TYPE_NESTED_802_1PQ :
+ return ETH_HEADER_LEN_NESTED_802_1PQ;
- case ETH_HEADER_TYPE_802_3 :
- return Eth_HeaderLength_802_3(eh);
+ case ETH_HEADER_TYPE_802_3 :
+ return Eth_HeaderLength_802_3(eh);
- case ETH_HEADER_TYPE_802_1PQ_802_3 :
- return Eth_HeaderLength_802_1PQ_802_3(eh);
+ case ETH_HEADER_TYPE_802_1PQ_802_3 :
+ return Eth_HeaderLength_802_1PQ_802_3(eh);
}
ASSERT(FALSE);
if (len >= ETH_HEADER_LEN_802_1PQ) {
/*
* Eth_HeaderType will correctly enumerate all types once
- * at least ETH_HEADER_LEN_802_1PQ bytes are available
+ * at least ETH_HEADER_LEN_802_1PQ bytes are available except nested
+ * 802.1pq tag.
*/
Eth_HdrType type = Eth_HeaderType(eh);
- if (type == ETH_HEADER_TYPE_802_1PQ) {
+ switch (type) {
+ case ETH_HEADER_TYPE_802_1PQ:
if (ehHdrLen != NULL) {
*ehHdrLen = ETH_HEADER_LEN_802_1PQ;
}
return TRUE;
- } else if (type == ETH_HEADER_TYPE_802_3) {
+ case ETH_HEADER_TYPE_NESTED_802_1PQ:
+ if (ehHdrLen != NULL) {
+ *ehHdrLen = ETH_HEADER_LEN_NESTED_802_1PQ;
+ }
+ return len >= ETH_HEADER_LEN_NESTED_802_1PQ;
+
+ case ETH_HEADER_TYPE_802_3:
/*
* Length could be shorter LLC or LLC+SNAP.
* ETH_HEADER_LEN_802_2_LLC bytes are needed to disambiguate.
ASSERT(ETH_HEADER_LEN_802_1PQ > ETH_HEADER_LEN_802_2_LLC);
ehLen = Eth_HeaderLength_802_3(eh);
/* continue to common test */
- } else if (type == ETH_HEADER_TYPE_802_1PQ_802_3) {
+ break;
+
+ case ETH_HEADER_TYPE_802_1PQ_802_3:
if (len < ETH_HEADER_LEN_802_1PQ_LLC) {
return FALSE;
}
ehLen = Eth_HeaderLength_802_1PQ_802_3(eh);
/* continue to common test */
- } else {
+ break;
+
+ default:
/*
* This else clause is unreachable, but if removed
* compiler complains about ehLen possibly being