summaryrefslogtreecommitdiff
path: root/datapath-windows/ovsext/Conntrack.c
diff options
context:
space:
mode:
authorSairam Venugopal <vsairam@vmware.com>2017-03-02 13:41:03 -0800
committerGurucharan Shetty <guru@ovn.org>2017-03-07 13:29:11 -0800
commitb841a44114e9cee670e809ace853795dce2b6fd9 (patch)
tree8069ab5505587e4f7e0e4ea8710ac1d11e8edb77 /datapath-windows/ovsext/Conntrack.c
parent92d8490fa2d954219d0307835d6df6c3efb7b221 (diff)
downloadopenvswitch-b841a44114e9cee670e809ace853795dce2b6fd9.tar.gz
datapath-windows: Trigger conntrack event after setting mark and label
New Conntrack Entry event should be triggered after setting the mark and label fields. The current RW lock implementation prevents Event Handler from reading the entry until mark/label is set. Fixing the workflow to trigger the event after setting mark/label. Signed-off-by: Sairam Venugopal <vsairam@vmware.com> Acked-by: Shashank Ram <rams@vmware.com> Signed-off-by: Gurucharan Shetty <guru@ovn.org>
Diffstat (limited to 'datapath-windows/ovsext/Conntrack.c')
-rw-r--r--datapath-windows/ovsext/Conntrack.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/datapath-windows/ovsext/Conntrack.c b/datapath-windows/ovsext/Conntrack.c
index d1be480e8..9f41861f7 100644
--- a/datapath-windows/ovsext/Conntrack.c
+++ b/datapath-windows/ovsext/Conntrack.c
@@ -168,7 +168,7 @@ OvsCtAddEntry(POVS_CT_ENTRY entry, OvsConntrackKeyLookupCtx *ctx, UINT64 now)
entry->timestampStart = now;
InsertHeadList(&ovsConntrackTable[ctx->hash & CT_HASH_TABLE_MASK],
&entry->link);
- OvsPostCtEventEntry(entry, OVS_EVENT_CT_NEW);
+
ctTotalEntries++;
}
@@ -179,9 +179,11 @@ OvsCtEntryCreate(PNET_BUFFER_LIST curNbl,
OvsConntrackKeyLookupCtx *ctx,
OvsFlowKey *key,
BOOLEAN commit,
- UINT64 currentTime)
+ UINT64 currentTime,
+ BOOLEAN *entryCreated)
{
POVS_CT_ENTRY entry = NULL;
+ *entryCreated = FALSE;
UINT32 state = 0;
switch (ipProto)
{
@@ -211,6 +213,7 @@ OvsCtEntryCreate(PNET_BUFFER_LIST curNbl,
entry->parent = parentEntry;
}
OvsCtAddEntry(entry, ctx, currentTime);
+ *entryCreated = TRUE;
}
OvsCtUpdateFlowKey(key, state, ctx->key.zone, 0, NULL);
@@ -232,6 +235,7 @@ OvsCtEntryCreate(PNET_BUFFER_LIST curNbl,
return NULL;
}
OvsCtAddEntry(entry, ctx, currentTime);
+ *entryCreated = TRUE;
}
OvsCtUpdateFlowKey(key, state, ctx->key.zone, 0, NULL);
@@ -246,6 +250,7 @@ OvsCtEntryCreate(PNET_BUFFER_LIST curNbl,
return NULL;
}
OvsCtAddEntry(entry, ctx, currentTime);
+ *entryCreated = TRUE;
}
OvsCtUpdateFlowKey(key, state, ctx->key.zone, 0, NULL);
@@ -525,10 +530,12 @@ OvsProcessConntrackEntry(PNET_BUFFER_LIST curNbl,
OvsFlowKey *key,
UINT16 zone,
BOOLEAN commit,
- UINT64 currentTime)
+ UINT64 currentTime,
+ BOOLEAN *entryCreated)
{
POVS_CT_ENTRY entry = ctx->entry;
UINT32 state = 0;
+ *entryCreated = FALSE;
/* If an entry was found, update the state based on TCP flags */
if (ctx->related) {
@@ -555,7 +562,8 @@ OvsProcessConntrackEntry(PNET_BUFFER_LIST curNbl,
OvsCtEntryDelete(ctx->entry);
ctx->entry = NULL;
entry = OvsCtEntryCreate(curNbl, key->ipKey.nwProto, l4Offset,
- ctx, key, commit, currentTime);
+ ctx, key, commit, currentTime,
+ entryCreated);
if (!entry) {
return NULL;
}
@@ -644,17 +652,19 @@ OvsCtExecute_(PNET_BUFFER_LIST curNbl,
/* Lookup Conntrack entries for a matching entry */
entry = OvsCtLookup(&ctx);
-
+ BOOLEAN entryCreated = FALSE;
if (!entry) {
/* If no matching entry was found, create one and add New state */
entry = OvsCtEntryCreate(curNbl, key->ipKey.nwProto,
layers->l4Offset, &ctx,
- key, commit, currentTime);
+ key, commit, currentTime,
+ &entryCreated);
} else {
/* Process the entry and update CT flags */
OvsCtIncrementCounters(entry, ctx.reply, curNbl);
entry = OvsProcessConntrackEntry(curNbl, layers->l4Offset, &ctx, key,
- zone, commit, currentTime);
+ zone, commit, currentTime,
+ &entryCreated);
}
if (entry && mark) {
@@ -676,6 +686,10 @@ OvsCtExecute_(PNET_BUFFER_LIST curNbl,
}
}
+ if (entryCreated && entry) {
+ OvsPostCtEventEntry(entry, OVS_EVENT_CT_NEW);
+ }
+
NdisReleaseRWLock(ovsConntrackLockObj, &lockState);
return status;