summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Flow.c
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 /datapath-windows/ovsext/Flow.c
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>
Diffstat (limited to 'datapath-windows/ovsext/Flow.c')
-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;