1 /*
2  * include/types/backend.h
3  * This file assembles definitions for backends
4  *
5  * Copyright (C) 2000-2012 Willy Tarreau - w@1wt.eu
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_BACKEND_H
23 #define _TYPES_BACKEND_H
24 
25 #include <common/config.h>
26 #include <common/hathreads.h>
27 
28 #include <types/lb_chash.h>
29 #include <types/lb_fas.h>
30 #include <types/lb_fwlc.h>
31 #include <types/lb_fwrr.h>
32 #include <types/lb_map.h>
33 #include <types/server.h>
34 
35 /* Parameters for lbprm.algo */
36 
37 /* Lower bits define the kind of load balancing method, which means the type of
38  * algorithm, and which criterion it is based on. For this reason, those bits
39  * also include information about dependencies, so that the config parser can
40  * detect incompatibilities.
41  */
42 
43 /* LB parameters are on the lower 8 bits. Depends on the LB kind. */
44 
45 /* BE_LB_HASH_* is used with BE_LB_KIND_HI */
46 #define BE_LB_HASH_SRC  0x00000  /* hash source IP */
47 #define BE_LB_HASH_URI  0x00001  /* hash HTTP URI */
48 #define BE_LB_HASH_PRM  0x00002  /* hash HTTP URL parameter */
49 #define BE_LB_HASH_HDR  0x00003  /* hash HTTP header value */
50 #define BE_LB_HASH_RDP  0x00004  /* hash RDP cookie value */
51 #define BE_LB_HASH_RND  0x00008  /* hash a random value */
52 
53 /* BE_LB_RR_* is used with BE_LB_KIND_RR */
54 #define BE_LB_RR_DYN    0x00000  /* dynamic round robin (default) */
55 #define BE_LB_RR_STATIC 0x00001  /* static round robin */
56 #define BE_LB_RR_RANDOM 0x00002  /* random round robin */
57 
58 /* BE_LB_CB_* is used with BE_LB_KIND_CB */
59 #define BE_LB_CB_LC     0x00000  /* least-connections */
60 #define BE_LB_CB_FAS    0x00001  /* first available server (opposite of leastconn) */
61 
62 #define BE_LB_PARM      0x000FF  /* mask to get/clear the LB param */
63 
64 /* Required input(s) */
65 #define BE_LB_NEED_NONE	0x00000  /* no input needed            */
66 #define BE_LB_NEED_ADDR	0x00100  /* only source address needed */
67 #define BE_LB_NEED_DATA	0x00200  /* some payload is needed     */
68 #define BE_LB_NEED_HTTP	0x00400  /* an HTTP request is needed  */
69 /* not used: 0x0800 */
70 #define BE_LB_NEED      0x00F00  /* mask to get/clear dependencies */
71 
72 /* Algorithm */
73 #define BE_LB_KIND_NONE 0x00000  /* algorithm not set */
74 #define BE_LB_KIND_RR   0x01000  /* round-robin */
75 #define BE_LB_KIND_CB   0x02000  /* connection-based */
76 #define BE_LB_KIND_HI   0x03000  /* hash of input (see hash inputs above) */
77 #define BE_LB_KIND      0x07000  /* mask to get/clear LB algorithm */
78 
79 /* All known variants of load balancing algorithms. These can be cleared using
80  * the BE_LB_ALGO mask. For a check, using BE_LB_KIND is preferred.
81  */
82 #define BE_LB_ALGO_NONE (BE_LB_KIND_NONE | BE_LB_NEED_NONE)    /* not defined */
83 #define BE_LB_ALGO_RR   (BE_LB_KIND_RR | BE_LB_NEED_NONE)      /* round robin */
84 #define BE_LB_ALGO_RND  (BE_LB_KIND_RR | BE_LB_NEED_NONE | BE_LB_RR_RANDOM) /* random value */
85 #define BE_LB_ALGO_LC   (BE_LB_KIND_CB | BE_LB_NEED_NONE | BE_LB_CB_LC)    /* least connections */
86 #define BE_LB_ALGO_FAS  (BE_LB_KIND_CB | BE_LB_NEED_NONE | BE_LB_CB_FAS)   /* first available server */
87 #define BE_LB_ALGO_SRR  (BE_LB_KIND_RR | BE_LB_NEED_NONE | BE_LB_RR_STATIC) /* static round robin */
88 #define BE_LB_ALGO_SH	(BE_LB_KIND_HI | BE_LB_NEED_ADDR | BE_LB_HASH_SRC) /* hash: source IP */
89 #define BE_LB_ALGO_UH	(BE_LB_KIND_HI | BE_LB_NEED_HTTP | BE_LB_HASH_URI) /* hash: HTTP URI  */
90 #define BE_LB_ALGO_PH	(BE_LB_KIND_HI | BE_LB_NEED_HTTP | BE_LB_HASH_PRM) /* hash: HTTP URL parameter */
91 #define BE_LB_ALGO_HH	(BE_LB_KIND_HI | BE_LB_NEED_HTTP | BE_LB_HASH_HDR) /* hash: HTTP header value  */
92 #define BE_LB_ALGO_RCH	(BE_LB_KIND_HI | BE_LB_NEED_DATA | BE_LB_HASH_RDP) /* hash: RDP cookie value   */
93 #define BE_LB_ALGO      (BE_LB_KIND    | BE_LB_NEED      | BE_LB_PARM    ) /* mask to clear algo */
94 
95 /* Higher bits define how a given criterion is mapped to a server. In fact it
96  * designates the LB function by itself. The dynamic algorithms will also have
97  * the DYN bit set. These flags are automatically set at the end of the parsing.
98  */
99 #define BE_LB_LKUP_NONE   0x00000  /* not defined */
100 #define BE_LB_LKUP_MAP    0x10000  /* static map based lookup */
101 #define BE_LB_LKUP_RRTREE 0x20000  /* FWRR tree lookup */
102 #define BE_LB_LKUP_LCTREE 0x30000  /* FWLC tree lookup */
103 #define BE_LB_LKUP_CHTREE 0x40000  /* consistent hash  */
104 #define BE_LB_LKUP_FSTREE 0x50000  /* FAS tree lookup */
105 #define BE_LB_LKUP        0x70000  /* mask to get just the LKUP value */
106 
107 /* additional properties */
108 #define BE_LB_PROP_DYN    0x80000 /* bit to indicate a dynamic algorithm */
109 
110 /* hash types */
111 #define BE_LB_HASH_MAP    0x000000 /* map-based hash (default) */
112 #define BE_LB_HASH_CONS   0x100000 /* consistent hashbit to indicate a dynamic algorithm */
113 #define BE_LB_HASH_TYPE   0x100000 /* get/clear hash types */
114 
115 /* additional modifier on top of the hash function (only avalanche right now) */
116 #define BE_LB_HMOD_AVAL   0x200000  /* avalanche modifier */
117 #define BE_LB_HASH_MOD    0x200000  /* get/clear hash modifier */
118 
119 /* BE_LB_HFCN_* is the hash function, to be used with BE_LB_HASH_FUNC */
120 #define BE_LB_HFCN_SDBM   0x000000 /* sdbm hash */
121 #define BE_LB_HFCN_DJB2   0x400000 /* djb2 hash */
122 #define BE_LB_HFCN_WT6    0x800000 /* wt6 hash */
123 #define BE_LB_HFCN_CRC32  0xC00000 /* crc32 hash */
124 #define BE_LB_HASH_FUNC   0xC00000 /* get/clear hash function */
125 
126 
127 /* various constants */
128 
129 /* The scale factor between user weight and effective weight allows smooth
130  * weight modulation even with small weights (eg: 1). It should not be too high
131  * though because it limits the number of servers in FWRR mode in order to
132  * prevent any integer overflow. The max number of servers per backend is
133  * limited to about (2^32-1)/256^2/scale ~= 65535.9999/scale. A scale of 16
134  * looks like a good value, as it allows 4095 servers per backend while leaving
135  * modulation steps of about 6% for servers with the lowest weight (1).
136  */
137 #define BE_WEIGHT_SCALE 16
138 
139 /* LB parameters for all algorithms */
140 struct lbprm {
141 	union { /* LB parameters depending on the algo type */
142 		struct lb_map map;
143 		struct lb_fwrr fwrr;
144 		struct lb_fwlc fwlc;
145 		struct lb_chash chash;
146 		struct lb_fas fas;
147 	};
148 	int algo;			/* load balancing algorithm and variants: BE_LB_* */
149 	int tot_wact, tot_wbck;		/* total effective weights of active and backup servers */
150 	int tot_weight;			/* total effective weight of servers participating to LB */
151 	int tot_used;			/* total number of servers used for LB */
152 	int wmult;			/* ratio between user weight and effective weight */
153 	int wdiv;			/* ratio between effective weight and user weight */
154 	int hash_balance_factor;	/* load balancing factor * 100, 0 if disabled */
155 	char *arg_str;			/* name of the URL parameter/header/cookie used for hashing */
156 	int   arg_len;			/* strlen(arg_str), computed only once */
157 	int   arg_opt1;			/* extra option 1 for the LB algo (algo-specific) */
158 	int   arg_opt2;			/* extra option 2 for the LB algo (algo-specific) */
159 	int   arg_opt3;			/* extra option 3 for the LB algo (algo-specific) */
160 	struct server *fbck;		/* first backup server when !PR_O_USE_ALL_BK, or NULL */
161 	__decl_hathreads(HA_SPINLOCK_T lock);
162 
163 	/* Call backs for some actions. Any of them may be NULL (thus should be ignored). */
164 	void (*update_server_eweight)(struct server *);  /* to be called after eweight change */
165 	void (*set_server_status_up)(struct server *);   /* to be called after status changes to UP */
166 	void (*set_server_status_down)(struct server *); /* to be called after status changes to DOWN */
167 	void (*server_take_conn)(struct server *);       /* to be called when connection is assigned */
168 	void (*server_drop_conn)(struct server *);       /* to be called when connection is dropped */
169 };
170 
171 #endif /* _TYPES_BACKEND_H */
172 
173 /*
174  * Local variables:
175  *  c-indent-level: 8
176  *  c-basic-offset: 8
177  * End:
178  */
179