Skip to content

Commit

Permalink
RFC: Move std::net types into core:.net.
Browse files Browse the repository at this point in the history
  • Loading branch information
reitermarkus committed Dec 6, 2019
1 parent 809a988 commit 565c02d
Showing 1 changed file with 85 additions and 0 deletions.
85 changes: 85 additions & 0 deletions text/0000-core-net-types.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
- Feature Name: `core_net_types`
- Start Date: 2019-12-06
- RFC PR: [rust-lang/rfcs#0000](https://github.com/rust-lang/rfcs/pull/0000)
- Rust Issue: [rust-lang/rust#0000](https://github.com/rust-lang/rust/issues/0000)

# Summary
[summary]: #summary

Make the `IpAddr`, `Ipv4Addr` and `Ipv6Addr` types available in `no_std`
contexts by moving them into a `core::net` module.

# Motivation
[motivation]: #motivation

The motivation here is to provide common types for both `no_std` and `std`
targets which in turn will ease the creation of libraries based around IP
addresses. Embedded IoT development is one area where this will be beneficial.
IP addresses are portable across all platforms and have no external
dependencies which is in line with the definition of the core library.

# Guide-level explanation
[guide-level-explanation]: #guide-level-explanation

The `core::net::IpAddr`, `core::net::Ipv4Addr` and `core::net::Ipv6Addr` types
are available in `no_std` contexts.

Library developers should use `core::net` to implement abstractions in order
for them to work in `no_std` contexts as well.

# Reference-level explanation
[reference-level-explanation]: #reference-level-explanation

Currently, the IP address types depend on their corresponding `libc`
counterpart for ther `inner` value.

IPv4 addresses are well-defined. [IETF RFC 791] specifically states:

> Addresses are fixed length of four octets (32 bits).
IPv6 addresses are well-defined. [IETF RFC 4291] specifically states:

> IPv6 addresses are 128-bit identifiers
Since the size and representation of IPv4 and IPv6 addresses are well defined,
we can replace the `inner` value of `Ipv4Addr` with a `[u8; 4]` and the `inner`
value of `IPv6Addr` with a `[u8; 16]`.

[IETF RFC 791]: https://tools.ietf.org/html/rfc791
[IETF RFC 4291]: https://tools.ietf.org/html/rfc4291

# Drawbacks
[drawbacks]: #drawbacks

Moving the `std::net` types to `core::net` makes the core library less *minimal*.

# Rationale and alternatives
[rationale-and-alternatives]: #rationale-and-alternatives

- Given the size of IP addresses is well defined by IETF RFCs, there is no
inherent need to have these types depend on `libc`.

- Eliminates the need to use different abstractions for `no_std` and `std`.

# Prior art
[prior-art]: #prior-art

There was a prior discussion at

https://internals.rust-lang.org/t/std-ipv4addr-in-core/11247/15

and an experimental branch from [@Nemo157](https://github.com/Nemo157) at

https://github.com/Nemo157/rust/tree/core-ip

# Unresolved questions
[unresolved-questions]: #unresolved-questions

Should `SocketAddr`, `SocketAddrV4` and `SocketAddrV6` be moved to `core::net`
as well?

# Future possibilities
[future-possibilities]: #future-possibilities

Moving of `SocketAddr`, `SocketAddrV4` and `SocketAddrV6` could be done in the
future depending on the unresolved question of whether this *should* be done.

0 comments on commit 565c02d

Please sign in to comment.