IP Utility Methods #85612
Description
Activity
Is there an official definition for which addresses are globally reachable?
Yes and no. The spec defines global unicast as the complement of all the other special-purpose ranges. With a strong emphasis on "subject to change". And of course that covers pretty much everything, including ranges that won't be allocated for a very long time. So this is fundamentally different from the way IPv4 categories are defined.
I propose removing (or making private) the utility function
Ipv4Addr::is_ietf_protocol_assignmentand not adding a (public) equivalentIpv6Addr::is_ietf_protocol_assignment. The method was introduced in #60145 along with other methods to be used in makingis_globalmore accurate, however it can still be used for this purpose as a private function.To me it is not clear what practical use of
is_ietf_protocol_assignmentis; I can't think of anything that a user might want to do with the knowledge that a certain address is reserved for IETF protocol assignment, outside of computing more useful properties likeis_globalor isis_special_use. It has been more than 2 years ago that this function was added, but I couldn't find any real usage in the wild: 1 2.To me all of this suggest that
is_ietf_protocol_assignmentis not a good candidate for stabilization.Edit: PR #86439 submitted
@rustbot label +T-libs
- addedT-libsRelevant to the library team, which will review and decide on the PR/issue.Relevant to the library team, which will review and decide on the PR/issue.
on Mar 30, 2023 - addedT-libs-api[DEPRECATED; DO NOT USE][DEPRECATED; DO NOT USE]A-ioArea: `std::io`, `std::fs`, `std::net` and `std::path`Area: `std::io`, `std::fs`, `std::net` and `std::path`and removedT-libsRelevant to the library team, which will review and decide on the PR/issue.Relevant to the library team, which will review and decide on the PR/issue.
on May 29, 2024 - addedT-libsRelevant to the library team, which will review and decide on the PR/issue.Relevant to the library team, which will review and decide on the PR/issue.and removedT-libs-api[DEPRECATED; DO NOT USE][DEPRECATED; DO NOT USE]
on Aug 12, 2026
This issue is split out of the larger discussion around stabilization of the
ipfeature (tracking issue: #27709). The focus of this issue is on the question of what utility methods Rust should provide for handling IPv4 and IPv6 addresses.For discussion about the conversion methods (
to_ipv6_mapped,to_ipv6_compatible,to_ipv4,to_ipv4_mapped) see #85609 IPv4-in-IPv6 Address Support.For discussion about the IPv6 unicast methods (
is_unicast_link_local,is_unicast_link_local_strict,is_unicast_site_local,is_unicast_global) see #85604 IPv6 Unicast Interface.Specifically this issue concerns itself with the various special address utility methods:
All of these excluding
is_globalcurrently correspond to various special addresses in the IANA IPv4 Special-Purpose Address Registry and IANA IPv6 Special-Purpose Address Registry.Note that of these only
Ipv4Addr::is_documentationandis_privateare currently stable.Open Problems
Semantics of utility methods
What should the exact semantics of
is_globalbe? The current documentation ofIpv4Addr::is_globalmentions the IANA IPv4 Special-Purpose Address Registry and follows it exactly,Ipv6Addr::is_globaldoes not (#76098 (comment)). For IPv6 specifically, should IPv4-mapped addresses be considered global? Python does not (#76098 (comment)). Is there an official definition for which addresses are globally reachable? What would be the least surprising to users.There is a similar question for all the other methods: should we strictly adhere to standards and the address registry, or for IPv6 addresses also consider IPv4-mapped addresses. Is it a problem if the IPv4 version and IPv6 version of a method have different definitions?
Unresolved: Settle on the exact semantics of
is_globaland other methods. See also #85609 IPv4-in-IPv6 Address Support.Which utility methods are useful
Which utility methods do we want to offer? Maybe offer the equivalent of
is_reserved,is_benchmarkingetc. forIpv6Addras well? Maybe not exposeis_ietf_protocol_assignment(what would be a real-world use case for this other than computingis_global?) A lot of these methods are not offered by other languages, but .NET does have IsIPv6Teredo.is_ipv4_mappedand maybeis_ipv4_compatiblecould also be useful.Unresolved: Which utility methods should be stabilized. How do we determine if a method is useful enough to be added.
Methods on both
Ipv4AddrandIpv6AddrIf methods like
is_documentationandis_benchmarkingare added to bothIpv4AddrandIpv6Addrthey can also be implemented forIpAddr. Does this make sense semantically? Is the definition ofIpv4Addr::is_documentationequivalent toIpv6Addr::documentation? Does a user ever needs to check in practice if they have an IPv4 documentation address or an IPv6 documentation address? It has been suggested that for these common methods onIpAddr,Ipv4AddrandIpv6Addrthere could be a trait.Unresolved: Which utility methods should be implemented for
IpAddr.Previous Discussion