diff options
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; |