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

Reply via email to