On Sat, 7 Nov 2026 11:11:54 +0000
Frank Dressler <[email protected]> wrote:
> On 11/6/26 14:27, Bing Zhao wrote:
>
> > The PACKET_IGNORE_OUTGOING socket option is used unconditionally,
> > but it was only added to the uapi headers in Linux 4.20. The build
> > fails on distributions shipping older kernel headers, like RHEL 8
> > (kernel-headers-4.18.0-193.el8, gcc 8.5.0):
>
> On 11/6/26 16:06, Frank Dressler wrote:
> > If RHEL 8 uses Linux 4.18, [...]
> > If DPDK needs to stay compatible with RHEL 8, [...]
>
> Short version: RHEL itself does't seem to ship any DPDK that is too
> new for its kernel. The RHEL 8 compatibility requirement may instead
> come from NVIDIA's DOCA, which ships DPDK 26.03 on RHEL 8. If so, the
> question is whether upstream DPDK should support that combination, or
> whether it is better handled on the DOCA side. Details below.
>
> Bing Zhao, is that the use case behind the patch?
>
> Details:
> I read too much into Bing Zhao's statement that the new code does not
> build with the RHEL 8 kernel. That statement is true.I incorrectly
> assumed RHEL itself ships a DPDK version that is too new for its
> kernel, which is not the case.
The important parts that were missed here.
- flag should not be accepted if underlying kernel does not support it.
- failure should be at compile time not runtime.
Either remove this part:
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c
b/drivers/net/af_packet/rte_eth_af_packet.c
index 44f82c0309..ecd4a9801e 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -32,11 +32,6 @@
#include <unistd.h>
#include <poll.h>
-/* Added in Linux 6.2. Older kernels ignore it. */
-#ifndef PACKET_FANOUT_FLAG_IGNORE_OUTGOING
-#define PACKET_FANOUT_FLAG_IGNORE_OUTGOING 0x4000
-#endif
-
#define ETH_AF_PACKET_IFACE_ARG "iface"
#define ETH_AF_PACKET_NUM_Q_ARG "qpairs"
#define ETH_AF_PACKET_BLOCKSIZE_ARG "blocksz"
Or add a bunch of #ifdef like this.
diff --git a/drivers/net/af_packet/rte_eth_af_packet.c
b/drivers/net/af_packet/rte_eth_af_packet.c
index 44f82c0309..6ffdfd8524 100644
--- a/drivers/net/af_packet/rte_eth_af_packet.c
+++ b/drivers/net/af_packet/rte_eth_af_packet.c
@@ -32,11 +32,6 @@
#include <unistd.h>
#include <poll.h>
-/* Added in Linux 6.2. Older kernels ignore it. */
-#ifndef PACKET_FANOUT_FLAG_IGNORE_OUTGOING
-#define PACKET_FANOUT_FLAG_IGNORE_OUTGOING 0x4000
-#endif
-
#define ETH_AF_PACKET_IFACE_ARG "iface"
#define ETH_AF_PACKET_NUM_Q_ARG "qpairs"
#define ETH_AF_PACKET_BLOCKSIZE_ARG "blocksz"
@@ -44,7 +39,10 @@
#define ETH_AF_PACKET_FRAMECOUNT_ARG "framecnt"
#define ETH_AF_PACKET_QDISC_BYPASS_ARG "qdisc_bypass"
#define ETH_AF_PACKET_FANOUT_MODE_ARG "fanout_mode"
-#define ETH_AF_PACKET_IGNORE_OUTGOING_ARG "ignore_outgoing"
+
+#ifdef PACKET_FANOUT_FLAG_IGNORE_OUTGOING
+#define ETH_AF_PACKET_IGNORE_OUTGOING_ARG "ignore_outgoing"
+#endif
#define DFLT_FRAME_SIZE (1 << 11)
#define DFLT_FRAME_COUNT (1 << 9)
@@ -110,7 +108,9 @@ static const char *valid_arguments[] = {
ETH_AF_PACKET_FRAMECOUNT_ARG,
ETH_AF_PACKET_QDISC_BYPASS_ARG,
ETH_AF_PACKET_FANOUT_MODE_ARG,
+#ifdef ETH_AF_PACKET_IGNORE_OUTGOING_ARG
ETH_AF_PACKET_IGNORE_OUTGOING_ARG,
+#endif
NULL
};
@@ -1002,6 +1002,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
goto error;
}
+#ifdef PACKET_FANOUT_FLAG_IGNORE_OUTGOING
/*
* Set the flag opportunistically if multiple queues are requested.
* It takes effect from Linux 6.2. Older kernels ignore it and the
@@ -1009,6 +1010,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
*/
if (ignore_outgoing != 0 && nb_queues > 1)
fanout_arg |= PACKET_FANOUT_FLAG_IGNORE_OUTGOING << 16;
+#endif
for (q = 0; q < nb_queues; q++) {
/* Open an AF_PACKET socket for this queue... */
@@ -1053,6 +1055,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
#endif
}
+#ifdef PACKET_IGNORE_OUTGOING
if (ignore_outgoing != 0 && nb_queues == 1) {
rc = setsockopt(qsockfd, SOL_PACKET,
PACKET_IGNORE_OUTGOING,
&ignore_outgoing,
sizeof(ignore_outgoing));
@@ -1064,6 +1067,7 @@ rte_pmd_init_internals(struct rte_vdev_device *dev,
goto error;
}
}
+#endif
rc = setsockopt(qsockfd, SOL_PACKET, PACKET_RX_RING, req,
sizeof(*req));
if (rc == -1) {
@@ -1314,11 +1318,14 @@ rte_eth_from_packet(struct rte_vdev_device *dev,
fanout_mode = pair->value;
continue;
}
+
+#ifdef ETH_AF_PACKET_IGNORE_OUTGOING_ARG
if (strstr(pair->key, ETH_AF_PACKET_IGNORE_OUTGOING_ARG) !=
NULL) {
if (parse_uint(pair->key, pair->value,
&ignore_outgoing, 1) < 0)
return -1;
continue;
}
+#endif
}
if (framesize > blocksize) {