Skip to content

Conversation

@Skyb0rg007
Copy link

@Skyb0rg007 Skyb0rg007 commented Jan 30, 2026

Description

This PR adds the structs and constants as defined by RFC 2292 - Advanced Sockets API for IPv6.
These constants are available for use in get/setsockopt on supported Unix platforms.
The operations defined on the icmp6_filter struct are defined as C macros, so the implementations are not included here.

Sources

https://github.com/bminor/glibc/blob/04e750e75b73957cf1c791535a3f4319534a52fc/inet/netinet/icmp6.h
https://github.com/kraj/musl/blob/kraj/master/include/netinet/icmp6.h
https://github.com/freebsd/freebsd-src/blob/9ae367d11de8abbdf53884836c9ba30908c5c8db/sys/netinet/icmp6.h

Also in the RFC: https://datatracker.ietf.org/doc/html/rfc2292#section-3.2

Checklist

Unfortunately I could not get the libc-tests working locally, so this PR is marked as draft.

  • Relevant tests in libc-test/semver have been updated
  • No placeholder or unstable values like *LAST or *MAX are
    included (see #3131)
  • Tested locally (cd libc-test && cargo test --target mytarget);
    especially relevant for platforms that may not be checked in CI

@rustbot label +stable-nominated

@rustbot rustbot added the stable-nominated This PR should be considered for cherry-pick to libc's stable release branch label Jan 30, 2026
@Skyb0rg007 Skyb0rg007 force-pushed the icmpv6-filters branch 15 times, most recently from b8f20e4 to 16f3cea Compare February 3, 2026 20:32
@Skyb0rg007
Copy link
Author

Alright, I need help. On *BSD platforms (FreeBSD, macOS, etc), struct in6_addr is defined as the union of uint32_t[4], uint16_t[8], and uint8_t[16], so Rust encodes it as [u8; 16] with repr(align(4)).

But the nd_(router|neighbor)_(solicit|advert) structures are marked as __packed (so their C alignment is 1), even though they include a in6_addr. Rust won't allow using repr(packed) on a struct containing a repr(align(...)) attribute, so I'm stuck.

Linux doesn't mark these structs as __packed, so there's no issue there.

This PR adds the icmp6_filter struct and constants as defined
by RFC 2292 - Advanced Sockets API for IPv6.
These constants are available for use in get/setsockopt
on supported Unix platforms.
The operations defined on the icmp6_filter struct are defined
as C macros, so the implementations are not included here.
See the RFC for definitions and use.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stable-nominated This PR should be considered for cherry-pick to libc's stable release branch

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants