Release Notes for DTN2
----------------------
2.9.0 (July 2012)

Note: DTN2 Release 2.9.0 requires Oasys Release 1.6.0.

New features:
=============
- Added new API functions to support dtn_peek and dtn_open_with_IP. Added 
  new application dtnpeek to exploit dtn_peek.  Added options to various
  applications to allow use of dtn_open_with_IP.

    * dtn_peek allows applications to inspect bundles intended for
      a registration but without deleting from the queues in the 
      daemon.

    * dtn_open_with_IP allows an application to access a dtnd 
      via its IP address and port.

- Added configuration option (--enable-scriptapis) to control whether 
  PERL, PYTHON and TCL APIs are built.

- Added configuration options to allow use of MySQL and SQLite storage
  options via ODBC using new capabilities in Oasys 1.6.0.

- Added support for the Bundle Protocol Query (BPQ) block, enabled 
  with --with-bpq configure option and including:

    * Block processor chain for BPQ blocks

    * Provision of and management of a cache of bundles and bundle
      fragments containing BPQ blocks where the value of the query 
      string in the BPQ block is used to identify bundles.

    * Management of the BPQ cache using a least recently used (LRU)
      algorithm and potentially a limited size for the cache.

    * Handling of four types of BPQ blocks (QUERY, RESPONSE,
      RESPONSE_DO_NOT_FRAGMENT, PUBLISH) in bundles:

        + PUBLISH blocks: bundles entered into cache when received
          and possibly forwarded further depending on destination EID

        + RESPONSE blocks (both kinds): bundles generated as responses to
          QUERY blocks when query string matches a cached bundle's string
          and directed to source of bundle with QUERY block.
          May be cached by any node through which they pass.

        + QUERY block: usually with an empty payload.  Query string is
          compared to query strings in cached bundles and a RESPONSE
          bundle generated if there is a match. The bundle is not further
          forwarded if a complete RESPONSE bundle canbe found, but will be
          forwarded if only incomplete fragements are found or there is no
          match at all.

    * Flexible matching algorithm (only exact match currently implemented)

    * New applications supporting BPQ blocks:

        + dtnquery - generates bundles with BPQ QUERY block and a query 
          string.  Can also act as receiver for any responses generated.

        + dtnrespond - fields any bundles arriving at an endpoint with a BPQ
          QUERY block that have not triggered a RESPONSE from an 
          intermediate node and generates bundles with BPQ RESPONSE block 
          and payload.  Intended to be used with an external list of 
          potential matching strings that can be used to generate responses.

        + dtnpublish - generates bundles with BPQ PUBLISH block and a payload.
          Intended to populate the caches of nodes that forward the bundle.

    * Bundles inserted into the cache are held until either their expiry time
      is reached or they are expelled from the cache because capacity has been
      reached. The LRU list is used to identify the candidates to be expelled
      if the cache overflows its size limit.

    * Response bundles carry their original source EID and creation timestamp
      as well as the identifier and timestamp of the node that created the 
      response.

    * Provide configuration commands to control BPQ processing and caching:
        + bpq enabled [true|false] - turn BPQ caching mechanisms on/off
        + bpq cache_size <# of octets> - select size of cache (0 => infinite)
        + bpq list - list bundles in BPQ cache with their keys
        + bpq lru - list keys in BPQ in (reversed) LRU order

- Added various features to LTP (Licklider transmission protocol) convergence
  layer:

    * Setup for LTPlib red/green separation ("rg" parameter).

    * Added ION compatibility mode parameter ("ion_mode"). Uses LTP_SO_ION 
      socket option for ltplib.

    * Allow sending and receiving of more than one bundle in an LTP block.

    * Move rg and ion_mode LTP convergence layer parameters to their rightful
      place in the convergence layer data structure:

        + These parameters were initially placed in the Link parameters 
          structure.  Since they are LTP specific this is inappropriate.  
          The reason for this was essentially that the 'link set_cl_defaults' 
          command was not implemented for the LTP convergence layer (the method 
          set_link_defaults was not implemented).

        + This method has now been implemented and the parameters moved 
          to the convergence layer specific parameters area.

- Improved help text for convergence layer parameter setting commands.

