Code Review
/
vpp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
review
|
tree
raw
|
inline
| side by side
nat: ED: global session LRU list
[vpp.git]
/
src
/
plugins
/
lb
/
lb.c
diff --git
a/src/plugins/lb/lb.c
b/src/plugins/lb/lb.c
index
75ca40f
..
ab5e808
100644
(file)
--- a/
src/plugins/lb/lb.c
+++ b/
src/plugins/lb/lb.c
@@
-18,6
+18,7
@@
#include <vpp/app/version.h>
#include <vnet/api_errno.h>
#include <vnet/udp/udp.h>
#include <vpp/app/version.h>
#include <vnet/api_errno.h>
#include <vnet/udp/udp.h>
+#include <vppinfra/lock.h>
//GC runs at most once every so many seconds
#define LB_GARBAGE_RUN 60
//GC runs at most once every so many seconds
#define LB_GARBAGE_RUN 60
@@
-25,10
+26,13
@@
//After so many seconds. It is assumed that inter-core race condition will not occur.
#define LB_CONCURRENCY_TIMEOUT 10
//After so many seconds. It is assumed that inter-core race condition will not occur.
#define LB_CONCURRENCY_TIMEOUT 10
+// FIB source for adding routes
+static fib_source_t lb_fib_src;
+
lb_main_t lb_main;
lb_main_t lb_main;
-#define lb_get_writer_lock()
do {} while(clib_atomic_test_and_set (lb_main.writer_lock)
)
-#define lb_put_writer_lock() clib_
atomic_release (
lb_main.writer_lock)
+#define lb_get_writer_lock()
clib_spinlock_lock (&lb_main.writer_lock
)
+#define lb_put_writer_lock() clib_
spinlock_unlock (&
lb_main.writer_lock)
static void lb_as_stack (lb_as_t *as);
static void lb_as_stack (lb_as_t *as);
@@
-289,7
+293,7
@@
static void lb_vip_garbage_collection(lb_vip_t *vip)
lb_snat6_key_t m_key6;
clib_bihash_kv_24_8_t kv6, value6;
lb_snat_mapping_t *m = 0;
lb_snat6_key_t m_key6;
clib_bihash_kv_24_8_t kv6, value6;
lb_snat_mapping_t *m = 0;
-
ASSERT (lbm->writer_lock[0]
);
+
CLIB_SPINLOCK_ASSERT_LOCKED (&lbm->writer_lock
);
u32 now = (u32) vlib_time_now(vlib_get_main());
if (!clib_u32_loop_gt(now, vip->last_garbage_collection + LB_GARBAGE_RUN))
u32 now = (u32) vlib_time_now(vlib_get_main());
if (!clib_u32_loop_gt(now, vip->last_garbage_collection + LB_GARBAGE_RUN))
@@
-384,7
+388,7
@@
static void lb_vip_update_new_flow_table(lb_vip_t *vip)
lb_as_t *as;
lb_pseudorand_t *pr, *sort_arr = 0;
lb_as_t *as;
lb_pseudorand_t *pr, *sort_arr = 0;
-
ASSERT (lbm->writer_lock[0]); //
We must have the lock
+
CLIB_SPINLOCK_ASSERT_LOCKED (&lbm->writer_lock); //
We must have the lock
//Check if some AS is configured or not
i = 0;
//Check if some AS is configured or not
i = 0;
@@
-496,7
+500,8
@@
int lb_vip_port_find_index(ip46_address_t *prefix, u8 plen,
{
lb_main_t *lbm = &lb_main;
lb_vip_t *vip;
{
lb_main_t *lbm = &lb_main;
lb_vip_t *vip;
- ASSERT (lbm->writer_lock[0]); //This must be called with the lock owned
+ /* This must be called with the lock owned */
+ CLIB_SPINLOCK_ASSERT_LOCKED (&lbm->writer_lock);
ip46_prefix_normalize(prefix, plen);
pool_foreach(vip, lbm->vips, {
if ((vip->flags & LB_AS_FLAGS_USED) &&
ip46_prefix_normalize(prefix, plen);
pool_foreach(vip, lbm->vips, {
if ((vip->flags & LB_AS_FLAGS_USED) &&
@@
-560,7
+565,8
@@
int lb_vip_find_index(ip46_address_t *prefix, u8 plen, u8 protocol,
static int lb_as_find_index_vip(lb_vip_t *vip, ip46_address_t *address, u32 *as_index)
{
lb_main_t *lbm = &lb_main;
static int lb_as_find_index_vip(lb_vip_t *vip, ip46_address_t *address, u32 *as_index)
{
lb_main_t *lbm = &lb_main;
- ASSERT (lbm->writer_lock[0]); //This must be called with the lock owned
+ /* This must be called with the lock owned */
+ CLIB_SPINLOCK_ASSERT_LOCKED (&lbm->writer_lock);
lb_as_t *as;
u32 *asi;
pool_foreach(asi, vip->as_indexes, {
lb_as_t *as;
u32 *asi;
pool_foreach(asi, vip->as_indexes, {
@@
-857,7
+863,7
@@
static int
lb_vip_prefix_index_alloc (lb_main_t *lbm)
{
/*
lb_vip_prefix_index_alloc (lb_main_t *lbm)
{
/*
- * Check for dynamically alloca
et
d instance number.
+ * Check for dynamically alloca
te
d instance number.
*/
u32 bit;
*/
u32 bit;
@@
-900,6
+906,8
@@
static void lb_vip_add_adjacency(lb_main_t *lbm, lb_vip_t *vip,
if (!lb_vip_port_find_diff_port(&(vip->prefix), vip->plen,
vip->protocol, vip->port, &vip_idx))
{
if (!lb_vip_port_find_diff_port(&(vip->prefix), vip->plen,
vip->protocol, vip->port, &vip_idx))
{
+ lb_vip_t *exists_vip = lb_vip_get_by_index(vip_idx);
+ *vip_prefix_index = exists_vip ? exists_vip->vip_prefix_index : ~0;
return;
}
return;
}
@@
-945,7
+953,7
@@
static void lb_vip_add_adjacency(lb_main_t *lbm, lb_vip_t *vip,
dpo_set(&dpo, dpo_type, proto, *vip_prefix_index);
fib_table_entry_special_dpo_add(0,
&pfx,
dpo_set(&dpo, dpo_type, proto, *vip_prefix_index);
fib_table_entry_special_dpo_add(0,
&pfx,
-
FIB_SOURCE_PLUGIN_HI
,
+
lb_fib_src
,
FIB_ENTRY_FLAG_EXCLUSIVE,
&dpo);
dpo_reset(&dpo);
FIB_ENTRY_FLAG_EXCLUSIVE,
&dpo);
dpo_reset(&dpo);
@@
-1034,7
+1042,7
@@
static void lb_vip_del_adjacency(lb_main_t *lbm, lb_vip_t *vip)
pfx.fp_len = vip->plen;
pfx.fp_proto = FIB_PROTOCOL_IP6;
}
pfx.fp_len = vip->plen;
pfx.fp_proto = FIB_PROTOCOL_IP6;
}
- fib_table_entry_special_remove(0, &pfx,
FIB_SOURCE_PLUGIN_HI
);
+ fib_table_entry_special_remove(0, &pfx,
lb_fib_src
);
}
int lb_vip_add(lb_vip_add_args_t args, u32 *vip_index)
}
int lb_vip_add(lb_vip_add_args_t args, u32 *vip_index)
@@
-1384,8
+1392,7
@@
lb_init (vlib_main_t * vm)
lbm->per_cpu = 0;
vec_validate(lbm->per_cpu, tm->n_vlib_mains - 1);
lbm->per_cpu = 0;
vec_validate(lbm->per_cpu, tm->n_vlib_mains - 1);
- lbm->writer_lock = clib_mem_alloc_aligned (CLIB_CACHE_LINE_BYTES, CLIB_CACHE_LINE_BYTES);
- lbm->writer_lock[0] = 0;
+ clib_spinlock_init (&lbm->writer_lock);
lbm->per_cpu_sticky_buckets = LB_DEFAULT_PER_CPU_STICKY_BUCKETS;
lbm->flow_timeout = LB_DEFAULT_FLOW_TIMEOUT;
lbm->ip4_src_address.as_u32 = 0xffffffff;
lbm->per_cpu_sticky_buckets = LB_DEFAULT_PER_CPU_STICKY_BUCKETS;
lbm->flow_timeout = LB_DEFAULT_FLOW_TIMEOUT;
lbm->ip4_src_address.as_u32 = 0xffffffff;
@@
-1443,6
+1450,11
@@
lb_init (vlib_main_t * vm)
#define _(a,b,c) lbm->vip_counters[c].name = b;
lb_foreach_vip_counter
#undef _
#define _(a,b,c) lbm->vip_counters[c].name = b;
lb_foreach_vip_counter
#undef _
+
+ lb_fib_src = fib_source_allocate("lb",
+ FIB_SOURCE_PRIORITY_HI,
+ FIB_SOURCE_BH_SIMPLE);
+
return NULL;
}
return NULL;
}