Here are the data types used by Ames, as defined in lull.hoon
.
$address
+$ address @uxaddress
Opaque atomic transport address to or from Unix. For Ames over UDP, it will encode the IP address and port.
$verb
+$ verb ?(%snd %rcv %odd %msg %ges %for %rot)
Verbosity flag for Ames. Use with |ames-verb %flag1 %flag2 ...
and turn off with |ames-verb
.
%snd
- Sending packets.%rcv
- Receiving packets.%odd
- Unusual events.%msg
- Message-level events.%ges
- Congestion control.%for
- Packet forwarding.%rot
- Routing attempts.
$blob
+$ blob @uxblob
Raw atom to or from Unix, representing a packet.
$error
+$ error [tag=@tas =tang]
Tagged diagnostic trace.
$lane
+$ lane (each @pC address)
Ship transport address; either opaque $address or galaxy. The runtime knows how to look up galaxies, so we don't need to know their transport addresses.
$plea
+$ plea [vane=@tas =path payload=*]
Application-level message, as a %pass
.
vane
- Destination vane on remote ship.path
- Internal route on the receiving ship.payload
- Semantic message contents.
$bone
+$ bone @udbone
Message flow index - mapped to duct
s in the $ossuary.
The first bone
is 0. They increment by 4, since each flow includes a bit for each message determining forward vs. backward and a second bit for whether the message is on the normal flow or the associated diagnostic flow (for naxplanations).
The least significant bit of a bone
is:
- 1 if "forward", i.e. we send
%plea
s on this flow. - 0 if "backward", i.e. we receive
%plea
s on this flow.
The second-least significant bit is 1 if the bone
is a naxplanation bone
, and 0 otherwise. Only naxplanation messages can be sent on a naxplanation bone
, as %boon
s.
$fragment
+$ fragment @uwfragment
A message fragment.
$fragment-num
+$ fragment-num @udfragmentnum
Message fragment count.
$message-blob
+$ message-blob @udmessageblob
Unfragmented message blob.
$message-num
+$ message-num @udmessagenum
Message count.
$public-key
+$ public-key @uwpublickey
A peer's public key.
$symmetric-key
+$ symmetric-key @uwsymmetrickey
A symmetric key for encrypting messages to a peer. This is produced by performing an elliptic curve Diffie-Hellman using our private key and the peer's public key.
$ack
+$ ack$% [%ok ~][%nack ~][%naxplanation =error]==
A message acknowledgement.
%ok
- Positive acknowledgement.%nack
- Negative acknowledgement.%naxplanation
- Nack trace.
$ship-state
+$ ship-state$% [%alien alien-agenda][%known peer-state]==
All Ames knows about a peer.
%alien
- No PKI data, so enqueue actions to perform once we learn it.%known
- We know theirlife
and public keys, so we have a channel.
$alien-agenda
+$ alien-agenda$: messages=(list [=duct =plea])packets=(set =blob)heeds=(set duct)==
What to do when Ames learns a peer's life and keys.
messages
- $pleas local vanes have asked Ames to send.packets
- Packets we've tried to send.heeds
- Local tracking requests; passed through into $peer-state.
$peer-state
+$ peer-state$: $: =symmetric-key=life=public-keysponsor=ship==route=(unit [direct=? =lane])=qos=ossuarysnd=(map bone message-pump-state)rcv=(map bone message-sink-state)nax=(set [=bone =message-num])heeds=(set duct)==
State for a peer with known life and keys.
route
- Transport-layer destination for packets to the peer.qos
- Quality of service; connection status to the peer.ossuary
- $bone toduct
mapper.snd
- Per-bone
message pumps to send messages as fragments.rcv
- Per-bone
message sinks to assemble messages from fragments.nax
- Unprocessed nacks (negative acknowledgments).heeds
- Listeners for%clog
notifications.
$qos
+$ qos$~ [%unborn *@da][?(%live %dead %unborn) last-contact=@da]
Quality of service; how is the connection to a peer doing?
%live
- Peer is ok.%dead
- Peer is not responding.%unborn
- Peer is sunken.last-contact
- Last time Ames heard from the peer, or if%unborn
, the time when we first started tracking then.
$ossuary
+$ ossuary$: =next=boneby-duct=(map duct bone)by-bone=(map bone duct)==
$bone to duct
mapping, next
is the next bone
to map to a duct
.
$message-pump-state
+$ message-pump-state$: current=_`message-num`1next=_`message-num`1unsent-messages=(qeu message-blob)unsent-fragments=(list static-fragment)queued-message-acks=(map message-num ack)=packet-pump-state==
Persistent state for a |message-pump
.
current
- Sequence number of earliest message sent or being sent.next
- Sequence number of next message to send.unsent-messages
- Messages to be sent after current message.unsent-fragments
- Fragments of current message waiting for sending.queued-message-acks
- Future message acks to be applied after current.packet-pump-state
- State of corresponding|packet-pump
.
$static-fragment
+$ static-fragment$: =message-numnum-fragments=fragment-num=fragment-num=fragment==
A packet; a fragment of a message and metadata.
$packet-pump-state
+$ packet-pump-state$: next-wake=(unit @da)live=(tree [live-packet-key live-packet-val])metrics=pump-metrics==
Persistent state for a |packet-pump
.
next-wake
- Last timer we've set, or null.live
- Packets in flight; sent but not yet acked.metrics
- Congestion control information.
$pump-metrics
+$ pump-metrics$: rto=_~s1rtt=_~s1rttvar=_~s1ssthresh=_10.000cwnd=_1num-live=@udcounter=@ud==
Congestion control state for a |packet-pump
.
rto
- Retransmission timeout.rtt
- Roundtrip time estimate, low-passed using EWMA.rttvar
- Mean deviation ofrtt
, also low-passed with EWMA.num-live
- How many packets sent, awaiting ack.ssthresh
- Slow-start threshold.cwnd
- Congestion window; max unacked packets.
$live-packet
+$ live-packet$: key=live-packet-keyval=live-packet-val==
A packet in flight, as tracked in the $packet-pump-state.
$live-packet-key
+$ live-packet-key$: =message-num=fragment-num==
Identifier of a packet in flight.
$live-packet-val
+$ live-packet-val$: packet-statenum-fragments=fragment-num=fragment==
Content and metadata about a packet in flight.
$packet-state
+$ packet-state$: last-sent=@daretries=@udskips=@ud==
Sending statistics about a packet in flight.
$message-sink-state
+$ message-sink-state$: last-acked=message-numlast-heard=message-numpending-vane-ack=(qeu [=message-num message=*])live-messages=(map message-num partial-rcv-message)nax=(set message-num)==
State of a |message-sink
to assemble received messages.
last-acked
- Highest $message-num Ames has fully acknowledged.last-heard
- Highestmessage-num
Ames has heard all fragments for.pending-vane-ack
- Heard but not processed by local vane.live-messages
- Partially received messages.
$partial-rcv-message
+$ partial-rcv-message$: num-fragments=fragment-numnum-received=fragment-numfragments=(map fragment-num fragment)==
A message for which Ames has received some fragments.
num-fragments
- Total number of fragments in the message.num-received
- How many fragments Ames has received so far.fragments
- The received fragments themselves.