- Added configuration commands to allow use of ODBC-based SQL storage 
  capabilities added in Oasys release 1.6.0:

    * Storage types odbc-mysql and odbc-sqlite added

    * Storage types odbc, mysql and postgres removed

    * Storage configuration commands odbc_schema_pre_creation and 
      odbc_schema_post_creation specifying file names with SQL schema
      creation commands to be run pre and post main table creation.

    * Storage configuration command odbc_mysql_keep_alive_interval 
      specifies time in seconds between refreshes of connection to
      MySQL database server.

    * See also configuration commands for ODBC specified with Oasys.

- Added support for bundles_aux table in SQL storage database:

    * Uses BundleDetail class.

    * Schema for bundles_aux table specified in odbc_schema_pre_creation
      file, with triggers in odbc_schema_post_creation.

    * Relationship between bundle class data fields and columns
      in bundles_aux specified by calls of BundleDetail::add_detail 
      in BundleStorage.cc.

    * Use of bundles_aux is turned on by storage set odbc_use_aux_tables.

    * SQL triggers ensure that there is a strict one-to-one relationship
      between rows in bundles and bundles_aux with the same key.

- Added support for persistent link names:

    * Turned on storage names of link instances in links table of database.
      The keys for this table are the (string) names of the links.

    * On restart of the daemon read the link instances back into a list of
      previous links.  

    * When new links are created check that if the link has a name that 
      is already in the previous links list then the new version is 
      consistent with the old version.  

        + For links other than OPPORTUNISTIC type this means that they 
          must have the same nexthop, type and convergence layer.  

        + For OPPORTUNISTIC links the remote_eid must be the same.  

    * Links created by the DTN configuration file are tested for 
      consistency during startup of the Bundle daemon as the link 
      information cannot be read in until the storage configuration
      has been established. 

    * Thereafter consistency is tested as the link is created.  

    * The treatment of convergence layer link parameters has
      been made consistent so that they can be properly 
      serialized and deserialized into a new parameter structure 
      of the appropriate type.  This included the pseudo-links 
      created in the DTN2 simulator. In future this will allow 
      the previous links to be used to reincarnate any links 
      that were manually configured during a run of the daemon.

    * Once a link name has been used in a bundle forwarding log (whether
      or not the bundle is still present in the cache) the persistent link
      information cannot be deleted.  

    * However up to that time links can be fully deleted.  

        + This allows the user to recover from finger trouble
          when a link is created incorrectly.  

    * The 'link dump' command has been enhanced so that both current 
      and previous links are shown:

        + For individual links, if a name is used in both current and 
          previous lists the information for the current link will be displayed. 

- Completed support for Bundle Security Protocol (BSP):
    * Implemented remaining security block types (other than Bundle Integrity Block)

Bug Fixes:
==========

- Corrected replay_action parameter on internal ping and dtlsr registrations 
  so that bundles deferred are NOT passed to registration when dtnd is
  restarted.

- Corrected link to paper by Michael Demmer et al describing DTN2 implementation
  in manual.

- Several minor bugs in LTP CL fixed.

- Various improvements to tests of LTP CL, dtnping and dtnperf.

- Stopped dtnping requesting bundle expiration deletion reports.

- Rejuvenated DTN2 simulator (now works again after several years).

- Corrected API server treatment of API blocks and locally generated 
  metadata blocks: previously these blocks were not included in data 
  passed to applications by dtn_recv method.

- Fixed race condition in which newly received bundles were interleaved
  with previously received but deferred bundles when restarting a link, 
  resulting in misordering of bundle transmission.

- Corrected inadvertant change to dbdir value in default dtn.conf file.

- Fixed compilation error in servlib/prophet/PointerList.h.


2.8.0 (August 2011)
-----------------

- Added the ability for the DTN2 router component to modify locally-generated bundles before
  they are delivered to local registrations (destination applications that use the same DTN2
  daemon as the sender).

- Added support for transactionalized access to the DTN2 database used to store metadata
  (bundle headers and application registration information).

- Added support for ODBC databases as a peer to the other database types provided with
  the base open-source distribution (e.g. file-based, BerkeleyDB).

- Added support for flexible and efficient synchronization to disk, allowing the
  implementation to run in ACI (atomicity, consistency, isolation) mode with
  synchronization to disk (ACID mode) with every Nth transaction.

- For the ODBC database implementation, added support for loading external (non-DTN2)
  schema for on database initialization.

- Ensured that all required data structures are in fact synchronized to disk.

- Added the ability for applications to acknowledge receipt of bundles to the DTN2 stack.

- Added support for a class of DTN router-private (or any DTN component-private) event types.

