linux-api.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next] net: uapi: Provide an UAPI definition of 'struct sockaddr'
@ 2026-01-05  8:25 Thomas Weißschuh
  2026-01-05 13:50 ` Arnd Bergmann
  2026-01-05 17:57 ` Jakub Kicinski
  0 siblings, 2 replies; 5+ messages in thread
From: Thomas Weißschuh @ 2026-01-05  8:25 UTC (permalink / raw)
  To: Eric Dumazet, Kuniyuki Iwashima, Paolo Abeni, Willem de Bruijn
  Cc: netdev, linux-kernel, linux-api, Arnd Bergmann,
	Thomas Weißschuh

Various UAPI headers reference 'struct sockaddr'. Currently the
definition of this struct is pulled in from the libc header
sys/socket.h. This is problematic as it introduces a dependency
on a full userspace toolchain.

Instead expose a custom but compatible definition of 'struct sockaddr'
in the UAPI headers. It is guarded by the libc compatibility
infrastructure to avoid potential conflicts.

The compatibility symbol won't be supported by glibc right away,
but right now __UAPI_DEF_IF_IFNAMSIZ is not supported either,
so including the libc headers before the UAPI headers is broken anyways.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 include/linux/socket.h           | 10 ----------
 include/uapi/linux/if.h          |  4 ----
 include/uapi/linux/libc-compat.h | 12 ++++++++++++
 include/uapi/linux/socket.h      | 14 ++++++++++++++
 4 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/include/linux/socket.h b/include/linux/socket.h
index ec715ad4bf25..8363d4e0a044 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -28,16 +28,6 @@ extern void socket_seq_show(struct seq_file *seq);
 
 typedef __kernel_sa_family_t	sa_family_t;
 
-/*
- *	1003.1g requires sa_family_t and that sa_data is char.
- */
-
-/* Deprecated for in-kernel use. Use struct sockaddr_unsized instead. */
-struct sockaddr {
-	sa_family_t	sa_family;	/* address family, AF_xxx	*/
-	char		sa_data[14];	/* 14 bytes of protocol address	*/
-};
-
 /**
  * struct sockaddr_unsized - Unspecified size sockaddr for callbacks
  * @sa_family: Address family (AF_UNIX, AF_INET, AF_INET6, etc.)
diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h
index 797ba2c1562a..a4bc54196a07 100644
--- a/include/uapi/linux/if.h
+++ b/include/uapi/linux/if.h
@@ -25,10 +25,6 @@
 #include <linux/socket.h>		/* for "struct sockaddr" et al	*/
 #include <linux/compiler.h>		/* for "__user" et al           */
 
-#ifndef __KERNEL__
-#include <sys/socket.h>			/* for struct sockaddr.		*/
-#endif
-
 #if __UAPI_DEF_IF_IFNAMSIZ
 #define	IFNAMSIZ	16
 #endif /* __UAPI_DEF_IF_IFNAMSIZ */
diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h
index 0eca95ccb41e..13a06ce4e825 100644
--- a/include/uapi/linux/libc-compat.h
+++ b/include/uapi/linux/libc-compat.h
@@ -140,6 +140,13 @@
 
 #endif /* _NETINET_IN_H */
 
+/* Definitions for socket.h */
+#if defined(_SYS_SOCKET_H)
+#define __UAPI_DEF_SOCKADDR		0
+#else
+#define __UAPI_DEF_SOCKADDR		1
+#endif
+
 /* Definitions for xattr.h */
 #if defined(_SYS_XATTR_H)
 #define __UAPI_DEF_XATTR		0
@@ -221,6 +228,11 @@
 #define __UAPI_DEF_IP6_MTUINFO		1
 #endif
 
+/* Definitions for socket.h */
+#ifndef __UAPI_DEF_SOCKADDR
+#define __UAPI_DEF_SOCKADDR		1
+#endif
+
 /* Definitions for xattr.h */
 #ifndef __UAPI_DEF_XATTR
 #define __UAPI_DEF_XATTR		1
