acl-plugin: tuplemerge: fix a crash during soak test with split partition 79/18479/2
authorAndrew Yourtchenko <ayourtch@gmail.com>
Wed, 20 Mar 2019 16:44:14 +0000 (17:44 +0100)
committerDamjan Marion <dmarion@me.com>
Fri, 22 Mar 2019 17:33:09 +0000 (17:33 +0000)
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>
src/plugins/acl/hash_lookup.c

index ccae264..ec3c62e 100644 (file)
@@ -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");