mbox series

[bpf-next,v4,0/6] XDP metadata support for tun driver

Message ID 20250227142330.1605996-1-marcus.wichelmann@hetzner-cloud.de (mailing list archive)
Headers show
Series XDP metadata support for tun driver | expand

Message

Marcus Wichelmann Feb. 27, 2025, 2:23 p.m. UTC
Hi all,

this series contains some improvements for the selftest patches. The other
patches remain unchanged. Please check the changelist below.

I have reverted the addition of the NOARP flag from the previous version,
as it was not effective and the CI was still failing occasionally because
of the race condition caused by foreign packets interfering with the veth
tests. This series contains an alternative solution by filtering all but
the test packets using the attached XDP program.

Successful pipeline:
https://github.com/kernel-patches/bpf/actions/runs/13552017584

---

v4:
- strip unrelated changes from the selftest patches
- extend commit message for "selftests/bpf: refactor xdp_context_functional
  test and bpf program"
- the NOARP flag was not effective to prevent other packets from
  interfering with the tests, add a filter to the XDP program instead
- run xdp_context_tuntap in a separate namespace to avoid conflicts with
  other tests

v3: https://lore.kernel.org/bpf/20250224152909.3911544-1-marcus.wichelmann@hetzner-cloud.de/
- change the condition to handle xdp_buffs without metadata support, as
  suggested by Willem de Bruijn <willemb@google.com>
- add clarifying comment why that condition is needed
- set NOARP flag in selftests to ensure that the kernel does not send
  packets on the test interfaces that may interfere with the tests

v2: https://lore.kernel.org/bpf/20250217172308.3291739-1-marcus.wichelmann@hetzner-cloud.de/
- submit against bpf-next subtree
- split commits and improved commit messages
- remove redundant metasize check and add clarifying comment instead
- use max() instead of ternary operator
- add selftest for metadata support in the tun driver

v1: https://lore.kernel.org/all/20250130171614.1657224-1-marcus.wichelmann@hetzner-cloud.de/

Marcus Wichelmann (6):
  net: tun: enable XDP metadata support
  net: tun: enable transfer of XDP metadata to skb
  selftests/bpf: move open_tuntap to network helpers
  selftests/bpf: refactor xdp_context_functional test and bpf program
  selftests/bpf: add test for XDP metadata support in tun driver
  selftests/bpf: fix file descriptor assertion in open_tuntap helper

 drivers/net/tun.c                             |  28 +++-
 tools/testing/selftests/bpf/network_helpers.c |  28 ++++
 tools/testing/selftests/bpf/network_helpers.h |   3 +
 .../selftests/bpf/prog_tests/lwt_helpers.h    |  29 ----
 .../bpf/prog_tests/xdp_context_test_run.c     | 138 +++++++++++++++++-
 .../selftests/bpf/progs/test_xdp_meta.c       |  53 +++++--
 6 files changed, 223 insertions(+), 56 deletions(-)

Comments

Lei Yang Feb. 28, 2025, 5:43 a.m. UTC | #1
Hi Marcus

Since your patches are about the virtual network, I'd like to test it,
but it conflicts (Please review the attachment to review more details)
when I apply it to the master branch.
My test based on this commit:
commit 1e15510b71c99c6e49134d756df91069f7d18141 (origin/master, origin/HEAD)
Merge: f09d694cf799 54e1b4becf5e
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date:   Thu Feb 27 09:32:42 2025 -0800

    Merge tag 'net-6.14-rc5' of
git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net

    Pull networking fixes from Jakub Kicinski:
     "Including fixes from bluetooth.

Thanks
Lei

