Skip to content

Commit

Permalink
Merge pull request #2832 from reitermarkus/core-net-types
Browse files Browse the repository at this point in the history
RFC: Move `std::net::IpAddr` types into `core::net`.
  • Loading branch information
joshtriplett committed Feb 25, 2023
2 parents c0a2cef + d73abe6 commit fd7c616
Showing 1 changed file with 80 additions and 0 deletions.
80 changes: 80 additions & 0 deletions text/2832-core-net-types.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
- Feature Name: `core_net_types`
- Start Date: 2019-12-06
- RFC PR: [rust-lang/rfcs#2832](https://github.com/rust-lang/rfcs/pull/2832)
- Rust Issue: [rust-lang/rust#108443](https://github.com/rust-lang/rust/issues/108443)

# Summary
[summary]: #summary

Make the `IpAddr`, `Ipv4Addr`, `Ipv6Addr`, `SocketAddr`, `SocketAddrV4`,
`SocketAddrV6`, `Ipv6MulticastScope` and `AddrParseError` 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`, `core::net::Ipv6Addr`,
`core::net::SocketAddr`, `core::net::SocketAddrV4`, `core::net::SocketAddrV6`,
`core::net::Ipv6MulticastScope` and `core::net::AddrParseError` 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

Since https://github.com/rust-lang/rust/pull/78802 has been merged, IP and
socket address types are implemented in ideal Rust layout instead of wrapping
their corresponding `libc` representation.

Formatting for these types has also been adjusted in
https://github.com/rust-lang/rust/pull/100625 and
https://github.com/rust-lang/rust/pull/100640 in order to remove the dependency
on `std::io::Write`.

This means the types are now platform-agnostic, allowing them to be moved from
`std::net` into `core::net`.

# 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

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

- Alternatively, move these types into a library other than `core`, so they
can be used without `std`, and re-export them in `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

None.

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

Move the `ToSocketAddrs` trait to `core::net` as well. This depends on having `core::io::Result`.

0 comments on commit fd7c616

Please sign in to comment.