ndnSIM Release Notes
====================

This file contains ndnSIM release notes.

All of the ndnSIM documentation is accessible from the `ndnSIM website <https://ndnsim.net>`__.

Release 2.9 (NFD 22.02)
-----------------------

- Update the submodule of NFD to version 22.02

  `NFD 22.02 release notes <https://named-data.net/doc/NFD/22.02/RELEASE_NOTES.html>`__

    .. note::
       In order to retrieve the marked versions of ndn-cxx and NFD, use
       ``--recursive`` option to the git clone command or run ``git
       submodule update --init`` after clone, pull, or merge.

- Update the submodule of ndn-cxx to version 0.8.0-18-g4999b2ed

  `ndn-cxx 0.8.0 release notes <https://named-data.net/doc/ndn-cxx/0.8.0/RELEASE_NOTES.html>`__

- Base NS-3 was rebased to version 3.35

- The compilation now uses the C++17 standard.

- Update uses of ``QueueBase::MaxSize`` to ``DropTailQueue<Packet>::MaxSize``

Release 2.8
-----------

- The submodules of NFD and ndn-cxx have been upgraded to version 0.7.0.

  `NFD 0.7.0 release notes <https://named-data.net/doc/NFD/0.7.0/RELEASE_NOTES.html>`__

  `ndn-cxx 0.7.0 release notes <https://named-data.net/doc/ndn-cxx/0.7.0/RELEASE_NOTES.html>`__

    .. note::
       In order to retrieve the marked versions of ndn-cxx and NFD, use
       ``--recursive`` option to the git clone command or run ``git
       submodule update --init`` after clone, pull, or merge.

- With the underlying NFD/ndn-cxx upgrade, ndnSIM now operates with NDN Packet format version 0.3.

- Base NS-3 was rebased to version 3.30.1

- Add Loop-Free In-port Dependent (LFID) route calculation that provides a set of
  loop-free paths (:issue:`4985`)

- Fix wrong behaviour of default Size in ConsumerWindow

- **Remove** legacy content store implementation. Use content store replacement/placement
  policies implemented using NFD routines.

Release 2.7
-----------

Release date: February 24, 2019

Overview
~~~~~~~~

- The submodules of NFD and ndn-cxx have been upgraded to version 0.6.5.

  `NFD 0.6.5 release notes <https://named-data.net/doc/NFD/0.6.5/RELEASE_NOTES.html>`__

  `ndn-cxx 0.6.5 release notes <https://named-data.net/doc/ndn-cxx/0.6.5/RELEASE_NOTES.html>`__

    .. note::
       In order to retrieve the marked versions of ndn-cxx and NFD, use
       ``--recursive`` option to the git clone command or run ``git
       submodule update --init`` after clone, pull, or merge.

- Base NS-3 was rebased to version 3.29

- Following changes in NFD and ndn-cxx codebases, 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.

Improvements and bug fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~

- Update face metric based on simulated p2p link delay (:issue:`4733`)

- Remove and replace the previously deprecated and removed in NS-3.29 ``QueueBase::MaxPackets``

- Update installation instructions

Deprecation
~~~~~~~~~~~

- ndnSIM 2.7 is the last release that supports the legacy content store implementation.  The future versions
  will only include content store replacement/placement policies implemented using NFD routines.  Please
  refer to the latest version of NFD Developer's Guide for more information.

********************************************************************************

Release 2.6
-----------

Release date: August 7, 2018

Overview
~~~~~~~~

- The submodules of NFD and ndn-cxx have been upgraded to version 0.6.2
  (:issue:`4514`).

  `NFD 0.6.2 release notes <https://named-data.net/doc/NFD/0.6.2/RELEASE_NOTES.html>`__

  `ndn-cxx 0.6.2 release notes <https://named-data.net/doc/ndn-cxx/0.6.2/RELEASE_NOTES.html>`__

    .. note::
       In order to retrieve the marked versions of ndn-cxx and NFD, use
       ``--recursive`` option to the git clone command or run ``git
       submodule update --init`` after clone, pull, or merge.

- This will be the last release that supports "old" API for content store implementations.
  Going forward, only NFD-based implementations will be supported.

Improvements and bug fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~

- Add queue length congestion detection and signaling (:issue:`4578`)

- Implement BIC and CUBIC congestion control in ConsumerPcon (:issue:`4672`)