On Thu, Feb 27, 2025 at 10:28 PM Marcus Wichelmann
<marcus.wichelmann@hetzner-cloud.de> wrote:
>
> Hi all,
>
> this series contains some improvements for the selftest patches. The other
> patches remain unchanged. Please check the changelist below.
>
> I have reverted the addition of the NOARP flag from the previous version,
> as it was not effective and the CI was still failing occasionally because
> of the race condition caused by foreign packets interfering with the veth
> tests. This series contains an alternative solution by filtering all but
> the test packets using the attached XDP program.
>
> Successful pipeline:
> https://github.com/kernel-patches/bpf/actions/runs/13552017584
>
> ---
>
> v4:
> - strip unrelated changes from the selftest patches
> - extend commit message for "selftests/bpf: refactor xdp_context_functional
>   test and bpf program"
> - the NOARP flag was not effective to prevent other packets from
>   interfering with the tests, add a filter to the XDP program instead
> - run xdp_context_tuntap in a separate namespace to avoid conflicts with
>   other tests
>
> v3: https://lore.kernel.org/bpf/20250224152909.3911544-1-marcus.wichelmann@hetzner-cloud.de/
> - change the condition to handle xdp_buffs without metadata support, as
>   suggested by Willem de Bruijn <willemb@google.com>
> - add clarifying comment why that condition is needed
> - set NOARP flag in selftests to ensure that the kernel does not send
>   packets on the test interfaces that may interfere with the tests
>
> v2: https://lore.kernel.org/bpf/20250217172308.3291739-1-marcus.wichelmann@hetzner-cloud.de/
> - submit against bpf-next subtree
> - split commits and improved commit messages
> - remove redundant metasize check and add clarifying comment instead
> - use max() instead of ternary operator
> - add selftest for metadata support in the tun driver
>
> v1: https://lore.kernel.org/all/20250130171614.1657224-1-marcus.wichelmann@hetzner-cloud.de/
>
> Marcus Wichelmann (6):
>   net: tun: enable XDP metadata support
>   net: tun: enable transfer of XDP metadata to skb
>   selftests/bpf: move open_tuntap to network helpers
>   selftests/bpf: refactor xdp_context_functional test and bpf program
>   selftests/bpf: add test for XDP metadata support in tun driver
>   selftests/bpf: fix file descriptor assertion in open_tuntap helper
>
>  drivers/net/tun.c                             |  28 +++-
>  tools/testing/selftests/bpf/network_helpers.c |  28 ++++
>  tools/testing/selftests/bpf/network_helpers.h |   3 +
>  .../selftests/bpf/prog_tests/lwt_helpers.h    |  29 ----
>  .../bpf/prog_tests/xdp_context_test_run.c     | 138 +++++++++++++++++-
>  .../selftests/bpf/progs/test_xdp_meta.c       |  53 +++++--
>  6 files changed, 223 insertions(+), 56 deletions(-)
>
> --
> 2.43.0
>
>
Marcus Wichelmann Feb. 28, 2025, 3:55 p.m. UTC | #2
Am 28.02.25 um 06:43 schrieb Lei Yang:
> Hi Marcus
> 
> Since your patches are about the virtual network, I'd like to test it,
> but it conflicts (Please review the attachment to review more details)
> when I apply it to the master branch.
> My test based on this commit:
> commit 1e15510b71c99c6e49134d756df91069f7d18141 (origin/master, origin/HEAD)
> Merge: f09d694cf799 54e1b4becf5e
> Author: Linus Torvalds <torvalds@linux-foundation.org>
> Date:   Thu Feb 27 09:32:42 2025 -0800
> 
>      Merge tag 'net-6.14-rc5' of
> git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
> 
>      Pull networking fixes from Jakub Kicinski:
>       "Including fixes from bluetooth.
> 

Hi,

thank you for including it in your tests.

The mentioned commit is not yet in bpf-next, but I rebased my patch on
latest mainline and attached the updated patch for the conflicting
commit.

The conflict was just about a section that was removed right below
my added line in network_helpers.h, so no functional change.

---

 From c7182e5a4d21696b9e8cd25f92e64e28129e2c6e Mon Sep 17 00:00:00 2001
From: Marcus Wichelmann <marcus.wichelmann@hetzner-cloud.de>
Date: Thu, 13 Feb 2025 16:28:19 +0000
Subject: [PATCH] selftests/bpf: move open_tuntap to network helpers

