FD.io VPP  v17.01-9-ge7dcee4
Vector Packet Processing
lb.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 /**
17  * lb-plugin implements a MagLev-like load balancer.
18  * http://research.google.com/pubs/pub44824.html
19  *
20  * It hasn't been tested for interoperability with the original MagLev
21  * but intends to provide similar functionality.
22  * The load-balancer receives traffic destined to VIP (Virtual IP)
23  * addresses from one or multiple(ECMP) routers.
24  * The load-balancer tunnels the traffic toward many application servers
25  * ensuring session stickyness (i.e. that a single sessions is tunneled
26  * towards a single application server).
27  *
28  */
29 
30 #ifndef LB_PLUGIN_LB_LB_H_
31 #define LB_PLUGIN_LB_LB_H_
32 
33 #include <lb/util.h>
34 #include <lb/refcount.h>
35 
36 #include <vnet/vnet.h>
37 #include <vnet/ip/ip.h>
38 #include <vnet/dpo/dpo.h>
39 #include <vnet/fib/fib_table.h>
40 
41 #include <lb/lbhash.h>
42 
43 #define LB_DEFAULT_PER_CPU_STICKY_BUCKETS 1 << 10
44 #define LB_DEFAULT_FLOW_TIMEOUT 40
45 
46 typedef enum {
49 } lb_next_t;
50 
51 /**
52  * Each VIP is configured with a set of
53  * application server.
54  */
55 typedef struct {
56  /**
57  * Registration to FIB event.
58  */
60 
61  /**
62  * Destination address used to tunnel traffic towards
63  * that application server.
64  * The address is also used as ID and pseudo-random
65  * seed for the load-balancing process.
66  */
67  ip46_address_t address;
68 
69  /**
70  * ASs are indexed by address and VIP Index.
71  * Which means there will be duplicated if the same server
72  * address is used for multiple VIPs.
73  */
75 
76  /**
77  * Some per-AS flags.
78  * For now only LB_AS_FLAGS_USED is defined.
79  */
81 
82 #define LB_AS_FLAGS_USED 0x1
83 
84  /**
85  * Rotating timestamp of when LB_AS_FLAGS_USED flag was last set.
86  *
87  * AS removal is based on garbage collection and reference counting.
88  * When an AS is removed, there is a race between configuration core
89  * and worker cores which may still add a reference while it should not
90  * be used. This timestamp is used to not remove the AS while a race condition
91  * may happen.
92  */
94 
95  /**
96  * The FIB entry index for the next-hop
97  */
99 
100  /**
101  * The child index on the FIB entry
102  */
104 
105  /**
106  * The next DPO in the graph to follow.
107  */
109 
110 } lb_as_t;
111 
113 
114 typedef struct {
117 
118 #define lb_foreach_vip_counter \
119  _(NEXT_PACKET, "packet from existing sessions", 0) \
120  _(FIRST_PACKET, "first session packet", 1) \
121  _(UNTRACKED_PACKET, "untracked packet", 2) \
122  _(NO_SERVER, "no server configured", 3)
123 
124 typedef enum {
125 #define _(a,b,c) LB_VIP_COUNTER_##a = c,
127 #undef _
130 
131 /**
132  * The load balancer supports IPv4 and IPv6 traffic
133  * and GRE4 and GRE6 encap.
134  */
135 typedef enum {
141 } lb_vip_type_t;
142 
145 
146 /**
147  * Load balancing service is provided per VIP.
148  * In this data model, a VIP can be a whole prefix.
149  * But load balancing only
150  * occurs on a per-source-address/port basis. Meaning that if a given source
151  * reuses the same port for multiple destinations within the same VIP,
152  * they will be considered as a single flow.
153  */
154 typedef struct {
155 
156  //Runtime
157 
158  /**
159  * Vector mapping (flow-hash & new_connect_table_mask) to AS index.
160  * This is used for new flows.
161  */
163 
164  /**
165  * New flows table length - 1
166  * (length MUST be a power of 2)
167  */
169 
170  /**
171  * Last time garbage collection was run to free the ASs.
172  */
174 
175  //Not runtime
176 
177  /**
178  * A Virtual IP represents a given service delivered
179  * by a set of application servers. It can be a single
180  * address or a prefix.
181  * IPv4 prefixes are encoded using IPv4-in-IPv6 embedded address
182  * (i.e. ::/96 prefix).
183  */
184  ip46_address_t prefix;
185 
186  /**
187  * The VIP prefix length.
188  * In case of IPv4, plen = 96 + ip4_plen.
189  */
191 
192  /**
193  * The type of traffic for this.
194  * LB_TYPE_UNDEFINED if unknown.
195  */
197 
198  /**
199  * Flags related to this VIP.
200  * LB_VIP_FLAGS_USED means the VIP is active.
201  * When it is not set, the VIP in the process of being removed.
202  * We cannot immediately remove a VIP because the VIP index still may be stored
203  * in the adjacency index.
204  */
206 #define LB_VIP_FLAGS_USED 0x1
207 
208  /**
209  * Pool of AS indexes used for this VIP.
210  * This also includes ASs that have been removed (but are still referenced).
211  */
213 } lb_vip_t;
214 
215 #define lb_vip_is_ip4(vip) ((vip)->type == LB_VIP_TYPE_IP4_GRE6 || (vip)->type == LB_VIP_TYPE_IP4_GRE4)
216 #define lb_vip_is_gre4(vip) ((vip)->type == LB_VIP_TYPE_IP6_GRE4 || (vip)->type == LB_VIP_TYPE_IP4_GRE4)
219 
220 typedef struct {
221  /**
222  * Each CPU has its own sticky flow hash table.
223  * One single table is used for all VIPs.
224  */
226 } lb_per_cpu_t;
227 
228 typedef struct {
229  /**
230  * Pool of all Virtual IPs
231  */
233 
234  /**
235  * Pool of ASs.
236  * ASs are referenced by address and vip index.
237  * The first element (index 0) is special and used only to fill
238  * new_flow_tables when no AS has been configured.
239  */
241 
242  /**
243  * Each AS has an associated reference counter.
244  * As ass[0] has a special meaning, its associated counter
245  * starts at 0 and is decremented instead. i.e. do not use it.
246  */
248 
249  /**
250  * Some global data is per-cpu
251  */
253 
254  /**
255  * Node next index for IP adjacencies, for each of the traffic types.
256  */
257  u32 ip_lookup_next_index[LB_VIP_N_TYPES];
258 
259  /**
260  * Source address used in IPv6 encapsulated traffic
261  */
263 
264  /**
265  * Source address used for IPv4 encapsulated traffic
266  */
268 
269  /**
270  * Number of buckets in the per-cpu sticky hash table.
271  */
273 
274  /**
275  * Flow timeout in seconds.
276  */
278 
279  /**
280  * Per VIP counter
281  */
283 
284  /**
285  * DPO used to send packet from IP4/6 lookup to LB node.
286  */
289 
290  /**
291  * Node type for registering to fib changes.
292  */
294 
295  /**
296  * API dynamically registered base ID.
297  */
299 
300  volatile u32 *writer_lock;
301 } lb_main_t;
302 
303 extern lb_main_t lb_main;
306 
307 /**
308  * Fix global load-balancer parameters.
309  * @param ip4_address IPv4 source address used for encapsulated traffic
310  * @param ip6_address IPv6 source address used for encapsulated traffic
311  * @return 0 on success. VNET_LB_ERR_XXX on error
312  */
313 int lb_conf(ip4_address_t *ip4_address, ip6_address_t *ip6_address,
314  u32 sticky_buckets, u32 flow_timeout);
315 
316 int lb_vip_add(ip46_address_t *prefix, u8 plen, lb_vip_type_t type,
317  u32 new_length, u32 *vip_index);
318 int lb_vip_del(u32 vip_index);
319 
320 int lb_vip_find_index(ip46_address_t *prefix, u8 plen, u32 *vip_index);
321 
322 #define lb_vip_get_by_index(index) (pool_is_free_index(lb_main.vips, index)?NULL:pool_elt_at_index(lb_main.vips, index))
323 
324 int lb_vip_add_ass(u32 vip_index, ip46_address_t *addresses, u32 n);
325 int lb_vip_del_ass(u32 vip_index, ip46_address_t *addresses, u32 n);
326 
328 
329 void lb_garbage_collection();
330 
332 
333 #endif /* LB_PLUGIN_LB_LB_H_ */
format_function_t format_lb_vip
Definition: lb.h:217
int lb_vip_add_ass(u32 vip_index, ip46_address_t *addresses, u32 n)
Definition: lb.c:425
Each VIP is configured with a set of application server.
Definition: lb.h:55
uword( unformat_function_t)(unformat_input_t *input, va_list *args)
Definition: format.h:231
enum fib_node_type_t_ fib_node_type_t
The types of nodes in a FIB graph.
bad routing header type(not 4)") sr_error (NO_MORE_SEGMENTS
u32 per_cpu_sticky_buckets
Number of buckets in the per-cpu sticky hash table.
Definition: lb.h:272
u16 msg_id_base
API dynamically registered base ID.
Definition: lb.h:298
Definition: lb.h:48
ip46_address_t prefix
A Virtual IP represents a given service delivered by a set of application servers.
Definition: lb.h:184
struct _vlib_node_registration vlib_node_registration_t
lb_vip_counter_t
Definition: lb.h:124
format_function_t format_lb_vip_type
Definition: lb.h:143
u32 vip_index
ASs are indexed by address and VIP Index.
Definition: lb.h:74
lb_hash_t * sticky_ht
Each CPU has its own sticky flow hash table.
Definition: lb.h:225
ip46_address_t address
Destination address used to tunnel traffic towards that application server.
Definition: lb.h:67
lb_next_t
Definition: lb.h:46
int lb_conf(ip4_address_t *ip4_address, ip6_address_t *ip6_address, u32 sticky_buckets, u32 flow_timeout)
Fix global load-balancer parameters.
Definition: lb.c:362
enum dpo_type_t_ dpo_type_t
Common types of data-path objects New types can be dynamically added using dpo_register_new_type() ...
unformat_function_t unformat_lb_vip_type
Definition: lb.h:144
u32 flow_timeout
Flow timeout in seconds.
Definition: lb.h:277
Definition: lb.h:228
fib_node_type_t fib_node_type
Node type for registering to fib changes.
Definition: lb.h:293
dpo_type_t dpo_gre4_type
DPO used to send packet from IP4/6 lookup to LB node.
Definition: lb.h:287
vlib_refcount_t as_refcount
Each AS has an associated reference counter.
Definition: lb.h:247
format_function_t format_lb_as
Definition: lb.h:112
A collection of simple counters.
Definition: counter.h:59
lb_main_t lb_main
Definition: lb.c:26
lb_vip_t * vips
Pool of all Virtual IPs.
Definition: lb.h:232
u32 last_used
Rotating timestamp of when LB_AS_FLAGS_USED flag was last set.
Definition: lb.h:93
ip4_address_t ip4_src_address
Source address used for IPv4 encapsulated traffic.
Definition: lb.h:267
u8 plen
The VIP prefix length.
Definition: lb.h:190
The identity of a DPO is a combination of its type and its instance number/index of objects of that t...
Definition: dpo.h:138
format_function_t format_lb_main
Definition: lb.h:331
An node in the FIB graph.
Definition: fib_node.h:273
Definition: lb.h:114
fib_node_t fib_node
Registration to FIB event.
Definition: lb.h:59
vlib_node_registration_t lb6_node
volatile u32 * writer_lock
Definition: lb.h:300
#define lb_foreach_vip_counter
Definition: lb.h:118
u32 fib_node_index_t
A typedef of a node index.
Definition: fib_types.h:28
u32 as_index
Definition: lb.h:115
dpo_type_t dpo_gre6_type
Definition: lb.h:288
u32 last_garbage_collection
Last time garbage collection was run to free the ASs.
Definition: lb.h:173
lb_as_t * ass
Pool of ASs.
Definition: lb.h:240
vlib_node_registration_t lb4_node
int lb_vip_find_index(ip46_address_t *prefix, u8 plen, u32 *vip_index)
Definition: lb.c:398
lb_vip_type_t type
The type of traffic for this.
Definition: lb.h:196
int lb_vip_del(u32 vip_index)
Definition: lb.c:696
unsigned int u32
Definition: types.h:88
lb_vip_type_t
The load balancer supports IPv4 and IPv6 traffic and GRE4 and GRE6 encap.
Definition: lb.h:135
void lb_garbage_collection()
Definition: lb.c:233
u32 new_flow_table_mask
New flows table length - 1 (length MUST be a power of 2)
Definition: lb.h:168
format_function_t format_lb_vip_detailed
Definition: lb.h:218
u8 *( format_function_t)(u8 *s, va_list *args)
Definition: format.h:48
lb_per_cpu_t * per_cpu
Some global data is per-cpu.
Definition: lb.h:252
int lb_vip_del_ass(u32 vip_index, ip46_address_t *addresses, u32 n)
Definition: lb.c:583
unsigned short u16
Definition: types.h:57
ip6_address_t ip6_src_address
Source address used in IPv6 encapsulated traffic.
Definition: lb.h:262
unsigned char u8
Definition: types.h:56
u32 next_hop_child_index
The child index on the FIB entry.
Definition: lb.h:103
u32 lb_hash_time_now(vlib_main_t *vm)
Definition: lb.c:50
dpo_id_t dpo
The next DPO in the graph to follow.
Definition: lb.h:108
u8 flags
Some per-AS flags.
Definition: lb.h:80
lb_new_flow_entry_t * new_flow_table
Vector mapping (flow-hash & new_connect_table_mask) to AS index.
Definition: lb.h:162
u8 flags
Flags related to this VIP.
Definition: lb.h:205
Load balancing service is provided per VIP.
Definition: lb.h:154
u32 * as_indexes
Pool of AS indexes used for this VIP.
Definition: lb.h:212
int lb_vip_add(ip46_address_t *prefix, u8 plen, lb_vip_type_t type, u32 new_length, u32 *vip_index)
Definition: lb.c:638
fib_node_index_t next_hop_fib_entry_index
The FIB entry index for the next-hop.
Definition: lb.h:98