NatFork's child process starts a producer (e.g., ConntrackProducer) and a
consumer (ConnectionsConsumer). 

The producer writes information to a Storage, and the consumer reads
information from the Storage. The Storage contains a queue and is created by
NatFork::childProcess. The Storage object is passed as reference to the
ConnectionsConsumer and to the producer.

Messages are received by the ConnectionsConsumer.

The ConnectionConsumer::run member receives records from the storage, and
passes them on to the record's protocol handling object (ICMP, UDP, or
TCP). These objects' constructors receive a reference to the 'ostream stdMsg'
and to 'RotatingStream d_logDataStream'.

These protocol handling objects implement a member 'process', receiving a
unique_ptr to the received record. The record may indicate incoming (IN,
inDev) information, outgoing (OUT, outDev) information, a new (NEW, insert)
connection, or an ending (DESTROY, destroy) connection.

The function inDev..destroy are virtual members overridden by the
protocol-specific members. The TCP, UDP and ICMP objects handling the
connections are derived from IPbase. IPbase handles the logging. 

IPbase::logConnection inserts the logged information into d_stdMsg, and
(optionally) CSV-data into d_logDataStream, received by its
constructor. d_logDataStream is a RotatingStream, which can be rotated
according to the 'log-rotate' option specification.

d_stdMsg is initialized by NatFork::setupStdMsg. If option 'log-file' was
specified then the specified file is rotated if 'log-rotate' is also
specified.  E.g., when calling natlog with options '--log=/tmp/nat.log
--log-rotate=5m5' then after 25 minutes the following log files are available
/tmp/nat.log, /tmp/nat.log.1, /tmp/nat.log.2, /tmp/nat.log.3, /tmp/nat.log.4,
/tmp/nat.log.5. 


