diff options
author | Sairam Venugopal <vsairam@vmware.com> | 2017-06-02 10:37:22 -0700 |
---|---|---|
committer | Gurucharan Shetty <guru@ovn.org> | 2017-06-08 11:06:41 -0700 |
commit | 813f5f0ace37876d9c13891514d0a2aa76e852c7 (patch) | |
tree | 86562b26ad3b403b9132c008ee91366c34050cfe /datapath-windows/ovsext/Flow.c | |
parent | ae9c09850a173f32f56321e7fd2dc334d570b727 (diff) | |
download | openvswitch-813f5f0ace37876d9c13891514d0a2aa76e852c7.tar.gz |
datapath-windows: Add original conntrack tuple to FlowKey
Add the original tuple to Flow Key. In case of ICMP and UDP, default the
parent entry to NULL until related connections is supported.
Signed-off-by: Sairam Venugopal <vsairam@vmware.com>
Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
Signed-off-by: Gurucharan Shetty <guru@ovn.org>
Diffstat (limited to 'datapath-windows/ovsext/Flow.c')
-rw-r--r-- | datapath-windows/ovsext/Flow.c | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c index 96ff9fabb..80f56765f 100644 --- a/datapath-windows/ovsext/Flow.c +++ b/datapath-windows/ovsext/Flow.c @@ -180,6 +180,10 @@ const NL_POLICY nlFlowKeyPolicy[] = { [OVS_KEY_ATTR_CT_LABELS] = {.type = NL_A_UNSPEC, .minLen = sizeof(struct ovs_key_ct_labels), .maxLen = sizeof(struct ovs_key_ct_labels), + .optional = TRUE}, + [OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4] = {.type = NL_A_UNSPEC, + .minLen = sizeof(struct ovs_key_ct_tuple_ipv4), + .maxLen = sizeof(struct ovs_key_ct_tuple_ipv4), .optional = TRUE} }; const UINT32 nlFlowKeyPolicyLen = ARRAY_SIZE(nlFlowKeyPolicy); @@ -887,6 +891,12 @@ MapFlowKeyToNlKey(PNL_BUFFER nlBuf, rc = STATUS_UNSUCCESSFUL; goto done; } + if (!NlMsgPutTailUnspec(nlBuf, OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4, + (PCHAR)(&flowKey->ct.tuple_ipv4), + sizeof(struct ovs_key_ct_tuple_ipv4))) { + rc = STATUS_UNSUCCESSFUL; + goto done; + } if (flowKey->dpHash) { if (!NlMsgPutTailU32(nlBuf, OVS_KEY_ATTR_DP_HASH, @@ -1447,7 +1457,15 @@ _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs, if (keyAttrs[OVS_KEY_ATTR_CT_LABELS]) { const struct ovs_key_ct_labels *ct_labels; ct_labels = NlAttrGet(keyAttrs[OVS_KEY_ATTR_CT_LABELS]); - RtlCopyMemory(&destKey->ct.labels, ct_labels, sizeof(struct ovs_key_ct_labels)); + NdisMoveMemory(&destKey->ct.labels, ct_labels, + sizeof(struct ovs_key_ct_labels)); + } + + if (keyAttrs[OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4]) { + const struct ovs_key_ct_tuple_ipv4 *tuple_ipv4; + tuple_ipv4 = NlAttrGet(keyAttrs[OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4]); + NdisMoveMemory(&destKey->ct.tuple_ipv4, tuple_ipv4, + sizeof(struct ovs_key_ct_tuple_ipv4)); } /* ===== L2 headers ===== */ @@ -1988,7 +2006,15 @@ OvsGetFlowMetadata(OvsFlowKey *key, if (keyAttrs[OVS_KEY_ATTR_CT_LABELS]) { const struct ovs_key_ct_labels *ct_labels; ct_labels = NlAttrGet(keyAttrs[OVS_KEY_ATTR_CT_LABELS]); - RtlCopyMemory(&key->ct.labels, ct_labels, sizeof(struct ovs_key_ct_labels)); + NdisMoveMemory(&key->ct.labels, ct_labels, + sizeof(struct ovs_key_ct_labels)); + } + + if (keyAttrs[OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4]) { + const struct ovs_key_ct_tuple_ipv4 *tuple_ipv4; + tuple_ipv4 = NlAttrGet(keyAttrs[OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4]); + NdisMoveMemory(&key->ct.tuple_ipv4, tuple_ipv4, + sizeof(struct ovs_key_ct_tuple_ipv4)); } return status; @@ -2461,6 +2487,8 @@ FlowEqual(OvsFlow *srcFlow, srcFlow->key.ct.mark == dstKey->ct.mark && !memcmp(&srcFlow->key.ct.labels, &dstKey->ct.labels, sizeof(struct ovs_key_ct_labels)) && + !memcmp(&srcFlow->key.ct.tuple_ipv4, &dstKey->ct.tuple_ipv4, + sizeof(struct ovs_key_ct_tuple_ipv4)) && FlowMemoryEqual((UINT64 *)((UINT8 *)&srcFlow->key + offset), (UINT64 *) dstStart, size)); @@ -2573,6 +2601,13 @@ OvsLookupFlow(OVS_DATAPATH *datapath, 0); *hash = OvsJhashWords((UINT32*)hash, 1, lblHash); } + if (key->ct.tuple_ipv4.ipv4_src) { + UINT32 tupleHash = OvsJhashBytes( + &key->ct.tuple_ipv4, + sizeof(struct ovs_key_ct_tuple_ipv4), + 0); + *hash = OvsJhashWords((UINT32*)hash, 1, tupleHash); + } } head = &datapath->flowTable[HASH_BUCKET(*hash)]; @@ -2745,6 +2780,9 @@ ReportFlowInfo(OvsFlow *flow, NdisMoveMemory(&info->key.ct.labels, &flow->key.ct.labels, sizeof(struct ovs_key_ct_labels)); + NdisMoveMemory(&info->key.ct.tuple_ipv4, + &flow->key.ct.tuple_ipv4, + sizeof(struct ovs_key_ct_tuple_ipv4)); return status; } @@ -3005,6 +3043,7 @@ OvsFlowKeyAttrSize(void) + NlAttrTotalSize(2) /* OVS_KEY_ATTR_CT_ZONE */ + NlAttrTotalSize(4) /* OVS_KEY_ATTR_CT_MARK */ + NlAttrTotalSize(16) /* OVS_KEY_ATTR_CT_LABELS */ + + NlAttrTotalSize(13) /* OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4 */ + NlAttrTotalSize(12) /* OVS_KEY_ATTR_ETHERNET */ + NlAttrTotalSize(2) /* OVS_KEY_ATTR_ETHERTYPE */ + NlAttrTotalSize(4) /* OVS_KEY_ATTR_VLAN */ @@ -3109,6 +3148,13 @@ OvsProbeSupportedFeature(POVS_MESSAGE msgIn, OVS_LOG_ERROR("Invalid ct label specified."); status = STATUS_INVALID_PARAMETER; } + } else if (keyAttrs[OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4]) { + const struct ovs_key_ct_tuple_ipv4 *ct_tuple_ipv4; + ct_tuple_ipv4 = NlAttrGet(keyAttrs[OVS_KEY_ATTR_CT_ORIG_TUPLE_IPV4]); + if (!ct_tuple_ipv4) { + OVS_LOG_ERROR("Invalid ct_tuple_ipv4."); + status = STATUS_INVALID_PARAMETER; + } } else { OVS_LOG_ERROR("Feature not supported."); status = STATUS_INVALID_PARAMETER; |