diff --git a/include/uapi/linux/socket.h b/include/uapi/linux/socket.h
index d3fcd3b5ec53..35d7d5f4b1a8 100644
--- a/include/uapi/linux/socket.h
+++ b/include/uapi/linux/socket.h
@@ -2,6 +2,8 @@
 #ifndef _UAPI_LINUX_SOCKET_H
 #define _UAPI_LINUX_SOCKET_H
 
+#include <linux/libc-compat.h>          /* for compatibility with glibc */
+
 /*
  * Desired design of maximum size and alignment (see RFC2553)
  */
@@ -26,6 +28,18 @@ struct __kernel_sockaddr_storage {
 	};
 };
 
+/*
+ *	1003.1g requires sa_family_t and that sa_data is char.
+ */
+
+/* Deprecated for in-kernel use. Use struct sockaddr_unsized instead. */
+#if __UAPI_DEF_SOCKADDR
+struct sockaddr {
+	__kernel_sa_family_t	sa_family;	/* address family, AF_xxx	*/
+	char			sa_data[14];	/* 14 bytes of protocol address	*/
+};
+#endif /* __UAPI_DEF_SOCKADDR */
+
 #define SOCK_SNDBUF_LOCK	1
 #define SOCK_RCVBUF_LOCK	2
 

---
base-commit: dbf8fe85a16a33d6b6bd01f2bc606fc017771465
change-id: 20251222-uapi-sockaddr-cf10e7624729

Best regards,
-- 
Thomas Weißschuh <thomas.weissschuh@linutronix.de>


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH net-next] net: uapi: Provide an UAPI definition of 'struct sockaddr'
  2026-01-05  8:25 [PATCH net-next] net: uapi: Provide an UAPI definition of 'struct sockaddr' Thomas Weißschuh
@ 2026-01-05 13:50 ` Arnd Bergmann
  2026-01-05 17:57 ` Jakub Kicinski
  1 sibling, 0 replies; 5+ messages in thread
From: Arnd Bergmann @ 2026-01-05 13:50 UTC (permalink / raw)
  To: Thomas Weißschuh, Eric Dumazet, Kuniyuki Iwashima,
	Paolo Abeni, Willem de Bruijn, libc-alpha, Carlos O'Donell,
	Adhemerval Zanella, Rich Felker
  Cc: Netdev, linux-kernel, linux-api, klibc

On Mon, Jan 5, 2026, at 09:25, Thomas Weißschuh wrote:
> Various UAPI headers reference 'struct sockaddr'. Currently the
> definition of this struct is pulled in from the libc header
> sys/socket.h. This is problematic as it introduces a dependency
> on a full userspace toolchain.
>
> Instead expose a custom but compatible definition of 'struct sockaddr'
> in the UAPI headers. It is guarded by the libc compatibility
> infrastructure to avoid potential conflicts.
>
> The compatibility symbol won't be supported by glibc right away,
> but right now __UAPI_DEF_IF_IFNAMSIZ is not supported either,
> so including the libc headers before the UAPI headers is broken anyways.
>
> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>

This looks like the right approach to me. I have previously
tried to introduce a 'struct __kernel_sockaddr' structure and
use that in uapi headers in place of the libc sockaddr, but
that seemed worse in the end, and introduce the same problems
as using the existing __kernel_sockaddr_storage.

The version that worked for my own testing used a nolibc specific
definition, which was enough for me to build-test the kernel headers
across all architectures, but it does not resolve the dependency.

What I'm not sure about is whether the added definition will
cause problems for users that include linux/socket.h (or one
of the headers using it) before including sys/socket.h.
I would expect that this causes build failures on some application
source code, but hopefully in a way that is easily fixable by
changing the include order.
I've added the libc-alpha list to Cc, along with a few
developers that care about this.

I also found a few older commits in which we've tried to work
this out in the past, but each time created a new (or old) problem:

