[MEDIUM] Add stick table (persistence) management functions and types
diff --git a/include/types/stick_table.h b/include/types/stick_table.h
new file mode 100644
index 0000000..fd0c806
--- /dev/null
+++ b/include/types/stick_table.h
@@ -0,0 +1,89 @@
+/*
+ * include/types/stick_table.h
+ * Macros, variables and structures for stick tables management.
+ *
+ * Copyright (C) 2009-2010 EXCELIANCE, Emeric Brun <ebrun@exceliance.fr>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, version 2.1
+ * exclusively.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef _TYPES_STICK_TABLE_H
+#define _TYPES_STICK_TABLE_H
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#include <ebtree.h>
+#include <ebmbtree.h>
+#include <eb32tree.h>
+#include <common/memory.h>
+
+/* stick table key types */
+#define STKTABLE_TYPE_IP 0 /* table key is ipv4 */
+#define STKTABLE_TYPE_INTEGER 1 /* table key is unsigned 32bit integer */
+#define STKTABLE_TYPE_STRING 2 /* table key is a null terminated string */
+
+#define STKTABLE_TYPES 3 /* Increase this value if you add a type */
+
+/* stick table type flags */
+#define STKTABLE_TYPEFLAG_CUSTOMKEYSIZE 0x00000001 /* this table type maxsize is configurable */
+
+/* stick table keyword type */
+struct stktable_type {
+ const char *kw; /* keyword string */
+ int flags; /* type flags */
+ size_t default_size; /* default key size */
+};
+
+/* stuck session */
+struct stksess {
+ int sid; /* id of server to use for session */
+ unsigned int expire; /* session expiration date */
+ struct eb32_node exps; /* ebtree node used to hold the session in expiration tree */
+ struct ebmb_node keys; /* ebtree node used to hold the session in table */
+};
+
+
+/* stick table */
+struct stktable {
+ struct eb_root keys; /* head of stuck session tree */
+ struct eb_root exps; /* head of stuck session expiration tree */
+ struct pool_head *pool; /* pool used to allocate stuck sessions */
+ struct task *exp_task; /* expiration task */
+ unsigned long type; /* type of table (determine key format) */
+ size_t key_size; /* size of a key, maximum size in case of string */
+ unsigned int size; /* maximum stuck session in table */
+ unsigned int current; /* number of stuck session in table */
+ int nopurge; /* 1 never purge stuck sessions */
+ int exp_next; /* next epiration date */
+ int expire; /* duration before expiration of stuck session */
+};
+
+/* stick table key data */
+union stktable_key_data {
+ struct in_addr ip; /* used to store an ip key */
+ uint32_t integer; /* used to store an integer key */
+ char buf[BUFSIZE]; /* used to store a null terminated string key */
+};
+
+/* stick table key */
+struct stktable_key {
+ void *key; /* pointer on key buffer */
+ size_t key_len; /* data len to read in buff in case of null terminated string */
+ union stktable_key_data data; /* data */
+};
+
+#endif /* _TYPES_STICK_TABLE_H */
+