- Fix compilation failure on some systems with Python 3

- Fix outdated and remove deprecated APIs in the examples

- Updates of the ndnSIM documentation.

********************************************************************************

Release 2.5
-----------

Release date: February 23, 2018

Overview
~~~~~~~~

- The submodules of NFD and ndn-cxx have been upgraded to version 0.6.1
  (:issue:`4514`).

  `NFD 0.6.1 release notes <https://named-data.net/doc/NFD/0.6.1/RELEASE_NOTES.html>`__

  `ndn-cxx 0.6.1 release notes <https://named-data.net/doc/ndn-cxx/0.6.1/RELEASE_NOTES.html>`__

    .. note::
       In order to retrieve the marked versions of ndn-cxx and NFD, use
       ``--recursive`` option to the git clone command or run ``git
       submodule update --init`` after clone, pull, or merge.

Improvements and bug fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~

- Fix memory leak related to canceling events scheduled via ndn-cxx's Scheduler interface
  adapted for NS-3 (:issue:`4509`).

- Fix compilation failure with boost >= 1.66 (:issue:`4471`).

- Updates of the ndnSIM documentation.

********************************************************************************

Release 2.4
-----------

Release date: November 1, 2017

Overview
~~~~~~~~

- The submodules of NFD and ndn-cxx have been upgraded to version 0.6.0
  (:issue:`4306`).

  `NFD 0.6.0 release notes <https://named-data.net/doc/NFD/0.6.0/RELEASE_NOTES.html>`__

  `ndn-cxx 0.6.0 release notes <https://named-data.net/doc/ndn-cxx/0.6.0/RELEASE_NOTES.html>`__

- Upgrade the base NS-3 version to ``ns-3.27-22-g90fb309d5`` (:issue:`4311`).

    .. note::
       In order to retrieve the marked versions of ndn-cxx and NFD, use
       ``--recursive`` option to the git clone command or run ``git
       submodule update --init`` after clone, pull, or merge.

    .. note::
       To set the maximum size of the used queue when porting already
       implemented scenarios to ndnSIM 2.4, the QueueBase::MaxPackets attribute
       has to be set instead of DropTailQueue::MaxPackets.

    .. note::
       ndnSIM 2.4 requires the following minimal compiler requirements:
         - g++-4.9 or later (Note:  this is an upgraded requirement from ndnSIM 2.3)
         - Apple LLVM version 7.0.2 or later
         - clang-3.3 or later.

Improvements and bug fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~

- Internal refactoring of dummy keychain to work with security v2 of ndn-cxx
  (:issue:`4306`)

- Updates of the ndnSIM documentation and Technical Report (:issue:`4039`, :issue:`4213`)

  * Added page about community contributions to the simulator.
  * CS tracer documentation update.

********************************************************************************

Release 2.3
-----------

Release date: December 12, 2016

Overview
~~~~~~~~

- The submodules of NFD and ndn-cxx have been both upgraded to version 0.5
  (:issue:`3875`).

  Features of NFD:

    * Adaptive SRTT-based Forwarding strategy has been added.
    * Breaking change -- Configurable policy for admission of unsolicited data packets into the
      content store have been introduced.
    * Introduce mechanism to update properties (e.g., flags, persistency) of
      an existing Face.
    * Breaking change -- ForwarderStatus dataset can now be requested only
      with /localhost/nfd/status/general interest.
    * Breaking change -- Strategy API update. FIB entry is no longer supplied
      to the Strategy::afterReceiveInterest method (i.e., FIB lookup is not
      performed by the forwarding pipelines). When necessary, a strategy can
      request FIB lookup using Strategy::lookupFib.
    * Refactor implementation of RIB Manager to make it uniform with
      other managers.

  Features of ndn-cxx:

    * New transformation API.
    * Introduce Name::deepCopy to allow memory optimizations when working
      with Name objects.
    * New ndn::security::CommandInterestValidator class.
    * New FaceUpdateCommand structure for NFD management protocols.
    * Breaking change - Expose ControlResponse as part of
      Controller::CommandFailCallback.
    * Breaking change - Change security constants to corresponding strongly
      typed enumerations.

    .. note::
       In order to retrieve the marked versions of ndn-cxx and NFD, use
       ``--recursive`` option to the git clone command or run ``git
       submodule update --init`` after clone, pull, or merge.

