Skip to content

Latest commit

 

History

History
560 lines (454 loc) · 27.1 KB

NOTES.md

File metadata and controls

560 lines (454 loc) · 27.1 KB

Link Flow

Calling seek_auto as part of the startup process in the app sets swHandler to point to _seek_auto.

The initial mesh is booted by calling link_hn on each of the seeds loaded from a file. The seed info in this file includes crypto and path information, so nothing special is needed to establish the connection.

Once a hashname is known, from whatever source, a message can be sent to it. The first step is to create a channel of an appropriate type by calling chan_new.

The channel manages communication of the specific type between this node and the remote hashname.

Calling chan_packet creates a message ready to be sent to the associated hashname. If it is an unreliable channel it will only have a c parameter identifying the channel, except for the first which will also populate the type parameter.

Once any additional fields have been set in the packet, it is sent by calling chan_send.

Within this, reliable channels will receive appropriate values for seq, ack, and miss as needed, and the amended packet is passed on to switch_send.

This first tries to encrypt the packet. If it is the first time sending to a new hashname, there will be no known crypto for it. In this case the packet is stored in the HashContainer and switch_open is called for the hashname.

When there is no crypto, and seek_auto has been set up, the _seek_auto function is called.

This creates a new empty Seek structure and calls seek_send with it.

Hashname State

0 known only - i.e. from a see completely inactive no line maybe ip:port no parts no crypto

n-1 near peer completely inactive (perhaps loaded from history) no ip:port have parts have crypto (for matching CS at least)

n full peer completely inactive (perhaps loaded from history) have ip:port (s) (may be stale from prior session) have parts have crypto (for matching CS at least)

1 open received - line established minimal active have line have ip:port (of via) have parts (once validated) have crypto (for matching CS at least)

n+1 active peer (via) have line have ip:port of via have parts have crypto (for matching CS at least)

n+2 full active peer have line have ip:port direct have parts have crypto (for matching CS at least)

Connection process

full peer (or seed) Need ip:port,parts,crypto for shared CS Send open, using agreed shared crypto, creating line create and use channels on the line

other any missing ip:port Perform seek process, yielding seed as via Send peer request via seed, with external path if known seed send connect on our behalf, resulting in open from peer Line established, use it [Note, possibly using seed as a via, initiate path discovery]

Link life cycle

First establish line A<->B as above

  • link A->B to establish unidirectional link
  • possible path optimization process (async)
  • send keepalive every link-ping seconds (30 atm)
  • If no rx within link-timeout seconds (60 atm) go into first fail mode
  • resend original open (with original timestamp) on all known paths (and as a peer message to the original seed if it is still alive)
  • if line not reestablished within link-timeout secs go into second fail mode
  • send new on all known paths (and as a peer message to the original seed if it is still alive)
  • if line not reestablished within link-timeout secs go into fully failed mode
  • If connection still desired, restart seek process

Hence, states

Idle

Perform process to connect to the HN.

Open - send link message

  • Linked - send keepalive
  • LinkLate -
  • Failed

crypto stuff - id hash

id file

{"1a":"o0UL/D6qQ+dcSX7hCoyMjLDYeA6dNScZ+YY/fcX4fyCtsSO2u9L5Lg==","1a_secret":"iollyIcHaGeD/JpUNn/7ef1QAzE="}

log from ping using this id

*** public key o0UL/D6qQ+dcSX7hCoyMjLDYeA6dNScZ+YY/fcX4fyCtsSO2u9L5Lg== *** *** secret key iollyIcHaGeD/JpUNn/7ef1QAzE= *** loaded hashname 7ecf6a5884d483fde2f6a027e33e6e1756efdb70925557c3e3f776b35329aef5

From https://github.com/telehash/telehash.org/blob/master/hashnames.md

{
  "2a": "bf6e23c6db99ed2d24b160e89a37c9cd183fb61afeca40c4bc378cf6e488bebe",
  "1a": "a5c8b5c8a630c84dc01f92d2e5af6aa41801457a"
}

To calculate the hashname the parts are hashed in ascending order by their CSID, and each part contributes two values, the CSID and the fingerprint. The hash is rolled up, each resulting binary digest is combined with the next string value as the input. For the above example parts, the calculation would look like (in pseudo-code):

hash = sha256("1a")
hash = sha256(hash + "a5c8b5c8a630c84dc01f92d2e5af6aa41801457a")
hash = sha256(hash + "2a")
hash = sha256(hash + "bf6e23c6db99ed2d24b160e89a37c9cd183fb61afeca40c4bc378cf6e488bebe")
print hex(hash)
"825df574f77ebe1380640a314b745ed761d4ec286f0208838bfc14e288b126c0"

