Skb marking should be set in designated register, FW will
prepend it to the packet for us.
Signed-off-by: Jakub Kicinski <jakub.kicin...@netronome.com>
Reviewed-by: Dinan Gunawardena <dgunaward...@netronome.com>
Reviewed-by: Simon Horman <simon.hor...@netronome.com>
---
drivers/net/ethernet/netronome/nfp/nfp_bpf_jit.c | 20 ++++++++++++++++++++
drivers/net/ethernet/netronome/nfp/nfp_net.h | 2 +-
drivers/net/ethernet/netronome/nfp/nfp_net_common.c | 8 +++++++-
3 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_bpf_jit.c
b/drivers/net/ethernet/netronome/nfp/nfp_bpf_jit.c
index d7eecfceba5c..b31e673a6fe8 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_bpf_jit.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_bpf_jit.c
@@ -46,6 +46,8 @@
#define REG_IMM0_N 30 /* Bank AB */
#define REG_QNUM 29 /* Bank AB */
+#define REG_MARK 28 /* Bank A */
+#define REG_MARK_STS 28 /* Bank B */
/* --- NFP prog --- */
/* Foreach "multiple" entries macros provide pos and next<n> pointers.
@@ -416,6 +418,15 @@ static int construct_data_ld(struct nfp_prog *nfp_prog,
u16 offset, u8 size)
return construct_data_ind_ld(nfp_prog, offset, 0, false, size);
}
+static int wrp_skb_mark(struct nfp_prog *nfp_prog, u16 src)
+{
+ __emit_alu(nfp_prog, REG_MARK, ALU_DST_A, REG_NONE, ALU_OP_NONE, src,
+ false, false);
+ __emit_immed(nfp_prog, REG_MARK_STS, ALU_DST_B, 1, false);
+
+ return 0;
+}
+
static int
construct_br_imm(struct nfp_prog *nfp_prog, u32 imm, u16 dst, u8 br, u16 off,
enum alu_op alu_op, bool sw)
@@ -538,6 +549,14 @@ static int imm_ld8(struct nfp_prog *nfp_prog, struct
nfp_insn_meta *meta)
return 0;
}
+static int mem_stx4(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
+{
+ if (meta->insn.off == offsetof(struct sk_buff, mark))
+ return wrp_skb_mark(nfp_prog, meta->insn.src_reg * 2);