# Release Notes

## Version 22.12

The minimum build requirements have been increased as follows:
- Either GCC >= 7.4.0 or Clang >= 6.0 is required on Linux
- On macOS, Xcode 11.3 or later is recommended; older versions may still work but are
  not officially supported
- Boost >= 1.65.1 is required on all platforms
- Sphinx 4.0 or later is required to build the manual pages

chunks:
- Avoid excess window decrease in certain conditions (Issue #5202)
- Use ndn-cxx's `Segmenter` class (Issue #4702)

dissect:
- Recognize several TLV elements that appear in `Certificate` and `SafeBag`
- Remove support for obsolete TLV types

dissect-wireshark:
- Expose `type`, `len`, and `bin` fields

build system:
- Switch to C++17
- macOS 12 (Monterey) and 13 (Ventura) running on arm64 are now supported out-of-the-box
  (Issue #5135)
- CentOS Stream 9 is now supported; CentOS 8 has been dropped (Issue #5181)
- Stop using the `gold` linker on Linux; prefer instead linking with `lld` if installed
- Upgrade `waf` to version 2.0.24

## Version 22.02

Starting with this release, ndn-tools switched to a date-based versioning scheme:
`YEAR.MONTH[.PATCH]` (`YY.0M[.MICRO]` in [CalVer](https://calver.org/) notation).

chunks:
- Add `--naming-convention` command-line option (Issue #5109)
- Increase the default segment size to 8000 bytes

dissect:
- Support `InterestSignature` fields and more types of name components
- The `Content` field is no longer dissected by default; use the new `--content` option
  to enable it
- Minor cosmetic improvements to the tool output

dissect-wireshark:
- Remove support for obsolete TLV elements
- Recognize `ForwardingHint` (Issue #4185)
- Recognize `ParametersSha256DigestComponent`
- Fix decoding of several TLV elements such as `HopLimit` and `PitToken`
- Update the TLV type of `IncomingFaceId` (Issue #5185)

peek:
- Replace `--link-file` option with `--fwhint` and adapt to the new `ForwardingHint`
  format (Issues #4207, #5187)

poke:
- Remove deprecated `--force` option; use `--unsolicited` instead
- Remove deprecated `--identity` and `--digest` options; use `--signing-info` instead
- Change the short form of `--freshness` to `-f`

pingserver:
- Remove deprecated `-x` alias for the `--freshness` option

build system:
- Upgrade `waf` to version 2.0.23

## Version 0.7.1

The build requirements have been increased to require Clang >= 4.0, Xcode >= 9.0, and Python >= 3.6.
Meanwhile, it is *recommended* to use GCC >= 7.4.0 and Boost >= 1.65.1.

This release contains minor build fixes and code cleanups.

## Version 0.7

chunks:
- Add `--no-version-discovery` option to ndncatchunks (Issue #5021)
- Improve CUBIC performance on lossy networks (Issue #5036)
- Switch to ndn-cxx's `RttEstimatorWithStats` class (Issue #4887)
- Remove previously deprecated options `-d` and `-t` from ndncatchunks

ping:
- Change the short form of ndnpingserver's `--freshness` option to `-f`,
  for consistency with ndnputchunks

peek:
- Add `--app-params`, `--app-params-file`, and `--hop-limit` options
- The `--link-file` option now expects a raw binary file
- Print Data name and Nack reason if `--verbose` is specified
- Code cleanup
- Manual page improvements

poke:
- Add `--signing-info` option, replacing `--digest` and `--identity` which are
  now deprecated
- Add `--verbose` option
- Wait indefinitely if `--timeout` is not specified
- The program now exits with status 3 when a timeout occurs and with status 5
  if prefix registration fails
- Rename `--force` option to `--unsolicited`
- Code cleanup
- Major rewrite of the manual page

## Version 0.6.4

chunks:
- Add metadata-based version discovery and remove iterative discovery (Issue #4556)
- Remove manual selection of version discovery method via `-d` option (Issue #4832)
- Implement CUBIC congestion window adaptation in ndncatchunks (Issue #4861)
- Increase the default retransmission limit from 3 to 15 (Issue #4861)
- Improve stats printed by ndncatchunks after transfer completes (Issue #4603)
- Add manual page for ndnputchunks

dissect & dissect-wireshark:
- Follow packet specification changes to renumber the `Parameters` element and
  rename it to `ApplicationParameters` (Issues #4658, #4780)

dump:
- Fix compilation on CentOS 7 (Issue #4852)

pib:
- Completely remove this obsolete and unmaintained tool (Issue #4205)

## Version 0.6.3

chunks:
- Fix impossible RTT values (Issue #4604)
- Add support for RDR metadata in ndnputchunks (Issue #4556)
- Use `PendingInterestHandle` and `RegisteredPrefixHandle` (Issues #4316, #3919)

ping:
- Add systemd unit file for ndnpingserver (Issue #4594)
- Use `PendingInterestHandle` and `RegisteredPrefixHandle` (Issues #4316, #3919)

poke:
- Use `PendingInterestHandle` and `RegisteredPrefixHandle` (Issues #4316, #3919)

build system:
- Upgrade `waf` to version 2.0.14 and other improvements

## Version 0.6.2

The build requirements have been upgraded to gcc >= 5.3 or clang >= 3.6, boost >= 1.58,
openssl >= 1.0.2. This effectively drops support for all versions of Ubuntu older than 16.04
that use distribution-provided compilers and packages.

The compilation now uses the C++14 standard.

chunks:
- Fix AIMD hanging with files smaller than the chunk size (Issue #4439)

dissect-wireshark:
- Show `Name` and `FinalBlockId` as URIs (Issue #3106)
- Improve NDNLPv2 support (Issue #4463)
- Add support for dissecting PPP frames

dump:
- Remove dependency on Boost.Regex
- Stop using tcpdump headers files
- Compile pcap filter with optimizations enabled
- Capture in promiscuous mode by default, add an option to disable it
- Add `-t` option to suppress printing per-packet timestamp
- Properly handle exceptions thrown by `lp::Packet::wireDecode()` (Issue #3943)
- Add UDP port 56363 to the default pcap filter
- Stricter parsing of IP/TCP/UDP headers
- Add IPv6 support
- Code cleanup

poke:
- Use `Face::unsetInterestFilter` instead of `shutdown` (Issue #4642)
- Improve unit testing (Issue #3740)

ping:
- Add `--quiet` option to ndnpingserver (Issue #4673)
- Set `CanBePrefix=false` in Interests sent by ndnping (Issue #4581)
- Code cleanup

## Version 0.6.1

chunks:
- Show correct packet loss stats in final summary (Issue #4437)
- Avoid printing meaningless values when no RTT measurements are available (Issue #4551)

dissect:
- Recognize `CanBePrefix`, `HopLimit`, and `Parameters` TLV elements (Issue #4590)

dissect-wireshark:
- Recognize `CanBePrefix`, `HopLimit`, and `Parameters` TLV elements (Issue #4517)

peek:
- Drop `Selectors` support (Issue #4571)
- Add `-P/--prefix` option to set `CanBePrefix` in the Interest packet

build system:
- Upgrade `waf` to version 2.0.6 and other improvements

## Version 0.6

chunks:
- Change the default Interest pipeline to AIMD (Issue #4402)
- Include RTT stats in final summary (Issue #4406)
- Respect `--retries=-1` in the AIMD pipeline (Issue #4409)
- React to congestion marks by default as a timeout event (can be disabled using
  `--aimd-ignore-cong-marks`) (Issue #4289)
- Print a final summary of the transfer regardless of the pipeline type, and even if
  `--verbose` was not specified (Issue #4421)

## Version 0.5

all:
- Switch to version 2 of certificates, `KeyChain`, and `Validator` (Issue #4089)
- Compilation fixes (Issue #4259)

chunks:
- Make `ndnputchunks` display some output by default; a new `-q` flag makes the tool
  completely silent, except for errors (Issue #4286)
- Refactor `ndnputchunks` options handling
- Reduce initial timeout of iterative version discovery in `ndncatchunks` (Issue #4291)
- Fix potential `ndncatchunks` crash on exit

peek:
- Convert use of `Link` into `ForwardingHint` (Issue #4055)

## Version 0.4

As of this version, NDN Essential Tools require a modern compiler (gcc >= 4.8.2, clang >= 3.4)
and a relatively new version of the Boost libraries (>= 1.54).  This means that the code no
longer compiles with the packaged version of gcc and Boost libraries on Ubuntu 12.04.
NDN Essential Tools can still be compiled on such systems, but require a separate
installation of a newer version of the compiler (e.g., clang-3.4) and dependencies.

chunks:
- Change default version discovery to iterative
- Improve help text of `ndnputchunks`
- Fix `DiscoverVersionIterative` build error
- Modularize Interest pipeline implementation
- Add AIMD congestion control (Issue #3636)
- Code cleanup and improvements

dissect-wireshark:
- Add initial support for NDNLPv2 (Issue #3197)
- Fix potential memory overflow

dump:
- Add support for Linux cooked-mode capture (SLL) (Issue #3061)
- Improve error messages

pib:
- Disable by default (can be compiled with ndn-cxx version 0.5.0)
- Fix compilation error with new version of ndn-cxx library
- Avoid use of deprecated block helpers
- Correct build target path

ping:
- Recognize and trace NACK
- Fix potential divide-by-zero bug in `StatisticsCollector` (Issue #3504)

peek:
- Recognize and properly handle NACK
- Refactor implementation

## Version 0.3

chunks: **New** (pair of) tool(s) for segmented file transfer

peek:
- Allow verbose output
- Switch from `getopt` to `boost::program_options`
- Add `--link-file` option

ping:
- Document ndnping protocol

dump:
- Capture and print network NACK packets
- Update docs to include NACK capture feature

build system:
- Enable `-Wextra` by default
- Fix missing tool name in `configure --help` output
- Fix compatibility with Python 3

## Version 0.2

Code improvements and two new tools:

- PIB service to manage the public information of keys and publish certificates
  (Issue 3018)
- A Wireshark dissector for NDN packets (Issue 3092)

## Version 0.1

Initial release of NDN Essential Tools, featuring:

- ndnpeek, ndnpoke: a pair of programs to request and make available for
  retrieval a single Data packet.
- ndnping, ndnpingserver: reachability testing tools for Named Data Networking.
- ndndump: a traffic analysis tool that captures NDN packets on the wire.
- ndn-dissect: an NDN packet format inspector. It reads zero or more NDN
  packets from either an input file or the standard input, and displays the
  Type-Length-Value (TLV) structure of those packets on the standard output.