Checking packet construction

output of ping with packet hex dump

$ ./bin/ping 
*** public key o0UL/D6qQ+dcSX7hCoyMjLDYeA6dNScZ+YY/fcX4fyCtsSO2u9L5Lg== ***
*** secret key iollyIcHaGeD/JpUNn/7ef1QAzE= ***
loaded hashname 7ecf6a5884d483fde2f6a027e33e6e1756efdb70925557c3e3f776b35329aef5
channel new 2 seek
sending open packet 293 {"type":"ipv4","ip":"208.68.164.253","port":42424}
received open packet 368 {"type":"ipv4","ip":"208.68.164.253","port":42424}
line in 1 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de
hex dump of packet out
 0x00, 0x01, 0x1a, 0x70, 0xf0, 0xd6, 0x5a, 0xc1, 0xae, 0xae, 0x58, 0xe4, 0xaf, 0x0e, 0x58, 0x27,
 0xa4, 0x4b, 0x4b, 0x0b, 0x0d, 0x39, 0x41, 0x15, 0x97, 0xb6, 0x35, 0x55, 0xf0, 0xf0, 0x99, 0x48,
 0xce, 0x81, 0xf5, 0xba, 0xd9, 0xdc, 0x3b, 0x05, 0xc5, 0x81, 0xce, 0x2e, 0x6d, 0xc9, 0x1a, 0xb9,
 0x87, 0xdc, 0xd9, 0x13, 0x44, 0x37, 0xb0, 0x68, 0x25, 0x62, 0xac, 0xc7, 0x07, 0x1e, 0x27, 0xff,
 0xb5, 0x15, 0x64, 0x2e, 0x1a, 0x38, 0xaa, 0x33, 0xe2, 0xaf, 0x1d, 0x74, 0x46, 0xef, 0x89, 0xdc,
 0xa8, 0x15, 0x66, 0x7a, 0x5f, 0xa6, 0x45, 0x9f, 0xbb, 0xdb, 0x7a, 0x27, 0xb5, 0xa9, 0x48, 0xff,
 0xc3, 0xf6, 0xc3, 0x1e, 0xf6, 0x83, 0xf5, 0x1e, 0x06, 0xb4, 0xb3, 0x13, 0xfc, 0x57, 0xa1, 0x2a,
 0xdf, 0x96, 0xdf, 0x90, 0x2d, 0x14, 0x24, 0x11, 0xa6, 0x01, 0x4b, 0xed, 0xf1, 0xd1, 0x32, 0x88,
 0x15, 0xb4, 0x25, 0x0f, 0xa8, 0xda, 0x19, 0xc4, 0xb1, 0xf3, 0xe3, 0x4c, 0x31, 0x4d, 0xfe, 0x36,
 0xcf, 0x76, 0xc8, 0x46, 0x04, 0x30, 0xd2, 0x96, 0x46, 0xec, 0x45, 0xd3, 0x06, 0xb7, 0x92, 0x61,
 0xe8, 0xcf, 0x57, 0xd7, 0x20, 0xc7, 0xf4, 0xcb, 0xab, 0x66, 0x73, 0x39, 0xc5, 0xe4, 0xb4, 0x11,
 0x34, 0xd3, 0x45, 0x4f, 0x06, 0x4e, 0x75, 0xa1, 0xa6, 0x33, 0x91, 0x71, 0x49, 0xeb, 0x6c, 0xd9,
 0x6b, 0xf3, 0x8b, 0x3f, 0x96, 0xe1, 0x2e, 0xad, 0xbc, 0xf0, 0x81, 0x60, 0xae, 0x3d, 0x7d, 0x59,
 0xad, 0x1a, 0x0f, 0xdb, 0x1f, 0xa7, 0x6b, 0x36, 0x24, 0xfc, 0x6a, 0x0c, 0x15, 0xe9, 0x32, 0x64,
 0xe4, 0x55, 0x3f, 0x19, 0xd9, 0x20, 0x4d, 0x80, 0x27, 0x50, 0x68, 0x77, 0x32, 0x27, 0x34, 0x66,
 0xc2, 0x76, 0x02, 0x8f, 0x14, 0xda, 0xe8, 0xfb, 0x89, 0x28, 0x27, 0xfd, 0xbd, 0x8f, 0x41, 0x3f,
 0x71, 0xaa, 0x50, 0xca, 0x21, 0x98, 0x0e, 0x44, 0x69, 0x49, 0xc7, 0x74, 0xf0, 0xa0, 0xc9, 0x0b,
 0x30, 0x8f, 0x99, 0x60, 0x87, 0xec, 0x35, 0x25, 0x0d, 0xeb, 0xa5, 0x0a, 0x29, 0xec, 0x22, 0x13,
 0xae, 0xae, 0xdb, 0x32, 0xf9,