- Replace NetDeviceFaceLinkService with NetDeviceTransport to add
  full support of NDNLPv2 and, thus, network-layer NACK handling to
  ndnSIM (:issue:`3871`).

  ndnSIM now uses an implementation of nfd::face::Transport that enables the
  full support of NDNLPv2 and the handling of network-layer NACKs generated
  by NFD. NACKs can reach the ndnSIM applications.

  .. note::
     NACK handling by ndnSIM came at the cost of losing the NS3 related
     packet tags. The hopCount tag is now implemented as a tag of a packet
     directly at the NDNLPv2 layer.

New features
~~~~~~~~~~~~

- Enable NACK tracing by the network layer tracers (:issue:`3872`).

- NetworkRegionTable helper was added to allow the configuration
  of the simulated nodes' NetworkRegionTable (:issue:`3806`).

Improvements and bug fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~

- Internal refactoring to use the ndnSIM-specific transport implementation
  (ndn::L3Protocol, ndn::StackHelper, ndn::LinkControlHelper,
  ndn::GlobalRoutingHelper, ndn::Consumer, ndn::Producer).

- Updates of the ndnSIM documentation (:issue:`3876`)

  * Added explanation about the support of NDNLPv2 and its implications.

********************************************************************************

Release 2.2
-----------

Release date: November 11, 2016

Overview
~~~~~~~~

- The submodules of NFD and ndn-cxx have been both upgraded to version 0.4.1
  (:issue:`3560`).

  Features of NFD:

    * Face system is refactored.
    * Data Retrieval using full names is fixed.
    * Allow setting CS capacity to 0.
    * LinkService provides an "adaptation" layer to
      translate between NDN packets and data blocks communicated through Transport.
    * Face provides combines Transport and LinkServices, providing high-level
      interface to work with Interest/Data/Nack packets inside NFD.
    * Networking NACK in pipelines and best-route strategy.
    * Refactored implementation of NFD management.
    * Interest forwarding processes Link included in interest packets.

  Features of ndn-cxx:

    * LocalControlHeader for special signaling between application and NFD has
      been replaced with NDNLPv2 signaling.
    * NDNLPv2 Network NACK support in Face abstraction.
    * New API in Face class to remove all pending Interests.

  .. note::
     In order to retrieve the marked versions of ndn-cxx and NFD, use
     ``--recursive`` option to the git clone command or run ``git
     submodule update --init`` after clone, pull, or merge.

- Replace NetDeviceFace with NetDeviceFaceLinkService and AppFace with
  AppFaceModel to match NFD's v0.4+ Face model (:issue:`3560`).

  ndnSIM (for now) intentionally uses LinkService instead of Transport for
  optimization purposes and in order to preserve ns3::Packet Tags. This
  may be fixed in the future when there is a different mechanism to
  propagate ns3 Tags.

  .. note::
     This version of ndnSIM does not include support for NDNLPv2 and, thus, cannot
     yet be used to simulate network-level NACKs across the simulated nodes.
     This will be addressed in the next release of ndnSIM.

- ndnSIM no longer officially support Ubuntu Linux 12.04, as it now requires
  a more modern compiler version and dependent libraries.

New features
~~~~~~~~~~~~

- The NetDevice address is now represented as a LocalUri instance for
  NetDevice-based Faces (:issue:`2665`).

- Enable configurability of NFD's managers (:issue:`3328`).

  The managers of NFD can be enabled/disabled as specified in a simulation
  scenario.

Improvements and bug fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~

- Bugfix in RandomPolicy for the "old-style" ContentStore implementation.

- Updates of the `ndnSIM 2 Technical Report <https://named-data.net/publications/techreports/ndn-0028-2-ndnsim-v2/>`__

  Technical Report became up-to-date with the latest version of ndnSIM.
  Please see report's change-log for more detailed information.

- Updates of the ndnSIM documentation (:issue:`3835`)

  * Updated out-dated statements about NFD's CS implementation (:issue:`3827`).
  * Added explanation about the limited support of NDNLPv2 and its implications.
  * Fixed description of the ConsumerBatches application.
  * Added homebrew instructions for dependency installation on OS X.
  * Added specification of ndn::CsTracer output format.

********************************************************************************

Release 2.1
-----------

Release date: September 4, 2015

Overview
~~~~~~~~

