eBPF classifier (section "cls_q" in tap_bpf_program.c) is looking for marked packets whose skb->cb[1] contains an RSS queue number and redirects those packets to the matched queue. It is expected that skb->cb[1] has been previously set with a valid RSS queue number during an eBPF action (section "l3_l4" in tap_bpf_program.c), however for non-RSS flows skb->cb[1] may contain a random unset value which can falsely be interpreted as a valid RSS queue. To avoid this potential error, tap_bpf_program.c has been updated as follows: 1. After calculating the RSS queue number it is added a unique offset in order to uniquely identify it as a valid RSS queue number. 2. After matching an RSS queue to a packet - skb->cb[1] is set to 0
Fixes: cdc07e83bb24 ("net/tap: add eBPF program file") Fixes: aabe70df73a3 ("net/tap: add eBPF bytes code") Signed-off-by: Ophir Munk <ophi...@mellanox.com> --- drivers/net/tap/tap_bpf_insns.h | 23 +++++++++++++---------- drivers/net/tap/tap_bpf_program.c | 5 ++++- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/drivers/net/tap/tap_bpf_insns.h b/drivers/net/tap/tap_bpf_insns.h index c406f78..89873b6 100644 --- a/drivers/net/tap/tap_bpf_insns.h +++ b/drivers/net/tap/tap_bpf_insns.h @@ -6,17 +6,20 @@ /* bpf_insn array matching cls_q section. See tap_bpf_program.c file */ struct bpf_insn cls_q_insns[] = { - {0x61, 1, 1, 52, 0x00000000}, - {0x18, 2, 0, 0, 0xdeadbeef}, + {0x61, 2, 1, 52, 0x00000000}, + {0x18, 3, 0, 0, 0xdeadbeef}, {0x00, 0, 0, 0, 0x00000000}, - {0x63, 10, 2, -4, 0x00000000}, - {0x61, 2, 10, -4, 0x00000000}, - {0x07, 2, 0, 0, 0x00000001}, - {0x67, 2, 0, 0, 0x00000020}, - {0x77, 2, 0, 0, 0x00000020}, - {0xb7, 0, 0, 0, 0xffffffff}, - {0x1d, 1, 2, 1, 0x00000000}, + {0x63, 10, 3, -4, 0x00000000}, {0xb7, 0, 0, 0, 0x00000000}, + {0x61, 3, 10, -4, 0x00000000}, + {0x07, 3, 0, 0, 0x7cafe800}, + {0x67, 3, 0, 0, 0x00000020}, + {0x77, 3, 0, 0, 0x00000020}, + {0x5d, 2, 3, 4, 0x00000000}, + {0xb7, 2, 0, 0, 0x00000000}, + {0x63, 1, 2, 52, 0x00000000}, + {0x18, 0, 0, 0, 0xffffffff}, + {0x00, 0, 0, 0, 0x00000000}, {0x95, 0, 0, 0, 0x00000000}, }; @@ -1685,7 +1688,7 @@ struct bpf_insn l3_l4_hash_insns[] = { {0x4f, 3, 2, 0, 0x00000000}, {0x67, 3, 0, 0, 0x00000010}, {0x4f, 3, 1, 0, 0x00000000}, - {0x07, 3, 0, 0, 0x00000001}, + {0x07, 3, 0, 0, 0x7cafe800}, {0x63, 5, 3, 52, 0x00000000}, {0xb7, 7, 0, 0, 0x00000001}, {0xbf, 0, 7, 0, 0x00000000}, diff --git a/drivers/net/tap/tap_bpf_program.c b/drivers/net/tap/tap_bpf_program.c index 848c50b..64dcdb8 100644 --- a/drivers/net/tap/tap_bpf_program.c +++ b/drivers/net/tap/tap_bpf_program.c @@ -31,7 +31,7 @@ * The queue number is offset by 1, to distinguish packets that have * gone through this rule (skb->cb[1] != 0) from others. */ -#define QUEUE_OFFSET 1 +#define QUEUE_OFFSET 0x7cafe800 #define PIN_GLOBAL_NS 2 #define KEY_IDX 0 @@ -63,6 +63,9 @@ match_q(struct __sk_buff *skb) if (queue != match_queue) return TC_ACT_OK; + + /* queue match */ + skb->cb[1] = 0; return TC_ACT_UNSPEC; } -- 2.7.4