hex dump of packet out done
Sending open packet 293 {"type":"ipv4","ip":"208.68.164.253","port":42424}
hex dump of packet out
 0x00, 0x00, 0x16, 0x60, 0xef, 0x04, 0x2e, 0x32, 0x1e, 0xfb, 0x11, 0x0d, 0xb8, 0x9f, 0xe7, 0x05,
 0x72, 0xf6, 0x06, 0x48, 0xe2, 0x9c, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf2, 0x87, 0x9e, 0xb5, 0xb2,
 0x4c, 0x3f, 0xf3, 0xca, 0x4c, 0xa3, 0x18, 0xdc, 0x16, 0xac, 0x33, 0x94, 0x9a, 0xaa, 0xcc, 0x01,
 0xdf, 0xb8, 0x16, 0x7f, 0x48, 0xe1, 0x4c, 0xe4, 0x45, 0xa8, 0x4b, 0x61, 0xfa, 0x1e, 0xdb, 0x99,
 0xee, 0x83, 0xdb, 0xb0, 0xbf, 0x83, 0x33, 0x72, 0xbc, 0xf0, 0xbc, 0xfd, 0xda, 0x4a, 0x5c, 0x40,
 0x9d, 0xb6, 0xe1, 0x33, 0x38, 0xc3, 0x9a, 0x54, 0x3e, 0x9e, 0xf6, 0xbe, 0x11, 0x39, 0x2c, 0x0f,
 0x57, 0xb0, 0xc9, 0x27, 0x97, 0x20, 0x8e, 0xf5, 0xf2, 0x38, 0x0a, 0xc1, 0xb9, 0x95, 0xf1, 0xe4,
 0x68, 0x34, 0xd0, 0xc8, 0x55, 0x9b, 0x8a, 0x87, 0xa5, 0xc5, 0xe3,
hex dump of packet out done
Sending line packet 123 {"type":"ipv4","ip":"208.68.164.253","port":42424}
Received line packet 235 {"type":"ipv4","ip":"208.68.164.253","port":42424}
channel new 55 path


https://stackoverflow.com/questions/4702325/best-way-to-convert-between-char-and-word8


Normal line setup from remote seed, as reported by the node version

Thu Apr 17 2014 12:02:06 GMT+0200 (SAST) 71 0 ipv4,208.68.164.253,42424, unknown line received 4429b958adce73f77093f39460b390ab Thu Apr 17 2014 12:03:01 GMT+0200 (SAST) 71 0 ipv4,208.68.164.253,42424, unknown line received 4429b958adce73f77093f39460b390ab Thu Apr 17 2014 12:03:01 GMT+0200 (SAST) 1094 1 ipv4,208.68.164.253,42424, AZ our hashname: 3036d9b6f9525660b71d58bacd80d0ef0f6e191f1622daefd461823c366eb4fc inOpen verified 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de adding new path 0 {"type":"ipv4","ip":"208.68.164.253","port":42424} 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de ipv4 {"type":"ipv4","ip":"208.68.164.253","port":42424} PATH INNEW {"type":"ipv4","ip":"208.68.164.253","port":42424} [ '{"type":"ipv4","ip":"208.68.164.253","port":42424}' ] new line <<<< Thu Apr 17 2014 12:03:01 GMT+0200 (SAST) 1166 ipv4,208.68.164.253,42424, 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de line open 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de 36722f8135083a9d3a2d443f4e5d85ec 4485b0484e2d29166b65cf86a2dcf877 SYNCING 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de [ '{"type":"ipv4","ip":"208.68.164.253","port":42424}' ] PATHLOOP 1 {"type":"ipv4","ip":"208.68.164.253","port":42424} new unreliable channel 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de path 2 SEND path {"path":{"type":"ipv4","ip":"208.68.164.253","port":42424},"priority":1,"paths":[{"type":"http","http":"http://172.17.42.1:42424"}],"type":"path","c":2} line sending 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de 4485b0484e2d29166b65cf86a2dcf877 <<<< Thu Apr 17 2014 12:03:01 GMT+0200 (SAST) 204 ipv4,208.68.164.253,42424, 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de Thu Apr 17 2014 12:03:01 GMT+0200 (SAST) 1094 1 ipv4,208.68.164.253,42424, AZ our hashname: 3036d9b6f9525660b71d58bacd80d0ef0f6e191f1622daefd461823c366eb4fc inOpen verified 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de <<<< Thu Apr 17 2014 12:03:01 GMT+0200 (SAST) 1166 ipv4,208.68.164.253,42424, 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de line open 89a4cbc6c27eb913c1bcaf06bac2d8b872c7cbef626b35b6d7eaf993590d37de 36722f8135083a9d3a2d443f4e5d85ec 4485b0484e2d29166b65cf86a2dcf877 Thu Apr 17 2014 12:03:01 GMT+0200 (SAST) 71 0 ipv4,208.68.164.253,42424, LINEIN {"seed":true,"c":2} Thu Apr 17 2014 12:03:01 GMT+0200 (SAST) 141 0 ipv4,208.68.164.253,42424, LINEIN {"end":true,"priority":2,"path":{"type":"ipv4","ip":"105.236.67.202","port":42424},"c":2}


