## [0.35.0]
### Added
* Added a ping call to the main program.
* Added `qindesign::network::util::steady_clock_ms` and
`qindesign::network::util::arm_high_resolution_clock` classes that conform to
the _Clock_ C++ named requirement. These can be used with the `std::chrono`
API. The first provides a wrapper for `qnethernet_hal_millis()`. The second
wraps the ARM DWT_CYCCNT cycle counter.
* Added printing chrono clock times to network-up in the main program.
* Added `qindesign::network::util::elapsedTime<Clock>`, a class similar to
`elapsedMillis`, but uses a `std::chrono` Clock.
* Added support to the W5500 driver for interrupts via a pin.
* New _SimpleIPerfServer_ example. It just reads from a socket as fast
as possible.
* Added `write(const void*, size_t)` convenience functions to all
`Print`-like classes.
* New _ChronoClocks_ example that demonstrates how to use the new Clocks and
`std::chrono` features.
* Added `EthernetClass::linkInfo()` to replace `linkSpeed()`,
`linkIsFullDuplex()`, and `linkIsCrossover()`.
* Implemented setting link speed, duplex, and auto-negotiation in Teensy 4.1 and
W5500 drivers.
* Added `driver_reset_phy()` driver function for resetting the PHY.
* Added to `DriverCapabilities`:
* `isAutoNegotiationSettable`
* `isPHYResettable`
* Added call to `qnethernet_hal_deinit_entropy()` in `RandomDevice` destructor.
* Added `RandomDevice::entropy()` to match `std::random_device::entropy()`.
* Added `qindesign::security::random_device` to mimic `std::random_device`.
* New _ElapsedTime_ example that shows how to use the new `elapsedTime` utility.
### Changed
* Improved _Ping_ example by always sending, even if a send fails. It was
stopping on error.
* Changed some sizes to `size_t` instead of `int`:
* `writeFully(client, data, len)` example in the Readme
* `EthernetClass::kMACAddrSize`
* `EthernetClass::maxMulticastGroups()`
* `EthernetClass::dnsServerIP(index)`
* `EthernetClass::setDNSServerIP(index, ip)`
* `DNSClient::maxServers()`
* `DNSClient::setServer(index, ip)`
* `DNSClient::getServer(index)`
* `EthernetClient::maxSockets()`
* `EthernetFrame::maxFrameLen()`
* `EthernetFrame::minFrameLen()`
* `EthernetServer::maxListeners()`
* `EthernetUDP::maxSockets()`
* `MDNSClass::maxServices()`
* Changed `EthernetClass::begin(mac, timeout)` return type to `bool` from `int`.
* Robustness changes:
* Removed all implicit conversions
* Handle all return values in some way
* Reduced the number of #defines in favour of constants, enums, and static
inline functions
* Changed `MDNSClass` to use `std::string` instead of the Arduino `String`.
* Updated examples to be more consistent with each other.
* Changed drivers to always loop until a frame can be sent instead of returning
`ERR_WOULDBLOCK` or NULL.
* Marked _IPerfServer_ example as "Under Repair".
* Now excluding the FCS (Frame Check Sequence) from all frame length-related
definitions and use.
* Made dramatic improvements to the W5500 driver with much better buffering and
how it waits to send frames.
* Updated the W5500 driver's `driver_deinit()` function to power down the PHY.
* Updated drivers to change link settings and get link info as a group. See the
new `LinkSettings` and `LinkInfo` structs.
* Changed all definitions of, uses of, and references to max. and min. frame
length to exclude the FCS (frame check sequence).
* Made `QNETHERNET_ENABLE_PING_SEND` on by default.
* Updated _SNTPClient_ example to use `settimeofday()` to set the time.
* Updated _RandomNumbers_ example to use new
`qindesign::security::random_device` class.
### Removed
* Removed from `EthernetClass` (and replaced with `linkInfo()`):
* `linkSpeed()`
* `linkIsFullDuplex()`
* `linkIsCrossover()`
### Fixed
* Fixed `EthernetClass::ping(ip, ttl)` to return -1 if sending the ping failed.
* Fixed _RawFrameMonitor_ example tag interpretation to split at <=1500 and
assume values in the range 1501-1535 are a type.
* Fixed setting an incorrect register in the entropy module (Teensy 4).
* Changed `DNSClient` to not ignore a zero timeout. This had caused a potential
use-after-scope.
* Added better checks in the driver output for any buffer copy errors.
* Now checking for NULL buffer arguments in `write()` of `EthernetUDP`
and `EthernetFrameClass`.
* Fixed `MDNSClass`:
* Ensure there's final NULs after copying some strings.
* Avoid undefined casting between `void*` and a function pointer.
* Added some NULL argument checking.
* `DNSClient` no longer ignores a timeout of zero. This was causing a potential
use-after-scope.
* Fixed the entropy module (Teensy 4) to not depend on a possibly stale `errno`.
* Clarified in the `EthernetServer` and `EthernetUDP` docs that the `beginXXX()`
functions are non-transactional in that they call `end()` or `stop()` first.
* Fixed connection and listener iteration to first take a snapshot of the lists
so that it's not possible to change the lists while iterating over them.