@@ -840,11 +840,11 @@ conntrack_execute(struct conntrack *ct, struct dp_packet_batch *pkt_batch,
const uint32_t *setmark,
const struct ovs_key_ct_labels *setlabel,
const char *helper,
- const struct nat_action_info_t *nat_action_info)
+ const struct nat_action_info_t *nat_action_info,
+ long long now)
{
struct dp_packet **pkts = pkt_batch->packets;
size_t cnt = pkt_batch->count;
- long long now = time_msec();
struct conn_lookup_ctx ctx;
if (helper) {
@@ -95,7 +95,8 @@ int conntrack_execute(struct conntrack *, struct dp_packet_batch *,
uint16_t zone, const uint32_t *setmark,
const struct ovs_key_ct_labels *setlabel,
const char *helper,
- const struct nat_action_info_t *nat_action_info);
+ const struct nat_action_info_t *nat_action_info,
+ long long now);
struct conntrack_dump {
struct conntrack *ct;
@@ -5384,7 +5384,7 @@ dp_execute_cb(void *aux_, struct dp_packet_batch *packets_,
conntrack_execute(&dp->conntrack, packets_, aux->flow->dl_type, force,
commit, zone, setmark, setlabel, helper,
- nat_action_info_ref);
+ nat_action_info_ref, now);
break;
}
@@ -84,12 +84,13 @@ ct_thread_main(void *aux_)
struct dp_packet_batch *pkt_batch;
ovs_be16 dl_type;
size_t i;
+ long long now = time_msec();
pkt_batch = prepare_packets(batch_size, change_conn, aux->tid, &dl_type);
ovs_barrier_block(&barrier);
for (i = 0; i < n_pkts; i += batch_size) {
conntrack_execute(&ct, pkt_batch, dl_type, false, true, 0, NULL, NULL,
- NULL, NULL);
+ NULL, NULL, now);
}
ovs_barrier_block(&barrier);
destroy_packets(pkt_batch);
@@ -154,6 +155,7 @@ pcap_batch_execute_conntrack(struct conntrack *ct,
{
struct dp_packet_batch new_batch;
ovs_be16 dl_type = htons(0);
+ long long now = time_msec();
dp_packet_batch_init(&new_batch);
@@ -172,7 +174,7 @@ pcap_batch_execute_conntrack(struct conntrack *ct,
if (flow.dl_type != dl_type) {
conntrack_execute(ct, &new_batch, dl_type, false, true, 0,
- NULL, NULL, NULL, NULL);
+ NULL, NULL, NULL, NULL, now);
dp_packet_batch_init(&new_batch);
}
new_batch.packets[new_batch.count++] = packet;;
@@ -180,7 +182,7 @@ pcap_batch_execute_conntrack(struct conntrack *ct,
if (!dp_packet_batch_is_empty(&new_batch)) {
conntrack_execute(ct, &new_batch, dl_type, false, true, 0, NULL, NULL,
- NULL, NULL);
+ NULL, NULL, now);
}
}
Current time is passed to conntrack_execute so it doesn't have to recompute it again. Signed-off-by: Antonio Fischetti <antonio.fischetti@intel.com> Acked by: Sugesh Chandran <sugesh.chandran@intel.com> --- In a firewall testbench set up with table=0, priority=1 actions=drop table=0, priority=10,arp actions=NORMAL table=0, priority=100,ct_state=-trk,ip actions=ct(table=1) table=1, ct_state=+new+trk,ip,in_port=1 actions=ct(commit),output:2 table=1, ct_state=+est+trk,ip,in_port=1 actions=output:2 table=1, ct_state=+new+trk,ip,in_port=2 actions=drop table=1, ct_state=+est+trk,ip,in_port=2 actions=output:1 I saw the following performance improvement. I measured packet Rx rate (regardless of packet loss). Bidirectional test with 64B UDP packets. +-------------------+----------------+ | Orig OvS-DPDK + | Previous case | | patches #1,2,3 | + this patch | -------------------+-------------------+----------------+ 10 UDP connections | 2.60, 2.64 | 2.62, 2.66 | -------------------+-------------------+----------------+ lib/conntrack.c | 4 ++-- lib/conntrack.h | 3 ++- lib/dpif-netdev.c | 2 +- tests/test-conntrack.c | 8 +++++--- 4 files changed, 10 insertions(+), 7 deletions(-)