CHANGELOG.md 18 KB

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.

Unreleased

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 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).
      • 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 to Interface::poll() is no longer supported.
  • phy: the 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)
  • 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 with managed.
    • 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 and peek_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 supprt (#455)
  • Add RNG infrastructure (#547, #573)
  • Add Context struct that must be passed to some socket methods (#500)
  • Remove SocketSet, sockets are owned by Interface 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:
    • Fill cache only from ARP packets, not any packets. (#544)
    • Fill cache only from ARP packets directed at us. (#544)
    • Reject ARP packets with a source address not in the local network. (#536, #544)
    • Ignore unknown ARP packets. (#544)
    • Flush neighbor cache on IP change (#564)
  • UDP: Add close() method to unbind socket. (#475, #482)
  • DHCP client improvements:
    • Refactored implementation to improve reliability and RFC compliance (#459)
    • Convert to socket (#459)
    • Added max_lease_duration option (#459)
    • Do not set the BROADCAST flag (#548)
    • Add option to ignore NAKs (#548)
  • DHCP wire:
    • Fix DhcpRepr::buffer_len not accounting for lease time, router and subnet options (#478)
    • Emit DNS servers in DhcpRepr (#510)
    • Fix incorrect bit for BROADCAST flag (#548)
  • Improve resilience against packet ingress processing errors (#281, #483)
  • Implement std::error::Error for smoltcp::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 in PcapWriter (#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 substract 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

New features

  • tcp: Allow distinguishing between graceful (FIN) and ungraceful (RST) close. On graceful close, recv() now returns Error::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)

Fixes

  • 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)

Quality of Life™ improvements

  • Update to Rust 2018 edition (396)
  • Migrate CI to Github Actions (390)
  • Fix clippy lints, enforce clippy in CI (395, 402, 403, 405, 407)
  • Use #[non_exhaustive] for enums and structs (409, 411)
  • Simplify lifetime parameters of sockets, SocketSet, EthernetInterface (410, 413)