tftp stuff

Initial packet from telehash-c

chan_in:p=RxTelex
{rtId = 0
, rtSender = PIPv4 (PathIPv4 {v4Ip = 10.0.0.33, v4Port = 57158})
, rtAt = Wed May  7 15:01:31 SAST 2014
, rtJs = fromList
  [("end", Bool True),
   ("seq", Number 0.0),
   ("c",   Number 1.0),
   ("type",String "thtp")]
, rtPacket = Packet
  {paHead = HeadJson "{\"seq\":0,\"type\":\"thtp\",\"c\":1,\"end\":true}"
 , paBody = Body "\NUL/{\"path\":\"/chat/56419861/roster\",\"method\":\"get\"}"}
, rtChanId = Nothing}

ext_thtp:got req:HeadJson "{"path":"/chat/56419861/roster","method":"get"}" ext_thtp:req json={"method":"get","path":"/chat/56419861/roster"}

chat stuff

create chat

created chat:("tft@0ecedc9f49472737b9285c0e10066fd860983bb5aa3a04e1f0acc3d3b3c5e348",Just "186919c2,1000","a23a9c7c")

on tft side

joining chat tft@0ecedc9f49472737b9285c0e10066fd860983bb5aa3a04e1f0acc3d3b3c5e348 3f3d248b,1000 0b99e271

hence request received

receive roster req from telehash-c tft for "tft@ecedc9f49472737b9285c0e10066fd860983bb5aa3a04e1f0acc3d3b3c5e348"

chan_in:p=RxTelex
{rtId = 0
, rtSender = PIPv4 (PathIPv4 {v4Ip = 172.17.42.1, v4Port = 46940})
, rtAt = Mon May 12 10:24:30 SAST 2014
, rtJs = fromList
  [("end",Bool True),
   ("seq",Number 0.0),
   ("c",Number 1.0),
   ("type",String "thtp")]
, rtPacket = Packet
  { paHead = HeadJson "{\"seq\":0,\"type\":\"thtp\",\"c\":1,\"end\":true}"
  , paBody = Body "\NUL/{\"path\":\"/chat/56419861/roster\",\"method\":\"get\"}"}
, rtChanId = Nothing}

tftp

thtp_req:setting CArgTx to TxTelex {tId = 0 , tTo = HN "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a" , tOut = PNone , tJs = fromList [] , tPacket = Packet {paHead = HeadEmpty, paBody = Body ""} , tChain = Just (TxTelex {tId = 0 , tTo = HN "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a" , tOut = PNone , tJs = fromList [("to",String "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a") ,("for",String "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a") ,(".from",Number 5.0) ,("path",String "/chat/0df5f84f/roster")] , tPacket = Packet {paHead = HeadEmpty, paBody = Body ""} , tChain = Nothing, tLp = Nothing}), tLp = Nothing}


ext_thtp:CArgTx: (r,r2)= (TxTelex {tId = 0 , tTo = HN "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a" , tOut = PNone , tJs = fromList [] , tPacket = Packet {paHead = HeadEmpty, paBody = Body ""} , tChain = Just (TxTelex {tId = 0 , tTo = HN "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a" , tOut = PNone , tJs = fromList [("to",String "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a") ,("for",String "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a") ,(".from",Number 5.0) ,("path",String "/chat/0df5f84f/roster")] , tPacket = Packet {paHead = HeadEmpty, paBody = Body ""} , tChain = Nothing, tLp = Nothing}), tLp = Nothing} ,

TxTelex {tId = 0 , tTo = HN "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a" , tOut = PNone , tJs = fromList [] , tPacket = Packet { paHead = HeadEmpty , paBody = Body "\NUL\SO{"status":200}{"*":"invited","49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a":"d21d7472,1000"}" } , tChain = Just (TxTelex {tId = 0 , tTo = HN "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a" , tOut = PNone , tJs = fromList [("to",String "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a") ,("for",String "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a") ,(".from",Number 5.0) ,("path",String "/chat/0df5f84f/roster")] , tPacket = Packet {paHead = HeadEmpty, paBody = Body ""} , tChain = Nothing, tLp = Nothing}), tLp = Nothing})

