summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSairam Venugopal <vsairam@vmware.com>2016-03-31 16:46:33 -0700
committerBen Pfaff <blp@ovn.org>2016-03-31 21:23:04 -0700
commit036c7f03c80a60579e220a67337053076a9f15f1 (patch)
treed7a6fe1ac225c5c7062cf2362c21df4cde624b61
parente97d67f47d9c6371108339d7e42cd828eb89e570 (diff)
downloadopenvswitch-036c7f03c80a60579e220a67337053076a9f15f1.tar.gz
datapath-windows: Update flow lookup to support RecircId and DpHash
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 <vsairam@vmware.com> Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> Acked-by: Nithin Raju <nithin@vmware.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
-rw-r--r--datapath-windows/ovsext/Flow.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index c079540b1..f74ce12e8 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;