# 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_ipfor ARP (#880) - Honor
any_ipfor 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_endpointgetter (#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::Flagsanddhcpv4::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
TUNSETIFFon 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
listenagain 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
IpPacketsuch 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_sliceandrecv_slice(#834). - dependencies: update to headpless v0.8 (#853).
- config: make
configconstants public (#855). - phy/ieee802154: clarify
mtu+=2for IEEE802.15.4 (#857). - sockets:
recv_slicereturnsRcvError::Truncatedwhen the length of the slice is smaller than the data received by the socket (#859). - iface/ipv6:
get_source_addressuses RFC 6724 for address selection (#864). - pcap: use IEEE 802.15.4 without FCS for PCAP link types (#874).
- iface: rename
IpPacket/Ipv4Packet/Ipv6PackettoPacet/PacketV4/PacketV4. This is to remove the ambiguity withIpPacketinsrc/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
Deviceimpl 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_addrandneighbor_cacheto 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
Errorenum 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::Devicetokens is now infallible.- In the case of "buffer full",
phy::Deviceimplementations must returnNonefrom thetransmit/receivemethods. (Previously, they could either do that, or return tokens and then returnError::Exhaustedwhen 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::Deviceimplementations 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 Devicenow uses Generic Associated Types (GAT) for the TX and RX tokens. The main impact of this isDeviceimpls 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
InterfaceAPI 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)
Interfacenow 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 AnySocketobject-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
peekandpeek_slicemethods (#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_coredep. (#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
defmtlogging support (#455) - Add RNG infrastructure (#547, #573)
- Add
Contextstruct that must be passed to some socket methods (#500) - Remove
SocketSet, sockets are owned byInterfacenow. (#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::Errorforsmoltcp::Error(#485) - Update
managedfrom 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
DeviceinPcapWriter(#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::Illegalis 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-dhcpv4feature 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)