model: Initial attempt to optimize Interest/Data encoding/decoding via a custom packet format
diff --git a/docs/new-packet-formats.rst b/docs/new-packet-formats.rst
new file mode 100644
index 0000000..d773662
--- /dev/null
+++ b/docs/new-packet-formats.rst
@@ -0,0 +1,360 @@
+
+Basic field types
++++++++++++++++++
+
+::
+
+ uint8_t ::= 8-bit unsigned integer
+
+ uint16_t ::= 16-bit unsigned integer
+
+ uint32_t ::= 32-bit unsigned integer
+
+ CHAR ::= 8-bit binary data
+
+ Blob ::= Length CHAR{Length}
+
+ Length ::= uint16_t
+
+NDN Packet Type
++++++++++++++++
+
+::
+
+ Packet ::= Version
+ PacketType
+ (Interest | ContentObject)
+
+ 0 1
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Version | PacketType |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+For ccnb-encoding compatibility, ``Version`` / ``PacketType`` has two reserved values to denote ccnb-encoded packet:
+
+Version 0x01, PacketType 0xD2 --- ccnb-encoded ``Interest`` packet
+Version 0x04, PacketType 0x82 --- ccnb-encoded ``ContentObject`` packet
+
+
+Version
+=======
+
+::
+
+ Version ::= uint8_t
+
+The current version of the packet format. Right only value 0x80 is allowed.
+
+PacketType
+==========
+
+::
+
+ PacketType ::= uint8_t
+
+In the current version, two packet types are defined:
+
+- ``Interest`` (``PacketType`` = 0)
+- ``ContentObject`` (``PacketType`` = 1)
+
+Any other value of PacketType is invalid and such a packet should be discarded.
+
+Interest
+++++++++
+
+The objective of the new format is to optimize encoding/decoding operations.
+
+::
+
+ Interest ::= Nonce
+ Scope
+ InterestLifetime
+ Name
+ Selectors
+ Options
+
+Minumum size of the Interest packet: 1 + 4 + 2 + 1 + (2 + 0) + (2 + 0) + (2 + 0) = 14
+
+Maximum size of the Interest packet: 1 + 4 + 2 + 1 + (2 + 65535) + (2 + 65535) + (2 + 65535) = 196619
+
+::
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Nonce |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Scope | Reserved | InterestLifetime |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | |
+ |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+ ~ ~
+ ~ Name ~
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | |
+ |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+ ~ ~
+ ~ Selectors ~
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | |
+ |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+ ~ ~
+ ~ Options ~
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+Nonce
+=====
+
+::
+
+ Nonce ::= uint32_t
+
+Reserved
+========
+
+::
+
+ Reserved := uint8_t
+
+Currently does not have meaning and should be zero
+
+InterestLifetime
+================
+
+::
+
+ InterestLifetime := uint16_t
+
+Interest lifetime is specified in seconds. Max value is about 18 hours.
+
+Scope
+=====
+
+::
+
+ Scope ::= uint8_t
+
+Scope 0 prevents propagation beyond the local ccnd (even to other applications on the same host). Scope 1 limits propagation to the applications on the originating host. Scope 2 limits propagation to no further than the next host.
+
+Name
+====
+
+::
+
+ Name ::= Length (NameComponent)*
+
+ NameComponent ::= Blob
+
+
+Selectors
+=========
+
+::
+
+ Selectors ::= Length (Selector)*
+
+ Selector ::= MinSuffixComponents | MaxSuffixComponents | Publisher | Exclude | ChildSelector | AnswerOriginKind
+
+All selectors are for now undefined
+
+Options
+=======
+
+::
+
+ Options ::= Length (Option)*
+
+
+.. .................................................................................................. ..
+.. .................................................................................................. ..
+.. .................................................................................................. ..
+.. .................................................................................................. ..
+
+
+ContentObject
++++++++++++++
+
+::
+
+ ContentObject ::= Signature
+ Name
+ Content
+
+::
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | |
+ |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
+ ~ ~
+ ~ Signature ~
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | |
+ |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+ ~ ~
+ ~ Name ~
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | |
+ |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+ ~ ~
+ ~ Content ~
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+Signature
+=========
+
+::
+
+ Signature ::= Length
+ SignatureType
+ <type-dependeds signature data>
+
+Length specifies cumulative size of SignatureInfo and SignatureBits. If SignatureType is not recognized, the received can either discard the packet or ignore the signature using Length field, specified combined length of SignatureType and SignatureType-dependent fields.
+
+::
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | SignatureType |
+ |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ ~ ~
+ ~ <type-dependeds signature data> ~
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+SignatureType
+~~~~~~~~~~~~~
+
+::
+
+ SignatureType ::= uint16_t
+
+The current version specifies three type of signatures:
+
+- 0x0000: empty signature
+- 0x0001: SHA256 (not a real signature, but just a digest of the content)
+- 0x0002: SHA256withRSA (real public-key signature based on SHA-256 digest)
+
+Other values may be defined in future.
+
+- Values greater or equal to 0xFF00 are for experimental purposes (e.g., for simulations)
+
+<type-dependeds signature data>
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
++-------------------+---------------------------+
+| SignatureType | SignatureData definition |
++===================+===========================+
+| 0 (empty) | empty sequence |
++-------------------+---------------------------+
+| 1 (sha256) | CHAR{32} |
++-------------------+---------------------------+
+| 2 (SHA256withRSA) | CHAR{32} KeyLocator |
++-------------------+---------------------------+
+
+KeyLocator
+~~~~~~~~~~
+
+::
+
+ KeyLocator ::= KeyLocatorType
+ (Key | Certificate | KeyName)
+
+ Key ::= Blob
+
+ Certificate ::= Blob
+
+ KeyName ::= Name
+
+
+Content
+=======
+
+::
+
+ Content ::= Length
+ ContentInfo
+ ContentData
+
+Content length can be computed as: Length - (1 - ContentInfo.Length)
+
+::
+
+ 0 1 2 3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length | Length (content Info) |
+ |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Timestamp |
+ |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Freshness | Reserved |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Length (ContentInfoOptions) | |
+ |-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+ ~ ~
+ ~ ContentInfoOptions ~
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ ~ ~
+ ~ ContentData ~
+ | |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+ContentInfo
+~~~~~~~~~~~
+
+::
+
+ ContentInfo ::= Length
+ Timestamp
+ Freshness
+ ContentOptions
+
+Timestamp
+=========
+
+::
+
+ Timestamp ::= uint32_t
+
+Timestamp specifies content generation time as Unix time timestamp (number of seconds since midnight 1/1/1970).
+
+Freshness
+=========
+
+::
+
+ Freshness ::= uint16_t
+
+Freshness specifies time in seconds (since Timestamp) for which the content is considered valid.
+
+Value 0xFFFF means that content is always valid.
+
+
+ContentOptions
+==============
+
+::
+
+ ContentOptions ::= Length
+ ContentOption*
+
+ ContentOption ::= Type |
+ FinalBlockID
+
+
+Not currently defined
+
diff --git a/docs/source/intro.rst b/docs/source/intro.rst
index 4a7252a..40bf4fd 100644
--- a/docs/source/intro.rst
+++ b/docs/source/intro.rst
@@ -5,7 +5,7 @@
.. :maxdepth: 2
Introduction
-==============
+============
The ndnSIM is NS-3 module that implements Named Data Networking (NDN) communication model, the clean slate Internet design. ndnSIM is specially optimized for simulation purposes and has a cleaner and more extensible internal structure comparing to the existing NDN implementation (Project CCNx).