57a87bb0720a ("[PATCH] scrub non-__GLIBC__ checks in linux/socket.h and linux/stat.h")
304c209c9b02 ("[NET]: Revert socket.h/stat.h ifdef hacks.")
9c501935a3cd ("net: Support inclusion of <linux/socket.h> before <sys/socket.h>")
2618be7dccf8 ("uapi: fix linux/if.h userspace compilation errors")
22bbc1dcd0d6 ("vsock/uapi: fix linux/vm_sockets.h userspace compilation errors")
06e445f740c1 ("mptcp: fix conflict with <netinet/in.h>")
c11c5906bc0a ("mptcp: add MPTCP_SUBFLOW_ADDRS getsockopt support")

      Arnd

> ---
>  include/linux/socket.h           | 10 ----------
>  include/uapi/linux/if.h          |  4 ----
>  include/uapi/linux/libc-compat.h | 12 ++++++++++++
>  include/uapi/linux/socket.h      | 14 ++++++++++++++
>  4 files changed, 26 insertions(+), 14 deletions(-)
>
> diff --git a/include/linux/socket.h b/include/linux/socket.h
> index ec715ad4bf25..8363d4e0a044 100644
> --- a/include/linux/socket.h
> +++ b/include/linux/socket.h
> @@ -28,16 +28,6 @@ extern void socket_seq_show(struct seq_file *seq);
> 
>  typedef __kernel_sa_family_t	sa_family_t;
> 
> -/*
> - *	1003.1g requires sa_family_t and that sa_data is char.
> - */
> -
> -/* Deprecated for in-kernel use. Use struct sockaddr_unsized instead. */
> -struct sockaddr {
> -	sa_family_t	sa_family;	/* address family, AF_xxx	*/
> -	char		sa_data[14];	/* 14 bytes of protocol address	*/
> -};
> -
>  /**
>   * struct sockaddr_unsized - Unspecified size sockaddr for callbacks
>   * @sa_family: Address family (AF_UNIX, AF_INET, AF_INET6, etc.)
> diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h
> index 797ba2c1562a..a4bc54196a07 100644
> --- a/include/uapi/linux/if.h
> +++ b/include/uapi/linux/if.h
> @@ -25,10 +25,6 @@
>  #include <linux/socket.h>		/* for "struct sockaddr" et al	*/
>  #include <linux/compiler.h>		/* for "__user" et al           */
> 
> -#ifndef __KERNEL__
> -#include <sys/socket.h>			/* for struct sockaddr.		*/
> -#endif
> -
>  #if __UAPI_DEF_IF_IFNAMSIZ
>  #define	IFNAMSIZ	16
>  #endif /* __UAPI_DEF_IF_IFNAMSIZ */
> diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h
> index 0eca95ccb41e..13a06ce4e825 100644
> --- a/include/uapi/linux/libc-compat.h
> +++ b/include/uapi/linux/libc-compat.h
> @@ -140,6 +140,13 @@
> 
>  #endif /* _NETINET_IN_H */
> 
> +/* Definitions for socket.h */
> +#if defined(_SYS_SOCKET_H)
> +#define __UAPI_DEF_SOCKADDR		0
> +#else
> +#define __UAPI_DEF_SOCKADDR		1
> +#endif
> +
>  /* Definitions for xattr.h */
>  #if defined(_SYS_XATTR_H)
>  #define __UAPI_DEF_XATTR		0
> @@ -221,6 +228,11 @@
>  #define __UAPI_DEF_IP6_MTUINFO		1
>  #endif
> 
> +/* Definitions for socket.h */
> +#ifndef __UAPI_DEF_SOCKADDR
> +#define __UAPI_DEF_SOCKADDR		1
> +#endif
> +
>  /* Definitions for xattr.h */
>  #ifndef __UAPI_DEF_XATTR
>  #define __UAPI_DEF_XATTR		1
> diff --git a/include/uapi/linux/socket.h b/include/uapi/linux/socket.h
> index d3fcd3b5ec53..35d7d5f4b1a8 100644
> --- a/include/uapi/linux/socket.h
> +++ b/include/uapi/linux/socket.h
> @@ -2,6 +2,8 @@
>  #ifndef _UAPI_LINUX_SOCKET_H
>  #define _UAPI_LINUX_SOCKET_H
> 
> +#include <linux/libc-compat.h>          /* for compatibility with glibc */
> +
>  /*
>   * Desired design of maximum size and alignment (see RFC2553)
>   */
> @@ -26,6 +28,18 @@ struct __kernel_sockaddr_storage {
>  	};
>  };
> 
> +/*
> + *	1003.1g requires sa_family_t and that sa_data is char.
> + */
> +
> +/* Deprecated for in-kernel use. Use struct sockaddr_unsized instead. */
> +#if __UAPI_DEF_SOCKADDR
> +struct sockaddr {
> +	__kernel_sa_family_t	sa_family;	/* address family, AF_xxx	*/
> +	char			sa_data[14];	/* 14 bytes of protocol address	*/
> +};
> +#endif /* __UAPI_DEF_SOCKADDR */
> +
>  #define SOCK_SNDBUF_LOCK	1
>  #define SOCK_RCVBUF_LOCK	2
> 
>
> ---
> base-commit: dbf8fe85a16a33d6b6bd01f2bc606fc017771465
> change-id: 20251222-uapi-sockaddr-cf10e7624729
>
> Best regards,
> -- 
> Thomas Weißschuh <thomas.weissschuh@linutronix.de>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net-next] net: uapi: Provide an UAPI definition of 'struct sockaddr'
  2026-01-05  8:25 [PATCH net-next] net: uapi: Provide an UAPI definition of 'struct sockaddr' Thomas Weißschuh
  2026-01-05 13:50 ` Arnd Bergmann
@ 2026-01-05 17:57 ` Jakub Kicinski
  2026-01-06 10:32   ` Thomas Weißschuh
  1 sibling, 1 reply; 5+ messages in thread
From: Jakub Kicinski @ 2026-01-05 17:57 UTC (permalink / raw)
  To: Thomas Weißschuh
  Cc: Eric Dumazet, Kuniyuki Iwashima, Paolo Abeni, Willem de Bruijn,
	netdev, linux-kernel, linux-api, Arnd Bergmann

On Mon, 05 Jan 2026 09:25:55 +0100 Thomas Weißschuh wrote:
> Various UAPI headers reference 'struct sockaddr'. Currently the
> definition of this struct is pulled in from the libc header
> sys/socket.h. This is problematic as it introduces a dependency
> on a full userspace toolchain.
> 
> Instead expose a custom but compatible definition of 'struct sockaddr'
> in the UAPI headers. It is guarded by the libc compatibility
> infrastructure to avoid potential conflicts.
> 
> The compatibility symbol won't be supported by glibc right away,
> but right now __UAPI_DEF_IF_IFNAMSIZ is not supported either,
> so including the libc headers before the UAPI headers is broken anyways.

I did not look too closely but this seems to break build of selftests
in netdev and BPF CI (netdev on AWS Linux, not sure what base BPF uses)

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net-next] net: uapi: Provide an UAPI definition of 'struct sockaddr'
  2026-01-05 17:57 ` Jakub Kicinski
