Overview of commands / communication between client and server.

Basic (socket-level) Communications
-----------------------------------

    LF    = line-feed (\n)
    FF    = form-feed (\f)
    TAB   = tab (\t)

* Client sends single-line commands to server, terminated by LF.

* Server sends two kinds of reply "log_msg" and "command_output":

  reply          := log_msg | command_output
  log_msg        := log_hdr + text + LF
  log_hdr        := FF + "LOG" + TAB
  command_output := ( text + LF )* + ready_prompt
  ready_prompt   : = FF + "READY" + LF

  1. Log messages:

     Should be read by the client and buffered internally. Show log
     and clear log display and clear this internal buffer.

  2. Command output:

     All text up to (but not including) the ready_prompt.

  Log messages are sent by the server whenever it has something to log.
  Hence, a client may receive zero or more log messages when it waits
  for command output.

Server commands
---------------

clear_arp
clear_ip
clear_ip_all
get_arp
get_ip
get_log
get_status
inform
ping
quit
set_alive
set_dead
set_dummy
set_flood_protection
set_learning
set_max_pending
set_max_rate
set_pending
set_proberate
set_queuedepth
set_sweep_age
set_sweep_sec

Command mappings
----------------

Client              Server
-----------------------------------
clear arp X                 clear_arp       X
clear ip X                  clear_ip        X
ping [N [S]]                ping            N S
quit                        quit

set ip X alive [Y]          set_alive       X Y
set ip X dead               set_dead        X
set ip X mac Y              set_alive       X Y
set ip X pending N          set_pending     X Y
set ip X queue N            set_queue       X Y
set ip X rate Y             set_rate        X Y

set dummy F                 set_dummy            F
set flood-protection R      set_flood_protection R
set learning S              set_learning         S
set max-pending N           set_max_pending      N
set max-rate R              set_max_rate         R
set proberate R             set_proberate        R
set queuedepth N            set_queuedepth       N
set sweep age S             set_sweep_age        S
set sweep period S          set_sweep_sec        S

show arp [X]                get_arp         X
show ip [X]                 get_ip          X

show log [N]                get_log         N
show status                 get_status
show uptime                 get_status
show version                get_status
sponge X                    set_dead        X
unsponge X                  set_alive       X

Data Types
----------

X: IP addres (hexstring)
Y: MAC address (hexstring)
N: integer > 0
S: seconds (float)
T: seconds (int)
R: rate (float)
F: boolean

IP addresses are sent as hexadecimal strings.
MAC addresses are sent as hexadecimal strings.
Boolean values are sent as 0 or 1.
Time stamps are sent as seconds since epoch.

Server:

    Output is sent as <key>=<val> <LF> <key=val>, with
    <LF><LF> between records.

        -----------------------------

        ip=1c201a6f
        state=ALIVE
        queue=0
        rate=0.0
        state_mtime=1301071508
        state_atime=1301071567

        ip=1c201a70
        state=DEAD
        queue=500
        rate=60.0
        state_mtime=1301071402
        state_atime=1301071663

        [OK]

        -----------------------------

        id=arpsponge
        pid=3456
        version=3.10-alpha2(110)
        date=1301071803
        started=1300897051
        network=5bc81100
        prefixlen=26
        interface=eth0
        ip=5bc81128
        mac=fe000096000a
        max_queue=200
        max_rate=30.00
        flood_protection=5.00
        max_pending=10
        sweep_period=900
        sweep_age=3600
        proberate=100
        next_sweep=38
        learning=0
        dummy=1

        [OK]