- Augmented the DTN2 application registration mechanism to allow applications to provide their
  own unique token on registration (to support applications with no local storage).

- Modified the oasys locking and debugging infrastructure to allow non-oasys threads to take
  locks without hanging the debugging machinery.

- Added support for nested event processing.

- Changed DTN2's DAEMON_SHUTDOWN event to NOT be a daemon-only event.

- Fixed a bug in the bundle find functions to prevent problems searching for bundles that are in
  the process of being deleted.

- Fixed a bug in the bundle metadata processing to ensure that metadata blocks for locally-
  generated bundles are correctly restored when the DTN2 daemon is restarted.

- Fixed a bug in the DTN2 IP Discovery module that was setting the socket options incorrectly 
  (more specifically, setting the correct option for the wrong socket) and generating copious 
  warnings in the log file.

- miscellaneous bug fixes

- dtnd-control augmentations for query of dtnd

- Support for the age extension block draft-irtf-dtnrg-bundle-age-block-01

- Logging changes from the N4C summer 2010 trials. Facilitates tracing a bundle across multiple 
  nodes without debug logging by providing bundle creation time. 

- IPN naming scheme support

- Compressed Bundle Header Encoding (CBHE) support

- Update file/class/internal names to BSP draft

- Addition of AX.25 Connected Mode CL and the SeqpacketConvergenceLayer abstraction. 


2.7.0 (February 2010)
-----------------

- Additions and updates to the DTN2 documentation (Please
  see DTN2/doc/manual/index.html). Documentation and examples provided
  for configuration file and command line options, arguments and syntax
  for routing protocols and algorithms, storage back ends, CLAs, link,
  interface, discovery, logging and debug parameters.

- Additions and updates to the tcl commands for link, storage, bundle, route,
  discovery, and interface to provide detail on available options
  and arguments and syntax when help is requested.

- Various other minor updates and bugfixes including Ubuntu 9.10
  (karmic) compatibility and compensate for lack of "hyper" type in xdr.

- Change of build to stop creation of oasys-->../oasys symlinks which
  lead to recursion within oasys (i.e. /oasys/include/oasys/include/oasy..n 
  & oasys/share/oasys/share/oa..n).

- Provide more searches and feedback during build. 

- Support for 64-bit creation time, sequence number, and expiration time.

- Addition of dtnsource and dtnsink stress-test programs. 

- A NORM convergence layer (experimental) requires the NORM protocol 
  implementation from NRL see the installation doc 

- A LTP convergence layer requires the LTPlib protocol implementation 
  from Trinity College Dublin see the installation doc 

- Added code to check if TCP Convergence Layer needs to send/receive ACKS.
  Fix of issue related to sending bundles that are larger than the link 
  MTU from ION to DTN2

- servlib/bundling/BundleDaemon.cc::event_handlers_completed: Correct sanity checking.

- Fix PrOPHET problems: dtnping does not reply & dtnd segfaults after a while

- DTNPerf 2.6 release.

2.6.0 (July 2008)
-----------------

- Updated the source control system to mercurial, splitting the oasys
  library into a fully separate package and changing the configuration,
  build, and packaging accordingly.

- Added a session layer with a publish / subscribe based interface and
  multicast capabilities as well as the ability to order bundles by
  sequence identifier and express that prior transmissions should be
  proactively deleted in-network.

- Updated DTLSR to support the session layer and route advertisements
  as well as miscellaneous other bug fixes.

- Restructured the core forwarding path and the router <-> convergence
  layer interface, getting rid of the BUSY state management and
  (hopefully) improving stability and scalability.

- Changed the contract between the core forwarding logic and the
  router implementation to give the router better control over when
  bundles are deleted from the system.

- Changed the Bundle class internals to make all member variables
  private, adding accessor functions for manipulation and state
  retrieval and improve efficiency in internal storage.

- Added additional API function accesses through the SWIG interface and
  parse status reports that are returned to the app. Also removed the
  limitation on the size of bundles that can be returned in memory.

- Added a fix so that bundles aren't delivered twice to the same
  registration and changes to the core forwarding path to support
  modified topologies.

- Incorporated patches from BBN to fix bugs during shutdown, more
  efficient comparisons, memory leak and dangling pointer fixes, and
  modified handling of duplicate bundles.

- Fixed a bunch of bugs in the dtntunnel application.

- Incorporated various updates to the prophet implementation from Jeff
  Wilson.

- Various other minor updates and bugfixes including Mac OS X 10.5
  (Leopard) compatibility.