To test the XDP metadata functionality of the tun driver, it's necessary
to create a new tap device first. A helper function for this already
exists in lwt_helpers.h. Move it to the common network helpers header,
so it can be reused in other tests.

Signed-off-by: Marcus Wichelmann <marcus.wichelmann@hetzner-cloud.de>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Acked-by: Jason Wang <jasowang@redhat.com>
---
  tools/testing/selftests/bpf/network_helpers.c | 28 ++++++++++++++++++
  tools/testing/selftests/bpf/network_helpers.h |  3 ++
  .../selftests/bpf/prog_tests/lwt_helpers.h    | 29 -------------------
  3 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/tools/testing/selftests/bpf/network_helpers.c b/tools/testing/selftests/bpf/network_helpers.c
index 80844a5fb1fe..fcee2c4a637a 100644
--- a/tools/testing/selftests/bpf/network_helpers.c
+++ b/tools/testing/selftests/bpf/network_helpers.c
@@ -548,6 +548,34 @@ void close_netns(struct nstoken *token)
  	free(token);
  }
  
+int open_tuntap(const char *dev_name, bool need_mac)
+{
+	int err = 0;
+	struct ifreq ifr;
+	int fd = open("/dev/net/tun", O_RDWR);
+
+	if (!ASSERT_GT(fd, 0, "open(/dev/net/tun)"))
+		return -1;
+
+	ifr.ifr_flags = IFF_NO_PI | (need_mac ? IFF_TAP : IFF_TUN);
+	strncpy(ifr.ifr_name, dev_name, IFNAMSIZ - 1);
+	ifr.ifr_name[IFNAMSIZ - 1] = '\0';
+
+	err = ioctl(fd, TUNSETIFF, &ifr);
+	if (!ASSERT_OK(err, "ioctl(TUNSETIFF)")) {
+		close(fd);
+		return -1;
+	}
+
+	err = fcntl(fd, F_SETFL, O_NONBLOCK);
+	if (!ASSERT_OK(err, "fcntl(O_NONBLOCK)")) {
+		close(fd);
+		return -1;
+	}
+
+	return fd;
+}
+
  int get_socket_local_port(int sock_fd)
  {
  	struct sockaddr_storage addr;
diff --git a/tools/testing/selftests/bpf/network_helpers.h b/tools/testing/selftests/bpf/network_helpers.h
index ebec8a8d6f81..175dd547849f 100644
--- a/tools/testing/selftests/bpf/network_helpers.h
+++ b/tools/testing/selftests/bpf/network_helpers.h
@@ -8,6 +8,7 @@
  typedef __u16 __sum16;
  #include <linux/if_ether.h>
  #include <linux/if_packet.h>
+#include <linux/if_tun.h>
  #include <linux/ip.h>
  #include <linux/ipv6.h>
  #include <linux/ethtool.h>
@@ -98,6 +99,8 @@ int send_recv_data(int lfd, int fd, uint32_t total_bytes);
  int make_netns(const char *name);
  int remove_netns(const char *name);
  
+int open_tuntap(const char *dev_name, bool need_mac);
+
  static __u16 csum_fold(__u32 csum)
  {
  	csum = (csum & 0xffff) + (csum >> 16);
diff --git a/tools/testing/selftests/bpf/prog_tests/lwt_helpers.h b/tools/testing/selftests/bpf/prog_tests/lwt_helpers.h
index fb1eb8c67361..ccec0fcdabc1 100644
--- a/tools/testing/selftests/bpf/prog_tests/lwt_helpers.h
+++ b/tools/testing/selftests/bpf/prog_tests/lwt_helpers.h
@@ -5,7 +5,6 @@
  
  #include <time.h>
  #include <net/if.h>
-#include <linux/if_tun.h>
  #include <linux/icmp.h>
  
  #include "test_progs.h"
@@ -37,34 +36,6 @@ static inline int netns_delete(void)
  	return system("ip netns del " NETNS ">/dev/null 2>&1");
  }
  
-static int open_tuntap(const char *dev_name, bool need_mac)
-{
-	int err = 0;
-	struct ifreq ifr;
-	int fd = open("/dev/net/tun", O_RDWR);
-
-	if (!ASSERT_GT(fd, 0, "open(/dev/net/tun)"))
-		return -1;
-
-	ifr.ifr_flags = IFF_NO_PI | (need_mac ? IFF_TAP : IFF_TUN);
-	strncpy(ifr.ifr_name, dev_name, IFNAMSIZ - 1);
-	ifr.ifr_name[IFNAMSIZ - 1] = '\0';
-
-	err = ioctl(fd, TUNSETIFF, &ifr);
-	if (!ASSERT_OK(err, "ioctl(TUNSETIFF)")) {
-		close(fd);
-		return -1;
-	}
-
-	err = fcntl(fd, F_SETFL, O_NONBLOCK);
-	if (!ASSERT_OK(err, "fcntl(O_NONBLOCK)")) {
-		close(fd);
-		return -1;
-	}
-
-	return fd;
-}
-
  #define ICMP_PAYLOAD_SIZE     100
  
  /* Match an ICMP packet with payload len ICMP_PAYLOAD_SIZE */
Marcus Wichelmann Feb. 28, 2025, 4:08 p.m. UTC | #3
Am 28.02.25 um 06:43 schrieb Lei Yang:
> Hi Marcus
> 
> Since your patches are about the virtual network, I'd like to test it,
> but it conflicts (Please review the attachment to review more details)
> when I apply it to the master branch.
> My test based on this commit:
> commit 1e15510b71c99c6e49134d756df91069f7d18141 (origin/master, origin/HEAD)
> Merge: f09d694cf799 54e1b4becf5e
> Author: Linus Torvalds <torvalds@linux-foundation.org>
> Date:   Thu Feb 27 09:32:42 2025 -0800
> 
>     Merge tag 'net-6.14-rc5' of
> git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
> 
>     Pull networking fixes from Jakub Kicinski:
>      "Including fixes from bluetooth.
> 

Hi,

thank you for including it in your tests.

The mentioned commit is not yet in bpf-next, but I rebased my patch on
latest mainline and attached the updated patch for the conflicting
commit (now with proper formatting, hopefully).

The conflict was just about a section that was removed right below
my added line in network_helpers.h, so no functional change.

---

From c7182e5a4d21696b9e8cd25f92e64e28129e2c6e Mon Sep 17 00:00:00 2001
From: Marcus Wichelmann <marcus.wichelmann@hetzner-cloud.de>
Date: Thu, 13 Feb 2025 16:28:19 +0000
Subject: [PATCH] selftests/bpf: move open_tuntap to network helpers

To test the XDP metadata functionality of the tun driver, it's necessary
to create a new tap device first. A helper function for this already
exists in lwt_helpers.h. Move it to the common network helpers header,
so it can be reused in other tests.

Signed-off-by: Marcus Wichelmann <marcus.wichelmann@hetzner-cloud.de>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Acked-by: Jason Wang <jasowang@redhat.com>
---
 tools/testing/selftests/bpf/network_helpers.c | 28 ++++++++++++++++++
 tools/testing/selftests/bpf/network_helpers.h |  3 ++
 .../selftests/bpf/prog_tests/lwt_helpers.h    | 29 -------------------
 3 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/tools/testing/selftests/bpf/network_helpers.c b/tools/testing/selftests/bpf/network_helpers.c
index 80844a5fb1fe..fcee2c4a637a 100644
--- a/tools/testing/selftests/bpf/network_helpers.c
+++ b/tools/testing/selftests/bpf/network_helpers.c
@@ -548,6 +548,34 @@ void close_netns(struct nstoken *token)
 	free(token);
 }
 
