27 April 2022: dht-0.27

  * Fixed the return value of new_search when no slots are available.
    Thanks to Joel.

16 December 2018: dht-0.26

  * Fixed a bug introduced in 0.25 that prevented replying to find_nodes
    when want was not set.
  * Rename dht_callback to dht_callback_t.  This is an incompatible change.

9 February 2018: dht-0.25

  * Made the sendto function used by the library customisable.  This is an
    incompatible change.
  * Rely on the caller to mark the sockets as nonblocking.  This is an
    incompatible change.
  * Report duplicate searches reliably.  Thanks to Greg Hazel.
  * Increased the number of in-flight queries to 4.  Thanks to Greg Hazel.
  * Implement variable-size buckets (between 8 and 128).  Thanks to Greg
    Hazel.
  * Improved search speed during bootstrap.  Thanks to Greg Hazel.
  * Fixed a bug in the parser that would spuriously insert peers with port
    number 1.  Thanks to Carl Reinke.
  * Added support for the implied_port parameter of the announce_peer
    message.  Thanks to Carl Reinke for pointing out the omission.

18 May 2015: dht-0.24

  * Fixed off-by-one error that dropped find_nodes responses with exactly
    16 nodes.  While forbidden by BEP-5, this is apparently what the good
    folks at BitTorrent are doing.  Thanks to Tomas Brod.

15 May 2015: dht-0.23

  * Changed the limit on the number of nodes in replies to 16.  Thanks to
    Tomas Brod.
  * Fixed a memory leak when initialisation fails.  Thanks to 3null.
  * Fixed a Y2038 issue.  Thanks to Gwiz65.

3 May 2014: dht-0.22

  * INCOMPATIBLE CHANGE: the callback now takes const arguments.
  * Consult the local storage when performing a search, which should
    make bootstrapping of tiny DHTs easier.  Note that we're still not
    performing local stores, since that would require knowing our IP
    address.
  * Don't attempt to flush the debug stream if debugging is disabled.
    This appears to work around a bug in Transmission.

25 July 2011: dht-0.21

  * Blacklisting support.

7 July 2011: dht-0.20

  * Fix compilation on systems that have memmem but don't define HAVE_MEMMEM.

30 April 2011: dht-0.19

  * Fix incorrect parsing of announces.  Thanks to cjdelisle.
  * Relax rate limiting slightly.

20 January 2011: dht-0.18

  * Fix a bug that could cause parse_message to enter an infinite loop
    on overflow.  Thanks to Jordan Lee.

9 January 2011: dht-0.17:

  * Fix a bug that prevented calling dht_init after dht_uninit.
  * Remove the "dofree" parameter to dht_uninit.

23 December 2010: dht-0.16:

  * Change the interface to allow sharing of the UDP socket e.g. with uTP.

1 July 2010: dht-0.15

  * Port to Windows, for the needs of Transmission.

25 March 2010: dht-0.14

  * Fixed ordering of entries in parameter dictionaries.

15 December 2009: dht-0.13

  * Implemented protection against incorrect addresses in the DHT.
  * Tweaked neighborhood maintenance to wake up less often.

11 December 2009: dht-0.12
  * Fixed slightly incorrect formatting of DHT messages.
  * Fixed incorrect debugging message.

22 November 2009: dht-0.11

  * Implemented IPv6 support (BEP-32).
  * Fixed a bug which could cause us to never mark a search as finished.
  * Fixed a bug that could cause us to send incomplete lists in response to
    find_nodes.
  * Limit the number of hashes that we're willing to track.
  * Made bucket maintenance slightly more aggressive.
  * Produce on-the-wire error messages to give a hint to the other side.
  * Added a bunch of options to dht-example to make it useful as
    a bootstrap node.
  * Send version "JC\0\0" when using dht-example.

18 October 2009: dht-0.10

  * Send nodes even when sending values.  This is a violation of the
    protocol, but I have been assured that it doesn't break any deployed
    implementation.  This is also what both libtorrent and uTorrent do.
  * Give up immediately on a search peer when no token was provided.  This
    is a very reasonable extension to the protocol, and certainly doesn't
    break anything.
  * Parse heterogeneous values lists correctly.  This is mandated by BEP 32.

20 September 2009: dht-0.9

  * Fixed incorrect computation of number of nodes.
  * Made the initial bucket split eagerly (speeds up bootstrapping).
  * Fixed initial filling of search buckets (speeds up searches).

28 July 2009: dht-0.8

  * Fixed a crash when expiring the first search on the list.
  * Fixed freeing of the search list when uniniting with dofree = 1.

24 June 2009: dht-0.7

  * Removed the fixed limit on the number of concurrent searches, we now
    use a linked list.
  * Fixed build on FreeBSD (thanks to Humihara and Charles Kerr).

22 May 2009: dht-0.6

  * Fixed a buffer overflow (when reading) in parse_message.
  * Fixed slightly inacurrate metric computation when searching.
  * Removed a slightly inaccurate shortcut when responding to find_nodes.
  * Relaxed the rate-limiting parameters to 4 requests per second.

19 May 2009: dht-0.5

  * Made reading of /dev/urandom a function provided by the user.
  * Implemented the ``v'' extension that identifies node implementations.

18 May 2009: dht-0.4

  * Fixed the handling of tokens in announce_peer messages.
  * Implemented backtracking during search when nodes turn out to be dead.

17 May 2009: dht-0.3

  * Fixed a number of incorrectly formatted messages.
  * Changed reply to find_peers to spread the load more uniformly.
  * Fixed a bug that could cause premature splitting.
  * Implemented rate limiting.
  * Changed some time constants to be less chatty.
  * When determining if a bucket is fresh enough, we now only take replies
    into account.
  * dht_get_nodes now returns nodes starting with our own bucket.
  * Tweaked the memory allocation strategy for stored peers.

17 May 2009: dht-0.2

  * Fixed a crash in dht_uninit.
  * Added support for saving the list of known-good nodes.
  * Changed the interface of dht_nodes to provide the number of nodes that
    recently sent incoming requests.

13 May 2009: dht-0.1

  * Initial public release.
