Update the OvsLookupFlow to include RecircId and DpHash in its flow comparison. Revert the keyLen related changes until they are aligned appropriately.
Signed-off-by: Sairam Venugopal <vsai...@vmware.com> --- datapath-windows/ovsext/Flow.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c index c079540..f74ce12 100644 --- a/datapath-windows/ovsext/Flow.c +++ b/datapath-windows/ovsext/Flow.c @@ -1380,12 +1380,10 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs, if (keyAttrs[OVS_KEY_ATTR_RECIRC_ID]) { destKey->recircId = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_RECIRC_ID]); - destKey->l2.keyLen += sizeof(destKey->recircId); } if (keyAttrs[OVS_KEY_ATTR_DP_HASH]) { destKey->dpHash = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_DP_HASH]); - destKey->l2.keyLen += sizeof(destKey->dpHash); } /* ===== L2 headers ===== */ @@ -1770,12 +1768,10 @@ OvsGetFlowMetadata(OvsFlowKey *key, if (keyAttrs[OVS_KEY_ATTR_RECIRC_ID]) { key->recircId = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_RECIRC_ID]); - key->l2.keyLen += sizeof(key->recircId); } if (keyAttrs[OVS_KEY_ATTR_DP_HASH]) { key->dpHash = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_DP_HASH]); - key->l2.keyLen += sizeof(key->dpHash); } return status; @@ -2037,7 +2033,7 @@ OvsExtractFlow(const NET_BUFFER_LIST *packet, } __inline BOOLEAN -FlowEqual(UINT64 *src, UINT64 *dst, UINT32 size) +FlowMemoryEqual(UINT64 *src, UINT64 *dst, UINT32 size) { UINT32 i; ASSERT((size & 0x7) == 0); @@ -2051,6 +2047,22 @@ FlowEqual(UINT64 *src, UINT64 *dst, UINT32 size) return TRUE; } +__inline BOOLEAN +FlowEqual(OvsFlow *srcFlow, + const OvsFlowKey *dstKey, + UINT8 *dstStart, + UINT64 hash, + UINT32 offset, + UINT16 size) +{ + return (srcFlow->hash == hash && + srcFlow->key.l2.val == dstKey->l2.val && + srcFlow->key.recircId == dstKey->recircId && + srcFlow->key.dpHash == dstKey->dpHash && + FlowMemoryEqual((UINT64 *)((UINT8 *)&srcFlow->key + offset), + (UINT64 *) dstStart, + size)); +} /* * ---------------------------------------------------------------------------- @@ -2138,6 +2150,12 @@ OvsLookupFlow(OVS_DATAPATH *datapath, if (!hashValid) { *hash = OvsJhashBytes(start, size, 0); + if (key->recircId) { + *hash = OvsJhashWords((UINT32*)hash, 1, key->recircId); + } + if (key->dpHash) { + *hash = OvsJhashWords((UINT32*)hash, 1, key->dpHash); + } } head = &datapath->flowTable[HASH_BUCKET(*hash)]; @@ -2145,10 +2163,7 @@ OvsLookupFlow(OVS_DATAPATH *datapath, while (link != head) { OvsFlow *flow = CONTAINING_RECORD(link, OvsFlow, ListEntry); - if (flow->hash == *hash && - flow->key.l2.val == key->l2.val && - FlowEqual((UINT64 *)((uint8 *)&flow->key + offset), - (UINT64 *)start, size)) { + if (FlowEqual(flow, key, start, *hash, offset, size)) { return flow; } link = link->Flink; -- 2.5.0.windows.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev