diff options
author | Andrew Yourtchenko <ayourtch@gmail.com> | 2019-03-20 17:44:14 +0100 |
---|---|---|
committer | Damjan Marion <dmarion@me.com> | 2019-03-22 17:33:09 +0000 |
commit | 9f3d3ceb0130aba2eb11a5cbd2fcef3384864fe8 (patch) | |
tree | cc35f189ba5847ce1738090fd703114eaf4b31a7 /src/plugins/acl/hash_lookup.c | |
parent | b5395729c7b08c88f2e520c06b0edec28d3a1fe1 (diff) |
acl-plugin: tuplemerge: fix a crash during soak test with split partition
Reload the hash-ready ACE vector pointer during the partition split
with each iteration, since the ACL# may change.
Change-Id: I1b001e06b52ff02ef59ca1d890f8462ca99e6634
Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
Diffstat (limited to 'src/plugins/acl/hash_lookup.c')
-rw-r--r-- | src/plugins/acl/hash_lookup.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/src/plugins/acl/hash_lookup.c b/src/plugins/acl/hash_lookup.c index ccae26453d3..ec3c62e5947 100644 --- a/src/plugins/acl/hash_lookup.c +++ b/src/plugins/acl/hash_lookup.c @@ -1511,9 +1511,11 @@ split_partition(acl_main_t *am, u32 first_index, clib_memset(&the_max_tuple, 0, sizeof(the_max_tuple)); int i=0; + collision_match_rule_t *colliding_rules = pae->colliding_rules; u64 collisions = vec_len(pae->colliding_rules); for(i=0; i<collisions; i++){ /* reload the hash acl info as it might be a different ACL# */ + pae = vec_elt_at_index((*applied_hash_aces), colliding_rules[i].applied_entry_index); ha = vec_elt_at_index(am->hash_acl_infos, pae->acl_index); DBG( "TM-collision: base_ace:%d (ace_mask:%d, first_collision_mask:%d)", @@ -1563,8 +1565,6 @@ split_partition(acl_main_t *am, u32 first_index, if(mask->pkt.as_u64 > max_tuple->pkt.as_u64) max_tuple->pkt.as_u64 = mask->pkt.as_u64; } - - pae = pae->next_applied_entry_index == ~0 ? 0 : vec_elt_at_index((*applied_hash_aces), pae->next_applied_entry_index); } /* Computing field with max difference between (min/max)_mask */ @@ -1691,15 +1691,19 @@ split_partition(acl_main_t *am, u32 first_index, u32 r_ace_index = first_index; int repopulate_count = 0; -// for(i=0; i<collisions; i++){ - for(r_ace_index=0; r_ace_index < vec_len((*applied_hash_aces)); r_ace_index++) { + collision_match_rule_t *temp_colliding_rules = vec_dup(colliding_rules); + collisions = vec_len(temp_colliding_rules); + + for(i=0; i<collisions; i++){ + + r_ace_index = temp_colliding_rules[i].applied_entry_index; applied_hash_ace_entry_t *pop_pae = vec_elt_at_index((*applied_hash_aces), r_ace_index); + ha = vec_elt_at_index(am->hash_acl_infos, pop_pae->acl_index); DBG( "TM-Population-collision: base_ace:%d (ace_mask:%d, first_collision_mask:%d)", pop_pae->ace_index, pop_pae->mask_type_index, coll_mask_type_index); - if(pop_pae->mask_type_index != coll_mask_type_index) continue; - u32 next_index = pop_pae->next_applied_entry_index; + ASSERT(pop_pae->mask_type_index == coll_mask_type_index); ace_info = vec_elt_at_index(ha->rules, pop_pae->hash_ace_info_index); mte = vec_elt_at_index(am->ace_mask_type_pool, ace_info->base_mask_type_index); @@ -1721,8 +1725,8 @@ split_partition(acl_main_t *am, u32 first_index, activate_applied_ace_hash_entry(am, lc_index, applied_hash_aces, r_ace_index); - r_ace_index = next_index; } + vec_free(temp_colliding_rules); DBG( "TM-Populate new partition-END"); DBG( "TM-split_partition - END"); |