2.5.0 (October 2007)
-------------------
- Integrated support for the Bundle Security Protocol blocks,
  contributed by SPARTA.

- Using SWIG, added bindings to export a version of the application
  interface to different scripting languages, currently supporting
  Tcl, Python, and Perl.

- Implemented a polling feature in the API so applications can use
  select() to wait for bundle arrivals on the IPC handle.

- Added a dtnhttpproxy application to route http requests over a DTN
  network.

- Add a feature to the routing table to allow routes to point to
  alternate endpoint id instead of only a next hop link.

- Fixed the compilation errors in the 2.4.0 release when trying to
  build external components. Changed the default configuration for
  these components to be enabled by default to avoid this oversight in
  the future.

- Fixed the rpm specification file so the rpm builds work again.

- Minor miscelleneous other bug fixes and features.

2.4.0 (July 2007) 
-----------------

- BBN updated the protocol implementation to conform to BP spec
  version 10, implementing bundle protocol version 5, converting most
  fixed-length fields to SDNVs and several other changes.

- BBN added support for external convergence layers and data stores,
  matching the DTN reference architecture specification, as well as
  support for deleting links.

- BBN added support for the metadata extension block and improved
  fragmentation handling.

- Added a new router implementation called DTLSR (Delay Tolerant Link
  State Routing) intended for environments where the inter-node
  relationships are fairly stable, but links may go up and down.

- Added support for forwarding a bundle with a wildcard destination to
  multiple next-hops, which can be used to implement simple or
  constrained flooding even with the static router.

- Significantly improved the DTN simulator environment including
  adding support for bandwidth and storage limits on nodes, a
  structured output format for better post-processing of simulation
  results, and an internal restructuring making the simulation
  environment match the real-world environment much more closely.

- Reworked the internal class used to represent bundle payloads so
  that the router can now support fully in-memory bundles which can
  safely contain binary data in all cases.

- Jeff Wilson did a complete rewrite of the Prophet router
  implementation.

- Changed the API to include bundle creation timestamp when receiving
  a bundle so that it's available to applications that may need it.

