1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
#ifndef _CACHE_H_
#define _CACHE_H_
#include <stdint.h>
#include <stddef.h>
#include "hash.h"
#include "date.h"
/* cache features */
enum {
NO_FEATURES = 0,
TIMER_FEATURE = 0,
TIMER = (1 << TIMER_FEATURE),
__CACHE_MAX_FEATURE
};
#define CACHE_MAX_FEATURE __CACHE_MAX_FEATURE
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_MAX
};
struct cache;
struct cache_object {
struct hashtable_node hashnode;
void *ptr;
struct cache *cache;
int status;
int refcnt;
long lifetime;
long lastupdate;
char data[0];
};
struct cache_feature {
size_t size;
void (*add)(struct cache_object *obj, void *data);
void (*update)(struct cache_object *obj, void *data);
void (*destroy)(struct cache_object *obj, void *data);
int (*dump)(struct cache_object *obj, void *data, char *buf, int type);
};
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;
/* statistics */
struct {
uint32_t active;
uint32_t add_ok;
uint32_t del_ok;
uint32_t upd_ok;
uint32_t add_fail;
uint32_t del_fail;
uint32_t upd_fail;
uint32_t add_fail_enomem;
uint32_t add_fail_enospc;
uint32_t del_fail_enoent;
uint32_t upd_fail_enoent;
uint32_t commit_ok;
uint32_t commit_fail;
uint32_t flush;
uint32_t objects;
} stats;
};
struct cache_extra {
unsigned int size;
void (*add)(struct cache_object *obj, void *data);
void (*update)(struct cache_object *obj, void *data);
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, 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, 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, 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, void *ptr, int *pos);
void cache_stats(const struct cache *c, int fd);
void cache_stats_extended(const struct cache *c, int fd);
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);
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);
#endif
|