- Integration with ndn-cxx and NFD codebases has been refactored to include ndn-cxx and
  NFD repositories as git submodules within ndnSIM repository (:issue:`3138`).

  This refactoring simplifies upgrading ndn-cxx and NFD to new versions and prevents old
  simulation code to break because of API changes in newer versions of ndn-cxx library.

  .. note::
     In order to retrieve the marked versions of ndn-cxx and NFD, use ``--recursive``
     option to the git clone command or run ``git submodule update --init`` after clone,
     pull, or merge.

- The official home for ndnSIM codebase has been moved to `GitHub named-data-ndnSIM
  organization <https://github.com/named-data-ndnSIM>`__ (:issue:`3123`):

  * `ndnSIM codebase <https://github.com/named-data-ndnSIM/ndnSIM>`__
  * `Modified version of ndn-cxx <https://github.com/named-data-ndnSIM/ndn-cxx>`__
  * `Modified version of NFD <https://github.com/named-data-ndnSIM/NFD>`__
  * `Modified version of NS-3 <https://github.com/named-data-ndnSIM/ns-3-dev>`__
  * `Modified version of python bindings generator <https://github.com/named-data-ndnSIM/pybindgen>`__

- Modified version of NS-3 was updated to (rebased on top of) version 2.23-dev, with
  ndnSIM codebase adjusted to reflect API changes (:issue:`3122`)

- NFD and ndn-cxx has been upgraded to version 0.3.4 (:issue:`3125`)

New features
~~~~~~~~~~~~

- ndnSIM-specific version of :ndnsim:`ndn::Face` (:issue:`2370`)

  The updated version of :ndnsim:`ndn::Face` specially designed to allow writing
  simulation applications in the same way as real applications.  It is also possible to
  directly use codebase of the existing applications to drive simulations, provided that
  the codebase meets or can be adjusted to meet the requirements listed in
  :doc:`guide-to-simulate-real-apps`.

- Full support for NFD'S RIB manager (:issue:`2370`)

  .. note::
     RIB manager support is currently available only for applications based on ndn-cxx.
     :ndnsim:`FibHelper::AddRoute` and :ndnsim:`FibHelper::RemoveRoute` used by
     :ndnsim:`ndn::Producer` and :ndnsim:`ndn::GlobalRoutingHelper` are currently
     interacting directly with NFD's FIB manager.  This issue will be resolved in the next
     release of ndnSIM (:issue:`3121`)

- Tutorial and example on how to speed up simulations with MPI module of NS-3:
  `<https://ndnsim.net/current/parallel-simulations.html>`__

- Two new helpers to simplify writing basic simulation scenarios:

  - :ndnsim:`ScenarioHelper` leverages C++11 constructs to write scenarios. Example:

    .. code-block:: c++

         ScenarioHelper helper;
         helper.createTopology({
             {"1", "2"},
             {"2", "3"}
           });

         helper.addRoutes({
             {"1", "2", "/prefix", 1},
             {"2", "3", "/prefix", 1}
           });

         helper.addApps({
             {"1", "ns3::ndn::ConsumerCbr",
                 {{"Prefix", "/prefix"}, {"Frequency", "1"}},
                 "0s", "100s"},
             {"3", "ns3::ndn::Producer",
                 {{"Prefix", "/prefix"}, {"PayloadSize", "1024"}},
                 "0s", "100s"}
           });


  - :ndnsim:`FactoryCallbackApp` simplifies creation of basic apps without creating a
    separate class that is derived from ``ns3::Applications``. Example:

    .. code-block:: c++

        class SomeApp
        {
        public:
          SomeApp(size_t initParameter);
          ...
        };

        FactoryCallbackApp::Install(node, [] () -> shared_ptr<void> {
            return make_shared<SomeApp>(42);
          })
          .Start(Seconds(1.01));

Improvements and bug fixes
~~~~~~~~~~~~~~~~~~~~~~~~~~

- Updates of ndnSIM documentation

  * Updated the structure for the `ndnSIM website index page <https://ndnsim.net>`__
  * Updated installation instructions to reflect refactoring and relocation of ndnSIM codebase
  * API documentation (doxygen) improvements
  * Updated list of ndnSIM research papers

- The NDN stack can now be updated to handle any simulation topology changes after
  its initial installation on a node (:issue:`2717`)

- Application ID that appears in :ndnsim:`ndn::AppDelayTracer` output is now ID of the
  application on the node, not ID of the application face that was used previously.

