On Thu, Mar 21, 2019 at 09:45:16AM +0100, Florian Westphal wrote:
> This is about deletion of elements from the packet path in dynamic
> sets, see https://people.netfilter.org/pablo/nf-ideas-2019.txt, 1.4 .
Ah, thanks for the pointer! Obviously I confused dynamic with anonymous
in Karuna's mail.
On Thu, Mar 21, 2019 at 11:57:15AM +0530, Karuna Grewal wrote:
> I'm trying to implement "deletion of set elements in ruleset". For
> which I wanted to understand the way existing set operations are
> implemented.
> While grepping through the code I have noticed that the implementation
> has some parts in the kernel, libnftnl 's dynset and the userspace's
> netlink_(de)linearize .
> I'm unable to get a clear view of how the control flow goes from the
> userspace's `evaluate` to the kernel's `nft_dynset.c` in case of the
> set operations.
> Can someone please share some pointers in this direction?
> Also how does the `set_stmt_alloc` in nftables's statement.c relate to
> the `set_evaluate` in evaluate.c ?
I don't quite see where you're stuck. So here's a bit of generic
code-flow explanation, maybe it helps:
- User calls 'nft' with some command
- Arguments are parsed in scanner.l/parser_bison.y, resulting in a
struct cmd instance
- Last step of parsing is to call cmd_evaluate() (see
parser_bison.y:799)
- Assuming the command was:
'nft add rule ip test testchain update @testset { ip saddr timeout 1m }'
code flows like this:
- cmd_evaluate_add()
- case CMD_OBJ_RULE
- rule_evaluate()
- stmt_evaluate()
- case STMT_SET
- stmt_evaluate_set()
- ...
- rule_postprocess()
- payload_try_merge() (probably noop in this case)
- If evaluation succeeds (most of it is sanitization checking), command
is appended to list in state->cmds
- After parsing has finished, code continues in
nft_run_cmd_from_buffer() of libnftables.c
- nft_netlink()
- do_command()
- do_command_add()
- case CMD_OBJ_RULE
- mnl_nft_rule_add() this converts the rule into a netlink
message which is appended to batch buffer
- mnl_batch_talk() this submits the batch to kernel
My guess is that you over-estimate evaluation stage. The real work is
done by do_command() as this turns parser output into netlink messages.
I'll skip kernel side for now, hopefully user space is more clear now.
Feel free to follow-up with further questions.
Cheers, Phil