decoded line packet from above ext_thtp:PingPongPacket received:Packet {paHead = HeadJson "{"status":200}", paBody = Body "{"*":"invited","49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a":"d21d7472,1000"}"}

thtp get response for roster

chat_hub:got note TxTelex
{tId = 0
, tTo = HN "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a"
, tOut = PNone
, tJs = fromList
   [("to",String "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a")
   ,("for",String "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a")
   ,(".from",Number 6.0)
   ,("thtp",String "resp")
   ,(".to",Number 5.0)
   ,("path",String "/chat/0df5f84f/roster")]
, tPacket = Packet
    { paHead = HeadJson "{\"status\":200}"
    , paBody = Body "{\"*\":\"invited\",\"49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a\":\"a8232b15,1000\"}"}
, tChain = Nothing
, tLp = Nothing}

thtp get request for roster

chat_hub:got note TxTelex
{tId = 0
, tTo = HN "0ecedc9f49472737b9285c0e10066fd860983bb5aa3a04e1f0acc3d3b3c5e348"
, tOut = PNone
, tJs = fromList
  [("glob",String "/chat/56419861/")
  ,(".from",Number 6.0)
  ,("thtp",String "req")
  ,(".to",Number 1.0)]
, tPacket = Packet { paHead = HeadEmpty, paBody = Body ""}
, tChain = Just (TxTelex
   {tId = 0
   , tTo = HN "49eb85838a320f60ce1894234f7d1ec04ec5957cb4644fa11750e01a6c88b58a"
   , tOut = PNone
   , tJs = fromList []
   , tPacket = Packet
     { paHead = HeadJson "{\"path\":\"/chat/56419861/roster\",\"method\":\"get\"}"
     , paBody = Body ""}
   , tChain = Nothing
   , tLp = Nothing})
, tLp = Nothing}

chat flow

hosted here, joined from there

ext_chat:chan start:mp=Just (RxTelex
{rtId = 0
, rtSender = PIPv4 (PathIPv4 {v4Ip = 172.17.42.1, v4Port = 51130})
, rtAt = Thu May 15 08:24:49 SAST 2014
, rtJs = fromList
  [("seq",Number 0.0)
  ,("c",Number 5.0)
  ,("to",String "tft@0ecedc9f49472737b9285c0e10066fd860983bb5aa3a04e1f0acc3d3b3c5e348")
  ,("from",String "c2b0425e,1000")
  ,("type",String "chat")
  ,("roster",String "5dfc44e8")]
, rtPacket = Packet
    {paHead = HeadJson "{\"seq\":0,\"type\":\"chat\",\"c\":5,\"to\":\"tft@0ecedc9f49472737b9285c0e10066fd860983bb5aa3a04e1f0acc3d3b3c5e348\",\"from\":\"c2b0425e,1000\",\"roster\":\"5dfc44e8\"}"
    , paBody = Body ""}
, rtChanId = Nothing})

This results in a local chat structure

ext_chat: got chat
Chat
{ ecEp = "tft"
, ecId = ChatId {ciEndpoint = "tft"
                , ciOriginator = Just (HN "0ecedc9f49472737b9285c0e10066fd860983bb5aa3a04e1f0acc3d3b3c5e348")}
, ecIdHash = CH "56419861"
, ecOrigin = HN "0ecedc9f49472737b9285c0e10066fd860983bb5aa3a04e1f0acc3d3b3c5e348"
, ecHub = 1
, ecRHash = CH "74299b2c"
, ecLocal = True
, ecSeed = CH "726b08b1"
, ecSeq = 999
, ecRoster = fromList
  [("*","invited")
  ,("0ecedc9f49472737b9285c0e10066fd860983bb5aa3a04e1f0acc3d3b3c5e348","ee1f7099,1000")]
, ecConn = fromList []
, ecLog = fromList
   [("ee1f7099,1000"
     ,TxTelex
      {tId = 0
      , tTo = HN "0ecedc9f49472737b9285c0e10066fd860983bb5aa3a04e1f0acc3d3b3c5e348"
      , tOut = PNone
      , tJs = fromList
        [("id",String "ee1f7099,1000")
        ,("type",String "join")
        ,("at",Number 1.400135083e9)
        ,("text",String "ThreadId 168")]
      , tPacket = Packet {paHead = HeadEmpty, paBody = Body ""}
      , tChain = Nothing
      , tLp = Nothing})]
, ecMsgs = []
, ecJoin = Just "ee1f7099,1000"
, ecSent = Nothing
, ecAfter = Nothing}

