[libc-commits] [libc] [libc] Add IPv4 socket options and relates structs (PR #204787)
Pavel Labath via libc-commits
libc-commits at lists.llvm.org
Fri Jun 19 05:41:57 PDT 2026
https://github.com/labath updated https://github.com/llvm/llvm-project/pull/204787
>From fedbb9e7d36fe57fe84a8dc7753219c85d3122bc Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Fri, 19 Jun 2026 09:03:37 +0000
Subject: [PATCH 1/2] [libc] Add IPv4 socket options and relates structs
This patch adds struct ip_mreq, ip_mreq_source, ip_mreqn, ip_opts, and
ip_msfilter to <netinet/in.h>, along with IP level socket option
macros (IP_TOS, IP_TTL, IP_ADD_MEMBERSHIP, etc.).
I also add unit tests verifying the size and member offsets of the new
structures against standard layout expectations.
Assisted by Gemini.
---
libc/hdr/types/CMakeLists.txt | 45 ++++++++++
libc/hdr/types/struct_ip_mreq.h | 26 ++++++
libc/hdr/types/struct_ip_mreq_source.h | 26 ++++++
libc/hdr/types/struct_ip_mreqn.h | 26 ++++++
libc/hdr/types/struct_ip_msfilter.h | 26 ++++++
libc/hdr/types/struct_ip_opts.h | 26 ++++++
libc/include/CMakeLists.txt | 5 ++
libc/include/llvm-libc-types/CMakeLists.txt | 5 ++
libc/include/llvm-libc-types/struct_ip_mreq.h | 24 ++++++
.../llvm-libc-types/struct_ip_mreq_source.h | 25 ++++++
.../include/llvm-libc-types/struct_ip_mreqn.h | 25 ++++++
.../llvm-libc-types/struct_ip_msfilter.h | 28 +++++++
libc/include/llvm-libc-types/struct_ip_opts.h | 24 ++++++
libc/include/netinet/in.yaml | 82 +++++++++++++++++++
libc/test/src/netinet/CMakeLists.txt | 5 ++
libc/test/src/netinet/in_test.cpp | 34 ++++++++
16 files changed, 432 insertions(+)
create mode 100644 libc/hdr/types/struct_ip_mreq.h
create mode 100644 libc/hdr/types/struct_ip_mreq_source.h
create mode 100644 libc/hdr/types/struct_ip_mreqn.h
create mode 100644 libc/hdr/types/struct_ip_msfilter.h
create mode 100644 libc/hdr/types/struct_ip_opts.h
create mode 100644 libc/include/llvm-libc-types/struct_ip_mreq.h
create mode 100644 libc/include/llvm-libc-types/struct_ip_mreq_source.h
create mode 100644 libc/include/llvm-libc-types/struct_ip_mreqn.h
create mode 100644 libc/include/llvm-libc-types/struct_ip_msfilter.h
create mode 100644 libc/include/llvm-libc-types/struct_ip_opts.h
diff --git a/libc/hdr/types/CMakeLists.txt b/libc/hdr/types/CMakeLists.txt
index 1742e423b1d00..a130f7ee0000a 100644
--- a/libc/hdr/types/CMakeLists.txt
+++ b/libc/hdr/types/CMakeLists.txt
@@ -455,6 +455,51 @@ add_proxy_header_library(
libc.include.netinet_in
)
+add_proxy_header_library(
+ struct_ip_mreq
+ HDRS
+ struct_ip_mreq.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.struct_ip_mreq
+ libc.include.netinet_in
+)
+
+add_proxy_header_library(
+ struct_ip_mreq_source
+ HDRS
+ struct_ip_mreq_source.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.struct_ip_mreq_source
+ libc.include.netinet_in
+)
+
+add_proxy_header_library(
+ struct_ip_mreqn
+ HDRS
+ struct_ip_mreqn.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.struct_ip_mreqn
+ libc.include.netinet_in
+)
+
+add_proxy_header_library(
+ struct_ip_msfilter
+ HDRS
+ struct_ip_msfilter.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.struct_ip_msfilter
+ libc.include.netinet_in
+)
+
+add_proxy_header_library(
+ struct_ip_opts
+ HDRS
+ struct_ip_opts.h
+ FULL_BUILD_DEPENDS
+ libc.include.llvm-libc-types.struct_ip_opts
+ libc.include.netinet_in
+)
+
add_proxy_header_library(
in_addr_t
HDRS
diff --git a/libc/hdr/types/struct_ip_mreq.h b/libc/hdr/types/struct_ip_mreq.h
new file mode 100644
index 0000000000000..9799f892bf7ef
--- /dev/null
+++ b/libc/hdr/types/struct_ip_mreq.h
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Proxy header for struct ip_mreq.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_IP_MREQ_H
+#define LLVM_LIBC_HDR_TYPES_STRUCT_IP_MREQ_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/struct_ip_mreq.h"
+
+#else
+
+#include <netinet/in.h>
+
+#endif // LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_STRUCT_IP_MREQ_H
diff --git a/libc/hdr/types/struct_ip_mreq_source.h b/libc/hdr/types/struct_ip_mreq_source.h
new file mode 100644
index 0000000000000..d19fd6cd19132
--- /dev/null
+++ b/libc/hdr/types/struct_ip_mreq_source.h
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Proxy header for struct ip_mreq_source.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_IP_MREQ_SOURCE_H
+#define LLVM_LIBC_HDR_TYPES_STRUCT_IP_MREQ_SOURCE_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/struct_ip_mreq_source.h"
+
+#else
+
+#include <netinet/in.h>
+
+#endif // LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_STRUCT_IP_MREQ_SOURCE_H
diff --git a/libc/hdr/types/struct_ip_mreqn.h b/libc/hdr/types/struct_ip_mreqn.h
new file mode 100644
index 0000000000000..9672e2408f705
--- /dev/null
+++ b/libc/hdr/types/struct_ip_mreqn.h
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Proxy header for struct ip_mreqn.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_IP_MREQN_H
+#define LLVM_LIBC_HDR_TYPES_STRUCT_IP_MREQN_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/struct_ip_mreqn.h"
+
+#else
+
+#include <netinet/in.h>
+
+#endif // LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_STRUCT_IP_MREQN_H
diff --git a/libc/hdr/types/struct_ip_msfilter.h b/libc/hdr/types/struct_ip_msfilter.h
new file mode 100644
index 0000000000000..7434815d95fd3
--- /dev/null
+++ b/libc/hdr/types/struct_ip_msfilter.h
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Proxy header for struct ip_msfilter.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_IP_MSFILTER_H
+#define LLVM_LIBC_HDR_TYPES_STRUCT_IP_MSFILTER_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/struct_ip_msfilter.h"
+
+#else
+
+#include <netinet/in.h>
+
+#endif // LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_STRUCT_IP_MSFILTER_H
diff --git a/libc/hdr/types/struct_ip_opts.h b/libc/hdr/types/struct_ip_opts.h
new file mode 100644
index 0000000000000..44f922f941da0
--- /dev/null
+++ b/libc/hdr/types/struct_ip_opts.h
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Proxy header for struct ip_opts.
+///
+//===----------------------------------------------------------------------===//
+#ifndef LLVM_LIBC_HDR_TYPES_STRUCT_IP_OPTS_H
+#define LLVM_LIBC_HDR_TYPES_STRUCT_IP_OPTS_H
+
+#ifdef LIBC_FULL_BUILD
+
+#include "include/llvm-libc-types/struct_ip_opts.h"
+
+#else
+
+#include <netinet/in.h>
+
+#endif // LIBC_FULL_BUILD
+
+#endif // LLVM_LIBC_HDR_TYPES_STRUCT_IP_OPTS_H
diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt
index 549dbd9e4c3f8..7cecc6f70a353 100644
--- a/libc/include/CMakeLists.txt
+++ b/libc/include/CMakeLists.txt
@@ -227,6 +227,11 @@ add_header_macro(
.llvm-libc-types.struct_sockaddr_in6
.llvm-libc-types.struct_in_addr
.llvm-libc-types.struct_in6_addr
+ .llvm-libc-types.struct_ip_mreq
+ .llvm-libc-types.struct_ip_mreq_source
+ .llvm-libc-types.struct_ip_mreqn
+ .llvm-libc-types.struct_ip_msfilter
+ .llvm-libc-types.struct_ip_opts
.llvm_libc_common_h
)
diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt
index 46b0eb7d71183..9d14c74480f81 100644
--- a/libc/include/llvm-libc-types/CMakeLists.txt
+++ b/libc/include/llvm-libc-types/CMakeLists.txt
@@ -60,6 +60,11 @@ add_header(in_addr_t HDR in_addr_t.h)
add_header(in_port_t HDR in_port_t.h DEPENDS libc.include.llvm-libc-macros.stdint_macros)
add_header(struct_in_addr HDR struct_in_addr.h DEPENDS .in_addr_t)
add_header(struct_in6_addr HDR struct_in6_addr.h DEPENDS libc.include.llvm-libc-macros.stdint_macros)
+add_header(struct_ip_mreq HDR struct_ip_mreq.h DEPENDS .struct_in_addr)
+add_header(struct_ip_mreq_source HDR struct_ip_mreq_source.h DEPENDS .struct_in_addr)
+add_header(struct_ip_mreqn HDR struct_ip_mreqn.h DEPENDS .struct_in_addr)
+add_header(struct_ip_msfilter HDR struct_ip_msfilter.h DEPENDS libc.include.llvm-libc-macros.stdint_macros .struct_in_addr)
+add_header(struct_ip_opts HDR struct_ip_opts.h DEPENDS .struct_in_addr)
add_header(ino_t HDR ino_t.h)
add_header(key_t HDR key_t.h)
add_header(mbstate_t HDR mbstate_t.h)
diff --git a/libc/include/llvm-libc-types/struct_ip_mreq.h b/libc/include/llvm-libc-types/struct_ip_mreq.h
new file mode 100644
index 0000000000000..614a38d8d95c6
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_ip_mreq.h
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Definition of struct ip_mreq.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TYPES_STRUCT_IP_MREQ_H
+#define LLVM_LIBC_TYPES_STRUCT_IP_MREQ_H
+
+#include "struct_in_addr.h"
+
+struct ip_mreq {
+ struct in_addr imr_multiaddr;
+ struct in_addr imr_interface;
+};
+
+#endif // LLVM_LIBC_TYPES_STRUCT_IP_MREQ_H
diff --git a/libc/include/llvm-libc-types/struct_ip_mreq_source.h b/libc/include/llvm-libc-types/struct_ip_mreq_source.h
new file mode 100644
index 0000000000000..565c92ba43c7d
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_ip_mreq_source.h
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Definition of struct ip_mreq_source.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TYPES_STRUCT_IP_MREQ_SOURCE_H
+#define LLVM_LIBC_TYPES_STRUCT_IP_MREQ_SOURCE_H
+
+#include "struct_in_addr.h"
+
+struct ip_mreq_source {
+ struct in_addr imr_multiaddr;
+ struct in_addr imr_interface;
+ struct in_addr imr_sourceaddr;
+};
+
+#endif // LLVM_LIBC_TYPES_STRUCT_IP_MREQ_SOURCE_H
diff --git a/libc/include/llvm-libc-types/struct_ip_mreqn.h b/libc/include/llvm-libc-types/struct_ip_mreqn.h
new file mode 100644
index 0000000000000..7fa7aaa2dd09b
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_ip_mreqn.h
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Definition of struct ip_mreqn.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TYPES_STRUCT_IP_MREQN_H
+#define LLVM_LIBC_TYPES_STRUCT_IP_MREQN_H
+
+#include "struct_in_addr.h"
+
+struct ip_mreqn {
+ struct in_addr imr_multiaddr;
+ struct in_addr imr_address;
+ int imr_ifindex;
+};
+
+#endif // LLVM_LIBC_TYPES_STRUCT_IP_MREQN_H
diff --git a/libc/include/llvm-libc-types/struct_ip_msfilter.h b/libc/include/llvm-libc-types/struct_ip_msfilter.h
new file mode 100644
index 0000000000000..6a5c4097cafcd
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_ip_msfilter.h
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Definition of struct ip_msfilter.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TYPES_STRUCT_IP_MSFILTER_H
+#define LLVM_LIBC_TYPES_STRUCT_IP_MSFILTER_H
+
+#include "../llvm-libc-macros/stdint-macros.h"
+#include "struct_in_addr.h"
+
+struct ip_msfilter {
+ struct in_addr imsf_multiaddr;
+ struct in_addr imsf_interface;
+ uint32_t imsf_fmode;
+ uint32_t imsf_numsrc;
+ struct in_addr imsf_slist[1]; // Variable size.
+};
+
+#endif // LLVM_LIBC_TYPES_STRUCT_IP_MSFILTER_H
diff --git a/libc/include/llvm-libc-types/struct_ip_opts.h b/libc/include/llvm-libc-types/struct_ip_opts.h
new file mode 100644
index 0000000000000..18c6d638cbcd4
--- /dev/null
+++ b/libc/include/llvm-libc-types/struct_ip_opts.h
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Definition of struct ip_opts.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_TYPES_STRUCT_IP_OPTS_H
+#define LLVM_LIBC_TYPES_STRUCT_IP_OPTS_H
+
+#include "struct_in_addr.h"
+
+struct ip_opts {
+ struct in_addr ip_dst;
+ char ip_opts[40]; // Variable size.
+};
+
+#endif // LLVM_LIBC_TYPES_STRUCT_IP_OPTS_H
diff --git a/libc/include/netinet/in.yaml b/libc/include/netinet/in.yaml
index e4eb7d65bb42d..67311291cd60f 100644
--- a/libc/include/netinet/in.yaml
+++ b/libc/include/netinet/in.yaml
@@ -24,6 +24,83 @@ macros:
macro_header: inet-address-macros.h
- macro_name: INET6_ADDRSTRLEN
macro_header: inet-address-macros.h
+
+ # Socket level
+ - macro_name: SOL_IP
+ macro_value: 0
+
+ # IP level socket options
+ - macro_name: IP_TOS
+ macro_value: 1 # int
+ - macro_name: IP_TTL
+ macro_value: 2 # int
+ - macro_name: IP_HDRINCL
+ macro_value: 3 # int
+ - macro_name: IP_OPTIONS
+ macro_value: 4 # struct ip_opts
+ - macro_name: IP_ROUTER_ALERT
+ macro_value: 5 # int
+ - macro_name: IP_RECVOPTS
+ macro_value: 6 # int
+ - macro_name: IP_RETOPTS
+ macro_value: 7 # int
+ - macro_name: IP_PKTINFO
+ macro_value: 8 # int
+ - macro_name: IP_MTU_DISCOVER
+ macro_value: 10 # int
+ - macro_name: IP_PMTUDISC_DONT
+ macro_value: 0
+ - macro_name: IP_PMTUDISC_WANT
+ macro_value: 1
+ - macro_name: IP_PMTUDISC_DO
+ macro_value: 2
+ - macro_name: IP_PMTUDISC_PROBE
+ macro_value: 3
+ - macro_name: IP_RECVERR
+ macro_value: 11 # int
+ - macro_name: IP_RECVTTL
+ macro_value: 12 # int
+ - macro_name: IP_RECVTOS
+ macro_value: 13 # int
+ - macro_name: IP_MTU
+ macro_value: 14 # int
+ - macro_name: IP_FREEBIND
+ macro_value: 15 # int
+ - macro_name: IP_PASSSEC
+ macro_value: 18 # int
+ - macro_name: IP_TRANSPARENT
+ macro_value: 19 # int
+ - macro_name: IP_RECVORIGDSTADDR
+ macro_value: 20 # int
+ - macro_name: IP_NODEFRAG
+ macro_value: 22 # int
+ - macro_name: IP_BIND_ADDRESS_NO_PORT
+ macro_value: 24 # int
+ - macro_name: IP_MULTICAST_IF
+ macro_value: 32 # struct in_addr or ip_mreq or ip_mreqn
+ - macro_name: IP_MULTICAST_TTL
+ macro_value: 33 # int
+ - macro_name: IP_MULTICAST_LOOP
+ macro_value: 34 # int
+ - macro_name: IP_ADD_MEMBERSHIP
+ macro_value: 35 # struct ip_mreq or ip_mreqn
+ - macro_name: IP_DROP_MEMBERSHIP
+ macro_value: 36 # struct ip_mreq or ip_mreqn
+ - macro_name: IP_UNBLOCK_SOURCE
+ macro_value: 37 # struct ip_mreq_source
+ - macro_name: IP_BLOCK_SOURCE
+ macro_value: 38 # struct ip_mreq_source
+ - macro_name: IP_ADD_SOURCE_MEMBERSHIP
+ macro_value: 39 # struct ip_mreq_source
+ - macro_name: IP_DROP_SOURCE_MEMBERSHIP
+ macro_value: 40 # struct ip_mreq_source
+ - macro_name: IP_MSFILTER
+ macro_value: 41 # struct ip_msfilter
+ - macro_name: IP_MULTICAST_ALL
+ macro_value: 49 # int
+ - macro_name: IP_LOCAL_PORT_RANGE
+ macro_value: 51 # uint32_t
+
types:
- type_name: in_port_t
- type_name: in_addr_t
@@ -32,6 +109,11 @@ types:
- type_name: struct_sockaddr_in6
- type_name: struct_in_addr
- type_name: struct_in6_addr
+ - type_name: struct_ip_mreq
+ - type_name: struct_ip_mreq_source
+ - type_name: struct_ip_mreqn
+ - type_name: struct_ip_msfilter
+ - type_name: struct_ip_opts
enums: []
objects:
- object_name: in6addr_any
diff --git a/libc/test/src/netinet/CMakeLists.txt b/libc/test/src/netinet/CMakeLists.txt
index 605f70ff193cd..f1adcf0f56f17 100644
--- a/libc/test/src/netinet/CMakeLists.txt
+++ b/libc/test/src/netinet/CMakeLists.txt
@@ -9,6 +9,11 @@ add_libc_unittest(
DEPENDS
libc.hdr.netinet_in_macros
libc.hdr.types.struct_in6_addr
+ libc.hdr.types.struct_ip_mreq
+ libc.hdr.types.struct_ip_mreq_source
+ libc.hdr.types.struct_ip_mreqn
+ libc.hdr.types.struct_ip_msfilter
+ libc.hdr.types.struct_ip_opts
libc.hdr.types.struct_sockaddr_in6
libc.src.arpa.inet.htons
libc.src.arpa.inet.htonl
diff --git a/libc/test/src/netinet/in_test.cpp b/libc/test/src/netinet/in_test.cpp
index fb4c3be335605..759f34e9d47a4 100644
--- a/libc/test/src/netinet/in_test.cpp
+++ b/libc/test/src/netinet/in_test.cpp
@@ -18,6 +18,11 @@
#include "hdr/netinet_in_macros.h"
#include "hdr/types/struct_in6_addr.h"
+#include "hdr/types/struct_ip_mreq.h"
+#include "hdr/types/struct_ip_mreq_source.h"
+#include "hdr/types/struct_ip_mreqn.h"
+#include "hdr/types/struct_ip_msfilter.h"
+#include "hdr/types/struct_ip_opts.h"
#include "hdr/types/struct_sockaddr_in6.h"
#include "src/netinet/in6addr_any.h"
#include "src/netinet/in6addr_loopback.h"
@@ -92,3 +97,32 @@ TEST(LlvmLibcNetinetInTest, SockaddrIn6Layout) {
static_cast<size_t>(24));
EXPECT_EQ(sizeof(struct sockaddr_in6), static_cast<size_t>(28));
}
+
+TEST(LlvmLibcNetinetInTest, IpOptionLayout) {
+ EXPECT_EQ(sizeof(struct ip_mreq), static_cast<size_t>(8));
+ EXPECT_EQ(sizeof(struct ip_mreq_source), static_cast<size_t>(12));
+ EXPECT_EQ(sizeof(struct ip_mreqn), static_cast<size_t>(12));
+ EXPECT_EQ(sizeof(struct ip_msfilter), static_cast<size_t>(20));
+ EXPECT_EQ(sizeof(struct ip_opts), static_cast<size_t>(44));
+
+ EXPECT_EQ(offsetof(struct ip_mreq, imr_multiaddr), static_cast<size_t>(0));
+ EXPECT_EQ(offsetof(struct ip_mreq, imr_interface), static_cast<size_t>(4));
+
+ EXPECT_EQ(offsetof(struct ip_mreq_source, imr_multiaddr), static_cast<size_t>(0));
+ EXPECT_EQ(offsetof(struct ip_mreq_source, imr_interface), static_cast<size_t>(4));
+ EXPECT_EQ(offsetof(struct ip_mreq_source, imr_sourceaddr),
+ static_cast<size_t>(8));
+
+ EXPECT_EQ(offsetof(struct ip_mreqn, imr_multiaddr), static_cast<size_t>(0));
+ EXPECT_EQ(offsetof(struct ip_mreqn, imr_address), static_cast<size_t>(4));
+ EXPECT_EQ(offsetof(struct ip_mreqn, imr_ifindex), static_cast<size_t>(8));
+
+ EXPECT_EQ(offsetof(struct ip_msfilter, imsf_multiaddr), static_cast<size_t>(0));
+ EXPECT_EQ(offsetof(struct ip_msfilter, imsf_interface), static_cast<size_t>(4));
+ EXPECT_EQ(offsetof(struct ip_msfilter, imsf_fmode), static_cast<size_t>(8));
+ EXPECT_EQ(offsetof(struct ip_msfilter, imsf_numsrc), static_cast<size_t>(12));
+ EXPECT_EQ(offsetof(struct ip_msfilter, imsf_slist), static_cast<size_t>(16));
+
+ EXPECT_EQ(offsetof(struct ip_opts, ip_dst), static_cast<size_t>(0));
+ EXPECT_EQ(offsetof(struct ip_opts, ip_opts), static_cast<size_t>(4));
+}
>From e3c254073fdee343b7cc9a13ebd7a3cf7dcae911 Mon Sep 17 00:00:00 2001
From: Pavel Labath <pavel at labath.sk>
Date: Fri, 19 Jun 2026 09:39:47 +0000
Subject: [PATCH 2/2] forma
---
libc/include/netinet/in.yaml | 1 -
libc/test/src/netinet/in_test.cpp | 12 ++++++++----
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/libc/include/netinet/in.yaml b/libc/include/netinet/in.yaml
index 67311291cd60f..0244b160cb601 100644
--- a/libc/include/netinet/in.yaml
+++ b/libc/include/netinet/in.yaml
@@ -25,7 +25,6 @@ macros:
- macro_name: INET6_ADDRSTRLEN
macro_header: inet-address-macros.h
- # Socket level
- macro_name: SOL_IP
macro_value: 0
diff --git a/libc/test/src/netinet/in_test.cpp b/libc/test/src/netinet/in_test.cpp
index 759f34e9d47a4..eccfdf37d5514 100644
--- a/libc/test/src/netinet/in_test.cpp
+++ b/libc/test/src/netinet/in_test.cpp
@@ -108,8 +108,10 @@ TEST(LlvmLibcNetinetInTest, IpOptionLayout) {
EXPECT_EQ(offsetof(struct ip_mreq, imr_multiaddr), static_cast<size_t>(0));
EXPECT_EQ(offsetof(struct ip_mreq, imr_interface), static_cast<size_t>(4));
- EXPECT_EQ(offsetof(struct ip_mreq_source, imr_multiaddr), static_cast<size_t>(0));
- EXPECT_EQ(offsetof(struct ip_mreq_source, imr_interface), static_cast<size_t>(4));
+ EXPECT_EQ(offsetof(struct ip_mreq_source, imr_multiaddr),
+ static_cast<size_t>(0));
+ EXPECT_EQ(offsetof(struct ip_mreq_source, imr_interface),
+ static_cast<size_t>(4));
EXPECT_EQ(offsetof(struct ip_mreq_source, imr_sourceaddr),
static_cast<size_t>(8));
@@ -117,8 +119,10 @@ TEST(LlvmLibcNetinetInTest, IpOptionLayout) {
EXPECT_EQ(offsetof(struct ip_mreqn, imr_address), static_cast<size_t>(4));
EXPECT_EQ(offsetof(struct ip_mreqn, imr_ifindex), static_cast<size_t>(8));
- EXPECT_EQ(offsetof(struct ip_msfilter, imsf_multiaddr), static_cast<size_t>(0));
- EXPECT_EQ(offsetof(struct ip_msfilter, imsf_interface), static_cast<size_t>(4));
+ EXPECT_EQ(offsetof(struct ip_msfilter, imsf_multiaddr),
+ static_cast<size_t>(0));
+ EXPECT_EQ(offsetof(struct ip_msfilter, imsf_interface),
+ static_cast<size_t>(4));
EXPECT_EQ(offsetof(struct ip_msfilter, imsf_fmode), static_cast<size_t>(8));
EXPECT_EQ(offsetof(struct ip_msfilter, imsf_numsrc), static_cast<size_t>(12));
EXPECT_EQ(offsetof(struct ip_msfilter, imsf_slist), static_cast<size_t>(16));
More information about the libc-commits
mailing list