Hi,
On Mon, Jun 17, 2019 at 02:25:16PM +0200, Pablo Neira Ayuso wrote:
> The score approach based on command type is confusing.
>
> This patch introduces cache level flags, each flag specifies what kind
> of object type is needed. These flags are set on/off depending on the
> list of commands coming in this batch.
>
> cache_is_complete() now checks if the cache contains the objects that
> are needed in the cache through these new flags.
Thanks for committing to getting the cache stuff right!
[...]
> +enum cache_level_flags {
> + NFT_CACHE_EMPTY = 0,
> + NFT_CACHE_TABLE = (1 << 0),
> + NFT_CACHE_CHAIN = (1 << 1),
> + NFT_CACHE_SET = (1 << 2),
> + NFT_CACHE_FLOWTABLE = (1 << 3),
> + NFT_CACHE_OBJECT = (1 << 4),
> + NFT_CACHE_SETELEM = (1 << 5),
> + NFT_CACHE_RULE = (1 << 6),
> + NFT_CACHE_FULL = (NFT_CACHE_TABLE |
> + NFT_CACHE_CHAIN |
> + NFT_CACHE_SET |
> + NFT_CACHE_FLOWTABLE |
> + NFT_CACHE_OBJECT |
> + NFT_CACHE_SETELEM |
> + NFT_CACHE_RULE),
> +};
I think we can do this in a way which reflects the implicit dependencies
when fetching ruleset elements. I think of something like:
| enum nft_cache_bits {
| NFT_CACHE_TABLE_BIT = (1 << 0),
| NFT_CACHE_CHAIN_BIT = (1 << 1),
| NFT_CACHE_SET_BIT = (1 << 2),
| NFT_CACHE_FLOWTABLE_BIT = (1 << 3),
| NFT_CACHE_OBJECT_BIT = (1 << 4),
| NFT_CACHE_SETELEM_BIT = (1 << 5),
| NFT_CACHE_RULE_BIT = (1 << 6),
| __NFT_CACHE_MAX_BIT = (1 << 7),
| };
|
| enum cache_level_flags {
| NFT_CACHE_EMPTY = 0,
| NFT_CACHE_TABLE = NFT_CACHE_TABLE_BIT,
| NFT_CACHE_CHAIN = NFT_CACHE_TABLE_BIT
| | NFT_CACHE_CHAIN_BIT,
| NFT_CACHE_SET = NFT_CACHE_TABLE_BIT
| | NFT_CACHE_SET_BIT,
| NFT_CACHE_FLOWTABLE = NFT_CACHE_TABLE_BIT
| | NFT_CACHE_FLOWTABLE_BIT,
| NFT_CACHE_OBJECT = NFT_CACHE_TABLE_BIT
| | NFT_CACHE_OBJECT_BIT,
| NFT_CACHE_SETELEM = NFT_CACHE_TABLE_BIT
| | NFT_CACHE_SET_BIT
| | NFT_CACHE_SETELEM_BIT,
| NFT_CACHE_RULE = NFT_CACHE_TABLE_BIT
| | NFT_CACHE_CHAIN_BIT
| | NFT_CACHE_SETELEM_BIT
| | NFT_CACHE_RULE_BIT,
| NFT_CACHE_FULL = __NFT_CACHE_MAX_BIT - 1,
| };
This removes these dependency details from cache_evaluate() functions.
What do you think?
Cheers, Phil