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
|