--- /dev/null
+@node Plain
+@section Plain packet
+
+Plain packet contains either the whole file, or file request (freq), or
+transition packet or exec message. It is called "plain", because it
+contains plaintext, but plain packets would never be stored on your hard
+drive.
+
+@verbatim
+ HEADER
++--------------------------------------+--...---+
+| MAGIC | TYPE | NICE | PATHLEN | PATH | PAYLOAD|
++--------------------------------------+--...---+
+@end verbatim
+
+@multitable @columnfractions 0.2 0.3 0.5
+@headitem @tab XDR type @tab Value
+@item Magic number @tab
+ 8-byte, fixed length opaque data @tab
+ @verb{|N N C P P 0x00 0x00 0x03|}
+@item Payload type @tab
+ unsigned integer @tab
+ @enumerate 0
+ @item file (file transmission)
+ @item freq (file request)
+ @item exec (compressed exec)
+ @item trns (transition)
+ @item exec-fat (uncompressed exec)
+ @item area (@ref{Multicast, multicast} area message)
+ @end enumerate
+@item Niceness @tab
+ unsigned integer @tab
+ 1-255, preferred packet @ref{Niceness, niceness} level
+@item Path length @tab
+ unsigned integer @tab
+ actual length of @emph{path} field's payload
+@item Path @tab
+ 255 byte, fixed length opaque data @tab
+ Depending on packet's type, path holds:
+ @itemize
+ @item UTF-8 encoded destination path for file transfer
+ @item UTF-8 encoded source path for file request
+ @item UTF-8 encoded, zero byte separated, exec's arguments
+ @item Node's id the transition packet must be relayed on
+ @item Multicast area's id
+ @end itemize
+@end multitable
+
+Path has fixed size because of hiding its actual length -- it is
+valuable metadata. Payload is appended to the header -- it is not stored
+as XDR field, because XDR has no ability to pass more than 4 GiB of
+opaque data. Moreover most XDR libraries store fields in the memory in
+practice.
+
+Depending on the packet's type, payload could store:
+
+@itemize
+@item File contents
+@item Destination path for freq
+@item Optionally @url{https://facebook.github.io/zstd/, Zstandard}
+ compressed exec body
+@item Whole encrypted packet we need to relay on
+@item Multicast area message wrap with another encrypted packet inside
+@end itemize
+
+Also depending on packet's type, niceness level means:
+
+@itemize
+@item Preferable niceness level for files sent by freq
+@item @env{NNCP_NICE} variable's value passed during @ref{CfgExec} invocation.
+@end itemize
+
+So plain packets can hold following paths and payloads:
+
+@table @code
+
+@item file
+@example
+ +--------------- PATH ---------------+ +---- PAYLOAD ---+
+ / \ / \
++----------------------------------------+---------------...--+
+| FILENAME | 0x00 ... variable ... 0x00 | FILE CONTENTS |
++----------------------------------------+---------------...--+
+ \ /
+ PATHLEN
+@end example
+
+@item freq
+@example
+ +--------------- PATH ---------------+ +---- PAYLOAD ---+
+ / \ / \
++----------------------------------------+---------------...--+
+| FILENAME | 0x00 ... variable ... 0x00 | FILENAME |
++----------------------------------------+---------------...--+
+ \ /
+ PATHLEN
+@end example
+
+@item exec
+@example
+ +----------------------- PATH -------------------------+ +---- PAYLOAD ---+
+ / \ / \
++----------------------------------------------------------+---------------...--+
+| HANDLE | ARG0 0x00 ARG1 ...| 0x00 ... variable ... 0x00 | ZSTD DATA |
++----------------------------------------------------------+---------------...--+
+ \ /
+ +-------- PATHLEN --------+
+@end example
+
+@item exec-fat
+@example
+ +----------------------- PATH -------------------------+ +---- PAYLOAD ---+
+ / \ / \
++----------------------------------------------------------+---------------...--+
+| HANDLE | ARG0 0x00 ARG1 ...| 0x00 ... variable ... 0x00 | DATA |
++----------------------------------------------------------+---------------...--+
+ \ /
+ +-------- PATHLEN --------+
+@end example
+
+@item trns
+@example
+ +------- PATH ---------+ +---- PAYLOAD ---+
+ / \ / \
++--------------------------+---------------...--+
+| NODE ID | 0x00 ... 0x00 | ENCRYPTED PACKET |
++--------------------------+---------------...--+
+ \ /
+ PATHLEN
+@end example
+
+@item area
+@example
+ +------- PATH ---------+ +---- PAYLOAD ---+
+ / \ / \
++--------------------------+---------------...--+
+| AREA ID | 0x00 ... 0x00 | ENCRYPTED PACKET |
++--------------------------+---------------...--+
+ \ /
+ PATHLEN
+@end example
+See also @ref{Encrypted area, encrypted area packet}.
+
+@end table