@ 2026-01-06 10:32   ` Thomas Weißschuh
  2026-01-06 23:13     ` Jakub Kicinski
  0 siblings, 1 reply; 5+ messages in thread
From: Thomas Weißschuh @ 2026-01-06 10:32 UTC (permalink / raw)
  To: Jakub Kicinski
  Cc: Eric Dumazet, Kuniyuki Iwashima, Paolo Abeni, Willem de Bruijn,
	netdev, linux-kernel, linux-api, Arnd Bergmann

Hi Jakub,

On Mon, Jan 05, 2026 at 09:57:13AM -0800, Jakub Kicinski wrote:
> On Mon, 05 Jan 2026 09:25:55 +0100 Thomas Weißschuh wrote:
> > Various UAPI headers reference 'struct sockaddr'. Currently the
> > definition of this struct is pulled in from the libc header
> > sys/socket.h. This is problematic as it introduces a dependency
> > on a full userspace toolchain.
> > 
> > Instead expose a custom but compatible definition of 'struct sockaddr'
> > in the UAPI headers. It is guarded by the libc compatibility
> > infrastructure to avoid potential conflicts.
> > 
> > The compatibility symbol won't be supported by glibc right away,
> > but right now __UAPI_DEF_IF_IFNAMSIZ is not supported either,
> > so including the libc headers before the UAPI headers is broken anyways.
> 
> I did not look too closely but this seems to break build of selftests
> in netdev and BPF CI (netdev on AWS Linux, not sure what base BPF uses)

