With collision match vector, the doubly-linked list is not needed anymore. Change-Id: Iaf667ebe6ce0bdd78306bec31d3949e6acb8d401 Signed-off-by: Andrew Yourtchenko <ayourtch@gmail.com>
120 lines
3.0 KiB
C
120 lines
3.0 KiB
C
/*
|
|
*------------------------------------------------------------------
|
|
* Copyright (c) 2017 Cisco and/or its affiliates.
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef _ACL_HASH_LOOKUP_TYPES_H_
|
|
#define _ACL_HASH_LOOKUP_TYPES_H_
|
|
|
|
#include "types.h"
|
|
|
|
/* The structure representing the single entry with hash representation */
|
|
typedef struct {
|
|
fa_5tuple_t match;
|
|
/* these two entries refer to the original ACL# and rule# within that ACL */
|
|
u32 acl_index;
|
|
u32 ace_index;
|
|
|
|
u32 base_mask_type_index;
|
|
|
|
u8 action;
|
|
} hash_ace_info_t;
|
|
|
|
/*
|
|
* The structure holding the information necessary for the hash-based ACL operation
|
|
*/
|
|
typedef struct {
|
|
/* hash ACL applied on these lookup contexts */
|
|
u32 *lc_index_list;
|
|
hash_ace_info_t *rules;
|
|
/* a boolean flag set when the hash acl info is initialized */
|
|
int hash_acl_exists;
|
|
} hash_acl_info_t;
|
|
|
|
|
|
typedef struct {
|
|
acl_rule_t rule;
|
|
u32 acl_index;
|
|
u32 ace_index;
|
|
u32 acl_position;
|
|
u32 applied_entry_index;
|
|
} collision_match_rule_t;
|
|
|
|
typedef struct {
|
|
/* original non-compiled ACL */
|
|
u32 acl_index;
|
|
u32 ace_index;
|
|
/* the index of the hash_ace_info_t */
|
|
u32 hash_ace_info_index;
|
|
/* applied mask type index */
|
|
u32 mask_type_index;
|
|
/*
|
|
* index of applied entry, which owns the colliding_rules vector
|
|
*/
|
|
u32 collision_head_ae_index;
|
|
/*
|
|
* Collision rule vector for matching - set only on head entry
|
|
*/
|
|
collision_match_rule_t *colliding_rules;
|
|
/*
|
|
* number of hits on this entry
|
|
*/
|
|
u64 hitcount;
|
|
/*
|
|
* acl position in vector of ACLs within lookup context
|
|
*/
|
|
u32 acl_position;
|
|
/*
|
|
* Action of this applied ACE
|
|
*/
|
|
u8 action;
|
|
} applied_hash_ace_entry_t;
|
|
|
|
typedef struct {
|
|
|
|
/* applied ACLs so we can track them independently from main ACL module */
|
|
u32 *applied_acls;
|
|
} applied_hash_acl_info_t;
|
|
|
|
|
|
typedef union {
|
|
u64 as_u64;
|
|
struct {
|
|
u32 applied_entry_index;
|
|
u16 reserved_u16;
|
|
u8 reserved_u8;
|
|
u8 reserved_flags:8;
|
|
};
|
|
} hash_acl_lookup_value_t;
|
|
|
|
|
|
typedef struct {
|
|
u32 mask_type_index;
|
|
/* first rule # for this mask */
|
|
u32 first_rule_index;
|
|
/* Debug Information */
|
|
u32 num_entries;
|
|
u32 max_collisions;
|
|
} hash_applied_mask_info_t;
|
|
|
|
|
|
#define CT_ASSERT_EQUAL(name, x,y) typedef int assert_ ## name ## _compile_time_assertion_failed[((x) == (y))-1]
|
|
|
|
CT_ASSERT_EQUAL(hash_acl_lookup_value_t_is_u64, sizeof(hash_acl_lookup_value_t), sizeof(u64));
|
|
|
|
#undef CT_ASSERT_EQUAL
|
|
|
|
#endif
|