- Added support for neighbor discovery that uses multicast dns (aka
  Apple's Bonjour protocol). Reworked the internal structure of the
  neighbor discovery subsystem.

- Made optimizations to the table based routers (including the default
  static router) to be more efficient when links are coming up and
  down.

- Updated the dtntunnel application to support tunnelling protocols
  where the server side is the first to send data. Reworked command
  line arguments to be more intuitive (and similar to ssh tunnels).

- Added a dtntraceroute application that sends a single bundle, with a
  bunch of status report flags turned on and prints out the times
  embedded in the status reports that come back.

- Modified the build environment to enable liboasys and libdtnapi to
  be built as shared libraries, and thereby used via SWIG export to
  other programming languages.

- Resurrected the Cygwin build though it's not yet back to full
  functionality.

2.3.0 (December 2006)
---------------------

- Rewritten and documented TCP convergence layer, with support for
  bidirectional communication over a single socket.

- Default port used by TCP & UDP convergence layers is now 4556, newly
  registered with IANA.

- Improvements to the Bluetooth convergence layer (by Jeff Wilson) to
  use the same common stream based convergence layer base class as is
  used by TCP.

- Refactored bundle protocol handling code into separate block
  processing modules allowing for easier integration of security and
  other extension blocks.

- Integrated full support for extension blocks.

- External router interface (by MITRE) using XML to communicate
  between the router and the daemon.

- Initial support for a neighborhood discovery mechanism (by Jeff
  Wilson) using either UDP multicast/broadcast or Bluetooth's builtin
  service discovery protocols.

- Major enhancements to the Prophet router implementation (by Jeff
  Wilson).

- Added dtntunnel and dtncat applications. Reworked and enhanced the
  dtnping application.

- Modified the core for 64-bit compatibility.

- Various stability and performance improvements.

- Resurrection of the dtnsim simulator (by Seguti Gutierrez-Nolasco)
  for simple bundle transmission.

- Switched most of the code from the Intel Open Source License to the
  Apache License.

2.2.0 (March 2006)
------------------

- Various changes for conformance with version 4 of the bundle
  protocol as specified in the Bundle Protocol Internet Draft, as
  released on November 2005.

- Initial implementation of custody transfer, including
  flexible per-route timing specifications for retransmissions.

- Initial implementation of a Bluetooth convergence layer from Jeff
  Wilson <Jeff_Wilson@baylor.edu>.

- Added support for the ARM architecture, gcc 4.0, and BerkeleyDB 4.4.

- Added support for a file system based persistent storage
  implementation as an alternative to Berkeley DB.

- Many minor changes to improve stability and robustness of the code,
  largely due to an improved testing infrastructure including several
  tcl based system tests.

- Miscellaneous other improvements including: a persistent
  ForwardingLog for each bundle to maintain the history of where (and
  when) the bundle was sent to peers, restored support for reactive
  fragmentation, a NullConvergenceLayer and other testing hooks, and
  some scalability improvements.

2.1.99 (December 2005)
----------------------

- Widespread changes for conformance to the latest version of the
  bundle protocol specification document including replacing the
  region/admin syntax and BundleTuple class with a new EndpointID
  class that is a standard URI, and replacing fixed-length values in
  the protocol with SDNVs.
  
  ** NOTE: Due to time constraints, this task was not completed, so
     this release does not include the full bundle spec support,
     though the next one will.

- Completed implementation of expiration timers for both bundles and
  application registrations, as specified by the protocol document and
  architecture specification.

- Removed the use of AddressFamily classes from the configuration of
  the Interface and Link classes, moving the address specification
  into the convergence layer specifically.

- Faster and more robust configure scripts, including support for
  configuring a build directory that's different from the source
  directory. Improved build system so make -j works to build in
  parallel. Add support for the gcc-4.0 series of compilers.

- Other minor cleanup of Bundle class field names and associated
  types to match the protocol document more clearly.

- Rework some of the RPC API to have the daemon construct an
  appropriate endpoint id (in a scheme-specific manner).

- Significant rework of the control flow of Bundles through the
  system, including the state machine for Links, a reduction in the
  number of BundleList queues around the code, and an overall
  simplification of the control flow.

- Update the TCP and UDP convergence layers: removed fixed-width
  length fields from TCP; added pipelining so multiple bundles can be
  "in-flight" on a single TCP connection; removed all the framing
  overhead from UDP by simply sending a bundle per UDP datagram.

- Support added for Cygwin as well as Apple OS X.

2.1.1 (March 2005)
------------------
- Patch to configure script to fix build problems on Apple OS X due to
  a conflict with a system include file (demmer).

- Bug fix in oasys/io/NetUtils.cc so getaddrinfo works properly on OS
  X (or generally any IPv6 enabled system).

- Minor updates to the manual and tutorials (jra).

2.1.0 (March 2005)
------------------
- Major restructuring of the configuration and build process to use
  autoconf to generate configure specifications

- Additional ports to solaris, cygwin, MacOS X, and FreeBSD, as well
  as linux on ARM (sharp zaurus) both cross-compiled and native.

- Major change to the BundleRouter interface to remove the "delayed
  effect" problems of the action list interface. Now all operations
  are immediately enacted by a BundleActions class.

- Simplify the syntax for the link and interface commands to no longer
  require a full bundle tuple, but instead just the admin portion.
  This avoids the confusion in that the region portion was always
  ignored.

- Reorganization of the test directories in both oasys and DTN2,
  including the introduction of a unit testing framework in oasys and
  the conversion of some tests to the new framework.

- Added framework for link-specific option parsing for the convergence
  layers.

- New version of the TCP convergence layer protocol, to be formally
  specified further in an internet draft. Addition of an idle time
  negotiation to close idle connections. Initial work on a feature for
  receiver-initiated connection to be used to traverse NAT routers.

- New version of the UDP convergence layer protocol that tightens up
  the protocoll and makes more sense divergent from the tcp one.

- Change the bundling protocol implementation to use NTP timestamps as
  mandated by the bundling protocol internet draft.

- Initial work on integrating the dtnsim simulation environment with
  the core of the daemon.

- Many other miscellaneous small changes and bug fixes.


2.0.2 (December 2004)
---------------------
- (very minor) change to enable Berkeley DB 4.3 usage

2.0.1 (December 2004):
---------------------

- First public release of the DTN2 code: stable design and overall
  code structure, though still numerous features left to be
  implemented.

- Features include:

  - conformance to the IETF draft Bundle Protocol specification version 3

  - functional implementation of a TCP convergence layer and address
    capabilities amenable to internet-connected hosts

  - static bundle router implementation

  - proactive and reactive fragmentation

  - flexible storage framework adaptable to Berkeley DB, mysql, or
    postgresql underlying implementations
