authorgravatar for bblack@wikimedia.orgBrandon Black <bblack@wikimedia.org> 2025-09-09 16:43:12-05:00
committergravatar for bblack@wikimedia.orgBrandon Black <bblack@wikimedia.org> 2025-09-09 16:59:50-05:00
log3e372f19944ca2b3251c9e3295722d24c945302f
tree721fd55a7221db443b3e5edbd62a9d58addd33b8
parentc449a30213d1252a4dd65e5a7fde9bea9f2ab76f

std: add in_pktinfo and in6_pktinfo structs defs

in_pktinfo is only used on a few targets for the IP_PKTINFO sockopt, as many BSDs use an alternate mechanism (IP_RECVDSTADDR) that doesn't require a special struct. in6_pktinfo is more universal.

3 files changed, 44 insertions(+), 0 deletions(-)

lib/std/c.zig+29
......@@ -4087,6 +4087,35 @@ pub const ifreq = switch (native_os) {
40874087 },
40884088 else => void,
40894089};
4090pub const in_pktinfo = switch (native_os) {
4091 .linux => linux.in_pktinfo,
4092 // https://github.com/kofemann/opensolaris/blob/80192cd83bf665e708269dae856f9145f7190f74/usr/src/uts/common/netinet/in.h#L1084
4093 // https://github.com/illumos/illumos-gate/blob/608eb926e14f4ba4736b2d59e891335f1cba9e1e/usr/src/uts/common/netinet/in.h#L1132
4094 // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/netinet/in.h#L696
4095 .solaris, .illumos, .driverkit, .ios, .macos, .tvos, .watchos, .visionos => extern struct {
4096 ifindex: u32,
4097 spec_dst: u32,
4098 addr: u32,
4099 },
4100 else => void,
4101};
4102pub const in6_pktinfo = switch (native_os) {
4103 .linux => linux.in6_pktinfo,
4104 // https://github.com/freebsd/freebsd-src/blob/9bfbc6826f72eb385bf52f4cde8080bccf7e3ebd/sys/netinet6/in6.h#L547
4105 // https://github.com/DragonFlyBSD/DragonFlyBSD/blob/6098912863ed4c7b3f70d7483910ce2956cf4ed3/sys/netinet6/in6.h#L575
4106 // https://github.com/NetBSD/src/blob/80bf25a5691072d4755e84567ccbdf0729370dea/sys/netinet6/in6.h#L468
4107 // https://github.com/openbsd/src/blob/718a31b40d39fc6064de6355eb144e74633133fc/sys/netinet6/in6.h#L365
4108 // https://github.com/kofemann/opensolaris/blob/80192cd83bf665e708269dae856f9145f7190f74/usr/src/uts/common/netinet/in.h#L1093
4109 // https://github.com/illumos/illumos-gate/blob/608eb926e14f4ba4736b2d59e891335f1cba9e1e/usr/src/uts/common/netinet/in.h#L114IP1
4110 // https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/bsd/netinet6/in6.h#L737
4111 // https://github.com/haiku/haiku/blob/2aab5f5f14aeb3f34c3a3d9a9064cc3c0d914bea/headers/posix/netinet6/in6.h#L63
4112 // https://github.com/SerenityOS/serenity/blob/5bd8af99be0bc4b2e14f361fd7d7590e6bcfa4d6/Kernel/API/POSIX/sys/socket.h#L122
4113 .freebsd, .dragonfly, .netbsd, .openbsd, .solaris, .illumos, .driverkit, .ios, .macos, .tvos, .watchos, .visionos, .haiku, .serenity => extern struct {
4114 addr: [16]u8,
4115 ifindex: u32,
4116 },
4117 else => void,
4118};
40904119pub const itimerspec = switch (native_os) {
40914120 .linux => linux.itimerspec,
40924121 .haiku => extern struct {
lib/std/os/linux.zig+13
......@@ -4524,6 +4524,19 @@ pub const IPV6 = struct {
45244524 pub const FREEBIND = 78;
45254525};
45264526
4527// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/in.h?id=64e844505bc08cde3f346f193cbbbab0096fef54#n250
4528pub const in_pktinfo = extern struct {
4529 ifindex: i32,
4530 spec_dst: u32,
4531 addr: u32,
4532};
4533
4534// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/ipv6.h?id=f24987ef6959a7efaf79bffd265522c3df18d431#n22
4535pub const in6_pktinfo = extern struct {
4536 addr: [16]u8,
4537 ifindex: i32,
4538};
4539
45274540/// IEEE 802.3 Ethernet magic constants. The frame sizes omit the preamble
45284541/// and FCS/CRC (frame check sequence).
45294542pub const ETH = struct {
lib/std/posix.zig+2
......@@ -134,6 +134,8 @@ pub const fd_t = system.fd_t;
134134pub const file_obj = system.file_obj;
135135pub const gid_t = system.gid_t;
136136pub const ifreq = system.ifreq;
137pub const in_pktinfo = system.in_pktinfo;
138pub const in6_pktinfo = system.in6_pktinfo;
137139pub const ino_t = system.ino_t;
138140pub const mcontext_t = system.mcontext_t;
139141pub const mode_t = system.mode_t;