diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cache.c | 10 | ||||
-rw-r--r-- | src/cache_iterators.c | 2 | ||||
-rw-r--r-- | src/network.c | 13 |
3 files changed, 21 insertions, 4 deletions
diff --git a/src/cache.c b/src/cache.c index 621a3f4..c46498b 100644 --- a/src/cache.c +++ b/src/cache.c @@ -196,6 +196,7 @@ struct cache_object *cache_object_new(struct cache *c, struct nf_conntrack *ct) return NULL; } memcpy(obj->ct, ct, nfct_sizeof(ct)); + obj->status = C_OBJ_NONE; return obj; } @@ -225,6 +226,7 @@ static int __add(struct cache *c, struct cache_object *obj, int id) c->extra->add(obj, ((char *) obj) + c->extra_offset); c->stats.active++; + obj->status = C_OBJ_NEW; return 0; } @@ -260,6 +262,7 @@ void cache_update(struct cache *c, struct cache_object *obj, int id, c->extra->update(obj, ((char *) obj) + c->extra_offset); c->stats.upd_ok++; + obj->status = C_OBJ_ALIVE; } static void __del(struct cache *c, struct cache_object *obj) @@ -285,7 +288,7 @@ void cache_del(struct cache *c, struct cache_object *obj) * kill an entry was previously deleted via * __cache_del_timer. */ - if (!alarm_pending(&obj->alarm)) { + if (obj->status != C_OBJ_DEAD) { c->stats.del_ok++; c->stats.active--; } @@ -301,7 +304,7 @@ cache_update_force(struct cache *c, struct nf_conntrack *ct) obj = cache_find(c, ct, &id); if (obj) { - if (!alarm_pending(&obj->alarm)) { + if (obj->status != C_OBJ_DEAD) { cache_update(c, obj, id, ct); return obj; } else { @@ -333,7 +336,8 @@ int cache_del_timer(struct cache *c, struct cache_object *obj, int timeout) cache_object_free(obj); return 1; } - if (!alarm_pending(&obj->alarm)) { + if (obj->status != C_OBJ_DEAD) { + obj->status = C_OBJ_DEAD; add_alarm(&obj->alarm, timeout, 0); /* * increase stats even if this entry was not really diff --git a/src/cache_iterators.c b/src/cache_iterators.c index 4773889..ab6a461 100644 --- a/src/cache_iterators.c +++ b/src/cache_iterators.c @@ -51,7 +51,7 @@ static int do_dump(void *data1, struct hashtable_node *n) * specific and it breaks conntrackd modularity. Probably * there's a nicer way to do this but until I come up with it... */ - if (CONFIG(flags) & CTD_SYNC_FTFW && alarm_pending(&obj->alarm)) + if (CONFIG(flags) & CTD_SYNC_FTFW && obj->status == C_OBJ_DEAD) return 0; /* do not show cached timeout, this may confuse users */ diff --git a/src/network.c b/src/network.c index 598195f..320cdea 100644 --- a/src/network.c +++ b/src/network.c @@ -177,3 +177,16 @@ int mcast_track_is_seq_set() { return local_seq_set; } + +#include "cache.h" + +static int status2type[] = { + [C_OBJ_NEW] = NET_T_STATE_NEW, + [C_OBJ_ALIVE] = NET_T_STATE_UPD, + [C_OBJ_DEAD] = NET_T_STATE_DEL, +}; + +int object_status_to_network_type(int status) +{ + return status2type[status]; +} |