Thanks for the report.

I found the reported CI failures in BPF CI and will work on those.

As for the failure in netdev CI however I am not so sure.
Looking at net-next-2026-01-05--12-00, the only failures triggered by my
change are also the ones from the bpf-ci. Are these the ones you meant,
or am I missing some others?


Thomas

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net-next] net: uapi: Provide an UAPI definition of 'struct sockaddr'
  2026-01-06 10:32   ` Thomas Weißschuh
@ 2026-01-06 23:13     ` Jakub Kicinski
  0 siblings, 0 replies; 5+ messages in thread
From: Jakub Kicinski @ 2026-01-06 23:13 UTC (permalink / raw)
  To: Thomas Weißschuh
  Cc: Eric Dumazet, Kuniyuki Iwashima, Paolo Abeni, Willem de Bruijn,
	netdev, linux-kernel, linux-api, Arnd Bergmann

On Tue, 6 Jan 2026 11:32:52 +0100 Thomas Weißschuh wrote:
> As for the failure in netdev CI however I am not so sure.
> Looking at net-next-2026-01-05--12-00, the only failures triggered by my
> change are also the ones from the bpf-ci. Are these the ones you meant,
> or am I missing some others?

Multiple things broke at once so slightly hard to fish the relevant
stuff out from here:

https://netdev.bots.linux.dev/contest.html?branch=net-next-2026-01-05--15-00&pass=0&pw-n=0

Here's one:

make[1]: Entering directory '/home/virtme/testing/wt-3/tools/testing/selftests/net'
  CC       busy_poller
In file included from [01m[K/usr/include/sys/socket.h:33[m[K,
                 from [01m[K/usr/include/netinet/in.h:23[m[K,
                 from [01m[K/usr/include/arpa/inet.h:22[m[K,
                 from [01m[Kbusy_poller.c:14[m[K:
[01m[K/usr/include/bits/socket.h:182:8:[m[K [01;31m[Kerror: [m[Kredefinition of '[01m[Kstruct sockaddr[m[K'
  182 | struct [01;31m[Ksockaddr[m[K
      |        [01;31m[K^~~~~~~~[m[K
In file included from [01m[K/home/virtme/testing/wt-3/usr/include/linux/netlink.h:6[m[K,
                 from [01m[K/home/virtme/testing/wt-3/usr/include/linux/genetlink.h:6[m[K,
                 from [01m[K/home/virtme/testing/wt-3/tools/testing/selftests/../../../tools/net/ynl/lib/ynl.h:7[m[K,
                 from [01m[Kbusy_poller.c:12[m[K:
[01m[K/home/virtme/testing/wt-3/usr/include/linux/socket.h:37:8:[m[K [01;36m[Knote: [m[Koriginally defined here
   37 | struct [01;36m[Ksockaddr[m[K {
      |        [01;36m[K^~~~~~~~[m[K
make[1]: *** [../lib.mk:225: /home/virtme/testing/wt-3/tools/testing/selftests/net/busy_poller] Error 1

https://netdev-3.bots.linux.dev/vmksft-net-dbg/results/460421/7-xfrm-policy-sh/stdout


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-01-06 23:13 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-05  8:25 [PATCH net-next] net: uapi: Provide an UAPI definition of 'struct sockaddr' Thomas Weißschuh
2026-01-05 13:50 ` Arnd Bergmann
2026-01-05 17:57 ` Jakub Kicinski
2026-01-06 10:32   ` Thomas Weißschuh
2026-01-06 23:13     ` Jakub Kicinski

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 NNTP newsgroup(s).