Expanded and added links to std::net::{IpAddr,Ipv4Addr,Ipv6Addr} docs

Part of #29363
Expanded top-level documentation & linked to relevant IETF RFCs.
Added a bunch of links (to true/false/Ipv4Addr/etc.) throughout the docs.
This commit is contained in:
lukaramu 2017-03-26 14:25:31 +02:00
parent 0d5baba70d
commit 347b70901c

View file

@ -21,44 +21,99 @@ use net::{hton, ntoh};
use sys::net::netc as c;
use sys_common::{AsInner, FromInner};
/// An IP address, either an IPv4 or IPv6 address.
/// Either an IPv4 address or an IPv6 address.
///
/// This enum can contain either an [`Ipv4Addr`] or an [`Ipv6Addr`], see their
/// respective documentation for more details.
///
/// [`Ipv4Addr`]: ../../std/net/struct.Ipv4Addr.html
/// [`Ipv6Addr`]: ../../std/net/struct.Ipv6Addr.html
///
/// # Examples
///
/// Constructing an IPv4 address:
///
/// ```
/// use std::net::{IpAddr, Ipv4Addr};
/// use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
///
/// IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
/// ```
/// let localhost_v4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));
/// let localhost_v6 = IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));
///
/// Constructing an IPv6 address:
/// assert_eq!("127.0.0.1".parse(), Ok(localhost_v4));
/// assert_eq!("::1".parse(), Ok(localhost_v6));
///
/// ```
/// use std::net::{IpAddr, Ipv6Addr};
///
/// IpAddr::V6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1));
/// assert_eq!(localhost_v4.is_ipv6(), false);
/// assert_eq!(localhost_v4.is_ipv4(), true);
/// ```
#[stable(feature = "ip_addr", since = "1.7.0")]
#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash, PartialOrd, Ord)]
pub enum IpAddr {
/// Representation of an IPv4 address.
/// An IPv4 address.
#[stable(feature = "ip_addr", since = "1.7.0")]
V4(#[stable(feature = "ip_addr", since = "1.7.0")] Ipv4Addr),
/// Representation of an IPv6 address.
/// An IPv6 address.
#[stable(feature = "ip_addr", since = "1.7.0")]
V6(#[stable(feature = "ip_addr", since = "1.7.0")] Ipv6Addr),
}
/// Representation of an IPv4 address.
/// An IPv4 address.
///
/// IPv4 addresses are defined as 32-bit integers in [IETF RFC 791].
/// They are usually represented as four octets.
///
/// See [`IpAddr`] for a type encompassing both IPv4 and IPv6 addresses.
///
/// [IETF RFC 791]: https://tools.ietf.org/html/rfc791
/// [`IpAddr`]: ../../std/net/enum.IpAddr.html
///
/// # Textual representation
///
/// `Ipv4Addr` provides a [`FromStr`] implementation. The four octets are in decimal
/// notation, divided by `.` (this is called "dot-decimal notation").
///
/// [`FromStr`]: ../../std/str/trait.FromStr.html
///
/// # Examples
///
/// ```
/// use std::net::Ipv4Addr;
///
/// let localhost = Ipv4Addr::new(127, 0, 0, 1);
/// assert_eq!("127.0.0.1".parse(), Ok(localhost));
/// assert_eq!(localhost.is_loopback(), true);
/// ```
#[derive(Copy)]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct Ipv4Addr {
inner: c::in_addr,
}
/// Representation of an IPv6 address.
/// An IPv6 address.
///
/// IPv6 addresses are defined as 128-bit integers in [IETF RFC 4291].
/// They are usually represented as eight 16-bit segments.
///
/// See [`IpAddr`] for a type encompassing both IPv4 and IPv6 addresses.
///
/// [IETF RFC 4291]: https://tools.ietf.org/html/rfc4291
/// [`IpAddr`]: ../../std/net/enum.IpAddr.html
///
/// # Textual representation
///
/// `Ipv6Addr` provides a [`FromStr`] implementation. There are many ways to represent
/// an IPv6 address in text, but in general, each segments is written in hexadecimal
/// notation, and segments are separated by `:`. For more information, see
/// [IETF RFC 5952].
///
/// [`FromStr`]: ../../std/str/trait.FromStr.html
/// [IETF RFC 5952]: https://tools.ietf.org/html/rfc5952
///
/// # Examples
///
/// ```
/// use std::net::Ipv6Addr;
///
/// let localhost = Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1);
/// assert_eq!("::1".parse(), Ok(localhost));
/// assert_eq!(localhost.is_loopback(), true);
#[derive(Copy)]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct Ipv6Addr {
@ -78,10 +133,14 @@ pub enum Ipv6MulticastScope {
}
impl IpAddr {
/// Returns true for the special 'unspecified' address ([IPv4], [IPv6]).
/// Returns [`true`] for the special 'unspecified' address.
///
/// See the documentation for [`Ipv4Addr::is_unspecified`][IPv4] and
/// [`Ipv6Addr::is_unspecified`][IPv6] for more details.
///
/// [IPv4]: ../../std/net/struct.Ipv4Addr.html#method.is_unspecified
/// [IPv6]: ../../std/net/struct.Ipv6Addr.html#method.is_unspecified
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -99,10 +158,14 @@ impl IpAddr {
}
}
/// Returns true if this is a loopback address ([IPv4], [IPv6]).
/// Returns [`true`] if this is a loopback address.
///
/// See the documentation for [`Ipv4Addr::is_loopback`][IPv4] and
/// [`Ipv6Addr::is_loopback`][IPv6] for more details.
///
/// [IPv4]: ../../std/net/struct.Ipv4Addr.html#method.is_loopback
/// [IPv6]: ../../std/net/struct.Ipv6Addr.html#method.is_loopback
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -120,10 +183,14 @@ impl IpAddr {
}
}
/// Returns true if the address appears to be globally routable ([IPv4], [IPv6]).
/// Returns [`true`] if the address appears to be globally routable.
///
/// See the documentation for [`Ipv4Addr::is_global`][IPv4] and
/// [`Ipv6Addr::is_global`][IPv6] for more details.
///
/// [IPv4]: ../../std/net/struct.Ipv4Addr.html#method.is_global
/// [IPv6]: ../../std/net/struct.Ipv6Addr.html#method.is_global
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -145,10 +212,14 @@ impl IpAddr {
}
}
/// Returns true if this is a multicast address ([IPv4], [IPv6]).
/// Returns [`true`] if this is a multicast address.
///
/// See the documentation for [`Ipv4Addr::is_multicast`][IPv4] and
/// [`Ipv6Addr::is_multicast`][IPv6] for more details.
///
/// [IPv4]: ../../std/net/struct.Ipv4Addr.html#method.is_multicast
/// [IPv6]: ../../std/net/struct.Ipv6Addr.html#method.is_multicast
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -166,10 +237,14 @@ impl IpAddr {
}
}
/// Returns true if this address is in a range designated for documentation ([IPv4], [IPv6]).
/// Returns [`true`] if this address is in a range designated for documentation.
///
/// See the documentation for [`Ipv4Addr::is_documentation`][IPv4] and
/// [`Ipv6Addr::is_documentation`][IPv6] for more details.
///
/// [IPv4]: ../../std/net/struct.Ipv4Addr.html#method.is_documentation
/// [IPv6]: ../../std/net/struct.Ipv6Addr.html#method.is_documentation
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -191,7 +266,13 @@ impl IpAddr {
}
}
/// Returns true if this address is a valid IPv4 address, false if it's a valid IPv6 address.
/// Returns [`true`] if this address is an [IPv4 address] and [`false`] if it's an
/// [IPv6 address].
///
/// [`true`]: ../../std/primitive.bool.html
/// [`false`]: ../../std/primitive.bool.html
/// [IPv4 address]: #variant.V4
/// [IPv6 address]: #variant.V6
///
/// # Examples
///
@ -212,7 +293,13 @@ impl IpAddr {
}
}
/// Returns true if this address is a valid IPv6 address, false if it's a valid IPv4 address.
/// Returns [`true`] if this address is an [IPv6 address] and [`false`] if it's an
/// [IPv4 address].
///
/// [`true`]: ../../std/primitive.bool.html
/// [`false`]: ../../std/primitive.bool.html
/// [IPv4 address]: #variant.V4
/// [IPv6 address]: #variant.V6
///
/// # Examples
///
@ -274,12 +361,13 @@ impl Ipv4Addr {
[(bits >> 24) as u8, (bits >> 16) as u8, (bits >> 8) as u8, bits as u8]
}
/// Returns true for the special 'unspecified' address (0.0.0.0).
/// Returns [`true`] for the special 'unspecified' address (0.0.0.0).
///
/// This property is defined in _UNIX Network Programming, Second Edition_,
/// W. Richard Stevens, p. 891; see also [ip7].
///
/// [ip7]: http://man7.org/linux/man-pages/man7/ip.7.html
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -294,11 +382,12 @@ impl Ipv4Addr {
self.inner.s_addr == 0
}
/// Returns true if this is a loopback address (127.0.0.0/8).
/// Returns [`true`] if this is a loopback address (127.0.0.0/8).
///
/// This property is defined by [IETF RFC 1122].
///
/// [IETF RFC 1122]: https://tools.ietf.org/html/rfc1122
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -313,7 +402,7 @@ impl Ipv4Addr {
self.octets()[0] == 127
}
/// Returns true if this is a private address.
/// Returns [`true`] if this is a private address.
///
/// The private address ranges are defined in [IETF RFC 1918] and include:
///
@ -322,6 +411,7 @@ impl Ipv4Addr {
/// - 192.168.0.0/16
///
/// [IETF RFC 1918]: https://tools.ietf.org/html/rfc1918
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -346,11 +436,12 @@ impl Ipv4Addr {
}
}
/// Returns true if the address is link-local (169.254.0.0/16).
/// Returns [`true`] if the address is link-local (169.254.0.0/16).
///
/// This property is defined by [IETF RFC 3927].
///
/// [IETF RFC 3927]: https://tools.ietf.org/html/rfc3927
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -366,7 +457,7 @@ impl Ipv4Addr {
self.octets()[0] == 169 && self.octets()[1] == 254
}
/// Returns true if the address appears to be globally routable.
/// Returns [`true`] if the address appears to be globally routable.
/// See [iana-ipv4-special-registry][ipv4-sr].
///
/// The following return false:
@ -379,6 +470,7 @@ impl Ipv4Addr {
/// - the unspecified address (0.0.0.0)
///
/// [ipv4-sr]: http://goo.gl/RaZ7lg
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -400,12 +492,13 @@ impl Ipv4Addr {
!self.is_broadcast() && !self.is_documentation() && !self.is_unspecified()
}
/// Returns true if this is a multicast address (224.0.0.0/4).
/// Returns [`true`] if this is a multicast address (224.0.0.0/4).
///
/// Multicast addresses have a most significant octet between 224 and 239,
/// and is defined by [IETF RFC 5771].
///
/// [IETF RFC 5771]: https://tools.ietf.org/html/rfc5771
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -421,11 +514,12 @@ impl Ipv4Addr {
self.octets()[0] >= 224 && self.octets()[0] <= 239
}
/// Returns true if this is a broadcast address (255.255.255.255).
/// Returns [`true`] if this is a broadcast address (255.255.255.255).
///
/// A broadcast address has all octets set to 255 as defined in [IETF RFC 919].
///
/// [IETF RFC 919]: https://tools.ietf.org/html/rfc919
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -441,7 +535,7 @@ impl Ipv4Addr {
self.octets()[2] == 255 && self.octets()[3] == 255
}
/// Returns true if this address is in a range designated for documentation.
/// Returns [`true`] if this address is in a range designated for documentation.
///
/// This is defined in [IETF RFC 5737]:
///
@ -450,6 +544,7 @@ impl Ipv4Addr {
/// - 203.0.113.0/24 (TEST-NET-3)
///
/// [IETF RFC 5737]: https://tools.ietf.org/html/rfc5737
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -471,10 +566,12 @@ impl Ipv4Addr {
}
}
/// Converts this address to an IPv4-compatible IPv6 address.
/// Converts this address to an IPv4-compatible [IPv6 address].
///
/// a.b.c.d becomes ::a.b.c.d
///
/// [IPv6 address]: ../../std/net/struct.Ipv6Addr.html
///
/// # Examples
///
/// ```
@ -490,10 +587,12 @@ impl Ipv4Addr {
((self.octets()[2] as u16) << 8) | self.octets()[3] as u16)
}
/// Converts this address to an IPv4-mapped IPv6 address.
/// Converts this address to an IPv4-mapped [IPv6 address].
///
/// a.b.c.d becomes ::ffff:a.b.c.d
///
/// [IPv6 address]: ../../std/net/struct.Ipv6Addr.html
///
/// # Examples
///
/// ```
@ -717,11 +816,12 @@ impl Ipv6Addr {
]
}
/// Returns true for the special 'unspecified' address (::).
/// Returns [`true`] for the special 'unspecified' address (::).
///
/// This property is defined in [IETF RFC 4291].
///
/// [IETF RFC 4291]: https://tools.ietf.org/html/rfc4291
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -736,11 +836,12 @@ impl Ipv6Addr {
self.segments() == [0, 0, 0, 0, 0, 0, 0, 0]
}
/// Returns true if this is a loopback address (::1).
/// Returns [`true`] if this is a loopback address (::1).
///
/// This property is defined in [IETF RFC 4291].
///
/// [IETF RFC 4291]: https://tools.ietf.org/html/rfc4291
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -755,14 +856,17 @@ impl Ipv6Addr {
self.segments() == [0, 0, 0, 0, 0, 0, 0, 1]
}
/// Returns true if the address appears to be globally routable.
/// Returns [`true`] if the address appears to be globally routable.
///
/// The following return false:
/// The following return [`false`]:
///
/// - the loopback address
/// - link-local, site-local, and unique local unicast addresses
/// - interface-, link-, realm-, admin- and site-local multicast addresses
///
/// [`true`]: ../../std/primitive.bool.html
/// [`false`]: ../../std/primitive.bool.html
///
/// # Examples
///
/// ```
@ -784,11 +888,12 @@ impl Ipv6Addr {
}
}
/// Returns true if this is a unique local address (fc00::/7).
/// Returns [`true`] if this is a unique local address (fc00::/7).
///
/// This property is defined in [IETF RFC 4193].
///
/// [IETF RFC 4193]: https://tools.ietf.org/html/rfc4193
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -807,11 +912,12 @@ impl Ipv6Addr {
(self.segments()[0] & 0xfe00) == 0xfc00
}
/// Returns true if the address is unicast and link-local (fe80::/10).
/// Returns [`true`] if the address is unicast and link-local (fe80::/10).
///
/// This property is defined in [IETF RFC 4291].
///
/// [IETF RFC 4291]: https://tools.ietf.org/html/rfc4291
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -830,9 +936,11 @@ impl Ipv6Addr {
(self.segments()[0] & 0xffc0) == 0xfe80
}
/// Returns true if this is a deprecated unicast site-local address
/// Returns [`true`] if this is a deprecated unicast site-local address
/// (fec0::/10).
///
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
/// ```
@ -850,12 +958,13 @@ impl Ipv6Addr {
(self.segments()[0] & 0xffc0) == 0xfec0
}
/// Returns true if this is an address reserved for documentation
/// Returns [`true`] if this is an address reserved for documentation
/// (2001:db8::/32).
///
/// This property is defined in [IETF RFC 3849].
///
/// [IETF RFC 3849]: https://tools.ietf.org/html/rfc3849
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
@ -874,7 +983,7 @@ impl Ipv6Addr {
(self.segments()[0] == 0x2001) && (self.segments()[1] == 0xdb8)
}
/// Returns true if the address is a globally routable unicast address.
/// Returns [`true`] if the address is a globally routable unicast address.
///
/// The following return false:
///
@ -885,6 +994,8 @@ impl Ipv6Addr {
/// - the unspecified address
/// - the address range reserved for documentation
///
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
/// ```
@ -937,11 +1048,13 @@ impl Ipv6Addr {
}
}
/// Returns true if this is a multicast address (ff00::/8).
/// Returns [`true`] if this is a multicast address (ff00::/8).
///
/// This property is defined by [IETF RFC 4291].
///
/// [IETF RFC 4291]: https://tools.ietf.org/html/rfc4291
/// [`true`]: ../../std/primitive.bool.html
///
/// # Examples
///
/// ```
@ -955,11 +1068,16 @@ impl Ipv6Addr {
(self.segments()[0] & 0xff00) == 0xff00
}
/// Converts this address to an IPv4 address. Returns None if this address is
/// Converts this address to an [IPv4 address]. Returns [`None`] if this address is
/// neither IPv4-compatible or IPv4-mapped.
///
/// ::a.b.c.d and ::ffff:a.b.c.d become a.b.c.d
///
/// [IPv4 address]: ../../std/net/struct.Ipv4Addr.html
/// [`None`]: ../../std/option/enum.Option.html#variant.None
///
/// # Examples
///
/// ```
/// use std::net::{Ipv4Addr, Ipv6Addr};
///