1 /*
2  * include/haproxy/peers-t.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 _HAPROXY_PEERS_T_H
23 #define _HAPROXY_PEERS_T_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 <import/eb32tree.h>
31 
32 #include <haproxy/api-t.h>
33 #include <haproxy/dict-t.h>
34 #include <haproxy/thread-t.h>
35 
36 
37 struct shared_table {
38 	struct stktable *table;       /* stick table to sync */
39 	int local_id;
40 	int remote_id;
41 	int flags;
42 	uint64_t remote_data;
43 	unsigned int last_acked;
44 	unsigned int last_pushed;
45 	unsigned int last_get;
46 	unsigned int teaching_origin;
47 	unsigned int update;
48 	struct shared_table *next;    /* next shared table in list */
49 };
50 
51 struct peer {
52 	int local;                    /* proxy state */
53 	char *id;
54 	struct {
55 		const char *file;         /* file where the section appears */
56 		int line;                 /* line where the section appears */
57 	} conf;                       /* config information */
58 	time_t last_change;
59 	struct sockaddr_storage addr; /* peer address */
60 	struct protocol *proto;       /* peer address protocol */
61 	struct xprt_ops *xprt;        /* peer socket operations at transport layer */
62 	void *sock_init_arg;          /* socket operations's opaque init argument if needed */
63 	unsigned int flags;           /* peer session flags */
64 	unsigned int statuscode;      /* current/last session status code */
65 	unsigned int reconnect;       /* next connect timer */
66 	unsigned int heartbeat;       /* next heartbeat timer */
67 	unsigned int confirm;         /* confirm message counter */
68 	uint32_t rx_hbt;              /* received heartbeats counter */
69 	uint32_t tx_hbt;              /* transmitted heartbeats counter */
70 	uint32_t no_hbt;              /* no received heartbeat counter */
71 	uint32_t new_conn;            /* new connection after reconnection timeout expiration counter */
72 	uint32_t proto_err;           /* protocol errors counter */
73 	struct appctx *appctx;        /* the appctx running it */
74 	struct shared_table *remote_table;
75 	struct shared_table *last_local_table;
76 	struct shared_table *tables;
77 	struct server *srv;
78 	struct dcache *dcache;        /* dictionary cache */
79 	__decl_thread(HA_SPINLOCK_T lock); /* lock used to handle this peer section */
80 	struct peer *next;            /* next peer in the list */
81 };
82 
83 
84 struct peers {
85 	int state;                      /* proxy state */
86 	char *id;                       /* peer section name */
87 	struct task *sync_task;         /* main sync task */
88 	struct sig_handler *sighandler; /* signal handler */
89 	struct peer *remote;            /* remote peers list */
90 	struct peer *local;             /* local peer list */
91 	struct proxy *peers_fe;         /* peer frontend */
92 	struct {
93 		const char *file;           /* file where the section appears */
94 		int line;                   /* line where the section appears */
95 	} conf;                         /* config information */
96 	time_t last_change;
97 	struct peers *next;             /* next peer section */
98 	unsigned int flags;             /* current peers section resync state */
99 	unsigned int resync_timeout;    /* resync timeout timer */
100 	int count;                      /* total of peers */
101 };
102 
103 /* LRU cache for dictionaies */
104 struct dcache_tx {
105 	/* The last recently used key */
106 	unsigned int lru_key;
107 	/* An array of entries to store pointers to dictionary entries. */
108 	struct ebpt_node *entries;
109 	/* The previous lookup result. */
110 	struct ebpt_node *prev_lookup;
111 	/* ebtree to store the previous entries. */
112 	struct eb_root cached_entries;
113 };
114 
115 struct dcache_rx {
116 	unsigned int id;
117 	struct dict_entry *de;
118 };
119 
120 struct dcache_tx_entry {
121 	unsigned int id;
122 	struct ebpt_node entry;
123 };
124 
125 /* stick-table data type cache */
126 struct dcache {
127 	/* Cache used upon transmission */
128 	struct dcache_tx *tx;
129 	/* Cache used upon receipt */
130 	struct dcache_rx *rx;
131 	/* Maximum number of entries in this cache */
132 	size_t max_entries;
133 };
134 
135 #endif /* _HAPROXY_PEERS_T_H */
136 
137