X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Flb%2Flb.c;h=1936c1983ee7876c85cc3c3ee43cea14c986f89c;hb=6a4375e0;hp=041c65c13264787ee60d185bdf3cc4b6f4ebbb10;hpb=004869d0d4947a6e56b2d1bd481bbb6916d7a2e0;p=vpp.git diff --git a/src/plugins/lb/lb.c b/src/plugins/lb/lb.c index 041c65c1326..1936c1983ee 100644 --- a/src/plugins/lb/lb.c +++ b/src/plugins/lb/lb.c @@ -383,7 +383,6 @@ static void lb_vip_update_new_flow_table(lb_vip_t *vip) lb_new_flow_entry_t *new_flow_table = 0; lb_as_t *as; lb_pseudorand_t *pr, *sort_arr = 0; - u32 count; ASSERT (lbm->writer_lock[0]); //We must have the lock @@ -408,7 +407,6 @@ out: } //First, let's sort the ASs - sort_arr = 0; vec_alloc(sort_arr, pool_elts(vip->as_indexes)); i = 0; @@ -463,16 +461,8 @@ out: } } - vec_free(sort_arr); - finished: - -//Count number of changed entries - count = 0; - for (i=0; inew_flow_table == 0 || - new_flow_table[i].as_index != vip->new_flow_table[i].as_index) - count++; + vec_free(sort_arr); old_table = vip->new_flow_table; vip->new_flow_table = new_flow_table; @@ -762,7 +752,43 @@ next: return 0; } -int lb_vip_del_ass_withlock(u32 vip_index, ip46_address_t *addresses, u32 n) +int +lb_flush_vip_as (u32 vip_index, u32 as_index) +{ + u32 thread_index; + vlib_thread_main_t *tm = vlib_get_thread_main(); + lb_main_t *lbm = &lb_main; + + for(thread_index = 0; thread_index < tm->n_vlib_mains; thread_index++ ) { + lb_hash_t *h = lbm->per_cpu[thread_index].sticky_ht; + if (h != NULL) { + u32 i; + lb_hash_bucket_t *b; + + lb_hash_foreach_entry(h, b, i) { + if ((vip_index == ~0) + || ((b->vip[i] == vip_index) && (as_index == ~0)) + || ((b->vip[i] == vip_index) && (b->value[i] == as_index))) + { + vlib_refcount_add(&lbm->as_refcount, thread_index, b->value[i], -1); + vlib_refcount_add(&lbm->as_refcount, thread_index, 0, 1); + b->vip[i] = ~0; + b->value[i] = ~0; + } + } + if (vip_index == ~0) + { + lb_hash_free(h); + lbm->per_cpu[thread_index].sticky_ht = 0; + } + } + } + + return 0; +} + +int lb_vip_del_ass_withlock(u32 vip_index, ip46_address_t *addresses, u32 n, + u8 flush) { lb_main_t *lbm = &lb_main; u32 now = (u32) vlib_time_now(vlib_get_main()); @@ -802,6 +828,12 @@ next: vec_foreach(ip, indexes) { lbm->ass[*ip].flags &= ~LB_AS_FLAGS_USED; lbm->ass[*ip].last_used = now; + + if(flush) + { + /* flush flow table for deleted ASs*/ + lb_flush_vip_as(vip_index, *ip); + } } //Recompute flows @@ -812,10 +844,10 @@ next: return 0; } -int lb_vip_del_ass(u32 vip_index, ip46_address_t *addresses, u32 n) +int lb_vip_del_ass(u32 vip_index, ip46_address_t *addresses, u32 n, u8 flush) { lb_get_writer_lock(); - int ret = lb_vip_del_ass_withlock(vip_index, addresses, n); + int ret = lb_vip_del_ass_withlock(vip_index, addresses, n, flush); lb_put_writer_lock(); return ret; @@ -1177,12 +1209,13 @@ int lb_vip_del(u32 vip_index) ip46_address_t *ass = 0; lb_as_t *as; u32 *as_index; + pool_foreach(as_index, vip->as_indexes, { as = &lbm->ass[*as_index]; vec_add1(ass, as->address); }); if (vec_len(ass)) - lb_vip_del_ass_withlock(vip_index, ass, vec_len(ass)); + lb_vip_del_ass_withlock(vip_index, ass, vec_len(ass), 0); vec_free(ass); }