+int open_tuntap(const char *dev_name, bool need_mac)
+{
+	int err = 0;
+	struct ifreq ifr;
+	int fd = open("/dev/net/tun", O_RDWR);
+
+	if (!ASSERT_GT(fd, 0, "open(/dev/net/tun)"))
+		return -1;
+
+	ifr.ifr_flags = IFF_NO_PI | (need_mac ? IFF_TAP : IFF_TUN);
+	strncpy(ifr.ifr_name, dev_name, IFNAMSIZ - 1);
+	ifr.ifr_name[IFNAMSIZ - 1] = '\0';
+
+	err = ioctl(fd, TUNSETIFF, &ifr);
+	if (!ASSERT_OK(err, "ioctl(TUNSETIFF)")) {
+		close(fd);
+		return -1;
+	}
+
+	err = fcntl(fd, F_SETFL, O_NONBLOCK);
+	if (!ASSERT_OK(err, "fcntl(O_NONBLOCK)")) {
+		close(fd);
+		return -1;
+	}
+
+	return fd;
+}
+
 int get_socket_local_port(int sock_fd)
 {
 	struct sockaddr_storage addr;
diff --git a/tools/testing/selftests/bpf/network_helpers.h b/tools/testing/selftests/bpf/network_helpers.h
index ebec8a8d6f81..175dd547849f 100644
--- a/tools/testing/selftests/bpf/network_helpers.h
+++ b/tools/testing/selftests/bpf/network_helpers.h
@@ -8,6 +8,7 @@
 typedef __u16 __sum16;
 #include <linux/if_ether.h>
 #include <linux/if_packet.h>
+#include <linux/if_tun.h>
 #include <linux/ip.h>
 #include <linux/ipv6.h>
 #include <linux/ethtool.h>
@@ -98,6 +99,8 @@ int send_recv_data(int lfd, int fd, uint32_t total_bytes);
 int make_netns(const char *name);
 int remove_netns(const char *name);
 
+int open_tuntap(const char *dev_name, bool need_mac);
+
 static __u16 csum_fold(__u32 csum)
 {
 	csum = (csum & 0xffff) + (csum >> 16);
diff --git a/tools/testing/selftests/bpf/prog_tests/lwt_helpers.h b/tools/testing/selftests/bpf/prog_tests/lwt_helpers.h
index fb1eb8c67361..ccec0fcdabc1 100644
--- a/tools/testing/selftests/bpf/prog_tests/lwt_helpers.h
+++ b/tools/testing/selftests/bpf/prog_tests/lwt_helpers.h
@@ -5,7 +5,6 @@
 
 #include <time.h>
 #include <net/if.h>
-#include <linux/if_tun.h>
 #include <linux/icmp.h>
 
 #include "test_progs.h"
@@ -37,34 +36,6 @@ static inline int netns_delete(void)
 	return system("ip netns del " NETNS ">/dev/null 2>&1");
 }
 
-static int open_tuntap(const char *dev_name, bool need_mac)
-{
-	int err = 0;
-	struct ifreq ifr;
-	int fd = open("/dev/net/tun", O_RDWR);
-
-	if (!ASSERT_GT(fd, 0, "open(/dev/net/tun)"))
-		return -1;
-
-	ifr.ifr_flags = IFF_NO_PI | (need_mac ? IFF_TAP : IFF_TUN);
-	strncpy(ifr.ifr_name, dev_name, IFNAMSIZ - 1);
-	ifr.ifr_name[IFNAMSIZ - 1] = '\0';
-
-	err = ioctl(fd, TUNSETIFF, &ifr);
-	if (!ASSERT_OK(err, "ioctl(TUNSETIFF)")) {
-		close(fd);
-		return -1;
-	}
-
-	err = fcntl(fd, F_SETFL, O_NONBLOCK);
-	if (!ASSERT_OK(err, "fcntl(O_NONBLOCK)")) {
-		close(fd);
-		return -1;
-	}
-
-	return fd;
-}
-
 #define ICMP_PAYLOAD_SIZE     100
 
 /* Match an ICMP packet with payload len ICMP_PAYLOAD_SIZE */