summaryrefslogtreecommitdiffstats
path: root/src/sync-mode.c
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2009-02-06 17:43:40 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2009-02-06 17:43:40 +0100
commitba2f8458ecfa0827e09a1c40c9e29868239fafa1 (patch)
tree1e9446c0b3dd93a570af2a2a9fec678ca14ab05d /src/sync-mode.c
parentc3ef4d9b32ca653571f0976f73aaa99218a36db0 (diff)
src: re-work polling strategy
This patch improves the polling support included in 0.9.10. The polling now consists of getting the state table, wait for PollSecs, then purge obsolete entries, and so on. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/sync-mode.c')
-rw-r--r--src/sync-mode.c28
1 files changed, 17 insertions, 11 deletions
diff --git a/src/sync-mode.c b/src/sync-mode.c
index 84a4de0..8174681 100644
--- a/src/sync-mode.c
+++ b/src/sync-mode.c
@@ -499,8 +499,15 @@ static int local_handler_sync(int fd, int type, void *data)
return ret;
}
+static void mcast_send_sync(struct cache_object *obj, int query)
+{
+ STATE_SYNC(sync)->enqueue(obj, query);
+}
+
static void dump_sync(struct nf_conntrack *ct)
{
+ struct cache_object *obj;
+
/* This is required by kernels < 2.6.20 */
nfct_attr_unset(ct, ATTR_ORIG_COUNTER_BYTES);
nfct_attr_unset(ct, ATTR_ORIG_COUNTER_PACKETS);
@@ -508,23 +515,22 @@ static void dump_sync(struct nf_conntrack *ct)
nfct_attr_unset(ct, ATTR_REPL_COUNTER_PACKETS);
nfct_attr_unset(ct, ATTR_USE);
- if (cache_update_force(STATE_SYNC(internal), ct))
- debug_ct(ct, "resync");
-}
-
-static void mcast_send_sync(struct cache_object *obj, int query)
-{
- STATE_SYNC(sync)->enqueue(obj, query);
+ obj = cache_update_force(STATE_SYNC(internal), ct);
+ if ((CONFIG(flags) & CTD_POLL)) {
+ if (obj != NULL && obj->status == C_OBJ_NEW) {
+ debug_ct(ct, "poll");
+ mcast_send_sync(obj, NET_T_STATE_NEW);
+ }
+ }
}
static int purge_step(void *data1, void *data2)
{
- int ret;
- struct nfct_handle *h = STATE(dump);
struct cache_object *obj = data2;
- ret = nfct_query(h, NFCT_Q_GET, obj->ct);
- if (ret == -1 && errno == ENOENT) {
+ STATE(get_retval) = 0;
+ nl_get_conntrack(STATE(get), obj->ct); /* modifies STATE(get_reval) */
+ if (!STATE(get_retval)) {
debug_ct(obj->ct, "purge resync");
if (obj->status != C_OBJ_DEAD) {
cache_object_set_status(obj, C_OBJ_DEAD);