NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #3647 most downloaded on crates.io
A TCP/IP stack designed for bare-metal, real-time systems without a heap.
Last release 1 months ago
17 Aug 2026
Release timing varies
gaps range from 2 weeks to 1.3 years
Most releases are documented
notes for 17 of 24 stable releases
Nothing withdrawn
no release was ever pulled
10 years old
24 releases · first in 2016
wire: Expose the checksum module publicly, so downstream crates can compute RFC 1071 Internet checksums over discontiguous buffers.
Changes in this release:
checksum module publicly, so downstream crates can compute RFC 1071 Internet checksums over discontiguous buffers. (#1172)defmt to version 1One column per quarter.
tcp: Fix panic when a listening socket receives a SYN from the unspecified addr.
Highlights of this release are IPv6 SLAAC support, TCP improvements (zero window probes, retransmit fixes, RFC compliance), raw socket enhancements, a
Highlights of this release are IPv6 SLAAC support, TCP improvements (zero window probes, retransmit fixes, RFC compliance), raw socket enhancements, and a bump to Rust Edition 2024.
heapless dependency bumped to v0.9. (#1083)slaac feature flag. (#1039)slaac_updated_at method to check when SLAAC addresses were last updated. (#1130)is_ipv4_gateway/is_ipv6_gateway helpers. (#1129)poll, so sockets don't have to wait for the next poll to send queued data. (#1059)Results in consume(). (#1093)any_ip when checking local address. (#1119)iface_max_route_count-0 feature flag to disable the routing table entirely. (#1057)poll_at returning stale timestamps due to silent_until expiry check. (#1127)pause_synack feature flag to allow user code to withhold SYN|ACK. (#1063)no-auto-icmp-echo-reply feature flag to disable automatic echo replies. (#1106)socket-dns is enabled but socket-udp isn't. (#1041)AnySocket for the Socket enum. (#1092)IpRepr. (#1087)Cidr initialization const. (#1036)Endpoint into SocketAddr. (#1124)core::net. (#1115)RawHardwareAddress panic when parsing to specific link-layer address. (#1027)max_resp_code is zero. (#1047)Almost a year in the making, the highlights of the release are the migration to core::net IP types, IPv6 multicast, TCP improvements, and many fixes.
Almost a year in the making, the highlights of the release are the migration to core::net IP types, IPv6 multicast, TCP improvements, and many fixes. Smoltcp now connects your gadgets to the Internet better than ever.
poll_egress() and poll_ingress_single() methods for finer-grained control of what and how many packets are processed. (#954, #991, #993)any_ip for ARP (#880)any_ip for IPv6 (#900)listen_endpoint getter (#1005)dhcpv4::Flags and dhcpv4::OpCode (#901)wire/ipsec: add basic IPsec parsing/emitting ( #821 ).
TUNSETIFF on MIPS, PPC and SPARC (#839).is_unique_local() to IPv6 addresses (#862).is_global_unicast() to IPv6 addresses (#864).fill_with_expiration (#871).listen again on the same local endpoint (#841).RetryConfig (#835).IpPacket such that IPv6 packets can contain owned extension headers (#802).T: [u8] in functions. This reduced the server example by 10KB (#810).O_NONBLOCK (#817).peek_slice and recv_slice (#834).config constants public (#855).mtu+=2 for IEEE802.15.4 (#857).recv_slice returns RcvError::Truncated when the length of the slice is smaller than the data received by the socket (#859).get_source_address uses RFC 6724 for address selection (#864).IpPacket/Ipv4Packet/Ipv6Packet to Pacet/PacketV4/PacketV4. This is to remove the ambiguity with IpPacket in src/wire/ (#873).Add optional packet metadata. Allows tracking packets by ID across the whole stack, between the Device impl and sockets. One application is timestampi
Add optional packet metadata. Allows tracking packets by ID across the whole stack, between the Device impl and sockets. One application is timestamping packets with the PHY's collaboration, allowing implementing PTP (#628)
Work-in-progress implementation of RPL (Routing Protocol for Low-Power and Lossy Networks), commonly used for IEEE 802.15.4 / 6LoWPAN networks. Wire is mostly complete, full functionality will be in 0.11 hopefully! (#627, #766, #767, #772, #773, #777, #790, #798, #804)
dhcp: Add support for rebinding (#744)
iface:
tcp:
6lowpan:
wire:
Modify hardware_addr and neighbor_cache to be not Option, add HardwareAddress::Ip (#745)
Add file descriptor support for tuntap devices, needed for the Android VPN API. (#776)
implement Display and Error for error types (#750, #756, #757)
Better defmt for Instant, Duration and Ipv6Address (#754, #758)
Add Hash trait for enum_with_unknown macro (#755)
iface: make MulticastError public.
Minimum Supported Rust Version (MSRV) bumped from 1.56 to 1.65
Error enum that all methods returned. Now methods that can fail have their own error enums, with only the actual errors they can return. (#617, #667, #730)phy::Device tokens is now infallible.
phy::Device implementations must return None from the transmit/receive methods. (Previously, they could either do that, or return tokens and then return Error::Exhausted when consuming them. The latter wasted computation since it'd make smoltcp pointlessly spend effort preparing the packet, and is now disallowed).phy::Device implementations should drop the packet and handle the error themselves. (Either log it and forget it, or buffer/count it and offer methods to let the user retrieve the error queue/counts.) Returning the error to have it bubble up to Interface::poll() is no longer supported.trait Device now uses Generic Associated Types (GAT) for the TX and RX tokens. The main impact of this is Device impls can now borrow data (because previously, thefor<'a> T: Device<'a> bounds required to workaround the lack of GATs essentially implied T: 'static.) (#572)Interface API has been significantly simplified and cleaned up.
Interface now owns the list of addresses (#719), routes, neighbor cache (#722), 6LoWPAN address contexts, and fragmentation buffers (#736) instead of borrowing them with managed.trait AnySocket object-safe (#718)peek and peek_slice methods (#734)0, since that means the checksum is not computed (#632)IpRepr::Unspecified, IpVersion::Unspecified, IpAddress::Unspecified (#579, #616)[::]:12345) (#732)rust-1_28 (#725)tcp: Fix return value of nagle_enable
Use socklen_t instead of u32 for RawSocket bind() parameter. Fixes build on 32bit Android.
Minimum Supported Rust Version (MSRV) bumped from 1.40 to 1.56
defmt logging support (#455)Context struct that must be passed to some socket methods (#500)SocketSet, sockets are owned by Interface now. (#557, #571)close() method to unbind socket. (#475, #482)std::error::Error for smoltcp::Error (#485)managed from 0.7 to 0.8 (442)Device in PcapWriter (#524)dhcpv4: emit DNS servers in repr
tcp: fix "subtract sequence numbers with underflow" on remote window shrink.
Fix "unused attribute" error in recent nightlies.
iface: check for ipv4 subnet broadcast addrs everywhere
ndisc: Fix NeighborSolicit incorrectly asking for src addr instead of dst addr (419)
Minimum Supported Rust Version (MSRV) bumped from 1.36 to 1.40
recv() now returns Error::Finished. On ungraceful close, Error::Illegal is returned, as before. (351)proto-dhcpv4 feature by default. (327)ack_reply(). (353)Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →