Skip to content

Commit 93fb277

Browse files
committed
Merge branch 'bpf-xsk-sh-umem'
Tushar Vyavahare says: ==================== Implement a test for the SHARED_UMEM feature in this patch set and make necessary changes/improvements. Ensure that the framework now supports different streams for different sockets. v2->v3: - Set the sock_num at the end of the while loop. - Declare xsk at the top of the while loop. v1->v2: - Remove generate_mac_addresses() and generate mac addresses based on the number of sockets in __test_spec_init() function. [Magnus] - Update Makefile to include find_bit.c for compiling xskxceiver. - Add bitmap_full() function to verify all bits are set to break the while loop in the receive_pkts() and send_pkts() functions. - Replace __test_and_set_bit() function with __set_bit() function. - Add single return check for wait_for_tx_completion() function call. Patch series summary: 1: Move the packet stream from the ifobject struct to the xsk_socket_info struct to enable the use of different streams for different sockets This will facilitate the sending and receiving of data from multiple sockets simultaneously using the SHARED_XDP_UMEM feature. It gives flexibility of send/recive individual traffic on particular socket. 2: Rename the header file to a generic name so that it can be used by all future XDP programs. 3: Move the src_mac and dst_mac fields from the ifobject structure to the xsk_socket_info structure to achieve per-socket MAC address assignment. Require this in order to steer traffic to various sockets in subsequent patches. 4: Improve the receive_pkt() function to enable it to receive packets from multiple sockets. Define a sock_num variable to iterate through all the sockets in the Rx path. Add nb_valid_entries to check that all the expected number of packets are received. 5: The pkt_set() function no longer needs the umem parameter. This commit removes the umem parameter from the pkt_set() function. 6: Iterate over all the sockets in the send pkts function. Update send_pkts() to handle multiple sockets for sending packets. Multiple TX sockets are utilized alternately based on the batch size for improve packet transmission. 7: Modify xsk_update_xskmap() to accept the index as an argument, enabling the addition of multiple sockets to xskmap. 8: Add a new test for testing shared umem feature. This is accomplished by adding a new XDP program and using the multiple sockets. The new XDP program redirects the packets based on the destination MAC address. ==================== Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
2 parents 2147c8d + 6d198a8 commit 93fb277

File tree

8 files changed

+363
-211
lines changed

8 files changed

+363
-211
lines changed

tools/testing/selftests/bpf/Makefile

+3-1
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,9 @@ $(OUTPUT)/test_verifier: test_verifier.c verifier/tests.h $(BPFOBJ) | $(OUTPUT)
641641
$(call msg,BINARY,,$@)
642642
$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
643643

644-
$(OUTPUT)/xskxceiver: xskxceiver.c xskxceiver.h $(OUTPUT)/xsk.o $(OUTPUT)/xsk_xdp_progs.skel.h $(BPFOBJ) | $(OUTPUT)
644+
# Include find_bit.c to compile xskxceiver.
645+
EXTRA_SRC := $(TOOLSDIR)/lib/find_bit.c
646+
$(OUTPUT)/xskxceiver: $(EXTRA_SRC) xskxceiver.c xskxceiver.h $(OUTPUT)/xsk.o $(OUTPUT)/xsk_xdp_progs.skel.h $(BPFOBJ) | $(OUTPUT)
645647
$(call msg,BINARY,,$@)
646648
$(Q)$(CC) $(CFLAGS) $(filter %.a %.o %.c,$^) $(LDLIBS) -o $@
647649

tools/testing/selftests/bpf/progs/xsk_xdp_progs.c

+20-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33

44
#include <linux/bpf.h>
55
#include <bpf/bpf_helpers.h>
6-
#include "xsk_xdp_metadata.h"
6+
#include <linux/if_ether.h>
7+
#include "xsk_xdp_common.h"
78

89
struct {
910
__uint(type, BPF_MAP_TYPE_XSKMAP);
10-
__uint(max_entries, 1);
11+
__uint(max_entries, 2);
1112
__uint(key_size, sizeof(int));
1213
__uint(value_size, sizeof(int));
1314
} xsk SEC(".maps");
@@ -52,4 +53,21 @@ SEC("xdp.frags") int xsk_xdp_populate_metadata(struct xdp_md *xdp)
5253
return bpf_redirect_map(&xsk, 0, XDP_DROP);
5354
}
5455

56+
SEC("xdp") int xsk_xdp_shared_umem(struct xdp_md *xdp)
57+
{
58+
void *data = (void *)(long)xdp->data;
59+
void *data_end = (void *)(long)xdp->data_end;
60+
struct ethhdr *eth = data;
61+
62+
if (eth + 1 > data_end)
63+
return XDP_DROP;
64+
65+
/* Redirecting packets based on the destination MAC address */
66+
idx = ((unsigned int)(eth->h_dest[5])) / 2;
67+
if (idx > MAX_SOCKETS)
68+
return XDP_DROP;
69+
70+
return bpf_redirect_map(&xsk, idx, XDP_DROP);
71+
}
72+
5573
char _license[] SEC("license") = "GPL";

tools/testing/selftests/bpf/xsk.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -442,10 +442,9 @@ void xsk_clear_xskmap(struct bpf_map *map)
442442
bpf_map_delete_elem(map_fd, &index);
443443
}
444444

445-
int xsk_update_xskmap(struct bpf_map *map, struct xsk_socket *xsk)
445+
int xsk_update_xskmap(struct bpf_map *map, struct xsk_socket *xsk, u32 index)
446446
{
447447
int map_fd, sock_fd;
448-
u32 index = 0;
449448

450449
map_fd = bpf_map__fd(map);
451450
sock_fd = xsk_socket__fd(xsk);

tools/testing/selftests/bpf/xsk.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ struct xsk_umem_config {
204204

205205
int xsk_attach_xdp_program(struct bpf_program *prog, int ifindex, u32 xdp_flags);
206206
void xsk_detach_xdp_program(int ifindex, u32 xdp_flags);
207-
int xsk_update_xskmap(struct bpf_map *map, struct xsk_socket *xsk);
207+
int xsk_update_xskmap(struct bpf_map *map, struct xsk_socket *xsk, u32 index);
208208
void xsk_clear_xskmap(struct bpf_map *map);
209209
bool xsk_is_in_mode(u32 ifindex, int mode);
210210

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
3+
#ifndef XSK_XDP_COMMON_H_
4+
#define XSK_XDP_COMMON_H_
5+
6+
#define MAX_SOCKETS 2
7+
8+
struct xdp_info {
9+
__u64 count;
10+
} __attribute__((aligned(32)));
11+
12+
#endif /* XSK_XDP_COMMON_H_ */

tools/testing/selftests/bpf/xsk_xdp_metadata.h

-5
This file was deleted.

0 commit comments

Comments
 (0)