# Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
No unreleased changes yet. Please send PRs!
0.12.0 - 2024-11-28
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.
- Minimum Supported Rust Version (MSRV) bumped to 1.80.
- iface
- IPv6 multicast (#914, #976, #988, #1009, #1012)
- Add
poll_egress()
andpoll_ingress_single()
methods for finer-grained control of what and how many packets are processed. (#954, #991, #993) - Multicast join/leave no longer requires access to device+timestamp. (#985)
- Reset expiry of entries in the neighbor cache on packet reception (#966)
- Honor
any_ip
for ARP (#880) - Honor
any_ip
for IPv6 (#900) - Use own source address for ARP and NDISC Solicitations (#984)
- fix panic when discarding HBH Option with multicast destination address (#996)
- fix panic with 6lowpan frag datagram_size < 40 (#997)
- fix panic if no suitable IPv6 src_addr is found (#895)
- Fix specific length IP packets not being fragmented (#1008)
- tcp
- Add support for congestion control (#907)
- Add support for simultaneous open (#1001)
- Add support for Timestamp option (#939)
- Send immediate ACKs after RMSS bytes of data (#1002)
- Do not ignore FIN if segment is partially outside the window. (#977)
- Correctly set internal sACK flag for client sockets (#995)
- Only reset remote_last_ts if some data is enqueued (#917)
- Don't delay ACKs for significant window updates (#935)
- Add
listen_endpoint
getter (#1005)
- socket
- phy
- wire
- Use core::net types for IP addresses. (#937, #994)
- Add missing exports in wire for DNS (#891)
- rename Scope to MulticastScope (#898)
- Re-export
dhcpv4::Flags
anddhcpv4::OpCode
(#901) - Make Address:v6() constructor const (#975)
- Ipv6RoutingHeader::clear_reserved: fix offsets for Type 2 routing headers. (#882)
0.11.0 - 2023-12-23
- wire/ipsec: add basic IPsec parsing/emitting (#821).
- phy: add support for
TUNSETIFF
on MIPS, PPC and SPARC (#839). - socket/tcp: accept FIN on zero window (#845).
- wire/ipv6: add
is_unique_local()
to IPv6 addresses (#862). - wire/ipv6: add
is_global_unicast()
to IPv6 addresses (#864). - iface/neigh: add
fill_with_expiration
(#871).
- icmpv6: truncate packet to MTU (#807, #808).
- wire/rpl: DAO-ACK DODAG ID was wrongly read (#824).
- socket/tcp: don't panic when calling
listen
again on the same local endpoint (#841). - wire/dhcpv4: don't panic when parsing addresses with incorrect amount of bytes (#843).
- iface/ndisc: prevent ndisc when the medium is IP (#865).
- wire/ieee802154: better parsing of security fields. Correctly parse frame type (3 bits instead of 2 bits) (#868).
- wire/ieee802154: better handle address fields for new frame version (#870).
- iface/tcp: don't send TCP RST with unspecified addresses (#867).
- iface: don't handle empty packets (this would panic when reading the IP version) (#866).
- socket/dhcp: Add an upper bound to the renew/rebind timeout in
RetryConfig
(#835).
- iface: rewrite
IpPacket
such that IPv6 packets can contain owned extension headers (#802). - iface: remove generic
T: [u8]
in functions. This reduced the server example by 10KB (#810). - SocketSet: add comment about using static lifetime for SocketSets with owned storage (#813).
- phy/RawSocket: open raw socket with
O_NONBLOCK
(#817). - tests/rstest: use rstest for fixture based testing (#823).
- docs/readme: update readme about IEEE802.15.4 and 6LoWPAN (#826).
- wire/ipv6-hbh: IPv6 HBH has owned options instead of references (#827).
- wire/sixlowpan: 6LoWPAN is split into multiple modules (#828).
- sockets: match the behaviour of
peek_slice
andrecv_slice
(#834). - dependencies: update to headpless v0.8 (#853).
- config: make
config
constants public (#855). - phy/ieee802154: clarify
mtu+=2
for IEEE802.15.4 (#857). - sockets:
recv_slice
returnsRcvError::Truncated
when the length of the slice is smaller than the data received by the socket (#859). - iface/ipv6:
get_source_address
uses RFC 6724 for address selection (#864). - pcap: use IEEE 802.15.4 without FCS for PCAP link types (#874).
- iface: rename
IpPacket
/Ipv4Packet
/Ipv6Packet
toPacet
/PacketV4
/PacketV4
. This is to remove the ambiguity withIpPacket
insrc/wire/
(#873). - wire/ndisc: rewrite parse function (3.1KiB -> 1.9KiB) (#878)
- iface: Check IPv6 address after processing HBH (#861)
0.10.0 - 2023-06-26
-
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:
- add support for sending to subnet-local broadcast addrs (like 192.168.1.255). (#801)
- Creating an interface requires passing in the time. (#799)
- fix wrong payload length of first IPv4 fragment (#791, #792)
- Don't discard from unspecified IPv4 src addresses (#787)
-
tcp:
- do not count window updates as duplicate acks. (#748)
- consider segments partially overlapping the window as acceptable (#749)
- Perform a reset() after an abort() (#788)
-
6lowpan:
- Hop-by-Hop Header compression (#765)
- Routing Header compression (#770)
-
wire:
- reexport DNS opcode, rcode, flag. (#763, #806)
- refactor IPv6 Extension Headers to make them more consistent and easier to parse. (#781)
- check length field of NDISC redirected head (#784)
-
Modify
hardware_addr
andneighbor_cache
to be notOption
, addHardwareAddress::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)
0.9.1 - 2023-02-08
- iface: make MulticastError public. (#747)
- Fix parsing of ieee802154 link layer address for NDISC options (#746)
0.9.0 - 2023-02-06
- Minimum Supported Rust Version (MSRV) bumped from 1.56 to 1.65
- Added DNS client support.
- Add DnsSocket (#465)
- Add support for one-shot mDNS resolution (#669)
- Added support for packet fragmentation and reassembly, both for IPv4 and 6LoWPAN. (#591, #580, #624, #634, #645, #653, #684)
- Major error handling overhaul.
- Previously, smoltcp had a single
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) - Consuming
phy::Device
tokens is now infallible.- In the case of "buffer full",
phy::Device
implementations must returnNone
from thetransmit
/receive
methods. (Previously, they could either do that, or return tokens and then returnError::Exhausted
when consuming them. The latter wasted computation since it'd make smoltcp pointlessly spend effort preparing the packet, and is now disallowed). - For all other phy errors,
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 toInterface::poll()
is no longer supported.
- In the case of "buffer full",
- Previously, smoltcp had a single
- phy: the
trait Device
now uses Generic Associated Types (GAT) for the TX and RX tokens. The main impact of this isDevice
impls can now borrow data (because previously, thefor<'a> T: Device<'a>
bounds required to workaround the lack of GATs essentially impliedT: 'static
.) (#572) - iface: The
Interface
API has been significantly simplified and cleaned up.- The builder has been removed (#736)
- SocketSet and Device are now borrowed in methods that need them, instead of owning them. (#619)
Interface
now owns the list of addresses (#719), routes, neighbor cache (#722), 6LoWPAN address contexts, and fragmentation buffers (#736) instead of borrowing them withmanaged
.- A new compile-time configuration mechanism has been added, to configure the size of the (now owned) buffers (#742)
- iface: Change neighbor discovery timeout from 3s to 1s, to match Linux's behavior. (#620)
- iface: Remove implicit sized bound on device generics (#679)
- iface/6lowpan: Add address context information for resolving 6LoWPAN addresses (#687)
- iface/6lowpan: fix incorrect SAM value in IPHC when address is not compressed (#630)
- iface/6lowpan: packet parsing fuzz fixes (#636)
- socket: Add send_with to udp, raw, and icmp sockets. These methods enable reserving a packet buffer with a greater size than you need, and then shrinking the size once you know it. (#625)
- socket: Make
trait AnySocket
object-safe (#718) - socket/dhcpv4: add waker support (#623)
- socket/dhcpv4: indicate new config if there's a packet buffer provided (#685)
- socket/dhcpv4: Use renewal time from DHCP server ACK, if given (#683)
- socket/dhcpv4: allow for extra configuration
- setting arbitrary options in the request. (#650)
- retrieving arbitrary options from the response. (#650)
- setting custom parameter request list. (#650)
- setting custom timing for retries. (#650)
- Allow specifying different server/client DHCP ports (#738)
- socket/raw: Add
peek
andpeek_slice
methods (#734) - socket/raw: When sending packets, send the source IP address unmodified (it was previously replaced with the interface's address if it was unspecified). (#616)
- socket/tcp: Do not reset socket-level settings, such as keepalive, on reset (#603)
- socket/tcp: ensure we always accept the segment at offset=0 even if the assembler is full. (#735, #452)
- socket/tcp: Refactored assembler, now more robust and faster (#726, #735)
- socket/udp: accept packets with checksum field set to
0
, since that means the checksum is not computed (#632) - wire: make many functions const (#693)
- wire/dhcpv4: remove Option enum (#656)
- wire/dhcpv4: use heapless Vec for DNS server list (#678)
- wire/icmpv4: add support for TimeExceeded packets (#609)
- wire/ip: Remove
IpRepr::Unspecified
,IpVersion::Unspecified
,IpAddress::Unspecified
(#579, #616) - wire/ip: support parsing unspecified IPv6 IpEndpoints from string (like
[::]:12345
) (#732) - wire/ipv6: Make Public Ipv6RoutingType (#691)
- wire/ndisc: do not error on unrecognized options. (#737)
- Switch to Rust 2021 edition. (#729)
- Remove obsolete Cargo feature
rust-1_28
(#725)
0.8.2 - 2022-11-27
- tcp: Fix return value of nagle_enable (#642)
- tcp: Only clear retransmit timer when all packets are acked (#662)
- tcp: Send incomplete fin packets even if nagle enabled (#665)
- phy: Fix mtu calculation for raw_socket (#611)
- wire: Fix ipv6 contains_addr function (#605)
0.8.1 - 2022-05-12
- Remove unused
rand_core
dep. (#589) - Use socklen_t instead of u32 for RawSocket bind() parameter. Fixes build on 32bit Android. (#593)
- Propagate phy::RawSocket send errors to caller (#588)
- Fix Interface set_hardware_addr, get_hardware_addr for ieee802154/6lowpan. (#584)
0.8.0 - 2021-12-11
- Minimum Supported Rust Version (MSRV) bumped from 1.40 to 1.56
- Add support for IEEE 802.15.4 + 6LoWPAN medium (#469)
- Add support for IP medium (#401)
- Add
defmt
logging support (#455) - Add RNG infrastructure (#547, #573)
- Add
Context
struct that must be passed to some socket methods (#500) - Remove
SocketSet
, sockets are owned byInterface
now. (#557, #571) - TCP: Add Nagle's Algorithm. (#500)
- TCP crash and correctness fixes:
- Add Nagle's Algorithm. (#500)
- Window scaling fixes. (#500)
- Fix delayed ack causing ack not to be sent after 3 packets. (#530)
- Fix RTT estimation for RTTs longer than 1 second (#538)
- Fix infinite loop when remote side sets a MSS of 0 (#538)
- Fix infinite loop when retransmit when remote window is 0 (#538)
- Fix crash when receiving a FIN in SYN_SENT state (#538)
- Fix overflow crash when receiving a wrong ACK seq in SYN_RECEIVED state (#538)
- Fix overflow crash when initial sequence number is u32::MAX (#538)
- Fix infinite loop on challenge ACKs (#542)
- Reply with RST to invalid packets in SynReceived state. (#542)
- Do not abort socket when receiving some invalid packets. (#542)
- Make initial sequence number random. (#547)
- Reply with RST to ACKs with invalid ackno in SYN_SENT. (#522)
- ARP fixes to deal better with broken networks:
- UDP: Add
close()
method to unbind socket. (#475, #482) - DHCP client improvements:
- DHCP wire:
- Improve resilience against packet ingress processing errors (#281, #483)
- Implement
std::error::Error
forsmoltcp::Error
(#485) - Update
managed
from 0.7 to 0.8 (442) - Fix incorrect timestamp in PCAP captures (#513)
- Use microseconds instead of milliseconds in Instant and Duration (#514)
- Expose inner
Device
inPcapWriter
(#524) - Fix assert with any_ip + broadcast dst_addr. (#533, #534)
- Simplify PcapSink trait (#535)
- Fix wrong operation order in FuzzInjector (#525, #535)
0.7.5 - 2021-06-28
- dhcpv4: emit DNS servers in repr (#505)
0.7.4 - 2021-06-11
- tcp: fix "subtract sequence numbers with underflow" on remote window shrink. (#490)
- tcp: fix subtract with overflow when receiving a SYNACK with unincremented ACK number. (#491)
- tcp: use nonzero initial sequence number to workaround misbehaving servers. (#492)
0.7.3 - 2021-05-29
- Fix "unused attribute" error in recent nightlies.
0.7.2 - 2021-05-29
- iface: check for ipv4 subnet broadcast addrs everywhere (#462)
- dhcp: always send parameter_request_list. (#456)
- dhcp: Clear expiration time on reset. (#456)
- phy: fix FaultInjector returning a too big buffer when simulating a drop on tx (#463)
- tcp rtte: fix "attempt to multiply with overflow". (#476)
- tcp: LastAck should only change to Closed on ack of fin. (#477)
- wire/dhcpv4: account for lease time, router and subnet options in DhcpRepr::buffer_len (#478)
0.7.1 - 2021-03-27
- ndisc: Fix NeighborSolicit incorrectly asking for src addr instead of dst addr (419)
- dhcpv4: respect lease time from the server instead of renewing every 60 seconds. (437)
- Fix build errors due to invalid combinations of features (416, 447)
- wire/ipv4: make some functions const (420)
- phy: fix BPF on OpenBSD (421, 427)
- phy: enable RawSocket, TapInterface on Android (435)
- phy: fix phy_wait for waits longer than 1 second (449)
0.7.0 - 2021-01-20
- Minimum Supported Rust Version (MSRV) bumped from 1.36 to 1.40
- tcp: Allow distinguishing between graceful (FIN) and ungraceful (RST) close. On graceful close,
recv()
now returnsError::Finished
. On ungraceful close,Error::Illegal
is returned, as before. (351) - sockets: Add support for attaching async/await Wakers to sockets. Wakers are woken on socket state changes. (394)
- tcp: Set retransmission timeout based on an RTT estimation, instead of the previously fixed 100ms. This improves performance on high-latency links, such as mobile networks. (406)
- tcp: add Delayed ACK support. On by default, with a 10ms delay. (404)
- ip: Process broadcast packets directed to the subnet's broadcast address, such as 192.168.1.255. Previously broadcast packets were only processed when directed to the 255.255.255.255 address. (377)
- udp,raw,icmp: Fix packet buffer panic caused by large payload (332)
- dhcpv4: use offered ip in requested ip option (310)
- dhcpv4: Re-export dhcp::clientv4::Config
- dhcpv4: Enable
proto-dhcpv4
feature by default. (327) - ethernet,arp: Allow for ARP retry during egress (368)
- ethernet,arp: Only limit the neighbor cache rate after sending a request packet (369)
- tcp: use provided ip for TcpSocket::connect instead of 0.0.0.0 (329)
- tcp: Accept data packets in FIN_WAIT_2 state. (350)
- tcp: Always send updated ack number in
ack_reply()
. (353) - tcp: allow sending ACKs in FinWait2 state. (388)
- tcp: fix racey simultaneous close not sending FIN. (398)
- tcp: Do not send window updates in states that shouldn't do so (360)
- tcp: Return RST to unexpected ACK in SYN-SENT state. (367)
- tcp: Take MTU into account during TcpSocket dispatch. (384)
- tcp: don't send data outside the remote window (387)
- phy: Take Ethernet header into account for MTU of RawSocket and TapInterface. (393)
- phy: add null terminator to c-string passed to libc API (372)