summaryrefslogtreecommitdiff
path: root/lib/conntrack.c
diff options
context:
space:
mode:
authorWilliam Tu <u9012063@gmail.com>2020-04-29 12:25:11 -0700
committerWilliam Tu <u9012063@gmail.com>2020-05-01 08:22:45 -0700
commit2078901a4c142d25d1fae8710f4d38938385c954 (patch)
treeaa8faa2bc512bdc8fee15462cdac00072fb74537 /lib/conntrack.c
parent5519e384f6a17f564fef4c5eb39e471e16c77235 (diff)
downloadopenvswitch-2078901a4c142d25d1fae8710f4d38938385c954.tar.gz
userspace: Add conntrack timeout policy support.
Commit 1f1613183733 ("ct-dpif, dpif-netlink: Add conntrack timeout policy support") adds conntrack timeout policy for kernel datapath. This patch enables support for the userspace datapath. I tested using the 'make check-system-userspace' which checks the timeout policies for ICMP and UDP cases. Signed-off-by: William Tu <u9012063@gmail.com> Acked-by: Yi-Hung Wei <yihung.wei@gmail.com>
Diffstat (limited to 'lib/conntrack.c')
-rw-r--r--lib/conntrack.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/lib/conntrack.c b/lib/conntrack.c
index 95d48c5ee..f42ba4b60 100644
--- a/lib/conntrack.c
+++ b/lib/conntrack.c
@@ -25,6 +25,7 @@
#include "bitmap.h"
#include "conntrack.h"
#include "conntrack-private.h"
+#include "conntrack-tp.h"
#include "coverage.h"
#include "csum.h"
#include "ct-dpif.h"
@@ -89,7 +90,8 @@ static uint32_t conn_key_hash(const struct conn_key *, uint32_t basis);
static void conn_key_reverse(struct conn_key *);
static bool valid_new(struct dp_packet *pkt, struct conn_key *);
static struct conn *new_conn(struct conntrack *ct, struct dp_packet *pkt,
- struct conn_key *, long long now);
+ struct conn_key *, long long now,
+ uint32_t tp_id);
static void delete_conn_cmn(struct conn *);
static void delete_conn(struct conn *);
static void delete_conn_one(struct conn *conn);
@@ -176,12 +178,6 @@ static alg_helper alg_helpers[] = {
[CT_ALG_CTL_TFTP] = handle_tftp_ctl,
};
-long long ct_timeout_val[] = {
-#define CT_TIMEOUT(NAME, VAL) [CT_TM_##NAME] = VAL,
- CT_TIMEOUTS
-#undef CT_TIMEOUT
-};
-
/* The maximum TCP or UDP port number. */
#define CT_MAX_L4_PORT 65535
/* String buffer used for parsing FTP string messages.
@@ -313,6 +309,7 @@ conntrack_init(void)
}
hmap_init(&ct->zone_limits);
ct->zone_limit_seq = 0;
+ timeout_policy_init(ct);
ovs_mutex_unlock(&ct->ct_lock);
ct->hash_basis = random_uint32();
@@ -503,6 +500,12 @@ conntrack_destroy(struct conntrack *ct)
}
hmap_destroy(&ct->zone_limits);
+ struct timeout_policy *tp;
+ HMAP_FOR_EACH_POP (tp, node, &ct->timeout_policies) {
+ free(tp);
+ }
+ hmap_destroy(&ct->timeout_policies);
+
ovs_mutex_unlock(&ct->ct_lock);
ovs_mutex_destroy(&ct->ct_lock);
@@ -957,7 +960,7 @@ conn_not_found(struct conntrack *ct, struct dp_packet *pkt,
struct conn_lookup_ctx *ctx, bool commit, long long now,
const struct nat_action_info_t *nat_action_info,
const char *helper, const struct alg_exp_node *alg_exp,
- enum ct_alg_ctl_type ct_alg_ctl)
+ enum ct_alg_ctl_type ct_alg_ctl, uint32_t tp_id)
OVS_REQUIRES(ct->ct_lock)
{
struct conn *nc = NULL;
@@ -988,7 +991,7 @@ conn_not_found(struct conntrack *ct, struct dp_packet *pkt,
return nc;
}
- nc = new_conn(ct, pkt, &ctx->key, now);
+ nc = new_conn(ct, pkt, &ctx->key, now, tp_id);
memcpy(&nc->key, &ctx->key, sizeof nc->key);
memcpy(&nc->rev_key, &nc->key, sizeof nc->rev_key);
conn_key_reverse(&nc->rev_key);
@@ -1276,7 +1279,8 @@ process_one(struct conntrack *ct, struct dp_packet *pkt,
bool force, bool commit, long long now, const uint32_t *setmark,
const struct ovs_key_ct_labels *setlabel,
const struct nat_action_info_t *nat_action_info,
- ovs_be16 tp_src, ovs_be16 tp_dst, const char *helper)
+ ovs_be16 tp_src, ovs_be16 tp_dst, const char *helper,
+ uint32_t tp_id)
{
/* Reset ct_state whenever entering a new zone. */
if (pkt->md.ct_state && pkt->md.ct_zone != zone) {
@@ -1360,7 +1364,7 @@ process_one(struct conntrack *ct, struct dp_packet *pkt,
ovs_mutex_lock(&ct->ct_lock);
if (!conn_lookup(ct, &ctx->key, now, NULL, NULL)) {
conn = conn_not_found(ct, pkt, ctx, commit, now, nat_action_info,
- helper, alg_exp, ct_alg_ctl);
+ helper, alg_exp, ct_alg_ctl, tp_id);
}
ovs_mutex_unlock(&ct->ct_lock);
}
@@ -1396,7 +1400,7 @@ conntrack_execute(struct conntrack *ct, struct dp_packet_batch *pkt_batch,
const struct ovs_key_ct_labels *setlabel,
ovs_be16 tp_src, ovs_be16 tp_dst, const char *helper,
const struct nat_action_info_t *nat_action_info,
- long long now)
+ long long now, uint32_t tp_id)
{
ipf_preprocess_conntrack(ct->ipf, pkt_batch, now, dl_type, zone,
ct->hash_basis);
@@ -1418,7 +1422,8 @@ conntrack_execute(struct conntrack *ct, struct dp_packet_batch *pkt_batch,
write_ct_md(packet, zone, NULL, NULL, NULL);
} else {
process_one(ct, packet, &ctx, zone, force, commit, now, setmark,
- setlabel, nat_action_info, tp_src, tp_dst, helper);
+ setlabel, nat_action_info, tp_src, tp_dst, helper,
+ tp_id);
}
}
@@ -1524,7 +1529,7 @@ conntrack_clean(struct conntrack *ct, long long now)
atomic_read_relaxed(&ct->n_conn_limit, &n_conn_limit);
size_t clean_max = n_conn_limit > 10 ? n_conn_limit / 10 : 1;
long long min_exp = ct_sweep(ct, now, clean_max);
- long long next_wakeup = MIN(min_exp, now + CT_TM_MIN);
+ long long next_wakeup = MIN(min_exp, now + CT_DPIF_NETDEV_TP_MIN);
return next_wakeup;
}
@@ -2354,9 +2359,9 @@ valid_new(struct dp_packet *pkt, struct conn_key *key)
static struct conn *
new_conn(struct conntrack *ct, struct dp_packet *pkt, struct conn_key *key,
- long long now)
+ long long now, uint32_t tp_id)
{
- return l4_protos[key->nw_proto]->new_conn(ct, pkt, now);
+ return l4_protos[key->nw_proto]->new_conn(ct, pkt, now, tp_id);
}
static void