diff options
author | Florian Westphal <fw@strlen.de> | 2021-12-03 20:04:31 +0100 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2021-12-09 11:12:32 +0100 |
commit | 95a8503d019a81ec9225a7ae4cb10d115acac2b9 (patch) | |
tree | 2f794e57a9705efe2fa19013d09ba7102b7b4712 | |
parent | 9f204f7da605b9b41c3bef4533230e4cd52bba07 (diff) |
netlink_delinearize: and/shift postprocessing
Before this patch:
in: frag frag-off @s4
in: ip version @s8
out: (@nh,0,8 & 0xf0) >> 4 == @s8
out: (frag unknown & 0xfff8 [invalid type]) >> 3 == @s4
after:
out: frag frag-off >> 0 == @s4
out: ip version >> 0 == @s8
Next patch adds support for zero-shift removal.
Signed-off-by: Florian Westphal <fw@strlen.de>
-rw-r--r-- | src/netlink_delinearize.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/netlink_delinearize.c b/src/netlink_delinearize.c index 1f820e68..e37a34f3 100644 --- a/src/netlink_delinearize.c +++ b/src/netlink_delinearize.c @@ -2414,6 +2414,13 @@ static void relational_binop_postprocess(struct rule_pp_ctx *ctx, * templates. */ binop_postprocess(ctx, expr, &expr->left); + } else if (binop->op == OP_RSHIFT && binop->left->op == OP_AND && + binop->right->etype == EXPR_VALUE && binop->left->right->etype == EXPR_VALUE) { + /* Handle 'ip version @s4' and similar, i.e. set lookups where the lhs needs + * fixups to mask out unwanted bits AND a shift. + */ + + binop_postprocess(ctx, binop, &binop->left); } } |