VOL-3029 - Changed flow hashing to only take into account tableId, priority, and match.
Also optimized hash computation.
Also modified FlowMatch() and FindFlows() to use a simple comparison based on the hash (flow.Id).
Change-Id: Ic82f340405fd3eb2d0a683e3d552759145097f8f
diff --git a/pkg/flows/flow_utils_test.go b/pkg/flows/flow_utils_test.go
index c4e481d..ec00cb1 100644
--- a/pkg/flows/flow_utils_test.go
+++ b/pkg/flows/flow_utils_test.go
@@ -37,11 +37,6 @@
timeoutError = status.Errorf(codes.Aborted, "timeout")
}
-func TestHashFlowStatsNil(t *testing.T) {
- _, err := HashFlowStats(nil)
- assert.EqualError(t, err, "hash-flow-stats-nil-flow")
-}
-
func TestFlowsAndGroups_AddFlow(t *testing.T) {
fg := NewFlowsAndGroups()
allFlows := fg.ListFlows()
@@ -261,7 +256,7 @@
fg.AddGroup(group)
str = fg.String()
- assert.True(t, strings.Contains(str, "id: 1143307409938767207"))
+ assert.True(t, strings.Contains(str, "id: 11819684229970388353"))
assert.True(t, strings.Contains(str, "group_id: 10"))
assert.True(t, strings.Contains(str, "oxm_class: OFPXMC_OPENFLOW_BASICOFPXMC_OPENFLOW_BASIC"))
assert.True(t, strings.Contains(str, "type: OFPXMT_OFB_VLAN_VIDOFPXMT_OFB_VLAN_VID"))
@@ -503,6 +498,7 @@
assert.Nil(t, err)
assert.False(t, FlowMatch(flow1, nil))
+ // different table_id, cookie, flags
fa = &FlowArgs{
KV: OfpFlowModArgs{"priority": 500},
MatchFields: []*ofp.OfpOxmOfbField{
@@ -521,6 +517,7 @@
assert.False(t, FlowMatch(flow1, flow2))
assert.False(t, FlowMatch(nil, flow2))
+ // no difference
fa = &FlowArgs{
KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
MatchFields: []*ofp.OfpOxmOfbField{
@@ -535,6 +532,7 @@
assert.Nil(t, err)
assert.True(t, FlowMatch(flow1, flow2))
+ // different priority
fa = &FlowArgs{
KV: OfpFlowModArgs{"priority": 501, "table_id": 1, "cookie": 38268468, "flags": 12},
MatchFields: []*ofp.OfpOxmOfbField{
@@ -552,6 +550,7 @@
assert.Nil(t, err)
assert.False(t, FlowMatch(flow1, flow2))
+ // different table id
fa = &FlowArgs{
KV: OfpFlowModArgs{"priority": 500, "table_id": 2, "cookie": 38268468, "flags": 12},
MatchFields: []*ofp.OfpOxmOfbField{
@@ -566,6 +565,7 @@
assert.Nil(t, err)
assert.False(t, FlowMatch(flow1, flow2))
+ // different cookie
fa = &FlowArgs{
KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268467, "flags": 12},
MatchFields: []*ofp.OfpOxmOfbField{
@@ -578,8 +578,9 @@
}
flow2, err = MkFlowStat(fa)
assert.Nil(t, err)
- assert.False(t, FlowMatch(flow1, flow2))
+ assert.True(t, FlowMatch(flow1, flow2))
+ // different flags
fa = &FlowArgs{
KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 14},
MatchFields: []*ofp.OfpOxmOfbField{
@@ -592,8 +593,9 @@
}
flow2, err = MkFlowStat(fa)
assert.Nil(t, err)
- assert.False(t, FlowMatch(flow1, flow2))
+ assert.True(t, FlowMatch(flow1, flow2))
+ // different match InPort
fa = &FlowArgs{
KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
MatchFields: []*ofp.OfpOxmOfbField{
@@ -608,6 +610,7 @@
assert.Nil(t, err)
assert.False(t, FlowMatch(flow1, flow2))
+ // different match Ipv4Dst
fa = &FlowArgs{
KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
MatchFields: []*ofp.OfpOxmOfbField{
@@ -621,6 +624,7 @@
assert.Nil(t, err)
assert.False(t, FlowMatch(flow1, flow2))
+ // different actions
fa = &FlowArgs{
KV: OfpFlowModArgs{"priority": 500, "table_id": 1, "cookie": 38268468, "flags": 12},
MatchFields: []*ofp.OfpOxmOfbField{