summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Flow.c
diff options
context:
space:
mode:
authorSairam Venugopal <vsairam@vmware.com>2017-06-02 10:37:22 -0700
committerGurucharan Shetty <guru@ovn.org>2017-06-08 11:06:41 -0700
commit813f5f0ace37876d9c13891514d0a2aa76e852c7 (patch)
tree86562b26ad3b403b9132c008ee91366c34050cfe /datapath-windows/ovsext/Flow.c
parentae9c09850a173f32f56321e7fd2dc334d570b727 (diff)
downloadopenvswitch-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.c50
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;