fw: ASF: Fix implementation not matching technical report

This commit resolves several issues. First, a bug was discovered
regarding the usage of std::set objects when ranking faces for
forwarding and probing purposes. These objects enforce uniqueness;
however, this is defined based on the comparison function provided.
As no fields that were inherently unique were used to rank faces, this
would mean that a face with matching ranking information as one
inserted previously would be blocked from being inserted into face
ranking for forwarding and probing. We add faceId as a tiebreaker to
ensure deterministic behavior in these cases. We also fix an issue
where the count of consecutive silent timeouts was not properly cleared
upon the receipt of data or when a timeout was marked.

Additionally, this commit replaces previous implementations of the
ranking code for forwarding and probing. This is partially in order
to eliminate bugs introduced by incorrect implementations of the ranking
for probing and forwarding, as well as trying to make the code easier
to understand and maintain. This included removing a specific
optimization in probing by including unmeasured faces in the
ranking rather than have probes to unmeasured faces be ordered
based on undefined metrics (in practice, tied faces were inserted
in route creation order). However, we did make the choice to add
cost as a tiebreaker for working measured faces, as was the case
with the initial implementation for forwarding.

Refs #5310

Change-Id: Iabfdafea764fe24fe6c478a6073734e51aaf9fa1
6 files changed
tree: 3f8ba51d1c0e2ad09fcdc428c17bc6b24e158252
  1. .github/
  2. .jenkins.d/
  3. .waf-tools/
  4. core/
  5. daemon/
  6. docs/
  7. launchd/
  8. systemd/
  9. tests/
  10. tools/
  11. .dockerignore
  12. .gitignore
  13. .gitmodules
  14. .jenkins
  15. .mailmap
  16. AUTHORS.md
  17. autoconfig.conf.sample
  18. CITATION.cff
  19. COPYING.md
  20. Dockerfile
  21. nfd.conf.sample.in
  22. README-dev.md
  23. README.md
  24. waf
  25. wscript
README.md

NFD: Named Data Networking Forwarding Daemon

CI Docs Language Latest version

Overview

NFD is a network forwarder that implements and evolves together with the Named Data Networking (NDN) protocol. Since the initial public release in 2014, NFD has been a core component of the NDN Platform.

The main design goal of NFD is to support diverse experimentation of NDN technology. The design emphasizes modularity and extensibility to allow easy experiments with new protocol features, algorithms, new applications. We have not fully optimized the code for performance. The intention is that performance optimizations are one type of experiments that developers can conduct by trying out different data structures and different algorithms; over time, better implementations may emerge within the same design framework.

NFD will keep evolving in three aspects: improvement of the modularity framework, keeping up with the NDN protocol spec, and addition of other new features. We hope to keep the modular framework stable and lean, allowing researchers to implement and experiment with various features, some of which may eventually work into the protocol spec.

Documentation

See docs/INSTALL.rst for compilation and installation instructions.

Extensive documentation is available on NFD's homepage.

Reporting bugs

Please submit any bug reports or feature requests to the NFD issue tracker.

Contributing

NFD is developed by a community effort. Although the first release was mostly done by the members of NSF-sponsored NDN project team, it already contains significant contributions from people outside the project team (see AUTHORS.md). We strongly encourage participation from all interested parties, since broader community support is key for NDN to succeed as a new Internet architecture.

Contributions to NFD are greatly appreciated and can be made through our Gerrit code review site. If you are new to the NDN software community, please read our Contributor's Guide and README-dev.md to get started.

License

NFD is free software distributed under the GNU General Public License version 3. See COPYING.md for details.