LINKTRY:HN "ce9d2cfccf34345b1c1a1c5b6c72cb0cf625ec88cdc64b54921303b26a655949" 16:40:11:<<<<:(HN "ce9d2cfccf34345b1c1a1c5b6c72cb0cf625ec88cdc64b54921303b26a655949","PNone","Packet HeadJson {"seed":true,"c":102} 0 bytes") 16:40:11:<<<<: { type: 'ipv4', ip: '208.68.164.253', port: 42424},len 49 16:40:11:<<<<: { type: 'ipv4', ip: '10.0.0.30', port: 42424},len 301 16:40:11:<<<<: { type: 'ipv4', ip: '172.17.42.1', port: 42424},len 301 16:40:11:<<<<: { type: 'ipv4', ip: '208.68.164.253', port: 42424},len 49 16:40:13:<<<<:(HN "ce9d2cfccf34345b1c1a1c5b6c72cb0cf625ec88cdc64b54921303b26a655949","PNone","Packet HeadJson {"c":360,"paths":[{"ip":"105.237.110.153","port":54232,"type":"ipv4"}],"type":"path"} 0 bytes") 16:40:13:<<<<: { type: 'ipv4', ip: '208.68.164.253', port: 42424},len 113 16:40:13:<<<<: { type: 'ipv4', ip: '10.0.0.30', port: 42424},len 301 16:40:13:<<<<: { type: 'ipv4', ip: '172.17.42.1', port: 42424},len 301 16:40:13:>>>>:(Just "(chan:(284,CID 360,0,ChanStarting,"path"))","{ type: 'ipv4', ip: '208.68.164.253', port: 42424}","Packet HeadJson {"path":{"type":"ipv4","ip":"105.237.110.153","port":54232},"c":360} 0 bytes") path_handler:got our remote ip:105.237.110.153 16:40:15:>>>>:(Just "(chan:(287,CID 365,0,ChanStarting,"connect"))","{ type: 'ipv4', ip: '208.68.164.253', port: 42424}","Packet HeadJson {"from":{"1a":"453f34b17f16d9928a74e2aaca588e9e76e3a9e206b6d28378bb8cdf8bb93b65"},"paths":[{"type":"webrtc"}],"type":"connect","c":365} 40 bytes") *** Exception: Data.Binary.Get.runGet at position 401: demandInput: not enough bytes

Hex logging for above

