Connectors are a set of modules that are used to exchange message-oriented
data among Snort threads and the external world.  A typical use-case is
HA (High Availability) message exchange.  Connectors serve to decouple the
message transport from the message creation/consumption.  Connectors expose
a common API for several forms of message transport.

Connectors are a Snort plugin type.

===== Connector (parent plugin class)

Connectors may either be a simplex channel and perform unidirectional
communications.  Or may be duplex and perform bidirectional communications.
The TcpConnector is duplex while the FileConnector is simplex.

All subtypes of Connector have a 'direction' configuration element and a
'connector' element.  The 'connector' string is the key used to identify the
element for sidechannel configuration.  The 'direction' element may have a
default value, for instance TcpConnector's are 'duplex'.


There are currently two implementations of Connectors:

* TcpConnector - Exchange messages over a tcp channel.

* FileConnector - Write messages to files and read messages from files.


===== TcpConnector

TcpConnector is a subclass of Connector and implements a DUPLEX type Connector,
able to send and receive messages over a tcp session.

TcpConnector adds a few session setup configuration elements:

* setup = 'call' or 'answer' - 'call' is used to have TcpConnector initiate
        the connection.  'answer' is used to have TcpConnector accept incoming
        connections.

* address = '<addr>' - used for 'call' setup to specify the partner

* base_port = port - used to contruct the actual port number for 'call' and
        'answer' modes.  Actual port used is (base_port + instance_id).

An example segment of TcpConnector configuration:

    tcp_connector =
    {
        {
            connector = 'tcp_1',
            address = '127.0.0.1',
            setup = 'call',
            base_port = 11000
        },
    }


===== FileConnector

FileConnector implements a Connector that can either read from files or write
to files.  FileConnector's are simplex and must be configured to be
CONN_TRANSMIT or CONN_RECEIVE.

FileConnector configuration adds two additional element:

* name = string - used as part of the message file name

* format = 'text' or 'binary' - FileConnector supports two file types

The configured 'name' string is used to construct the actual names as in:

* file_connector_NAME_transmit and file_connector_NAME_receive

All messages for one Snort invocation are read and written to one file.

In the case of a receive FileConnector, all messages are read from the file
prior to the start of packet processing.  This allows the messages to
establish state information for all processed packets.

Connectors are used solely by SideChannel

An example segment of FileConnector configuration:

    file_connector =
    {
        {
            connector = 'file_tx_1',
            direction = 'transmit',
            format = 'text',
            name = 'HA'
        },
        {
            connector = 'file_rx_1',
            direction = 'receive',
            format = 'text',
            name = 'HA'
        },
    }

