[ovs-dev] [PATCH 2/3] datapath-windows: Update flow lookup to support RecircId and DpHash
Sairam Venugopal
vsairam at vmware.com
Wed Mar 30 00:43:48 UTC 2016
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 at vmware.com>
---
datapath-windows/ovsext/Flow.c | 31 ++++++++++++++++++++++---------
1 file changed, 22 insertions(+), 9 deletions(-)
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c
index 02c41b7..0d48963 100644
--- a/datapath-windows/ovsext/Flow.c
+++ b/datapath-windows/ovsext/Flow.c
@@ -1382,12 +1382,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 ===== */
@@ -1765,12 +1763,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;
@@ -2032,7 +2028,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);
@@ -2046,6 +2042,20 @@ FlowEqual(UINT64 *src, UINT64 *dst, UINT32 size)
return TRUE;
}
+__inline BOOLEAN
+FlowEqual(OvsFlow *flow, const OvsFlowKey *key, UINT64 hash)
+{
+ UINT16 size = key->l2.keyLen;
+ UINT16 offset = key->l2.offset;
+ UINT64 *src = (UINT64 *)((UINT8 *)&flow->key + offset);
+ UINT64 *dst = (UINT64 *)((UINT8 *)key + offset);
+
+ return (flow->hash == hash &&
+ flow->key.l2.val == key->l2.val &&
+ flow->key.recircId == key->recircId &&
+ flow->key.dpHash == key->dpHash &&
+ FlowMemoryEqual(src, dst, size));
+}
/*
* ----------------------------------------------------------------------------
@@ -2133,6 +2143,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)];
@@ -2140,10 +2156,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, *hash)) {
return flow;
}
link = link->Flink;
--
2.5.0.windows.1
More information about the dev
mailing list