summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--datapath-windows/ovsext/Actions.c2
-rw-r--r--datapath-windows/ovsext/Conntrack.c30
-rw-r--r--datapath-windows/ovsext/Recirc.c9
-rw-r--r--datapath-windows/ovsext/Recirc.h3
4 files changed, 34 insertions, 10 deletions
diff --git a/datapath-windows/ovsext/Actions.c b/datapath-windows/ovsext/Actions.c
index 0c18c6254..70ac0a0e5 100644
--- a/datapath-windows/ovsext/Actions.c
+++ b/datapath-windows/ovsext/Actions.c
@@ -2366,7 +2366,7 @@ OvsActionsExecute(POVS_SWITCH_CONTEXT switchContext,
if (status == STATUS_SUCCESS) {
status = OvsProcessDeferredActions(switchContext, completionList,
- portNo, sendFlags, NULL);
+ portNo, sendFlags);
}
return status;
diff --git a/datapath-windows/ovsext/Conntrack.c b/datapath-windows/ovsext/Conntrack.c
index fd6f3bae0..7f1d2fb41 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -626,6 +626,31 @@ OvsReverseIcmpType(UINT8 type)
}
}
+static __inline void
+OvsPickupCtTupleAsLookupKey(POVS_CT_KEY ctKey, UINT16 zone, OvsFlowKey *flowKey)
+{
+ UINT32 ipAddrSrc = 0, ipAddrDst = 0;
+
+ if (!flowKey || !ctKey) return;
+
+ if (flowKey->l2.dlType == htons(ETH_TYPE_IPV4)) {
+ ipAddrSrc = flowKey->ct.tuple_ipv4.ipv4_src;
+ ipAddrDst = flowKey->ct.tuple_ipv4.ipv4_dst;
+
+ if ((ipAddrSrc > 0 && ipAddrDst > 0) &&
+ (zone == flowKey->ct.zone)) {
+ /* if the ct tuple_ipv4 in flowKey is not null and ct.zone is same with
+ * zone parameter pickup the tuple_ipv4 value as the lookup key
+ */
+ ctKey->src.addr.ipv4 = flowKey->ct.tuple_ipv4.ipv4_src;
+ ctKey->dst.addr.ipv4 = flowKey->ct.tuple_ipv4.ipv4_dst;
+ ctKey->nw_proto = flowKey->ct.tuple_ipv4.ipv4_proto;
+ ctKey->src.port = flowKey->ct.tuple_ipv4.src_port;
+ ctKey->dst.port = flowKey->ct.tuple_ipv4.dst_port;
+ }
+ }
+}
+
static __inline NDIS_STATUS
OvsCtSetupLookupCtx(OvsFlowKey *flowKey,
UINT16 zone,
@@ -646,6 +671,7 @@ OvsCtSetupLookupCtx(OvsFlowKey *flowKey,
ctx->key.src.port = flowKey->ipKey.l4.tpSrc;
ctx->key.dst.port = flowKey->ipKey.l4.tpDst;
+
if (flowKey->ipKey.nwProto == IPPROTO_ICMP) {
ICMPHdr icmpStorage;
const ICMPHdr *icmp;
@@ -700,6 +726,10 @@ OvsCtSetupLookupCtx(OvsFlowKey *flowKey,
/* Translate address first for reverse NAT */
ctx->key = natEntry->ctEntry->key;
OvsCtKeyReverse(&ctx->key);
+ } else {
+ if (flowKey->l2.dlType == htons(ETH_TYPE_IPV4)) {
+ OvsPickupCtTupleAsLookupKey(&(ctx->key), zone, flowKey);
+ }
}
ctx->hash = OvsCtHashKey(&ctx->key);
diff --git a/datapath-windows/ovsext/Recirc.c b/datapath-windows/ovsext/Recirc.c
index a32b75352..7a688c874 100644
--- a/datapath-windows/ovsext/Recirc.c
+++ b/datapath-windows/ovsext/Recirc.c
@@ -310,8 +310,7 @@ NDIS_STATUS
OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext,
OvsCompletionList *completionList,
UINT32 portNo,
- ULONG sendFlags,
- OVS_PACKET_HDR_INFO *layers)
+ ULONG sendFlags)
{
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
POVS_DEFERRED_ACTION_QUEUE queue = OvsDeferredActionsQueueGet();
@@ -320,11 +319,7 @@ OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext,
/* Process all deferred actions. */
while ((deferredAction = OvsDeferredActionsQueuePop(queue)) != NULL) {
- if (layers) {
- layersDeferred = layers;
- } else {
- layersDeferred = &(deferredAction->layers);
- }
+ layersDeferred = &(deferredAction->layers);
if (deferredAction->actions) {
status = OvsDoExecuteActions(switchContext,
diff --git a/datapath-windows/ovsext/Recirc.h b/datapath-windows/ovsext/Recirc.h
index 74130a460..b2d02a65c 100644
--- a/datapath-windows/ovsext/Recirc.h
+++ b/datapath-windows/ovsext/Recirc.h
@@ -41,8 +41,7 @@ NDIS_STATUS
OvsProcessDeferredActions(POVS_SWITCH_CONTEXT switchContext,
OvsCompletionList *completionList,
UINT32 portNo,
- ULONG sendFlags,
- OVS_PACKET_HDR_INFO *layers);
+ ULONG sendFlags);
/*
* --------------------------------------------------------------------------