Description
This issue is split out of the larger discussion around stabilization of the ip
feature (tracking issue: #27709). The focus of this issue on the question of what interface Rust should provide for IPv6 unicast adresses.
The current unstable interface is as follows:
impl Ipv6Addr {
fn is_unicast_global(&self) -> bool;
fn is_unicast_link_local(&self) -> bool;
fn is_unicast_link_local_strict(&self) -> bool;
fn is_unicast_site_local(&self) -> bool;
}
Open Problems
Behaviour of is_unicast_link_local
/is_unicast_link_local_strict
Concern was raised about the need for both is_unicast_link_local
and is_unicast_link_local_strict
(#66584 (comment)). is_unicast_link_local
tests if an address is in FE80::/10
, is_unicast_link_local_strict
in the stricter FE80::/64
. For a time it was unclear which interpretation was the correct one, see #76098 (comment) for a more complete overview. However, it was mentioned (#76098 (comment)) that IETF RFC #5156 Section 2.4 defines FE80::/10
as the link-local unicast addresses, and that other programming languages and the linux kernel all use FE80::/10
(#76098 (comment), #76098 (comment)). The conclusion seems to be that the current implementation of is_unicast_link_local
is correct and consistent with other implementations, is_unicast_link_local_strict
could be removed.
Unresolved: Should is_unicast_link_local_strict
be removed?
Deprecation of site-local addresses
Unicast site-local addresses were deprecated in IETF RFC #3879, see also RFC #4291 Section 2.5.7. Any new implementation must no longer support the special behaviour of site-local addresses. This is mentioned in the docs of is_unicast_site_local
and already implemented in is_unicast_global
, which considers site-local addresses to be global.
For reference; .NET has IsIPv6SiteLocal, Python has is_site_local but mentions that is has been deprecated.
Unresolved: Should is_unicast_site_local
be removed? Should SiteLocal
be included in a possible IPv6UnicastScope
?
Introduce IPv6UnicastScope
It was suggested (#76098 (comment)) to replace the existing unicast interface with an enum IPv6UnicastScope
, similar to IPv6MulticastScope
:
impl Ipv6Addr {
fn unicast_scope(&self) -> Option<IPv6UnicastScope>
}
Positive reaction (#76098 (comment), #76098 (comment))
Unresolved: What would be the definition of IPv6UnicastScope
?
RFCs
- Unicast Adresses: IETF RFC #4291 Section 2.5
- Unique Local IPv6 Unicast Addresses: IETF RFC #4193
- Deprecating Site Local Addresses: IETF RFC #3879
- Special-Use IPv6 Addresses: IETF RFC #5156
Previous Discussion
- stabilize the "ip" feature: PR #66584
- Stabilize the "IP" feature: PR #76098
- Stabilize the "IP" feature (continued from Stabilize the "IP" feature #76098): PR #85585