if(~0 == mask_type_index) {
pool_get_aligned (am->ace_mask_type_pool, mte, CLIB_CACHE_LINE_BYTES);
mask_type_index = mte - am->ace_mask_type_pool;
- clib_memcpy(&mte->mask, mask, sizeof(mte->mask));
+ clib_memcpy_fast(&mte->mask, mask, sizeof(mte->mask));
mte->refcount = 0;
/*
DBG0("RELEAS MTE index %d new refcount %d", mask_type_index, mte->refcount);
if (mte->refcount == 0) {
/* we are not using this entry anymore */
- memset(mte, 0xae, sizeof(*mte));
+ clib_memset(mte, 0xae, sizeof(*mte));
pool_put(am->ace_mask_type_pool, mte);
}
}
ASSERT(last_index != ~0);
applied_hash_ace_entry_t *last_pae = vec_elt_at_index((*applied_hash_aces), last_index);
DBG("...advance to chained entry index: %d", last_index);
- /* link ourseves in */
+ /* link ourselves in */
last_pae->next_applied_entry_index = new_index;
pae->prev_applied_entry_index = last_index;
/* adjust the pointer to the new tail */
* ACL, so the change adding this code also takes care of that.
*/
- /* expand the applied aces vector by the necessary amount */
- vec_resize((*applied_hash_aces), vec_len(ha->rules));
vec_validate(am->hash_applied_mask_info_vec_by_lc_index, lc_index);
/* add the rules from the ACL to the hash table for lookup and append to the vector*/
for(i=0; i < vec_len(ha->rules); i++) {
+ /*
+ * Expand the applied aces vector to fit a new entry.
+ * One by one not to upset split_partition() if it is called.
+ */
+ vec_resize((*applied_hash_aces), 1);
+
int is_ip6 = ha->rules[i].match.pkt.is_ip6;
u32 new_index = base_offset + i;
applied_hash_ace_entry_t *pae = vec_elt_at_index((*applied_hash_aces), new_index);
{
int i, byte, bit, bitnum;
ASSERT (width <= 32);
- memset (a, 0, sizeof (a[0]));
+ clib_memset (a, 0, sizeof (a[0]));
for (i = 0; i < width; i++)
{
bitnum = (7 - (i & 7));
static void
make_mask_and_match_from_rule(fa_5tuple_t *mask, acl_rule_t *r, hash_ace_info_t *hi)
{
- memset(mask, 0, sizeof(*mask));
- memset(&hi->match, 0, sizeof(hi->match));
+ clib_memset(mask, 0, sizeof(*mask));
+ clib_memset(&hi->match, 0, sizeof(hi->match));
hi->action = r->is_permit;
/* we will need to be matching based on lc_index and mask_type_index when applied */
make_ip6_address_mask(&mask->ip6_addr[1], r->dst_prefixlen);
hi->match.ip6_addr[1] = r->dst.ip6;
} else {
- memset(hi->match.l3_zero_pad, 0, sizeof(hi->match.l3_zero_pad));
+ clib_memset(hi->match.l3_zero_pad, 0, sizeof(hi->match.l3_zero_pad));
make_ip4_address_mask(&mask->ip4_addr[0], r->src_prefixlen);
hi->match.ip4_addr[0] = r->src.ip4;
make_ip4_address_mask(&mask->ip4_addr[1], r->dst_prefixlen);
acl_list_t *a = &am->acls[acl_index];
vec_validate(am->hash_acl_infos, acl_index);
hash_acl_info_t *ha = vec_elt_at_index(am->hash_acl_infos, acl_index);
- memset(ha, 0, sizeof(*ha));
+ clib_memset(ha, 0, sizeof(*ha));
ha->hash_acl_exists = 1;
/* walk the newly added ACL entries and ensure that for each of them there
for(i=0; i < a->count; i++) {
hash_ace_info_t ace_info;
fa_5tuple_t mask;
- memset(&ace_info, 0, sizeof(ace_info));
+ clib_memset(&ace_info, 0, sizeof(ace_info));
ace_info.acl_index = acl_index;
ace_info.ace_index = i;
* should not be possible to delete, and the change adding this also adds
* the safeguards to that respect, so this is not a problem.
*
- * The part to rememeber is that this routine is called in process of reapplication
+ * The part to remember is that this routine is called in process of reapplication
* during the acl_add_replace() API call - the old acl ruleset is deleted, then
* the new one is added, without the change in the applied ACLs - so this case
* has to be handled.
hash_acl_info_t *ha = vec_elt_at_index(am->hash_acl_infos, pae->acl_index);
hash_ace_info_t *ace_info;
u32 coll_mask_type_index = pae->mask_type_index;
- memset(&the_min_tuple, 0, sizeof(the_min_tuple));
- memset(&the_max_tuple, 0, sizeof(the_max_tuple));
+ clib_memset(&the_min_tuple, 0, sizeof(the_min_tuple));
+ clib_memset(&the_max_tuple, 0, sizeof(the_max_tuple));
int i=0;
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# */
+ 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)",
pae->ace_index, pae->mask_type_index, coll_mask_type_index);
if(pae->mask_type_index != coll_mask_type_index) continue;
/* Computing min_mask and max_mask for colliding rules */
if(i==0){
- clib_memcpy(min_tuple, mask, sizeof(fa_5tuple_t));
- clib_memcpy(max_tuple, mask, sizeof(fa_5tuple_t));
+ clib_memcpy_fast(min_tuple, mask, sizeof(fa_5tuple_t));
+ clib_memcpy_fast(max_tuple, mask, sizeof(fa_5tuple_t));
}else{
int j;
for(j=0; j<2; j++){