07:57:33:>>>>:recvTelex:208.68.164.253:42424 (48) 0000a23c11a9edecdeb73e8e6b24e546b7d39de155d6e194869cf398da76ba138f046ad6b903d166e41c472f73cfbc7e 07:57:33:>>>>:crypt_delineize_1a:inner a23c11a9edecdeb73e8e6b24e546b7d3 (22) 00147b2273656564223a747275652c2263223a31387d 07:57:33:>>>>:(Just "(chan:(14,CID 18,0,ChanOpen,"link"))","{ type: 'ipv4', ip: '208.68.164.253', port: 42424}","Packet HeadJson {"seed":true,"c":18} 0 bytes") 07:57:33:<<<<:(HN "ce9d2cfccf34345b1c1a1c5b6c72cb0cf625ec88cdc64b54921303b26a655949","PNone","Packet HeadJson {"seed":true,"c":18} 0 bytes") 07:57:33:<<<<: { type: 'ipv4', ip: '208.68.164.253', port: 42424},len 48 07:57:33:<<<<: { type: 'ipv4', ip: '208.68.164.253', port: 42424} (48) 00001a8838bffb9ef46e8b1d9cbcc7b1747eac38bbae0d3742f7dd5036b537ab249bef5cdbfe2bbddc4e329a3adea251 07:57:38:>>>>:recvTelex:208.68.164.253:42424 (2) 0000 07:57:38:>>>>:recvTelex:208.68.164.253:42424 (64) 0000a23c11a9edecdeb73e8e6b24e546b7d3e369db0be294869c89e837bde28869000c4ca05262c00d8e0ed8f634cc3999e6d97ff644406aec12c4d2202abd3c 07:57:38:>>>>:crypt_delineize_1a:inner a23c11a9edecdeb73e8e6b24e546b7d3 (38) 00247b227365656b223a22373736222c2274797065223a227365656b222c2263223a3133377d 07:57:38:>>>>:(Just "(chan:(33,CID 137,0,ChanStarting,"seek"))","{ type: 'ipv4', ip: '208.68.164.253', port: 42424}","Packet HeadJson {"seek":"776","type":"seek","c":137} 0 bytes") 07:57:38:>>>>:recvTelex:208.68.164.253:42424 (460) 00013a6fb5bc1b0312e8d8715f3959720b68efd941ec5f9d8e1090f775ebd4c4d9804d4f648ac46ecbb8605a020a250ebd38275fe9c31f6498d1cdd349ebf9c932af6b993ab852b453b8174eb552fea3e2505b2f4f619a37db796695ca22d802a3e978b0e02d811a1c9fd5483f343b7cb0b8e0ff06d72f84039384b66c4b680aba6992dca6834a6db688c882f0c830c6ee1c1838b4407eadb5631cb239ff93d282e3ba099396ea657f519b2ef103dd7d647fcc72b548f9af27f4dd029b0553e140d6a44db8a63e3e422a6c0e72b37886b896326611a050a7a8fbed607fae16595705be849e28966f6672130308a7452b312ed01e08de7cca710cfb23dc6bf04babab15170941383f412bc432b463204be8eaeff2d0dfa85c4149888692425504515629c7ed95901d07d8edba0cbe1d6789f6a060731502ff8f557c878fe9e8d0086fc813ed5188321fc16051fde50bc6645d091332f33efb828960d476f02987dca6ff1410ae821f3fba939b70521bc324abd89945efb9003cd7283bda1535472a92ebc7f458ad5e4a0e839768e98ac1212ca0e4db6453279001e4ff713964f4b64f69938c5236f11cd76bd3475eda215c2fba1077a1ca85c71a803e9f322766159274e06b9d7c6aba545971 07:57:38:>>>>:crypt_deopenize_1a:inner 31e463916f3012a0a5016a2bc6f2c391 (413) 6c3258f8cc77b7f6e7eaf963b02b2121fb9a7eec724160b3a20450c90b4bd195742bc892b6793876583b0ee51a254f7955eebd14180f44290700ae5cdec67626931c8c947d252e627ce84a130adf753cabcb33f05a72e43b26930a960a47fcc9adea862a5af26bd2f15c81e4a3c33b910dd15b2435d6c14bfdfe42c72e93078b78a2386cd61414744a8a3264b4aacea222af54d698b5e5f7e74c2c0476882f30173103fcbd2817467ddbdc7f20ae1f40b91c949a19f036d6135f4f1b4ccaf73c54de5c329510df2034a1a8b02b904f0ba8672fd8ef2024b2e6083e37821075d16371fe02622405e382352e9167c81ffcbaba2586b83006dba9a8f8aec8c660ca194c1976613c6565248bac3b3c41df2e3ed2e2715faa4f901514bf92bf2d314bedd1abfb41ed46b5f4891dd0a7ee22892b55337ac6d5d6eee4883a4cbb258924399683cbb0e7e6a7bdf18bd70f50748994b6db0f52ba1b25328e2faa5c7db7c080124dd9dc4e0831c6574ede3bc9971557ff0b4bc1daa421b7d5d0c64579e2951c541934363c60e32ab0462e30de4d396ea6f01a62686e1c5307e7feb2 *** Exception: Data.Binary.Get.runGet at position 413: demandInput: not enough bytes

Another one

