On Mon, Jun 17, 2019 at 06:28:40PM +0200, Pablo Neira Ayuso wrote:
> On Mon, Jun 17, 2019 at 06:11:04PM +0200, Phil Sutter wrote:
> > Hi,
> > 
> > On Mon, Jun 17, 2019 at 02:25:16PM +0200, Pablo Neira Ayuso wrote:
> > [...]
> > > -int cache_evaluate(struct nft_ctx *nft, struct list_head *cmds)
> > > +unsigned int cache_evaluate(struct nft_ctx *nft, struct list_head *cmds)
> > >  {
> > > - unsigned int echo_completeness = CMD_INVALID;
> > > - unsigned int completeness = CMD_INVALID;
> > > + unsigned int flags = NFT_CACHE_EMPTY;
> > >   struct cmd *cmd;
> > >  
> > >   list_for_each_entry(cmd, cmds, list) {
> > >           switch (cmd->op) {
> > >           case CMD_ADD:
> > >           case CMD_INSERT:
> > > -         case CMD_REPLACE:
> > > -                 if (nft_output_echo(&nft->output))
> > > -                         echo_completeness = cmd->op;
> > > -
> > > +                 flags |= NFT_CACHE_TABLE |
> > > +                          NFT_CACHE_CHAIN |
> > > +                          NFT_CACHE_SET |
> > > +                          NFT_CACHE_FLOWTABLE |
> > > +                          NFT_CACHE_OBJECT;
> > 
> > This means we start fetching the cache for simple 'add rule' commands
> > again, right?
> 
> We need these for references to sets, eg.
> 
>         add rule x y ip saddr @x
> 
> same for other flowtable and object.

Oh, right. I got that wrong - old code is always fetching the above
items unless there's no ruleset in kernel (i.e., returned genid is 0).

I confused that with fetching rules which at some point started to
happen by accident with my changes.

> We should not use NFT_CACHE_RULE in this case, if this is what you
> suggest.

No, quite the opposite: I thought we could get by without fetching
anything from kernel at all.

Yet now I wonder why the handle guessing stops working, because the
above can't be the cause of it.

Cheers, Phil

Reply via email to