diff options
author | Sairam Venugopal <vsairam@vmware.com> | 2017-03-02 13:41:03 -0800 |
---|---|---|
committer | Gurucharan Shetty <guru@ovn.org> | 2017-03-07 13:29:11 -0800 |
commit | b841a44114e9cee670e809ace853795dce2b6fd9 (patch) | |
tree | 8069ab5505587e4f7e0e4ea8710ac1d11e8edb77 /datapath-windows/ovsext/Conntrack.c | |
parent | 92d8490fa2d954219d0307835d6df6c3efb7b221 (diff) | |
download | openvswitch-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.c | 28 |
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; |