* [PATCH] Add missing includes to headers
@ 2026-02-19 17:45 Peter Foley
2026-02-21 17:57 ` Stefano Brivio
2026-02-23 5:33 ` David Gibson
0 siblings, 2 replies; 9+ messages in thread
From: Peter Foley @ 2026-02-19 17:45 UTC (permalink / raw)
To: passt-dev; +Cc: Peter Foley
Support build systems like bazel that check that headers are
self-contained.
Signed-off-by: Peter Foley <pefoley@google.com>
---
flow.h | 6 ++++++
flow_table.h | 1 +
icmp_flow.h | 2 ++
inany.h | 5 +++++
ip.h | 2 ++
linux_dep.h | 3 +++
pif.h | 4 ++++
seccomp.sh | 5 +++++
siphash.h | 3 +++
tap.h | 5 +++++
tcp_conn.h | 4 ++++
tcp_internal.h | 5 +++++
udp_internal.h | 3 +++
util.c | 1 +
14 files changed, 49 insertions(+)
diff --git a/flow.h b/flow.h
index d636358..897c9ea 100644
--- a/flow.h
+++ b/flow.h
@@ -7,6 +7,12 @@
#ifndef FLOW_H
#define FLOW_H
+#include <stdint.h>
+#include <netinet/in.h>
+
+#include "inany.h"
+#include "util.h"
+
#define FLOW_TIMER_INTERVAL 1000 /* ms */
/**
diff --git a/flow_table.h b/flow_table.h
index 73de13b..8fb7b5c 100644
--- a/flow_table.h
+++ b/flow_table.h
@@ -7,6 +7,7 @@
#ifndef FLOW_TABLE_H
#define FLOW_TABLE_H
+#include "pif.h"
#include "tcp_conn.h"
#include "icmp_flow.h"
#include "udp_flow.h"
diff --git a/icmp_flow.h b/icmp_flow.h
index fb93801..3af98be 100644
--- a/icmp_flow.h
+++ b/icmp_flow.h
@@ -7,6 +7,8 @@
#ifndef ICMP_FLOW_H
#define ICMP_FLOW_H
+#include "flow.h"
+
/**
* struct icmp_ping_flow - Descriptor for a flow of ping requests/replies
* @f: Generic flow information
diff --git a/inany.h b/inany.h
index b02c289..c7de094 100644
--- a/inany.h
+++ b/inany.h
@@ -9,6 +9,11 @@
#ifndef INANY_H
#define INANY_H
+#include <string.h>
+
+#include "ip.h"
+#include "siphash.h"
+
struct siphash_state;
/** union inany_addr - Represents either an IPv4 or IPv6 address
diff --git a/ip.h b/ip.h
index a8043c2..3be2d4e 100644
--- a/ip.h
+++ b/ip.h
@@ -9,6 +9,8 @@
#include <netinet/ip.h>
#include <netinet/ip6.h>
+#include "util.h"
+
#define IN4_IS_ADDR_UNSPECIFIED(a) \
(((struct in_addr *)(a))->s_addr == htonl_constant(INADDR_ANY))
#define IN4_IS_ADDR_BROADCAST(a) \
diff --git a/linux_dep.h b/linux_dep.h
index 89e590c..3f8184b 100644
--- a/linux_dep.h
+++ b/linux_dep.h
@@ -7,6 +7,9 @@
#ifndef LINUX_DEP_H
#define LINUX_DEP_H
+#include <stdint.h>
+#include <unistd.h>
+
/* struct tcp_info_linux - Information from Linux TCP_INFO getsockopt()
*
* Largely derived from include/linux/tcp.h in the Linux kernel
diff --git a/pif.h b/pif.h
index 0f7f667..7c755bd 100644
--- a/pif.h
+++ b/pif.h
@@ -7,6 +7,10 @@
#ifndef PIF_H
#define PIF_H
+#include <netinet/in.h>
+
+#include "epoll_type.h"
+
union inany_addr;
union sockaddr_inany;
diff --git a/seccomp.sh b/seccomp.sh
index 60ebe84..5347586 100755
--- a/seccomp.sh
+++ b/seccomp.sh
@@ -34,6 +34,11 @@ AUDIT_ARCH="AUDIT_ARCH_$(echo ${ARCH} | tr '[a-z]' '[A-Z]' \
HEADER="/* This file was automatically generated by $(basename ${0}) */
+#include <stddef.h>
+#include <linux/audit.h>
+#include <linux/filter.h>
+#include <linux/seccomp.h>
+
#ifndef AUDIT_ARCH_PPC64LE
#define AUDIT_ARCH_PPC64LE (AUDIT_ARCH_PPC64 | __AUDIT_ARCH_LE)
#endif"
diff --git a/siphash.h b/siphash.h
index e760236..bbddcac 100644
--- a/siphash.h
+++ b/siphash.h
@@ -44,6 +44,9 @@
#ifndef SIPHASH_H
#define SIPHASH_H
+#include <stddef.h>
+#include <stdint.h>
+
/**
* struct siphash_state - Internal state of siphash calculation
*/
diff --git a/tap.h b/tap.h
index cc780d1..07ca096 100644
--- a/tap.h
+++ b/tap.h
@@ -6,6 +6,11 @@
#ifndef TAP_H
#define TAP_H
+#include <stddef.h>
+#include <stdint.h>
+
+#include "passt.h"
+
/** L2_MAX_LEN_PASTA - Maximum frame length for pasta mode (with L2 header)
*
* The kernel tuntap device imposes a maximum frame size of 65535 including
diff --git a/tcp_conn.h b/tcp_conn.h
index 21cea10..d4d0139 100644
--- a/tcp_conn.h
+++ b/tcp_conn.h
@@ -9,6 +9,10 @@
#ifndef TCP_CONN_H
#define TCP_CONN_H
+#include <stdint.h>
+
+#include "flow.h"
+
/**
* struct tcp_tap_conn - Descriptor for a TCP connection (not spliced)
* @f: Generic flow information
diff --git a/tcp_internal.h b/tcp_internal.h
index 518913b..591e58c 100644
--- a/tcp_internal.h
+++ b/tcp_internal.h
@@ -6,6 +6,11 @@
#ifndef TCP_INTERNAL_H
#define TCP_INTERNAL_H
+#include <stdint.h>
+#include <netinet/tcp.h>
+
+#include "util.h"
+
#define MAX_WS 8
#define MAX_WINDOW (1 << (16 + (MAX_WS)))
diff --git a/udp_internal.h b/udp_internal.h
index 0a8fe49..64e4577 100644
--- a/udp_internal.h
+++ b/udp_internal.h
@@ -6,6 +6,9 @@
#ifndef UDP_INTERNAL_H
#define UDP_INTERNAL_H
+#include <netinet/in.h>
+#include <netinet/udp.h>
+
#include "tap.h" /* needed by udp_meta_t */
/**
diff --git a/util.c b/util.c
index a48f727..db27431 100644
--- a/util.c
+++ b/util.c
@@ -25,6 +25,7 @@
#include <errno.h>
#include <stdbool.h>
#include <linux/errqueue.h>
+#include <linux/in6.h>
#include <getopt.h>
#include "linux_dep.h"
--
2.53.0.371.g1d285c8824-goog
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Add missing includes to headers
2026-02-19 17:45 [PATCH] Add missing includes to headers Peter Foley
@ 2026-02-21 17:57 ` Stefano Brivio
[not found] ` <CAAAKUPN=GPDp84tQAv4Kpxs-AzKR44pDkWda-AbXWaUomYN5eg@mail.gmail.com>
2026-02-23 5:33 ` David Gibson
1 sibling, 1 reply; 9+ messages in thread
From: Stefano Brivio @ 2026-02-21 17:57 UTC (permalink / raw)
To: Peter Foley; +Cc: passt-dev
On Thu, 19 Feb 2026 13:44:54 -0500
Peter Foley <pefoley@google.com> wrote:
> Support build systems like bazel that check that headers are
> self-contained.
>
> Signed-off-by: Peter Foley <pefoley@google.com>
Thanks for the patch, Peter!
It looks obviously correct to me, but I still have a question: do you
happen to have a Bazel BUILD file somewhere (we could also add it to
passt's contrib/ if it's not in any other repository) to check future
changes against it?
Otherwise we risk breaking Bazel builds again soon.
I'll review and apply within a couple of days regardless of that.
--
Stefano
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Add missing includes to headers
2026-02-19 17:45 [PATCH] Add missing includes to headers Peter Foley
2026-02-21 17:57 ` Stefano Brivio
@ 2026-02-23 5:33 ` David Gibson
2026-02-23 16:32 ` Stefano Brivio
1 sibling, 1 reply; 9+ messages in thread
From: David Gibson @ 2026-02-23 5:33 UTC (permalink / raw)
To: Peter Foley; +Cc: passt-dev
[-- Attachment #1: Type: text/plain, Size: 6615 bytes --]
On Thu, Feb 19, 2026 at 01:44:54PM -0500, Peter Foley wrote:
> Support build systems like bazel that check that headers are
> self-contained.
>
> Signed-off-by: Peter Foley <pefoley@google.com>
There are kind of two schools of thoughts on headers. One is that
every header should #include anything it relies on. The other is that
headers should #include nothing, and .c files should includde
everything they need in the right order. The advantages of the second
approach are that it makes it easier to keep #includes in .c files
minimal, and makes circular dependencies more obvious and easier to
dientanble.
We've kinda sorta been using approach two in passt, but not entirely,
and honestly, it's not really working. So I'm happy to convert to the
former approach. However, if we're adding #includes in the headers so
they're self contained, then we should be able to also *remove* a
bunch of #includes from .c files (and other .h files) which were
previously only there to satisfy the indirect dependencies.
> ---
> flow.h | 6 ++++++
> flow_table.h | 1 +
> icmp_flow.h | 2 ++
> inany.h | 5 +++++
> ip.h | 2 ++
> linux_dep.h | 3 +++
> pif.h | 4 ++++
> seccomp.sh | 5 +++++
> siphash.h | 3 +++
> tap.h | 5 +++++
> tcp_conn.h | 4 ++++
> tcp_internal.h | 5 +++++
> udp_internal.h | 3 +++
> util.c | 1 +
> 14 files changed, 49 insertions(+)
>
> diff --git a/flow.h b/flow.h
> index d636358..897c9ea 100644
> --- a/flow.h
> +++ b/flow.h
> @@ -7,6 +7,12 @@
> #ifndef FLOW_H
> #define FLOW_H
>
> +#include <stdint.h>
> +#include <netinet/in.h>
> +
> +#include "inany.h"
> +#include "util.h"
> +
> #define FLOW_TIMER_INTERVAL 1000 /* ms */
>
> /**
> diff --git a/flow_table.h b/flow_table.h
> index 73de13b..8fb7b5c 100644
> --- a/flow_table.h
> +++ b/flow_table.h
> @@ -7,6 +7,7 @@
> #ifndef FLOW_TABLE_H
> #define FLOW_TABLE_H
>
> +#include "pif.h"
> #include "tcp_conn.h"
> #include "icmp_flow.h"
> #include "udp_flow.h"
> diff --git a/icmp_flow.h b/icmp_flow.h
> index fb93801..3af98be 100644
> --- a/icmp_flow.h
> +++ b/icmp_flow.h
> @@ -7,6 +7,8 @@
> #ifndef ICMP_FLOW_H
> #define ICMP_FLOW_H
>
> +#include "flow.h"
> +
> /**
> * struct icmp_ping_flow - Descriptor for a flow of ping requests/replies
> * @f: Generic flow information
> diff --git a/inany.h b/inany.h
> index b02c289..c7de094 100644
> --- a/inany.h
> +++ b/inany.h
> @@ -9,6 +9,11 @@
> #ifndef INANY_H
> #define INANY_H
>
> +#include <string.h>
> +
> +#include "ip.h"
> +#include "siphash.h"
> +
> struct siphash_state;
>
> /** union inany_addr - Represents either an IPv4 or IPv6 address
> diff --git a/ip.h b/ip.h
> index a8043c2..3be2d4e 100644
> --- a/ip.h
> +++ b/ip.h
> @@ -9,6 +9,8 @@
> #include <netinet/ip.h>
> #include <netinet/ip6.h>
>
> +#include "util.h"
> +
> #define IN4_IS_ADDR_UNSPECIFIED(a) \
> (((struct in_addr *)(a))->s_addr == htonl_constant(INADDR_ANY))
> #define IN4_IS_ADDR_BROADCAST(a) \
> diff --git a/linux_dep.h b/linux_dep.h
> index 89e590c..3f8184b 100644
> --- a/linux_dep.h
> +++ b/linux_dep.h
> @@ -7,6 +7,9 @@
> #ifndef LINUX_DEP_H
> #define LINUX_DEP_H
>
> +#include <stdint.h>
> +#include <unistd.h>
> +
> /* struct tcp_info_linux - Information from Linux TCP_INFO getsockopt()
> *
> * Largely derived from include/linux/tcp.h in the Linux kernel
> diff --git a/pif.h b/pif.h
> index 0f7f667..7c755bd 100644
> --- a/pif.h
> +++ b/pif.h
> @@ -7,6 +7,10 @@
> #ifndef PIF_H
> #define PIF_H
>
> +#include <netinet/in.h>
> +
> +#include "epoll_type.h"
> +
> union inany_addr;
> union sockaddr_inany;
>
> diff --git a/seccomp.sh b/seccomp.sh
> index 60ebe84..5347586 100755
> --- a/seccomp.sh
> +++ b/seccomp.sh
> @@ -34,6 +34,11 @@ AUDIT_ARCH="AUDIT_ARCH_$(echo ${ARCH} | tr '[a-z]' '[A-Z]' \
>
> HEADER="/* This file was automatically generated by $(basename ${0}) */
>
> +#include <stddef.h>
> +#include <linux/audit.h>
> +#include <linux/filter.h>
> +#include <linux/seccomp.h>
> +
> #ifndef AUDIT_ARCH_PPC64LE
> #define AUDIT_ARCH_PPC64LE (AUDIT_ARCH_PPC64 | __AUDIT_ARCH_LE)
> #endif"
> diff --git a/siphash.h b/siphash.h
> index e760236..bbddcac 100644
> --- a/siphash.h
> +++ b/siphash.h
> @@ -44,6 +44,9 @@
> #ifndef SIPHASH_H
> #define SIPHASH_H
>
> +#include <stddef.h>
> +#include <stdint.h>
> +
> /**
> * struct siphash_state - Internal state of siphash calculation
> */
> diff --git a/tap.h b/tap.h
> index cc780d1..07ca096 100644
> --- a/tap.h
> +++ b/tap.h
> @@ -6,6 +6,11 @@
> #ifndef TAP_H
> #define TAP_H
>
> +#include <stddef.h>
> +#include <stdint.h>
> +
> +#include "passt.h"
> +
> /** L2_MAX_LEN_PASTA - Maximum frame length for pasta mode (with L2 header)
> *
> * The kernel tuntap device imposes a maximum frame size of 65535 including
> diff --git a/tcp_conn.h b/tcp_conn.h
> index 21cea10..d4d0139 100644
> --- a/tcp_conn.h
> +++ b/tcp_conn.h
> @@ -9,6 +9,10 @@
> #ifndef TCP_CONN_H
> #define TCP_CONN_H
>
> +#include <stdint.h>
> +
> +#include "flow.h"
> +
> /**
> * struct tcp_tap_conn - Descriptor for a TCP connection (not spliced)
> * @f: Generic flow information
> diff --git a/tcp_internal.h b/tcp_internal.h
> index 518913b..591e58c 100644
> --- a/tcp_internal.h
> +++ b/tcp_internal.h
> @@ -6,6 +6,11 @@
> #ifndef TCP_INTERNAL_H
> #define TCP_INTERNAL_H
>
> +#include <stdint.h>
> +#include <netinet/tcp.h>
> +
> +#include "util.h"
> +
> #define MAX_WS 8
> #define MAX_WINDOW (1 << (16 + (MAX_WS)))
>
> diff --git a/udp_internal.h b/udp_internal.h
> index 0a8fe49..64e4577 100644
> --- a/udp_internal.h
> +++ b/udp_internal.h
> @@ -6,6 +6,9 @@
> #ifndef UDP_INTERNAL_H
> #define UDP_INTERNAL_H
>
> +#include <netinet/in.h>
> +#include <netinet/udp.h>
> +
> #include "tap.h" /* needed by udp_meta_t */
>
> /**
> diff --git a/util.c b/util.c
> index a48f727..db27431 100644
> --- a/util.c
> +++ b/util.c
> @@ -25,6 +25,7 @@
> #include <errno.h>
> #include <stdbool.h>
> #include <linux/errqueue.h>
> +#include <linux/in6.h>
> #include <getopt.h>
>
> #include "linux_dep.h"
> --
> 2.53.0.371.g1d285c8824-goog
>
--
David Gibson (he or they) | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you, not the other way
| around.
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Add missing includes to headers
2026-02-23 5:33 ` David Gibson
@ 2026-02-23 16:32 ` Stefano Brivio
0 siblings, 0 replies; 9+ messages in thread
From: Stefano Brivio @ 2026-02-23 16:32 UTC (permalink / raw)
To: David Gibson; +Cc: Peter Foley, passt-dev
On Mon, 23 Feb 2026 16:33:32 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:
> On Thu, Feb 19, 2026 at 01:44:54PM -0500, Peter Foley wrote:
> > Support build systems like bazel that check that headers are
> > self-contained.
> >
> > Signed-off-by: Peter Foley <pefoley@google.com>
>
> There are kind of two schools of thoughts on headers. One is that
> every header should #include anything it relies on. The other is that
> headers should #include nothing, and .c files should includde
> everything they need in the right order. The advantages of the second
> approach are that it makes it easier to keep #includes in .c files
> minimal, and makes circular dependencies more obvious and easier to
> dientanble.
>
> We've kinda sorta been using approach two in passt, but not entirely,
> and honestly, it's not really working.
I would argue it *is* pretty much working, because it builds without
warnings against glibc and musl, with several versions of gcc and
Clang, on a large number of distributions and architectures, which is
what it needs to do.
There are currently two warnings with (unreleased) gcc 16-ish and
glibc, I still have to post patches for them, but they have nothing to
do with includes.
That being said, sure, it's not either approach and admittedly kind of
arbitrary and rather messy.
> So I'm happy to convert to the
> former approach. However, if we're adding #includes in the headers so
> they're self contained, then we should be able to also *remove* a
> bunch of #includes from .c files (and other .h files) which were
> previously only there to satisfy the indirect dependencies.
Just for clarity, while I agree, this patch does *not* magically make
that Peter's job. :)
I'd say that making it build with Bazel is more useful at this stage so
I would happily accept this patch by itself (I just need to find a
moment to try out builds on musl and on a couple of distributions,
first).
The cleanup you propose can also be done independently at a later
point, also because I'm fairly sure there are a bunch of left-over
includes (also/mostly from myself) even before this change.
Note that this kind of cleanup would also take a bit of testing that
we currently can't automate, for example building against musl on
Alpine or Void Linux.
--
Stefano
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Add missing includes to headers
[not found] ` <CAAAKUPMP8goRHqk0VDn6UDWmyyPXpzs37UuCLL8x7wDp10tY6A@mail.gmail.com>
@ 2026-02-23 17:35 ` Stefano Brivio
[not found] ` <CAAAKUPMQZetb9RYoxaUZGyp7dWm8pifmvEfyV3M4Q6+j9jw89g@mail.gmail.com>
0 siblings, 1 reply; 9+ messages in thread
From: Stefano Brivio @ 2026-02-23 17:35 UTC (permalink / raw)
To: Peter Foley; +Cc: passt-dev
On Mon, 23 Feb 2026 12:23:08 -0500
Peter Foley <pefoley@google.com> wrote:
> On Mon, Feb 23, 2026 at 11:45 AM Peter Foley <pefoley@google.com> wrote:
>
> > The primary BUILD file is in Google's internal repository, so I can't
> > share that.
> > An OSS bazel version looks like
> > https://github.com/pefoley2/passt/commit/4f89da6f05c84c9f171689541fd81549b4801270
> > Unfortunately in my quick testing, the OSS bazel build doesn't actually
> > catch the same layering check violations that Google's internal "Blaze"
> > variant of bazel does.
> > So I'm not sure how helpful it would be.
>
> I poked at this some more, and clang-include-cleaner seems to be able to do
> a good job of determining whether the headers compile stand-alone.
> I had to make some more fixes to get there though:
> https://github.com/pefoley2/passt/commit/5067d86e567851db24dad515cd36b53627266ba6
By the way, we already run clang-tidy tests ('make clang-tidy') as part
of our tests (test/build/static_checkers.sh).
Would it be just a matter of enabling the misc-include-cleaner in the
list of tests we give clang-tidy from the Makefile:
https://clang.llvm.org/extra/clang-tidy/checks/misc/include-cleaner.html
? I haven't tried.
> If you want, I can fold the two "include fixing" commits together and
> re-send.
Yes, thanks, that would be appreciated. I would first try to settle on
a convenient way to keep Blaze/Bazel happy for the future, though.
--
Stefano
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2] Add missing includes to headers
[not found] ` <CAAAKUPMQZetb9RYoxaUZGyp7dWm8pifmvEfyV3M4Q6+j9jw89g@mail.gmail.com>
@ 2026-02-23 18:11 ` Peter Foley
2026-02-23 19:05 ` [PATCH] " Stefano Brivio
1 sibling, 0 replies; 9+ messages in thread
From: Peter Foley @ 2026-02-23 18:11 UTC (permalink / raw)
To: sbrivio; +Cc: passt-dev, Peter Foley
Support build systems like bazel that check that headers are
self-contained.
Also update includes so that clang-include-cleaner succeeds.
Tested with:
clang-include-cleaner-19 --extra-arg=-D_GNU_SOURCE --extra-arg=-DPAGE_SIZE=4096 --extra-arg=-DVERSION=\"git\" --extra-arg=-DHAS_GETRANDOM *.h *.c
Signed-off-by: Peter Foley <pefoley@google.com>
---
arp.h | 2 ++
checksum.h | 3 +++
flow.h | 6 ++++++
flow_table.h | 1 +
fwd.h | 10 +++++++++-
icmp.h | 4 ++++
icmp_flow.h | 2 ++
inany.h | 6 ++++++
iov.h | 3 ++-
ip.h | 2 ++
isolation.h | 3 +++
lineread.h | 2 ++
linux_dep.h | 3 +++
log.h | 2 ++
migrate.h | 3 +++
netlink.h | 4 ++++
packet.h | 2 ++
pasta.h | 2 ++
pcap.h | 2 ++
pif.h | 6 ++++++
repair.h | 2 ++
seccomp.sh | 5 +++++
siphash.h | 3 +++
tap.h | 5 +++++
tcp.h | 8 ++++++++
tcp_conn.h | 4 ++++
tcp_internal.h | 5 +++++
tcp_splice.h | 2 ++
udp.h | 5 +++++
udp_flow.h | 6 ++++++
udp_internal.h | 3 +++
udp_vu.h | 2 ++
util.c | 1 +
vu_common.h | 6 ++++++
34 files changed, 123 insertions(+), 2 deletions(-)
diff --git a/arp.h b/arp.h
index 4862e90..4b1f38b 100644
--- a/arp.h
+++ b/arp.h
@@ -6,6 +6,8 @@
#ifndef ARP_H
#define ARP_H
+#include <linux/if_ether.h>
+
/**
* struct arpmsg - 802.2 ARP IPv4 payload
* @sha: Sender hardware address
diff --git a/checksum.h b/checksum.h
index 683a09b..4e3b098 100644
--- a/checksum.h
+++ b/checksum.h
@@ -6,6 +6,9 @@
#ifndef CHECKSUM_H
#define CHECKSUM_H
+#include <stddef.h>
+#include <stdint.h>
+
struct udphdr;
struct icmphdr;
struct icmp6hdr;
diff --git a/flow.h b/flow.h
index d636358..897c9ea 100644
--- a/flow.h
+++ b/flow.h
@@ -7,6 +7,12 @@
#ifndef FLOW_H
#define FLOW_H
+#include <stdint.h>
+#include <netinet/in.h>
+
+#include "inany.h"
+#include "util.h"
+
#define FLOW_TIMER_INTERVAL 1000 /* ms */
/**
diff --git a/flow_table.h b/flow_table.h
index 73de13b..8fb7b5c 100644
--- a/flow_table.h
+++ b/flow_table.h
@@ -7,6 +7,7 @@
#ifndef FLOW_TABLE_H
#define FLOW_TABLE_H
+#include "pif.h"
#include "tcp_conn.h"
#include "icmp_flow.h"
#include "udp_flow.h"
diff --git a/fwd.h b/fwd.h
index 1607011..c0b30f3 100644
--- a/fwd.h
+++ b/fwd.h
@@ -7,7 +7,15 @@
#ifndef FWD_H
#define FWD_H
-union inany_addr;
+#include <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+
+#include <netinet/in.h>
+
+#include "inany.h"
+
struct flowside;
/* Number of ports for both TCP and UDP */
diff --git a/icmp.h b/icmp.h
index 1a0e620..e8b928b 100644
--- a/icmp.h
+++ b/icmp.h
@@ -6,6 +6,10 @@
#ifndef ICMP_H
#define ICMP_H
+#include <stdint.h>
+
+#include <netinet/in.h>
+
struct ctx;
struct icmp_ping_flow;
diff --git a/icmp_flow.h b/icmp_flow.h
index fb93801..3af98be 100644
--- a/icmp_flow.h
+++ b/icmp_flow.h
@@ -7,6 +7,8 @@
#ifndef ICMP_FLOW_H
#define ICMP_FLOW_H
+#include "flow.h"
+
/**
* struct icmp_ping_flow - Descriptor for a flow of ping requests/replies
* @f: Generic flow information
diff --git a/inany.h b/inany.h
index b02c289..efbe2e2 100644
--- a/inany.h
+++ b/inany.h
@@ -9,6 +9,12 @@
#ifndef INANY_H
#define INANY_H
+#include <assert.h>
+#include <string.h>
+
+#include "ip.h"
+#include "siphash.h"
+
struct siphash_state;
/** union inany_addr - Represents either an IPv4 or IPv6 address
diff --git a/iov.h b/iov.h
index d2184bf..d1ab91a 100644
--- a/iov.h
+++ b/iov.h
@@ -15,8 +15,9 @@
#ifndef IOVEC_H
#define IOVEC_H
-#include <unistd.h>
+#include <stdbool.h>
#include <string.h>
+#include <unistd.h>
#define IOV_OF_LVALUE(lval) \
(struct iovec){ .iov_base = &(lval), .iov_len = sizeof(lval) }
diff --git a/ip.h b/ip.h
index a8043c2..3be2d4e 100644
--- a/ip.h
+++ b/ip.h
@@ -9,6 +9,8 @@
#include <netinet/ip.h>
#include <netinet/ip6.h>
+#include "util.h"
+
#define IN4_IS_ADDR_UNSPECIFIED(a) \
(((struct in_addr *)(a))->s_addr == htonl_constant(INADDR_ANY))
#define IN4_IS_ADDR_BROADCAST(a) \
diff --git a/isolation.h b/isolation.h
index 80bb68d..0576168 100644
--- a/isolation.h
+++ b/isolation.h
@@ -7,6 +7,9 @@
#ifndef ISOLATION_H
#define ISOLATION_H
+#include <stdbool.h>
+#include <unistd.h>
+
void isolate_initial(int argc, char **argv);
void isolate_user(uid_t uid, gid_t gid, bool use_userns, const char *userns,
enum passt_modes mode);
diff --git a/lineread.h b/lineread.h
index 9203e28..ef6a7d4 100644
--- a/lineread.h
+++ b/lineread.h
@@ -6,6 +6,8 @@
#ifndef LINEREAD_H
#define LINEREAD_H
+#include <sys/types.h>
+
#define LINEREAD_BUFFER_SIZE 8192
/**
diff --git a/linux_dep.h b/linux_dep.h
index 89e590c..3f8184b 100644
--- a/linux_dep.h
+++ b/linux_dep.h
@@ -7,6 +7,9 @@
#ifndef LINUX_DEP_H
#define LINUX_DEP_H
+#include <stdint.h>
+#include <unistd.h>
+
/* struct tcp_info_linux - Information from Linux TCP_INFO getsockopt()
*
* Largely derived from include/linux/tcp.h in the Linux kernel
diff --git a/log.h b/log.h
index b7b2067..6ceb686 100644
--- a/log.h
+++ b/log.h
@@ -6,7 +6,9 @@
#ifndef LOG_H
#define LOG_H
+#include <stdarg.h>
#include <stdbool.h>
+#include <stddef.h>
#include <syslog.h>
/* This would make more sense in util.h, but because we use it in die(), that
diff --git a/migrate.h b/migrate.h
index 2c51cd9..844be47 100644
--- a/migrate.h
+++ b/migrate.h
@@ -6,6 +6,9 @@
#ifndef MIGRATE_H
#define MIGRATE_H
+#include <stdbool.h>
+#include <stdint.h>
+
/**
* struct migrate_header - Migration header from source
* @magic: 0xB1BB1D1B0BB1D1B0, network order
diff --git a/netlink.h b/netlink.h
index 8f1e9b9..b22f485 100644
--- a/netlink.h
+++ b/netlink.h
@@ -6,6 +6,10 @@
#ifndef NETLINK_H
#define NETLINK_H
+#include <stdbool.h>
+
+#include <netinet/in.h>
+
extern int nl_sock;
extern int nl_sock_ns;
diff --git a/packet.h b/packet.h
index ba8d5c2..7b7fa71 100644
--- a/packet.h
+++ b/packet.h
@@ -7,6 +7,8 @@
#define PACKET_H
#include <stdbool.h>
+#include <sys/uio.h>
+
#include "iov.h"
#include "virtio.h"
diff --git a/pasta.h b/pasta.h
index 4b063d1..07e04b3 100644
--- a/pasta.h
+++ b/pasta.h
@@ -6,6 +6,8 @@
#ifndef PASTA_H
#define PASTA_H
+#include <unistd.h>
+
extern int pasta_child_pid;
void pasta_open_ns(struct ctx *c, const char *netns);
diff --git a/pcap.h b/pcap.h
index 2aeb53e..dface5d 100644
--- a/pcap.h
+++ b/pcap.h
@@ -6,6 +6,8 @@
#ifndef PCAP_H
#define PCAP_H
+#include <stddef.h>
+
extern int pcap_fd;
void pcap(const char *pkt, size_t l2len);
diff --git a/pif.h b/pif.h
index 0f7f667..f4bec1e 100644
--- a/pif.h
+++ b/pif.h
@@ -7,6 +7,12 @@
#ifndef PIF_H
#define PIF_H
+#include <stdbool.h>
+
+#include <netinet/in.h>
+
+#include "epoll_type.h"
+
union inany_addr;
union sockaddr_inany;
diff --git a/repair.h b/repair.h
index ab27e67..f39c237 100644
--- a/repair.h
+++ b/repair.h
@@ -6,6 +6,8 @@
#ifndef REPAIR_H
#define REPAIR_H
+#include <stdint.h>
+
void repair_sock_init(const struct ctx *c);
int repair_listen_handler(struct ctx *c, uint32_t events);
void repair_handler(struct ctx *c, uint32_t events);
diff --git a/seccomp.sh b/seccomp.sh
index 60ebe84..5347586 100755
--- a/seccomp.sh
+++ b/seccomp.sh
@@ -34,6 +34,11 @@ AUDIT_ARCH="AUDIT_ARCH_$(echo ${ARCH} | tr '[a-z]' '[A-Z]' \
HEADER="/* This file was automatically generated by $(basename ${0}) */
+#include <stddef.h>
+#include <linux/audit.h>
+#include <linux/filter.h>
+#include <linux/seccomp.h>
+
#ifndef AUDIT_ARCH_PPC64LE
#define AUDIT_ARCH_PPC64LE (AUDIT_ARCH_PPC64 | __AUDIT_ARCH_LE)
#endif"
diff --git a/siphash.h b/siphash.h
index e760236..bbddcac 100644
--- a/siphash.h
+++ b/siphash.h
@@ -44,6 +44,9 @@
#ifndef SIPHASH_H
#define SIPHASH_H
+#include <stddef.h>
+#include <stdint.h>
+
/**
* struct siphash_state - Internal state of siphash calculation
*/
diff --git a/tap.h b/tap.h
index cc780d1..07ca096 100644
--- a/tap.h
+++ b/tap.h
@@ -6,6 +6,11 @@
#ifndef TAP_H
#define TAP_H
+#include <stddef.h>
+#include <stdint.h>
+
+#include "passt.h"
+
/** L2_MAX_LEN_PASTA - Maximum frame length for pasta mode (with L2 header)
*
* The kernel tuntap device imposes a maximum frame size of 65535 including
diff --git a/tcp.h b/tcp.h
index 24b9087..bfcadf9 100644
--- a/tcp.h
+++ b/tcp.h
@@ -6,6 +6,14 @@
#ifndef TCP_H
#define TCP_H
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <netinet/in.h>
+#include <sys/socket.h>
+
+#include "fwd.h"
+
#define TCP_TIMER_INTERVAL 1000 /* ms */
struct ctx;
diff --git a/tcp_conn.h b/tcp_conn.h
index 21cea10..d4d0139 100644
--- a/tcp_conn.h
+++ b/tcp_conn.h
@@ -9,6 +9,10 @@
#ifndef TCP_CONN_H
#define TCP_CONN_H
+#include <stdint.h>
+
+#include "flow.h"
+
/**
* struct tcp_tap_conn - Descriptor for a TCP connection (not spliced)
* @f: Generic flow information
diff --git a/tcp_internal.h b/tcp_internal.h
index 518913b..591e58c 100644
--- a/tcp_internal.h
+++ b/tcp_internal.h
@@ -6,6 +6,11 @@
#ifndef TCP_INTERNAL_H
#define TCP_INTERNAL_H
+#include <stdint.h>
+#include <netinet/tcp.h>
+
+#include "util.h"
+
#define MAX_WS 8
#define MAX_WINDOW (1 << (16 + (MAX_WS)))
diff --git a/tcp_splice.h b/tcp_splice.h
index a20f3e2..dbfd55d 100644
--- a/tcp_splice.h
+++ b/tcp_splice.h
@@ -6,6 +6,8 @@
#ifndef TCP_SPLICE_H
#define TCP_SPLICE_H
+#include <stdint.h>
+
struct tcp_splice_conn;
union sockaddr_inany;
diff --git a/udp.h b/udp.h
index da9c2df..0eca1ab 100644
--- a/udp.h
+++ b/udp.h
@@ -6,6 +6,11 @@
#ifndef UDP_H
#define UDP_H
+#include <stdint.h>
+#include <netinet/in.h>
+
+#include "fwd.h"
+
void udp_listen_sock_handler(const struct ctx *c, union epoll_ref ref,
uint32_t events, const struct timespec *now);
void udp_sock_handler(const struct ctx *c, union epoll_ref ref,
diff --git a/udp_flow.h b/udp_flow.h
index 3ca49c5..62cc9b3 100644
--- a/udp_flow.h
+++ b/udp_flow.h
@@ -7,6 +7,12 @@
#ifndef UDP_FLOW_H
#define UDP_FLOW_H
+#include <stdbool.h>
+#include <stdint.h>
+#include <netinet/in.h>
+
+#include "flow.h"
+
/**
* struct udp_flow - Descriptor for a flow of UDP packets
* @f: Generic flow information
diff --git a/udp_internal.h b/udp_internal.h
index 0a8fe49..64e4577 100644
--- a/udp_internal.h
+++ b/udp_internal.h
@@ -6,6 +6,9 @@
#ifndef UDP_INTERNAL_H
#define UDP_INTERNAL_H
+#include <netinet/in.h>
+#include <netinet/udp.h>
+
#include "tap.h" /* needed by udp_meta_t */
/**
diff --git a/udp_vu.h b/udp_vu.h
index 576b0e7..1e38af3 100644
--- a/udp_vu.h
+++ b/udp_vu.h
@@ -6,6 +6,8 @@
#ifndef UDP_VU_H
#define UDP_VU_H
+#include "flow.h"
+
void udp_vu_listen_sock_data(const struct ctx *c, union epoll_ref ref,
const struct timespec *now);
void udp_vu_sock_to_tap(const struct ctx *c, int s, int n, flow_sidx_t tosidx);
diff --git a/util.c b/util.c
index a48f727..db27431 100644
--- a/util.c
+++ b/util.c
@@ -25,6 +25,7 @@
#include <errno.h>
#include <stdbool.h>
#include <linux/errqueue.h>
+#include <linux/in6.h>
#include <getopt.h>
#include "linux_dep.h"
diff --git a/vu_common.h b/vu_common.h
index 052aff7..76eee87 100644
--- a/vu_common.h
+++ b/vu_common.h
@@ -7,8 +7,14 @@
#ifndef VU_COMMON_H
#define VU_COMMON_H
+
+#include <stddef.h>
+
#include <linux/virtio_net.h>
+#include "ip.h"
+#include "virtio.h"
+
static inline void *vu_eth(void *base)
{
return ((char *)base + VNET_HLEN);
--
2.53.0.371.g1d285c8824-goog
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Add missing includes to headers
[not found] ` <CAAAKUPMQZetb9RYoxaUZGyp7dWm8pifmvEfyV3M4Q6+j9jw89g@mail.gmail.com>
2026-02-23 18:11 ` [PATCH v2] " Peter Foley
@ 2026-02-23 19:05 ` Stefano Brivio
[not found] ` <CAAAKUPMRYcbeTXZHX9aQtZfv4L=sBbzqSWqo-xG91F6r7f8M1w@mail.gmail.com>
1 sibling, 1 reply; 9+ messages in thread
From: Stefano Brivio @ 2026-02-23 19:05 UTC (permalink / raw)
To: Peter Foley; +Cc: passt-dev
On Mon, 23 Feb 2026 13:08:07 -0500
Peter Foley <pefoley@google.com> wrote:
> On Mon, Feb 23, 2026 at 12:35 PM Stefano Brivio <sbrivio@redhat.com> wrote:
>
> > By the way, we already run clang-tidy tests ('make clang-tidy') as part
> > of our tests (test/build/static_checkers.sh).
> >
> > Would it be just a matter of enabling the misc-include-cleaner in the
> > list of tests we give clang-tidy from the Makefile:
> >
> > https://clang.llvm.org/extra/clang-tidy/checks/misc/include-cleaner.html
> >
> > ? I haven't tried.
>
> It appears so, a local change to pass -checks=misc-include-cleaner to
> clang-tidy resulted in a ton of errors like:
> /usr/local/google/home/pefoley/passt/vu_common.c:277:2: error: no header
> providing "iov_from_buf" is directly included
>
> [...]
Hmm, "nice". I guess we should find out if it's reasonable / doable to
"fix" all those.
> > > If you want, I can fold the two "include fixing" commits together and
> > > re-send.
> >
> > Yes, thanks, that would be appreciated. I would first try to settle on
> > a convenient way to keep Blaze/Bazel happy for the future, though.
>
> As I mentioned earlies, Bazel appears to be happy withough the include
> fixes, it's just Google's internal Blaze varient that has some kind of
> stricter checking that falls over.
Oh, I didn't understand, I thought Bazel reported a non-empty subset of
the failures from Blaze.
> I can send the change out for supporting the Bazel build, but I think using
> misc-include-cleaner would be a better plan.
Yeah, I think so too... as long as it's not hundreds of additional
warnings / fixes we need to take care of, it's definitely less effort
and should be less clunky too.
--
Stefano
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Add missing includes to headers
[not found] ` <CAAAKUPMRYcbeTXZHX9aQtZfv4L=sBbzqSWqo-xG91F6r7f8M1w@mail.gmail.com>
@ 2026-02-23 20:47 ` Stefano Brivio
[not found] ` <CAAAKUPPS8_7gJ1T677djyWJ8WbKSoijKsuM8J1cgLLD5HDPXgw@mail.gmail.com>
0 siblings, 1 reply; 9+ messages in thread
From: Stefano Brivio @ 2026-02-23 20:47 UTC (permalink / raw)
To: Peter Foley; +Cc: passt-dev, David Gibson
On Mon, 23 Feb 2026 15:22:20 -0500
Peter Foley <pefoley@google.com> wrote:
> On Mon, Feb 23, 2026 at 2:05 PM Stefano Brivio <sbrivio@redhat.com> wrote:
>
> > Hmm, "nice". I guess we should find out if it's reasonable / doable to
> > "fix" all those.
>
> I tried just doing clang-include-cleaner --edit, but it's
> unfortunately c++ centric, so it added a bunch of stuff like <cstdint>
> I can try manually fixing that up and seeing what happens.
By the way, I won't have a chance to try this before a couple of days,
if needed, but another thought: if we end up adding/changing hundreds
of include lines as a result, maybe the cleanup David mentioned would
actually be in scope at that point, even from a mere perspective of
"noise" we would add, or effort you're spending anyway (let's make it
fully worth it I'd say).
In any case we could keep a clean clang-include-cleaner output as
second step.
I think the priorities here should be 1. keep/make things working for
everybody while 2. avoiding the risk of recurring fix-ups for future
changes and 3. make things pretty/readable/elegant, exactly in this
order.
If we can tackle all of them together, great, otherwise we can take
care of 1. first, and 2. and 3. later.
--
Stefano
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Add missing includes to headers
[not found] ` <CAAAKUPPS8_7gJ1T677djyWJ8WbKSoijKsuM8J1cgLLD5HDPXgw@mail.gmail.com>
@ 2026-02-23 23:00 ` Stefano Brivio
0 siblings, 0 replies; 9+ messages in thread
From: Stefano Brivio @ 2026-02-23 23:00 UTC (permalink / raw)
To: Peter Foley; +Cc: passt-dev, David Gibson
On Mon, 23 Feb 2026 16:37:54 -0500
Peter Foley <pefoley@google.com> wrote:
> On Mon, Feb 23, 2026 at 3:47 PM Stefano Brivio <sbrivio@redhat.com> wrote:
>
> > By the way, I won't have a chance to try this before a couple of days,
> > if needed, but another thought: if we end up adding/changing hundreds
> > of include lines as a result, maybe the cleanup David mentioned would
> > actually be in scope at that point, even from a mere perspective of
> > "noise" we would add, or effort you're spending anyway (let's make it
> > fully worth it I'd say).
>
> I tried running clang-include-cleaner and then massaging it to not include
> c++ only headers or stuff from bits/
> That wound up with:
> 64 files changed, 349 insertions(+), 189 deletions(-)
>
> Unfortunatly include-cleaner isn't smart enough to handle things like
> #include <sys/socket.h> instead of <bits/sockaddr.h>
> So absent adding pragma annotations to glibc headers, I'm not sure a clean
> clang-include-cleaner check is possible.
We could always add suppressions for clang-tidy checks, we already have
a bunch, see NOLINTNEXTLINE directives in the code.
> That diff is
> https://github.com/pefoley2/passt/commit/6ae0bcb2bbdc10384346dda547db60f80c8a9676
> .
> I can send it as a proper patch as well if you're interested, but it's a
> lot of churn and I'm not sure how to prevent back-sliding...
Ouch... yeah.
Let me have another look tomorrow (Tuesday) but I think it only makes
sense if we use that as a chance to entirely switch to approach #2
David was mentioning (minus perhaps some exceptions), including all
the related clean-ups.
I'm totally for it by the way, if you can take care of it. Otherwise
I'd recommend sticking to a more conservative approach for the moment
being.
--
Stefano
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-02-23 23:01 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-02-19 17:45 [PATCH] Add missing includes to headers Peter Foley
2026-02-21 17:57 ` Stefano Brivio
[not found] ` <CAAAKUPN=GPDp84tQAv4Kpxs-AzKR44pDkWda-AbXWaUomYN5eg@mail.gmail.com>
[not found] ` <CAAAKUPMP8goRHqk0VDn6UDWmyyPXpzs37UuCLL8x7wDp10tY6A@mail.gmail.com>
2026-02-23 17:35 ` Stefano Brivio
[not found] ` <CAAAKUPMQZetb9RYoxaUZGyp7dWm8pifmvEfyV3M4Q6+j9jw89g@mail.gmail.com>
2026-02-23 18:11 ` [PATCH v2] " Peter Foley
2026-02-23 19:05 ` [PATCH] " Stefano Brivio
[not found] ` <CAAAKUPMRYcbeTXZHX9aQtZfv4L=sBbzqSWqo-xG91F6r7f8M1w@mail.gmail.com>
2026-02-23 20:47 ` Stefano Brivio
[not found] ` <CAAAKUPPS8_7gJ1T677djyWJ8WbKSoijKsuM8J1cgLLD5HDPXgw@mail.gmail.com>
2026-02-23 23:00 ` Stefano Brivio
2026-02-23 5:33 ` David Gibson
2026-02-23 16:32 ` Stefano Brivio
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).