summaryrefslogtreecommitdiffstats
path: root/src/sync-notrack.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2009-01-17 18:03:50 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2009-01-17 18:03:50 +0100
commitb1d00262f999a597fa24af3298195db9cf52b790 (patch)
tree1d4219c35ff62fa663339e0c6a514f954f60f8b4 /src/sync-notrack.c
parent786f37040cdcb64b24eb0b437307ed5e208f717f (diff)
sync: enqueue state updates to tx_queue
With this patch, all the states updates are enqueued in the tx_queue. Thus, there's a single output path. This patch adds a simple refcounting mechanism to note when an object is sitting in the txqueue. This patch also removes the alarm that is required by the ftfw approach. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/sync-notrack.c')
-rw-r--r--src/sync-notrack.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/sync-notrack.c b/src/sync-notrack.c
index 4ded298..3b547ee 100644
--- a/src/sync-notrack.c
+++ b/src/sync-notrack.c
@@ -71,7 +71,8 @@ static int do_cache_to_tx(void *data1, void *data2)
{
struct cache_object *obj = data2;
struct cache_notrack *cn = cache_get_extra(STATE_SYNC(internal), obj);
- queue_add(STATE_SYNC(tx_queue), &cn->qnode);
+ if (queue_add(STATE_SYNC(tx_queue), &cn->qnode))
+ cache_object_get(obj);
return 0;
}
@@ -152,6 +153,7 @@ static int tx_queue_xmit(struct queue_node *n, const void *data2)
mcast_buffered_send_netmsg(STATE_SYNC(mcast_client), net);
queue_del(n);
+ cache_object_put(obj);
break;
}
}
@@ -163,11 +165,19 @@ static void notrack_xmit(void)
queue_iterate(STATE_SYNC(tx_queue), NULL, tx_queue_xmit);
}
+static void notrack_enqueue(struct cache_object *obj, int query)
+{
+ struct cache_notrack *cn = cache_get_extra(STATE_SYNC(internal), obj);
+ if (queue_add(STATE_SYNC(tx_queue), &cn->qnode))
+ cache_object_get(obj);
+}
+
struct sync_mode sync_notrack = {
.internal_cache_flags = LIFETIME,
.external_cache_flags = LIFETIME,
.internal_cache_extra = &cache_notrack_extra,
.local = notrack_local,
.recv = notrack_recv,
+ .enqueue = notrack_enqueue,
.xmit = notrack_xmit,
};