- FibHelper has been extended to support route removals (:issue:`2358`)

- ndnSIM codebase now partially covered with unit-tests (:issue:`2369`, :issue:`3059`,
  :issue:`2783`)

- Bugfixes:

  * In :ndnsim:`ndn::GlobalRoutingHelper::CalculateAllPossibleRoutes` that caused crash in
    some cases (:issue:`2535`)

  * In FailLink and Uplink methods of :ndnsim:`ndn::LinkControlHelper` class that affected
    more links than requested (:issue:`2783`)

  * With hop count of data packets retrieved from the Contest Store of NFD (:issue:`2764`)

  * In :ndnsim:`ndn::Producer` application that caused a wrong dummy signature to be added
    to the constructed data packets (:issue:`2927`)

********************************************************************************

Release 2.0
-----------

Release date: January 13, 2015

Overview
~~~~~~~~

ndnSIM 2.0 is a new release of NS-3 based Named Data Networking (NDN) simulator that went through
extensive refactoring and rewriting. The key new features of the new version:

-  ndnSIM no longer re-implements basic NDN primitives and directly uses implementation from
   `ndn-cxx library (NDN C++ library with eXperimental
   eXtensions) <https://named-data.net/doc/ndn-cxx/>`__.

-  All NDN forwarding and management is implemented directly using source code of `Named Data
   Networking Forwarding Daemon (NFD) <https://named-data.net/doc/NFD/>`__. The current code is based
   on ``a22a2172611b1cb93b2e2f53d9d5da122b384f3e`` commit of `NFD
   repository <https://github.com/named-data/NFD/tree/a22a2172611b1cb93b2e2f53d9d5da122b384f3e>`__.

Note RIB Manager is not yet available in ndnSIM.

-  Packet format changed to the `NDN packet format <https://named-data.net/doc/ndn-tlv/>`__.

-  Code style changes to conform to `ndn-cxx Code Style and Coding
   Guidelines <https://named-data.net/doc/ndn-cxx/current/code-style.html>`__ This change also
   includes renaming of the header and source files: ``*.h`` -> ``*.hpp``, ``*.cc`` -> ``*.cpp``

-  ndnSIM now uses C++11.

New Features
~~~~~~~~~~~~

-  Integration with NFD codebase.
-  A realistic behavior is added to the simulations.
-  Forwarding plane extensions can be used in both ndnSIM simulations and real NFD deployment.
-  Per namespace forwarding strategies for different namespaces (one strategy per namespace).
-  New examples:
-  ``ndn-load-balancer``
-  ``ndn-grid-multiple-strategies``
-  ``ndn-different-strategy-per-prefix``
-  Basic examples using python bindings: ``ndn-simple.py`` and ``ndn-grid.py``
-  Use of the the full-featured NDN packet format.
-  Full-featured support for Interest selectors.
-  Full-featured crypto operations can be simulated (disabled by default).
-  FibHelper to manage FIB entries.
-  StrategyChoiceHelper to manage per-namespace forwarding strategy selection.

Changes
~~~~~~~

-  HopCount tracing now includes only one way network-level hop count (e.g., the number of physical
   links traversed by a packet). Previously, this tracing was round-trip and included applications
   hops.
-  Python bindings have changed and, due to limitations of pybindgen, currently cover a smaller
   subset of C++ code (`Task #2341 <https://redmine.named-data.net/issues/2341>`__).
-  LinkControlHelper now uses ErrorRate to simulate link failure/recovery. Previously it was relying
   on Up/Down flag on NDN level.
-  The Face abstraction of NFD is now used.

Bug fixes
~~~~~~~~~

-  Fix processing files with customized LossRate or Queue model in AnnotatedTopologyReader `Bug
   #2354 <https://redmine.named-data.net/issues/2354>`__.

Removals
~~~~~~~~

-  PyNDN emulation
-  (temporarily) ApiFace. Will be replaced with emulation of ndn-cxx ``ndn::Face`` in future
   releases (`Issue #2370 <https://redmine.named-data.net/issues/2370>`__).
-  (temporarily) UdpFace, TcpFace (`Issue #2371 <https://redmine.named-data.net/issues/2371>`__).
-  Limits, LimitsWindow, LimitsRate.
-  PIT, FIB with "replacement" policies.
-  Old deprecated packet formats.
