diff options
Diffstat (limited to 'datapath-windows')
-rw-r--r-- | datapath-windows/ovsext/Actions.c | 27 | ||||
-rw-r--r-- | datapath-windows/ovsext/Switch.c | 32 | ||||
-rw-r--r-- | datapath-windows/ovsext/Switch.h | 24 | ||||
-rw-r--r-- | datapath-windows/ovsext/Tunnel.c | 2 | ||||
-rw-r--r-- | datapath-windows/ovsext/Vport.c | 162 | ||||
-rw-r--r-- | datapath-windows/ovsext/Vport.h | 56 |
6 files changed, 93 insertions, 210 deletions
diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c index 180b6b88e..ab8b6736b 100644 --- a/datapath-windows/ovsext/Actions.c +++ b/datapath-windows/ovsext/Actions.c @@ -205,7 +205,7 @@ OvsDetectTunnelRxPkt(OvsForwardingContext *ovsFwdCtx, if (!flowKey->ipKey.nwFrag && flowKey->ipKey.nwProto == IPPROTO_UDP && flowKey->ipKey.l4.tpDst == VXLAN_UDP_PORT_NBO) { - tunnelVport = OvsGetTunnelVport(OVS_VPORT_TYPE_VXLAN); + tunnelVport = ovsFwdCtx->switchContext->vxlanVport; ovsActionStats.rxVxlan++; } @@ -271,9 +271,14 @@ OvsDetectTunnelPkt(OvsForwardingContext *ovsFwdCtx, * If the packet will not be encapsulated, consume the tunnel context * by clearing it. */ - if (ovsFwdCtx->srcVportNo != OVS_DEFAULT_PORT_NO && - !OvsIsVifVportNo(ovsFwdCtx->srcVportNo)) { - ovsFwdCtx->tunKey.dst = 0; + if (ovsFwdCtx->srcVportNo != OVS_DEFAULT_PORT_NO) { + + POVS_VPORT_ENTRY vport = OvsFindVportByPortNo( + ovsFwdCtx->switchContext, ovsFwdCtx->srcVportNo); + + if (!vport || vport->ovsType != OVS_VPORT_TYPE_NETDEV) { + ovsFwdCtx->tunKey.dst = 0; + } } /* Tunnel the packet only if tunnel context is set. */ @@ -1468,9 +1473,17 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext, PNL_ATTR queueAttr; POVS_PACKET_QUEUE_ELEM elem; UINT32 queueId = OVS_DEFAULT_PACKET_QUEUE; - //XXX confusing that portNo is actually portId for external port. - BOOLEAN isRecv = (portNo == switchContext->externalPortId) - || OvsIsTunnelVportNo(portNo); + BOOLEAN isRecv = FALSE; + + POVS_VPORT_ENTRY vport = OvsFindVportByPortNo(switchContext, + portNo); + + if (vport) { + if (vport->isExternal || + OvsIsTunnelVportType(vport->ovsType)) { + isRecv = TRUE; + } + } queueAttr = NlAttrFindNested(a, OVS_USERSPACE_ATTR_PID); userdataAttr = NlAttrFindNested(a, OVS_USERSPACE_ATTR_USERDATA); diff --git a/datapath-windows/ovsext/Switch.c b/datapath-windows/ovsext/Switch.c index 7d8aa7a1f..ac4a847bf 100644 --- a/datapath-windows/ovsext/Switch.c +++ b/datapath-windows/ovsext/Switch.c @@ -354,12 +354,12 @@ OvsInitSwitchContext(POVS_SWITCH_CONTEXT switchContext) switchContext->dispatchLock = NdisAllocateRWLock(switchContext->NdisFilterHandle); - switchContext->vportArray = - (PVOID *)OvsAllocateMemory(sizeof (PVOID) * OVS_MAX_VPORT_ARRAY_SIZE); + switchContext->portNoHashArray = (PLIST_ENTRY) + OvsAllocateMemory(sizeof(LIST_ENTRY) * OVS_MAX_VPORT_ARRAY_SIZE); switchContext->ovsPortNameHashArray = (PLIST_ENTRY) - OvsAllocateMemory(sizeof (LIST_ENTRY) * OVS_MAX_VPORT_ARRAY_SIZE); + OvsAllocateMemory(sizeof (LIST_ENTRY) * OVS_MAX_VPORT_ARRAY_SIZE); switchContext->portIdHashArray= (PLIST_ENTRY) - OvsAllocateMemory(sizeof (LIST_ENTRY) * OVS_MAX_VPORT_ARRAY_SIZE); + OvsAllocateMemory(sizeof (LIST_ENTRY) * OVS_MAX_VPORT_ARRAY_SIZE); status = OvsAllocateFlowTable(&switchContext->datapath, switchContext); if (status == NDIS_STATUS_SUCCESS) { @@ -367,14 +367,14 @@ OvsInitSwitchContext(POVS_SWITCH_CONTEXT switchContext) } if (status != NDIS_STATUS_SUCCESS || switchContext->dispatchLock == NULL || - switchContext->vportArray == NULL || + switchContext->portNoHashArray == NULL || switchContext->ovsPortNameHashArray == NULL || switchContext->portIdHashArray== NULL) { if (switchContext->dispatchLock) { NdisFreeRWLock(switchContext->dispatchLock); } - if (switchContext->vportArray) { - OvsFreeMemory(switchContext->vportArray); + if (switchContext->portNoHashArray) { + OvsFreeMemory(switchContext->portNoHashArray); } if (switchContext->ovsPortNameHashArray) { OvsFreeMemory(switchContext->ovsPortNameHashArray); @@ -395,13 +395,13 @@ OvsInitSwitchContext(POVS_SWITCH_CONTEXT switchContext) for (i = 0; i < OVS_MAX_VPORT_ARRAY_SIZE; i++) { InitializeListHead(&switchContext->portIdHashArray[i]); } - RtlZeroMemory(switchContext->vportArray, - sizeof (PVOID) * OVS_MAX_VPORT_ARRAY_SIZE); + for (i = 0; i < OVS_MAX_VPORT_ARRAY_SIZE; i++) { + InitializeListHead(&switchContext->portNoHashArray[i]); + } switchContext->isActivated = FALSE; switchContext->isActivateFailed = FALSE; switchContext->dpNo = OVS_DP_NUMBER; - switchContext->lastPortIndex = OVS_MAX_VPORT_ARRAY_SIZE -1; ovsTimeIncrementPerTick = KeQueryTimeIncrement() / 10000; OVS_LOG_TRACE("Exit: Succesfully initialized switchContext: %p", switchContext); @@ -419,7 +419,7 @@ OvsCleanupSwitchContext(POVS_SWITCH_CONTEXT switchContext) NdisFreeRWLock(switchContext->dispatchLock); OvsFreeMemory(switchContext->ovsPortNameHashArray); OvsFreeMemory(switchContext->portIdHashArray); - OvsFreeMemory(switchContext->vportArray); + OvsFreeMemory(switchContext->portNoHashArray); OvsDeleteFlowTable(&switchContext->datapath); OvsCleanupBufferPool(switchContext); OVS_LOG_TRACE("Exit: Delete switchContext: %p", switchContext); @@ -469,16 +469,6 @@ cleanup: } PVOID -OvsGetVportFromIndex(UINT16 index) -{ - if (index < OVS_MAX_VPORT_ARRAY_SIZE && - !OVS_IS_VPORT_ENTRY_NULL(gOvsSwitchContext, index)) { - return gOvsSwitchContext->vportArray[index]; - } - return NULL; -} - -PVOID OvsGetExternalVport() { return gOvsSwitchContext->externalVport; diff --git a/datapath-windows/ovsext/Switch.h b/datapath-windows/ovsext/Switch.h index d9761b45c..4591c11a7 100644 --- a/datapath-windows/ovsext/Switch.h +++ b/datapath-windows/ovsext/Switch.h @@ -37,17 +37,6 @@ #define OVS_GRE64_VPORT_INDEX 4 #define OVS_TUNNEL_INDEX_END OVS_GRE64_VPORT_INDEX -#define OVS_EXTERNAL_VPORT_START 8 -#define OVS_EXTERNAL_VPORT_END 40 -#define OVS_INTERNAL_VPORT_START 40 -#define OVS_INTERNAL_VPOR_END 72 -#define OVS_VM_VPORT_START 72 -#define OVS_VM_VPORT_MAX 0xffff -#define OVS_VPORT_INDEX(_portNo) ((_portNo) & 0xffffff) -#define OVS_VPORT_PORT_NO(_index, _gen) \ - (((_index) & 0xffffff) | ((UINT32)(_gen) << 24)) -#define OVS_VPORT_GEN(portNo) (portNo >> 24) - #define OVS_MAX_PHYS_ADAPTERS 32 #define OVS_MAX_IP_VPOR 32 @@ -109,9 +98,15 @@ typedef struct _OVS_SWITCH_CONTEXT POVS_VPORT_ENTRY externalVport; // the virtual adapter vport POVS_VPORT_ENTRY internalVport; - PVOID *vportArray; - PLIST_ENTRY ovsPortNameHashArray; // based on ovsName - PLIST_ENTRY portIdHashArray; // based on portId + /* + * XXX when we support multiple VXLAN ports, we will need a list entry + * instead + */ + POVS_VPORT_ENTRY vxlanVport; + + PLIST_ENTRY ovsPortNameHashArray; // based on ovsName + PLIST_ENTRY portIdHashArray; // based on portId + PLIST_ENTRY portNoHashArray; // based on ovs port number UINT32 numPhysicalNics; UINT32 numVports; // include validation port @@ -165,7 +160,6 @@ OvsReleaseDatapath(OVS_DATAPATH *datapath, } -PVOID OvsGetVportFromIndex(UINT16 index); PVOID OvsGetExternalVport(); #endif /* __SWITCH_H_ */ diff --git a/datapath-windows/ovsext/Tunnel.c b/datapath-windows/ovsext/Tunnel.c index 304ab5986..64e279c25 100644 --- a/datapath-windows/ovsext/Tunnel.c +++ b/datapath-windows/ovsext/Tunnel.c @@ -284,7 +284,7 @@ OvsInjectPacketThroughActions(PNET_BUFFER_LIST pNbl, SendFlags |= NDIS_SEND_FLAGS_DISPATCH_LEVEL; - vport = OvsGetTunnelVport(OVS_VPORT_TYPE_VXLAN); + vport = gOvsSwitchContext->vxlanVport; if (vport == NULL){ status = STATUS_UNSUCCESSFUL; diff --git a/datapath-windows/ovsext/Vport.c b/datapath-windows/ovsext/Vport.c index 9ffb25ec0..c26ee0fbe 100644 --- a/datapath-windows/ovsext/Vport.c +++ b/datapath-windows/ovsext/Vport.c @@ -219,7 +219,7 @@ HvCreateNic(POVS_SWITCH_CONTEXT switchContext, add_nic_done: NdisReleaseRWLock(switchContext->dispatchLock, &lockState); - if (portNo && event) { + if (portNo != OVS_DPPORT_NUMBER_INVALID && event) { OvsPostEvent(portNo, event); } @@ -268,6 +268,7 @@ HvConnectNic(POVS_SWITCH_CONTEXT switchContext, NdisReleaseRWLock(switchContext->dispatchLock, &lockState); + /* XXX only if portNo != INVALID or always? */ OvsPostEvent(portNo, OVS_EVENT_LINK_UP); if (nicParam->NicType == NdisSwitchNicTypeInternal) { @@ -392,6 +393,7 @@ HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext, NdisReleaseRWLock(switchContext->dispatchLock, &lockState); + /* XXX if portNo != INVALID or always? */ OvsPostEvent(portNo, OVS_EVENT_LINK_DOWN); if (isInternalPort) { @@ -440,6 +442,7 @@ HvDeleteNic(POVS_SWITCH_CONTEXT switchContext, vport->ovsState = OVS_STATE_PORT_CREATED; NdisReleaseRWLock(switchContext->dispatchLock, &lockState); + /* XXX if portNo != INVALID or always? */ OvsPostEvent(portNo, OVS_EVENT_DISCONNECT); done: @@ -454,14 +457,15 @@ POVS_VPORT_ENTRY OvsFindVportByPortNo(POVS_SWITCH_CONTEXT switchContext, UINT32 portNo) { - if (OVS_VPORT_INDEX(portNo) < OVS_MAX_VPORT_ARRAY_SIZE) { - if (OVS_IS_VPORT_ENTRY_NULL(switchContext, OVS_VPORT_INDEX(portNo))) { - return NULL; - } else { - POVS_VPORT_ENTRY vport; - vport = (POVS_VPORT_ENTRY) - switchContext->vportArray[OVS_VPORT_INDEX(portNo)]; - return vport->portNo == portNo ? vport : NULL; + POVS_VPORT_ENTRY vport; + PLIST_ENTRY head, link; + UINT32 hash = OvsJhashBytes((const VOID *)&portNo, sizeof(portNo), + OVS_HASH_BASIS); + head = &(switchContext->portNoHashArray[hash & OVS_VPORT_MASK]); + LIST_FORALL(head, link) { + vport = CONTAINING_RECORD(link, OVS_VPORT_ENTRY, portNoLink); + if (vport->portNo == portNo) { + return vport; } } return NULL; @@ -493,18 +497,7 @@ OvsFindVportByPortIdAndNicIndex(POVS_SWITCH_CONTEXT switchContext, NDIS_SWITCH_NIC_INDEX index) { if (portId == switchContext->externalPortId) { - if (index == 0) { - return (POVS_VPORT_ENTRY)switchContext->externalVport; - } else if (index > OVS_MAX_PHYS_ADAPTERS) { - return NULL; - } - if (OVS_IS_VPORT_ENTRY_NULL(switchContext, - index + OVS_EXTERNAL_VPORT_START)) { - return NULL; - } else { - return (POVS_VPORT_ENTRY)switchContext->vportArray[ - index + OVS_EXTERNAL_VPORT_START]; - } + return (POVS_VPORT_ENTRY)switchContext->externalVport; } else if (switchContext->internalPortId == portId) { return (POVS_VPORT_ENTRY)switchContext->internalVport; } else { @@ -523,72 +516,6 @@ OvsFindVportByPortIdAndNicIndex(POVS_SWITCH_CONTEXT switchContext, } } -UINT32 -OvsComputeVportNo(POVS_SWITCH_CONTEXT switchContext, - UINT32 nicIndex, - OVS_VPORT_TYPE ovsType, - BOOLEAN isExternal) -{ - UINT32 index = 0xffffff, i = 0; - UINT64 gen; - - if (isExternal) { - if (nicIndex == 0) { - return 0; // not a valid portNo - } else if (nicIndex > OVS_MAX_PHYS_ADAPTERS) { - return 0; - } else { - index = nicIndex + OVS_EXTERNAL_VPORT_START; - } - } - - switch (ovsType) { - case OVS_VPORT_TYPE_INTERNAL: - index = OVS_INTERNAL_VPORT_DEFAULT_INDEX; - break; - case OVS_VPORT_TYPE_NETDEV: - index = switchContext->lastPortIndex + 1; - if (index == OVS_MAX_VPORT_ARRAY_SIZE) { - index = OVS_VM_VPORT_START; - } - while (!OVS_IS_VPORT_ENTRY_NULL(switchContext, index) && - i < (OVS_MAX_VPORT_ARRAY_SIZE - OVS_VM_VPORT_START)) { - index++; - i++; - if (index == OVS_MAX_VPORT_ARRAY_SIZE) { - index = OVS_VM_VPORT_START; - } - } - if (i == (OVS_MAX_VPORT_ARRAY_SIZE - OVS_VM_VPORT_START)) { - return 0; // not available - } - switchContext->lastPortIndex = index; - break; - case OVS_VPORT_TYPE_GRE: - index = OVS_GRE_VPORT_INDEX; - break; - case OVS_VPORT_TYPE_GRE64: - index = OVS_GRE64_VPORT_INDEX; - break; - case OVS_VPORT_TYPE_VXLAN: - index = OVS_VXLAN_VPORT_INDEX; - break; - default: - ASSERT(isExternal); - } - if (index > OVS_MAX_VPORT_ARRAY_SIZE) { - return 0; - } - gen = (UINT64)switchContext->vportArray[index]; - if (gen > 0xff) { - return 0; - } else if (gen == 0) { - gen++; - } - return OVS_VPORT_PORT_NO(index, (UINT32)gen); -} - - static POVS_VPORT_ENTRY OvsAllocateVport(VOID) { @@ -599,6 +526,12 @@ OvsAllocateVport(VOID) } RtlZeroMemory(vport, sizeof (OVS_VPORT_ENTRY)); vport->ovsState = OVS_STATE_UNKNOWN; + vport->portNo = OVS_DPPORT_NUMBER_INVALID; + + InitializeListHead(&vport->ovsNameLink); + InitializeListHead(&vport->portIdLink); + InitializeListHead(&vport->portNoLink); + return vport; } @@ -707,22 +640,11 @@ OvsInitPhysNicVport(POVS_VPORT_ENTRY vport, } static NDIS_STATUS OvsInitVportCommon(POVS_SWITCH_CONTEXT switchContext, -POVS_VPORT_ENTRY vport) + POVS_VPORT_ENTRY vport) { UINT32 hash; - size_t len; - if (vport->portType != NdisSwitchPortTypeExternal || - vport->nicIndex != 0) { - vport->portNo = OvsComputeVportNo(switchContext, vport->nicIndex, - vport->ovsType, vport->portType == NdisSwitchPortTypeExternal); - if (vport->portNo == OVS_DPPORT_NUMBER_INVALID) { - return NDIS_STATUS_RESOURCES; - } - ASSERT(OVS_IS_VPORT_ENTRY_NULL(switchContext, - OVS_VPORT_INDEX(vport->portNo))); + ASSERT(vport->portNo == OVS_DPPORT_NUMBER_INVALID); - switchContext->vportArray[OVS_VPORT_INDEX(vport->portNo)] = vport; - } switch (vport->portType) { case NdisSwitchPortTypeExternal: if (vport->nicIndex == 0) { @@ -730,8 +652,7 @@ POVS_VPORT_ENTRY vport) switchContext->externalVport = vport; RtlStringCbPrintfA(vport->ovsName, OVS_MAX_PORT_NAME_LENGTH - 1, "external.virtualAdapter"); - } - else { + } else { switchContext->numPhysicalNics++; RtlStringCbPrintfA(vport->ovsName, OVS_MAX_PORT_NAME_LENGTH - 1, "external.%lu", (UINT32)vport->nicIndex); @@ -740,27 +661,23 @@ POVS_VPORT_ENTRY vport) case NdisSwitchPortTypeInternal: switchContext->internalPortId = vport->portId; switchContext->internalVport = vport; - RtlStringCbPrintfA(vport->ovsName, OVS_MAX_PORT_NAME_LENGTH - 1, - "internal"); break; case NdisSwitchPortTypeSynthetic: - RtlStringCbPrintfA(vport->ovsName, OVS_MAX_PORT_NAME_LENGTH - 1, - "vmNICSyn.%lx", vport->portNo); break; case NdisSwitchPortTypeEmulated: - RtlStringCbPrintfA(vport->ovsName, OVS_MAX_PORT_NAME_LENGTH - 1, - "vmNICEmu.%lx", vport->portNo); break; } - StringCbLengthA(vport->ovsName, OVS_MAX_PORT_NAME_LENGTH - 1, &len); - vport->ovsNameLen = (UINT32)len; + if (vport->portType == NdisSwitchPortTypeExternal && vport->nicIndex == 0) { return NDIS_STATUS_SUCCESS; } - hash = OvsJhashBytes(vport->ovsName, vport->ovsNameLen, OVS_HASH_BASIS); - InsertHeadList(&switchContext->ovsPortNameHashArray[hash & OVS_VPORT_MASK], - &vport->ovsNameLink); + + /* + * NOTE: OvsJhashWords has portId as "1" word. This should be ok, even + * though sizeof(NDIS_SWITCH_PORT_ID) = 4, not 2, because the + * hyper-v switch seems to use only 2 bytes out of 4. + */ hash = OvsJhashWords(&vport->portId, 1, OVS_HASH_BASIS); InsertHeadList(&switchContext->portIdHashArray[hash & OVS_VPORT_MASK], &vport->portIdLink); @@ -773,8 +690,6 @@ static VOID OvsRemoveAndDeleteVport(POVS_SWITCH_CONTEXT switchContext, POVS_VPORT_ENTRY vport) { - UINT64 gen = vport->portNo >> 24; - if (vport->isExternal) { if (vport->nicIndex == 0) { ASSERT(switchContext->numPhysicalNics == 0); @@ -807,9 +722,7 @@ OvsRemoveAndDeleteVport(POVS_SWITCH_CONTEXT switchContext, RemoveEntryList(&vport->ovsNameLink); RemoveEntryList(&vport->portIdLink); - gen = (gen + 1) & 0xff; - switchContext->vportArray[OVS_VPORT_INDEX(vport->portNo)] = - (PVOID)(UINT64)gen; + RemoveEntryList(&vport->portNoLink); switchContext->numVports--; OvsFreeMemory(vport); } @@ -933,14 +846,17 @@ cleanup: VOID OvsClearAllSwitchVports(POVS_SWITCH_CONTEXT switchContext) { - UINT32 i; + for (UINT hash = 0; hash < OVS_MAX_VPORT_ARRAY_SIZE; hash) { + PLIST_ENTRY head, link; - for (i = 0; i < OVS_MAX_VPORT_ARRAY_SIZE; i++) { - if (!OVS_IS_VPORT_ENTRY_NULL(switchContext, i)) { - OvsRemoveAndDeleteVport(switchContext, - (POVS_VPORT_ENTRY)switchContext->vportArray[i]); + head = &(switchContext->portNoHashArray[hash & OVS_VPORT_MASK]); + LIST_FORALL(head, link) { + POVS_VPORT_ENTRY vport; + vport = CONTAINING_RECORD(link, OVS_VPORT_ENTRY, portNoLink); + OvsRemoveAndDeleteVport(switchContext, vport); } } + if (switchContext->externalVport) { OvsRemoveAndDeleteVport(switchContext, (POVS_VPORT_ENTRY)switchContext->externalVport); diff --git a/datapath-windows/ovsext/Vport.h b/datapath-windows/ovsext/Vport.h index b6d3776ed..077df7764 100644 --- a/datapath-windows/ovsext/Vport.h +++ b/datapath-windows/ovsext/Vport.h @@ -19,7 +19,18 @@ #include "Switch.h" -#define OVS_DPPORT_NUMBER_INVALID 0 +#define OVS_MAX_DPPORTS MAXUINT16 +#define OVS_DPPORT_NUMBER_INVALID OVS_MAX_DPPORTS +/* + * The local port (0) is a reserved port, that is not allowed to be be + * created by the netlink command vport add. On linux, this port is created + * at netlink command datapath new. However, on windows, we do not need to + * create it, and more, we shouldn't. The userspace attempts to create two + * internal vports, the LOCAL port (0) and the internal port (with any other + * port number). The non-LOCAL internal port is used in the userspace when it + * requests the internal port. + */ +#define OVS_DPPORT_NUMBER_LOCAL 0 /* * A Vport, or Virtual Port, is a port on the OVS. It can be one of the @@ -67,6 +78,7 @@ typedef struct _OVS_VPORT_FULL_STATS { typedef struct _OVS_VPORT_ENTRY { LIST_ENTRY ovsNameLink; LIST_ENTRY portIdLink; + LIST_ENTRY portNoLink; OVS_VPORT_STATE ovsState; OVS_VPORT_TYPE ovsType; @@ -99,9 +111,6 @@ typedef struct _OVS_VPORT_ENTRY { struct _OVS_SWITCH_CONTEXT; -#define OVS_IS_VPORT_ENTRY_NULL(_SwitchContext, _i) \ - ((UINT64)(_SwitchContext)->vportArray[_i] <= 0xff) - POVS_VPORT_ENTRY OvsFindVportByPortNo(struct _OVS_SWITCH_CONTEXT *switchContext, UINT32 portNo); @@ -135,11 +144,6 @@ VOID HvDeleteNic(POVS_SWITCH_CONTEXT switchContext, VOID HvDisconnectNic(POVS_SWITCH_CONTEXT switchContext, PNDIS_SWITCH_NIC_PARAMETERS nicParam); -UINT32 OvsComputeVportNo(POVS_SWITCH_CONTEXT switchContext, - UINT32 nicIndex, - OVS_VPORT_TYPE ovsType, - BOOLEAN isExternal); - static __inline BOOLEAN OvsIsTunnelVportType(OVS_VPORT_TYPE ovsType) { @@ -154,40 +158,6 @@ OvsIsInternalVportType(OVS_VPORT_TYPE ovsType) return ovsType == OVS_VPORT_TYPE_INTERNAL; } -static __inline BOOLEAN -OvsIsTunnelVportNo(UINT32 portNo) -{ - UINT32 idx = OVS_VPORT_INDEX(portNo); - return (idx >= OVS_TUNNEL_INDEX_START && idx <= OVS_TUNNEL_INDEX_END); -} - -static __inline BOOLEAN -OvsIsVifVportNo(UINT32 portNo) -{ - UINT32 idx = OVS_VPORT_INDEX(portNo); - return (idx >= OVS_VM_VPORT_START && idx <= OVS_VM_VPORT_MAX); -} - -static __inline POVS_VPORT_ENTRY -OvsGetTunnelVport(OVS_VPORT_TYPE type) -{ - ASSERT(OvsIsTunnelVportType(type)); - switch(type) { - case OVS_VPORT_TYPE_VXLAN: - return (POVS_VPORT_ENTRY) OvsGetVportFromIndex(OVS_VXLAN_VPORT_INDEX); - default: - ASSERT(! "OvsGetTunnelVport not implemented for this tunnel."); - } - - return NULL; -} - -static __inline PVOID -OvsGetVportPriv(OVS_VPORT_TYPE type) -{ - return OvsGetTunnelVport(type)->priv; -} - static __inline UINT32 OvsGetExternalMtu() { |