summaryrefslogtreecommitdiff
path: root/include/cache.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/cache.h')
-rw-r--r--include/cache.h69
1 files changed, 59 insertions, 10 deletions
diff --git a/include/cache.h b/include/cache.h
index 28917f2..3af2741 100644
--- a/include/cache.h
+++ b/include/cache.h
@@ -21,13 +21,14 @@ enum {
C_OBJ_NONE = 0, /* not in the cache */
C_OBJ_NEW, /* just added to the cache */
C_OBJ_ALIVE, /* in the cache, alive */
- C_OBJ_DEAD /* still in the cache, but dead */
+ C_OBJ_DEAD, /* still in the cache, but dead */
+ C_OBJ_MAX
};
struct cache;
struct cache_object {
struct hashtable_node hashnode;
- struct nf_conntrack *ct;
+ void *ptr;
struct cache *cache;
int status;
int refcnt;
@@ -48,14 +49,23 @@ extern struct cache_feature timer_feature;
#define CACHE_MAX_NAMELEN 32
+enum cache_type {
+ CACHE_T_NONE = 0,
+ CACHE_T_CT,
+ CACHE_T_EXP,
+ CACHE_T_MAX
+};
+
struct cache {
char name[CACHE_MAX_NAMELEN];
+ enum cache_type type;
struct hashtable *h;
unsigned int num_features;
struct cache_feature **features;
unsigned int feature_type[CACHE_MAX_FEATURE];
unsigned int *feature_offset;
+ struct cache_ops *ops;
struct cache_extra *extra;
unsigned int extra_offset;
size_t object_size;
@@ -94,34 +104,73 @@ struct cache_extra {
void (*destroy)(struct cache_object *obj, void *data);
};
+struct nfct_handle;
+
+/* cache options depends on the object type: conntrack or expectation. */
+struct cache_ops {
+ /* hashing and comparison of objects. */
+ uint32_t (*hash)(const void *data, const struct hashtable *table);
+ int (*cmp)(const void *data1, const void *data2);
+
+ /* object allocation, copy and release. */
+ void *(*alloc)(void);
+ void (*copy)(void *dst, void *src, unsigned int flags);
+ void (*free)(void *ptr);
+
+ /* dump and commit. */
+ int (*dump_step)(void *data1, void *n);
+ int (*commit)(struct cache *c, struct nfct_handle *h, int clientfd);
+
+ /* build network message from object. */
+ struct nethdr *(*build_msg)(const struct cache_object *obj, int type);
+};
+
+/* templates to configure conntrack caching. */
+extern struct cache_ops cache_sync_internal_ct_ops;
+extern struct cache_ops cache_sync_external_ct_ops;
+extern struct cache_ops cache_stats_ct_ops;
+/* templates to configure expectation caching. */
+extern struct cache_ops cache_sync_internal_exp_ops;
+extern struct cache_ops cache_sync_external_exp_ops;
+
struct nf_conntrack;
-struct cache *cache_create(const char *name, unsigned int features, struct cache_extra *extra);
+struct cache *cache_create(const char *name, enum cache_type type, unsigned int features, struct cache_extra *extra, struct cache_ops *ops);
void cache_destroy(struct cache *e);
-struct cache_object *cache_object_new(struct cache *c, struct nf_conntrack *ct);
+struct cache_object *cache_object_new(struct cache *c, void *ptr);
void cache_object_free(struct cache_object *obj);
void cache_object_get(struct cache_object *obj);
int cache_object_put(struct cache_object *obj);
void cache_object_set_status(struct cache_object *obj, int status);
int cache_add(struct cache *c, struct cache_object *obj, int id);
-void cache_update(struct cache *c, struct cache_object *obj, int id, struct nf_conntrack *ct);
-struct cache_object *cache_update_force(struct cache *c, struct nf_conntrack *ct);
+void cache_update(struct cache *c, struct cache_object *obj, int id, void *ptr);
+struct cache_object *cache_update_force(struct cache *c, void *ptr);
void cache_del(struct cache *c, struct cache_object *obj);
-struct cache_object *cache_find(struct cache *c, struct nf_conntrack *ct, int *pos);
+struct cache_object *cache_find(struct cache *c, void *ptr, int *pos);
void cache_stats(const struct cache *c, int fd);
void cache_stats_extended(const struct cache *c, int fd);
-struct cache_object *cache_data_get_object(struct cache *c, void *data);
-void *cache_get_extra(struct cache *, void *);
+void *cache_get_extra(struct cache_object *);
void cache_iterate(struct cache *c, void *data, int (*iterate)(void *data1, void *data2));
void cache_iterate_limit(struct cache *c, void *data, uint32_t from, uint32_t steps, int (*iterate)(void *data1, void *data2));
/* iterators */
struct nfct_handle;
+struct __dump_container {
+ int fd;
+ int type;
+};
+
void cache_dump(struct cache *c, int fd, int type);
-void cache_commit(struct cache *c, struct nfct_handle *h, int clientfd);
+
+struct __commit_container {
+ struct nfct_handle *h;
+ struct cache *c;
+};
+
+int cache_commit(struct cache *c, struct nfct_handle *h, int clientfd);
void cache_flush(struct cache *c);
void cache_bulk(struct cache *c);