[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20180627024615.17856-7-saeedm@mellanox.com>
Date: Tue, 26 Jun 2018 19:46:15 -0700
From: Saeed Mahameed <saeedm@....mellanox.co.il>
To: Jesper Dangaard Brouer <brouer@...hat.com>,
Alexei Starovoitov <alexei.starovoitov@...il.com>,
Daniel Borkmann <borkmann@...earbox.net>
Cc: neerav.parikh@...el.com, pjwaskiewicz@...il.com,
ttoukan.linux@...il.com, Tariq Toukan <tariqt@...lanox.com>,
alexander.h.duyck@...el.com, peter.waskiewicz.jr@...el.com,
Opher Reviv <opher@...lanox.com>,
Rony Efraim <ronye@...lanox.com>, netdev@...r.kernel.org,
Saeed Mahameed <saeedm@...lanox.com>
Subject: [RFC bpf-next 6/6] samples/bpf: Add meta data hash example to xdp_redirect_cpu
Add a new program (prog_num = 4) that will not parse packets and will
use the meta data hash to spread/redirect traffic into different cpus.
For the new program we set on bpf_set_link_xdp_fd:
xdp_flags |= XDP_FLAGS_META_HASH | XDP_FLAGS_META_VLAN;
On mlx5 it will succeed since mlx5 already supports these flags.
The new program will read the value of the hash from the data_meta
pointer from the xdp_md and will use it to compute the destination cpu.
Note: I didn't test this patch to show redirect works with the hash!
I only used it to see that the hash and vlan values are set correctly
by the driver and can be seen by the xdp program.
* I faced some difficulties to read the hash value using the helper
functions defined in the previous patches, but once i used the same logic
with out these functions it worked ! Will have to figure this out later.
Signed-off-by: Saeed Mahameed <saeedm@...lanox.com>
---
samples/bpf/xdp_redirect_cpu_kern.c | 67 +++++++++++++++++++++++++++++
samples/bpf/xdp_redirect_cpu_user.c | 7 +++
2 files changed, 74 insertions(+)
diff --git a/samples/bpf/xdp_redirect_cpu_kern.c b/samples/bpf/xdp_redirect_cpu_kern.c
index 303e9e7161f3..d6b3f55f342a 100644
--- a/samples/bpf/xdp_redirect_cpu_kern.c
+++ b/samples/bpf/xdp_redirect_cpu_kern.c
@@ -376,6 +376,73 @@ int xdp_prognum3_proto_separate(struct xdp_md *ctx)
return bpf_redirect_map(&cpu_map, cpu_dest, 0);
}
+#if 0
+xdp_md_info_arr mdi = {
+ [XDP_DATA_META_HASH] = {.offset = 0, .present = 1},
+ [XDP_DATA_META_VLAN] = {.offset = sizeof(struct xdp_md_hash), .present = 1},
+};
+#endif
+
+SEC("xdp_cpu_map4_hash_separate")
+int xdp_prognum4_hash_separate(struct xdp_md *ctx)
+{
+ void *data_meta = (void *)(long)ctx->data_meta;
+ void *data_end = (void *)(long)ctx->data_end;
+ void *data = (void *)(long)ctx->data;
+ struct xdp_md_hash *hash;
+ struct xdp_md_vlan *vlan;
+ struct datarec *rec;
+ u32 cpu_dest = 0;
+ u32 cpu_idx = 0;
+ u32 *cpu_lookup;
+ u32 key = 0;
+
+ /* Count RX packet in map */
+ rec = bpf_map_lookup_elem(&rx_cnt, &key);
+ if (!rec)
+ return XDP_ABORTED;
+ rec->processed++;
+
+ /* for some reason this code fails to be verified */
+#if 0
+ hash = xdp_data_meta_get_hash(mdi, data_meta);
+ if (hash + 1 > data)
+ return XDP_ABORTED;
+
+ vlan = xdp_data_meta_get_vlan(mdi, data_meta);
+ if (vlan + 1 > data)
+ return XDP_ABORTED;
+#endif
+
+ /* Work around for the above code */
+ hash = data_meta; /* since we know hash will appear first */
+ if (hash + 1 > data)
+ return XDP_ABORTED;
+
+#if 0
+ // Just for testing
+ /* We know that vlan will appear after the hash */
+ vlan = (void *)((char *)data_meta + sizeof(*hash));
+ if (vlan + 1 > data) {
+ return XDP_ABORTED;
+ }
+#endif
+
+ cpu_idx = reciprocal_scale(hash->hash, MAX_CPUS);
+
+ cpu_lookup = bpf_map_lookup_elem(&cpus_available, &cpu_idx);
+ if (!cpu_lookup)
+ return XDP_ABORTED;
+ cpu_dest = *cpu_lookup;
+
+ if (cpu_dest >= MAX_CPUS) {
+ rec->issue++;
+ return XDP_ABORTED;
+ }
+
+ return bpf_redirect_map(&cpu_map, cpu_dest, 0);
+}
+
SEC("xdp_cpu_map4_ddos_filter_pktgen")
int xdp_prognum4_ddos_filter_pktgen(struct xdp_md *ctx)
{
diff --git a/samples/bpf/xdp_redirect_cpu_user.c b/samples/bpf/xdp_redirect_cpu_user.c
index f6efaefd485b..3429215d5a7b 100644
--- a/samples/bpf/xdp_redirect_cpu_user.c
+++ b/samples/bpf/xdp_redirect_cpu_user.c
@@ -679,6 +679,13 @@ int main(int argc, char **argv)
return EXIT_FAIL_OPTION;
}
+ /*
+ * prog_num 4 requires xdp meta data hash
+ * Vlan is not required but added just for testing..
+ */
+ if (prog_num == 4)
+ xdp_flags |= XDP_FLAGS_META_HASH | XDP_FLAGS_META_VLAN;
+
/* Remove XDP program when program is interrupted */
signal(SIGINT, int_exit);
--
2.17.0
Powered by blists - more mailing lists