diff options
author | Darrell Ball <dlu998@gmail.com> | 2019-05-28 11:14:42 -0700 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2019-06-05 14:58:43 -0700 |
commit | 5f918a8a4d4a775b9c1239657afcd73af3ec9827 (patch) | |
tree | 40c490469bd21dda4c9e2106f91a62ad4f0165d1 | |
parent | 52d12cc4590d5b95505a21d3508586db3bb35d07 (diff) | |
download | openvswitch-5f918a8a4d4a775b9c1239657afcd73af3ec9827.tar.gz |
conntrack: Don't re-add cleaned 'conn' to expiry list.
When a 'conn' entry is cleaned up from an expiry list, we don't
want to put it back during an update. Hence, we detect and block this.
Fixes: 967bb5c5cd90 ("conntrack: Add rcu support.")
Signed-off-by: Darrell Ball <dlu998@gmail.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
-rw-r--r-- | lib/conntrack-private.h | 11 | ||||
-rw-r--r-- | lib/conntrack.c | 2 |
2 files changed, 9 insertions, 4 deletions
diff --git a/lib/conntrack-private.h b/lib/conntrack-private.h index 51b7d7f76..bcfbe104b 100644 --- a/lib/conntrack-private.h +++ b/lib/conntrack-private.h @@ -102,11 +102,12 @@ struct conn { /* Mutable data. */ struct ovs_mutex lock; /* Guards all mutable fields. */ ovs_u128 label; - uint32_t mark; long long expiration; + uint32_t mark; int seq_skew; bool seq_skew_dir; /* TCP sequence skew direction due to NATTing of FTP * control messages; true if reply direction. */ + bool cleaned; /* True if cleaned from expiry lists. */ /* Immutable data. */ bool alg_related; /* True if alg data connection. */ @@ -218,9 +219,11 @@ conn_update_expiration(struct conntrack *ct, struct conn *conn, ovs_mutex_lock(&ct->ct_lock); ovs_mutex_lock(&conn->lock); - conn->expiration = now + ct_timeout_val[tm]; - ovs_list_remove(&conn->exp_node); - ovs_list_push_back(&ct->exp_lists[tm], &conn->exp_node); + if (!conn->cleaned) { + conn->expiration = now + ct_timeout_val[tm]; + ovs_list_remove(&conn->exp_node); + ovs_list_push_back(&ct->exp_lists[tm], &conn->exp_node); + } ovs_mutex_unlock(&conn->lock); ovs_mutex_unlock(&ct->ct_lock); diff --git a/lib/conntrack.c b/lib/conntrack.c index d7d48a43a..c57d9fdf5 100644 --- a/lib/conntrack.c +++ b/lib/conntrack.c @@ -343,6 +343,7 @@ conn_clean(struct conntrack *ct, struct conn *conn) cmap_remove(&ct->conns, &conn->nat_conn->cm_node, hash); } ovs_list_remove(&conn->exp_node); + conn->cleaned = true; ovsrcu_postpone(delete_conn, conn); atomic_count_dec(&ct->n_conn); } @@ -354,6 +355,7 @@ conn_clean_one(struct conntrack *ct, struct conn *conn) conn_clean_cmn(ct, conn); if (conn->conn_type == CT_CONN_TYPE_DEFAULT) { ovs_list_remove(&conn->exp_node); + conn->cleaned = true; atomic_count_dec(&ct->n_conn); } ovsrcu_postpone(delete_conn_one, conn); |