13:14:48:>>>>:recvTelex:208.68.164.253:42424 (460) 00013a6fb5bc1b0312e8d8715f3959720b68efd941ec5f9d8e1090f775ebd4c4d9804d4f648ac46ecbb8605a020a250ebd38275fe9c31f6498d1cdd349ebf9c932af6b993ab852b453b8174eb552fea3e2505b2f4f619a37db796695ca22d802a3e978b0e02d811a1c9fd5483f343b7cb0b8e0ff06d72f84039384b66c4b680aba6992dca6834a6db688c882f0c830c6ee1c1838b4407eadb5631cb239ff93d282e3ba099396ea657f519b2ef103dd7d647fcc72b548f9af27f4dd029b0553e140d6a44db8a63e3e422a6c0e72b37886b896326611a050a7a8fbed607fae16595705be849e28966f6672130308a7452b312ed01e08de7cca710cfb23dc6bf04babab15170941383f412bc432b463204be8eaeff2d0dfa85c4149888692425504515629c7ed95901d07d8edba0cbe1d6789f6a060731502ff8f557c878fe9e8d0086fc813ed5188321fc16051fde50bc6645d091332f33efb828960d476f02987dca6ff1410ae821f3fba939b70521bc324abd89945efb9003cd7283bda1535472a92ebc7f458ad5e4a0e839768e98ac1212ca0e4db6453279001e4ff713964f4b64f69938c5236f11cd76bd3475eda215c2fba1077a1ca85c71a803e9f322766159274e06b9d7c6aba545971 13:14:48:>>>>:crypt_deopenize_1a:inner d8b5019dfe61f8c44f79881c5cf413e0 (413) 6c3258f8cc77b7f6e7eaf963b02b2121fb9a7eec724160b3a20450c90b4bd195742bc892b6793876583b0ee51a254f7955eebd14180f44290700ae5cdec67626931c8c947d252e627ce84a130adf753cabcb33f05a72e43b26930a960a47fcc9adea862a5af26bd2f15c81e4a3c33b910dd15b2435d6c14bfdfe42c72e93078b78a2386cd61414744a8a3264b4aacea222af54d698b5e5f7e74c2c0476882f30173103fcbd2817467ddbdc7f20ae1f40b91c949a19f036d6135f4f1b4ccaf73c54de5c329510df2034a1a8b02b904f0ba8672fd8ef2024b2e6083e37821075d16371fe02622405e382352e9167c81ffcbaba2586b83006dba9a8f8aec8c660ca194c1976613c6565248bac3b3c41df2e3ed2e2715faa4f901514bf92bf2d314bedd1abfb41ed46b5f4891dd0a7ee22892b55337ac6d5d6eee4883a4cbb258924399683cbb0e7e6a7bdf18bd70f50748994b6db0f52ba1b25328e2faa5c7db7c080124dd9dc4e0831c6574ede3bc9971557ff0b4bc1daa421b7d5d0c64579e2951c541934363c60e32ab0462e30de4d396ea6f01a62686e1c5307e7feb2 *** Exception: Data.Binary.Get.runGet at position 413: demandInput: not enough bytes

Another one, 1a this time

15:09:57:>>>>:recvTelex:208.68.164.253:42424 (2) 0000 15:09:57:>>>>:recvTelex:208.68.164.253:42424 (448) 00011a503281fa2ed3b286d8f0d932540b1452d17c537f4f4b1d897f8fbc73b52b86f8006d10272ce1f36fed83b0b72675a17895918a3313d6c14d2eb7aaee5f44e218e59eab91b5abe543f1a6cb99dcb620711a992ccfd8af91f2e60e9557a58f72e90879a6a9c751c3a8974f1e7133118585867541fc1d44acfc40672c7bf1b0e9f5caace08da29eb4c8ed764640718c77a4ef14d96bd16ccb40cc061395fb599a40960c2b460a2351871702e8ebb6286d97dad6ee3e5500ccb59a35e60d9589d08a83cc5f83891db18f82f39a1965d6078ed54cef05417f95d3a1e38f611535c7708d4d29c15e6b410b96763d2f53b4a07f4f52fd60e3723c9c8fc3004da98dd6aadd63e2a653e7e86e8a51a7bfc8ec7c4ab53a33ee89b05eefcd07cbb6ab4dcc7ccd157d52da97801c71884acd10382cbeb1f578e34abc49f8f4d076440dc45209202ba4d5302ffb21bf324886038d7431d29b26ba833f534ec1811c050875c145ac4c8047a66e77ae75f89c1fa990ac119f8ceb0ae2e39937fa1d8269d8352e0732073aeefad41a4e9b83206e5e5f7a8939423abf677d7cb8da92d3d74a092842364241f23712c92b879946979d4cb4d4a356e75c697d90ab562302a365 15:09:57:>>>>:crypt_deopenize_1a:inner d4b2ae82e73fa95968048f645051e776 (401) 0208b6d2ea2e7f81ddcbd196decd080f0903b727aec7edc7073e5c70b559fabf48fa2edec45f9c783276f4c80510de181748487fde0d8e4c23145147a9425d721b8d9522dfd71d1f33d9d558de8c72566b557b0e7869dcf36a7125260175dc5c9f7d48a17292630fe02843b460e2dbf42723eaa50dbbce03afcbf67f19f4e7af0e692778199d744eed7bf4b94220100374fb0ed270e450ac9815ed2b9ca160bb184d6914c28b0f5b3675482f27c13dea1591d0f8ba623264acad6dbda5207274da181be104182fa0cfd49525373bab4e57d7fc10dfa518a18d3ef7b2f308715107f5c78365a8103b7b45bc586eab67a4c14ef9ed1a4890f068a64f88b6081a6a77b1bd3a7f74c31c618273afaed958ffbe8c8f7ba309af245fc63ebd4260ae96730affcdc2184aaa26af63c391065c0249c51fd6e2a6b877008e8532d4fe7beff135619559ef2936213541f545ead91dbd822845904521c5f27892d785ef1444a60099d1743451ef3d277676a9a1c41173e2122c959a591e43f32c46abcb1167c8cb76f47803d62ce344d2d05151215024