summaryrefslogtreecommitdiff
path: root/lib/conntrack.c
diff options
context:
space:
mode:
authorDarrell Ball <dlu998@gmail.com>2019-02-13 15:34:21 -0800
committerBen Pfaff <blp@ovn.org>2019-02-14 14:18:56 -0800
commit4ea96698f66792302b88b06c756862e24cc5b88e (patch)
tree3f4920fe570a2a9c48ee81f50160ebe95d925513 /lib/conntrack.c
parent9f17f104fe789b0ae803a2a45bba63057a73b116 (diff)
downloadopenvswitch-4ea96698f66792302b88b06c756862e24cc5b88e.tar.gz
Userspace datapath: Add fragmentation handling.
Fragmentation handling is added for supporting conntrack. Both v4 and v6 are supported. After discussion with several people, I decided to not store configuration state in the database to be more consistent with the kernel in future, similarity with other conntrack configuration which will not be in the database as well and overall simplicity. Accordingly, fragmentation handling is enabled by default. This patch enables fragmentation tests for the userspace datapath. Signed-off-by: Darrell Ball <dlu998@gmail.com> Signed-off-by: Ben Pfaff <blp@ovn.org>
Diffstat (limited to 'lib/conntrack.c')
-rw-r--r--lib/conntrack.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/conntrack.c b/lib/conntrack.c
index a044a6987..78c673c56 100644
--- a/lib/conntrack.c
+++ b/lib/conntrack.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, 2017 Nicira, Inc.
+ * Copyright (c) 2015-2019 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -30,6 +30,7 @@
#include "ct-dpif.h"
#include "dp-packet.h"
#include "flow.h"
+#include "ipf.h"
#include "netdev.h"
#include "odp-netlink.h"
#include "openvswitch/hmap.h"
@@ -340,6 +341,7 @@ conntrack_init(struct conntrack *ct)
atomic_init(&ct->n_conn_limit, DEFAULT_N_CONN_LIMIT);
latch_init(&ct->clean_thread_exit);
ct->clean_thread = ovs_thread_create("ct_clean", clean_thread_main, ct);
+ ct->ipf = ipf_init();
}
/* Destroys the connection tracker 'ct' and frees all the allocated memory. */
@@ -382,6 +384,7 @@ conntrack_destroy(struct conntrack *ct)
hindex_destroy(&ct->alg_expectation_refs);
ct_rwlock_unlock(&ct->resources_lock);
ct_rwlock_destroy(&ct->resources_lock);
+ ipf_destroy(ct->ipf);
}
static unsigned hash_to_bucket(uint32_t hash)
@@ -1299,7 +1302,8 @@ process_one(struct conntrack *ct, struct dp_packet *pkt,
/* Sends the packets in '*pkt_batch' through the connection tracker 'ct'. All
* the packets must have the same 'dl_type' (IPv4 or IPv6) and should have
- * the l3 and and l4 offset properly set.
+ * the l3 and and l4 offset properly set. Performs fragment reassembly with
+ * the help of ipf_preprocess_conntrack().
*
* If 'commit' is true, the packets are allowed to create new entries in the
* connection tables. 'setmark', if not NULL, should point to a two
@@ -1314,11 +1318,15 @@ conntrack_execute(struct conntrack *ct, struct dp_packet_batch *pkt_batch,
const struct nat_action_info_t *nat_action_info,
long long now)
{
+ ipf_preprocess_conntrack(ct->ipf, pkt_batch, now, dl_type, zone,
+ ct->hash_basis);
+
struct dp_packet *packet;
struct conn_lookup_ctx ctx;
DP_PACKET_BATCH_FOR_EACH (i, packet, pkt_batch) {
- if (!conn_key_extract(ct, packet, dl_type, &ctx, zone)) {
+ if (packet->md.ct_state == CS_INVALID
+ || !conn_key_extract(ct, packet, dl_type, &ctx, zone)) {
packet->md.ct_state = CS_INVALID;
write_ct_md(packet, zone, NULL, NULL, NULL);
continue;
@@ -1327,6 +1335,8 @@ conntrack_execute(struct conntrack *ct, struct dp_packet_batch *pkt_batch,
setlabel, nat_action_info, tp_src, tp_dst, helper);
}
+ ipf_postprocess_conntrack(ct->ipf, pkt_batch, now, dl_type);
+
return 0;
}
@@ -2484,6 +2494,12 @@ conn_to_ct_dpif_entry(const struct conn *conn, struct ct_dpif_entry *entry,
}
}
+struct ipf *
+conntrack_ipf_ctx(struct conntrack *ct)
+{
+ return ct->ipf;
+}
+
int
conntrack_dump_start(struct conntrack *ct, struct conntrack_dump *dump,
const uint16_t *pzone, int *ptot_bkts)