1 /*
2  * include/types/peers.h
3  * This file defines everything related to peers.
4  *
5  * Copyright 2010 EXCELIANCE, Emeric Brun <ebrun@exceliance.fr>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation, version 2.1
10  * exclusively.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20  */
21 
22 #ifndef _TYPES_PEERS_H
23 #define _TYPES_PEERS_H
24 
25 #include <sys/types.h>
26 #include <sys/socket.h>
27 #include <netinet/in.h>
28 #include <arpa/inet.h>
29 
30 #include <common/config.h>
31 #include <common/mini-clist.h>
32 #include <common/regex.h>
33 #include <common/tools.h>
34 #include <eb32tree.h>
35 
36 #include <types/dict.h>
37 
38 struct shared_table {
39 	struct stktable *table;       /* stick table to sync */
40 	int local_id;
41 	int remote_id;
42 	int flags;
43 	uint64_t remote_data;
44 	unsigned int last_acked;
45 	unsigned int last_pushed;
46 	unsigned int last_get;
47 	unsigned int teaching_origin;
48 	unsigned int update;
49 	struct shared_table *next;    /* next shared table in list */
50 };
51 
52 struct peer {
53 	int local;                    /* proxy state */
54 	char *id;
55 	struct {
56 		const char *file;         /* file where the section appears */
57 		int line;                 /* line where the section appears */
58 	} conf;                       /* config information */
59 	time_t last_change;
60 	struct sockaddr_storage addr; /* peer address */
61 	struct protocol *proto;       /* peer address protocol */
62 	struct xprt_ops *xprt;        /* peer socket operations at transport layer */
63 	void *sock_init_arg;          /* socket operations's opaque init argument if needed */
64 	unsigned int flags;           /* peer session flags */
65 	unsigned int statuscode;      /* current/last session status code */
66 	unsigned int reconnect;       /* next connect timer */
67 	unsigned int heartbeat;       /* next heartbeat timer */
68 	unsigned int confirm;         /* confirm message counter */
69 	uint32_t rx_hbt;              /* received heartbeats counter */
70 	uint32_t tx_hbt;              /* transmitted heartbeats counter */
71 	uint32_t no_hbt;              /* no received heartbeat counter */
72 	uint32_t new_conn;            /* new connection after reconnection timeout expiration counter */
73 	uint32_t proto_err;           /* protocol errors counter */
74 	struct appctx *appctx;        /* the appctx running it */
75 	struct shared_table *remote_table;
76 	struct shared_table *last_local_table;
77 	struct shared_table *tables;
78 	struct server *srv;
79 	struct dcache *dcache;        /* dictionary cache */
80 	__decl_hathreads(HA_SPINLOCK_T lock); /* lock used to handle this peer section */
81 	struct peer *next;            /* next peer in the list */
82 };
83 
84 
85 struct peers {
86 	int state;                      /* proxy state */
87 	char *id;                       /* peer section name */
88 	struct task *sync_task;         /* main sync task */
89 	struct sig_handler *sighandler; /* signal handler */
90 	struct peer *remote;            /* remote peers list */
91 	struct peer *local;             /* local peer list */
92 	struct proxy *peers_fe;         /* peer frontend */
93 	struct {
94 		const char *file;           /* file where the section appears */
95 		int line;                   /* line where the section appears */
96 	} conf;                         /* config information */
97 	time_t last_change;
98 	struct peers *next;             /* next peer section */
99 	unsigned int flags;             /* current peers section resync state */
100 	unsigned int resync_timeout;    /* resync timeout timer */
101 	int count;                      /* total of peers */
102 };
103 
104 /* LRU cache for dictionaies */
105 struct dcache_tx {
106 	/* The last recently used key */
107 	unsigned int lru_key;
108 	/* An array of entries to store pointers to dictionary entries. */
109 	struct ebpt_node *entries;
110 	/* The previous lookup result. */
111 	struct ebpt_node *prev_lookup;
112 	/* ebtree to store the previous entries. */
113 	struct eb_root cached_entries;
114 };
115 
116 struct dcache_rx {
117 	unsigned int id;
118 	struct dict_entry *de;
119 };
120 
121 struct dcache_tx_entry {
122 	unsigned int id;
123 	struct ebpt_node entry;
124 };
125 
126 /* stick-table data type cache */
127 struct dcache {
128 	/* Cache used upon transmission */
129 	struct dcache_tx *tx;
130 	/* Cache used upon receipt */
131 	struct dcache_rx *rx;
132 	/* Maximum number of entries in this cache */
133 	size_t max_entries;
134 };
135 
136 extern struct peers *cfg_peers;
137 
138 #endif /* _TYPES_PEERS_H */
139 
140