Hex Artifact Content
Not logged in

Artifact 4e521e8d5077a06a044a460c1f09d14fa7736c2a:


0000: 5c 20 6e 65 74 32 6f 20 70 72 6f 74 6f 63 6f 6c  \ net2o protocol
0010: 20 73 74 61 63 6b 0a 0a 5c 20 43 6f 70 79 72 69   stack..\ Copyri
0020: 67 68 74 20 28 43 29 20 32 30 31 30 2d 32 30 31  ght (C) 2010-201
0030: 35 20 20 20 42 65 72 6e 64 20 50 61 79 73 61 6e  5   Bernd Paysan
0040: 0a 0a 5c 20 54 68 69 73 20 70 72 6f 67 72 61 6d  ..\ This program
0050: 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61 72   is free softwar
0060: 65 3a 20 79 6f 75 20 63 61 6e 20 72 65 64 69 73  e: you can redis
0070: 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f 6f  tribute it and/o
0080: 72 20 6d 6f 64 69 66 79 0a 5c 20 69 74 20 75 6e  r modify.\ it un
0090: 64 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66  der the terms of
00a0: 20 74 68 65 20 47 4e 55 20 41 66 66 65 72 6f 20   the GNU Affero 
00b0: 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c  General Public L
00c0: 69 63 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73  icense as publis
00d0: 68 65 64 20 62 79 0a 5c 20 74 68 65 20 46 72 65  hed by.\ the Fre
00e0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64  e Software Found
00f0: 61 74 69 6f 6e 2c 20 65 69 74 68 65 72 20 76 65  ation, either ve
0100: 72 73 69 6f 6e 20 33 20 6f 66 20 74 68 65 20 4c  rsion 3 of the L
0110: 69 63 65 6e 73 65 2c 20 6f 72 0a 5c 20 28 61 74  icense, or.\ (at
0120: 20 79 6f 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e   your option) an
0130: 79 20 6c 61 74 65 72 20 76 65 72 73 69 6f 6e 2e  y later version.
0140: 0a 0a 5c 20 54 68 69 73 20 70 72 6f 67 72 61 6d  ..\ This program
0150: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0160: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0170: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0180: 75 6c 2c 0a 5c 20 62 75 74 20 57 49 54 48 4f 55  ul,.\ but WITHOU
0190: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
01a0: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
01b0: 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74   implied warrant
01c0: 79 20 6f 66 0a 5c 20 4d 45 52 43 48 41 4e 54 41  y of.\ MERCHANTA
01d0: 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e 45 53  BILITY or FITNES
01e0: 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c  S FOR A PARTICUL
01f0: 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65  AR PURPOSE.  See
0200: 20 74 68 65 0a 5c 20 47 4e 55 20 41 66 66 65 72   the.\ GNU Affer
0210: 6f 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63  o General Public
0220: 20 4c 69 63 65 6e 73 65 20 66 6f 72 20 6d 6f 72   License for mor
0230: 65 20 64 65 74 61 69 6c 73 2e 0a 0a 5c 20 59 6f  e details...\ Yo
0240: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0250: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0260: 20 74 68 65 20 47 4e 55 20 41 66 66 65 72 6f 20   the GNU Affero 
0270: 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c  General Public L
0280: 69 63 65 6e 73 65 0a 5c 20 61 6c 6f 6e 67 20 77  icense.\ along w
0290: 69 74 68 20 74 68 69 73 20 70 72 6f 67 72 61 6d  ith this program
02a0: 2e 20 20 49 66 20 6e 6f 74 2c 20 73 65 65 20 3c  .  If not, see <
02b0: 68 74 74 70 3a 2f 2f 77 77 77 2e 67 6e 75 2e 6f  http://www.gnu.o
02c0: 72 67 2f 6c 69 63 65 6e 73 65 73 2f 3e 2e 0a 0a  rg/licenses/>...
02d0: 5c 20 68 65 6c 70 65 72 20 77 6f 72 64 73 0a 0a  \ helper words..
02e0: 72 65 71 75 69 72 65 20 76 65 72 73 69 6f 6e 2e  require version.
02f0: 66 73 0a 72 65 71 75 69 72 65 20 65 72 72 2e 66  fs.require err.f
0300: 73 0a 0a 5c 20 72 65 71 75 69 72 65 64 20 74 6f  s..\ required to
0310: 6f 6c 73 0a 0a 72 65 71 75 69 72 65 20 66 6f 72  ols..require for
0320: 77 61 72 64 2e 66 73 0a 72 65 71 75 69 72 65 20  ward.fs.require 
0330: 6d 69 6e 69 2d 6f 6f 66 32 2e 66 73 0a 72 65 71  mini-oof2.fs.req
0340: 75 69 72 65 20 75 73 65 72 2d 6f 62 6a 65 63 74  uire user-object
0350: 2e 66 73 0a 72 65 71 75 69 72 65 20 73 74 72 75  .fs.require stru
0360: 63 74 2d 76 61 6c 2e 66 73 0a 72 65 71 75 69 72  ct-val.fs.requir
0370: 65 20 72 65 63 2d 73 63 6f 70 65 2e 66 73 0a 72  e rec-scope.fs.r
0380: 65 71 75 69 72 65 20 75 6e 69 78 2f 73 6f 63 6b  equire unix/sock
0390: 65 74 2e 66 73 0a 72 65 71 75 69 72 65 20 75 6e  et.fs.require un
03a0: 69 78 2f 6d 6d 61 70 2e 66 73 0a 72 65 71 75 69  ix/mmap.fs.requi
03b0: 72 65 20 75 6e 69 78 2f 70 74 68 72 65 61 64 2e  re unix/pthread.
03c0: 66 73 0a 72 65 71 75 69 72 65 20 75 6e 69 78 2f  fs.require unix/
03d0: 66 69 6c 65 73 74 61 74 2e 66 73 0a 72 65 71 75  filestat.fs.requ
03e0: 69 72 65 20 74 6f 6f 6c 73 2e 66 73 0a 72 65 71  ire tools.fs.req
03f0: 75 69 72 65 20 64 65 62 75 67 67 69 6e 67 2e 66  uire debugging.f
0400: 73 0a 72 65 71 75 69 72 65 20 6b 72 65 67 69 6f  s.require kregio
0410: 6e 2e 66 73 0a 72 65 71 75 69 72 65 20 63 72 79  n.fs.require cry
0420: 70 74 6f 2d 61 70 69 2e 66 73 0a 72 65 71 75 69  pto-api.fs.requi
0430: 72 65 20 6b 65 63 63 61 6b 2e 66 73 0a 72 65 71  re keccak.fs.req
0440: 75 69 72 65 20 74 68 72 65 65 66 69 73 68 2e 66  uire threefish.f
0450: 73 0a 6b 65 63 63 61 6b 2d 6f 20 63 72 79 70 74  s.keccak-o crypt
0460: 6f 2d 6f 20 21 0a 72 65 71 75 69 72 65 20 72 6e  o-o !.require rn
0470: 67 2e 66 73 0a 72 65 71 75 69 72 65 20 65 64 32  g.fs.require ed2
0480: 35 35 31 39 2d 64 6f 6e 6e 61 2e 66 73 0a 72 65  5519-donna.fs.re
0490: 71 75 69 72 65 20 68 61 73 68 2d 74 61 62 6c 65  quire hash-table
04a0: 2e 66 73 0a 72 65 71 75 69 72 65 20 62 64 65 6c  .fs.require bdel
04b0: 74 61 2e 66 73 0a 0a 5c 20 72 61 6e 64 6f 6d 20  ta.fs..\ random 
04c0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
04d0: 68 61 73 68 0a 0a 3a 20 68 61 73 68 2d 69 6e 69  hash..: hash-ini
04e0: 74 2d 72 6e 67 20 28 20 2d 2d 20 29 20 20 24 31  t-rng ( -- )  $1
04f0: 30 20 72 6e 67 24 20 68 61 73 68 69 6e 69 74 20  0 rng$ hashinit 
0500: 73 77 61 70 20 6d 6f 76 65 20 3b 0a 0a 68 61 73  swap move ;..has
0510: 68 2d 69 6e 69 74 2d 72 6e 67 0a 0a 5c 20 63 72  h-init-rng..\ cr
0520: 79 70 74 6f 20 73 65 6c 65 63 74 69 6f 6e 0a 0a  ypto selection..
0530: 43 72 65 61 74 65 20 63 72 79 70 74 2d 6d 6f 64  Create crypt-mod
0540: 65 73 20 27 20 6b 65 63 63 61 6b 2d 74 20 2c 20  es ' keccak-t , 
0550: 27 20 74 68 72 65 65 66 69 73 68 2d 74 20 2c 0a  ' threefish-t ,.
0560: 68 65 72 65 20 63 72 79 70 74 2d 6d 6f 64 65 73  here crypt-modes
0570: 20 2d 20 63 65 6c 6c 2f 20 43 6f 6e 73 74 61 6e   - cell/ Constan
0580: 74 20 63 72 79 70 74 73 23 0a 0a 3a 20 3e 63 72  t crypts#..: >cr
0590: 79 70 74 20 28 20 6e 20 2d 2d 20 29 0a 20 20 20  ypt ( n -- ).   
05a0: 20 63 72 79 70 74 73 23 20 31 2d 20 75 6d 69 6e   crypts# 1- umin
05b0: 20 63 65 6c 6c 73 20 63 72 79 70 74 2d 6d 6f 64   cells crypt-mod
05c0: 65 73 20 2b 20 70 65 72 66 6f 72 6d 20 40 20 63  es + perform @ c
05d0: 72 79 70 74 6f 2d 6f 20 21 20 63 3a 69 6e 69 74  rypto-o ! c:init
05e0: 20 3b 0a 30 20 3e 63 72 79 70 74 0a 0a 5c 20 76   ;.0 >crypt..\ v
05f0: 61 6c 75 65 73 2c 20 63 6f 6e 66 69 67 75 72 61  alues, configura
0600: 62 6c 65 0a 0a 24 34 20 56 61 6c 75 65 20 6d 61  ble..$4 Value ma
0610: 78 2d 73 69 7a 65 5e 32 20 5c 20 31 6b 2c 20 64  x-size^2 \ 1k, d
0620: 6f 6e 27 74 20 66 72 61 67 6d 65 6e 74 20 62 79  on't fragment by
0630: 20 64 65 66 61 75 6c 74 0a 24 31 32 20 56 61 6c   default.$12 Val
0640: 75 65 20 6d 61 78 2d 64 61 74 61 23 20 5c 20 31  ue max-data# \ 1
0650: 36 4d 42 20 64 61 74 61 20 73 70 61 63 65 0a 24  6MB data space.$
0660: 30 43 20 56 61 6c 75 65 20 6d 61 78 2d 63 6f 64  0C Value max-cod
0670: 65 23 20 5c 20 32 35 36 6b 20 63 6f 64 65 20 73  e# \ 256k code s
0680: 70 61 63 65 0a 24 31 30 20 56 61 6c 75 65 20 6d  pace.$10 Value m
0690: 61 78 2d 62 6c 6f 63 6b 23 20 5c 20 36 34 6b 20  ax-block# \ 64k 
06a0: 6d 61 78 69 6d 75 6d 20 62 6c 6f 63 6b 20 73 69  maximum block si
06b0: 7a 65 2b 61 6c 69 67 6e 6d 65 6e 74 0a 0a 5c 20  ze+alignment..\ 
06c0: 76 61 6c 75 65 73 2c 20 73 74 61 74 75 73 0a 0a  values, status..
06d0: 74 72 75 65 20 56 61 6c 75 65 20 63 6f 6e 6e 65  true Value conne
06e0: 63 74 65 64 3f 0a 30 20 56 61 6c 75 65 20 64 68  cted?.0 Value dh
06f0: 74 2d 63 6f 6e 6e 65 63 74 69 6f 6e 0a 0a 5c 20  t-connection..\ 
0700: 63 6f 6e 73 74 61 6e 74 73 2c 20 61 6e 64 20 64  constants, and d
0710: 65 70 65 6e 64 69 6e 67 20 76 61 6c 75 65 73 0a  epending values.
0720: 0a 24 32 41 20 43 6f 6e 73 74 61 6e 74 20 6f 76  .$2A Constant ov
0730: 65 72 68 65 61 64 20 5c 20 63 6f 6e 73 74 61 6e  erhead \ constan
0740: 74 20 6f 76 65 72 68 65 61 64 0a 24 34 30 20 43  t overhead.$40 C
0750: 6f 6e 73 74 61 6e 74 20 6d 69 6e 2d 73 69 7a 65  onstant min-size
0760: 0a 31 20 56 61 6c 75 65 20 62 75 66 66 65 72 73  .1 Value buffers
0770: 23 0a 6d 69 6e 2d 73 69 7a 65 20 6d 61 78 2d 73  #.min-size max-s
0780: 69 7a 65 5e 32 20 6c 73 68 69 66 74 20 56 61 6c  ize^2 lshift Val
0790: 75 65 20 6d 61 78 64 61 74 61 20 28 20 2d 2d 20  ue maxdata ( -- 
07a0: 6e 20 29 0a 6d 61 78 64 61 74 61 20 6f 76 65 72  n ).maxdata over
07b0: 68 65 61 64 20 2b 20 56 61 6c 75 65 20 6d 61 78  head + Value max
07c0: 70 61 63 6b 65 74 0a 6d 61 78 70 61 63 6b 65 74  packet.maxpacket
07d0: 20 24 46 20 2b 20 2d 24 31 30 20 61 6e 64 20 56   $F + -$10 and V
07e0: 61 6c 75 65 20 6d 61 78 70 61 63 6b 65 74 2d 61  alue maxpacket-a
07f0: 6c 69 67 6e 65 64 0a 6d 61 78 2d 73 69 7a 65 5e  ligned.max-size^
0800: 32 20 36 20 2b 20 56 61 6c 75 65 20 63 68 75 6e  2 6 + Value chun
0810: 6b 2d 70 32 0a 24 31 30 20 43 6f 6e 73 74 61 6e  k-p2.$10 Constan
0820: 74 20 6b 65 79 2d 73 61 6c 74 23 0a 24 31 30 20  t key-salt#.$10 
0830: 43 6f 6e 73 74 61 6e 74 20 6b 65 79 2d 63 6b 73  Constant key-cks
0840: 75 6d 23 0a 0a 5c 20 66 6f 72 20 62 69 67 67 65  um#..\ for bigge
0850: 72 20 62 6c 6f 63 6b 73 2c 20 77 65 20 75 73 65  r blocks, we use
0860: 20 75 73 65 20 61 6c 6c 6f 63 2b 67 75 61 72 64   use alloc+guard
0870: 2c 20 69 2e 65 2e 20 6d 6d 61 70 20 77 69 74 68  , i.e. mmap with
0880: 20 61 0a 5c 20 67 75 61 72 64 20 70 61 67 65 20   a.\ guard page 
0890: 61 66 74 65 72 20 74 68 65 20 65 6e 64 2e 0a 0a  after the end...
08a0: 3a 20 61 6c 6c 6f 63 2d 62 75 66 20 28 20 2d 2d  : alloc-buf ( --
08b0: 20 61 64 64 72 20 29 0a 20 20 20 20 6d 61 78 70   addr ).    maxp
08c0: 61 63 6b 65 74 2d 61 6c 69 67 6e 65 64 20 62 75  acket-aligned bu
08d0: 66 66 65 72 73 23 20 2a 20 61 6c 6c 6f 63 2b 67  ffers# * alloc+g
08e0: 75 61 72 64 20 3b 0a 3a 20 61 6c 6c 6f 63 2d 62  uard ;.: alloc-b
08f0: 75 66 2b 36 20 28 20 2d 2d 20 61 64 64 72 20 29  uf+6 ( -- addr )
0900: 20 20 61 6c 6c 6f 63 2d 62 75 66 20 36 20 2b 20    alloc-buf 6 + 
0910: 3b 0a 3a 20 66 72 65 65 2d 62 75 66 20 28 20 61  ;.: free-buf ( a
0920: 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 6d 61 78  ddr -- ).    max
0930: 70 61 63 6b 65 74 2d 61 6c 69 67 6e 65 64 20 62  packet-aligned b
0940: 75 66 66 65 72 73 23 20 2a 20 32 64 75 70 20 65  uffers# * 2dup e
0950: 72 61 73 65 20 66 72 65 65 2b 67 75 61 72 64 20  rase free+guard 
0960: 3b 0a 3a 20 66 72 65 65 2d 62 75 66 2b 36 20 28  ;.: free-buf+6 (
0970: 20 61 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 36   addr -- ).    6
0980: 20 2d 20 66 72 65 65 2d 62 75 66 20 3b 0a 0a 5b   - free-buf ;..[
0990: 49 46 44 45 46 5d 20 63 79 67 77 69 6e 0a 20 20  IFDEF] cygwin.  
09a0: 20 20 3a 20 6e 6f 2d 68 79 62 72 69 64 20 3b 20    : no-hybrid ; 
09b0: 5c 20 63 79 67 77 69 6e 20 63 61 6e 27 74 20 64  \ cygwin can't d
09c0: 65 61 6c 20 77 69 74 68 20 68 79 62 72 69 64 20  eal with hybrid 
09d0: 73 74 61 63 6b 73 0a 5b 54 48 45 4e 5d 0a 0a 5c  stacks.[THEN]..\
09e0: 20 70 65 72 2d 74 68 72 65 61 64 20 6d 65 6d 6f   per-thread memo
09f0: 72 79 20 73 70 61 63 65 0a 0a 55 56 61 6c 75 65  ry space..UValue
0a00: 20 69 6e 62 75 66 20 20 20 20 28 20 2d 2d 20 61   inbuf    ( -- a
0a10: 64 64 72 20 29 0a 55 56 61 6c 75 65 20 74 6d 70  ddr ).UValue tmp
0a20: 62 75 66 20 20 20 28 20 2d 2d 20 61 64 64 72 20  buf   ( -- addr 
0a30: 29 0a 55 56 61 6c 75 65 20 6f 75 74 62 75 66 20  ).UValue outbuf 
0a40: 20 20 28 20 2d 2d 20 61 64 64 72 20 29 0a 68 61    ( -- addr ).ha
0a50: 73 68 3a 20 72 6f 75 74 65 73 23 0a 0a 5c 20 61  sh: routes#..\ a
0a60: 64 64 20 49 50 20 61 64 64 72 65 73 73 65 73 0a  dd IP addresses.
0a70: 0a 72 65 71 75 69 72 65 20 63 6c 61 73 73 65 73  .require classes
0a80: 2e 66 73 0a 72 65 71 75 69 72 65 20 69 70 2e 66  .fs.require ip.f
0a90: 73 0a 72 65 71 75 69 72 65 20 73 6f 63 6b 73 2e  s.require socks.
0aa0: 66 73 0a 0a 55 44 65 66 65 72 20 6f 74 68 65 72  fs..UDefer other
0ab0: 0a 0a 3a 20 2d 6f 74 68 65 72 20 20 20 20 20 20  ..: -other      
0ac0: 20 20 5b 27 5d 20 6e 6f 6f 70 20 69 73 20 6f 74    ['] noop is ot
0ad0: 68 65 72 20 3b 0a 2d 6f 74 68 65 72 0a 0a 44 65  her ;.-other..De
0ae0: 66 65 72 20 61 6c 6c 6f 63 2d 63 6f 64 65 2d 62  fer alloc-code-b
0af0: 75 66 73 20 27 20 6e 6f 6f 70 20 69 73 20 61 6c  ufs ' noop is al
0b00: 6c 6f 63 2d 63 6f 64 65 2d 62 75 66 73 0a 44 65  loc-code-bufs.De
0b10: 66 65 72 20 66 72 65 65 2d 63 6f 64 65 2d 62 75  fer free-code-bu
0b20: 66 73 20 20 27 20 6e 6f 6f 70 20 69 73 20 66 72  fs  ' noop is fr
0b30: 65 65 2d 63 6f 64 65 2d 62 75 66 73 0a 0a 56 61  ee-code-bufs..Va
0b40: 72 69 61 62 6c 65 20 74 61 73 6b 2d 69 64 23 0a  riable task-id#.
0b50: 0a 3a 20 61 6c 6c 6f 63 2d 69 6f 20 28 20 2d 2d  .: alloc-io ( --
0b60: 20 29 20 5c 20 61 6c 6c 6f 63 61 74 65 20 49 4f   ) \ allocate IO
0b70: 20 61 6e 64 20 72 65 73 65 74 20 67 65 6e 65 72   and reset gener
0b80: 69 63 20 75 73 65 72 20 76 61 72 69 61 62 6c 65  ic user variable
0b90: 73 0a 20 20 20 20 69 6f 2d 62 75 66 66 65 72 73  s.    io-buffers
0ba0: 20 6e 65 77 20 69 6f 2d 6d 65 6d 20 21 0a 20 20   new io-mem !.  
0bb0: 20 20 31 20 74 61 73 6b 2d 69 64 23 20 2b 21 40    1 task-id# +!@
0bc0: 20 74 61 73 6b 23 20 21 0a 20 20 20 20 2d 6f 74   task# !.    -ot
0bd0: 68 65 72 0a 20 20 20 20 61 6c 6c 6f 63 2d 62 75  her.    alloc-bu
0be0: 66 2b 36 20 74 6f 20 69 6e 62 75 66 0a 20 20 20  f+6 to inbuf.   
0bf0: 20 61 6c 6c 6f 63 2d 62 75 66 20 74 6f 20 74 6d   alloc-buf to tm
0c00: 70 62 75 66 0a 20 20 20 20 61 6c 6c 6f 63 2d 62  pbuf.    alloc-b
0c10: 75 66 2b 36 20 74 6f 20 6f 75 74 62 75 66 0a 20  uf+6 to outbuf. 
0c20: 20 20 20 61 6c 6c 6f 63 2d 63 6f 64 65 2d 62 75     alloc-code-bu
0c30: 66 73 0a 20 20 20 20 69 6e 69 74 2d 65 64 32 35  fs.    init-ed25
0c40: 35 31 39 20 63 3a 69 6e 69 74 20 3b 0a 0a 3a 6e  519 c:init ;..:n
0c50: 6f 6e 61 6d 65 20 28 20 2d 2d 20 29 20 64 65 66  oname ( -- ) def
0c60: 65 72 73 20 74 68 72 65 61 64 2d 69 6e 69 74 0a  ers thread-init.
0c70: 20 20 20 20 61 6c 6c 6f 63 2d 69 6f 20 62 2d 6f      alloc-io b-o
0c80: 75 74 20 6f 70 2d 76 65 63 74 6f 72 20 40 20 64  ut op-vector @ d
0c90: 65 62 75 67 2d 76 65 63 74 6f 72 20 21 20 3b 20  ebug-vector ! ; 
0ca0: 69 73 20 74 68 72 65 61 64 2d 69 6e 69 74 0a 0a  is thread-init..
0cb0: 3a 20 66 72 65 65 2d 69 6f 20 28 20 2d 2d 20 29  : free-io ( -- )
0cc0: 0a 20 20 20 20 66 72 65 65 2d 65 64 32 35 35 31  .    free-ed2551
0cd0: 39 20 63 3a 66 72 65 65 0a 20 20 20 20 66 72 65  9 c:free.    fre
0ce0: 65 2d 63 6f 64 65 2d 62 75 66 73 0a 20 20 20 20  e-code-bufs.    
0cf0: 30 20 69 6f 2d 6d 65 6d 20 21 40 20 2e 64 69 73  0 io-mem !@ .dis
0d00: 70 6f 73 65 0a 20 20 20 20 69 6e 62 75 66 20 20  pose.    inbuf  
0d10: 66 72 65 65 2d 62 75 66 2b 36 0a 20 20 20 20 74  free-buf+6.    t
0d20: 6d 70 62 75 66 20 66 72 65 65 2d 62 75 66 0a 20  mpbuf free-buf. 
0d30: 20 20 20 6f 75 74 62 75 66 20 66 72 65 65 2d 62     outbuf free-b
0d40: 75 66 2b 36 20 3b 0a 0a 61 6c 6c 6f 63 2d 69 6f  uf+6 ;..alloc-io
0d50: 0a 0a 56 61 72 69 61 62 6c 65 20 6e 65 74 32 6f  ..Variable net2o
0d60: 2d 74 61 73 6b 73 0a 0a 3a 20 6e 65 74 32 6f 2d  -tasks..: net2o-
0d70: 70 61 73 73 20 28 20 70 61 72 61 6d 73 20 78 74  pass ( params xt
0d80: 20 6e 20 74 61 73 6b 20 2d 2d 20 29 0a 20 20 20   n task -- ).   
0d90: 20 64 75 70 20 6e 65 74 32 6f 2d 74 61 73 6b 73   dup net2o-tasks
0da0: 20 3e 73 74 61 63 6b 20 20 70 61 73 73 0a 20 20   >stack  pass.  
0db0: 20 20 3f 73 61 6c 74 2d 69 6e 69 74 20 6f 66 66    ?salt-init off
0dc0: 20 20 72 6e 67 2d 6f 20 6f 66 66 20 5c 20 6d 61    rng-o off \ ma
0dd0: 6b 65 20 64 6f 75 62 6c 65 20 73 75 72 65 20 6e  ke double sure n
0de0: 6f 20 72 6e 67 20 69 73 20 61 63 74 69 76 65 0a  o rng is active.
0df0: 20 20 20 20 61 6c 6c 6f 63 2d 69 6f 20 70 72 65      alloc-io pre
0e00: 70 2d 73 6f 63 6b 73 20 63 61 74 63 68 2d 6c 6f  p-socks catch-lo
0e10: 6f 70 0a 20 20 20 20 31 2b 20 3f 64 75 70 2d 49  op.    1+ ?dup-I
0e20: 46 20 20 66 72 65 65 2d 69 6f 20 31 2d 20 3f 64  F  free-io 1- ?d
0e30: 75 70 2d 49 46 20 20 44 6f 45 72 72 6f 72 20 20  up-IF  DoError  
0e40: 54 48 45 4e 0a 20 20 20 20 45 4c 53 45 20 20 7e  THEN.    ELSE  ~
0e50: 7e 20 62 66 6c 75 73 68 20 30 20 28 62 79 65 29  ~ bflush 0 (bye)
0e60: 20 7e 7e 20 20 54 48 45 4e 20 3b 0a 3a 20 6e 65   ~~  THEN ;.: ne
0e70: 74 32 6f 2d 74 61 73 6b 20 28 20 70 61 72 61 6d  t2o-task ( param
0e80: 73 20 78 74 20 6e 20 2d 2d 20 74 61 73 6b 20 29  s xt n -- task )
0e90: 0a 20 20 20 20 73 74 61 63 6b 73 69 7a 65 34 20  .    stacksize4 
0ea0: 4e 65 77 54 61 73 6b 34 20 64 75 70 20 3e 72 20  NewTask4 dup >r 
0eb0: 6e 65 74 32 6f 2d 70 61 73 73 20 72 3e 20 3b 0a  net2o-pass r> ;.
0ec0: 0a 56 61 72 69 61 62 6c 65 20 6b 69 6c 6c 73 0a  .Variable kills.
0ed0: 65 76 65 6e 74 3a 20 3a 3e 6b 69 6c 6c 65 64 20  event: :>killed 
0ee0: 28 20 2d 2d 20 29 20 20 2d 31 20 6b 69 6c 6c 73  ( -- )  -1 kills
0ef0: 20 2b 21 20 3b 0a 65 76 65 6e 74 3a 20 3a 3e 6b   +! ;.event: :>k
0f00: 69 6c 6c 20 28 20 74 61 73 6b 20 2d 2d 20 29 0a  ill ( task -- ).
0f10: 20 20 20 20 3c 65 76 65 6e 74 20 3a 3e 6b 69 6c      <event :>kil
0f20: 6c 65 64 20 65 76 65 6e 74 3e 20 30 20 28 62 79  led event> 0 (by
0f30: 65 29 20 3b 0a 3a 20 73 65 6e 64 2d 6b 69 6c 6c  e) ;.: send-kill
0f40: 20 28 20 74 61 73 6b 20 2d 2d 20 29 20 3c 65 76   ( task -- ) <ev
0f50: 65 6e 74 20 75 70 40 20 65 6c 69 74 2c 20 3a 3e  ent up@ elit, :>
0f60: 6b 69 6c 6c 20 65 76 65 6e 74 3e 20 3b 0a 0a 32  kill event> ;..2
0f70: 20 43 6f 6e 73 74 61 6e 74 20 6b 69 6c 6c 2d 73   Constant kill-s
0f80: 65 63 6f 6e 64 73 23 0a 6b 69 6c 6c 2d 73 65 63  econds#.kill-sec
0f90: 6f 6e 64 73 23 20 31 2b 20 23 31 30 30 30 30 30  onds# 1+ #100000
0fa0: 30 30 30 30 20 75 6d 2a 20 32 63 6f 6e 73 74 61  0000 um* 2consta
0fb0: 6e 74 20 6b 69 6c 6c 2d 74 69 6d 65 6f 75 74 23  nt kill-timeout#
0fc0: 20 5c 20 33 73 0a 0a 3a 20 6e 65 74 32 6f 2d 6b   \ 3s..: net2o-k
0fd0: 69 6c 6c 73 20 28 20 2d 2d 20 29 0a 20 20 20 20  ills ( -- ).    
0fe0: 6e 65 74 32 6f 2d 74 61 73 6b 73 20 67 65 74 2d  net2o-tasks get-
0ff0: 73 74 61 63 6b 20 6b 69 6c 6c 73 20 21 20 20 6e  stack kills !  n
1000: 65 74 32 6f 2d 74 61 73 6b 73 20 24 66 72 65 65  et2o-tasks $free
1010: 0a 20 20 20 20 6b 69 6c 6c 73 20 40 20 30 20 3f  .    kills @ 0 ?
1020: 44 4f 20 20 73 65 6e 64 2d 6b 69 6c 6c 20 20 4c  DO  send-kill  L
1030: 4f 4f 50 0a 20 20 20 20 6e 74 69 6d 65 20 6b 69  OOP.    ntime ki
1040: 6c 6c 2d 74 69 6d 65 6f 75 74 23 20 64 2b 20 7b  ll-timeout# d+ {
1050: 20 64 3a 20 74 69 6d 65 6f 75 74 20 7d 0a 20 20   d: timeout }.  
1060: 20 20 6b 69 6c 6c 2d 73 65 63 6f 6e 64 73 23 20    kill-seconds# 
1070: 3e 72 20 5c 20 67 69 76 65 20 74 69 6d 65 20 74  >r \ give time t
1080: 6f 20 74 65 72 6d 69 6e 61 74 65 0a 20 20 20 20  o terminate.    
1090: 42 45 47 49 4e 20 20 74 69 6d 65 6f 75 74 20 6e  BEGIN  timeout n
10a0: 74 69 6d 65 20 64 2d 20 32 64 75 70 20 64 30 3e  time d- 2dup d0>
10b0: 20 6b 69 6c 6c 73 20 40 20 61 6e 64 20 20 57 48   kills @ and  WH
10c0: 49 4c 45 0a 09 20 20 20 20 73 74 6f 70 2d 64 6e  ILE..    stop-dn
10d0: 73 0a 09 20 20 20 20 74 69 6d 65 6f 75 74 20 6e  s..    timeout n
10e0: 74 69 6d 65 20 64 2d 20 31 30 30 30 30 30 30 30  time d- 10000000
10f0: 30 30 20 66 6d 2f 6d 6f 64 20 6e 69 70 0a 09 20  00 fm/mod nip.. 
1100: 20 20 20 64 75 70 20 72 3e 20 3c 3e 20 49 46 20     dup r> <> IF 
1110: 20 27 2e 27 20 65 6d 69 74 20 20 54 48 45 4e 20   '.' emit  THEN 
1120: 20 3e 72 0a 20 20 20 20 52 45 50 45 41 54 0a 20   >r.    REPEAT. 
1130: 20 20 20 72 3e 20 6b 69 6c 6c 2d 73 65 63 6f 6e     r> kill-secon
1140: 64 73 23 20 3c 3e 20 49 46 20 20 63 72 20 20 54  ds# <> IF  cr  T
1150: 48 45 4e 20 20 32 64 72 6f 70 20 3b 0a 0a 66 6f  HEN  2drop ;..fo
1160: 72 77 61 72 64 20 21 73 61 76 65 2d 61 6c 6c 2d  rward !save-all-
1170: 6d 73 67 73 0a 0a 30 20 77 61 72 6e 69 6e 67 73  msgs..0 warnings
1180: 20 21 40 0a 3a 20 62 79 65 20 20 21 73 61 76 65   !@.: bye  !save
1190: 2d 61 6c 6c 2d 6d 73 67 73 20 6e 65 74 32 6f 2d  -all-msgs net2o-
11a0: 6b 69 6c 6c 73 20 62 79 65 20 3b 0a 77 61 72 6e  kills bye ;.warn
11b0: 69 6e 67 73 20 21 0a 0a 5c 20 70 61 63 6b 65 74  ings !..\ packet
11c0: 26 68 65 61 64 65 72 20 73 69 7a 65 0a 0a 5c 20  &header size..\ 
11d0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69  The first byte i
11e0: 73 20 6f 72 67 61 6e 69 7a 65 64 20 69 6e 20 61  s organized in a
11f0: 20 77 61 79 20 74 68 61 74 20 77 6f 72 6b 73 20   way that works 
1200: 6f 6e 20 77 69 72 65 64 2d 6f 72 20 62 75 73 73  on wired-or buss
1210: 65 73 2c 0a 5c 20 65 2e 67 2e 20 43 41 4e 20 62  es,.\ e.g. CAN b
1220: 75 73 2c 20 69 2e 65 2e 20 68 69 67 68 65 72 20  us, i.e. higher 
1230: 70 72 69 6f 72 69 74 79 20 61 6e 64 20 73 6d 61  priority and sma
1240: 6c 6c 65 72 20 68 65 61 64 65 72 20 61 6e 64 20  ller header and 
1250: 64 61 74 61 20 73 69 7a 65 0a 5c 20 77 69 6e 73  data size.\ wins
1260: 20 61 72 62 69 74 72 61 74 69 6f 6e 2e 20 20 55   arbitration.  U
1270: 73 65 20 4d 53 42 20 66 69 72 73 74 2c 20 30 20  se MSB first, 0 
1280: 61 73 20 64 6f 6d 69 6e 61 6e 74 20 62 69 74 2e  as dominant bit.
1290: 0a 0a 24 30 30 20 43 6f 6e 73 74 61 6e 74 20 71  ..$00 Constant q
12a0: 6f 73 30 23 20 5c 20 68 69 67 68 65 73 74 20 70  os0# \ highest p
12b0: 72 69 6f 72 69 74 79 0a 24 34 30 20 43 6f 6e 73  riority.$40 Cons
12c0: 74 61 6e 74 20 71 6f 73 31 23 0a 24 38 30 20 43  tant qos1#.$80 C
12d0: 6f 6e 73 74 61 6e 74 20 71 6f 73 32 23 0a 24 43  onstant qos2#.$C
12e0: 30 20 43 6f 6e 73 74 61 6e 74 20 71 6f 73 33 23  0 Constant qos3#
12f0: 20 5c 20 6c 6f 77 65 73 74 0a 0a 24 33 30 20 43   \ lowest..$30 C
1300: 6f 6e 73 74 61 6e 74 20 68 65 61 64 65 72 73 69  onstant headersi
1310: 7a 65 23 0a 24 30 30 20 43 6f 6e 73 74 61 6e 74  ze#.$00 Constant
1320: 20 31 36 62 69 74 23 20 5c 20 70 72 6f 74 6f 63   16bit# \ protoc
1330: 6f 6c 20 66 6f 72 20 76 65 72 79 20 73 6d 61 6c  ol for very smal
1340: 6c 20 6e 65 74 77 6f 72 6b 73 0a 24 31 30 20 43  l networks.$10 C
1350: 6f 6e 73 74 61 6e 74 20 36 34 62 69 74 23 20 5c  onstant 64bit# \
1360: 20 73 74 61 6e 64 61 72 64 2c 20 65 6e 63 72 79   standard, encry
1370: 70 74 65 64 20 70 72 6f 74 6f 63 6f 6c 0a 24 30  pted protocol.$0
1380: 46 20 43 6f 6e 73 74 61 6e 74 20 64 61 74 61 73  F Constant datas
1390: 69 7a 65 23 0a 0a 43 72 65 61 74 65 20 68 65 61  ize#..Create hea
13a0: 64 65 72 2d 73 69 7a 65 73 20 20 24 30 36 20 63  der-sizes  $06 c
13b0: 2c 20 24 31 61 20 63 2c 20 24 46 46 20 63 2c 20  , $1a c, $FF c, 
13c0: 24 46 46 20 63 2c 0a 43 72 65 61 74 65 20 74 61  $FF c,.Create ta
13d0: 69 6c 2d 73 69 7a 65 73 20 20 20 20 24 30 30 20  il-sizes    $00 
13e0: 63 2c 20 24 31 30 20 63 2c 20 24 46 46 20 63 2c  c, $10 c, $FF c,
13f0: 20 24 46 46 20 63 2c 0a 43 72 65 61 74 65 20 61   $FF c,.Create a
1400: 64 64 2d 73 69 7a 65 73 20 20 20 20 20 24 30 36  dd-sizes     $06
1410: 20 63 2c 20 24 32 61 20 63 2c 20 24 46 46 20 63   c, $2a c, $FF c
1420: 2c 20 24 46 46 20 63 2c 0a 5c 20 77 65 20 64 6f  , $FF c,.\ we do
1430: 6e 27 74 20 6b 6e 6f 77 20 74 68 65 20 68 65 61  n't know the hea
1440: 64 65 72 20 73 69 7a 65 73 20 6f 66 20 70 72 6f  der sizes of pro
1450: 74 6f 63 6f 6c 73 20 32 20 61 6e 64 20 33 20 79  tocols 2 and 3 y
1460: 65 74 20 3b 2d 29 0a 0a 3a 20 68 65 61 64 65 72  et ;-)..: header
1470: 2d 73 69 7a 65 20 28 20 61 64 64 72 20 2d 2d 20  -size ( addr -- 
1480: 6e 20 29 20 20 63 40 20 68 65 61 64 65 72 73 69  n )  c@ headersi
1490: 7a 65 23 20 61 6e 64 20 34 20 72 73 68 69 66 74  ze# and 4 rshift
14a0: 20 68 65 61 64 65 72 2d 73 69 7a 65 73 20 2b 20   header-sizes + 
14b0: 63 40 20 3b 0a 3a 20 74 61 69 6c 2d 73 69 7a 65  c@ ;.: tail-size
14c0: 20 28 20 61 64 64 72 20 2d 2d 20 6e 20 29 20 20   ( addr -- n )  
14d0: 63 40 20 68 65 61 64 65 72 73 69 7a 65 23 20 61  c@ headersize# a
14e0: 6e 64 20 34 20 72 73 68 69 66 74 20 74 61 69 6c  nd 4 rshift tail
14f0: 2d 73 69 7a 65 73 20 2b 20 63 40 20 3b 0a 3a 20  -sizes + c@ ;.: 
1500: 61 64 64 2d 73 69 7a 65 20 28 20 61 64 64 72 20  add-size ( addr 
1510: 2d 2d 20 6e 20 29 20 20 63 40 20 68 65 61 64 65  -- n )  c@ heade
1520: 72 73 69 7a 65 23 20 61 6e 64 20 34 20 72 73 68  rsize# and 4 rsh
1530: 69 66 74 20 61 64 64 2d 73 69 7a 65 73 20 2b 20  ift add-sizes + 
1540: 63 40 20 3b 0a 3a 20 62 6f 64 79 2d 73 69 7a 65  c@ ;.: body-size
1550: 20 28 20 61 64 64 72 20 2d 2d 20 6e 20 29 20 6d   ( addr -- n ) m
1560: 69 6e 2d 73 69 7a 65 20 73 77 61 70 20 63 40 20  in-size swap c@ 
1570: 64 61 74 61 73 69 7a 65 23 20 61 6e 64 20 6c 73  datasize# and ls
1580: 68 69 66 74 20 3b 0a 3a 20 70 61 63 6b 65 74 2d  hift ;.: packet-
1590: 73 69 7a 65 20 28 20 61 64 64 72 20 2d 2d 20 6e  size ( addr -- n
15a0: 20 29 0a 20 20 20 20 64 75 70 20 61 64 64 2d 73   ).    dup add-s
15b0: 69 7a 65 20 73 77 61 70 20 62 6f 64 79 2d 73 69  ize swap body-si
15c0: 7a 65 20 2b 20 3b 0a 3a 20 70 61 63 6b 65 74 2d  ze + ;.: packet-
15d0: 62 6f 64 79 20 28 20 61 64 64 72 20 2d 2d 20 61  body ( addr -- a
15e0: 64 64 72 20 29 0a 20 20 20 20 64 75 70 20 68 65  ddr ).    dup he
15f0: 61 64 65 72 2d 73 69 7a 65 20 2b 20 3b 0a 3a 20  ader-size + ;.: 
1600: 70 61 63 6b 65 74 2d 64 61 74 61 20 28 20 61 64  packet-data ( ad
1610: 64 72 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20  dr -- addr u ). 
1620: 20 20 20 3e 72 20 72 40 20 68 65 61 64 65 72 2d     >r r@ header-
1630: 73 69 7a 65 20 72 40 20 2b 20 72 3e 20 62 6f 64  size r@ + r> bod
1640: 79 2d 73 69 7a 65 20 3b 0a 0a 61 64 64 2d 73 69  y-size ;..add-si
1650: 7a 65 73 20 31 2b 20 63 40 20 6d 69 6e 2d 73 69  zes 1+ c@ min-si
1660: 7a 65 20 2b 20 43 6f 6e 73 74 61 6e 74 20 6d 69  ze + Constant mi
1670: 6e 70 61 63 6b 65 74 23 0a 0a 5c 20 73 65 63 6f  npacket#..\ seco
1680: 6e 64 20 62 79 74 65 20 63 6f 6e 73 74 61 6e 74  nd byte constant
1690: 73 0a 0a 24 38 30 20 43 6f 6e 73 74 61 6e 74 20  s..$80 Constant 
16a0: 62 72 6f 61 64 63 61 73 74 69 6e 67 23 20 5c 20  broadcasting# \ 
16b0: 73 70 65 63 69 61 6c 20 66 6c 61 67 73 20 66 6f  special flags fo
16c0: 72 20 73 77 69 74 63 68 65 73 0a 24 34 30 20 43  r switches.$40 C
16d0: 6f 6e 73 74 61 6e 74 20 6d 75 6c 74 69 63 61 73  onstant multicas
16e0: 74 69 6e 67 23 0a 0a 5c 20 24 33 30 20 43 6f 6e  ting#..\ $30 Con
16f0: 73 74 61 6e 74 20 6e 65 74 32 6f 2d 72 65 73 65  stant net2o-rese
1700: 72 76 65 64 23 20 2d 20 73 68 6f 75 6c 64 20 62  rved# - should b
1710: 65 20 30 0a 0a 24 30 38 20 43 6f 6e 73 74 61 6e  e 0..$08 Constan
1720: 74 20 73 74 61 74 65 6c 65 73 73 23 20 5c 20 73  t stateless# \ s
1730: 74 61 74 65 6c 65 73 73 20 6d 65 73 73 61 67 65  tateless message
1740: 0a 24 30 37 20 43 6f 6e 73 74 61 6e 74 20 61 63  .$07 Constant ac
1750: 6b 73 23 0a 24 30 31 20 43 6f 6e 73 74 61 6e 74  ks#.$01 Constant
1760: 20 61 63 6b 2d 74 6f 67 67 6c 65 23 0a 24 30 32   ack-toggle#.$02
1770: 20 43 6f 6e 73 74 61 6e 74 20 62 32 62 2d 74 6f   Constant b2b-to
1780: 67 67 6c 65 23 0a 24 30 34 20 43 6f 6e 73 74 61  ggle#.$04 Consta
1790: 6e 74 20 72 65 73 65 6e 64 2d 74 6f 67 67 6c 65  nt resend-toggle
17a0: 23 0a 0a 5c 20 73 68 6f 72 74 20 70 61 63 6b 65  #..\ short packe
17b0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 0a 3a  t information..:
17c0: 20 2e 68 65 61 64 65 72 20 28 20 61 64 64 72 20   .header ( addr 
17d0: 2d 2d 20 29 20 62 61 73 65 20 40 20 3e 72 20 68  -- ) base @ >r h
17e0: 65 78 0a 20 20 20 20 64 75 70 20 63 40 20 3e 72  ex.    dup c@ >r
17f0: 0a 20 20 20 20 6d 69 6e 2d 73 69 7a 65 20 72 3e  .    min-size r>
1800: 20 64 61 74 61 73 69 7a 65 23 20 61 6e 64 20 6c   datasize# and l
1810: 73 68 69 66 74 20 68 65 78 2e 20 2e 22 20 62 79  shift hex. ." by
1820: 74 65 73 20 74 6f 20 22 0a 20 20 20 20 6d 61 70  tes to ".    map
1830: 61 64 64 72 20 6c 65 2d 36 34 40 20 75 36 34 2e  addr le-64@ u64.
1840: 20 63 72 0a 20 20 20 20 72 3e 20 62 61 73 65 20   cr.    r> base 
1850: 21 20 3b 0a 0a 5c 20 65 61 63 68 20 73 6f 75 72  ! ;..\ each sour
1860: 63 65 20 68 61 73 20 6d 75 6c 74 69 70 6c 65 20  ce has multiple 
1870: 64 65 73 74 69 6e 61 74 69 6f 6e 20 73 70 61 63  destination spac
1880: 65 73 0a 0a 36 34 55 73 65 72 20 64 65 73 74 2d  es..64User dest-
1890: 61 64 64 72 0a 55 73 65 72 20 64 65 73 74 2d 66  addr.User dest-f
18a0: 6c 61 67 73 0a 0a 3a 20 3e 72 65 74 2d 61 64 64  lags..: >ret-add
18b0: 72 20 28 20 2d 2d 20 29 0a 20 20 20 20 69 6e 62  r ( -- ).    inb
18c0: 75 66 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 72  uf destination r
18d0: 65 74 75 72 6e 2d 61 64 64 72 20 72 65 76 65 72  eturn-addr rever
18e0: 73 65 24 31 36 20 3b 0a 3a 20 3e 64 65 73 74 2d  se$16 ;.: >dest-
18f0: 61 64 64 72 20 28 20 2d 2d 20 29 0a 20 20 20 20  addr ( -- ).    
1900: 69 6e 62 75 66 20 6d 61 70 61 64 64 72 20 6c 65  inbuf mapaddr le
1910: 2d 36 34 40 20 64 65 73 74 2d 61 64 64 72 20 36  -64@ dest-addr 6
1920: 34 21 0a 20 20 20 20 69 6e 62 75 66 20 68 64 72  4!.    inbuf hdr
1930: 66 6c 61 67 73 20 6c 65 2d 75 77 40 20 64 65 73  flags le-uw@ des
1940: 74 2d 66 6c 61 67 73 20 6c 65 2d 77 21 20 3b 0a  t-flags le-w! ;.
1950: 0a 5c 20 76 61 6c 69 64 61 74 69 6f 6e 20 73 74  .\ validation st
1960: 75 66 66 0a 0a 55 73 65 72 20 76 61 6c 69 64 61  uff..User valida
1970: 74 65 64 0a 0a 24 30 30 30 31 20 43 6f 6e 73 74  ted..$0001 Const
1980: 61 6e 74 20 63 72 79 70 74 2d 76 61 6c 0a 24 30  ant crypt-val.$0
1990: 30 30 32 20 43 6f 6e 73 74 61 6e 74 20 6f 77 6e  002 Constant own
19a0: 2d 63 72 79 70 74 2d 76 61 6c 0a 24 30 30 30 34  -crypt-val.$0004
19b0: 20 43 6f 6e 73 74 61 6e 74 20 6c 6f 67 69 6e 2d   Constant login-
19c0: 76 61 6c 0a 24 30 30 30 38 20 43 6f 6e 73 74 61  val.$0008 Consta
19d0: 6e 74 20 63 6f 6f 6b 69 65 2d 76 61 6c 0a 24 30  nt cookie-val.$0
19e0: 30 31 30 20 43 6f 6e 73 74 61 6e 74 20 74 6d 70  010 Constant tmp
19f0: 2d 63 72 79 70 74 2d 76 61 6c 0a 24 30 30 32 30  -crypt-val.$0020
1a00: 20 43 6f 6e 73 74 61 6e 74 20 73 69 67 6e 65 64   Constant signed
1a10: 2d 76 61 6c 0a 24 30 30 34 30 20 43 6f 6e 73 74  -val.$0040 Const
1a20: 61 6e 74 20 6e 65 77 64 61 74 61 2d 76 61 6c 0a  ant newdata-val.
1a30: 24 30 30 38 30 20 43 6f 6e 73 74 61 6e 74 20 6e  $0080 Constant n
1a40: 65 77 63 6f 64 65 2d 76 61 6c 0a 24 30 31 30 30  ewcode-val.$0100
1a50: 20 43 6f 6e 73 74 61 6e 74 20 6b 65 79 70 61 69   Constant keypai
1a60: 72 2d 76 61 6c 0a 24 30 32 30 30 20 43 6f 6e 73  r-val.$0200 Cons
1a70: 74 61 6e 74 20 72 65 63 65 69 76 65 2d 76 61 6c  tant receive-val
1a80: 0a 24 30 34 30 30 20 43 6f 6e 73 74 61 6e 74 20  .$0400 Constant 
1a90: 69 76 73 2d 76 61 6c 0a 24 30 38 30 30 20 43 6f  ivs-val.$0800 Co
1aa0: 6e 73 74 61 6e 74 20 71 72 2d 74 6d 70 2d 76 61  nstant qr-tmp-va
1ab0: 6c 0a 24 31 30 30 30 20 43 6f 6e 73 74 61 6e 74  l.$1000 Constant
1ac0: 20 65 6e 63 2d 63 72 79 70 74 2d 76 61 6c 0a 24   enc-crypt-val.$
1ad0: 32 30 30 30 20 43 6f 6e 73 74 61 6e 74 20 61 63  2000 Constant ac
1ae0: 6b 2d 6f 72 64 65 72 2d 76 61 6c 0a 24 34 30 30  k-order-val.$400
1af0: 30 20 43 6f 6e 73 74 61 6e 74 20 77 61 6c 6c 65  0 Constant walle
1b00: 74 2d 76 61 6c 0a 0a 24 31 30 20 43 6f 6e 73 74  t-val..$10 Const
1b10: 61 6e 74 20 76 61 6c 69 64 61 74 65 64 23 0a 0a  ant validated#..
1b20: 3a 20 63 72 79 70 74 3f 20 20 20 20 20 28 20 2d  : crypt?     ( -
1b30: 2d 20 66 6c 61 67 20 29 20 20 76 61 6c 69 64 61  - flag )  valida
1b40: 74 65 64 20 40 20 63 72 79 70 74 2d 76 61 6c 20  ted @ crypt-val 
1b50: 20 20 20 20 61 6e 64 20 3b 0a 3a 20 6f 77 6e 2d      and ;.: own-
1b60: 63 72 79 70 74 3f 20 28 20 2d 2d 20 66 6c 61 67  crypt? ( -- flag
1b70: 20 29 20 20 76 61 6c 69 64 61 74 65 64 20 40 20   )  validated @ 
1b80: 6f 77 6e 2d 63 72 79 70 74 2d 76 61 6c 20 61 6e  own-crypt-val an
1b90: 64 20 3b 0a 3a 20 6c 6f 67 69 6e 3f 20 20 20 20  d ;.: login?    
1ba0: 20 28 20 2d 2d 20 66 6c 61 67 20 29 20 20 76 61   ( -- flag )  va
1bb0: 6c 69 64 61 74 65 64 20 40 20 6c 6f 67 69 6e 2d  lidated @ login-
1bc0: 76 61 6c 20 20 20 20 20 61 6e 64 20 3b 0a 3a 20  val     and ;.: 
1bd0: 63 6f 6f 6b 69 65 3f 20 20 20 20 28 20 2d 2d 20  cookie?    ( -- 
1be0: 66 6c 61 67 20 29 20 20 76 61 6c 69 64 61 74 65  flag )  validate
1bf0: 64 20 40 20 63 6f 6f 6b 69 65 2d 76 61 6c 20 20  d @ cookie-val  
1c00: 20 20 61 6e 64 20 3b 0a 3a 20 74 6d 70 2d 63 72    and ;.: tmp-cr
1c10: 79 70 74 3f 20 28 20 2d 2d 20 66 6c 61 67 20 29  ypt? ( -- flag )
1c20: 20 20 76 61 6c 69 64 61 74 65 64 20 40 20 74 6d    validated @ tm
1c30: 70 2d 63 72 79 70 74 2d 76 61 6c 20 61 6e 64 20  p-crypt-val and 
1c40: 3b 0a 3a 20 73 69 67 6e 65 64 3f 20 20 20 20 28  ;.: signed?    (
1c50: 20 2d 2d 20 66 6c 61 67 20 29 20 20 76 61 6c 69   -- flag )  vali
1c60: 64 61 74 65 64 20 40 20 73 69 67 6e 65 64 2d 76  dated @ signed-v
1c70: 61 6c 20 20 20 20 61 6e 64 20 3b 0a 3a 20 71 72  al    and ;.: qr
1c80: 2d 63 72 79 70 74 3f 20 20 28 20 2d 2d 20 66 6c  -crypt?  ( -- fl
1c90: 61 67 20 29 20 20 76 61 6c 69 64 61 74 65 64 20  ag )  validated 
1ca0: 40 20 71 72 2d 74 6d 70 2d 76 61 6c 20 20 20 20  @ qr-tmp-val    
1cb0: 61 6e 64 20 3b 0a 3a 20 65 6e 63 2d 63 72 79 70  and ;.: enc-cryp
1cc0: 74 3f 20 28 20 2d 2d 20 66 6c 61 67 20 29 20 20  t? ( -- flag )  
1cd0: 76 61 6c 69 64 61 74 65 64 20 40 20 65 6e 63 2d  validated @ enc-
1ce0: 63 72 79 70 74 2d 76 61 6c 20 61 6e 64 20 3b 0a  crypt-val and ;.
1cf0: 3a 20 61 63 6b 2d 6f 72 64 65 72 3f 20 28 20 2d  : ack-order? ( -
1d00: 2d 20 66 6c 61 67 20 29 20 20 76 61 6c 69 64 61  - flag )  valida
1d10: 74 65 64 20 40 20 61 63 6b 2d 6f 72 64 65 72 2d  ted @ ack-order-
1d20: 76 61 6c 20 61 6e 64 20 3b 0a 3a 20 21 21 77 61  val and ;.: !!wa
1d30: 6c 6c 65 74 3f 20 20 28 20 2d 2d 20 29 20 20 20  llet?  ( -- )   
1d40: 20 20 20 20 76 61 6c 69 64 61 74 65 64 20 40 20      validated @ 
1d50: 77 61 6c 6c 65 74 2d 76 61 6c 20 20 20 20 61 6e  wallet-val    an
1d60: 64 20 30 3d 20 21 21 77 61 6c 6c 65 74 21 21 20  d 0= !!wallet!! 
1d70: 3b 0a 3a 20 21 21 73 69 67 6e 65 64 3f 20 20 28  ;.: !!signed?  (
1d80: 20 2d 2d 20 29 20 73 69 67 6e 65 64 3f 20 30 3d   -- ) signed? 0=
1d90: 20 21 21 75 6e 73 69 67 6e 65 64 21 21 20 3b 0a   !!unsigned!! ;.
1da0: 3a 20 21 21 75 6e 73 69 67 6e 65 64 3f 20 20 28  : !!unsigned?  (
1db0: 20 2d 2d 20 29 20 73 69 67 6e 65 64 3f 20 20 21   -- ) signed?  !
1dc0: 21 73 69 67 6e 65 64 21 21 20 3b 0a 0a 5c 20 3a  !signed!! ;..\ :
1dd0: 20 72 65 71 6d 61 73 6b 20 28 20 2d 2d 20 61 64   reqmask ( -- ad
1de0: 64 72 20 29 0a 5c 20 20 20 20 20 74 61 73 6b 23  dr ).\     task#
1df0: 20 40 20 72 65 71 6d 61 73 6b 5b 5d 20 24 5b 5d   @ reqmask[] $[]
1e00: 20 3b 0a 0a 5c 20 65 76 65 6e 74 73 20 66 6f 72   ;..\ events for
1e10: 20 63 6f 6e 74 65 78 74 2d 6f 72 69 65 6e 74 65   context-oriente
1e20: 64 20 62 65 68 61 76 69 6f 72 0a 0a 44 65 66 65  d behavior..Defe
1e30: 72 20 64 6f 2d 63 6f 6e 6e 65 63 74 0a 44 65 66  r do-connect.Def
1e40: 65 72 20 64 6f 2d 64 69 73 63 6f 6e 6e 65 63 74  er do-disconnect
1e50: 0a 0a 65 76 65 6e 74 3a 20 3a 3e 63 6f 6e 6e 65  ..event: :>conne
1e60: 63 74 20 20 20 20 28 20 63 6f 6e 6e 65 63 74 69  ct    ( connecti
1e70: 6f 6e 20 2d 2d 20 29 20 2e 64 6f 2d 63 6f 6e 6e  on -- ) .do-conn
1e80: 65 63 74 20 3b 0a 0a 5c 20 63 68 65 63 6b 20 66  ect ;..\ check f
1e90: 6f 72 20 76 61 6c 69 64 20 64 65 73 74 69 6e 61  or valid destina
1ea0: 74 69 6f 6e 0a 0a 56 61 72 69 61 62 6c 65 20 64  tion..Variable d
1eb0: 65 73 74 2d 6d 61 70 20 73 22 20 22 20 64 65 73  est-map s" " des
1ec0: 74 2d 6d 61 70 20 24 21 0a 3a 6e 6f 6e 61 6d 65  t-map $!.:noname
1ed0: 20 64 65 66 65 72 73 20 27 63 6f 6c 64 20 61 6c   defers 'cold al
1ee0: 6c 6f 63 2d 69 6f 20 64 65 73 74 2d 6d 61 70 20  loc-io dest-map 
1ef0: 24 69 6e 69 74 20 3b 20 69 73 20 27 63 6f 6c 64  $init ; is 'cold
1f00: 0a 0a 24 31 30 30 20 56 61 6c 75 65 20 64 65 73  ..$100 Value des
1f10: 74 73 23 0a 35 36 20 56 61 6c 75 65 20 64 65 73  ts#.56 Value des
1f20: 74 73 3e 3e 0a 0a 3a 20 73 65 74 2d 64 65 73 74  ts>>..: set-dest
1f30: 73 23 20 28 20 62 69 74 73 20 2d 2d 20 29 0a 20  s# ( bits -- ). 
1f40: 20 20 20 31 20 6f 76 65 72 20 6c 73 68 69 66 74     1 over lshift
1f50: 20 74 6f 20 64 65 73 74 73 23 0a 20 20 20 20 36   to dests#.    6
1f60: 34 20 73 77 61 70 20 2d 20 74 6f 20 64 65 73 74  4 swap - to dest
1f70: 73 3e 3e 0a 20 20 20 20 64 65 73 74 73 23 20 32  s>>.    dests# 2
1f80: 2a 20 63 65 6c 6c 73 20 64 65 73 74 2d 6d 61 70  * cells dest-map
1f90: 20 24 21 6c 65 6e 0a 20 20 20 20 64 65 73 74 2d   $!len.    dest-
1fa0: 6d 61 70 20 24 40 20 65 72 61 73 65 20 3b 0a 0a  map $@ erase ;..
1fb0: 38 20 73 65 74 2d 64 65 73 74 73 23 0a 0a 3a 20  8 set-dests#..: 
1fc0: 3e 64 65 73 74 2d 6d 61 70 20 28 20 76 61 64 64  >dest-map ( vadd
1fd0: 72 20 2d 2d 20 61 64 64 72 20 29 0a 20 20 20 20  r -- addr ).    
1fe0: 64 65 73 74 73 3e 3e 20 36 34 72 73 68 69 66 74  dests>> 64rshift
1ff0: 20 36 34 3e 6e 20 32 2a 20 63 65 6c 6c 73 20 64   64>n 2* cells d
2000: 65 73 74 2d 6d 61 70 20 24 40 20 64 72 6f 70 20  est-map $@ drop 
2010: 2b 20 3b 0a 0a 73 63 6f 70 65 7b 20 6d 61 70 63  + ;..scope{ mapc
2020: 0a 0a 3a 20 3e 64 61 74 61 2d 68 65 61 64 20 28  ..: >data-head (
2030: 20 61 64 64 72 20 6f 3a 6d 61 70 20 2d 2d 20 66   addr o:map -- f
2040: 6c 61 67 20 29 20 20 64 65 73 74 2d 73 69 7a 65  lag )  dest-size
2050: 20 31 2d 20 3e 72 0a 20 20 20 20 64 75 70 20 64   1- >r.    dup d
2060: 65 73 74 2d 62 61 63 6b 20 72 40 20 61 6e 64 20  est-back r@ and 
2070: 75 3c 20 49 46 20 20 72 40 20 2b 20 31 2b 20 20  u< IF  r@ + 1+  
2080: 54 48 45 4e 0a 20 20 20 20 64 65 73 74 2d 62 61  THEN.    dest-ba
2090: 63 6b 20 72 3e 20 69 6e 76 65 72 74 20 61 6e 64  ck r> invert and
20a0: 20 2b 20 5c 20 61 64 64 20 74 6f 74 61 6c 20 6f   + \ add total o
20b0: 66 66 73 65 74 0a 20 20 20 20 6d 61 78 64 61 74  ffset.    maxdat
20c0: 61 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  a +             
20d0: 20 20 20 20 20 20 5c 20 61 64 64 20 6f 6e 65 20        \ add one 
20e0: 70 61 63 6b 65 74 20 73 69 7a 65 0a 20 20 20 20  packet size.    
20f0: 64 75 70 20 61 64 64 72 20 64 65 73 74 2d 68 65  dup addr dest-he
2100: 61 64 20 75 6d 61 78 21 40 20 3c 3e 20 3b 0a 0a  ad umax!@ <> ;..
2110: 3a 20 3e 6c 69 6e 65 61 72 20 28 20 61 64 64 72  : >linear ( addr
2120: 20 2d 2d 20 61 64 64 72 27 20 29 20 5c 20 6f 3a   -- addr' ) \ o:
2130: 6d 61 70 0a 20 20 20 20 64 75 70 20 64 65 73 74  map.    dup dest
2140: 2d 62 61 63 6b 20 64 65 73 74 2d 73 69 7a 65 20  -back dest-size 
2150: 31 2d 20 61 6e 64 20 75 3c 20 64 65 73 74 2d 73  1- and u< dest-s
2160: 69 7a 65 20 61 6e 64 20 2b 0a 20 20 20 20 64 65  ize and +.    de
2170: 73 74 2d 62 61 63 6b 20 64 65 73 74 2d 73 69 7a  st-back dest-siz
2180: 65 20 6e 65 67 61 74 65 20 61 6e 64 20 2b 20 3b  e negate and + ;
2190: 0a 0a 7d 73 63 6f 70 65 0a 0a 3a 20 64 65 73 74  ..}scope..: dest
21a0: 2d 69 6e 64 65 78 20 28 20 2d 2d 20 61 64 64 72  -index ( -- addr
21b0: 20 29 20 64 65 73 74 2d 61 64 64 72 20 36 34 40   ) dest-addr 64@
21c0: 20 3e 64 65 73 74 2d 6d 61 70 20 3b 0a 0a 3a 20   >dest-map ;..: 
21d0: 63 68 65 63 6b 2d 64 65 73 74 20 28 20 73 69 7a  check-dest ( siz
21e0: 65 20 2d 2d 20 61 64 64 72 20 6d 61 70 20 6f 3a  e -- addr map o:
21f0: 6a 6f 62 20 2f 20 66 20 29 0a 20 20 20 20 5c 47  job / f ).    \G
2200: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   return false if
2210: 20 69 6e 76 61 6c 69 64 20 64 65 73 74 69 6e 61   invalid destina
2220: 74 69 6f 6e 0a 20 20 20 20 5c 47 20 72 65 74 75  tion.    \G retu
2230: 72 6e 20 31 20 69 66 20 63 6f 64 65 2c 20 2d 31  rn 1 if code, -1
2240: 20 69 66 20 64 61 74 61 2c 20 70 6c 75 73 20 64   if data, plus d
2250: 65 73 74 69 6e 61 74 69 6f 6e 20 61 64 64 72 65  estination addre
2260: 73 73 0a 20 20 20 20 6e 65 67 61 74 65 20 5c 20  ss.    negate \ 
2270: 67 65 6e 65 72 61 74 65 20 6d 61 73 6b 0a 20 20  generate mask.  
2280: 20 20 64 65 73 74 2d 69 6e 64 65 78 20 32 20 63    dest-index 2 c
2290: 65 6c 6c 73 20 62 6f 75 6e 64 73 20 3f 44 4f 0a  ells bounds ?DO.
22a0: 09 49 20 40 20 49 46 0a 09 20 20 20 20 64 75 70  .I @ IF..    dup
22b0: 20 64 65 73 74 2d 61 64 64 72 20 36 34 40 20 49   dest-addr 64@ I
22c0: 20 40 20 77 69 74 68 20 6d 61 70 63 0a 09 20 20   @ with mapc..  
22d0: 20 20 64 65 73 74 2d 76 61 64 64 72 20 36 34 2d    dest-vaddr 64-
22e0: 20 36 34 3e 6e 20 61 6e 64 20 64 75 70 0a 09 20   64>n and dup.. 
22f0: 20 20 20 64 65 73 74 2d 73 69 7a 65 20 75 3c 0a     dest-size u<.
2300: 09 20 20 20 20 49 46 0a 09 09 64 75 70 20 61 64  .    IF...dup ad
2310: 64 72 3e 62 69 74 73 20 61 63 6b 2d 62 69 74 23  dr>bits ack-bit#
2320: 20 21 0a 09 09 64 65 73 74 2d 72 61 64 64 72 20   !...dest-raddr 
2330: 73 77 61 70 20 64 75 70 20 3e 64 61 74 61 2d 68  swap dup >data-h
2340: 65 61 64 20 74 6f 20 61 63 6b 2d 61 64 76 61 6e  ead to ack-advan
2350: 63 65 3f 20 2b 0a 09 09 6f 20 70 61 72 65 6e 74  ce? +...o parent
2360: 20 6f 3e 20 3e 6f 20 72 64 72 6f 70 0a 09 09 55   o> >o rdrop...U
2370: 4e 4c 4f 4f 50 20 20 72 6f 74 20 64 72 6f 70 20  NLOOP  rot drop 
2380: 20 45 58 49 54 20 20 54 48 45 4e 0a 09 20 20 20   EXIT  THEN..   
2390: 20 64 72 6f 70 20 65 6e 64 77 69 74 68 0a 09 54   drop endwith..T
23a0: 48 45 4e 0a 20 20 20 20 63 65 6c 6c 20 2b 4c 4f  HEN.    cell +LO
23b0: 4f 50 0a 20 20 20 20 64 72 6f 70 20 66 61 6c 73  OP.    drop fals
23c0: 65 20 3b 0a 0a 5c 20 63 6f 6e 74 65 78 74 20 64  e ;..\ context d
23d0: 65 62 75 67 67 69 6e 67 0a 0a 3a 20 2e 6f 20 28  ebugging..: .o (
23e0: 20 2d 2d 20 29 20 63 6f 6e 74 65 78 74 23 20 3f   -- ) context# ?
23f0: 20 3b 0a 3a 20 6f 3f 20 28 20 2d 2d 20 29 20 5d   ;.: o? ( -- ) ]
2400: 5d 20 6f 20 30 3d 20 3f 45 58 49 54 20 5b 5b 20  ] o 0= ?EXIT [[ 
2410: 3b 20 69 6d 6d 65 64 69 61 74 65 0a 0a 5c 20 44  ; immediate..\ D
2420: 65 73 74 69 6e 61 74 69 6f 6e 20 6d 61 70 70 69  estination mappi
2430: 6e 67 20 63 6f 6e 74 61 69 6e 73 0a 5c 20 61 64  ng contains.\ ad
2440: 64 72 20 75 20 2d 20 72 61 6e 67 65 20 6f 66 20  dr u - range of 
2450: 76 69 72 74 61 6c 20 61 64 64 72 65 73 73 65 73  virtal addresses
2460: 0a 5c 20 61 64 64 72 27 20 2d 20 72 65 61 6c 20  .\ addr' - real 
2470: 73 74 61 72 74 20 61 64 64 72 65 73 73 0a 5c 20  start address.\ 
2480: 63 6f 6e 74 65 78 74 20 2d 20 66 6f 72 20 65 78  context - for ex
2490: 65 63 20 72 65 67 69 6f 6e 73 2c 20 74 68 69 73  ec regions, this
24a0: 20 69 73 20 74 68 65 20 6a 6f 62 20 63 6f 6e 74   is the job cont
24b0: 65 78 74 0a 0a 55 73 65 72 20 3e 63 6f 64 65 2d  ext..User >code-
24c0: 66 6c 61 67 0a 0a 73 63 6f 70 65 7b 20 6d 61 70  flag..scope{ map
24d0: 63 0a 0a 3a 20 61 6c 6c 6f 63 2d 64 61 74 61 20  c..: alloc-data 
24e0: 28 20 61 64 64 72 20 75 20 2d 2d 20 75 20 29 0a  ( addr u -- u ).
24f0: 20 20 20 20 64 75 70 20 3e 72 20 74 6f 20 64 65      dup >r to de
2500: 73 74 2d 73 69 7a 65 20 74 6f 20 64 65 73 74 2d  st-size to dest-
2510: 76 61 64 64 72 20 72 3e 0a 20 20 20 20 64 75 70  vaddr r>.    dup
2520: 20 61 6c 6c 6f 63 2b 67 75 61 72 64 20 74 6f 20   alloc+guard to 
2530: 64 65 73 74 2d 72 61 64 64 72 0a 20 20 20 20 63  dest-raddr.    c
2540: 3a 6b 65 79 23 20 63 72 79 70 74 2d 61 6c 69 67  :key# crypt-alig
2550: 6e 20 2b 20 61 6c 6c 6f 7a 20 61 64 64 72 20 64  n + alloz addr d
2560: 65 73 74 2d 69 76 73 67 65 6e 20 21 20 5c 20 21  est-ivsgen ! \ !
2570: 21 46 49 58 4d 45 21 21 20 73 68 6f 75 6c 64 20  !FIXME!! should 
2580: 62 65 20 61 20 6b 61 6c 6c 6f 63 0a 20 20 20 20  be a kalloc.    
2590: 3e 63 6f 64 65 2d 66 6c 61 67 20 40 0a 20 20 20  >code-flag @.   
25a0: 20 49 46 0a 09 64 75 70 20 61 64 64 72 3e 72 65   IF..dup addr>re
25b0: 70 6c 69 65 73 20 20 61 6c 6c 6f 63 2b 67 75 61  plies  alloc+gua
25c0: 72 64 20 74 6f 20 64 65 73 74 2d 72 65 70 6c 69  rd to dest-repli
25d0: 65 73 0a 09 33 20 74 6f 20 64 65 73 74 2d 69 76  es..3 to dest-iv
25e0: 73 6c 61 73 74 67 65 6e 0a 20 20 20 20 45 4c 53  slastgen.    ELS
25f0: 45 0a 09 64 75 70 20 61 64 64 72 3e 74 73 20 20  E..dup addr>ts  
2600: 20 20 20 20 20 61 6c 6c 6f 7a 20 74 6f 20 64 65       alloz to de
2610: 73 74 2d 74 69 6d 65 73 74 61 6d 70 73 0a 20 20  st-timestamps.  
2620: 20 20 54 48 45 4e 20 3b 0a 0a 7d 73 63 6f 70 65    THEN ;..}scope
2630: 0a 0a 3a 20 70 61 72 65 6e 74 21 20 28 20 6f 20  ..: parent! ( o 
2640: 2d 2d 20 29 0a 20 20 20 20 64 75 70 20 74 6f 20  -- ).    dup to 
2650: 70 61 72 65 6e 74 20 3f 64 75 70 2d 49 46 20 20  parent ?dup-IF  
2660: 2e 6d 79 2d 6b 65 79 20 20 45 4c 53 45 20 20 6d  .my-key  ELSE  m
2670: 79 2d 6b 65 79 2d 64 65 66 61 75 6c 74 20 20 54  y-key-default  T
2680: 48 45 4e 20 20 74 6f 20 6d 79 2d 6b 65 79 20 3b  HEN  to my-key ;
2690: 0a 0a 3a 20 6d 61 70 2d 64 61 74 61 20 28 20 61  ..: map-data ( a
26a0: 64 64 72 20 75 20 2d 2d 20 6f 20 29 0a 20 20 20  ddr u -- o ).   
26b0: 20 6f 20 3e 63 6f 64 65 2d 66 6c 61 67 20 40 20   o >code-flag @ 
26c0: 49 46 20 6d 61 70 63 3a 72 63 6f 64 65 2d 63 6c  IF mapc:rcode-cl
26d0: 61 73 73 20 45 4c 53 45 20 6d 61 70 63 3a 72 64  ass ELSE mapc:rd
26e0: 61 74 61 2d 63 6c 61 73 73 20 54 48 45 4e 20 6e  ata-class THEN n
26f0: 65 77 0a 20 20 20 20 77 69 74 68 20 6d 61 70 63  ew.    with mapc
2700: 20 70 61 72 65 6e 74 21 0a 20 20 20 20 61 6c 6c   parent!.    all
2710: 6f 63 2d 64 61 74 61 0a 20 20 20 20 3e 63 6f 64  oc-data.    >cod
2720: 65 2d 66 6c 61 67 20 40 20 30 3d 20 49 46 0a 09  e-flag @ 0= IF..
2730: 64 75 70 20 61 64 64 72 3e 62 79 74 65 73 20 61  dup addr>bytes a
2740: 6c 6c 6f 63 61 74 65 2d 62 69 74 73 20 64 61 74  llocate-bits dat
2750: 61 2d 61 63 6b 62 69 74 73 20 21 0a 20 20 20 20  a-ackbits !.    
2760: 54 48 45 4e 0a 20 20 20 20 64 72 6f 70 0a 20 20  THEN.    drop.  
2770: 20 20 6f 20 65 6e 64 77 69 74 68 20 3b 0a 0a 3a    o endwith ;..:
2780: 20 6d 61 70 2d 73 6f 75 72 63 65 20 28 20 61 64   map-source ( ad
2790: 64 72 20 75 20 61 64 64 72 78 20 2d 2d 20 6f 20  dr u addrx -- o 
27a0: 29 0a 20 20 20 20 6f 20 3e 63 6f 64 65 2d 66 6c  ).    o >code-fl
27b0: 61 67 20 40 20 49 46 20 6d 61 70 63 3a 63 6f 64  ag @ IF mapc:cod
27c0: 65 2d 63 6c 61 73 73 20 45 4c 53 45 20 6d 61 70  e-class ELSE map
27d0: 63 3a 64 61 74 61 2d 63 6c 61 73 73 20 54 48 45  c:data-class THE
27e0: 4e 20 6e 65 77 0a 20 20 20 20 77 69 74 68 20 6d  N new.    with m
27f0: 61 70 63 20 70 61 72 65 6e 74 21 0a 20 20 20 20  apc parent!.    
2800: 61 6c 6c 6f 63 2d 64 61 74 61 0a 20 20 20 20 3e  alloc-data.    >
2810: 63 6f 64 65 2d 66 6c 61 67 20 40 20 30 3d 20 49  code-flag @ 0= I
2820: 46 0a 09 64 75 70 20 61 64 64 72 3e 74 73 20 61  F..dup addr>ts a
2830: 6c 6c 6f 31 20 64 61 74 61 2d 72 65 73 65 6e 64  llo1 data-resend
2840: 23 20 21 0a 20 20 20 20 54 48 45 4e 0a 20 20 20  # !.    THEN.   
2850: 20 64 72 6f 70 0a 20 20 20 20 6f 20 65 6e 64 77   drop.    o endw
2860: 69 74 68 20 3b 0a 0a 3a 20 6d 61 70 2d 64 61 74  ith ;..: map-dat
2870: 61 2d 64 65 73 74 20 28 20 76 61 64 64 72 20 75  a-dest ( vaddr u
2880: 20 61 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 3e   addr -- ).    >
2890: 72 20 3e 72 20 36 34 64 75 70 20 72 3e 20 6d 61  r >r 64dup r> ma
28a0: 70 2d 64 61 74 61 20 72 40 20 21 20 3e 64 65 73  p-data r@ ! >des
28b0: 74 2d 6d 61 70 20 72 3e 20 40 20 73 77 61 70 20  t-map r> @ swap 
28c0: 21 20 3b 0a 3a 20 6d 61 70 2d 63 6f 64 65 2d 64  ! ;.: map-code-d
28d0: 65 73 74 20 28 20 76 61 64 64 72 20 75 20 61 64  est ( vaddr u ad
28e0: 64 72 20 2d 2d 20 29 0a 20 20 20 20 3e 72 20 3e  dr -- ).    >r >
28f0: 72 20 36 34 64 75 70 20 72 3e 20 6d 61 70 2d 64  r 64dup r> map-d
2900: 61 74 61 20 72 40 20 21 20 3e 64 65 73 74 2d 6d  ata r@ ! >dest-m
2910: 61 70 20 63 65 6c 6c 2b 20 72 3e 20 40 20 73 77  ap cell+ r> @ sw
2920: 61 70 20 21 20 3b 0a 0a 5c 20 63 72 65 61 74 65  ap ! ;..\ create
2930: 20 63 6f 6e 74 65 78 74 0a 0a 38 20 56 61 6c 75   context..8 Valu
2940: 65 20 62 75 72 73 74 73 23 20 5c 20 6e 75 6d 62  e bursts# \ numb
2950: 65 72 20 6f 66 20 0a 38 20 56 61 6c 75 65 20 64  er of .8 Value d
2960: 65 6c 74 61 2d 64 61 6d 70 23 20 5c 20 66 6f 72  elta-damp# \ for
2970: 20 63 6c 6f 63 6b 73 20 77 69 74 68 20 61 20 73   clocks with a s
2980: 6c 69 67 68 74 20 64 72 69 66 74 0a 62 75 72 73  light drift.burs
2990: 74 73 23 20 32 2a 20 32 2a 20 31 2d 20 56 61 6c  ts# 2* 2* 1- Val
29a0: 75 65 20 74 69 63 6b 2d 69 6e 69 74 20 5c 20 74  ue tick-init \ t
29b0: 69 63 6b 73 20 77 69 74 68 6f 75 74 20 61 63 6b  icks without ack
29c0: 0a 23 31 30 30 30 30 30 30 20 6d 61 78 2d 73 69  .#1000000 max-si
29d0: 7a 65 5e 32 20 6c 73 68 69 66 74 20 56 61 6c 75  ze^2 lshift Valu
29e0: 65 20 62 61 6e 64 77 69 64 74 68 2d 69 6e 69 74  e bandwidth-init
29f0: 20 5c 20 33 32 c2 b5 73 2f 62 75 72 73 74 3d 32   \ 32..s/burst=2
2a00: 4d 42 2f 73 0a 23 32 30 30 30 20 6d 61 78 2d 73  MB/s.#2000 max-s
2a10: 69 7a 65 5e 32 20 6c 73 68 69 66 74 20 56 61 6c  ize^2 lshift Val
2a20: 75 65 20 62 61 6e 64 77 69 64 74 68 2d 6d 61 78  ue bandwidth-max
2a30: 0a 36 34 23 2d 31 20 36 34 43 6f 6e 73 74 61 6e  .64#-1 64Constan
2a40: 74 20 6e 65 76 65 72 0a 32 20 56 61 6c 75 65 20  t never.2 Value 
2a50: 66 6c 79 62 75 72 73 74 73 23 0a 24 31 30 30 20  flybursts#.$100 
2a60: 56 61 6c 75 65 20 66 6c 79 62 75 72 73 74 73 2d  Value flybursts-
2a70: 6d 61 78 23 0a 24 32 30 20 63 65 6c 6c 73 20 56  max#.$20 cells V
2a80: 61 6c 75 65 20 72 65 73 65 6e 64 2d 73 69 7a 65  alue resend-size
2a90: 23 0a 23 35 30 2e 30 30 30 2e 30 30 30 20 64 3e  #.#50.000.000 d>
2aa0: 36 34 20 36 34 43 6f 6e 73 74 61 6e 74 20 69 6e  64 64Constant in
2ab0: 69 74 2d 64 65 6c 61 79 23 20 5c 20 35 30 6d 73  it-delay# \ 50ms
2ac0: 20 69 6e 69 74 69 61 6c 20 74 69 6d 65 6f 75 74   initial timeout
2ad0: 20 73 74 65 70 0a 23 36 30 2e 30 30 30 2e 30 30   step.#60.000.00
2ae0: 30 2e 30 30 30 20 64 3e 36 34 20 36 34 43 6f 6e  0.000 d>64 64Con
2af0: 73 74 61 6e 74 20 63 6f 6e 6e 65 63 74 2d 74 69  stant connect-ti
2b00: 6d 65 6f 75 74 23 20 5c 20 36 30 73 20 63 6f 6e  meout# \ 60s con
2b10: 6e 65 63 74 20 74 69 6d 65 6f 75 74 0a 0a 56 61  nect timeout..Va
2b20: 72 69 61 62 6c 65 20 69 6e 69 74 2d 63 6f 6e 74  riable init-cont
2b30: 65 78 74 23 0a 68 61 73 68 3a 20 6d 73 67 2d 67  ext#.hash: msg-g
2b40: 72 6f 75 70 23 20 28 20 68 61 73 68 20 66 6f 72  roup# ( hash for
2b50: 20 67 72 6f 75 70 20 6f 62 6a 65 63 74 73 20 29   group objects )
2b60: 0a 55 56 61 6c 75 65 20 6d 73 67 2d 67 72 6f 75  .UValue msg-grou
2b70: 70 2d 6f 0a 55 56 61 6c 75 65 20 63 6f 6e 6e 65  p-o.UValue conne
2b80: 63 74 69 6f 6e 0a 0a 69 6e 20 6e 65 74 32 6f 20  ction..in net2o 
2b90: 3a 20 6e 65 77 2d 6c 6f 67 20 28 20 2d 2d 20 6f  : new-log ( -- o
2ba0: 20 29 0a 20 20 20 20 63 6d 64 2d 63 6c 61 73 73   ).    cmd-class
2bb0: 20 6e 65 77 20 3e 6f 20 20 6c 6f 67 2d 74 61 62   new >o  log-tab
2bc0: 6c 65 20 40 20 74 6f 6b 65 6e 2d 74 61 62 6c 65  le @ token-table
2bd0: 20 21 20 6f 20 6f 3e 20 3b 0a 69 6e 20 6e 65 74   ! o o> ;.in net
2be0: 32 6f 20 3a 20 6e 65 77 2d 61 63 6b 20 28 20 2d  2o : new-ack ( -
2bf0: 2d 20 6f 20 29 0a 20 20 20 20 6f 20 61 63 6b 2d  - o ).    o ack-
2c00: 63 6c 61 73 73 20 6e 65 77 20 3e 6f 20 20 70 61  class new >o  pa
2c10: 72 65 6e 74 21 20 20 61 63 6b 2d 74 61 62 6c 65  rent!  ack-table
2c20: 20 40 20 74 6f 6b 65 6e 2d 74 61 62 6c 65 20 21   @ token-table !
2c30: 0a 20 20 20 20 69 6e 69 74 2d 64 65 6c 61 79 23  .    init-delay#
2c40: 20 72 74 64 65 6c 61 79 20 36 34 21 0a 20 20 20   rtdelay 64!.   
2c50: 20 66 6c 79 62 75 72 73 74 73 23 20 64 75 70 20   flybursts# dup 
2c60: 66 6c 79 62 75 72 73 74 73 20 21 20 66 6c 79 62  flybursts ! flyb
2c70: 75 72 73 74 20 21 0a 20 20 20 20 74 69 63 6b 73  urst !.    ticks
2c80: 20 6c 61 73 74 61 63 6b 20 36 34 21 20 5c 20 61   lastack 64! \ a
2c90: 73 6b 69 6e 67 20 66 6f 72 20 63 6f 6e 74 65 78  sking for contex
2ca0: 74 20 63 72 65 61 74 69 6f 6e 20 69 73 20 61 73  t creation is as
2cb0: 20 67 6f 6f 64 20 61 73 20 61 6e 20 61 63 6b 0a   good as an ack.
2cc0: 20 20 20 20 62 61 6e 64 77 69 64 74 68 2d 69 6e      bandwidth-in
2cd0: 69 74 20 6e 3e 36 34 20 6e 73 2f 62 75 72 73 74  it n>64 ns/burst
2ce0: 20 36 34 21 0a 20 20 20 20 6e 65 76 65 72 20 20   64!.    never  
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78               nex
2d00: 74 2d 74 69 63 6b 20 36 34 21 0a 20 20 20 20 36  t-tick 64!.    6
2d10: 34 23 30 20 20 20 20 20 20 20 20 20 20 20 20 20  4#0             
2d20: 20 20 20 65 78 74 72 61 2d 6e 73 20 36 34 21 0a     extra-ns 64!.
2d30: 20 20 20 20 6d 61 78 2d 69 6e 74 36 34 20 36 34      max-int64 64
2d40: 2d 32 2f 20 6d 69 6e 2d 73 6c 61 63 6b 20 36 34  -2/ min-slack 64
2d50: 21 0a 20 20 20 20 6d 61 78 2d 69 6e 74 36 34 20  !.    max-int64 
2d60: 36 34 2d 32 2f 20 36 34 6e 65 67 61 74 65 20 6d  64-2/ 64negate m
2d70: 61 78 2d 73 6c 61 63 6b 20 36 34 21 0a 20 20 20  ax-slack 64!.   
2d80: 20 6f 20 6f 3e 20 3b 0a 3a 20 61 63 6b 40 20 28   o o> ;.: ack@ (
2d90: 20 2d 2d 20 6f 20 29 0a 20 20 20 20 61 63 6b 2d   -- o ).    ack-
2da0: 63 6f 6e 74 65 78 74 20 40 20 3f 64 75 70 2d 30  context @ ?dup-0
2db0: 3d 2d 49 46 20 20 6e 65 74 32 6f 3a 6e 65 77 2d  =-IF  net2o:new-
2dc0: 61 63 6b 20 64 75 70 20 61 63 6b 2d 63 6f 6e 74  ack dup ack-cont
2dd0: 65 78 74 20 21 20 20 54 48 45 4e 20 3b 0a 73 63  ext !  THEN ;.sc
2de0: 6f 70 65 7b 20 6e 65 74 32 6f 0a 3a 20 6e 65 77  ope{ net2o.: new
2df0: 2d 74 6d 73 67 20 28 20 2d 2d 20 6f 20 29 0a 20  -tmsg ( -- o ). 
2e00: 20 20 20 6f 20 6d 73 67 2d 63 6c 61 73 73 20 6e     o msg-class n
2e10: 65 77 20 3e 6f 20 20 70 61 72 65 6e 74 21 20 20  ew >o  parent!  
2e20: 6d 73 67 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65  msg-table @ toke
2e30: 6e 2d 74 61 62 6c 65 20 21 20 6f 20 6f 3e 20 3b  n-table ! o o> ;
2e40: 0a 3a 20 6e 65 77 2d 6d 73 67 69 6e 67 20 28 20  .: new-msging ( 
2e50: 2d 2d 20 6f 20 29 0a 20 20 20 20 6f 20 6d 73 67  -- o ).    o msg
2e60: 69 6e 67 2d 63 6c 61 73 73 20 6e 65 77 20 3e 6f  ing-class new >o
2e70: 20 20 70 61 72 65 6e 74 21 20 20 6d 73 67 69 6e    parent!  msgin
2e80: 67 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65 6e 2d  g-table @ token-
2e90: 74 61 62 6c 65 20 21 20 6f 20 6f 3e 20 3b 0a 64  table ! o o> ;.d
2ea0: 65 66 65 72 20 6e 65 77 2d 6d 73 67 20 20 27 20  efer new-msg  ' 
2eb0: 6e 65 77 2d 74 6d 73 67 20 69 73 20 6e 65 77 2d  new-tmsg is new-
2ec0: 6d 73 67 0a 7d 73 63 6f 70 65 0a 20 20 20 20 0a  msg.}scope.    .
2ed0: 3a 20 6e 6f 2d 74 69 6d 65 6f 75 74 20 28 20 2d  : no-timeout ( -
2ee0: 2d 20 29 20 20 6d 61 78 2d 69 6e 74 36 34 20 6e  - )  max-int64 n
2ef0: 65 78 74 2d 74 69 6d 65 6f 75 74 20 36 34 21 0a  ext-timeout 64!.
2f00: 20 20 20 20 61 63 6b 2d 63 6f 6e 74 65 78 74 20      ack-context 
2f10: 40 20 3f 64 75 70 2d 49 46 20 20 2e 74 69 6d 65  @ ?dup-IF  .time
2f20: 6f 75 74 73 20 6f 66 66 20 20 54 48 45 4e 20 3b  outs off  THEN ;
2f30: 0a 0a 3a 20 2d 66 6c 6f 77 2d 63 6f 6e 74 72 6f  ..: -flow-contro
2f40: 6c 20 5b 27 5d 20 6e 6f 6f 70 20 69 73 20 61 63  l ['] noop is ac
2f50: 6b 2d 78 74 20 3b 0a 0a 36 34 55 73 65 72 20 74  k-xt ;..64User t
2f60: 69 63 6b 65 72 0a 36 34 55 73 65 72 20 63 6f 6e  icker.64User con
2f70: 74 65 78 74 2d 74 69 63 6b 65 72 20 20 36 34 23  text-ticker  64#
2f80: 30 20 63 6f 6e 74 65 78 74 2d 74 69 63 6b 65 72  0 context-ticker
2f90: 20 36 34 21 0a 0a 3a 20 72 74 64 65 6c 61 79 21   64!..: rtdelay!
2fa0: 20 28 20 74 69 6d 65 20 2d 2d 20 29 0a 20 20 20   ( time -- ).   
2fb0: 20 74 69 6d 65 6f 75 74 73 20 40 20 49 46 20 5c   timeouts @ IF \
2fc0: 20 64 6f 6e 27 74 20 75 70 64 61 74 65 20 72 74   don't update rt
2fd0: 64 65 6c 61 79 20 69 66 20 74 68 65 72 65 20 77  delay if there w
2fe0: 65 72 65 20 74 69 6d 65 6f 75 74 73 0a 09 72 74  ere timeouts..rt
2ff0: 64 65 6c 61 79 20 36 34 40 20 69 6e 69 74 2d 64  delay 64@ init-d
3000: 65 6c 61 79 23 20 36 34 3c 3e 20 49 46 20 20 36  elay# 64<> IF  6
3010: 34 64 72 6f 70 20 20 45 58 49 54 20 20 54 48 45  4drop  EXIT  THE
3020: 4e 0a 20 20 20 20 54 48 45 4e 0a 20 20 20 20 72  N.    THEN.    r
3030: 65 63 76 2d 74 69 63 6b 20 36 34 40 20 36 34 73  ecv-tick 64@ 64s
3040: 77 61 70 20 36 34 2d 0a 20 20 20 20 72 74 64 28  wap 64-.    rtd(
3050: 20 2e 22 20 72 74 64 65 6c 61 79 3a 20 22 20 36   ." rtdelay: " 6
3060: 34 64 75 70 20 36 34 3e 66 20 2e 6e 73 20 63 72  4dup 64>f .ns cr
3070: 20 29 20 72 74 64 65 6c 61 79 20 36 34 21 20 3b   ) rtdelay 64! ;
3080: 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 6e 65 77  ..in net2o : new
3090: 2d 63 6f 6e 74 65 78 74 20 28 20 2d 2d 20 6f 20  -context ( -- o 
30a0: 29 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d 63 6c  ).    context-cl
30b0: 61 73 73 20 6e 65 77 20 3e 6f 20 74 69 6d 65 6f  ass new >o timeo
30c0: 75 74 28 20 2e 22 20 6e 65 77 20 63 6f 6e 74 65  ut( ." new conte
30d0: 78 74 3a 20 22 20 6f 20 68 65 78 2e 20 63 72 20  xt: " o hex. cr 
30e0: 29 0a 20 20 20 20 6d 79 2d 6b 65 79 2d 64 65 66  ).    my-key-def
30f0: 61 75 6c 74 20 74 6f 20 6d 79 2d 6b 65 79 20 5c  ault to my-key \
3100: 20 73 65 74 20 64 65 66 61 75 6c 74 20 6b 65 79   set default key
3110: 0a 20 20 20 20 6f 20 63 6f 6e 74 65 78 74 73 20  .    o contexts 
3120: 21 40 20 6e 65 78 74 2d 63 6f 6e 74 65 78 74 20  !@ next-context 
3130: 21 0a 20 20 20 20 6f 20 74 6f 20 63 6f 6e 6e 65  !.    o to conne
3140: 63 74 69 6f 6e 20 5c 20 63 75 72 72 65 6e 74 20  ction \ current 
3150: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 63  connection.    c
3160: 6f 6e 74 65 78 74 2d 74 61 62 6c 65 20 40 20 74  ontext-table @ t
3170: 6f 6b 65 6e 2d 74 61 62 6c 65 20 21 20 5c 20 63  oken-table ! \ c
3180: 6f 70 79 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  opy pointer.    
3190: 69 6e 69 74 2d 63 6f 6e 74 65 78 74 23 20 40 20  init-context# @ 
31a0: 63 6f 6e 74 65 78 74 23 20 21 20 20 31 20 69 6e  context# !  1 in
31b0: 69 74 2d 63 6f 6e 74 65 78 74 23 20 2b 21 0a 20  it-context# +!. 
31c0: 20 20 20 72 65 74 75 72 6e 2d 61 64 64 72 20 72     return-addr r
31d0: 65 74 75 72 6e 2d 61 64 64 72 65 73 73 20 24 31  eturn-address $1
31e0: 30 20 6d 6f 76 65 0a 20 20 20 20 5b 27 5d 20 6e  0 move.    ['] n
31f0: 6f 2d 74 69 6d 65 6f 75 74 20 69 73 20 74 69 6d  o-timeout is tim
3200: 65 6f 75 74 2d 78 74 20 5b 27 5d 20 2e 69 70 65  eout-xt ['] .ipe
3210: 72 72 20 69 73 20 73 65 74 69 70 2d 78 74 0a 20  rr is setip-xt. 
3220: 20 20 20 5b 27 5d 20 6e 6f 6f 70 20 69 73 20 70     ['] noop is p
3230: 75 6e 63 68 2d 64 6f 6e 65 2d 78 74 20 5b 27 5d  unch-done-xt [']
3240: 20 6e 6f 6f 70 20 69 73 20 73 79 6e 63 2d 64 6f   noop is sync-do
3250: 6e 65 2d 78 74 0a 20 20 20 20 5b 27 5d 20 6e 6f  ne-xt.    ['] no
3260: 6f 70 20 69 73 20 73 79 6e 63 2d 6e 6f 6e 65 2d  op is sync-none-
3270: 78 74 20 20 5b 27 5d 20 6e 6f 6f 70 20 69 73 20  xt  ['] noop is 
3280: 61 63 6b 2d 78 74 0a 20 20 20 20 2d 66 6c 6f 77  ack-xt.    -flow
3290: 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20 20 2d 31 20  -control.    -1 
32a0: 62 6c 6f 63 6b 73 69 7a 65 20 21 0a 20 20 20 20  blocksize !.    
32b0: 31 20 62 6c 6f 63 6b 61 6c 69 67 6e 20 21 0a 20  1 blockalign !. 
32c0: 20 20 20 63 6f 6e 66 69 67 3a 74 69 6d 65 6f 75     config:timeou
32d0: 74 73 23 20 40 20 74 6f 20 6d 61 78 2d 74 69 6d  ts# @ to max-tim
32e0: 65 6f 75 74 73 0a 20 20 20 20 65 6e 64 2d 73 65  eouts.    end-se
32f0: 6d 61 73 20 73 74 61 72 74 2d 73 65 6d 61 73 20  mas start-semas 
3300: 44 4f 20 20 49 20 30 20 70 74 68 72 65 61 64 5f  DO  I 0 pthread_
3310: 6d 75 74 65 78 5f 69 6e 69 74 20 64 72 6f 70 0a  mutex_init drop.
3320: 20 20 20 20 31 20 70 74 68 72 65 61 64 2d 6d 75      1 pthread-mu
3330: 74 65 78 65 73 20 2b 4c 4f 4f 50 0a 20 20 20 20  texes +LOOP.    
3340: 36 34 23 30 20 63 6f 6e 74 65 78 74 2d 74 69 63  64#0 context-tic
3350: 6b 65 72 20 36 34 21 40 20 36 34 64 75 70 20 36  ker 64!@ 64dup 6
3360: 34 23 30 20 36 34 3c 3e 20 49 46 0a 09 61 63 6b  4#0 64<> IF..ack
3370: 40 20 3e 6f 20 74 69 63 6b 65 72 20 36 34 40 20  @ >o ticker 64@ 
3380: 72 65 63 76 2d 74 69 63 6b 20 36 34 21 20 72 74  recv-tick 64! rt
3390: 64 65 6c 61 79 21 20 6f 3e 20 20 45 4c 53 45 20  delay! o>  ELSE 
33a0: 20 36 34 64 72 6f 70 20 20 54 48 45 4e 0a 20 20   64drop  THEN.  
33b0: 20 20 6f 20 6f 3e 20 3b 0a 0a 3a 20 72 65 74 2d    o o> ;..: ret-
33c0: 61 64 64 72 20 28 20 2d 2d 20 61 64 64 72 20 29  addr ( -- addr )
33d0: 20 6f 20 49 46 20 20 72 65 74 75 72 6e 2d 61 64   o IF  return-ad
33e0: 64 72 65 73 73 20 20 45 4c 53 45 20 20 72 65 74  dress  ELSE  ret
33f0: 75 72 6e 2d 61 64 64 72 20 20 54 48 45 4e 20 3b  urn-addr  THEN ;
3400: 0a 0a 5c 20 63 72 65 61 74 65 20 6e 65 77 20 6d  ..\ create new m
3410: 61 70 73 0a 0a 56 61 72 69 61 62 6c 65 20 6d 61  aps..Variable ma
3420: 70 73 74 61 72 74 20 24 31 20 6d 61 70 73 74 61  pstart $1 mapsta
3430: 72 74 20 21 0a 0a 3a 20 72 65 74 30 20 28 20 2d  rt !..: ret0 ( -
3440: 2d 20 29 20 72 65 74 75 72 6e 2d 61 64 64 72 20  - ) return-addr 
3450: 24 31 30 20 65 72 61 73 65 20 3b 0a 3a 20 73 65  $10 erase ;.: se
3460: 74 75 70 21 20 28 20 2d 2d 20 29 20 20 20 73 65  tup! ( -- )   se
3470: 74 75 70 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65  tup-table @ toke
3480: 6e 2d 74 61 62 6c 65 20 21 20 20 72 65 74 30 20  n-table !  ret0 
3490: 3b 0a 3a 20 63 6f 6e 74 65 78 74 21 20 28 20 2d  ;.: context! ( -
34a0: 2d 20 29 0a 20 20 20 20 63 6f 6e 74 65 78 74 2d  - ).    context-
34b0: 74 61 62 6c 65 20 40 20 74 6f 6b 65 6e 2d 74 61  table @ token-ta
34c0: 62 6c 65 20 21 0a 20 20 20 20 3c 65 76 65 6e 74  ble !.    <event
34d0: 20 77 61 69 74 2d 74 61 73 6b 20 40 20 6d 61 69   wait-task @ mai
34e0: 6e 2d 75 70 40 20 6f 76 65 72 20 73 65 6c 65 63  n-up@ over selec
34f0: 74 20 6f 20 65 6c 69 74 2c 20 3a 3e 63 6f 6e 6e  t o elit, :>conn
3500: 65 63 74 20 65 76 65 6e 74 3e 20 3b 0a 0a 3a 20  ect event> ;..: 
3510: 6e 65 77 2d 63 6f 64 65 40 20 28 20 2d 2d 20 61  new-code@ ( -- a
3520: 64 64 72 73 20 61 64 64 72 64 20 75 20 2d 2d 20  ddrs addrd u -- 
3530: 29 0a 20 20 20 20 6e 65 77 2d 63 6f 64 65 2d 73  ).    new-code-s
3540: 20 36 34 40 20 6e 65 77 2d 63 6f 64 65 2d 64 20   64@ new-code-d 
3550: 36 34 40 20 6e 65 77 2d 63 6f 64 65 2d 73 69 7a  64@ new-code-siz
3560: 65 20 40 20 3b 0a 3a 20 6e 65 77 2d 63 6f 64 65  e @ ;.: new-code
3570: 21 20 28 20 61 64 64 72 73 20 61 64 64 72 64 20  ! ( addrs addrd 
3580: 75 20 2d 2d 20 29 0a 20 20 20 20 6e 65 77 2d 63  u -- ).    new-c
3590: 6f 64 65 2d 73 69 7a 65 20 21 20 6e 65 77 2d 63  ode-size ! new-c
35a0: 6f 64 65 2d 64 20 36 34 21 20 6e 65 77 2d 63 6f  ode-d 64! new-co
35b0: 64 65 2d 73 20 36 34 21 20 6e 65 77 63 6f 64 65  de-s 64! newcode
35c0: 2d 76 61 6c 20 76 61 6c 69 64 61 74 65 64 20 6f  -val validated o
35d0: 72 21 20 3b 0a 3a 20 6e 65 77 2d 64 61 74 61 40  r! ;.: new-data@
35e0: 20 28 20 2d 2d 20 61 64 64 72 73 20 61 64 64 72   ( -- addrs addr
35f0: 64 20 75 20 2d 2d 20 29 0a 20 20 20 20 6e 65 77  d u -- ).    new
3600: 2d 64 61 74 61 2d 73 20 36 34 40 20 6e 65 77 2d  -data-s 64@ new-
3610: 64 61 74 61 2d 64 20 36 34 40 20 6e 65 77 2d 64  data-d 64@ new-d
3620: 61 74 61 2d 73 69 7a 65 20 40 20 3b 0a 3a 20 6e  ata-size @ ;.: n
3630: 65 77 2d 64 61 74 61 21 20 28 20 61 64 64 72 73  ew-data! ( addrs
3640: 20 61 64 64 72 64 20 75 20 2d 2d 20 29 0a 20 20   addrd u -- ).  
3650: 20 20 6e 65 77 2d 64 61 74 61 2d 73 69 7a 65 20    new-data-size 
3660: 21 20 6e 65 77 2d 64 61 74 61 2d 64 20 36 34 21  ! new-data-d 64!
3670: 20 6e 65 77 2d 64 61 74 61 2d 73 20 36 34 21 20   new-data-s 64! 
3680: 6e 65 77 64 61 74 61 2d 76 61 6c 20 76 61 6c 69  newdata-val vali
3690: 64 61 74 65 64 20 6f 72 21 20 3b 0a 0a 69 6e 20  dated or! ;..in 
36a0: 6e 65 74 32 6f 20 3a 20 6e 65 77 2d 6d 61 70 20  net2o : new-map 
36b0: 28 20 2d 2d 20 61 64 64 72 20 29 0a 20 20 20 20  ( -- addr ).    
36c0: 6d 61 70 73 74 61 72 74 20 40 20 31 20 6d 61 70  mapstart @ 1 map
36d0: 73 74 61 72 74 20 2b 21 20 72 65 76 65 72 73 65  start +! reverse
36e0: 0a 20 20 20 20 5b 20 63 65 6c 6c 20 34 20 3d 20  .    [ cell 4 = 
36f0: 5d 20 5b 49 46 5d 20 20 30 20 73 77 61 70 20 20  ] [IF]  0 swap  
3700: 5b 45 4c 53 45 5d 20 24 46 46 46 46 46 46 46 46  [ELSE] $FFFFFFFF
3710: 30 30 30 30 30 30 30 30 20 61 6e 64 20 5b 54 48  00000000 and [TH
3720: 45 4e 5d 20 3b 0a 69 6e 20 6e 65 74 32 6f 20 3a  EN] ;.in net2o :
3730: 20 6e 65 77 2d 64 61 74 61 20 28 20 61 64 64 72   new-data ( addr
3740: 73 20 61 64 64 72 64 20 75 20 2d 2d 20 29 0a 20  s addrd u -- ). 
3750: 20 20 20 64 75 70 20 6d 61 78 2d 64 61 74 61 23     dup max-data#
3760: 20 75 3e 20 21 21 6d 61 70 73 69 7a 65 21 21 20   u> !!mapsize!! 
3770: 6d 69 6e 2d 73 69 7a 65 20 73 77 61 70 20 6c 73  min-size swap ls
3780: 68 69 66 74 0a 20 20 20 20 7b 20 36 34 3a 20 61  hift.    { 64: a
3790: 64 64 72 73 20 36 34 3a 20 61 64 64 72 64 20 75  ddrs 64: addrd u
37a0: 20 2d 2d 20 7d 0a 20 20 20 20 6f 20 30 3d 20 49   -- }.    o 0= I
37b0: 46 0a 09 61 64 64 72 64 20 3e 64 65 73 74 2d 6d  F..addrd >dest-m
37c0: 61 70 20 40 20 3f 45 58 49 54 0a 09 6e 65 74 32  ap @ ?EXIT..net2
37d0: 6f 3a 6e 65 77 2d 63 6f 6e 74 65 78 74 20 3e 6f  o:new-context >o
37e0: 20 72 64 72 6f 70 20 20 73 65 74 75 70 21 20 20   rdrop  setup!  
37f0: 54 48 45 4e 0a 20 20 20 20 6d 73 67 28 20 2e 22  THEN.    msg( ."
3800: 20 64 61 74 61 20 6d 61 70 3a 20 22 20 61 64 64   data map: " add
3810: 72 73 20 78 36 34 2e 20 2e 22 20 6f 77 6e 3a 20  rs x64. ." own: 
3820: 22 20 61 64 64 72 64 20 78 36 34 2e 20 75 20 68  " addrd x64. u h
3830: 65 78 2e 20 63 72 20 29 0a 20 20 20 20 3e 63 6f  ex. cr ).    >co
3840: 64 65 2d 66 6c 61 67 20 6f 66 66 0a 20 20 20 20  de-flag off.    
3850: 61 64 64 72 64 20 75 20 61 64 64 72 20 64 61 74  addrd u addr dat
3860: 61 2d 72 6d 61 70 20 6d 61 70 2d 64 61 74 61 2d  a-rmap map-data-
3870: 64 65 73 74 0a 20 20 20 20 61 64 64 72 73 20 75  dest.    addrs u
3880: 20 6d 61 70 2d 73 6f 75 72 63 65 20 74 6f 20 64   map-source to d
3890: 61 74 61 2d 6d 61 70 20 3b 0a 69 6e 20 6e 65 74  ata-map ;.in net
38a0: 32 6f 20 3a 20 6e 65 77 2d 63 6f 64 65 20 28 20  2o : new-code ( 
38b0: 61 64 64 72 73 20 61 64 64 72 64 20 75 20 2d 2d  addrs addrd u --
38c0: 20 29 0a 20 20 20 20 64 75 70 20 6d 61 78 2d 63   ).    dup max-c
38d0: 6f 64 65 23 20 75 3e 20 21 21 6d 61 70 73 69 7a  ode# u> !!mapsiz
38e0: 65 21 21 20 6d 69 6e 2d 73 69 7a 65 20 73 77 61  e!! min-size swa
38f0: 70 20 6c 73 68 69 66 74 0a 20 20 20 20 7b 20 36  p lshift.    { 6
3900: 34 3a 20 61 64 64 72 73 20 36 34 3a 20 61 64 64  4: addrs 64: add
3910: 72 64 20 75 20 2d 2d 20 7d 0a 20 20 20 20 6f 20  rd u -- }.    o 
3920: 30 3d 20 49 46 0a 09 61 64 64 72 64 20 3e 64 65  0= IF..addrd >de
3930: 73 74 2d 6d 61 70 20 40 20 3f 45 58 49 54 0a 09  st-map @ ?EXIT..
3940: 6e 65 74 32 6f 3a 6e 65 77 2d 63 6f 6e 74 65 78  net2o:new-contex
3950: 74 20 3e 6f 20 72 64 72 6f 70 20 20 73 65 74 75  t >o rdrop  setu
3960: 70 21 20 20 54 48 45 4e 0a 20 20 20 20 6d 73 67  p!  THEN.    msg
3970: 28 20 2e 22 20 63 6f 64 65 20 6d 61 70 3a 20 22  ( ." code map: "
3980: 20 61 64 64 72 73 20 78 36 34 2e 20 2e 22 20 6f   addrs x64. ." o
3990: 77 6e 3a 20 22 20 61 64 64 72 64 20 78 36 34 2e  wn: " addrd x64.
39a0: 20 75 20 68 65 78 2e 20 63 72 20 29 0a 20 20 20   u hex. cr ).   
39b0: 20 3e 63 6f 64 65 2d 66 6c 61 67 20 6f 6e 0a 20   >code-flag on. 
39c0: 20 20 20 61 64 64 72 64 20 75 20 61 64 64 72 20     addrd u addr 
39d0: 63 6f 64 65 2d 72 6d 61 70 20 6d 61 70 2d 63 6f  code-rmap map-co
39e0: 64 65 2d 64 65 73 74 0a 20 20 20 20 61 64 64 72  de-dest.    addr
39f0: 73 20 75 20 6d 61 70 2d 73 6f 75 72 63 65 20 74  s u map-source t
3a00: 6f 20 63 6f 64 65 2d 6d 61 70 20 3b 0a 0a 46 6f  o code-map ;..Fo
3a10: 72 77 61 72 64 20 6e 65 77 2d 69 76 73 20 28 20  rward new-ivs ( 
3a20: 2d 2d 20 29 0a 5c 47 20 49 6e 69 74 20 74 68 65  -- ).\G Init the
3a30: 20 6e 65 77 20 49 56 53 0a 3a 20 63 72 65 61 74   new IVS.: creat
3a40: 65 2d 6d 61 70 73 20 28 20 2d 2d 20 29 20 76 61  e-maps ( -- ) va
3a50: 6c 69 64 61 74 65 64 20 40 20 3e 72 0a 20 20 20  lidated @ >r.   
3a60: 20 5b 20 6e 65 77 63 6f 64 65 2d 76 61 6c 20 6e   [ newcode-val n
3a70: 65 77 64 61 74 61 2d 76 61 6c 20 6f 72 20 69 6e  ewdata-val or in
3a80: 76 65 72 74 20 5d 4c 20 72 40 20 61 6e 64 20 76  vert ]L r@ and v
3a90: 61 6c 69 64 61 74 65 64 20 21 0a 20 20 20 20 72  alidated !.    r
3aa0: 40 20 6e 65 77 63 6f 64 65 2d 76 61 6c 20 61 6e  @ newcode-val an
3ab0: 64 20 49 46 20 20 6e 65 77 2d 63 6f 64 65 40 20  d IF  new-code@ 
3ac0: 6e 65 74 32 6f 3a 6e 65 77 2d 63 6f 64 65 20 45  net2o:new-code E
3ad0: 4c 53 45 20 20 72 64 72 6f 70 20 45 58 49 54 20  LSE  rdrop EXIT 
3ae0: 20 54 48 45 4e 0a 20 20 20 20 72 3e 20 6e 65 77   THEN.    r> new
3af0: 64 61 74 61 2d 76 61 6c 20 61 6e 64 20 49 46 20  data-val and IF 
3b00: 20 6e 65 77 2d 64 61 74 61 40 20 6e 65 74 32 6f   new-data@ net2o
3b10: 3a 6e 65 77 2d 64 61 74 61 20 54 48 45 4e 20 3b  :new-data THEN ;
3b20: 0a 3a 20 75 70 64 61 74 65 2d 63 64 6d 61 70 20  .: update-cdmap 
3b30: 28 20 2d 2d 20 29 0a 20 20 20 20 6f 20 30 3d 20  ( -- ).    o 0= 
3b40: 49 46 20 20 64 6f 2d 6b 65 79 70 61 64 20 73 65  IF  do-keypad se
3b50: 63 40 20 6e 69 70 20 6b 65 79 73 69 7a 65 32 20  c@ nip keysize2 
3b60: 3c 3e 20 3f 45 58 49 54 20 20 54 48 45 4e 0a 20  <> ?EXIT  THEN. 
3b70: 20 20 20 63 72 65 61 74 65 2d 6d 61 70 73 0a 20     create-maps. 
3b80: 20 20 20 6f 20 49 46 0a 09 76 61 6c 69 64 61 74     o IF..validat
3b90: 65 64 20 40 20 6b 65 79 70 61 69 72 2d 76 61 6c  ed @ keypair-val
3ba0: 20 61 6e 64 20 49 46 0a 09 20 20 20 20 74 6d 70   and IF..    tmp
3bb0: 2d 70 75 62 6b 65 79 20 20 24 40 20 70 75 62 6b  -pubkey  $@ pubk
3bc0: 65 79 20 20 24 21 0a 09 20 20 20 20 74 6d 70 2d  ey  $!..    tmp-
3bd0: 6d 79 2d 6b 65 79 20 20 20 40 20 74 6f 20 6d 79  my-key   @ to my
3be0: 2d 6b 65 79 0a 09 54 48 45 4e 0a 09 76 61 6c 69  -key..THEN..vali
3bf0: 64 61 74 65 64 20 40 20 69 76 73 2d 76 61 6c 20  dated @ ivs-val 
3c00: 61 6e 64 20 49 46 20 20 6e 65 77 2d 69 76 73 20  and IF  new-ivs 
3c10: 20 54 48 45 4e 0a 09 74 6d 70 2d 70 65 72 6d 20   THEN..tmp-perm 
3c20: 40 20 3f 64 75 70 2d 49 46 20 20 70 65 72 6d 2d  @ ?dup-IF  perm-
3c30: 6d 61 73 6b 20 21 20 20 74 6d 70 2d 70 65 72 6d  mask !  tmp-perm
3c40: 20 6f 66 66 20 20 54 48 45 4e 0a 09 5b 20 6b 65   off  THEN..[ ke
3c50: 79 70 61 69 72 2d 76 61 6c 20 69 76 73 2d 76 61  ypair-val ivs-va
3c60: 6c 20 6f 72 20 69 6e 76 65 72 74 20 5d 4c 20 76  l or invert ]L v
3c70: 61 6c 69 64 61 74 65 64 20 61 6e 64 21 0a 20 20  alidated and!.  
3c80: 20 20 54 48 45 4e 20 3b 0a 0a 5c 20 64 69 73 70    THEN ;..\ disp
3c90: 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 0a  ose connection..
3ca0: 73 63 6f 70 65 7b 20 6d 61 70 63 0a 0a 3a 20 66  scope{ mapc..: f
3cb0: 72 65 65 2d 72 65 73 65 6e 64 20 28 20 6f 3a 64  ree-resend ( o:d
3cc0: 61 74 61 20 29 20 64 65 73 74 2d 73 69 7a 65 20  ata ) dest-size 
3cd0: 61 64 64 72 3e 74 73 20 3e 72 0a 20 20 20 20 64  addr>ts >r.    d
3ce0: 61 74 61 2d 72 65 73 65 6e 64 23 20 20 20 20 72  ata-resend#    r
3cf0: 40 20 3f 66 72 65 65 0a 20 20 20 20 61 64 64 72  @ ?free.    addr
3d00: 20 64 65 73 74 2d 74 69 6d 65 73 74 61 6d 70 73   dest-timestamps
3d10: 20 72 3e 20 3f 66 72 65 65 20 3b 0a 3a 20 66 72   r> ?free ;.: fr
3d20: 65 65 2d 72 65 73 65 6e 64 27 20 28 20 6f 3a 64  ee-resend' ( o:d
3d30: 61 74 61 20 29 20 64 65 73 74 2d 73 69 7a 65 20  ata ) dest-size 
3d40: 61 64 64 72 3e 74 73 20 3e 72 0a 20 20 20 20 61  addr>ts >r.    a
3d50: 64 64 72 20 64 65 73 74 2d 74 69 6d 65 73 74 61  ddr dest-timesta
3d60: 6d 70 73 20 72 3e 20 3f 66 72 65 65 20 3b 0a 3a  mps r> ?free ;.:
3d70: 20 66 72 65 65 2d 63 6f 64 65 20 28 20 6f 3a 64   free-code ( o:d
3d80: 61 74 61 20 2d 2d 20 29 20 64 65 73 74 2d 73 69  ata -- ) dest-si
3d90: 7a 65 20 3e 72 0a 20 20 20 20 61 64 64 72 20 64  ze >r.    addr d
3da0: 65 73 74 2d 72 61 64 64 72 20 20 20 72 40 20 20  est-raddr   r@  
3db0: 20 20 20 20 20 20 20 20 20 20 20 20 3f 66 72 65              ?fre
3dc0: 65 2b 67 75 61 72 64 0a 20 20 20 20 61 64 64 72  e+guard.    addr
3dd0: 20 64 65 73 74 2d 69 76 73 67 65 6e 20 20 63 3a   dest-ivsgen  c:
3de0: 6b 65 79 23 20 20 20 20 20 20 20 20 20 20 3f 66  key#          ?f
3df0: 72 65 65 0a 20 20 20 20 61 64 64 72 20 64 65 73  ree.    addr des
3e00: 74 2d 72 65 70 6c 69 65 73 20 72 40 20 61 64 64  t-replies r@ add
3e10: 72 3e 72 65 70 6c 69 65 73 20 3f 66 72 65 65 2b  r>replies ?free+
3e20: 67 75 61 72 64 0a 20 20 20 20 72 64 72 6f 70 20  guard.    rdrop 
3e30: 64 69 73 70 6f 73 65 20 3b 0a 27 20 66 72 65 65  dispose ;.' free
3e40: 2d 63 6f 64 65 20 63 6f 64 65 2d 63 6c 61 73 73  -code code-class
3e50: 20 74 6f 20 66 72 65 65 2d 64 61 74 61 0a 3a 6e   to free-data.:n
3e60: 6f 6e 61 6d 65 20 28 20 6f 3a 64 61 74 61 20 2d  oname ( o:data -
3e70: 2d 20 29 0a 20 20 20 20 66 72 65 65 2d 72 65 73  - ).    free-res
3e80: 65 6e 64 20 66 72 65 65 2d 63 6f 64 65 20 3b 20  end free-code ; 
3e90: 64 61 74 61 2d 63 6c 61 73 73 20 74 6f 20 66 72  data-class to fr
3ea0: 65 65 2d 64 61 74 61 0a 0a 3a 20 66 72 65 65 2d  ee-data..: free-
3eb0: 72 63 6f 64 65 20 28 20 6f 3a 64 61 74 61 20 2d  rcode ( o:data -
3ec0: 2d 2d 20 29 0a 20 20 20 20 64 61 74 61 2d 61 63  -- ).    data-ac
3ed0: 6b 62 69 74 73 20 64 65 73 74 2d 73 69 7a 65 20  kbits dest-size 
3ee0: 61 64 64 72 3e 62 79 74 65 73 20 3f 66 72 65 65  addr>bytes ?free
3ef0: 0a 20 20 20 20 64 61 74 61 2d 61 63 6b 62 69 74  .    data-ackbit
3f00: 73 2d 62 75 66 20 24 6f 66 66 0a 20 20 20 20 66  s-buf $off.    f
3f10: 72 65 65 2d 63 6f 64 65 20 3b 0a 3a 6e 6f 6e 61  ree-code ;.:nona
3f20: 6d 65 20 28 20 6f 3a 64 61 74 61 20 2d 2d 20 29  me ( o:data -- )
3f30: 0a 20 20 20 20 66 72 65 65 2d 72 65 73 65 6e 64  .    free-resend
3f40: 27 20 66 72 65 65 2d 72 63 6f 64 65 20 3b 20 72  ' free-rcode ; r
3f50: 64 61 74 61 2d 63 6c 61 73 73 20 74 6f 20 66 72  data-class to fr
3f60: 65 65 2d 64 61 74 61 0a 27 20 66 72 65 65 2d 72  ee-data.' free-r
3f70: 63 6f 64 65 20 72 63 6f 64 65 2d 63 6c 61 73 73  code rcode-class
3f80: 20 74 6f 20 66 72 65 65 2d 64 61 74 61 0a 0a 7d   to free-data..}
3f90: 73 63 6f 70 65 0a 0a 5c 20 73 79 6d 6d 65 74 72  scope..\ symmetr
3fa0: 69 63 20 6b 65 79 20 6d 61 6e 61 67 65 6d 65 6e  ic key managemen
3fb0: 74 20 61 6e 64 20 73 65 61 72 63 68 69 6e 67 20  t and searching 
3fc0: 69 6e 20 6f 70 65 6e 20 63 6f 6e 6e 65 63 74 69  in open connecti
3fd0: 6f 6e 73 0a 0a 3a 20 73 65 61 72 63 68 2d 63 6f  ons..: search-co
3fe0: 6e 74 65 78 74 20 28 20 2e 2e 20 78 74 20 2d 2d  ntext ( .. xt --
3ff0: 20 2e 2e 20 29 20 7b 20 78 74 20 7d 0a 20 20 20   .. ) { xt }.   
4000: 20 5c 47 20 78 74 20 68 61 73 20 28 20 2e 2e 20   \G xt has ( .. 
4010: 2d 2d 20 2e 2e 20 66 6c 61 67 20 29 20 77 69 74  -- .. flag ) wit
4020: 68 20 74 72 75 65 20 74 6f 20 63 6f 6e 74 69 6e  h true to contin
4030: 75 65 0a 20 20 20 20 63 6f 6e 74 65 78 74 73 20  ue.    contexts 
4040: 20 42 45 47 49 4e 20 20 40 20 64 75 70 20 20 57   BEGIN  @ dup  W
4050: 48 49 4c 45 20 20 3e 6f 20 20 78 74 20 65 78 65  HILE  >o  xt exe
4060: 63 75 74 65 0a 09 6e 65 78 74 2d 63 6f 6e 74 65  cute..next-conte
4070: 78 74 20 6f 3e 20 73 77 61 70 20 20 30 3d 20 55  xt o> swap  0= U
4080: 4e 54 49 4c 20 20 54 48 45 4e 20 20 64 72 6f 70  NTIL  THEN  drop
4090: 20 3b 0a 0a 5c 20 64 61 74 61 20 73 65 6e 64 69   ;..\ data sendi
40a0: 6e 67 20 61 72 6f 75 6e 64 0a 0a 3a 20 3e 62 6c  ng around..: >bl
40b0: 6f 63 6b 61 6c 69 67 6e 20 28 20 6e 20 2d 2d 20  ockalign ( n -- 
40c0: 62 6c 6f 63 6b 20 29 0a 20 20 20 20 62 6c 6f 63  block ).    bloc
40d0: 6b 61 6c 69 67 6e 20 40 20 64 75 70 20 3e 72 20  kalign @ dup >r 
40e0: 31 2d 20 2b 20 72 3e 20 6e 65 67 61 74 65 20 61  1- + r> negate a
40f0: 6e 64 20 3b 0a 3a 20 3e 6d 61 78 61 6c 69 67 6e  nd ;.: >maxalign
4100: 20 28 20 6e 20 2d 2d 20 62 6c 6f 63 6b 20 29 0a   ( n -- block ).
4110: 20 20 20 20 6d 61 78 64 61 74 61 20 35 20 6c 73      maxdata 5 ls
4120: 68 69 66 74 20 64 75 70 20 3e 72 20 31 2d 20 2b  hift dup >r 1- +
4130: 20 72 3e 20 6e 65 67 61 74 65 20 61 6e 64 20 3b   r> negate and ;
4140: 0a 3a 20 36 34 3e 62 6c 6f 63 6b 61 6c 69 67 6e  .: 64>blockalign
4150: 20 28 20 36 34 20 2d 2d 20 62 6c 6f 63 6b 20 29   ( 64 -- block )
4160: 0a 20 20 20 20 62 6c 6f 63 6b 61 6c 69 67 6e 20  .    blockalign 
4170: 40 20 64 75 70 20 3e 72 20 31 2d 20 6e 3e 36 34  @ dup >r 1- n>64
4180: 20 36 34 2b 20 72 3e 20 6e 65 67 61 74 65 20 6e   64+ r> negate n
4190: 3e 36 34 20 36 34 61 6e 64 20 3b 0a 3a 20 2f 68  >64 64and ;.: /h
41a0: 65 61 64 20 28 20 75 20 2d 2d 20 29 0a 20 20 20  ead ( u -- ).   
41b0: 20 3e 62 6c 6f 63 6b 61 6c 69 67 6e 20 64 75 70   >blockalign dup
41c0: 20 6e 65 67 61 74 65 20 72 65 73 69 64 75 61 6c   negate residual
41d0: 72 65 61 64 20 2b 21 0a 20 20 20 20 64 61 74 61  read +!.    data
41e0: 2d 6d 61 70 20 77 69 74 68 20 6d 61 70 63 20 2b  -map with mapc +
41f0: 74 6f 20 64 65 73 74 2d 68 65 61 64 20 65 6e 64  to dest-head end
4200: 77 69 74 68 20 3b 0a 3a 20 6d 61 78 2f 68 65 61  with ;.: max/hea
4210: 64 20 28 20 2d 2d 20 29 0a 20 20 20 20 64 61 74  d ( -- ).    dat
4220: 61 2d 6d 61 70 20 77 69 74 68 20 6d 61 70 63 20  a-map with mapc 
4230: 64 65 73 74 2d 68 65 61 64 20 3e 6d 61 78 61 6c  dest-head >maxal
4240: 69 67 6e 20 74 6f 20 64 65 73 74 2d 68 65 61 64  ign to dest-head
4250: 20 65 6e 64 77 69 74 68 20 3b 0a 3a 20 2f 62 61   endwith ;.: /ba
4260: 63 6b 20 28 20 75 20 2d 2d 20 29 0a 20 20 20 20  ck ( u -- ).    
4270: 3e 62 6c 6f 63 6b 61 6c 69 67 6e 20 64 75 70 20  >blockalign dup 
4280: 6e 65 67 61 74 65 20 72 65 73 69 64 75 61 6c 77  negate residualw
4290: 72 69 74 65 20 2b 21 0a 20 20 20 20 64 61 74 61  rite +!.    data
42a0: 2d 72 6d 61 70 20 77 69 74 68 20 6d 61 70 63 20  -rmap with mapc 
42b0: 2b 74 6f 20 64 65 73 74 2d 62 61 63 6b 20 65 6e  +to dest-back en
42c0: 64 77 69 74 68 20 3b 0a 3a 20 6d 61 78 2f 62 61  dwith ;.: max/ba
42d0: 63 6b 20 28 20 2d 2d 20 29 0a 20 20 20 20 64 61  ck ( -- ).    da
42e0: 74 61 2d 72 6d 61 70 20 77 69 74 68 20 6d 61 70  ta-rmap with map
42f0: 63 20 64 65 73 74 2d 62 61 63 6b 20 3e 6d 61 78  c dest-back >max
4300: 61 6c 69 67 6e 20 74 6f 20 64 65 73 74 2d 62 61  align to dest-ba
4310: 63 6b 20 65 6e 64 77 69 74 68 20 3b 0a 3a 20 2f  ck endwith ;.: /
4320: 74 61 69 6c 20 28 20 75 20 2d 2d 20 29 0a 20 20  tail ( u -- ).  
4330: 20 20 64 61 74 61 2d 6d 61 70 20 3e 6f 20 2b 74    data-map >o +t
4340: 6f 20 6d 61 70 63 3a 64 65 73 74 2d 74 61 69 6c  o mapc:dest-tail
4350: 20 6f 3e 20 3b 0a 3a 20 64 61 74 61 2d 64 65 73   o> ;.: data-des
4360: 74 20 28 20 2d 2d 20 61 64 64 72 20 29 0a 20 20  t ( -- addr ).  
4370: 20 20 64 61 74 61 2d 6d 61 70 20 77 69 74 68 20    data-map with 
4380: 6d 61 70 63 0a 20 20 20 20 64 65 73 74 2d 76 61  mapc.    dest-va
4390: 64 64 72 20 64 65 73 74 2d 74 61 69 6c 20 64 65  ddr dest-tail de
43a0: 73 74 2d 73 69 7a 65 20 31 2d 20 61 6e 64 20 6e  st-size 1- and n
43b0: 3e 36 34 20 36 34 2b 20 65 6e 64 77 69 74 68 20  >64 64+ endwith 
43c0: 3b 0a 0a 5c 20 6e 65 77 20 64 61 74 61 20 73 65  ;..\ new data se
43d0: 6e 64 69 6e 67 20 61 72 6f 75 6e 64 20 73 74 75  nding around stu
43e0: 66 66 2c 20 77 69 74 68 20 66 72 6f 6e 74 2b 62  ff, with front+b
43f0: 61 63 6b 0a 0a 73 63 6f 70 65 7b 20 6d 61 70 63  ack..scope{ mapc
4400: 0a 0a 3a 20 66 69 78 2d 73 69 7a 65 20 28 20 6f  ..: fix-size ( o
4410: 66 66 73 65 74 31 20 6f 66 66 73 65 74 32 20 2d  ffset1 offset2 -
4420: 2d 20 61 64 64 72 20 6c 65 6e 20 29 0a 20 20 20  - addr len ).   
4430: 20 6f 76 65 72 20 2d 20 3e 72 20 64 65 73 74 2d   over - >r dest-
4440: 73 69 7a 65 20 31 2d 20 61 6e 64 20 72 3e 20 6f  size 1- and r> o
4450: 76 65 72 20 2b 20 64 65 73 74 2d 73 69 7a 65 20  ver + dest-size 
4460: 75 6d 69 6e 20 6f 76 65 72 20 2d 20 3b 0a 3a 20  umin over - ;.: 
4470: 66 69 78 2d 74 73 73 69 7a 65 20 28 20 6f 66 66  fix-tssize ( off
4480: 73 65 74 31 20 6f 66 66 73 65 74 32 20 2d 2d 20  set1 offset2 -- 
4490: 61 64 64 72 20 6c 65 6e 20 29 0a 20 20 20 20 6f  addr len ).    o
44a0: 76 65 72 20 2d 20 3e 72 20 64 65 73 74 2d 73 69  ver - >r dest-si
44b0: 7a 65 20 61 64 64 72 3e 74 73 20 31 2d 20 61 6e  ze addr>ts 1- an
44c0: 64 20 72 3e 20 6f 76 65 72 20 2b 0a 20 20 20 20  d r> over +.    
44d0: 64 65 73 74 2d 73 69 7a 65 20 61 64 64 72 3e 74  dest-size addr>t
44e0: 73 20 75 6d 69 6e 20 6f 76 65 72 20 2d 20 3b 0a  s umin over - ;.
44f0: 3a 20 66 69 78 2d 62 69 74 73 69 7a 65 20 28 20  : fix-bitsize ( 
4500: 6f 66 66 73 65 74 31 20 6f 66 66 73 65 74 32 20  offset1 offset2 
4510: 2d 2d 20 61 64 64 72 20 6c 65 6e 20 29 0a 20 20  -- addr len ).  
4520: 20 20 6f 76 65 72 20 2d 20 3e 72 20 64 65 73 74    over - >r dest
4530: 2d 73 69 7a 65 20 61 64 64 72 3e 62 69 74 73 20  -size addr>bits 
4540: 31 2d 20 61 6e 64 20 72 3e 20 6f 76 65 72 20 2b  1- and r> over +
4550: 0a 20 20 20 20 64 65 73 74 2d 73 69 7a 65 20 61  .    dest-size a
4560: 64 64 72 3e 62 69 74 73 20 75 6d 69 6e 20 6f 76  ddr>bits umin ov
4570: 65 72 20 2d 20 3b 0a 3a 20 72 61 64 64 72 2b 20  er - ;.: raddr+ 
4580: 28 20 61 64 64 72 20 6c 65 6e 20 2d 2d 20 61 64  ( addr len -- ad
4590: 64 72 27 20 6c 65 6e 20 29 20 3e 72 20 64 65 73  dr' len ) >r des
45a0: 74 2d 72 61 64 64 72 20 2b 20 72 3e 20 3b 0a 3a  t-raddr + r> ;.:
45b0: 20 66 69 78 2d 73 69 7a 65 27 20 28 20 62 61 73   fix-size' ( bas
45c0: 65 20 6f 66 66 73 65 74 31 20 6f 66 66 73 65 74  e offset1 offset
45d0: 32 20 2d 2d 20 61 64 64 72 20 6c 65 6e 20 29 0a  2 -- addr len ).
45e0: 20 20 20 20 6f 76 65 72 20 2d 20 3e 72 20 64 65      over - >r de
45f0: 73 74 2d 73 69 7a 65 20 31 2d 20 61 6e 64 20 2b  st-size 1- and +
4600: 20 72 3e 20 3b 0a 0a 7d 73 63 6f 70 65 0a 0a 3a   r> ;..}scope..:
4610: 20 68 65 61 64 40 20 28 20 2d 2d 20 68 65 61 64   head@ ( -- head
4620: 20 29 20 20 64 61 74 61 2d 6d 61 70 20 2e 6d 61   )  data-map .ma
4630: 70 63 3a 64 65 73 74 2d 68 65 61 64 20 3b 0a 0a  pc:dest-head ;..
4640: 3a 20 64 61 74 61 2d 68 65 61 64 40 20 28 20 2d  : data-head@ ( -
4650: 2d 20 61 64 64 72 20 75 20 29 0a 20 20 20 20 5c  - addr u ).    \
4660: 47 20 79 6f 75 20 63 61 6e 20 72 65 61 64 20 69  G you can read i
4670: 6e 74 6f 20 74 68 69 73 2c 20 69 74 27 73 20 61  nto this, it's a
4680: 20 62 6c 6f 63 6b 20 61 74 20 61 20 74 69 6d 65   block at a time
4690: 20 28 77 72 61 70 61 72 6f 75 6e 64 21 29 0a 20   (wraparound!). 
46a0: 20 20 20 64 61 74 61 2d 6d 61 70 20 77 69 74 68     data-map with
46b0: 20 6d 61 70 63 0a 20 20 20 20 64 65 73 74 2d 68   mapc.    dest-h
46c0: 65 61 64 20 64 65 73 74 2d 62 61 63 6b 20 64 65  ead dest-back de
46d0: 73 74 2d 73 69 7a 65 20 2b 20 66 69 78 2d 73 69  st-size + fix-si
46e0: 7a 65 20 72 61 64 64 72 2b 20 65 6e 64 77 69 74  ze raddr+ endwit
46f0: 68 0a 20 20 20 20 72 65 73 69 64 75 61 6c 72 65  h.    residualre
4700: 61 64 20 40 20 75 6d 69 6e 20 3b 0a 3a 20 72 64  ad @ umin ;.: rd
4710: 61 74 61 2d 62 61 63 6b 40 20 28 20 74 61 69 6c  ata-back@ ( tail
4720: 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20 20   -- addr u ).   
4730: 20 5c 47 20 79 6f 75 20 63 61 6e 20 77 72 69 74   \G you can writ
4740: 65 20 66 72 6f 6d 20 74 68 69 73 2c 20 61 6c 73  e from this, als
4750: 6f 20 61 20 62 6c 6f 63 6b 20 61 74 20 61 20 74  o a block at a t
4760: 69 6d 65 0a 20 20 20 20 64 61 74 61 2d 72 6d 61  ime.    data-rma
4770: 70 20 77 69 74 68 20 6d 61 70 63 0a 20 20 20 20  p with mapc.    
4780: 64 65 73 74 2d 62 61 63 6b 20 73 77 61 70 20 66  dest-back swap f
4790: 69 78 2d 73 69 7a 65 20 72 61 64 64 72 2b 20 65  ix-size raddr+ e
47a0: 6e 64 77 69 74 68 0a 20 20 20 20 72 65 73 69 64  ndwith.    resid
47b0: 75 61 6c 77 72 69 74 65 20 40 20 75 6d 69 6e 20  ualwrite @ umin 
47c0: 3b 0a 3a 20 64 61 74 61 2d 74 61 69 6c 40 20 28  ;.: data-tail@ (
47d0: 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20 20   -- addr u ).   
47e0: 20 5c 47 20 79 6f 75 20 63 61 6e 20 73 65 6e 64   \G you can send
47f0: 20 66 72 6f 6d 20 74 68 69 73 20 2d 20 61 73 20   from this - as 
4800: 6c 6f 6e 67 20 61 73 20 79 6f 75 20 73 74 61 79  long as you stay
4810: 20 62 6c 6f 63 6b 20 61 6c 69 67 6e 65 64 0a 20   block aligned. 
4820: 20 20 20 64 61 74 61 2d 6d 61 70 20 77 69 74 68     data-map with
4830: 20 6d 61 70 63 0a 20 20 20 20 64 65 73 74 2d 72   mapc.    dest-r
4840: 61 64 64 72 20 64 65 73 74 2d 74 61 69 6c 20 64  addr dest-tail d
4850: 65 73 74 2d 68 65 61 64 20 66 69 78 2d 73 69 7a  est-head fix-siz
4860: 65 27 20 65 6e 64 77 69 74 68 20 3b 0a 0a 3a 20  e' endwith ;..: 
4870: 64 61 74 61 2d 68 65 61 64 3f 20 28 20 2d 2d 20  data-head? ( -- 
4880: 66 6c 61 67 20 29 0a 20 20 20 20 5c 47 20 72 65  flag ).    \G re
4890: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
48a0: 72 65 20 69 73 20 73 70 61 63 65 20 74 6f 20 72  re is space to r
48b0: 65 61 64 20 64 61 74 61 20 69 6e 0a 20 20 20 20  ead data in.    
48c0: 64 61 74 61 2d 6d 61 70 20 77 69 74 68 20 6d 61  data-map with ma
48d0: 70 63 20 64 65 73 74 2d 68 65 61 64 20 64 65 73  pc dest-head des
48e0: 74 2d 62 61 63 6b 20 64 65 73 74 2d 73 69 7a 65  t-back dest-size
48f0: 20 2b 20 75 3c 20 65 6e 64 77 69 74 68 20 3b 0a   + u< endwith ;.
4900: 3a 20 64 61 74 61 2d 74 61 69 6c 3f 20 28 20 2d  : data-tail? ( -
4910: 2d 20 66 6c 61 67 20 29 0a 20 20 20 20 5c 47 20  - flag ).    \G 
4920: 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  return true if t
4930: 68 65 72 65 20 69 73 20 64 61 74 61 20 74 6f 20  here is data to 
4940: 73 65 6e 64 0a 20 20 20 20 64 61 74 61 2d 6d 61  send.    data-ma
4950: 70 20 77 69 74 68 20 6d 61 70 63 20 64 65 73 74  p with mapc dest
4960: 2d 74 61 69 6c 20 64 65 73 74 2d 68 65 61 64 20  -tail dest-head 
4970: 75 3c 20 65 6e 64 77 69 74 68 20 3b 0a 3a 20 72  u< endwith ;.: r
4980: 64 61 74 61 2d 62 61 63 6b 3f 20 28 20 74 61 69  data-back? ( tai
4990: 6c 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 20 20  l -- flag ).    
49a0: 5c 47 20 72 65 74 75 72 6e 20 74 72 75 65 20 69  \G return true i
49b0: 66 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  f there is data 
49c0: 61 76 61 69 6c 61 62 65 20 74 6f 20 77 72 69 74  availabe to writ
49d0: 65 20 6f 75 74 0a 20 20 20 20 64 61 74 61 2d 72  e out.    data-r
49e0: 6d 61 70 20 2e 6d 61 70 63 3a 64 65 73 74 2d 62  map .mapc:dest-b
49f0: 61 63 6b 20 75 3e 20 3b 0a 0a 5c 20 63 6f 64 65  ack u> ;..\ code
4a00: 20 73 65 6e 64 69 6e 67 20 61 72 6f 75 6e 64 0a   sending around.
4a10: 0a 3a 20 63 6f 64 65 2d 64 65 73 74 20 28 20 2d  .: code-dest ( -
4a20: 2d 20 61 64 64 72 20 29 0a 20 20 20 20 63 6f 64  - addr ).    cod
4a30: 65 2d 6d 61 70 20 77 69 74 68 20 6d 61 70 63 20  e-map with mapc 
4a40: 64 65 73 74 2d 72 61 64 64 72 20 64 65 73 74 2d  dest-raddr dest-
4a50: 74 61 69 6c 20 6d 61 78 64 61 74 61 20 6e 65 67  tail maxdata neg
4a60: 61 74 65 20 61 6e 64 20 2b 20 65 6e 64 77 69 74  ate and + endwit
4a70: 68 20 3b 0a 3a 20 63 6f 64 65 2d 76 64 65 73 74  h ;.: code-vdest
4a80: 20 28 20 2d 2d 20 61 64 64 72 20 29 0a 20 20 20   ( -- addr ).   
4a90: 20 63 6f 64 65 2d 6d 61 70 20 77 69 74 68 20 6d   code-map with m
4aa0: 61 70 63 20 64 65 73 74 2d 76 61 64 64 72 20 64  apc dest-vaddr d
4ab0: 65 73 74 2d 74 61 69 6c 20 6e 3e 36 34 20 36 34  est-tail n>64 64
4ac0: 2b 20 65 6e 64 77 69 74 68 20 3b 0a 3a 20 63 6f  + endwith ;.: co
4ad0: 64 65 2d 72 65 70 6c 79 20 28 20 2d 2d 20 61 64  de-reply ( -- ad
4ae0: 64 72 20 29 0a 20 20 20 20 63 6f 64 65 2d 6d 61  dr ).    code-ma
4af0: 70 20 77 69 74 68 20 6d 61 70 63 20 64 65 73 74  p with mapc dest
4b00: 2d 74 61 69 6c 20 61 64 64 72 3e 72 65 70 6c 69  -tail addr>repli
4b10: 65 73 20 64 65 73 74 2d 72 65 70 6c 69 65 73 20  es dest-replies 
4b20: 2b 20 65 6e 64 77 69 74 68 20 3b 0a 3a 20 73 65  + endwith ;.: se
4b30: 6e 64 2d 72 65 70 6c 79 20 28 20 2d 2d 20 61 64  nd-reply ( -- ad
4b40: 64 72 20 29 0a 20 20 20 20 63 6f 64 65 2d 6d 61  dr ).    code-ma
4b50: 70 20 77 69 74 68 20 6d 61 70 63 20 64 65 73 74  p with mapc dest
4b60: 2d 61 64 64 72 20 36 34 40 20 64 65 73 74 2d 76  -addr 64@ dest-v
4b70: 61 64 64 72 20 36 34 2d 20 36 34 3e 6e 20 61 64  addr 64- 64>n ad
4b80: 64 72 3e 72 65 70 6c 69 65 73 0a 09 64 65 73 74  dr>replies..dest
4b90: 2d 72 65 70 6c 69 65 73 20 2b 20 65 6e 64 77 69  -replies + endwi
4ba0: 74 68 20 3b 0a 0a 3a 20 74 61 67 2d 61 64 64 72  th ;..: tag-addr
4bb0: 20 28 20 2d 2d 20 61 64 64 72 20 29 0a 20 20 20   ( -- addr ).   
4bc0: 20 63 6f 64 65 2d 72 6d 61 70 20 77 69 74 68 20   code-rmap with 
4bd0: 6d 61 70 63 20 64 65 73 74 2d 61 64 64 72 20 36  mapc dest-addr 6
4be0: 34 40 20 64 65 73 74 2d 76 61 64 64 72 20 36 34  4@ dest-vaddr 64
4bf0: 2d 20 36 34 3e 6e 20 61 64 64 72 3e 72 65 70 6c  - 64>n addr>repl
4c00: 69 65 73 0a 09 64 65 73 74 2d 72 65 70 6c 69 65  ies..dest-replie
4c10: 73 20 2b 20 65 6e 64 77 69 74 68 20 3b 0a 0a 72  s + endwith ;..r
4c20: 65 70 6c 79 20 62 75 66 66 65 72 3a 20 64 75 6d  eply buffer: dum
4c30: 6d 79 2d 72 65 70 6c 79 0a 27 20 6e 6f 6f 70 20  my-reply.' noop 
4c40: 64 75 6d 6d 79 2d 72 65 70 6c 79 20 69 73 20 72  dummy-reply is r
4c50: 65 70 6c 79 2d 78 74 0a 0a 3a 20 72 65 70 6c 79  eply-xt..: reply
4c60: 5b 5d 20 28 20 69 6e 64 65 78 20 2d 2d 20 61 64  [] ( index -- ad
4c70: 64 72 20 29 0a 20 20 20 20 63 6f 64 65 2d 6d 61  dr ).    code-ma
4c80: 70 20 77 69 74 68 20 6d 61 70 63 0a 20 20 20 20  p with mapc.    
4c90: 64 75 70 20 64 65 73 74 2d 73 69 7a 65 20 61 64  dup dest-size ad
4ca0: 64 72 3e 62 69 74 73 20 75 3c 0a 20 20 20 20 49  dr>bits u<.    I
4cb0: 46 20 20 72 65 70 6c 79 20 2a 20 64 65 73 74 2d  F  reply * dest-
4cc0: 72 65 70 6c 69 65 73 20 2b 20 20 45 4c 53 45 20  replies +  ELSE 
4cd0: 20 64 75 6d 6d 79 2d 72 65 70 6c 79 20 20 54 48   dummy-reply  TH
4ce0: 45 4e 20 20 65 6e 64 77 69 74 68 20 3b 0a 0a 3a  EN  endwith ;..:
4cf0: 20 72 65 70 6c 79 2d 69 6e 64 65 78 20 28 20 2d   reply-index ( -
4d00: 2d 20 69 6e 64 65 78 20 29 0a 20 20 20 20 63 6f  - index ).    co
4d10: 64 65 2d 6d 61 70 20 2e 6d 61 70 63 3a 64 65 73  de-map .mapc:des
4d20: 74 2d 74 61 69 6c 20 61 64 64 72 3e 62 69 74 73  t-tail addr>bits
4d30: 20 3b 0a 0a 3a 20 63 6f 64 65 2b 20 28 20 6e 20   ;..: code+ ( n 
4d40: 2d 2d 20 29 0a 20 20 20 20 63 6f 6e 6e 65 63 74  -- ).    connect
4d50: 69 6f 6e 20 2e 63 6f 64 65 2d 6d 61 70 20 77 69  ion .code-map wi
4d60: 74 68 20 6d 61 70 63 20 64 75 70 20 6e 65 67 61  th mapc dup nega
4d70: 74 65 20 64 65 73 74 2d 74 61 69 6c 20 61 6e 64  te dest-tail and
4d80: 20 2b 0a 20 20 20 20 64 65 73 74 2d 73 69 7a 65   +.    dest-size
4d90: 20 31 2d 20 61 6e 64 20 74 6f 20 64 65 73 74 2d   1- and to dest-
4da0: 62 61 63 6b 20 65 6e 64 77 69 74 68 20 3b 0a 0a  back endwith ;..
4db0: 3a 20 63 6f 64 65 2d 75 70 64 61 74 65 20 28 20  : code-update ( 
4dc0: 6e 20 2d 2d 20 29 20 64 72 6f 70 20 5c 20 74 6f  n -- ) drop \ to
4dd0: 20 62 65 20 75 73 65 64 20 6c 61 74 65 72 0a 20   be used later. 
4de0: 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2e 63     connection .c
4df0: 6f 64 65 2d 6d 61 70 20 77 69 74 68 20 6d 61 70  ode-map with map
4e00: 63 20 64 65 73 74 2d 62 61 63 6b 20 74 6f 20 64  c dest-back to d
4e10: 65 73 74 2d 74 61 69 6c 20 65 6e 64 77 69 74 68  est-tail endwith
4e20: 20 3b 0a 0a 5c 20 61 6c 69 67 6e 65 64 20 62 75   ;..\ aligned bu
4e30: 66 66 65 72 20 74 6f 20 6d 61 6b 65 20 65 6e 63  ffer to make enc
4e40: 72 79 70 74 69 6f 6e 2f 64 65 63 72 79 70 74 69  ryption/decrypti
4e50: 6f 6e 20 66 61 73 74 0a 0a 3a 20 24 3e 61 6c 69  on fast..: $>ali
4e60: 67 6e 20 28 20 61 64 64 72 20 75 20 2d 2d 20 61  gn ( addr u -- a
4e70: 64 64 72 27 20 75 20 29 20 64 75 70 20 24 34 30  ddr' u ) dup $40
4e80: 30 20 75 3e 20 3f 45 58 49 54 0a 20 20 20 20 74  0 u> ?EXIT.    t
4e90: 75 63 6b 20 61 6c 69 67 6e 65 64 24 20 73 77 61  uck aligned$ swa
4ea0: 70 20 6d 6f 76 65 20 61 6c 69 67 6e 65 64 24 20  p move aligned$ 
4eb0: 73 77 61 70 20 3b 0a 20 20 20 20 0a 5c 20 74 69  swap ;.    .\ ti
4ec0: 6d 69 6e 67 20 72 65 63 6f 72 64 73 0a 0a 53 65  ming records..Se
4ed0: 6d 61 20 74 69 6d 69 6e 67 2d 73 65 6d 61 0a 0a  ma timing-sema..
4ee0: 69 6e 20 6e 65 74 32 6f 20 3a 20 74 72 61 63 6b  in net2o : track
4ef0: 2d 74 69 6d 69 6e 67 20 28 20 2d 2d 20 29 20 5c  -timing ( -- ) \
4f00: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 69 6d 69   initialize timi
4f10: 6e 67 20 72 65 63 6f 72 64 73 0a 20 20 20 20 74  ng records.    t
4f20: 69 6d 69 6e 67 2d 73 74 61 74 20 24 6f 66 66 20  iming-stat $off 
4f30: 3b 0a 0a 3a 20 29 73 74 61 74 73 20 5d 5d 20 54  ;..: )stats ]] T
4f40: 48 45 4e 20 5b 5b 20 3b 0a 3a 20 73 74 61 74 73  HEN [[ ;.: stats
4f50: 28 20 5d 5d 20 74 69 6d 69 6e 67 2d 73 74 61 74  ( ]] timing-stat
4f60: 20 40 20 49 46 20 5b 5b 20 5b 27 5d 20 29 73 74   @ IF [[ ['] )st
4f70: 61 74 73 20 61 73 73 65 72 74 2d 63 61 6e 61 72  ats assert-canar
4f80: 79 20 3b 20 69 6d 6d 65 64 69 61 74 65 0a 0a 69  y ; immediate..i
4f90: 6e 20 6e 65 74 32 6f 20 3a 20 74 69 6d 69 6e 67  n net2o : timing
4fa0: 24 20 28 20 2d 2d 20 61 64 64 72 20 75 20 29 0a  $ ( -- addr u ).
4fb0: 20 20 20 20 73 74 61 74 73 28 20 74 69 6d 69 6e      stats( timin
4fc0: 67 2d 73 74 61 74 20 24 40 20 20 45 58 49 54 20  g-stat $@  EXIT 
4fd0: 29 20 2e 22 20 6e 6f 20 74 69 6d 69 6e 67 20 73  ) ." no timing s
4fe0: 74 61 74 73 22 20 63 72 20 73 22 20 22 20 3b 0a  tats" cr s" " ;.
4ff0: 69 6e 20 6e 65 74 32 6f 20 3a 20 2f 74 69 6d 69  in net2o : /timi
5000: 6e 67 20 28 20 6e 20 2d 2d 20 29 0a 20 20 20 20  ng ( n -- ).    
5010: 73 74 61 74 73 28 20 74 69 6d 69 6e 67 2d 73 74  stats( timing-st
5020: 61 74 20 30 20 72 6f 74 20 24 64 65 6c 20 29 20  at 0 rot $del ) 
5030: 3b 0a 0a 3a 20 2e 72 65 63 2d 74 69 6d 69 6e 67  ;..: .rec-timing
5040: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20   ( addr u -- ). 
5050: 20 20 20 5b 3a 20 61 63 6b 40 20 3e 6f 20 74 72     [: ack@ >o tr
5060: 61 63 6b 2d 74 69 6d 69 6e 67 20 24 40 20 5c 20  ack-timing $@ \ 
5070: 64 6f 20 73 6f 6d 65 20 64 75 6d 70 73 0a 20 20  do some dumps.  
5080: 20 20 20 20 62 6f 75 6e 64 73 20 3f 44 4f 0a 09      bounds ?DO..
5090: 20 20 49 20 74 73 2d 64 65 6c 74 61 20 66 3e 36    I ts-delta f>6
50a0: 34 20 6c 61 73 74 2d 74 69 6d 65 20 36 34 2b 21  4 last-time 64+!
50b0: 0a 09 20 20 6c 61 73 74 2d 74 69 6d 65 20 36 34  ..  last-time 64
50c0: 40 20 36 34 3e 66 20 31 6e 20 66 2a 20 66 64 75  @ 64>f 1n f* fdu
50d0: 70 20 66 2e 0a 09 20 20 74 69 6d 65 2d 6f 66 66  p f...  time-off
50e0: 73 65 74 20 36 34 40 20 36 34 3e 66 20 31 6e 20  set 64@ 64>f 1n 
50f0: 66 2a 20 31 30 65 20 66 6d 6f 64 20 66 2b 20 66  f* 10e fmod f+ f
5100: 2e 0a 09 20 20 5c 20 49 20 74 73 2d 64 65 6c 74  ...  \ I ts-delt
5110: 61 20 66 2e 0a 09 20 20 49 20 74 73 2d 73 6c 61  a f...  I ts-sla
5120: 63 6b 20 31 75 20 66 2a 20 66 2e 0a 09 20 20 74  ck 1u f* f...  t
5130: 69 63 6b 2d 69 6e 69 74 20 31 2b 20 6d 61 78 64  ick-init 1+ maxd
5140: 61 74 61 20 2a 20 31 6b 20 66 6d 2a 20 66 64 75  ata * 1k fm* fdu
5150: 70 0a 09 20 20 49 20 74 73 2d 72 65 71 72 61 74  p..  I ts-reqrat
5160: 65 20 66 2f 20 66 2e 0a 09 20 20 49 20 74 73 2d  e f/ f...  I ts-
5170: 72 61 74 65 20 66 2f 20 66 2e 0a 09 20 20 49 20  rate f/ f...  I 
5180: 74 73 2d 67 72 6f 77 20 31 75 20 66 2a 20 66 2e  ts-grow 1u f* f.
5190: 0a 09 20 20 2e 22 20 74 69 6d 69 6e 67 22 20 63  ..  ." timing" c
51a0: 72 0a 20 20 20 20 20 20 74 69 6d 65 73 74 61 74  r.      timestat
51b0: 73 20 2b 4c 4f 4f 50 0a 20 20 20 20 20 20 74 72  s +LOOP.      tr
51c0: 61 63 6b 2d 74 69 6d 69 6e 67 20 24 6f 66 66 20  ack-timing $off 
51d0: 6f 3e 20 3b 5d 20 74 69 6d 69 6e 67 2d 73 65 6d  o> ;] timing-sem
51e0: 61 20 63 2d 73 65 63 74 69 6f 6e 20 3b 0a 0a 69  a c-section ;..i
51f0: 6e 20 6e 65 74 32 6f 20 3a 20 72 65 63 2d 74 69  n net2o : rec-ti
5200: 6d 69 6e 67 20 28 20 61 64 64 72 20 75 20 2d 2d  ming ( addr u --
5210: 20 29 0a 20 20 20 20 5b 3a 20 74 72 61 63 6b 2d   ).    [: track-
5220: 74 69 6d 69 6e 67 20 24 2b 21 20 3b 5d 20 74 69  timing $+! ;] ti
5230: 6d 69 6e 67 2d 73 65 6d 61 20 63 2d 73 65 63 74  ming-sema c-sect
5240: 69 6f 6e 20 3b 0a 0a 3a 20 73 74 61 74 2b 20 28  ion ;..: stat+ (
5250: 20 61 64 64 72 20 2d 2d 20 29 20 20 73 74 61 74   addr -- )  stat
5260: 2d 74 75 70 6c 65 20 74 69 6d 65 73 74 61 74 73  -tuple timestats
5270: 20 20 74 69 6d 69 6e 67 2d 73 74 61 74 20 24 2b    timing-stat $+
5280: 21 20 3b 0a 0a 5c 20 66 6c 6f 77 20 63 6f 6e 74  ! ;..\ flow cont
5290: 72 6f 6c 0a 0a 3a 20 21 74 69 63 6b 73 20 28 20  rol..: !ticks ( 
52a0: 2d 2d 20 29 0a 20 20 20 20 74 69 63 6b 73 20 74  -- ).    ticks t
52b0: 69 63 6b 65 72 20 36 34 21 20 3b 0a 0a 3a 20 74  icker 64! ;..: t
52c0: 69 63 6b 73 2d 69 6e 69 74 20 28 20 74 69 63 6b  icks-init ( tick
52d0: 73 20 2d 2d 20 29 0a 20 20 20 20 36 34 64 75 70  s -- ).    64dup
52e0: 20 62 61 6e 64 77 69 64 74 68 2d 74 69 63 6b 20   bandwidth-tick 
52f0: 36 34 21 20 20 6e 65 78 74 2d 74 69 63 6b 20 36  64!  next-tick 6
5300: 34 21 20 3b 0a 0a 3a 20 3e 72 74 64 65 6c 61 79  4! ;..: >rtdelay
5310: 20 28 20 63 6c 69 65 6e 74 20 73 65 72 76 20 2d   ( client serv -
5320: 2d 20 63 6c 69 65 6e 74 20 73 65 72 76 20 29 0a  - client serv ).
5330: 20 20 20 20 72 65 63 76 2d 74 69 63 6b 20 36 34      recv-tick 64
5340: 40 20 36 34 64 75 70 20 6c 61 73 74 61 63 6b 20  @ 64dup lastack 
5350: 36 34 21 0a 20 20 20 20 36 34 6f 76 65 72 20 36  64!.    64over 6
5360: 34 2d 20 72 74 64 28 20 2e 22 20 72 74 64 65 6c  4- rtd( ." rtdel
5370: 61 79 20 6d 69 6e 20 74 6f 20 22 20 36 34 64 75  ay min to " 64du
5380: 70 20 36 34 3e 66 20 2e 6e 73 20 63 72 20 29 20  p 64>f .ns cr ) 
5390: 72 74 64 65 6c 61 79 20 36 34 6d 69 6e 21 20 3b  rtdelay 64min! ;
53a0: 0a 0a 3a 20 74 69 6d 65 73 74 61 74 20 28 20 63  ..: timestat ( c
53b0: 6c 69 65 6e 74 20 73 65 72 76 20 2d 2d 20 29 0a  lient serv -- ).
53c0: 20 20 20 20 36 34 64 75 70 20 36 34 2d 30 3c 3d      64dup 64-0<=
53d0: 20 20 20 20 49 46 20 20 36 34 64 72 6f 70 20 36      IF  64drop 6
53e0: 34 64 72 6f 70 20 20 45 58 49 54 20 20 54 48 45  4drop  EXIT  THE
53f0: 4e 0a 20 20 20 20 74 69 6d 69 6e 67 28 20 36 34  N.    timing( 64
5400: 6f 76 65 72 20 75 36 34 2e 20 36 34 64 75 70 20  over u64. 64dup 
5410: 75 36 34 2e 20 2e 22 20 61 63 6b 74 69 6d 65 22  u64. ." acktime"
5420: 20 63 72 20 29 0a 20 20 20 20 3e 72 74 64 65 6c   cr ).    >rtdel
5430: 61 79 20 20 36 34 2d 20 36 34 64 75 70 20 6c 61  ay  64- 64dup la
5440: 73 74 73 6c 61 63 6b 20 36 34 21 0a 20 20 20 20  stslack 64!.    
5450: 6c 61 73 74 64 65 6c 74 61 74 20 36 34 40 20 64  lastdeltat 64@ d
5460: 65 6c 74 61 2d 64 61 6d 70 23 20 36 34 72 73 68  elta-damp# 64rsh
5470: 69 66 74 0a 20 20 20 20 36 34 64 75 70 20 6d 69  ift.    64dup mi
5480: 6e 2d 73 6c 61 63 6b 20 36 34 2b 21 20 36 34 6e  n-slack 64+! 64n
5490: 65 67 61 74 65 20 6d 61 78 2d 73 6c 61 63 6b 20  egate max-slack 
54a0: 36 34 2b 21 0a 20 20 20 20 36 34 64 75 70 20 6d  64+!.    64dup m
54b0: 69 6e 2d 73 6c 61 63 6b 20 36 34 6d 69 6e 21 0a  in-slack 64min!.
54c0: 20 20 20 20 6d 61 78 2d 73 6c 61 63 6b 20 36 34      max-slack 64
54d0: 6d 61 78 21 20 3b 0a 0a 3a 20 62 32 62 2d 74 69  max! ;..: b2b-ti
54e0: 6d 65 73 74 61 74 20 28 20 63 6c 69 65 6e 74 20  mestat ( client 
54f0: 73 65 72 76 20 2d 2d 20 29 0a 20 20 20 20 36 34  serv -- ).    64
5500: 64 75 70 20 36 34 2d 30 3c 3d 20 49 46 20 20 36  dup 64-0<= IF  6
5510: 34 64 72 6f 70 20 36 34 64 72 6f 70 20 20 45 58  4drop 64drop  EX
5520: 49 54 20 20 54 48 45 4e 0a 20 20 20 20 36 34 2d  IT  THEN.    64-
5530: 20 6c 61 73 74 73 6c 61 63 6b 20 36 34 40 20 36   lastslack 64@ 6
5540: 34 2d 20 73 6c 61 63 6b 67 72 6f 77 20 36 34 21  4- slackgrow 64!
5550: 20 3b 0a 0a 73 63 6f 70 65 7b 20 6d 61 70 63 0a   ;..scope{ mapc.
5560: 0a 3a 20 3e 6f 66 66 73 65 74 20 28 20 61 64 64  .: >offset ( add
5570: 72 20 2d 2d 20 61 64 64 72 27 20 66 6c 61 67 20  r -- addr' flag 
5580: 29 0a 20 20 20 20 64 65 73 74 2d 76 61 64 64 72  ).    dest-vaddr
5590: 20 36 34 2d 20 36 34 3e 6e 20 64 75 70 20 64 65   64- 64>n dup de
55a0: 73 74 2d 73 69 7a 65 20 75 3c 20 3b 0a 0a 7d 73  st-size u< ;..}s
55b0: 63 6f 70 65 0a 0a 23 35 30 30 30 30 30 30 20 56  cope..#5000000 V
55c0: 61 6c 75 65 20 72 74 2d 62 69 61 73 23 20 5c 20  alue rt-bias# \ 
55d0: 35 6d 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 66  5ms additional f
55e0: 6c 79 62 75 72 73 74 73 20 61 6c 6c 6f 77 65 64  lybursts allowed
55f0: 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 73 65 74  ..in net2o : set
5600: 2d 66 6c 79 62 75 72 73 74 20 28 20 2d 2d 20 62  -flyburst ( -- b
5610: 75 72 73 74 73 20 29 0a 20 20 20 20 72 74 64 65  ursts ).    rtde
5620: 6c 61 79 20 36 34 40 20 36 34 3e 66 20 72 74 2d  lay 64@ 64>f rt-
5630: 62 69 61 73 23 20 73 3e 66 20 66 2b 20 6e 73 2f  bias# s>f f+ ns/
5640: 62 75 72 73 74 20 36 34 40 20 36 34 3e 66 20 66  burst 64@ 64>f f
5650: 2f 20 66 3e 73 0a 20 20 20 20 66 6c 79 62 75 72  / f>s.    flybur
5660: 73 74 73 23 20 2b 0a 20 20 20 20 62 75 72 73 74  sts# +.    burst
5670: 73 28 20 64 75 70 20 2e 20 2e 6f 20 2e 22 20 66  s( dup . .o ." f
5680: 6c 79 62 75 72 73 74 73 20 22 0a 20 20 20 20 72  lybursts ".    r
5690: 74 64 65 6c 61 79 20 36 34 40 20 75 36 34 2e 20  tdelay 64@ u64. 
56a0: 6e 73 2f 62 75 72 73 74 20 36 34 40 20 75 36 34  ns/burst 64@ u64
56b0: 2e 20 2e 22 20 72 74 64 65 6c 61 79 22 20 63 72  . ." rtdelay" cr
56c0: 20 29 0a 20 20 20 20 64 75 70 20 66 6c 79 62 75   ).    dup flybu
56d0: 72 73 74 73 2d 6d 61 78 23 20 6d 69 6e 20 72 61  rsts-max# min ra
56e0: 74 65 28 20 2e 22 20 66 6c 79 62 75 72 73 74 3a  te( ." flyburst:
56f0: 20 22 20 64 75 70 20 2e 20 29 20 66 6c 79 62 75   " dup . ) flybu
5700: 72 73 74 20 21 20 3b 0a 69 6e 20 6e 65 74 32 6f  rst ! ;.in net2o
5710: 20 3a 20 6d 61 78 2d 66 6c 79 62 75 72 73 74 20   : max-flyburst 
5720: 28 20 62 75 72 73 74 73 20 2d 2d 20 29 20 20 66  ( bursts -- )  f
5730: 6c 79 62 75 72 73 74 73 2d 6d 61 78 23 20 6d 69  lybursts-max# mi
5740: 6e 20 66 6c 79 62 75 72 73 74 73 20 6d 61 78 21  n flybursts max!
5750: 40 0a 20 20 20 20 62 75 72 73 74 73 28 20 30 3d  @.    bursts( 0=
5760: 20 49 46 20 20 2e 6f 20 2e 22 20 73 74 61 72 74   IF  .o ." start
5770: 20 62 75 72 73 74 73 22 20 63 72 20 54 48 45 4e   bursts" cr THEN
5780: 20 29 65 6c 73 65 28 20 64 72 6f 70 20 29 20 3b   )else( drop ) ;
5790: 0a 0a 3a 20 3e 66 6c 79 62 75 72 73 74 20 28 20  ..: >flyburst ( 
57a0: 2d 2d 20 29 0a 20 20 20 20 66 6c 79 62 75 72 73  -- ).    flyburs
57b0: 74 20 40 20 66 6c 79 62 75 72 73 74 73 20 6d 61  t @ flybursts ma
57c0: 78 21 40 20 5c 20 72 65 73 65 74 20 62 75 72 73  x!@ \ reset burs
57d0: 74 73 20 69 6e 20 66 6c 69 67 68 74 0a 20 20 20  ts in flight.   
57e0: 20 30 3d 20 49 46 20 20 72 65 63 76 2d 74 69 63   0= IF  recv-tic
57f0: 6b 20 36 34 40 20 74 69 63 6b 73 2d 69 6e 69 74  k 64@ ticks-init
5800: 0a 09 62 75 72 73 74 73 28 20 2e 6f 20 2e 22 20  ..bursts( .o ." 
5810: 72 65 73 74 61 72 74 20 62 75 72 73 74 73 20 22  restart bursts "
5820: 20 66 6c 79 62 75 72 73 74 73 20 3f 20 63 72 20   flybursts ? cr 
5830: 29 0a 09 6e 65 74 32 6f 3a 73 65 74 2d 66 6c 79  )..net2o:set-fly
5840: 62 75 72 73 74 20 6e 65 74 32 6f 3a 6d 61 78 2d  burst net2o:max-
5850: 66 6c 79 62 75 72 73 74 0a 20 20 20 20 54 48 45  flyburst.    THE
5860: 4e 20 3b 0a 0a 3a 20 3e 74 69 6d 65 73 74 61 6d  N ;..: >timestam
5870: 70 20 28 20 74 69 6d 65 20 61 64 64 72 20 2d 2d  p ( time addr --
5880: 20 74 69 6d 65 27 20 74 73 2d 61 72 72 61 79 20   time' ts-array 
5890: 69 6e 64 65 78 20 2f 20 74 69 6d 65 27 20 30 20  index / time' 0 
58a0: 30 20 29 0a 20 20 20 20 3e 66 6c 79 62 75 72 73  0 ).    >flyburs
58b0: 74 0a 20 20 20 20 36 34 3e 72 20 74 69 6d 65 2d  t.    64>r time-
58c0: 6f 66 66 73 65 74 20 36 34 40 20 36 34 2b 20 36  offset 64@ 64+ 6
58d0: 34 72 3e 0a 20 20 20 20 70 61 72 65 6e 74 20 2e  4r>.    parent .
58e0: 64 61 74 61 2d 6d 61 70 20 64 75 70 20 30 3d 20  data-map dup 0= 
58f0: 49 46 20 20 64 72 6f 70 20 30 20 30 20 20 45 58  IF  drop 0 0  EX
5900: 49 54 20 20 54 48 45 4e 20 20 3e 72 0a 20 20 20  IT  THEN  >r.   
5910: 20 72 40 20 77 69 74 68 20 6d 61 70 63 20 3e 6f   r@ with mapc >o
5920: 66 66 73 65 74 20 20 49 46 0a 09 64 65 73 74 2d  ffset  IF..dest-
5930: 74 61 69 6c 20 64 65 73 74 2d 73 69 7a 65 20 65  tail dest-size e
5940: 6e 64 77 69 74 68 20 20 3e 72 20 6f 76 65 72 20  ndwith  >r over 
5950: 2d 20 72 3e 20 31 2d 20 61 6e 64 0a 09 61 64 64  - r> 1- and..add
5960: 72 3e 62 69 74 73 20 31 20 6d 61 78 20 77 69 6e  r>bits 1 max win
5970: 64 6f 77 2d 73 69 7a 65 20 21 0a 09 61 64 64 72  dow-size !..addr
5980: 3e 74 73 20 72 3e 20 2e 6d 61 70 63 3a 64 65 73  >ts r> .mapc:des
5990: 74 2d 74 69 6d 65 73 74 61 6d 70 73 20 73 77 61  t-timestamps swa
59a0: 70 0a 20 20 20 20 45 4c 53 45 20 20 6f 3e 20 72  p.    ELSE  o> r
59b0: 64 72 6f 70 20 30 20 30 20 20 54 48 45 4e 20 3b  drop 0 0  THEN ;
59c0: 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 61 63 6b  ..in net2o : ack
59d0: 2d 61 64 64 72 74 69 6d 65 20 28 20 74 69 63 6b  -addrtime ( tick
59e0: 73 20 61 64 64 72 20 2d 2d 20 29 0a 20 20 20 20  s addr -- ).    
59f0: 3e 74 69 6d 65 73 74 61 6d 70 20 6f 76 65 72 20  >timestamp over 
5a00: 20 49 46 0a 09 64 75 70 20 74 69 63 6b 2d 69 6e   IF..dup tick-in
5a10: 69 74 20 31 2b 20 36 34 73 20 75 3e 0a 09 49 46  it 1+ 64s u>..IF
5a20: 20 20 2b 20 64 75 70 20 3e 72 20 20 36 34 40 0a    + dup >r  64@.
5a30: 09 20 20 20 20 72 40 20 74 69 63 6b 2d 69 6e 69  .    r@ tick-ini
5a40: 74 20 31 2b 20 36 34 73 20 2d 20 36 34 40 0a 09  t 1+ 64s - 64@..
5a50: 20 20 20 20 36 34 64 75 70 20 36 34 2d 30 3c 3d      64dup 64-0<=
5a60: 20 3e 72 20 36 34 6f 76 65 72 20 36 34 2d 30 3c   >r 64over 64-0<
5a70: 3d 20 72 3e 20 6f 72 0a 09 20 20 20 20 49 46 20  = r> or..    IF 
5a80: 20 36 34 64 72 6f 70 20 36 34 64 72 6f 70 20 20   64drop 64drop  
5a90: 45 4c 53 45 20 20 36 34 2d 20 6c 61 73 74 64 65  ELSE  64- lastde
5aa0: 6c 74 61 74 20 36 34 21 20 20 54 48 45 4e 20 20  ltat 64!  THEN  
5ab0: 72 3e 0a 09 45 4c 53 45 20 20 2b 20 20 54 48 45  r>..ELSE  +  THE
5ac0: 4e 0a 09 36 34 40 20 74 69 6d 65 73 74 61 74 0a  N..64@ timestat.
5ad0: 20 20 20 20 45 4c 53 45 20 20 32 64 72 6f 70 20      ELSE  2drop 
5ae0: 36 34 64 72 6f 70 20 20 54 48 45 4e 20 3b 0a 0a  64drop  THEN ;..
5af0: 69 6e 20 6e 65 74 32 6f 20 3a 20 61 63 6b 2d 62  in net2o : ack-b
5b00: 32 62 74 69 6d 65 20 28 20 74 69 63 6b 73 20 61  2btime ( ticks a
5b10: 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 3e 74 69  ddr -- ).    >ti
5b20: 6d 65 73 74 61 6d 70 20 6f 76 65 72 20 20 49 46  mestamp over  IF
5b30: 20 20 2b 20 36 34 40 20 62 32 62 2d 74 69 6d 65    + 64@ b2b-time
5b40: 73 74 61 74 0a 20 20 20 20 45 4c 53 45 20 20 32  stat.    ELSE  2
5b50: 64 72 6f 70 20 36 34 64 72 6f 70 20 20 54 48 45  drop 64drop  THE
5b60: 4e 20 3b 0a 0a 5c 20 73 65 74 20 72 61 74 65 20  N ;..\ set rate 
5b70: 63 61 6c 63 75 6c 61 74 69 6f 6e 0a 0a 23 32 30  calculation..#20
5b80: 30 30 30 30 30 30 20 56 61 6c 75 65 20 73 6c 61  000000 Value sla
5b90: 63 6b 2d 64 65 66 61 75 6c 74 23 20 5c 20 32 30  ck-default# \ 20
5ba0: 6d 73 20 73 6c 61 63 6b 20 6c 65 61 64 73 20 74  ms slack leads t
5bb0: 6f 20 62 61 63 6b 64 72 6f 70 20 6f 66 20 66 61  o backdrop of fa
5bc0: 63 74 6f 72 20 32 0a 23 31 30 30 30 30 30 30 20  ctor 2.#1000000 
5bd0: 56 61 6c 75 65 20 73 6c 61 63 6b 2d 62 69 61 73  Value slack-bias
5be0: 23 20 5c 20 31 6d 73 20 77 69 74 68 6f 75 74 20  # \ 1ms without 
5bf0: 65 66 66 65 63 74 0a 73 6c 61 63 6b 2d 64 65 66  effect.slack-def
5c00: 61 75 6c 74 23 20 32 2a 20 32 2a 20 6e 3e 36 34  ault# 2* 2* n>64
5c10: 20 36 34 43 6f 6e 73 74 61 6e 74 20 73 6c 61 63   64Constant slac
5c20: 6b 2d 69 67 6e 6f 72 65 23 20 5c 20 61 62 6f 76  k-ignore# \ abov
5c30: 65 20 38 30 6d 73 20 69 73 20 69 67 6e 6f 72 65  e 80ms is ignore
5c40: 64 0a 23 30 20 56 61 6c 75 65 20 73 6c 61 63 6b  d.#0 Value slack
5c50: 2d 6d 69 6e 23 20 5c 20 6d 69 6e 69 6d 75 6d 20  -min# \ minimum 
5c60: 65 66 66 65 63 74 20 6c 69 6d 69 74 0a 33 20 34  effect limit.3 4
5c70: 20 32 43 6f 6e 73 74 61 6e 74 20 65 78 74 2d 64   2Constant ext-d
5c80: 61 6d 70 23 20 5c 20 37 35 25 20 64 61 6d 70 69  amp# \ 75% dampi
5c90: 6e 67 0a 35 20 32 20 32 43 6f 6e 73 74 61 6e 74  ng.5 2 2Constant
5ca0: 20 64 65 6c 74 61 2d 74 2d 67 72 6f 77 23 20 5c   delta-t-grow# \
5cb0: 20 34 20 74 69 6d 65 73 20 64 65 6c 74 61 2d 74   4 times delta-t
5cc0: 0a 0a 3a 20 73 6c 61 63 6b 2d 6d 61 78 23 20 28  ..: slack-max# (
5cd0: 20 2d 2d 20 6e 20 29 20 6d 61 78 2d 73 6c 61 63   -- n ) max-slac
5ce0: 6b 20 36 34 40 20 6d 69 6e 2d 73 6c 61 63 6b 20  k 64@ min-slack 
5cf0: 36 34 40 20 36 34 2d 20 3b 0a 3a 20 73 6c 61 63  64@ 64- ;.: slac
5d00: 6b 23 20 28 20 2d 2d 20 6e 20 29 20 20 73 6c 61  k# ( -- n )  sla
5d10: 63 6b 2d 6d 61 78 23 20 36 34 3e 6e 20 32 2f 20  ck-max# 64>n 2/ 
5d20: 32 2f 20 73 6c 61 63 6b 2d 64 65 66 61 75 6c 74  2/ slack-default
5d30: 23 20 6d 61 78 20 3b 0a 0a 3a 20 3e 73 6c 61 63  # max ;..: >slac
5d40: 6b 2d 65 78 70 20 28 20 2d 2d 20 72 66 61 63 74  k-exp ( -- rfact
5d50: 6f 72 20 29 0a 20 20 20 20 6c 61 73 74 73 6c 61  or ).    lastsla
5d60: 63 6b 20 36 34 40 20 6d 69 6e 2d 73 6c 61 63 6b  ck 64@ min-slack
5d70: 20 36 34 40 20 36 34 2d 0a 20 20 20 20 36 34 64   64@ 64-.    64d
5d80: 75 70 20 36 34 61 62 73 20 73 6c 61 63 6b 2d 69  up 64abs slack-i
5d90: 67 6e 6f 72 65 23 20 36 34 75 3e 20 49 46 0a 09  gnore# 64u> IF..
5da0: 6d 73 67 28 20 2e 22 20 73 6c 61 63 6b 20 69 67  msg( ." slack ig
5db0: 6e 6f 72 65 64 3a 20 22 20 36 34 64 75 70 20 75  nored: " 64dup u
5dc0: 36 34 2e 20 63 72 20 29 0a 09 36 34 64 72 6f 70  64. cr )..64drop
5dd0: 20 36 34 23 30 20 6c 61 73 74 73 6c 61 63 6b 20   64#0 lastslack 
5de0: 36 34 40 20 6d 69 6e 2d 73 6c 61 63 6b 20 36 34  64@ min-slack 64
5df0: 21 0a 20 20 20 20 54 48 45 4e 0a 20 20 20 20 36  !.    THEN.    6
5e00: 34 3e 6e 20 73 74 61 74 73 28 20 64 75 70 20 73  4>n stats( dup s
5e10: 3e 66 20 73 74 61 74 2d 74 75 70 6c 65 20 74 6f  >f stat-tuple to
5e20: 20 74 73 2d 73 6c 61 63 6b 20 29 0a 20 20 20 20   ts-slack ).    
5e30: 73 6c 61 63 6b 2d 62 69 61 73 23 20 2d 20 73 6c  slack-bias# - sl
5e40: 61 63 6b 2d 6d 69 6e 23 20 6d 61 78 20 73 6c 61  ack-min# max sla
5e50: 63 6b 23 20 32 2a 20 32 2a 20 6d 69 6e 0a 20 20  ck# 2* 2* min.  
5e60: 20 20 73 3e 66 20 73 6c 61 63 6b 23 20 66 6d 2f    s>f slack# fm/
5e70: 20 32 65 20 66 73 77 61 70 20 66 2a 2a 20 3b 0a   2e fswap f** ;.
5e80: 0a 3a 20 61 67 67 72 65 73 73 69 76 69 74 79 2d  .: aggressivity-
5e90: 72 61 74 65 20 28 20 73 6c 61 63 6b 20 2d 2d 20  rate ( slack -- 
5ea0: 73 6c 61 63 6b 27 20 29 0a 20 20 20 20 73 6c 61  slack' ).    sla
5eb0: 63 6b 2d 6d 61 78 23 20 36 34 2d 32 2f 20 36 34  ck-max# 64-2/ 64
5ec0: 3e 6e 20 73 6c 61 63 6b 2d 64 65 66 61 75 6c 74  >n slack-default
5ed0: 23 20 74 75 63 6b 20 6d 69 6e 20 73 77 61 70 20  # tuck min swap 
5ee0: 36 34 2a 2f 20 3b 0a 0a 3a 20 73 6c 61 63 6b 65  64*/ ;..: slacke
5ef0: 78 74 20 28 20 72 66 61 63 74 6f 72 20 2d 2d 20  xt ( rfactor -- 
5f00: 73 6c 61 63 6b 20 29 0a 20 20 20 20 73 6c 61 63  slack ).    slac
5f10: 6b 67 72 6f 77 20 36 34 40 0a 20 20 20 20 77 69  kgrow 64@.    wi
5f20: 6e 64 6f 77 2d 73 69 7a 65 20 40 20 74 69 63 6b  ndow-size @ tick
5f30: 2d 69 6e 69 74 20 31 2b 20 62 75 72 73 74 73 23  -init 1+ bursts#
5f40: 20 2d 20 32 2a 20 36 34 2a 2f 0a 20 20 20 20 36   - 2* 64*/.    6
5f50: 34 3e 66 20 66 2a 20 66 3e 36 34 0a 20 20 20 20  4>f f* f>64.    
5f60: 73 6c 61 63 6b 67 72 6f 77 27 20 36 34 40 20 36  slackgrow' 64@ 6
5f70: 34 2b 20 36 34 64 75 70 20 65 78 74 2d 64 61 6d  4+ 64dup ext-dam
5f80: 70 23 20 36 34 2a 2f 20 73 6c 61 63 6b 67 72 6f  p# 64*/ slackgro
5f90: 77 27 20 36 34 21 0a 20 20 20 20 36 34 23 30 20  w' 64!.    64#0 
5fa0: 36 34 6d 61 78 20 61 67 67 72 65 73 73 69 76 69  64max aggressivi
5fb0: 74 79 2d 72 61 74 65 20 3b 0a 0a 3a 20 72 61 74  ty-rate ;..: rat
5fc0: 65 2d 6c 69 6d 69 74 20 28 20 72 61 74 65 20 2d  e-limit ( rate -
5fd0: 2d 20 72 61 74 65 27 20 29 0a 20 20 20 20 5c 20  - rate' ).    \ 
5fe0: 6e 6f 74 20 74 6f 6f 20 71 75 69 63 6b 6c 79 20  not too quickly 
5ff0: 67 6f 20 66 61 73 74 65 72 21 0a 20 20 20 20 36  go faster!.    6
6000: 34 64 75 70 20 6c 61 73 74 2d 6e 73 2f 62 75 72  4dup last-ns/bur
6010: 73 74 20 36 34 21 40 20 36 34 6d 61 78 20 3b 0a  st 64!@ 64max ;.
6020: 0a 3a 20 3e 65 78 74 72 61 2d 6e 73 20 28 20 72  .: >extra-ns ( r
6030: 61 74 65 20 2d 2d 20 72 61 74 65 27 20 29 0a 20  ate -- rate' ). 
6040: 20 20 20 3e 73 6c 61 63 6b 2d 65 78 70 20 66 64     >slack-exp fd
6050: 75 70 20 36 34 3e 66 20 66 2a 20 66 3e 36 34 20  up 64>f f* f>64 
6060: 73 6c 61 63 6b 65 78 74 0a 20 20 20 20 36 34 6f  slackext.    64o
6070: 76 65 72 20 36 34 2d 32 2a 20 36 34 2d 32 2a 20  ver 64-2* 64-2* 
6080: 36 34 6d 69 6e 20 5c 20 6c 69 6d 69 74 20 74 6f  64min \ limit to
6090: 20 34 2a 20 72 61 74 65 0a 20 20 20 20 36 34 64   4* rate.    64d
60a0: 75 70 20 65 78 74 72 61 2d 6e 73 20 36 34 21 20  up extra-ns 64! 
60b0: 36 34 2b 20 3b 0a 0a 3a 20 72 61 74 65 2d 73 74  64+ ;..: rate-st
60c0: 61 74 31 20 28 20 72 61 74 65 20 64 65 6c 74 61  at1 ( rate delta
60d0: 74 20 2d 2d 20 29 0a 20 20 20 20 73 74 61 74 73  t -- ).    stats
60e0: 28 20 72 65 63 76 2d 74 69 63 6b 20 36 34 40 20  ( recv-tick 64@ 
60f0: 74 69 6d 65 2d 6f 66 66 73 65 74 20 36 34 40 20  time-offset 64@ 
6100: 36 34 2d 0a 20 20 20 20 20 20 20 20 20 20 20 36  64-.           6
6110: 34 64 75 70 20 6c 61 73 74 2d 74 69 6d 65 20 36  4dup last-time 6
6120: 34 21 40 20 36 34 2d 20 36 34 3e 66 20 73 74 61  4!@ 64- 64>f sta
6130: 74 2d 74 75 70 6c 65 20 74 6f 20 74 73 2d 64 65  t-tuple to ts-de
6140: 6c 74 61 0a 20 20 20 20 20 20 20 20 20 20 20 36  lta.           6
6150: 34 6f 76 65 72 20 36 34 3e 66 20 73 74 61 74 2d  4over 64>f stat-
6160: 74 75 70 6c 65 20 74 6f 20 74 73 2d 72 65 71 72  tuple to ts-reqr
6170: 61 74 65 20 29 20 3b 0a 0a 3a 20 72 61 74 65 2d  ate ) ;..: rate-
6180: 73 74 61 74 32 20 28 20 72 61 74 65 20 2d 2d 20  stat2 ( rate -- 
6190: 72 61 74 65 20 29 0a 20 20 20 20 73 74 61 74 73  rate ).    stats
61a0: 28 20 36 34 64 75 70 20 65 78 74 72 61 2d 6e 73  ( 64dup extra-ns
61b0: 20 36 34 40 20 36 34 2b 20 36 34 3e 66 20 73 74   64@ 64+ 64>f st
61c0: 61 74 2d 74 75 70 6c 65 20 74 6f 20 74 73 2d 72  at-tuple to ts-r
61d0: 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 20 73  ate.           s
61e0: 6c 61 63 6b 67 72 6f 77 20 36 34 40 20 36 34 3e  lackgrow 64@ 64>
61f0: 66 20 73 74 61 74 2d 74 75 70 6c 65 20 74 6f 20  f stat-tuple to 
6200: 74 73 2d 67 72 6f 77 0a 20 20 20 20 20 20 20 20  ts-grow.        
6210: 20 20 20 73 74 61 74 2b 20 29 20 3b 0a 0a 69 6e     stat+ ) ;..in
6220: 20 6e 65 74 32 6f 20 3a 20 73 65 74 2d 72 61 74   net2o : set-rat
6230: 65 20 28 20 72 61 74 65 20 64 65 6c 74 61 74 20  e ( rate deltat 
6240: 2d 2d 20 29 0a 20 20 20 20 72 61 74 65 28 20 2e  -- ).    rate( .
6250: 22 20 72 2f 64 3a 20 22 20 36 34 6f 76 65 72 20  " r/d: " 64over 
6260: 75 36 34 2e 20 36 34 64 75 70 20 75 36 34 2e 20  u64. 64dup u64. 
6270: 29 0a 20 20 20 20 72 61 74 65 2d 73 74 61 74 31  ).    rate-stat1
6280: 0a 20 20 20 20 36 34 3e 72 20 74 69 63 6b 2d 69  .    64>r tick-i
6290: 6e 69 74 20 31 2b 20 76 61 6c 69 64 61 74 65 64  nit 1+ validated
62a0: 20 40 20 76 61 6c 69 64 61 74 65 64 23 20 72 73   @ validated# rs
62b0: 68 69 66 74 20 31 20 6d 61 78 20 36 34 2a 2f 0a  hift 1 max 64*/.
62c0: 20 20 20 20 36 34 64 75 70 20 3e 65 78 74 72 61      64dup >extra
62d0: 2d 6e 73 20 6e 6f 65 6e 73 28 20 36 34 64 72 6f  -ns noens( 64dro
62e0: 70 20 29 65 6c 73 65 28 20 36 34 6e 69 70 20 29  p )else( 64nip )
62f0: 0a 20 20 20 20 36 34 72 3e 20 64 65 6c 74 61 2d  .    64r> delta-
6300: 74 2d 67 72 6f 77 23 20 36 34 2a 2f 20 36 34 6d  t-grow# 64*/ 64m
6310: 69 6e 20 28 20 6e 6f 20 6d 6f 72 65 20 74 68 61  in ( no more tha
6320: 6e 20 32 2a 64 65 6c 74 61 74 20 29 0a 20 20 20  n 2*deltat ).   
6330: 20 62 61 6e 64 77 69 64 74 68 2d 6d 61 78 20 6e   bandwidth-max n
6340: 3e 36 34 20 36 34 6d 61 78 0a 20 20 20 20 72 61  >64 64max.    ra
6350: 74 65 2d 6c 69 6d 69 74 20 20 72 61 74 65 2d 73  te-limit  rate-s
6360: 74 61 74 32 20 72 61 74 65 28 20 2e 22 20 72 61  tat2 rate( ." ra
6370: 74 65 3a 20 22 20 36 34 64 75 70 20 75 36 34 2e  te: " 64dup u64.
6380: 20 29 0a 20 20 20 20 6e 73 2f 62 75 72 73 74 20   ).    ns/burst 
6390: 36 34 21 40 20 62 61 6e 64 77 69 64 74 68 2d 69  64!@ bandwidth-i
63a0: 6e 69 74 20 6e 3e 36 34 20 36 34 3d 20 49 46 20  nit n>64 64= IF 
63b0: 5c 20 66 69 72 73 74 20 61 63 6b 6e 6f 77 6c 65  \ first acknowle
63c0: 64 67 65 0a 09 6e 65 74 32 6f 3a 73 65 74 2d 66  dge..net2o:set-f
63d0: 6c 79 62 75 72 73 74 0a 09 6e 65 74 32 6f 3a 6d  lyburst..net2o:m
63e0: 61 78 2d 66 6c 79 62 75 72 73 74 0a 20 20 20 20  ax-flyburst.    
63f0: 54 48 45 4e 20 72 61 74 65 28 20 63 72 20 29 20  THEN rate( cr ) 
6400: 3b 0a 0a 5c 20 61 63 6b 6e 6f 77 6c 65 64 67 65  ;..\ acknowledge
6410: 0a 0a 24 32 30 20 56 61 6c 75 65 20 6d 61 73 6b  ..$20 Value mask
6420: 2d 62 69 74 73 23 0a 3a 20 3e 6d 61 73 6b 30 20  -bits#.: >mask0 
6430: 28 20 61 64 64 72 20 6d 61 73 6b 20 2d 2d 20 61  ( addr mask -- a
6440: 64 64 72 27 20 6d 61 73 6b 27 20 29 0a 20 20 20  ddr' mask' ).   
6450: 20 42 45 47 49 4e 20 20 64 75 70 20 31 20 61 6e   BEGIN  dup 1 an
6460: 64 20 30 3d 20 57 48 49 4c 45 20 20 31 20 72 73  d 0= WHILE  1 rs
6470: 68 69 66 74 20 3e 72 20 6d 61 78 64 61 74 61 20  hift >r maxdata 
6480: 2b 20 72 3e 20 20 64 75 70 20 30 3d 20 55 4e 54  + r>  dup 0= UNT
6490: 49 4c 20 20 54 48 45 4e 20 3b 0a 3a 20 3e 6c 65  IL  THEN ;.: >le
64a0: 67 69 74 2d 62 61 63 6b 20 28 20 61 64 64 72 20  git-back ( addr 
64b0: 6d 61 73 6b 20 2d 2d 20 61 64 64 72 27 20 6d 61  mask -- addr' ma
64c0: 73 6b 27 20 29 0a 20 20 20 20 64 61 74 61 2d 6d  sk' ).    data-m
64d0: 61 70 20 2e 6d 61 70 63 3a 64 65 73 74 2d 62 61  ap .mapc:dest-ba
64e0: 63 6b 20 3e 72 0a 20 20 20 20 6f 76 65 72 20 72  ck >r.    over r
64f0: 40 20 5b 20 6d 61 78 64 61 74 61 20 24 32 30 20  @ [ maxdata $20 
6500: 2a 20 5d 4c 20 75 6d 61 78 20 5b 20 6d 61 78 64  * ]L umax [ maxd
6510: 61 74 61 20 24 32 30 20 2a 20 5d 4c 20 20 2d 20  ata $20 * ]L  - 
6520: 75 3c 0a 20 20 20 20 49 46 20 20 72 3e 20 32 64  u<.    IF  r> 2d
6530: 72 6f 70 20 30 20 20 45 58 49 54 20 20 54 48 45  rop 0  EXIT  THE
6540: 4e 0a 20 20 20 20 6f 76 65 72 20 72 40 20 75 3c  N.    over r@ u<
6550: 20 49 46 20 20 72 40 20 72 6f 74 20 2d 20 61 64   IF  r@ rot - ad
6560: 64 72 3e 62 69 74 73 20 72 73 68 69 66 74 20 72  dr>bits rshift r
6570: 3e 20 73 77 61 70 20 20 45 58 49 54 20 20 54 48  > swap  EXIT  TH
6580: 45 4e 0a 20 20 20 20 72 64 72 6f 70 20 3b 0a 3a  EN.    rdrop ;.:
6590: 20 3e 6c 65 67 69 74 2d 68 65 61 64 20 28 20 61   >legit-head ( a
65a0: 64 64 72 20 6d 61 73 6b 20 2d 2d 20 61 64 64 72  ddr mask -- addr
65b0: 27 20 6d 61 73 6b 27 20 29 0a 20 20 20 20 64 61  ' mask' ).    da
65c0: 74 61 2d 6d 61 70 20 2e 6d 61 70 63 3a 64 65 73  ta-map .mapc:des
65d0: 74 2d 68 65 61 64 20 3e 72 0a 20 20 20 20 6f 76  t-head >r.    ov
65e0: 65 72 20 72 40 20 75 3e 3d 0a 20 20 20 20 49 46  er r@ u>=.    IF
65f0: 20 20 72 3e 20 32 64 72 6f 70 20 30 20 20 45 58    r> 2drop 0  EX
6600: 49 54 20 20 54 48 45 4e 0a 20 20 20 20 6f 76 65  IT  THEN.    ove
6610: 72 20 5b 20 6d 61 78 64 61 74 61 20 24 32 30 20  r [ maxdata $20 
6620: 2a 20 5d 4c 20 2b 20 72 40 20 75 3e 0a 20 20 20  * ]L + r@ u>.   
6630: 20 49 46 20 20 6f 76 65 72 20 5b 20 6d 61 78 64   IF  over [ maxd
6640: 61 74 61 20 24 32 30 20 2a 20 5d 4c 20 2b 20 72  ata $20 * ]L + r
6650: 3e 20 2d 20 61 64 64 72 3e 62 69 74 73 20 2d 31  > - addr>bits -1
6660: 20 73 77 61 70 20 6c 73 68 69 66 74 0a 09 69 6e   swap lshift..in
6670: 76 65 72 74 20 61 6e 64 20 20 45 58 49 54 20 20  vert and  EXIT  
6680: 54 48 45 4e 0a 20 20 20 20 72 64 72 6f 70 20 3b  THEN.    rdrop ;
6690: 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 72 65 73 65  .in net2o : rese
66a0: 6e 64 2d 6d 61 73 6b 20 28 20 61 64 64 72 20 6d  nd-mask ( addr m
66b0: 61 73 6b 20 2d 2d 20 29 0a 20 20 20 20 3e 6c 65  ask -- ).    >le
66c0: 67 69 74 2d 62 61 63 6b 20 3e 6c 65 67 69 74 2d  git-back >legit-
66d0: 68 65 61 64 20 64 75 70 20 30 3d 20 49 46 20 20  head dup 0= IF  
66e0: 32 64 72 6f 70 20 20 45 58 49 54 20 20 54 48 45  2drop  EXIT  THE
66f0: 4e 0a 20 20 20 20 3e 6d 61 73 6b 30 0a 20 20 20  N.    >mask0.   
6700: 20 72 65 73 65 6e 64 28 20 2e 22 20 6d 61 73 6b   resend( ." mask
6710: 3a 20 22 20 68 65 78 5b 20 3e 72 20 64 75 70 20  : " hex[ >r dup 
6720: 75 2e 20 72 3e 20 64 75 70 20 75 2e 20 5d 68 65  u. r> dup u. ]he
6730: 78 20 63 72 20 29 0a 20 20 20 20 64 61 74 61 2d  x cr ).    data-
6740: 72 65 73 65 6e 64 20 24 40 20 62 6f 75 6e 64 73  resend $@ bounds
6750: 20 3f 44 4f 0a 09 6f 76 65 72 20 49 20 63 65 6c   ?DO..over I cel
6760: 6c 2b 20 40 20 73 77 61 70 20 64 75 70 20 6d 61  l+ @ swap dup ma
6770: 78 64 61 74 61 20 6d 61 73 6b 2d 62 69 74 73 23  xdata mask-bits#
6780: 20 2a 20 2b 20 77 69 74 68 69 6e 20 49 46 0a 09   * + within IF..
6790: 20 20 20 20 6f 76 65 72 20 49 20 32 40 20 72 6f      over I 2@ ro
67a0: 74 20 3e 72 0a 09 20 20 20 20 42 45 47 49 4e 20  t >r..    BEGIN 
67b0: 20 6f 76 65 72 20 72 40 20 75 3e 20 20 57 48 49   over r@ u>  WHI
67c0: 4c 45 20 20 32 2a 20 3e 72 20 6d 61 78 64 61 74  LE  2* >r maxdat
67d0: 61 20 2d 20 72 3e 20 20 52 45 50 45 41 54 0a 09  a - r>  REPEAT..
67e0: 20 20 20 20 72 64 72 6f 70 20 6e 69 70 20 6f 72      rdrop nip or
67f0: 20 3e 6d 61 73 6b 30 0a 09 20 20 20 20 72 65 73   >mask0..    res
6800: 65 6e 64 28 20 49 20 32 40 20 68 65 78 5b 20 2e  end( I 2@ hex[ .
6810: 22 20 72 65 70 6c 61 63 65 3a 20 22 20 73 77 61  " replace: " swa
6820: 70 20 2e 20 2e 20 2e 22 20 2d 3e 20 22 0a 09 20  p . . ." -> ".. 
6830: 20 20 20 3e 72 20 64 75 70 20 75 2e 20 72 3e 20     >r dup u. r> 
6840: 64 75 70 20 75 2e 20 63 72 20 5d 68 65 78 20 29  dup u. cr ]hex )
6850: 0a 09 20 20 20 20 49 20 32 21 20 20 55 4e 4c 4f  ..    I 2!  UNLO
6860: 4f 50 20 20 45 58 49 54 0a 09 54 48 45 4e 0a 20  OP  EXIT..THEN. 
6870: 20 20 20 32 20 63 65 6c 6c 73 20 2b 4c 4f 4f 50     2 cells +LOOP
6880: 20 7b 20 64 5e 20 6d 61 73 6b 2b 20 7d 20 6d 61   { d^ mask+ } ma
6890: 73 6b 2b 20 32 20 63 65 6c 6c 73 20 64 61 74 61  sk+ 2 cells data
68a0: 2d 72 65 73 65 6e 64 20 24 2b 21 20 3b 0a 69 6e  -resend $+! ;.in
68b0: 20 6e 65 74 32 6f 20 3a 20 61 63 6b 2d 72 65 73   net2o : ack-res
68c0: 65 6e 64 20 28 20 66 6c 61 67 20 2d 2d 20 29 20  end ( flag -- ) 
68d0: 20 72 65 73 65 6e 64 2d 74 6f 67 67 6c 65 23 20   resend-toggle# 
68e0: 61 6e 64 20 74 6f 20 61 63 6b 2d 72 65 73 65 6e  and to ack-resen
68f0: 64 7e 20 3b 0a 3a 20 72 65 73 65 6e 64 24 40 20  d~ ;.: resend$@ 
6900: 28 20 2d 2d 20 61 64 64 72 20 75 20 29 0a 20 20  ( -- addr u ).  
6910: 20 20 64 61 74 61 2d 72 65 73 65 6e 64 20 24 40    data-resend $@
6920: 20 20 49 46 0a 09 32 40 20 3e 6d 61 73 6b 30 20    IF..2@ >mask0 
6930: 31 20 61 6e 64 20 49 46 20 20 6d 61 78 64 61 74  1 and IF  maxdat
6940: 61 20 20 45 4c 53 45 20 20 30 20 20 54 48 45 4e  a  ELSE  0  THEN
6950: 0a 09 73 77 61 70 20 64 61 74 61 2d 6d 61 70 20  ..swap data-map 
6960: 3e 6f 20 6d 61 70 63 3a 64 65 73 74 2d 73 69 7a  >o mapc:dest-siz
6970: 65 20 31 2d 20 61 6e 64 20 6d 61 70 63 3a 64 65  e 1- and mapc:de
6980: 73 74 2d 72 61 64 64 72 20 2b 20 6f 3e 20 73 77  st-raddr + o> sw
6990: 61 70 0a 20 20 20 20 45 4c 53 45 20 20 64 72 6f  ap.    ELSE  dro
69a0: 70 20 30 20 30 20 20 54 48 45 4e 20 3b 0a 3a 20  p 0 0  THEN ;.: 
69b0: 72 65 73 65 6e 64 3f 20 28 20 2d 2d 20 66 6c 61  resend? ( -- fla
69c0: 67 20 29 0a 20 20 20 20 64 61 74 61 2d 72 65 73  g ).    data-res
69d0: 65 6e 64 20 24 40 20 20 49 46 0a 09 32 40 20 30  end $@  IF..2@ 0
69e0: 3c 3e 20 73 77 61 70 20 64 61 74 61 2d 6d 61 70  <> swap data-map
69f0: 20 2e 6d 61 70 63 3a 64 65 73 74 2d 68 65 61 64   .mapc:dest-head
6a00: 20 75 3c 20 61 6e 64 0a 20 20 20 20 45 4c 53 45   u< and.    ELSE
6a10: 20 20 64 72 6f 70 20 66 61 6c 73 65 20 20 54 48    drop false  TH
6a20: 45 4e 20 3b 0a 0a 3a 20 72 65 73 65 6e 64 2d 64  EN ;..: resend-d
6a30: 65 73 74 20 28 20 2d 2d 20 61 64 64 72 20 29 0a  est ( -- addr ).
6a40: 20 20 20 20 64 61 74 61 2d 72 65 73 65 6e 64 20      data-resend 
6a50: 24 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 40 0a  $@ drop cell+ @.
6a60: 20 20 20 20 64 61 74 61 2d 6d 61 70 20 77 69 74      data-map wit
6a70: 68 20 6d 61 70 63 20 64 65 73 74 2d 73 69 7a 65  h mapc dest-size
6a80: 20 31 2d 20 61 6e 64 20 6e 3e 36 34 20 64 65 73   1- and n>64 des
6a90: 74 2d 76 61 64 64 72 20 36 34 2b 20 65 6e 64 77  t-vaddr 64+ endw
6aa0: 69 74 68 20 3b 0a 3a 20 2f 72 65 73 65 6e 64 20  ith ;.: /resend 
6ab0: 28 20 75 20 2d 2d 20 29 0a 20 20 20 20 30 20 2b  ( u -- ).    0 +
6ac0: 44 4f 0a 09 64 61 74 61 2d 72 65 73 65 6e 64 20  DO..data-resend 
6ad0: 24 40 20 64 72 6f 70 0a 09 64 75 70 20 3e 72 20  $@ drop..dup >r 
6ae0: 32 40 20 2d 32 20 61 6e 64 20 3e 6d 61 73 6b 30  2@ -2 and >mask0
6af0: 20 74 75 63 6b 20 72 3e 20 32 21 0a 09 30 3d 20   tuck r> 2!..0= 
6b00: 49 46 20 20 64 61 74 61 2d 72 65 73 65 6e 64 20  IF  data-resend 
6b10: 30 20 32 20 63 65 6c 6c 73 20 24 64 65 6c 20 20  0 2 cells $del  
6b20: 54 48 45 4e 0a 20 20 20 20 6d 61 78 64 61 74 61  THEN.    maxdata
6b30: 20 2b 4c 4f 4f 50 20 3b 0a 0a 3a 20 64 61 74 61   +LOOP ;..: data
6b40: 2d 72 65 73 65 6e 64 2d 66 6c 75 73 68 20 28 20  -resend-flush ( 
6b50: 2d 2d 20 29 0a 20 20 20 20 64 61 74 61 2d 72 65  -- ).    data-re
6b60: 73 65 6e 64 20 24 40 6c 65 6e 20 30 20 55 2b 44  send $@len 0 U+D
6b70: 4f 0a 09 64 61 74 61 2d 72 65 73 65 6e 64 20 24  O..data-resend $
6b80: 40 20 49 20 2f 73 74 72 69 6e 67 20 64 72 6f 70  @ I /string drop
6b90: 20 40 20 30 3d 20 49 46 0a 09 20 20 20 20 64 61   @ 0= IF..    da
6ba0: 74 61 2d 72 65 73 65 6e 64 20 49 20 32 20 63 65  ta-resend I 2 ce
6bb0: 6c 6c 73 20 24 64 65 6c 0a 09 20 20 20 20 30 20  lls $del..    0 
6bc0: 20 64 61 74 61 2d 72 65 73 65 6e 64 20 24 40 6c   data-resend $@l
6bd0: 65 6e 20 49 20 75 6e 6c 6f 6f 70 20 55 2b 44 4f  en I unloop U+DO
6be0: 20 4e 4f 50 45 0a 09 45 4c 53 45 0a 09 20 20 20   NOPE..ELSE..   
6bf0: 20 5b 20 32 20 63 65 6c 6c 73 20 5d 4c 0a 09 54   [ 2 cells ]L..T
6c00: 48 45 4e 0a 20 20 20 20 2b 4c 4f 4f 50 20 3b 0a  HEN.    +LOOP ;.
6c10: 0a 3a 20 72 65 6d 6f 76 65 2d 72 65 73 65 6e 64  .: remove-resend
6c20: 20 7b 20 6e 62 61 63 6b 20 2d 2d 20 7d 0a 20 20   { nback -- }.  
6c30: 20 20 64 61 74 61 2d 72 65 73 65 6e 64 20 24 40    data-resend $@
6c40: 20 62 6f 75 6e 64 73 20 55 2b 44 4f 0a 09 49 20   bounds U+DO..I 
6c50: 63 65 6c 6c 2b 20 40 20 6e 62 61 63 6b 20 5b 20  cell+ @ nback [ 
6c60: 6d 61 78 64 61 74 61 20 24 32 30 20 2a 20 5d 4c  maxdata $20 * ]L
6c70: 20 75 6d 61 78 20 5b 20 6d 61 78 64 61 74 61 20   umax [ maxdata 
6c80: 24 32 30 20 2a 20 5d 4c 20 2d 0a 09 75 3c 20 49  $20 * ]L -..u< I
6c90: 46 20 20 49 20 6f 66 66 0a 09 45 4c 53 45 20 20  F  I off..ELSE  
6ca0: 49 20 63 65 6c 6c 2b 20 40 20 6e 62 61 63 6b 20  I cell+ @ nback 
6cb0: 75 3c 20 49 46 0a 09 09 6e 62 61 63 6b 20 64 75  u< IF...nback du
6cc0: 70 20 49 20 63 65 6c 6c 2b 20 21 40 20 2d 0a 09  p I cell+ !@ -..
6cd0: 09 61 64 64 72 3e 62 69 74 73 20 49 20 40 20 73  .addr>bits I @ s
6ce0: 77 61 70 20 72 73 68 69 66 74 20 49 20 21 0a 09  wap rshift I !..
6cf0: 20 20 20 20 54 48 45 4e 0a 09 54 48 45 4e 0a 20      THEN..THEN. 
6d00: 20 20 20 5b 20 32 20 63 65 6c 6c 73 20 5d 4c 20     [ 2 cells ]L 
6d10: 2b 4c 4f 4f 50 0a 20 20 20 20 64 61 74 61 2d 72  +LOOP.    data-r
6d20: 65 73 65 6e 64 2d 66 6c 75 73 68 20 3b 0a 0a 3a  esend-flush ;..:
6d30: 20 72 65 77 69 6e 64 2d 72 65 73 65 6e 64 20 28   rewind-resend (
6d40: 20 6f 62 61 63 6b 20 6e 62 61 63 6b 20 6f 3a 6d   oback nback o:m
6d50: 61 70 20 2d 2d 20 29 0a 20 20 20 20 70 61 72 65  ap -- ).    pare
6d60: 6e 74 20 2e 72 65 6d 6f 76 65 2d 72 65 73 65 6e  nt .remove-resen
6d70: 64 20 64 72 6f 70 20 3b 0a 0a 5c 20 72 65 73 65  d drop ;..\ rese
6d80: 6e 64 20 74 68 69 72 64 20 68 61 6e 64 73 68 61  nd third handsha
6d90: 6b 65 0a 0a 3a 20 70 75 73 68 2d 72 65 70 6c 79  ke..: push-reply
6da0: 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 20 20   ( addr u -- )  
6db0: 72 65 73 65 6e 64 30 20 24 21 20 20 72 65 74 75  resend0 $!  retu
6dc0: 72 6e 2d 61 64 64 72 20 72 30 2d 61 64 64 72 65  rn-addr r0-addre
6dd0: 73 73 20 24 31 30 20 6d 6f 76 65 20 3b 0a 0a 5c  ss $10 move ;..\
6de0: 20 6c 6f 61 64 20 63 72 79 70 74 6f 20 68 65 72   load crypto her
6df0: 65 0a 0a 72 65 71 75 69 72 65 20 63 72 79 70 74  e..require crypt
6e00: 2e 66 73 0a 0a 5c 20 66 69 6c 65 20 68 61 6e 64  .fs..\ file hand
6e10: 6c 69 6e 67 0a 0a 72 65 71 75 69 72 65 20 66 69  ling..require fi
6e20: 6c 65 2e 66 73 0a 0a 5c 20 68 65 6c 70 65 72 73  le.fs..\ helpers
6e30: 20 66 6f 72 20 61 64 64 72 65 73 73 65 73 0a 0a   for addresses..
6e40: 46 6f 72 77 61 72 64 20 3e 73 6f 63 6b 61 64 64  Forward >sockadd
6e50: 72 0a 46 6f 72 77 61 72 64 20 73 6f 63 6b 61 64  r.Forward sockad
6e60: 64 72 2b 72 65 74 75 72 6e 0a 0a 3a 20 2d 73 69  dr+return..: -si
6e70: 67 20 28 20 61 64 64 72 20 75 20 2d 2d 20 61 64  g ( addr u -- ad
6e80: 64 72 20 75 27 20 29 20 32 64 75 70 20 2b 20 31  dr u' ) 2dup + 1
6e90: 2d 20 63 40 20 32 2a 20 24 31 31 20 2b 20 2d 20  - c@ 2* $11 + - 
6ea0: 3b 0a 3a 20 6e 32 6f 61 64 64 72 73 20 28 20 78  ;.: n2oaddrs ( x
6eb0: 74 20 2d 2d 20 29 0a 20 20 20 20 6d 79 2d 61 64  t -- ).    my-ad
6ec0: 64 72 24 20 5b 3a 20 2d 73 69 67 20 73 6f 63 6b  dr$ [: -sig sock
6ed0: 61 64 64 72 2b 72 65 74 75 72 6e 20 72 6f 74 20  addr+return rot 
6ee0: 64 75 70 20 3e 72 20 65 78 65 63 75 74 65 20 72  dup >r execute r
6ef0: 3e 20 3b 5d 20 24 5b 5d 6d 61 70 20 64 72 6f 70  > ;] $[]map drop
6f00: 20 3b 0a 0a 5c 20 73 65 6e 64 20 62 6c 6f 63 6b   ;..\ send block
6f10: 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 0a 3a 20 3e  s of memory..: >
6f20: 64 65 73 74 20 28 20 61 64 64 72 20 2d 2d 20 29  dest ( addr -- )
6f30: 20 6f 75 74 62 75 66 20 64 65 73 74 69 6e 61 74   outbuf destinat
6f40: 69 6f 6e 20 24 31 30 20 6d 6f 76 65 20 3b 0a 3a  ion $10 move ;.:
6f50: 20 73 65 74 2d 64 65 73 74 20 28 20 74 61 72 67   set-dest ( targ
6f60: 65 74 20 2d 2d 20 29 0a 20 20 20 20 36 34 64 75  et -- ).    64du
6f70: 70 20 64 65 73 74 2d 61 64 64 72 20 36 34 21 20  p dest-addr 64! 
6f80: 20 6f 75 74 62 75 66 20 6d 61 70 61 64 64 72 20   outbuf mapaddr 
6f90: 6c 65 2d 36 34 21 20 3b 0a 3a 20 73 65 74 2d 64  le-64! ;.: set-d
6fa0: 65 73 74 23 20 28 20 72 65 73 65 6e 64 23 20 2d  est# ( resend# -
6fb0: 2d 20 29 0a 20 20 20 20 6e 3e 36 34 20 64 65 73  - ).    n>64 des
6fc0: 74 2d 61 64 64 72 20 36 34 2b 21 20 20 64 65 73  t-addr 64+!  des
6fd0: 74 2d 61 64 64 72 20 36 34 40 20 6f 75 74 62 75  t-addr 64@ outbu
6fe0: 66 20 6d 61 70 61 64 64 72 20 6c 65 2d 36 34 21  f mapaddr le-64!
6ff0: 20 3b 0a 0a 55 73 65 72 20 6f 75 74 66 6c 61 67   ;..User outflag
7000: 20 20 6f 75 74 66 6c 61 67 20 6f 66 66 0a 0a 3a    outflag off..:
7010: 20 73 65 74 2d 66 6c 61 67 73 20 28 20 2d 2d 20   set-flags ( -- 
7020: 29 0a 20 20 20 20 30 20 6f 75 74 66 6c 61 67 20  ).    0 outflag 
7030: 21 40 20 6f 75 74 62 75 66 20 68 64 72 74 61 67  !@ outbuf hdrtag
7040: 73 20 63 21 0a 20 20 20 20 6f 75 74 62 75 66 20  s c!.    outbuf 
7050: 68 64 72 66 6c 61 67 73 20 6c 65 2d 75 77 40 20  hdrflags le-uw@ 
7060: 64 65 73 74 2d 66 6c 61 67 73 20 6c 65 2d 77 21  dest-flags le-w!
7070: 20 3b 0a 0a 23 39 30 20 43 6f 6e 73 74 61 6e 74   ;..#90 Constant
7080: 20 45 4d 53 47 53 49 5a 45 0a 0a 3a 20 3f 6d 73   EMSGSIZE..: ?ms
7090: 67 73 69 7a 65 20 28 20 69 6f 72 20 2d 2d 20 29  gsize ( ior -- )
70a0: 0a 20 20 20 20 30 3c 20 49 46 0a 09 65 72 72 6e  .    0< IF..errn
70b0: 6f 20 45 4d 53 47 53 49 5a 45 20 3c 3e 20 3f 69  o EMSGSIZE <> ?i
70c0: 6f 72 0a 09 6d 61 78 2d 73 69 7a 65 5e 32 20 31  or..max-size^2 1
70d0: 2d 20 74 6f 20 6d 61 78 2d 73 69 7a 65 5e 32 20  - to max-size^2 
70e0: 20 2e 22 20 70 6d 74 75 2f 32 22 20 63 72 0a 20   ." pmtu/2" cr. 
70f0: 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 70 61 63     THEN ;..: pac
7100: 6b 65 74 2d 74 6f 20 28 20 2d 2d 20 29 0a 20 20  ket-to ( -- ).  
7110: 20 20 6f 75 74 2d 72 6f 75 74 65 20 20 6f 75 74    out-route  out
7120: 62 75 66 20 64 75 70 20 70 61 63 6b 65 74 2d 73  buf dup packet-s
7130: 69 7a 65 0a 20 20 20 20 73 65 6e 64 2d 61 2d 70  ize.    send-a-p
7140: 61 63 6b 65 74 20 3f 6d 73 67 73 69 7a 65 20 3b  acket ?msgsize ;
7150: 0a 0a 3a 20 73 65 6e 64 2d 63 6f 64 65 2d 70 61  ..: send-code-pa
7160: 63 6b 65 74 20 28 20 2d 2d 20 29 20 2b 73 65 6e  cket ( -- ) +sen
7170: 64 58 0a 20 20 20 20 68 65 61 64 65 72 28 20 2e  dX.    header( .
7180: 22 20 73 65 6e 64 20 63 6f 64 65 20 22 20 6f 75  " send code " ou
7190: 74 62 75 66 20 2e 68 65 61 64 65 72 20 29 0a 20  tbuf .header ). 
71a0: 20 20 20 6f 75 74 62 75 66 20 68 64 72 74 61 67     outbuf hdrtag
71b0: 73 20 63 40 20 73 74 61 74 65 6c 65 73 73 23 20  s c@ stateless# 
71c0: 61 6e 64 20 49 46 0a 09 6f 75 74 62 75 66 30 2d  and IF..outbuf0-
71d0: 65 6e 63 72 79 70 74 0a 09 63 6d 64 30 28 20 2e  encrypt..cmd0( .
71e0: 74 69 6d 65 20 2e 22 20 63 6d 64 30 20 74 6f 3a  time ." cmd0 to:
71f0: 20 22 20 72 65 74 2d 61 64 64 72 20 2e 61 64 64   " ret-addr .add
7200: 72 2d 70 61 74 68 20 63 72 20 29 0a 20 20 20 20  r-path cr ).    
7210: 45 4c 53 45 0a 09 63 6f 64 65 2d 6d 61 70 20 6f  ELSE..code-map o
7220: 75 74 62 75 66 2d 65 6e 63 72 79 70 74 0a 20 20  utbuf-encrypt.  
7230: 20 20 54 48 45 4e 20 20 20 72 65 74 2d 61 64 64    THEN   ret-add
7240: 72 20 3e 64 65 73 74 20 70 61 63 6b 65 74 2d 74  r >dest packet-t
7250: 6f 20 3b 0a 0a 3a 20 73 65 6e 64 2d 64 61 74 61  o ;..: send-data
7260: 2d 70 61 63 6b 65 74 20 28 20 2d 2d 20 29 20 2b  -packet ( -- ) +
7270: 73 65 6e 64 58 0a 20 20 20 20 68 65 61 64 65 72  sendX.    header
7280: 28 20 2e 22 20 73 65 6e 64 20 64 61 74 61 20 22  ( ." send data "
7290: 20 6f 75 74 62 75 66 20 2e 68 65 61 64 65 72 20   outbuf .header 
72a0: 29 0a 20 20 20 20 64 61 74 61 2d 6d 61 70 20 20  ).    data-map  
72b0: 6f 75 74 62 75 66 2d 65 6e 63 72 79 70 74 0a 20  outbuf-encrypt. 
72c0: 20 20 20 72 65 74 2d 61 64 64 72 20 3e 64 65 73     ret-addr >des
72d0: 74 20 70 61 63 6b 65 74 2d 74 6f 20 3b 0a 0a 3a  t packet-to ;..:
72e0: 20 3e 73 65 6e 64 20 28 20 61 64 64 72 20 6e 20   >send ( addr n 
72f0: 2d 2d 20 29 0a 20 20 20 20 3e 72 20 20 72 40 20  -- ).    >r  r@ 
7300: 5b 20 36 34 62 69 74 23 20 71 6f 73 33 23 20 6f  [ 64bit# qos3# o
7310: 72 20 5d 4c 20 6f 72 20 6f 75 74 62 75 66 20 63  r ]L or outbuf c
7320: 21 20 20 73 65 74 2d 66 6c 61 67 73 0a 20 20 20  !  set-flags.   
7330: 20 6f 75 74 62 75 66 20 70 61 63 6b 65 74 2d 62   outbuf packet-b
7340: 6f 64 79 20 6d 69 6e 2d 73 69 7a 65 20 72 3e 20  ody min-size r> 
7350: 6c 73 68 69 66 74 20 6d 6f 76 65 20 3b 0a 0a 3a  lshift move ;..:
7360: 20 62 61 6e 64 77 69 64 74 68 2b 20 28 20 2d 2d   bandwidth+ ( --
7370: 20 29 0a 20 20 20 20 6e 73 2f 62 75 72 73 74 20   ).    ns/burst 
7380: 36 34 40 20 31 20 74 69 63 6b 2d 69 6e 69 74 20  64@ 1 tick-init 
7390: 31 2b 20 36 34 2a 2f 20 62 61 6e 64 77 69 64 74  1+ 64*/ bandwidt
73a0: 68 2d 74 69 63 6b 20 36 34 2b 21 20 3b 0a 0a 3a  h-tick 64+! ;..:
73b0: 20 62 75 72 73 74 2d 65 6e 64 20 28 20 66 6c 61   burst-end ( fla
73c0: 67 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 20 20  g -- flag ).    
73d0: 74 69 63 6b 65 72 20 36 34 40 20 62 61 6e 64 77  ticker 64@ bandw
73e0: 69 64 74 68 2d 74 69 63 6b 20 36 34 40 20 36 34  idth-tick 64@ 64
73f0: 6d 61 78 20 6e 65 78 74 2d 74 69 63 6b 20 36 34  max next-tick 64
7400: 21 20 64 72 6f 70 20 66 61 6c 73 65 20 3b 0a 0a  ! drop false ;..
7410: 3a 20 73 65 6e 64 2d 63 58 20 28 20 61 64 64 72  : send-cX ( addr
7420: 20 6e 20 2d 2d 20 29 20 2b 73 65 6e 64 58 32 20   n -- ) +sendX2 
7430: 20 3e 73 65 6e 64 20 20 73 65 6e 64 2d 63 6f 64   >send  send-cod
7440: 65 2d 70 61 63 6b 65 74 20 3b 0a 0a 5c 20 21 21  e-packet ;..\ !!
7450: 46 49 58 4d 45 21 21 20 75 73 65 20 66 66 7a 3e  FIXME!! use ffz>
7460: 2c 20 62 72 61 6e 63 68 6c 65 73 73 20 77 69 74  , branchless wit
7470: 68 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  h floating point
7480: 0a 0a 3a 20 36 34 66 66 7a 3c 20 28 20 36 34 62  ..: 64ffz< ( 64b
7490: 20 2d 2d 20 75 20 2f 20 2d 31 20 29 0a 20 20 20   -- u / -1 ).   
74a0: 20 5c 47 20 66 69 6e 64 20 66 69 72 73 74 20 7a   \G find first z
74b0: 65 72 6f 20 66 72 6f 6d 20 74 68 65 20 72 69 67  ero from the rig
74c0: 68 74 2c 20 75 20 69 73 20 62 69 74 20 70 6f 73  ht, u is bit pos
74d0: 69 74 69 6f 6e 0a 20 20 20 20 36 34 20 30 20 44  ition.    64 0 D
74e0: 4f 0a 09 36 34 64 75 70 20 36 34 3e 6e 20 31 20  O..64dup 64>n 1 
74f0: 61 6e 64 20 30 3d 20 49 46 20 20 36 34 64 72 6f  and 0= IF  64dro
7500: 70 20 49 20 75 6e 6c 6f 6f 70 20 20 45 58 49 54  p I unloop  EXIT
7510: 20 20 54 48 45 4e 0a 09 36 34 2d 32 2f 0a 20 20    THEN..64-2/.  
7520: 20 20 4c 4f 4f 50 20 36 34 64 72 6f 70 20 24 34    LOOP 64drop $4
7530: 30 20 3b 0a 0a 73 63 6f 70 65 7b 20 6d 61 70 63  0 ;..scope{ mapc
7540: 0a 0a 3a 20 72 65 73 65 6e 64 23 2b 20 28 20 61  ..: resend#+ ( a
7550: 64 64 72 20 2d 2d 20 6e 20 29 0a 20 20 20 20 64  ddr -- n ).    d
7560: 65 73 74 2d 72 61 64 64 72 20 2d 20 61 64 64 72  est-raddr - addr
7570: 3e 36 34 20 64 61 74 61 2d 72 65 73 65 6e 64 23  >64 data-resend#
7580: 20 40 20 2b 20 7b 20 61 64 64 72 20 7d 0a 20 20   @ + { addr }.  
7590: 20 20 72 6e 67 38 20 24 33 46 20 61 6e 64 20 7b    rng8 $3F and {
75a0: 20 72 20 7d 0a 20 20 20 20 61 64 64 72 20 6c 65   r }.    addr le
75b0: 2d 36 34 40 20 72 20 36 34 72 6f 72 20 36 34 66  -64@ r 64ror 64f
75c0: 66 7a 3c 20 72 20 2b 20 24 33 46 20 61 6e 64 20  fz< r + $3F and 
75d0: 74 6f 20 72 0a 20 20 20 20 36 34 23 31 20 72 20  to r.    64#1 r 
75e0: 36 34 6c 73 68 69 66 74 20 61 64 64 72 20 6c 65  64lshift addr le
75f0: 2d 36 34 40 20 36 34 6f 72 0a 20 20 20 20 5c 20  -64@ 64or.    \ 
7600: 74 69 6d 65 6f 75 74 28 20 2e 22 20 72 65 73 65  timeout( ." rese
7610: 6e 64 23 3a 20 22 20 61 64 64 72 20 64 61 74 61  nd#: " addr data
7620: 2d 72 65 73 65 6e 64 23 20 40 20 64 75 70 20 68  -resend# @ dup h
7630: 65 78 2e 20 2d 20 68 65 78 2e 20 36 34 64 75 70  ex. - hex. 64dup
7640: 20 78 36 34 2e 20 63 72 20 29 0a 20 20 20 20 61   x64. cr ).    a
7650: 64 64 72 20 6c 65 2d 36 34 21 20 0a 20 20 20 20  ddr le-64! .    
7660: 72 20 3b 0a 0a 3a 20 72 65 73 65 6e 64 23 3f 20  r ;..: resend#? 
7670: 28 20 6f 66 66 20 61 64 64 72 20 75 20 2d 2d 20  ( off addr u -- 
7680: 6e 20 29 0a 20 20 20 20 30 20 72 6f 74 20 32 73  n ).    0 rot 2s
7690: 77 61 70 20 5c 20 63 6f 75 6e 74 20 61 64 64 72  wap \ count addr
76a0: 20 6f 66 66 20 75 0a 20 20 20 20 62 6f 75 6e 64   off u.    bound
76b0: 73 20 64 65 73 74 2d 73 69 7a 65 20 61 64 64 72  s dest-size addr
76c0: 3e 62 69 74 73 20 74 75 63 6b 20 75 6d 69 6e 20  >bits tuck umin 
76d0: 3e 72 20 75 6d 69 6e 20 72 3e 20 5c 20 6c 69 6d  >r umin r> \ lim
76e0: 69 74 73 0a 20 20 20 20 36 34 73 20 64 61 74 61  its.    64s data
76f0: 2d 72 65 73 65 6e 64 23 20 40 20 2b 20 73 77 61  -resend# @ + swa
7700: 70 0a 20 20 20 20 36 34 73 20 64 61 74 61 2d 72  p.    64s data-r
7710: 65 73 65 6e 64 23 20 40 20 2b 20 73 77 61 70 20  esend# @ + swap 
7720: 3f 44 4f 0a 09 64 75 70 20 63 40 20 24 34 30 20  ?DO..dup c@ $40 
7730: 75 3c 20 49 46 0a 09 20 20 20 20 64 75 70 20 63  u< IF..    dup c
7740: 40 20 3e 72 20 36 34 23 31 20 72 3e 20 36 34 6c  @ >r 64#1 r> 64l
7750: 73 68 69 66 74 0a 09 20 20 20 20 49 20 6c 65 2d  shift..    I le-
7760: 36 34 40 0a 09 20 20 20 20 5c 20 36 34 6f 76 65  64@..    \ 64ove
7770: 72 20 36 34 69 6e 76 65 72 74 20 36 34 6f 76 65  r 64invert 64ove
7780: 72 20 36 34 61 6e 64 20 49 20 6c 65 2d 36 34 21  r 64and I le-64!
7790: 20 5c 20 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65   \ ack only once
77a0: 21 0a 09 20 20 20 20 36 34 61 6e 64 20 36 34 2d  !..    64and 64-
77b0: 30 3d 20 49 46 20 5c 20 63 68 65 63 6b 20 69 66  0= IF \ check if
77c0: 20 68 61 64 20 62 65 65 6e 20 7a 65 72 6f 20 61   had been zero a
77d0: 6c 72 65 61 64 79 0a 09 09 74 69 6d 65 6f 75 74  lready...timeout
77e0: 28 20 2e 22 20 72 65 73 65 6e 64 23 20 75 6e 6d  ( ." resend# unm
77f0: 61 74 63 68 3a 20 22 0a 09 09 49 20 64 61 74 61  atch: "...I data
7800: 2d 72 65 73 65 6e 64 23 20 40 20 64 75 70 20 68  -resend# @ dup h
7810: 65 78 2e 20 2d 20 68 65 78 2e 0a 09 09 64 75 70  ex. - hex....dup
7820: 20 63 40 20 68 65 78 2e 20 49 20 6c 65 2d 36 34   c@ hex. I le-64
7830: 40 20 78 36 34 2e 20 63 72 20 29 0a 09 09 32 64  @ x64. cr )...2d
7840: 72 6f 70 20 30 20 55 4e 4c 4f 4f 50 20 20 45 58  rop 0 UNLOOP  EX
7850: 49 54 0a 09 20 20 20 20 54 48 45 4e 20 20 73 77  IT..    THEN  sw
7860: 61 70 20 31 2b 20 73 77 61 70 0a 09 54 48 45 4e  ap 1+ swap..THEN
7870: 20 20 31 2b 0a 20 20 20 20 38 20 2b 4c 4f 4f 50    1+.    8 +LOOP
7880: 20 20 64 72 6f 70 20 3b 0a 0a 7d 73 63 6f 70 65    drop ;..}scope
7890: 0a 0a 3a 20 73 65 6e 64 2d 64 58 20 28 20 61 64  ..: send-dX ( ad
78a0: 64 72 20 6e 20 2d 2d 20 29 20 2b 73 65 6e 64 58  dr n -- ) +sendX
78b0: 32 0a 20 20 20 20 6f 76 65 72 20 64 61 74 61 2d  2.    over data-
78c0: 6d 61 70 20 2e 6d 61 70 63 3a 72 65 73 65 6e 64  map .mapc:resend
78d0: 23 2b 20 73 65 74 2d 64 65 73 74 23 0a 20 20 20  #+ set-dest#.   
78e0: 20 3e 73 65 6e 64 20 20 61 63 6b 40 20 2e 62 61   >send  ack@ .ba
78f0: 6e 64 77 69 64 74 68 2b 20 20 73 65 6e 64 2d 64  ndwidth+  send-d
7900: 61 74 61 2d 70 61 63 6b 65 74 20 3b 0a 0a 44 65  ata-packet ;..De
7910: 66 65 72 20 61 64 64 72 3e 73 6f 63 6b 20 5c 20  fer addr>sock \ 
7920: 75 73 65 73 20 6c 6f 63 61 6c 73 0a 46 6f 72 77  uses locals.Forw
7930: 61 72 64 20 70 75 6e 63 68 2d 72 65 70 6c 79 0a  ard punch-reply.
7940: 46 6f 72 77 61 72 64 20 6e 65 77 2d 61 64 64 72  Forward new-addr
7950: 0a 0a 3a 20 73 65 6e 64 2d 70 75 6e 63 68 20 28  ..: send-punch (
7960: 20 61 64 64 72 20 75 20 2d 2d 20 61 64 64 72 20   addr u -- addr 
7970: 75 20 29 0a 20 20 20 20 63 68 65 63 6b 2d 61 64  u ).    check-ad
7980: 64 72 31 20 30 3d 20 49 46 20 20 32 64 72 6f 70  dr1 0= IF  2drop
7990: 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20    EXIT  THEN.   
79a0: 20 74 65 6d 70 2d 61 64 64 72 20 72 65 74 2d 61   temp-addr ret-a
79b0: 64 64 72 20 24 31 30 20 6d 6f 76 65 0a 20 20 20  ddr $10 move.   
79c0: 20 69 6e 73 65 72 74 2d 61 64 64 72 65 73 73 20   insert-address 
79d0: 72 65 74 2d 61 64 64 72 20 69 6e 73 2d 64 65 73  ret-addr ins-des
79e0: 74 0a 20 20 20 20 6e 61 74 28 20 74 69 63 6b 73  t.    nat( ticks
79f0: 20 2e 74 69 63 6b 73 20 2e 22 20 20 73 65 6e 64   .ticks ."  send
7a00: 20 70 75 6e 63 68 20 74 6f 3a 20 22 20 72 65 74   punch to: " ret
7a10: 2d 61 64 64 72 20 2e 61 64 64 72 2d 70 61 74 68  -addr .addr-path
7a20: 20 63 72 20 29 0a 20 20 20 20 32 64 75 70 20 73   cr ).    2dup s
7a30: 65 6e 64 2d 63 58 20 3b 0a 0a 69 6e 20 6e 65 74  end-cX ;..in net
7a40: 32 6f 20 3a 20 70 75 6e 63 68 20 28 20 61 64 64  2o : punch ( add
7a50: 72 20 75 20 6f 3a 63 6f 6e 6e 65 63 74 69 6f 6e  r u o:connection
7a60: 20 2d 2d 20 29 0a 20 20 20 20 6f 20 49 46 0a 09   -- ).    o IF..
7a70: 6e 65 77 2d 61 64 64 72 20 70 75 6e 63 68 2d 61  new-addr punch-a
7a80: 64 64 72 73 20 3e 73 74 61 63 6b 0a 20 20 20 20  ddrs >stack.    
7a90: 45 4c 53 45 20 20 32 64 72 6f 70 20 20 54 48 45  ELSE  2drop  THE
7aa0: 4e 20 3b 0a 0a 3a 20 70 75 6e 63 68 2d 77 72 61  N ;..: punch-wra
7ab0: 70 20 28 20 78 74 20 2d 2d 20 29 0a 20 20 20 20  p ( xt -- ).    
7ac0: 72 65 74 75 72 6e 2d 61 64 64 72 65 73 73 20 24  return-address $
7ad0: 31 30 20 24 6d 61 6b 65 20 7b 20 77 5e 20 72 65  10 $make { w^ re
7ae0: 74 20 7d 20 63 61 74 63 68 0a 20 20 20 20 72 65  t } catch.    re
7af0: 74 20 24 40 20 72 65 74 75 72 6e 2d 61 64 64 72  t $@ return-addr
7b00: 65 73 73 20 24 31 30 20 73 6d 6f 76 65 0a 20 20  ess $10 smove.  
7b10: 20 20 72 65 74 20 24 66 72 65 65 20 74 68 72 6f    ret $free thro
7b20: 77 20 3b 0a 0a 3a 20 70 69 6e 67 73 20 28 20 6f  w ;..: pings ( o
7b30: 3a 63 6f 6e 6e 65 63 74 69 6f 6e 20 2d 2d 20 29  :connection -- )
7b40: 0a 20 20 20 20 5c 47 20 70 69 6e 67 20 61 6c 6c  .    \G ping all
7b50: 20 61 64 64 72 65 73 73 65 73 20 28 77 68 79 20   addresses (why 
7b60: 65 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74  except the first
7b70: 20 6f 6e 65 3f 29 0a 20 20 20 20 5b 3a 20 70 75   one?).    [: pu
7b80: 6e 63 68 2d 61 64 64 72 73 20 24 40 20 62 6f 75  nch-addrs $@ bou
7b90: 6e 64 73 20 3f 44 4f 0a 09 20 20 20 20 49 20 40  nds ?DO..    I @
7ba0: 20 5b 27 5d 20 70 69 6e 67 2d 61 64 64 72 31 20   ['] ping-addr1 
7bb0: 61 64 64 72 3e 73 6f 63 6b 0a 09 63 65 6c 6c 20  addr>sock..cell 
7bc0: 2b 4c 4f 4f 50 20 3b 5d 20 70 75 6e 63 68 2d 77  +LOOP ;] punch-w
7bd0: 72 61 70 20 3b 0a 0a 3a 20 70 75 6e 63 68 73 20  rap ;..: punchs 
7be0: 28 20 61 64 64 72 20 75 20 6f 3a 63 6f 6e 6e 65  ( addr u o:conne
7bf0: 63 74 69 6f 6e 20 2d 2d 20 29 0a 20 20 20 20 5c  ction -- ).    \
7c00: 47 20 73 65 6e 64 20 61 20 72 65 70 6c 79 20 74  G send a reply t
7c10: 6f 20 61 6c 6c 20 61 64 64 72 65 73 73 65 73 0a  o all addresses.
7c20: 20 20 20 20 5b 3a 20 70 75 6e 63 68 2d 61 64 64      [: punch-add
7c30: 72 73 20 24 40 20 62 6f 75 6e 64 73 20 3f 44 4f  rs $@ bounds ?DO
7c40: 0a 09 20 20 20 20 49 20 40 20 5b 27 5d 20 73 65  ..    I @ ['] se
7c50: 6e 64 2d 70 75 6e 63 68 20 61 64 64 72 3e 73 6f  nd-punch addr>so
7c60: 63 6b 0a 09 63 65 6c 6c 20 2b 4c 4f 4f 50 20 3b  ck..cell +LOOP ;
7c70: 5d 20 70 75 6e 63 68 2d 77 72 61 70 20 32 64 72  ] punch-wrap 2dr
7c80: 6f 70 20 3b 0a 0a 5c 20 73 65 6e 64 20 63 68 75  op ;..\ send chu
7c90: 6e 6b 0a 0a 5c 20 62 72 61 6e 63 68 6c 65 73 73  nk..\ branchless
7ca0: 20 76 65 72 73 69 6f 6e 20 75 73 69 6e 67 20 66   version using f
7cb0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 0a 3a  loating point..:
7cc0: 20 73 65 6e 64 2d 73 69 7a 65 20 28 20 75 20 2d   send-size ( u -
7cd0: 2d 20 6e 20 29 0a 20 20 20 20 6d 69 6e 2d 73 69  - n ).    min-si
7ce0: 7a 65 20 75 6d 61 78 20 6d 61 78 64 61 74 61 20  ze umax maxdata 
7cf0: 75 6d 69 6e 20 31 2d 0a 20 20 20 20 5b 20 6d 69  umin 1-.    [ mi
7d00: 6e 2d 73 69 7a 65 20 32 2f 20 32 2f 20 73 3e 66  n-size 2/ 2/ s>f
7d10: 20 31 2f 66 20 5d 20 46 4c 69 74 65 72 61 6c 20   1/f ] FLiteral 
7d20: 66 6d 2a 0a 20 20 20 20 7b 20 66 5e 20 3c 73 69  fm*.    { f^ <si
7d30: 7a 65 2d 6c 62 3e 20 7d 20 20 3c 73 69 7a 65 2d  ze-lb> }  <size-
7d40: 6c 62 3e 20 36 20 2b 20 63 40 20 34 20 72 73 68  lb> 6 + c@ 4 rsh
7d50: 69 66 74 20 3b 0a 0a 36 34 56 61 72 69 61 62 6c  ift ;..64Variabl
7d60: 65 20 6c 61 73 74 2d 74 69 63 6b 73 0a 0a 73 63  e last-ticks..sc
7d70: 6f 70 65 7b 20 6d 61 70 63 0a 0a 3a 20 74 73 2d  ope{ mapc..: ts-
7d80: 74 69 63 6b 73 21 20 28 20 61 64 64 72 20 2d 2d  ticks! ( addr --
7d90: 20 29 0a 20 20 20 20 61 64 64 72 3e 74 73 20 64   ).    addr>ts d
7da0: 65 73 74 2d 74 69 6d 65 73 74 61 6d 70 73 20 2b  est-timestamps +
7db0: 20 3e 72 20 6c 61 73 74 2d 74 69 63 6b 73 20 36   >r last-ticks 6
7dc0: 34 40 20 72 3e 0a 20 20 20 20 64 75 70 20 36 34  4@ r>.    dup 64
7dd0: 40 20 36 34 2d 30 3d 20 49 46 20 20 36 34 21 20  @ 64-0= IF  64! 
7de0: 20 45 58 49 54 20 20 54 48 45 4e 20 20 36 34 6f   EXIT  THEN  64o
7df0: 6e 20 36 34 64 72 6f 70 20 31 20 70 61 63 6b 65  n 64drop 1 packe
7e00: 74 73 32 20 2b 21 20 3b 0a 5c 20 73 65 74 20 64  ts2 +! ;.\ set d
7e10: 6f 75 62 6c 65 2d 75 73 65 64 20 74 69 63 6b 73  ouble-used ticks
7e20: 20 74 6f 20 2d 31 20 74 6f 20 69 6e 64 69 63 61   to -1 to indica
7e30: 74 65 20 75 6e 6b 6f 77 6e 20 74 69 6d 69 6e 67  te unkown timing
7e40: 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 0a 0a 7d   relationship..}
7e50: 73 63 6f 70 65 0a 0a 69 6e 20 6e 65 74 32 6f 20  scope..in net2o 
7e60: 3a 20 73 65 6e 64 2d 74 69 63 6b 20 28 20 61 64  : send-tick ( ad
7e70: 64 72 20 2d 2d 20 29 0a 20 20 20 20 64 61 74 61  dr -- ).    data
7e80: 2d 6d 61 70 20 77 69 74 68 20 6d 61 70 63 0a 20  -map with mapc. 
7e90: 20 20 20 64 65 73 74 2d 72 61 64 64 72 20 2d 20     dest-raddr - 
7ea0: 64 75 70 20 64 65 73 74 2d 73 69 7a 65 20 75 3c  dup dest-size u<
7eb0: 0a 20 20 20 20 49 46 20 20 74 73 2d 74 69 63 6b  .    IF  ts-tick
7ec0: 73 21 20 20 45 4c 53 45 20 20 64 72 6f 70 20 20  s!  ELSE  drop  
7ed0: 54 48 45 4e 20 20 65 6e 64 77 69 74 68 20 3b 0a  THEN  endwith ;.
7ee0: 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 70 72 65 70  .in net2o : prep
7ef0: 2d 73 65 6e 64 20 28 20 61 64 64 72 20 75 20 64  -send ( addr u d
7f00: 65 73 74 20 2d 2d 20 61 64 64 72 20 6e 20 6c 65  est -- addr n le
7f10: 6e 20 29 0a 20 20 20 20 73 65 74 2d 64 65 73 74  n ).    set-dest
7f20: 20 20 6f 76 65 72 20 20 6e 65 74 32 6f 3a 73 65    over  net2o:se
7f30: 6e 64 2d 74 69 63 6b 0a 20 20 20 20 73 65 6e 64  nd-tick.    send
7f40: 2d 73 69 7a 65 20 6d 69 6e 2d 73 69 7a 65 20 6f  -size min-size o
7f50: 76 65 72 20 6c 73 68 69 66 74 20 3b 0a 0a 5c 20  ver lshift ;..\ 
7f60: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 6e 64  synchronous send
7f70: 69 6e 67 0a 0a 3a 20 64 61 74 61 2d 74 6f 2d 73  ing..: data-to-s
7f80: 65 6e 64 3f 20 28 20 2d 2d 20 66 6c 61 67 20 29  end? ( -- flag )
7f90: 0a 20 20 20 20 72 65 73 65 6e 64 3f 20 64 61 74  .    resend? dat
7fa0: 61 2d 74 61 69 6c 3f 20 6f 72 20 3b 0a 0a 69 6e  a-tail? or ;..in
7fb0: 20 6e 65 74 32 6f 20 3a 20 72 65 73 65 6e 64 20   net2o : resend 
7fc0: 28 20 2d 2d 20 61 64 64 72 20 6e 20 29 0a 20 20  ( -- addr n ).  
7fd0: 20 20 72 65 73 65 6e 64 24 40 20 72 65 73 65 6e    resend$@ resen
7fe0: 64 2d 64 65 73 74 20 6e 65 74 32 6f 3a 70 72 65  d-dest net2o:pre
7ff0: 70 2d 73 65 6e 64 20 2f 72 65 73 65 6e 64 20 3b  p-send /resend ;
8000: 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 73 65 6e  ..in net2o : sen
8010: 64 20 28 20 2d 2d 20 61 64 64 72 20 6e 20 29 0a  d ( -- addr n ).
8020: 20 20 20 20 64 61 74 61 2d 74 61 69 6c 40 20 64      data-tail@ d
8030: 61 74 61 2d 64 65 73 74 20 6e 65 74 32 6f 3a 70  ata-dest net2o:p
8040: 72 65 70 2d 73 65 6e 64 20 2f 74 61 69 6c 20 3b  rep-send /tail ;
8050: 0a 0a 3a 20 3f 74 6f 67 67 6c 65 2d 61 63 6b 20  ..: ?toggle-ack 
8060: 28 20 2d 2d 20 29 0a 20 20 20 20 64 61 74 61 2d  ( -- ).    data-
8070: 74 6f 2d 73 65 6e 64 3f 20 30 3d 20 49 46 0a 09  to-send? 0= IF..
8080: 5b 20 72 65 73 65 6e 64 2d 74 6f 67 67 6c 65 23  [ resend-toggle#
8090: 20 61 63 6b 2d 74 6f 67 67 6c 65 23 20 6f 72 20   ack-toggle# or 
80a0: 5d 4c 20 6f 75 74 66 6c 61 67 20 78 6f 72 21 0a  ]L outflag xor!.
80b0: 09 6e 65 76 65 72 20 61 63 6b 40 20 2e 6e 65 78  .never ack@ .nex
80c0: 74 2d 74 69 63 6b 20 36 34 21 0a 20 20 20 20 54  t-tick 64!.    T
80d0: 48 45 4e 20 3b 0a 0a 69 6e 20 6e 65 74 32 6f 20  HEN ;..in net2o 
80e0: 3a 20 73 65 6e 64 2d 63 68 75 6e 6b 20 28 20 2d  : send-chunk ( -
80f0: 2d 20 29 20 20 2b 63 68 75 6e 6b 0a 20 20 20 20  - )  +chunk.    
8100: 61 63 6b 2d 73 74 61 74 65 20 63 40 20 6f 75 74  ack-state c@ out
8110: 66 6c 61 67 20 6f 72 21 0a 20 20 20 20 62 75 72  flag or!.    bur
8120: 73 74 73 23 20 31 2d 20 64 61 74 61 2d 62 32 62  sts# 1- data-b2b
8130: 20 40 20 3d 20 49 46 20 64 61 74 61 2d 74 61 69   @ = IF data-tai
8140: 6c 3f 20 45 4c 53 45 20 72 65 73 65 6e 64 3f 20  l? ELSE resend? 
8150: 30 3d 20 54 48 45 4e 0a 20 20 20 20 49 46 20 20  0= THEN.    IF  
8160: 6e 65 74 32 6f 3a 73 65 6e 64 20 20 45 4c 53 45  net2o:send  ELSE
8170: 20 20 6e 65 74 32 6f 3a 72 65 73 65 6e 64 20 20    net2o:resend  
8180: 54 48 45 4e 0a 20 20 20 20 3f 74 6f 67 67 6c 65  THEN.    ?toggle
8190: 2d 61 63 6b 20 73 65 6e 64 2d 64 58 20 3b 0a 0a  -ack send-dX ;..
81a0: 3a 20 62 61 6e 64 77 69 64 74 68 3f 20 28 20 2d  : bandwidth? ( -
81b0: 2d 20 66 6c 61 67 20 29 0a 20 20 20 20 74 69 63  - flag ).    tic
81c0: 6b 65 72 20 36 34 40 20 36 34 64 75 70 20 6c 61  ker 64@ 64dup la
81d0: 73 74 2d 74 69 63 6b 73 20 36 34 21 20 6e 65 78  st-ticks 64! nex
81e0: 74 2d 74 69 63 6b 20 36 34 40 20 36 34 2d 20 36  t-tick 64@ 64- 6
81f0: 34 2d 30 3e 3d 0a 20 20 20 20 66 6c 79 62 75 72  4-0>=.    flybur
8200: 73 74 73 20 40 20 30 3e 20 61 6e 64 20 20 3b 0a  sts @ 0> and  ;.
8210: 0a 5c 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  .\ asynchronous 
8220: 73 65 6e 64 69 6e 67 0a 0a 62 65 67 69 6e 2d 73  sending..begin-s
8230: 74 72 75 63 74 75 72 65 20 63 68 75 6e 6b 73 2d  tructure chunks-
8240: 73 74 72 75 63 74 0a 66 69 65 6c 64 3a 20 63 68  struct.field: ch
8250: 75 6e 6b 2d 63 6f 6e 74 65 78 74 0a 66 69 65 6c  unk-context.fiel
8260: 64 3a 20 63 68 75 6e 6b 2d 63 6f 75 6e 74 0a 65  d: chunk-count.e
8270: 6e 64 2d 73 74 72 75 63 74 75 72 65 0a 0a 56 61  nd-structure..Va
8280: 72 69 61 62 6c 65 20 63 68 75 6e 6b 73 0a 56 61  riable chunks.Va
8290: 72 69 61 62 6c 65 20 63 68 75 6e 6b 73 2b 0a 43  riable chunks+.C
82a0: 72 65 61 74 65 20 63 68 75 6e 6b 2d 61 64 64 65  reate chunk-adde
82b0: 72 20 63 68 75 6e 6b 73 2d 73 74 72 75 63 74 20  r chunks-struct 
82c0: 61 6c 6c 6f 74 0a 30 20 56 61 6c 75 65 20 73 65  allot.0 Value se
82d0: 6e 64 65 72 2d 74 61 73 6b 20 20 20 5c 20 61 73  nder-task   \ as
82e0: 79 6e 63 68 72 6f 6e 6f 75 73 20 73 65 6e 64 65  ynchronous sende
82f0: 72 20 74 68 72 65 61 64 20 28 75 6e 75 73 65 64  r thread (unused
8300: 29 0a 30 20 56 61 6c 75 65 20 72 65 63 65 69 76  ).0 Value receiv
8310: 65 72 2d 74 61 73 6b 20 5c 20 72 65 63 65 69 76  er-task \ receiv
8320: 65 72 20 74 68 72 65 61 64 0a 30 20 56 61 6c 75  er thread.0 Valu
8330: 65 20 74 69 6d 65 6f 75 74 2d 74 61 73 6b 20 20  e timeout-task  
8340: 5c 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 74  \ for handling t
8350: 69 6d 65 6f 75 74 73 0a 30 20 56 61 6c 75 65 20  imeouts.0 Value 
8360: 71 75 65 72 79 2d 74 61 73 6b 20 20 20 20 5c 20  query-task    \ 
8370: 66 6f 72 20 62 61 63 6b 67 72 6f 75 6e 64 20 71  for background q
8380: 75 65 72 69 65 73 20 69 6e 69 74 69 61 74 65 64  ueries initiated
8390: 20 69 6e 20 6f 74 68 65 72 20 74 61 73 6b 73 0a   in other tasks.
83a0: 0a 3a 20 2e 30 64 65 70 74 68 20 28 20 2d 2d 20  .: .0depth ( -- 
83b0: 29 20 3c 77 61 72 6e 3e 20 22 53 74 61 63 6b 20  ) <warn> "Stack 
83c0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
83d0: 20 65 6d 70 74 79 21 22 20 74 79 70 65 20 63 72   empty!" type cr
83e0: 20 3c 64 65 66 61 75 6c 74 3e 20 3b 0a 3a 20 21   <default> ;.: !
83f0: 21 30 64 65 70 74 68 21 21 20 28 20 2d 2d 20 29  !0depth!! ( -- )
8400: 20 5d 5d 20 64 65 70 74 68 20 49 46 20 20 2e 30   ]] depth IF  .0
8410: 64 65 70 74 68 20 7e 7e 62 74 20 63 6c 65 61 72  depth ~~bt clear
8420: 73 74 61 63 6b 20 20 54 48 45 4e 20 5b 5b 20 3b  stack  THEN [[ ;
8430: 20 69 6d 6d 65 64 69 61 74 65 0a 3a 20 65 76 65   immediate.: eve
8440: 6e 74 2d 6c 6f 6f 70 27 20 28 20 2d 2d 20 29 20  nt-loop' ( -- ) 
8450: 20 42 45 47 49 4e 20 20 73 74 6f 70 20 20 21 21   BEGIN  stop  !!
8460: 30 64 65 70 74 68 21 21 20 20 41 47 41 49 4e 20  0depth!!  AGAIN 
8470: 3b 0a 3a 20 63 72 65 61 74 65 2d 71 75 65 72 79  ;.: create-query
8480: 2d 74 61 73 6b 20 28 20 2d 2d 20 29 0a 20 20 20  -task ( -- ).   
8490: 20 5b 27 5d 20 65 76 65 6e 74 2d 6c 6f 6f 70 27   ['] event-loop'
84a0: 20 31 20 6e 65 74 32 6f 2d 74 61 73 6b 20 74 6f   1 net2o-task to
84b0: 20 71 75 65 72 79 2d 74 61 73 6b 20 3b 0a 3a 20   query-task ;.: 
84c0: 3f 71 75 65 72 79 2d 74 61 73 6b 20 28 20 2d 2d  ?query-task ( --
84d0: 20 74 61 73 6b 20 29 0a 20 20 20 20 71 75 65 72   task ).    quer
84e0: 79 2d 74 61 73 6b 20 30 3d 20 49 46 20 20 63 72  y-task 0= IF  cr
84f0: 65 61 74 65 2d 71 75 65 72 79 2d 74 61 73 6b 20  eate-query-task 
8500: 20 54 48 45 4e 20 20 71 75 65 72 79 2d 74 61 73   THEN  query-tas
8510: 6b 20 3b 0a 0a 3a 20 64 6f 2d 73 65 6e 64 2d 63  k ;..: do-send-c
8520: 68 75 6e 6b 73 20 28 20 2d 2d 20 29 20 64 61 74  hunks ( -- ) dat
8530: 61 2d 74 6f 2d 73 65 6e 64 3f 20 30 3d 20 3f 45  a-to-send? 0= ?E
8540: 58 49 54 0a 20 20 20 20 5b 3a 20 63 68 75 6e 6b  XIT.    [: chunk
8550: 73 20 24 40 20 62 6f 75 6e 64 73 20 3f 44 4f 0a  s $@ bounds ?DO.
8560: 09 20 20 49 20 63 68 75 6e 6b 2d 63 6f 6e 74 65  .  I chunk-conte
8570: 78 74 20 40 20 6f 20 3d 20 49 46 0a 09 20 20 20  xt @ o = IF..   
8580: 20 20 20 55 4e 4c 4f 4f 50 20 20 45 58 49 54 0a     UNLOOP  EXIT.
8590: 09 20 20 54 48 45 4e 0a 20 20 20 20 20 20 63 68  .  THEN.      ch
85a0: 75 6e 6b 73 2d 73 74 72 75 63 74 20 2b 4c 4f 4f  unks-struct +LOO
85b0: 50 0a 20 20 20 20 20 20 6f 20 63 68 75 6e 6b 2d  P.      o chunk-
85c0: 61 64 64 65 72 20 63 68 75 6e 6b 2d 63 6f 6e 74  adder chunk-cont
85d0: 65 78 74 20 21 0a 20 20 20 20 20 20 30 20 63 68  ext !.      0 ch
85e0: 75 6e 6b 2d 61 64 64 65 72 20 63 68 75 6e 6b 2d  unk-adder chunk-
85f0: 63 6f 75 6e 74 20 21 0a 20 20 20 20 20 20 63 68  count !.      ch
8600: 75 6e 6b 2d 61 64 64 65 72 20 63 68 75 6e 6b 73  unk-adder chunks
8610: 2d 73 74 72 75 63 74 20 63 68 75 6e 6b 73 20 24  -struct chunks $
8620: 2b 21 20 3b 5d 0a 20 20 20 20 72 65 73 69 7a 65  +! ;].    resize
8630: 2d 73 65 6d 61 20 63 2d 73 65 63 74 69 6f 6e 0a  -sema c-section.
8640: 20 20 20 20 74 69 63 6b 65 72 20 36 34 40 20 61      ticker 64@ a
8650: 63 6b 40 20 2e 74 69 63 6b 73 2d 69 6e 69 74 20  ck@ .ticks-init 
8660: 3b 0a 0a 3a 20 6f 2d 63 68 75 6e 6b 73 20 28 20  ;..: o-chunks ( 
8670: 2d 2d 20 29 0a 20 20 20 20 5b 3a 20 63 68 75 6e  -- ).    [: chun
8680: 6b 73 20 24 40 20 62 6f 75 6e 64 73 20 3f 44 4f  ks $@ bounds ?DO
8690: 0a 09 20 20 20 20 49 20 63 68 75 6e 6b 2d 63 6f  ..    I chunk-co
86a0: 6e 74 65 78 74 20 40 20 6f 20 3d 20 49 46 0a 09  ntext @ o = IF..
86b0: 09 63 68 75 6e 6b 73 20 49 20 63 68 75 6e 6b 73  .chunks I chunks
86c0: 2d 73 74 72 75 63 74 20 64 65 6c 24 6f 6e 65 0a  -struct del$one.
86d0: 09 09 75 6e 6c 6f 6f 70 20 63 68 75 6e 6b 73 20  ..unloop chunks 
86e0: 6e 65 78 74 24 20 3f 44 4f 20 4e 4f 50 45 20 30  next$ ?DO NOPE 0
86f0: 0a 09 20 20 20 20 45 4c 53 45 20 20 63 68 75 6e  ..    ELSE  chun
8700: 6b 73 2d 73 74 72 75 63 74 20 20 54 48 45 4e 20  ks-struct  THEN 
8710: 20 2b 4c 4f 4f 50 20 3b 5d 0a 20 20 20 20 72 65   +LOOP ;].    re
8720: 73 69 7a 65 2d 73 65 6d 61 20 63 2d 73 65 63 74  size-sema c-sect
8730: 69 6f 6e 20 3b 0a 0a 65 76 65 6e 74 3a 20 3a 3e  ion ;..event: :>
8740: 73 65 6e 64 2d 63 68 75 6e 6b 73 20 28 20 6f 20  send-chunks ( o 
8750: 2d 2d 20 29 20 2e 64 6f 2d 73 65 6e 64 2d 63 68  -- ) .do-send-ch
8760: 75 6e 6b 73 20 3b 0a 0a 69 6e 20 6e 65 74 32 6f  unks ;..in net2o
8770: 20 3a 20 73 65 6e 64 2d 63 68 75 6e 6b 73 20 20   : send-chunks  
8780: 73 65 6e 64 65 72 2d 74 61 73 6b 20 30 3d 20 49  sender-task 0= I
8790: 46 20 20 64 6f 2d 73 65 6e 64 2d 63 68 75 6e 6b  F  do-send-chunk
87a0: 73 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20  s  EXIT  THEN.  
87b0: 20 20 3c 65 76 65 6e 74 20 6f 20 65 6c 69 74 2c    <event o elit,
87c0: 20 3a 3e 73 65 6e 64 2d 63 68 75 6e 6b 73 20 73   :>send-chunks s
87d0: 65 6e 64 65 72 2d 74 61 73 6b 20 65 76 65 6e 74  ender-task event
87e0: 3e 20 3b 0a 0a 3a 20 63 68 75 6e 6b 2d 63 6f 75  > ;..: chunk-cou
87f0: 6e 74 2b 20 28 20 63 6f 75 6e 74 65 72 20 2d 2d  nt+ ( counter --
8800: 20 29 0a 20 20 20 20 64 75 70 20 40 0a 20 20 20   ).    dup @.   
8810: 20 64 75 70 20 30 3d 20 49 46 0a 09 61 63 6b 2d   dup 0= IF..ack-
8820: 74 6f 67 67 6c 65 23 20 61 63 6b 2d 73 74 61 74  toggle# ack-stat
8830: 65 20 78 6f 72 63 21 0a 09 61 63 6b 2d 72 65 73  e xorc!..ack-res
8840: 65 6e 64 73 23 0a 09 61 63 6b 2d 72 65 73 65 6e  ends#..ack-resen
8850: 64 7e 20 61 63 6b 2d 73 74 61 74 65 20 63 40 20  d~ ack-state c@ 
8860: 78 6f 72 20 72 65 73 65 6e 64 2d 74 6f 67 67 6c  xor resend-toggl
8870: 65 23 20 61 6e 64 20 30 3c 3e 20 2b 0a 09 30 20  e# and 0<> +..0 
8880: 6d 61 78 20 64 75 70 20 74 6f 20 61 63 6b 2d 72  max dup to ack-r
8890: 65 73 65 6e 64 73 23 0a 09 30 3d 20 49 46 20 20  esends#..0= IF  
88a0: 61 63 6b 2d 72 65 73 65 6e 64 7e 20 61 63 6b 2d  ack-resend~ ack-
88b0: 73 74 61 74 65 20 63 40 20 72 65 73 65 6e 64 2d  state c@ resend-
88c0: 74 6f 67 67 6c 65 23 20 69 6e 76 65 72 74 20 61  toggle# invert a
88d0: 6e 64 20 6f 72 0a 09 20 20 20 20 61 63 6b 2d 73  nd or..    ack-s
88e0: 74 61 74 65 20 63 21 20 20 61 63 6b 40 20 2e 66  tate c!  ack@ .f
88f0: 6c 79 62 75 72 73 74 73 20 40 20 74 6f 20 61 63  lybursts @ to ac
8900: 6b 2d 72 65 73 65 6e 64 73 23 20 20 54 48 45 4e  k-resends#  THEN
8910: 0a 09 2d 31 20 61 63 6b 40 20 2e 66 6c 79 62 75  ..-1 ack@ .flybu
8920: 72 73 74 73 20 2b 21 20 62 75 72 73 74 73 28 20  rsts +! bursts( 
8930: 2e 22 20 62 75 72 73 74 73 3a 20 22 20 61 63 6b  ." bursts: " ack
8940: 40 20 2e 66 6c 79 62 75 72 73 74 73 20 3f 20 61  @ .flybursts ? a
8950: 63 6b 40 20 2e 66 6c 79 62 75 72 73 74 20 3f 20  ck@ .flyburst ? 
8960: 63 72 20 29 0a 09 61 63 6b 40 20 2e 66 6c 79 62  cr )..ack@ .flyb
8970: 75 72 73 74 73 20 40 20 30 3c 3d 20 49 46 0a 09  ursts @ 0<= IF..
8980: 20 20 20 20 62 75 72 73 74 73 28 20 2e 6f 20 2e      bursts( .o .
8990: 22 20 6e 6f 20 62 75 72 73 74 73 20 69 6e 20 66  " no bursts in f
89a0: 6c 69 67 68 74 20 22 20 61 63 6b 40 20 2e 6e 73  light " ack@ .ns
89b0: 2f 62 75 72 73 74 20 3f 20 64 61 74 61 2d 74 61  /burst ? data-ta
89c0: 69 6c 40 20 73 77 61 70 20 68 65 78 2e 20 68 65  il@ swap hex. he
89d0: 78 2e 20 63 72 20 29 0a 09 54 48 45 4e 0a 20 20  x. cr )..THEN.  
89e0: 20 20 54 48 45 4e 0a 20 20 20 20 74 69 63 6b 2d    THEN.    tick-
89f0: 69 6e 69 74 20 3d 20 49 46 20 20 6f 66 66 20 20  init = IF  off  
8a00: 45 4c 53 45 20 20 31 20 73 77 61 70 20 2b 21 20  ELSE  1 swap +! 
8a10: 20 54 48 45 4e 20 3b 0a 0a 3a 20 73 65 6e 64 2d   THEN ;..: send-
8a20: 61 2d 63 68 75 6e 6b 20 28 20 63 68 75 6e 6b 20  a-chunk ( chunk 
8a30: 2d 2d 20 66 6c 61 67 20 29 20 20 3e 72 0a 20 20  -- flag )  >r.  
8a40: 20 20 64 61 74 61 2d 62 32 62 20 40 20 30 3c 3d    data-b2b @ 0<=
8a50: 20 49 46 0a 09 61 63 6b 40 20 2e 62 61 6e 64 77   IF..ack@ .bandw
8a60: 69 64 74 68 3f 20 64 75 70 20 20 49 46 0a 09 20  idth? dup  IF.. 
8a70: 20 20 20 62 32 62 2d 74 6f 67 67 6c 65 23 20 61     b2b-toggle# a
8a80: 63 6b 2d 73 74 61 74 65 20 78 6f 72 63 21 0a 09  ck-state xorc!..
8a90: 20 20 20 20 62 75 72 73 74 73 23 20 31 2d 20 64      bursts# 1- d
8aa0: 61 74 61 2d 62 32 62 20 21 0a 09 54 48 45 4e 0a  ata-b2b !..THEN.
8ab0: 20 20 20 20 45 4c 53 45 0a 09 2d 31 20 64 61 74      ELSE..-1 dat
8ac0: 61 2d 62 32 62 20 2b 21 20 20 74 72 75 65 0a 20  a-b2b +!  true. 
8ad0: 20 20 20 54 48 45 4e 0a 20 20 20 20 64 75 70 20     THEN.    dup 
8ae0: 49 46 20 20 72 40 20 63 68 75 6e 6b 2d 63 6f 75  IF  r@ chunk-cou
8af0: 6e 74 2b 20 20 6e 65 74 32 6f 3a 73 65 6e 64 2d  nt+  net2o:send-
8b00: 63 68 75 6e 6b 0a 09 64 61 74 61 2d 62 32 62 20  chunk..data-b2b 
8b10: 40 20 30 3c 3d 20 49 46 20 20 61 63 6b 40 20 2e  @ 0<= IF  ack@ .
8b20: 62 75 72 73 74 2d 65 6e 64 20 20 54 48 45 4e 20  burst-end  THEN 
8b30: 20 74 69 6d 65 6f 75 74 28 20 27 2e 27 20 65 6d   timeout( '.' em
8b40: 69 74 20 29 20 20 54 48 45 4e 0a 20 20 20 20 72  it )  THEN.    r
8b50: 64 72 6f 70 20 20 31 20 63 68 75 6e 6b 73 2b 20  drop  1 chunks+ 
8b60: 2b 21 20 3b 0a 0a 3a 20 2e 6e 6f 73 65 6e 64 20  +! ;..: .nosend 
8b70: 28 20 2d 2d 20 29 20 61 63 6b 40 20 3e 6f 20 2e  ( -- ) ack@ >o .
8b80: 22 20 64 6f 6e 65 2c 20 22 20 20 34 20 73 65 74  " done, "  4 set
8b90: 2d 70 72 65 63 69 73 69 6f 6e 0a 20 20 20 20 2e  -precision.    .
8ba0: 6f 20 2e 22 20 72 61 74 65 3a 20 22 20 6e 73 2f  o ." rate: " ns/
8bb0: 62 75 72 73 74 20 40 20 73 3e 66 20 74 69 63 6b  burst @ s>f tick
8bc0: 2d 69 6e 69 74 20 63 68 75 6e 6b 2d 70 32 20 6c  -init chunk-p2 l
8bd0: 73 68 69 66 74 20 73 3e 66 20 31 65 39 20 66 2a  shift s>f 1e9 f*
8be0: 20 66 73 77 61 70 20 66 2f 20 66 65 2e 20 63 72   fswap f/ fe. cr
8bf0: 0a 20 20 20 20 2e 6f 20 2e 22 20 73 6c 61 63 6b  .    .o ." slack
8c00: 3a 20 22 20 6d 69 6e 2d 73 6c 61 63 6b 20 36 34  : " min-slack 64
8c10: 40 20 75 36 34 2e 20 6d 61 78 2d 73 6c 61 63 6b  @ u64. max-slack
8c20: 20 36 34 40 20 75 36 34 2e 20 63 72 0a 20 20 20   64@ u64. cr.   
8c30: 20 2e 6f 20 2e 22 20 72 74 64 65 6c 61 79 3a 20   .o ." rtdelay: 
8c40: 22 20 72 74 64 65 6c 61 79 20 36 34 40 20 75 36  " rtdelay 64@ u6
8c50: 34 2e 20 63 72 20 6f 3e 0a 20 20 20 20 64 61 74  4. cr o>.    dat
8c60: 61 2d 6d 61 70 20 77 69 74 68 20 6d 61 70 63 0a  a-map with mapc.
8c70: 20 20 20 20 2e 22 20 44 61 74 61 20 68 20 62 20      ." Data h b 
8c80: 74 3a 20 22 20 64 65 73 74 2d 68 65 61 64 20 68  t: " dest-head h
8c90: 65 78 2e 20 64 65 73 74 2d 62 61 63 6b 20 68 65  ex. dest-back he
8ca0: 78 2e 20 64 65 73 74 2d 74 61 69 6c 20 68 65 78  x. dest-tail hex
8cb0: 2e 20 63 72 0a 20 20 20 20 65 6e 64 77 69 74 68  . cr.    endwith
8cc0: 20 3b 0a 0a 3a 20 73 65 6e 64 2d 63 68 75 6e 6b   ;..: send-chunk
8cd0: 73 2d 61 73 79 6e 63 20 28 20 2d 2d 20 66 6c 61  s-async ( -- fla
8ce0: 67 20 29 0a 20 20 20 20 63 68 75 6e 6b 73 20 24  g ).    chunks $
8cf0: 40 20 64 75 70 20 30 3d 20 49 46 20 20 6e 69 70  @ dup 0= IF  nip
8d00: 20 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20    EXIT  THEN.   
8d10: 20 63 68 75 6e 6b 73 2b 20 40 20 63 68 75 6e 6b   chunks+ @ chunk
8d20: 73 2d 73 74 72 75 63 74 20 2a 20 73 61 66 65 2f  s-struct * safe/
8d30: 73 74 72 69 6e 67 0a 20 20 20 20 49 46 0a 09 64  string.    IF..d
8d40: 75 70 20 63 68 75 6e 6b 2d 63 6f 6e 74 65 78 74  up chunk-context
8d50: 20 40 20 3e 6f 20 72 64 72 6f 70 0a 09 63 68 75   @ >o rdrop..chu
8d60: 6e 6b 2d 63 6f 75 6e 74 0a 09 64 61 74 61 2d 74  nk-count..data-t
8d70: 6f 2d 73 65 6e 64 3f 20 49 46 0a 09 20 20 20 20  o-send? IF..    
8d80: 73 65 6e 64 2d 61 2d 63 68 75 6e 6b 0a 09 45 4c  send-a-chunk..EL
8d90: 53 45 0a 09 20 20 20 20 64 72 6f 70 20 6d 73 67  SE..    drop msg
8da0: 28 20 2e 6e 6f 73 65 6e 64 20 29 0a 09 20 20 20  ( .nosend )..   
8db0: 20 5b 3a 20 63 68 75 6e 6b 73 20 63 68 75 6e 6b   [: chunks chunk
8dc0: 73 2b 20 40 20 63 68 75 6e 6b 73 2d 73 74 72 75  s+ @ chunks-stru
8dd0: 63 74 20 2a 20 63 68 75 6e 6b 73 2d 73 74 72 75  ct * chunks-stru
8de0: 63 74 20 24 64 65 6c 20 3b 5d 0a 09 20 20 20 20  ct $del ;]..    
8df0: 72 65 73 69 7a 65 2d 73 65 6d 61 20 63 2d 73 65  resize-sema c-se
8e00: 63 74 69 6f 6e 0a 09 20 20 20 20 66 61 6c 73 65  ction..    false
8e10: 0a 09 54 48 45 4e 0a 20 20 20 20 45 4c 53 45 20  ..THEN.    ELSE 
8e20: 20 64 72 6f 70 20 63 68 75 6e 6b 73 2b 20 6f 66   drop chunks+ of
8e30: 66 20 66 61 6c 73 65 20 20 54 48 45 4e 20 3b 0a  f false  THEN ;.
8e40: 0a 3a 20 6e 65 78 74 2d 63 68 75 6e 6b 2d 74 69  .: next-chunk-ti
8e50: 63 6b 20 28 20 2d 2d 20 74 69 63 6b 20 29 0a 20  ck ( -- tick ). 
8e60: 20 20 20 36 34 23 2d 31 20 63 68 75 6e 6b 73 20     64#-1 chunks 
8e70: 24 40 20 62 6f 75 6e 64 73 20 3f 44 4f 0a 09 49  $@ bounds ?DO..I
8e80: 20 63 68 75 6e 6b 2d 63 6f 6e 74 65 78 74 20 40   chunk-context @
8e90: 20 2e 61 63 6b 40 20 2e 6e 65 78 74 2d 74 69 63   .ack@ .next-tic
8ea0: 6b 20 36 34 40 20 36 34 75 6d 69 6e 0a 20 20 20  k 64@ 64umin.   
8eb0: 20 63 68 75 6e 6b 73 2d 73 74 72 75 63 74 20 2b   chunks-struct +
8ec0: 4c 4f 4f 50 20 3b 0a 0a 3a 20 73 65 6e 64 2d 61  LOOP ;..: send-a
8ed0: 6e 6f 74 68 65 72 2d 63 68 75 6e 6b 20 28 20 2d  nother-chunk ( -
8ee0: 2d 20 66 6c 61 67 20 29 20 20 66 61 6c 73 65 20  - flag )  false 
8ef0: 20 30 20 3e 72 20 20 21 74 69 63 6b 73 0a 20 20   0 >r  !ticks.  
8f00: 20 20 42 45 47 49 4e 20 20 42 45 47 49 4e 20 20    BEGIN  BEGIN  
8f10: 64 72 6f 70 20 73 65 6e 64 2d 63 68 75 6e 6b 73  drop send-chunks
8f20: 2d 61 73 79 6e 63 20 64 75 70 20 20 57 48 49 4c  -async dup  WHIL
8f30: 45 20 20 72 64 72 6f 70 20 30 20 3e 72 20 20 52  E  rdrop 0 >r  R
8f40: 45 50 45 41 54 0a 09 63 68 75 6e 6b 73 2b 20 40  EPEAT..chunks+ @
8f50: 20 30 3d 20 49 46 20 20 72 3e 20 31 2b 20 3e 72   0= IF  r> 1+ >r
8f60: 20 20 54 48 45 4e 0a 20 20 20 20 72 40 20 32 20    THEN.    r@ 2 
8f70: 75 3e 3d 20 20 55 4e 54 49 4c 20 20 72 64 72 6f  u>=  UNTIL  rdro
8f80: 70 20 3b 0a 0a 3a 20 73 65 6e 64 2d 61 6e 79 74  p ;..: send-anyt
8f90: 68 69 6e 67 3f 20 28 20 2d 2d 20 66 6c 61 67 20  hing? ( -- flag 
8fa0: 29 20 20 63 68 75 6e 6b 73 20 24 40 6c 65 6e 20  )  chunks $@len 
8fb0: 30 3e 20 3b 0a 0a 5c 20 72 65 77 69 6e 64 20 62  0> ;..\ rewind b
8fc0: 75 66 66 65 72 20 74 6f 20 73 65 6e 64 20 66 75  uffer to send fu
8fd0: 72 74 68 65 72 20 70 61 63 6b 65 74 73 0a 0a 73  rther packets..s
8fe0: 63 6f 70 65 7b 20 6d 61 70 63 0a 0a 3a 6e 6f 6e  cope{ mapc..:non
8ff0: 61 6d 65 20 28 20 6f 3a 6d 61 70 20 2d 2d 20 29  ame ( o:map -- )
9000: 20 64 65 73 74 2d 73 69 7a 65 20 61 64 64 72 3e   dest-size addr>
9010: 74 73 20 0a 20 20 20 20 64 65 73 74 2d 74 69 6d  ts .    dest-tim
9020: 65 73 74 61 6d 70 73 20 6f 76 65 72 20 65 72 61  estamps over era
9030: 73 65 0a 20 20 20 20 64 61 74 61 2d 72 65 73 65  se.    data-rese
9040: 6e 64 23 20 40 20 73 77 61 70 20 24 46 46 20 66  nd# @ swap $FF f
9050: 69 6c 6c 20 3b 0a 64 61 74 61 2d 63 6c 61 73 73  ill ;.data-class
9060: 20 74 6f 20 72 65 77 69 6e 64 2d 74 69 6d 65 73   to rewind-times
9070: 74 61 6d 70 73 0a 3a 6e 6f 6e 61 6d 65 20 28 20  tamps.:noname ( 
9080: 6f 3a 6d 61 70 20 2d 2d 20 29 20 64 65 73 74 2d  o:map -- ) dest-
9090: 73 69 7a 65 20 61 64 64 72 3e 74 73 0a 20 20 20  size addr>ts.   
90a0: 20 64 65 73 74 2d 74 69 6d 65 73 74 61 6d 70 73   dest-timestamps
90b0: 20 6f 76 65 72 20 65 72 61 73 65 20 3b 0a 72 64   over erase ;.rd
90c0: 61 74 61 2d 63 6c 61 73 73 20 74 6f 20 72 65 77  ata-class to rew
90d0: 69 6e 64 2d 74 69 6d 65 73 74 61 6d 70 73 0a 0a  ind-timestamps..
90e0: 3a 20 72 65 77 69 6e 64 2d 74 73 2d 70 61 72 74  : rewind-ts-part
90f0: 69 61 6c 20 28 20 6f 6c 64 2d 62 61 63 6b 20 6e  ial ( old-back n
9100: 65 77 2d 62 61 63 6b 20 61 64 64 72 20 6f 3a 6d  ew-back addr o:m
9110: 61 70 20 2d 2d 20 29 0a 20 20 20 20 7b 20 61 64  ap -- ).    { ad
9120: 64 72 20 7d 20 61 64 64 72 3e 74 73 20 73 77 61  dr } addr>ts swa
9130: 70 20 61 64 64 72 3e 74 73 20 55 2b 44 4f 0a 09  p addr>ts U+DO..
9140: 49 20 49 27 20 66 69 78 2d 74 73 73 69 7a 65 09  I I' fix-tssize.
9150: 7b 20 6c 65 6e 20 7d 20 61 64 64 72 20 2b 20 6c  { len } addr + l
9160: 65 6e 20 65 72 61 73 65 0a 20 20 20 20 6c 65 6e  en erase.    len
9170: 20 2b 4c 4f 4f 50 20 3b 0a 3a 6e 6f 6e 61 6d 65   +LOOP ;.:noname
9180: 20 28 20 6f 6c 64 2d 62 61 63 6b 20 6e 65 77 2d   ( old-back new-
9190: 62 61 63 6b 20 6f 3a 6d 61 70 20 2d 2d 20 29 0a  back o:map -- ).
91a0: 20 20 20 20 32 64 75 70 20 64 61 74 61 2d 72 65      2dup data-re
91b0: 73 65 6e 64 23 20 40 20 72 65 77 69 6e 64 2d 74  send# @ rewind-t
91c0: 73 2d 70 61 72 74 69 61 6c 0a 20 20 20 20 32 64  s-partial.    2d
91d0: 75 70 20 64 65 73 74 2d 74 69 6d 65 73 74 61 6d  up dest-timestam
91e0: 70 73 20 72 65 77 69 6e 64 2d 74 73 2d 70 61 72  ps rewind-ts-par
91f0: 74 69 61 6c 0a 20 20 20 20 72 65 67 65 6e 2d 69  tial.    regen-i
9200: 76 73 2d 70 61 72 74 20 3b 0a 64 61 74 61 2d 63  vs-part ;.data-c
9210: 6c 61 73 73 20 74 6f 20 72 65 77 69 6e 64 2d 70  lass to rewind-p
9220: 61 72 74 69 61 6c 0a 3a 6e 6f 6e 61 6d 65 20 28  artial.:noname (
9230: 20 6f 6c 64 2d 62 61 63 6b 20 6e 65 77 2d 62 61   old-back new-ba
9240: 63 6b 20 6f 3a 6d 61 70 20 2d 2d 20 29 0a 20 20  ck o:map -- ).  
9250: 20 20 32 64 75 70 20 61 63 6b 62 69 74 73 2d 65    2dup ackbits-e
9260: 72 61 73 65 0a 20 20 20 20 32 64 75 70 20 64 65  rase.    2dup de
9270: 73 74 2d 74 69 6d 65 73 74 61 6d 70 73 20 72 65  st-timestamps re
9280: 77 69 6e 64 2d 74 73 2d 70 61 72 74 69 61 6c 0a  wind-ts-partial.
9290: 20 20 20 20 72 65 67 65 6e 2d 69 76 73 2d 70 61      regen-ivs-pa
92a0: 72 74 20 3b 0a 72 64 61 74 61 2d 63 6c 61 73 73  rt ;.rdata-class
92b0: 20 74 6f 20 72 65 77 69 6e 64 2d 70 61 72 74 69   to rewind-parti
92c0: 61 6c 0a 0a 7d 73 63 6f 70 65 0a 0a 69 6e 20 6e  al..}scope..in n
92d0: 65 74 32 6f 20 3a 20 72 65 77 69 6e 64 2d 73 65  et2o : rewind-se
92e0: 6e 64 65 72 2d 70 61 72 74 69 61 6c 20 28 20 6e  nder-partial ( n
92f0: 65 77 2d 62 61 63 6b 20 2d 2d 20 29 0a 20 20 20  ew-back -- ).   
9300: 20 64 61 74 61 2d 6d 61 70 20 77 69 74 68 20 6d   data-map with m
9310: 61 70 63 20 64 65 73 74 2d 62 61 63 6b 20 75 6d  apc dest-back um
9320: 61 78 20 64 65 73 74 2d 62 61 63 6b 20 6f 76 65  ax dest-back ove
9330: 72 20 72 65 77 69 6e 64 2d 70 61 72 74 69 61 6c  r rewind-partial
9340: 0a 09 64 65 73 74 2d 62 61 63 6b 20 6f 76 65 72  ..dest-back over
9350: 20 72 65 77 69 6e 64 2d 72 65 73 65 6e 64 20 74   rewind-resend t
9360: 6f 20 64 65 73 74 2d 62 61 63 6b 0a 20 20 20 20  o dest-back.    
9370: 65 6e 64 77 69 74 68 20 3b 0a 0a 5c 20 73 65 70  endwith ;..\ sep
9380: 61 72 61 74 65 20 74 68 72 65 61 64 20 66 6f 72  arate thread for
9390: 20 6c 6f 61 64 69 6e 67 20 61 6e 64 20 73 61 76   loading and sav
93a0: 69 6e 67 2e 2e 2e 0a 0a 69 6e 20 6e 65 74 32 6f  ing.....in net2o
93b0: 20 3a 20 73 61 76 65 20 7b 20 74 61 69 6c 20 2d   : save { tail -
93c0: 2d 20 7d 0a 20 20 20 20 64 61 74 61 2d 72 6d 61  - }.    data-rma
93d0: 70 20 3f 64 75 70 2d 49 46 0a 09 2e 6d 61 70 63  p ?dup-IF...mapc
93e0: 3a 64 65 73 74 2d 62 61 63 6b 20 7b 20 6f 6c 64  :dest-back { old
93f0: 62 61 63 6b 20 7d 0a 09 6f 6c 64 62 61 63 6b 20  back }..oldback 
9400: 74 61 69 6c 20 6e 65 74 32 6f 3a 73 70 69 74 20  tail net2o:spit 
9410: 7b 20 62 61 63 6b 20 7d 0a 09 64 61 74 61 2d 72  { back }..data-r
9420: 6d 61 70 20 77 69 74 68 20 6d 61 70 63 0a 09 20  map with mapc.. 
9430: 20 20 20 6f 6c 64 62 61 63 6b 20 62 61 63 6b 20     oldback back 
9440: 72 65 77 69 6e 64 2d 70 61 72 74 69 61 6c 20 20  rewind-partial  
9450: 62 61 63 6b 20 74 6f 20 64 65 73 74 2d 62 61 63  back to dest-bac
9460: 6b 0a 09 20 20 20 20 64 65 73 74 2d 72 65 71 20  k..    dest-req 
9470: 49 46 20 20 62 61 63 6b 20 64 6f 2d 73 6c 75 72  IF  back do-slur
9480: 70 20 21 20 20 54 48 45 4e 0a 09 65 6e 64 77 69  p !  THEN..endwi
9490: 74 68 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 44  th.    THEN ;..D
94a0: 65 66 65 72 20 64 6f 2d 74 72 61 63 6b 2d 73 65  efer do-track-se
94b0: 65 6b 0a 0a 65 76 65 6e 74 3a 20 3a 3e 73 61 76  ek..event: :>sav
94c0: 65 20 28 20 74 61 69 6c 20 6f 20 2d 2d 20 29 20  e ( tail o -- ) 
94d0: 20 2e 6e 65 74 32 6f 3a 73 61 76 65 20 3b 0a 65   .net2o:save ;.e
94e0: 76 65 6e 74 3a 20 3a 3e 73 61 76 65 26 64 6f 6e  vent: :>save&don
94f0: 65 20 28 20 74 61 69 6c 20 6f 20 2d 2d 20 29 0a  e ( tail o -- ).
9500: 20 20 20 20 3e 6f 20 6e 65 74 32 6f 3a 73 61 76      >o net2o:sav
9510: 65 20 73 79 6e 63 2d 64 6f 6e 65 2d 78 74 20 6f  e sync-done-xt o
9520: 3e 20 3b 0a 65 76 65 6e 74 3a 20 3a 3e 63 6c 6f  > ;.event: :>clo
9530: 73 65 2d 61 6c 6c 20 28 20 6f 20 2d 2d 20 29 0a  se-all ( o -- ).
9540: 20 20 20 20 2e 6e 65 74 32 6f 3a 63 6c 6f 73 65      .net2o:close
9550: 2d 61 6c 6c 20 3b 0a 0a 30 20 56 61 6c 75 65 20  -all ;..0 Value 
9560: 66 69 6c 65 2d 74 61 73 6b 0a 0a 3a 20 63 72 65  file-task..: cre
9570: 61 74 65 2d 66 69 6c 65 2d 74 61 73 6b 20 28 20  ate-file-task ( 
9580: 2d 2d 20 29 0a 20 20 20 20 5b 27 5d 20 65 76 65  -- ).    ['] eve
9590: 6e 74 2d 6c 6f 6f 70 27 20 31 20 6e 65 74 32 6f  nt-loop' 1 net2o
95a0: 2d 74 61 73 6b 20 74 6f 20 66 69 6c 65 2d 74 61  -task to file-ta
95b0: 73 6b 20 3b 0a 3a 20 3f 66 69 6c 65 2d 74 61 73  sk ;.: ?file-tas
95c0: 6b 20 28 20 2d 2d 20 66 69 6c 65 2d 74 61 73 6b  k ( -- file-task
95d0: 20 29 0a 20 20 20 20 66 69 6c 65 2d 74 61 73 6b   ).    file-task
95e0: 20 30 3d 20 49 46 20 20 63 72 65 61 74 65 2d 66   0= IF  create-f
95f0: 69 6c 65 2d 74 61 73 6b 20 20 54 48 45 4e 0a 20  ile-task  THEN. 
9600: 20 20 20 66 69 6c 65 2d 74 61 73 6b 20 3b 0a 69     file-task ;.i
9610: 6e 20 6e 65 74 32 6f 20 3a 20 73 61 76 65 26 20  n net2o : save& 
9620: 28 20 2d 2d 20 29 0a 20 20 20 20 73 79 6e 63 66  ( -- ).    syncf
9630: 69 6c 65 28 20 64 61 74 61 2d 72 6d 61 70 20 2e  ile( data-rmap .
9640: 6d 61 70 63 3a 64 65 73 74 2d 74 61 69 6c 20 6e  mapc:dest-tail n
9650: 65 74 32 6f 3a 73 61 76 65 20 29 65 6c 73 65 28  et2o:save )else(
9660: 0a 20 20 20 20 64 61 74 61 2d 72 6d 61 70 20 2e  .    data-rmap .
9670: 6d 61 70 63 3a 64 65 73 74 2d 74 61 69 6c 20 65  mapc:dest-tail e
9680: 6c 69 74 2c 0a 20 20 20 20 6f 20 65 6c 69 74 2c  lit,.    o elit,
9690: 20 3a 3e 73 61 76 65 20 3f 66 69 6c 65 2d 74 61   :>save ?file-ta
96a0: 73 6b 20 65 76 65 6e 74 3e 20 29 20 3b 0a 69 6e  sk event> ) ;.in
96b0: 20 6e 65 74 32 6f 20 3a 20 73 61 76 65 26 64 6f   net2o : save&do
96c0: 6e 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 73 79  ne ( -- ).    sy
96d0: 6e 63 66 69 6c 65 28 20 64 61 74 61 2d 72 6d 61  ncfile( data-rma
96e0: 70 20 2e 6d 61 70 63 3a 64 65 73 74 2d 74 61 69  p .mapc:dest-tai
96f0: 6c 20 6e 65 74 32 6f 3a 73 61 76 65 20 73 79 6e  l net2o:save syn
9700: 63 2d 64 6f 6e 65 2d 78 74 20 29 65 6c 73 65 28  c-done-xt )else(
9710: 0a 20 20 20 20 64 61 74 61 2d 72 6d 61 70 20 2e  .    data-rmap .
9720: 6d 61 70 63 3a 64 65 73 74 2d 74 61 69 6c 20 65  mapc:dest-tail e
9730: 6c 69 74 2c 0a 20 20 20 20 6f 20 65 6c 69 74 2c  lit,.    o elit,
9740: 20 3a 3e 73 61 76 65 26 64 6f 6e 65 20 3f 66 69   :>save&done ?fi
9750: 6c 65 2d 74 61 73 6b 20 65 76 65 6e 74 7c 20 29  le-task event| )
9760: 20 3b 0a 0a 5c 20 73 63 68 65 64 75 6c 65 20 64   ;..\ schedule d
9770: 65 6c 61 79 65 64 20 65 76 65 6e 74 73 0a 0a 6f  elayed events..o
9780: 62 6a 65 63 74 20 63 6c 61 73 73 0a 36 34 66 69  bject class.64fi
9790: 65 6c 64 3a 20 71 75 65 75 65 2d 74 69 6d 65 73  eld: queue-times
97a0: 74 61 6d 70 0a 66 69 65 6c 64 3a 20 71 75 65 75  tamp.field: queu
97b0: 65 2d 6a 6f 62 0a 64 65 66 65 72 3a 20 71 75 65  e-job.defer: que
97c0: 75 65 2d 78 74 0a 65 6e 64 2d 63 6c 61 73 73 20  ue-xt.end-class 
97d0: 71 75 65 75 65 2d 63 6c 61 73 73 0a 71 75 65 75  queue-class.queu
97e0: 65 2d 63 6c 61 73 73 20 3e 6f 73 69 7a 65 20 40  e-class >osize @
97f0: 20 43 6f 6e 73 74 61 6e 74 20 71 75 65 75 65 2d   Constant queue-
9800: 73 74 72 75 63 74 0a 0a 56 61 72 69 61 62 6c 65  struct..Variable
9810: 20 71 75 65 75 65 0a 71 75 65 75 65 2d 63 6c 61   queue.queue-cla
9820: 73 73 20 3e 6f 73 69 7a 65 20 40 20 62 75 66 66  ss >osize @ buff
9830: 65 72 3a 20 71 75 65 75 65 2d 61 64 64 65 72 20  er: queue-adder 
9840: 20 0a 0a 3a 20 61 64 64 2d 71 75 65 75 65 20 28   ..: add-queue (
9850: 20 78 74 20 75 73 20 2d 2d 20 29 0a 20 20 20 20   xt us -- ).    
9860: 74 69 63 6b 65 72 20 36 34 40 20 2b 20 20 6f 20  ticker 64@ +  o 
9870: 71 75 65 75 65 2d 61 64 64 65 72 20 3e 6f 20 71  queue-adder >o q
9880: 75 65 75 65 2d 6a 6f 62 20 21 20 20 71 75 65 75  ueue-job !  queu
9890: 65 2d 74 69 6d 65 73 74 61 6d 70 20 36 34 21 0a  e-timestamp 64!.
98a0: 20 20 20 20 69 73 20 71 75 65 75 65 2d 78 74 20      is queue-xt 
98b0: 20 6f 20 71 75 65 75 65 2d 73 74 72 75 63 74 20   o queue-struct 
98c0: 71 75 65 75 65 20 24 2b 21 20 6f 3e 20 3b 0a 0a  queue $+! o> ;..
98d0: 3a 20 65 76 61 6c 2d 71 75 65 75 65 20 28 20 2d  : eval-queue ( -
98e0: 2d 20 29 0a 20 20 20 20 71 75 65 75 65 20 24 40  - ).    queue $@
98f0: 6c 65 6e 20 30 3d 20 3f 45 58 49 54 20 20 74 69  len 0= ?EXIT  ti
9900: 63 6b 65 72 20 36 34 40 0a 20 20 20 20 71 75 65  cker 64@.    que
9910: 75 65 20 24 40 20 62 6f 75 6e 64 73 20 3f 44 4f  ue $@ bounds ?DO
9920: 20 20 49 20 3e 6f 0a 09 36 34 64 75 70 20 71 75    I >o..64dup qu
9930: 65 75 65 2d 74 69 6d 65 73 74 61 6d 70 20 36 34  eue-timestamp 64
9940: 40 20 36 34 75 3e 20 49 46 0a 09 20 20 20 20 61  @ 64u> IF..    a
9950: 64 64 72 20 71 75 65 75 65 2d 78 74 20 40 20 71  ddr queue-xt @ q
9960: 75 65 75 65 2d 6a 6f 62 20 40 20 2e 65 78 65 63  ueue-job @ .exec
9970: 75 74 65 20 6f 3e 0a 09 20 20 20 20 71 75 65 75  ute o>..    queu
9980: 65 20 49 20 71 75 65 75 65 2d 73 74 72 75 63 74  e I queue-struct
9990: 20 64 65 6c 24 6f 6e 65 0a 09 20 20 20 20 75 6e   del$one..    un
99a0: 6c 6f 6f 70 20 71 75 65 75 65 20 6e 65 78 74 24  loop queue next$
99b0: 20 3f 44 4f 20 20 4e 4f 50 45 20 30 0a 09 45 4c   ?DO  NOPE 0..EL
99c0: 53 45 20 20 6f 3e 20 20 71 75 65 75 65 2d 73 74  SE  o>  queue-st
99d0: 72 75 63 74 20 20 54 48 45 4e 0a 20 20 20 20 2b  ruct  THEN.    +
99e0: 4c 4f 4f 50 20 20 36 34 64 72 6f 70 20 3b 0a 0a  LOOP  64drop ;..
99f0: 5c 20 70 6f 6c 6c 20 6c 6f 6f 70 0a 0a 3a 20 70  \ poll loop..: p
9a00: 72 65 70 2d 65 76 73 6f 63 6b 73 20 28 20 2d 2d  rep-evsocks ( --
9a10: 20 29 0a 20 20 20 20 65 70 69 70 65 72 20 40 20   ).    epiper @ 
9a20: 20 20 20 66 69 6c 65 6e 6f 20 50 4f 4c 4c 49 4e     fileno POLLIN
9a30: 20 70 6f 6c 6c 66 64 73 20 66 64 73 21 2b 20 64   pollfds fds!+ d
9a40: 72 6f 70 20 31 20 74 6f 20 70 6f 6c 6c 66 64 23  rop 1 to pollfd#
9a50: 20 3b 0a 0a 3a 20 63 6c 65 61 72 2d 65 76 65 6e   ;..: clear-even
9a60: 74 73 20 28 20 2d 2d 20 29 20 20 70 6f 6c 6c 66  ts ( -- )  pollf
9a70: 64 73 0a 20 20 20 20 70 6f 6c 6c 66 64 23 20 30  ds.    pollfd# 0
9a80: 20 44 4f 20 20 30 20 6f 76 65 72 20 72 65 76 65   DO  0 over reve
9a90: 6e 74 73 20 77 21 20 20 70 6f 6c 6c 66 64 20 2b  nts w!  pollfd +
9aa0: 20 20 4c 4f 4f 50 20 20 64 72 6f 70 20 3b 0a 0a    LOOP  drop ;..
9ab0: 3a 20 74 69 6d 65 6f 75 74 21 20 28 20 2d 2d 20  : timeout! ( -- 
9ac0: 29 0a 20 20 20 20 73 65 6e 64 65 72 2d 74 61 73  ).    sender-tas
9ad0: 6b 20 64 75 70 20 49 46 20 20 75 70 40 20 3d 20  k dup IF  up@ = 
9ae0: 20 45 4c 53 45 20 20 30 3d 20 20 54 48 45 4e 20   ELSE  0=  THEN 
9af0: 20 49 46 0a 09 6e 65 78 74 2d 63 68 75 6e 6b 2d   IF..next-chunk-
9b00: 74 69 63 6b 20 36 34 64 75 70 20 36 34 23 2d 31  tick 64dup 64#-1
9b10: 20 36 34 3d 20 30 3d 20 3e 72 20 74 69 63 6b 65   64= 0= >r ticke
9b20: 72 20 36 34 40 20 36 34 2d 20 36 34 64 75 70 20  r 64@ 64- 64dup 
9b30: 36 34 2d 30 3e 3d 20 72 3e 20 6f 72 0a 09 49 46  64-0>= r> or..IF
9b40: 20 20 20 20 36 34 23 30 20 36 34 6d 61 78 20 70      64#0 64max p
9b50: 6f 6c 6c 2d 74 69 6d 65 6f 75 74 23 20 6e 3e 36  oll-timeout# n>6
9b60: 34 20 36 34 6d 69 6e 20 36 34 3e 64 0a 09 45 4c  4 64min 64>d..EL
9b70: 53 45 20 20 36 34 64 72 6f 70 20 70 6f 6c 6c 2d  SE  64drop poll-
9b80: 74 69 6d 65 6f 75 74 23 20 30 20 20 54 48 45 4e  timeout# 0  THEN
9b90: 0a 20 20 20 20 45 4c 53 45 20 20 70 6f 6c 6c 2d  .    ELSE  poll-
9ba0: 74 69 6d 65 6f 75 74 23 20 30 20 20 54 48 45 4e  timeout# 0  THEN
9bb0: 20 20 70 74 69 6d 65 6f 75 74 20 32 21 20 3b 0a    ptimeout 2! ;.
9bc0: 0a 3a 20 6d 61 78 2d 74 69 6d 65 6f 75 74 21 20  .: max-timeout! 
9bd0: 28 20 2d 2d 20 29 20 70 6f 6c 6c 2d 74 69 6d 65  ( -- ) poll-time
9be0: 6f 75 74 23 20 30 20 70 74 69 6d 65 6f 75 74 20  out# 0 ptimeout 
9bf0: 32 21 20 3b 0a 0a 3a 20 3e 70 6f 6c 6c 20 28 20  2! ;..: >poll ( 
9c00: 61 64 64 72 20 75 20 2d 2d 20 66 6c 61 67 20 29  addr u -- flag )
9c10: 20 5c 20 70 72 65 70 2d 73 6f 63 6b 73 0a 5b 49   \ prep-socks.[I
9c20: 46 44 45 46 5d 20 70 70 6f 6c 6c 0a 20 20 20 20  FDEF] ppoll.    
9c30: 70 74 69 6d 65 6f 75 74 20 30 20 70 70 6f 6c 6c  ptimeout 0 ppoll
9c40: 20 30 3e 0a 5b 45 4c 53 45 5d 0a 20 20 20 20 70   0>.[ELSE].    p
9c50: 74 69 6d 65 6f 75 74 20 32 40 20 23 31 30 30 30  timeout 2@ #1000
9c60: 20 2a 20 73 77 61 70 20 23 31 30 30 30 30 30 30   * swap #1000000
9c70: 20 2f 20 2b 20 70 6f 6c 6c 20 30 3e 0a 5b 54 48   / + poll 0>.[TH
9c80: 45 4e 5d 20 2b 77 61 69 74 0a 3b 0a 0a 3a 20 77  EN] +wait.;..: w
9c90: 61 69 74 2d 73 65 6e 64 20 28 20 2d 2d 20 66 6c  ait-send ( -- fl
9ca0: 61 67 20 29 0a 20 20 20 20 28 20 63 6c 65 61 72  ag ).    ( clear
9cb0: 2d 65 76 65 6e 74 73 20 29 20 20 74 69 6d 65 6f  -events )  timeo
9cc0: 75 74 21 20 20 70 6f 6c 6c 66 64 73 20 70 6f 6c  ut!  pollfds pol
9cd0: 6c 66 64 23 20 3e 70 6f 6c 6c 20 3b 0a 0a 3a 20  lfd# >poll ;..: 
9ce0: 70 6f 6c 6c 2d 73 6f 63 6b 20 28 20 2d 2d 20 66  poll-sock ( -- f
9cf0: 6c 61 67 20 29 0a 20 20 20 20 65 76 61 6c 2d 71  lag ).    eval-q
9d00: 75 65 75 65 20 20 77 61 69 74 2d 73 65 6e 64 20  ueue  wait-send 
9d10: 3b 0a 0a 55 73 65 72 20 74 72 79 2d 72 65 61 64  ;..User try-read
9d20: 73 0a 34 20 56 61 6c 75 65 20 74 72 79 2d 72 65  s.4 Value try-re
9d30: 61 64 23 0a 0a 3a 20 72 65 61 64 2d 61 2d 70 61  ad#..: read-a-pa
9d40: 63 6b 65 74 34 2f 36 20 28 20 2d 2d 20 61 64 64  cket4/6 ( -- add
9d50: 72 20 75 20 29 0a 20 20 20 20 70 6f 6c 6c 66 64  r u ).    pollfd
9d60: 73 20 5b 20 70 6f 6c 6c 66 64 20 72 65 76 65 6e  s [ pollfd reven
9d70: 74 73 20 5d 4c 20 2b 20 77 40 20 50 4f 4c 4c 49  ts ]L + w@ POLLI
9d80: 4e 20 61 6e 64 20 49 46 20 20 74 72 79 2d 72 65  N and IF  try-re
9d90: 61 64 73 20 6f 66 66 0a 09 64 6f 2d 62 6c 6f 63  ads off..do-bloc
9da0: 6b 20 72 65 61 64 2d 61 2d 70 61 63 6b 65 74 0a  k read-a-packet.
9db0: 09 28 20 30 20 70 6f 6c 6c 66 64 73 20 5b 20 70  .( 0 pollfds [ p
9dc0: 6f 6c 6c 66 64 20 72 65 76 65 6e 74 73 20 5d 4c  ollfd revents ]L
9dd0: 20 2b 20 77 21 20 29 20 2b 72 65 63 20 45 58 49   + w! ) +rec EXI
9de0: 54 20 20 54 48 45 4e 0a 20 20 20 20 5b 49 46 44  T  THEN.    [IFD
9df0: 45 46 5d 20 6e 6f 2d 68 79 62 72 69 64 0a 09 70  EF] no-hybrid..p
9e00: 6f 6c 6c 66 64 73 20 5b 20 70 6f 6c 6c 66 64 20  ollfds [ pollfd 
9e10: 32 2a 20 72 65 76 65 6e 74 73 20 5d 4c 20 2b 20  2* revents ]L + 
9e20: 77 40 20 50 4f 4c 4c 49 4e 20 61 6e 64 20 49 46  w@ POLLIN and IF
9e30: 20 20 74 72 79 2d 72 65 61 64 73 20 6f 66 66 0a    try-reads off.
9e40: 09 20 20 20 20 64 6f 2d 62 6c 6f 63 6b 20 72 65  .    do-block re
9e50: 61 64 2d 61 2d 70 61 63 6b 65 74 34 0a 09 20 20  ad-a-packet4..  
9e60: 20 20 28 20 30 20 70 6f 6c 6c 66 64 73 20 5b 20    ( 0 pollfds [ 
9e70: 70 6f 6c 6c 66 64 20 32 2a 20 72 65 76 65 6e 74  pollfd 2* revent
9e80: 73 20 5d 4c 20 2b 20 77 21 20 29 20 2b 72 65 63  s ]L + w! ) +rec
9e90: 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20   EXIT  THEN.    
9ea0: 5b 54 48 45 4e 5d 0a 20 20 20 20 74 72 79 2d 72  [THEN].    try-r
9eb0: 65 61 64 23 20 74 72 79 2d 72 65 61 64 73 20 21  ead# try-reads !
9ec0: 20 20 30 20 30 20 3b 0a 0a 3a 20 72 65 61 64 2d    0 0 ;..: read-
9ed0: 65 76 65 6e 74 20 28 20 2d 2d 20 29 0a 20 20 20  event ( -- ).   
9ee0: 20 70 6f 6c 6c 66 64 73 20 72 65 76 65 6e 74 73   pollfds revents
9ef0: 20 77 40 20 50 4f 4c 4c 49 4e 20 61 6e 64 20 49   w@ POLLIN and I
9f00: 46 0a 09 3f 65 76 65 6e 74 73 20 20 5c 20 30 20  F..?events  \ 0 
9f10: 70 6f 6c 6c 66 64 73 20 72 65 76 65 6e 74 73 20  pollfds revents 
9f20: 77 21 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a  w!.    THEN ;..:
9f30: 20 74 72 79 2d 72 65 61 64 2d 70 61 63 6b 65 74   try-read-packet
9f40: 2d 77 61 69 74 20 28 20 2d 2d 20 61 64 64 72 20  -wait ( -- addr 
9f50: 75 20 2f 20 30 20 30 20 29 0a 20 20 20 20 5b 64  u / 0 0 ).    [d
9f60: 65 66 69 6e 65 64 5d 20 6e 6f 2d 68 79 62 72 69  efined] no-hybri
9f70: 64 20 28 20 5b 64 65 66 69 6e 65 64 5d 20 64 61  d ( [defined] da
9f80: 72 77 69 6e 20 29 20 5b 20 28 20 6f 72 20 29 20  rwin ) [ ( or ) 
9f90: 30 3d 20 5d 20 5b 49 46 5d 0a 09 74 72 79 2d 72  0= ] [IF]..try-r
9fa0: 65 61 64 23 20 74 72 79 2d 72 65 61 64 73 20 40  ead# try-reads @
9fb0: 20 3f 44 4f 0a 09 20 20 20 20 64 6f 6e 27 74 2d   ?DO..    don't-
9fc0: 62 6c 6f 63 6b 20 72 65 61 64 2d 61 2d 70 61 63  block read-a-pac
9fd0: 6b 65 74 0a 09 20 20 20 20 64 75 70 20 49 46 20  ket..    dup IF 
9fe0: 20 75 6e 6c 6f 6f 70 20 20 2b 72 65 63 20 20 45   unloop  +rec  E
9ff0: 58 49 54 20 20 54 48 45 4e 20 20 32 64 72 6f 70  XIT  THEN  2drop
a000: 0a 09 4c 4f 4f 50 0a 20 20 20 20 5b 54 48 45 4e  ..LOOP.    [THEN
a010: 5d 0a 20 20 20 20 70 6f 6c 6c 2d 73 6f 63 6b 20  ].    poll-sock 
a020: 49 46 20 72 65 61 64 2d 61 2d 70 61 63 6b 65 74  IF read-a-packet
a030: 34 2f 36 20 72 65 61 64 2d 65 76 65 6e 74 20 45  4/6 read-event E
a040: 4c 53 45 20 30 20 30 20 54 48 45 4e 20 3b 0a 0a  LSE 0 0 THEN ;..
a050: 34 20 56 61 6c 75 65 20 73 65 6e 64 73 23 0a 34  4 Value sends#.4
a060: 20 56 61 6c 75 65 20 73 65 6e 64 62 73 23 0a 31   Value sendbs#.1
a070: 36 20 56 61 6c 75 65 20 72 65 63 76 73 23 20 5c  6 Value recvs# \
a080: 20 62 61 6c 61 6e 63 65 20 72 65 63 65 69 76 65   balance receive
a090: 20 61 6e 64 20 73 65 6e 64 0a 56 61 72 69 61 62   and send.Variab
a0a0: 6c 65 20 72 65 63 76 66 6c 61 67 20 20 72 65 63  le recvflag  rec
a0b0: 76 66 6c 61 67 20 6f 66 66 0a 0a 5b 64 65 66 69  vflag off..[defi
a0c0: 6e 65 64 5d 20 6e 6f 2d 68 79 62 72 69 64 20 28  ned] no-hybrid (
a0d0: 20 5b 64 65 66 69 6e 65 64 5d 20 64 61 72 77 69   [defined] darwi
a0e0: 6e 20 6f 72 20 29 20 5b 49 46 5d 0a 20 20 20 20  n or ) [IF].    
a0f0: 27 20 74 72 79 2d 72 65 61 64 2d 70 61 63 6b 65  ' try-read-packe
a100: 74 2d 77 61 69 74 20 61 6c 69 61 73 20 72 65 61  t-wait alias rea
a110: 64 2d 61 2d 70 61 63 6b 65 74 3f 20 28 20 2d 2d  d-a-packet? ( --
a120: 20 61 64 64 72 20 75 20 29 0a 5b 45 4c 53 45 5d   addr u ).[ELSE]
a130: 0a 20 20 20 20 3a 20 72 65 61 64 2d 61 2d 70 61  .    : read-a-pa
a140: 63 6b 65 74 3f 20 28 20 2d 2d 20 61 64 64 72 20  cket? ( -- addr 
a150: 75 20 29 0a 09 64 6f 6e 27 74 2d 62 6c 6f 63 6b  u )..don't-block
a160: 20 72 65 61 64 2d 61 2d 70 61 63 6b 65 74 20 64   read-a-packet d
a170: 75 70 20 49 46 20 20 31 20 72 65 63 76 66 6c 61  up IF  1 recvfla
a180: 67 20 2b 21 20 20 54 48 45 4e 20 3b 0a 5b 54 48  g +!  THEN ;.[TH
a190: 45 4e 5d 0a 0a 3a 20 73 65 6e 64 2d 72 65 61 64  EN]..: send-read
a1a0: 2d 70 61 63 6b 65 74 20 28 20 2d 2d 20 61 64 64  -packet ( -- add
a1b0: 72 20 75 20 29 0a 20 20 20 20 72 65 63 76 73 23  r u ).    recvs#
a1c0: 20 72 65 63 76 66 6c 61 67 20 40 20 3e 20 49 46   recvflag @ > IF
a1d0: 20 20 72 65 61 64 2d 61 2d 70 61 63 6b 65 74 3f    read-a-packet?
a1e0: 20 64 75 70 20 3f 45 58 49 54 20 20 32 64 72 6f   dup ?EXIT  2dro
a1f0: 70 20 20 54 48 45 4e 0a 20 20 20 20 72 65 63 76  p  THEN.    recv
a200: 66 6c 61 67 20 6f 66 66 0a 20 20 20 20 23 30 2e  flag off.    #0.
a210: 20 73 65 6e 64 62 73 23 20 30 20 44 4f 0a 09 32   sendbs# 0 DO..2
a220: 64 72 6f 70 20 20 73 65 6e 64 2d 61 6e 79 74 68  drop  send-anyth
a230: 69 6e 67 3f 0a 09 73 65 6e 64 73 23 20 30 20 3f  ing?..sends# 0 ?
a240: 44 4f 0a 09 20 20 20 20 30 3d 20 49 46 20 20 74  DO..    0= IF  t
a250: 72 79 2d 72 65 61 64 2d 70 61 63 6b 65 74 2d 77  ry-read-packet-w
a260: 61 69 74 0a 09 09 64 75 70 20 49 46 20 20 55 4e  ait...dup IF  UN
a270: 4c 4f 4f 50 20 20 55 4e 4c 4f 4f 50 20 20 45 58  LOOP  UNLOOP  EX
a280: 49 54 20 20 54 48 45 4e 20 20 32 64 72 6f 70 20  IT  THEN  2drop 
a290: 20 54 48 45 4e 0a 09 20 20 20 20 73 65 6e 64 2d   THEN..    send-
a2a0: 61 6e 6f 74 68 65 72 2d 63 68 75 6e 6b 20 20 4c  another-chunk  L
a2b0: 4f 4f 50 20 20 64 72 6f 70 0a 20 20 20 20 72 65  OOP  drop.    re
a2c0: 61 64 2d 61 2d 70 61 63 6b 65 74 3f 20 64 75 70  ad-a-packet? dup
a2d0: 20 3f 4c 45 41 56 45 20 4c 4f 4f 50 20 3b 0a 0a   ?LEAVE LOOP ;..
a2e0: 3a 20 73 65 6e 64 2d 6c 6f 6f 70 20 28 20 2d 2d  : send-loop ( --
a2f0: 20 29 0a 20 20 20 20 73 65 6e 64 2d 61 6e 79 74   ).    send-anyt
a300: 68 69 6e 67 3f 0a 20 20 20 20 42 45 47 49 4e 20  hing?.    BEGIN 
a310: 20 30 3d 20 49 46 20 20 20 77 61 69 74 2d 73 65   0= IF   wait-se
a320: 6e 64 20 64 72 6f 70 20 72 65 61 64 2d 65 76 65  nd drop read-eve
a330: 6e 74 20 20 54 48 45 4e 0a 09 21 21 30 64 65 70  nt  THEN..!!0dep
a340: 74 68 21 21 20 73 65 6e 64 2d 61 6e 6f 74 68 65  th!! send-anothe
a350: 72 2d 63 68 75 6e 6b 20 20 41 47 41 49 4e 20 3b  r-chunk  AGAIN ;
a360: 0a 0a 3a 20 63 72 65 61 74 65 2d 73 65 6e 64 65  ..: create-sende
a370: 72 2d 74 61 73 6b 20 28 20 2d 2d 20 29 0a 20 20  r-task ( -- ).  
a380: 20 20 5b 3a 20 20 5c 20 2e 22 20 63 72 65 61 74    [:  \ ." creat
a390: 65 64 20 73 65 6e 64 65 72 20 74 61 73 6b 20 22  ed sender task "
a3a0: 20 75 70 40 20 68 65 78 2e 20 63 72 0a 09 70 72   up@ hex. cr..pr
a3b0: 65 70 2d 65 76 73 6f 63 6b 73 20 73 65 6e 64 2d  ep-evsocks send-
a3c0: 6c 6f 6f 70 20 3b 5d 20 31 20 6e 65 74 32 6f 2d  loop ;] 1 net2o-
a3d0: 74 61 73 6b 20 74 6f 20 73 65 6e 64 65 72 2d 74  task to sender-t
a3e0: 61 73 6b 20 3b 0a 0a 46 6f 72 77 61 72 64 20 68  ask ;..Forward h
a3f0: 61 6e 64 6c 65 2d 62 65 61 63 6f 6e 0a 46 6f 72  andle-beacon.For
a400: 77 61 72 64 20 68 61 6e 64 6c 65 2d 62 65 61 63  ward handle-beac
a410: 6f 6e 2b 68 61 73 68 0a 0a 3a 20 61 64 64 2d 73  on+hash..: add-s
a420: 6f 75 72 63 65 20 28 20 2d 2d 20 29 0a 20 20 20  ource ( -- ).   
a430: 20 73 6f 63 6b 61 64 64 72 3c 20 61 6c 65 6e 20   sockaddr< alen 
a440: 40 20 69 6e 73 65 72 74 2d 61 64 64 72 65 73 73  @ insert-address
a450: 20 69 6e 62 75 66 20 69 6e 73 2d 73 6f 75 72 63   inbuf ins-sourc
a460: 65 20 3b 0a 0a 3a 20 6e 65 78 74 2d 70 61 63 6b  e ;..: next-pack
a470: 65 74 20 28 20 2d 2d 20 61 64 64 72 20 75 20 29  et ( -- addr u )
a480: 0a 20 20 20 20 73 65 6e 64 65 72 2d 74 61 73 6b  .    sender-task
a490: 20 30 3d 20 49 46 20 20 73 65 6e 64 2d 72 65 61   0= IF  send-rea
a4a0: 64 2d 70 61 63 6b 65 74 20 20 45 4c 53 45 20 20  d-packet  ELSE  
a4b0: 74 72 79 2d 72 65 61 64 2d 70 61 63 6b 65 74 2d  try-read-packet-
a4c0: 77 61 69 74 20 20 54 48 45 4e 0a 20 20 20 20 64  wait  THEN.    d
a4d0: 75 70 20 6d 69 6e 70 61 63 6b 65 74 23 20 75 3e  up minpacket# u>
a4e0: 3d 20 49 46 0a 09 28 20 6e 61 74 28 20 2e 22 20  = IF..( nat( ." 
a4f0: 70 61 63 6b 65 74 20 66 72 6f 6d 3a 20 22 20 73  packet from: " s
a500: 6f 63 6b 61 64 64 72 3c 20 61 6c 65 6e 20 40 20  ockaddr< alen @ 
a510: 2e 61 64 64 72 65 73 73 20 63 72 20 29 0a 09 6f  .address cr )..o
a520: 76 65 72 20 70 61 63 6b 65 74 2d 73 69 7a 65 20  ver packet-size 
a530: 74 75 63 6b 20 75 3c 0a 09 68 65 61 64 65 72 28  tuck u<..header(
a540: 20 7e 7e 20 21 21 73 69 7a 65 21 21 20 29 65 6c   ~~ !!size!! )el
a550: 73 65 28 20 49 46 20 20 32 64 72 6f 70 20 30 20  se( IF  2drop 0 
a560: 30 20 45 58 49 54 20 20 54 48 45 4e 20 29 0a 09  0 EXIT  THEN )..
a570: 2b 6e 65 78 74 0a 09 45 58 49 54 0a 20 20 20 20  +next..EXIT.    
a580: 45 4c 53 45 0a 09 68 61 6e 64 6c 65 2d 62 65 61  ELSE..handle-bea
a590: 63 6f 6e 2b 68 61 73 68 20 20 20 30 20 30 0a 20  con+hash   0 0. 
a5a0: 20 20 20 54 48 45 4e 20 3b 0a 0a 30 20 56 61 6c     THEN ;..0 Val
a5b0: 75 65 20 64 75 6d 70 2d 66 64 0a 0a 5c 20 69 6e  ue dump-fd..\ in
a5c0: 20 6e 65 74 32 6f 20 3a 20 74 69 6d 65 6f 75 74   net2o : timeout
a5d0: 20 28 20 74 69 63 6b 73 20 2d 2d 20 29 20 5c 20   ( ticks -- ) \ 
a5e0: 70 72 69 6e 74 20 77 68 79 20 74 68 65 72 65 20  print why there 
a5f0: 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 73 65  is nothing to se
a600: 6e 64 0a 5c 20 20 20 20 20 61 63 6b 40 20 2e 3e  nd.\     ack@ .>
a610: 66 6c 79 62 75 72 73 74 20 6e 65 74 32 6f 3a 73  flyburst net2o:s
a620: 65 6e 64 2d 63 68 75 6e 6b 73 0a 5c 20 20 20 20  end-chunks.\    
a630: 20 74 69 6d 65 6f 75 74 28 20 2e 22 20 74 69 6d   timeout( ." tim
a640: 65 6f 75 74 3f 20 22 20 2e 74 69 63 6b 73 20 73  eout? " .ticks s
a650: 70 61 63 65 0a 5c 20 20 20 20 20 72 65 73 65 6e  pace.\     resen
a660: 64 3f 20 2e 20 64 61 74 61 2d 74 61 69 6c 3f 20  d? . data-tail? 
a670: 2e 20 64 61 74 61 2d 68 65 61 64 3f 20 2e 20 66  . data-head? . f
a680: 73 74 61 74 65 73 20 2e 0a 5c 20 20 20 20 20 63  states ..\     c
a690: 68 75 6e 6b 73 2b 20 3f 20 61 63 6b 40 20 2e 62  hunks+ ? ack@ .b
a6a0: 61 6e 64 77 69 64 74 68 3f 20 2e 20 6e 65 78 74  andwidth? . next
a6b0: 2d 63 68 75 6e 6b 2d 74 69 63 6b 20 2e 74 69 63  -chunk-tick .tic
a6c0: 6b 73 20 63 72 0a 5c 20 20 20 20 20 64 61 74 61  ks cr.\     data
a6d0: 2d 72 6d 61 70 20 40 20 77 69 74 68 20 6d 61 70  -rmap @ with map
a6e0: 63 20 64 61 74 61 2d 61 63 6b 62 69 74 73 20 40  c data-ackbits @
a6f0: 20 64 65 73 74 2d 73 69 7a 65 20 61 64 64 72 3e   dest-size addr>
a700: 62 79 74 65 73 20 64 75 6d 70 20 65 6e 64 77 69  bytes dump endwi
a710: 74 68 0a 5c 20 20 20 20 20 29 65 6c 73 65 28 20  th.\     )else( 
a720: 36 34 64 72 6f 70 20 29 20 3b 0a 0a 5c 20 74 69  64drop ) ;..\ ti
a730: 6d 65 6f 75 74 20 68 61 6e 64 6c 69 6e 67 0a 0a  meout handling..
a740: 23 31 30 2e 30 30 30 2e 30 30 30 2e 30 30 30 20  #10.000.000.000 
a750: 64 3e 36 34 20 36 34 56 61 6c 75 65 20 74 69 6d  d>64 64Value tim
a760: 65 6f 75 74 2d 6d 61 78 23 20 5c 20 31 30 73 20  eout-max# \ 10s 
a770: 6d 61 78 69 6d 75 6d 20 74 69 6d 65 6f 75 74 0a  maximum timeout.
a780: 23 31 30 30 2e 30 30 30 2e 30 30 30 20 64 3e 36  #100.000.000 d>6
a790: 34 20 36 34 56 61 6c 75 65 20 74 69 6d 65 6f 75  4 64Value timeou
a7a0: 74 2d 6d 69 6e 23 20 5c 20 31 30 30 6d 73 20 6d  t-min# \ 100ms m
a7b0: 69 6e 69 6d 75 6d 20 74 69 6d 65 6f 75 74 0a 0a  inimum timeout..
a7c0: 53 65 6d 61 20 74 69 6d 65 6f 75 74 2d 73 65 6d  Sema timeout-sem
a7d0: 61 0a 56 61 72 69 61 62 6c 65 20 74 69 6d 65 6f  a.Variable timeo
a7e0: 75 74 2d 74 61 73 6b 73 0a 0a 3a 20 73 71 32 2a  ut-tasks..: sq2*
a7f0: 2a 20 28 20 36 34 6e 20 6e 20 2d 2d 20 36 34 6e  * ( 64n n -- 64n
a800: 27 20 29 0a 20 20 20 20 64 75 70 20 31 20 61 6e  ' ).    dup 1 an
a810: 64 20 3e 72 20 32 2f 20 36 34 6c 73 68 69 66 74  d >r 2/ 64lshift
a820: 20 72 3e 20 49 46 20 20 36 34 64 75 70 20 36 34   r> IF  64dup 64
a830: 2d 32 2f 20 36 34 2b 20 20 54 48 45 4e 20 3b 0a  -2/ 64+  THEN ;.
a840: 3a 20 3e 74 69 6d 65 6f 75 74 20 28 20 36 34 6e  : >timeout ( 64n
a850: 20 6e 20 2d 2d 20 36 34 6e 20 29 0a 20 20 20 20   n -- 64n ).    
a860: 3e 72 20 36 34 2d 32 2a 20 74 69 6d 65 6f 75 74  >r 64-2* timeout
a870: 2d 6d 69 6e 23 20 36 34 6d 61 78 20 72 3e 20 73  -min# 64max r> s
a880: 71 32 2a 2a 20 74 69 6d 65 6f 75 74 2d 6d 61 78  q2** timeout-max
a890: 23 20 36 34 6d 69 6e 20 3b 0a 3a 20 2b 6e 65 78  # 64min ;.: +nex
a8a0: 74 2d 74 69 6d 65 6f 75 74 73 20 28 20 2d 2d 20  t-timeouts ( -- 
a8b0: 74 69 6d 65 6f 75 74 20 29 0a 20 20 20 20 72 74  timeout ).    rt
a8c0: 64 65 6c 61 79 20 36 34 40 20 74 69 6d 65 6f 75  delay 64@ timeou
a8d0: 74 73 20 40 20 3e 74 69 6d 65 6f 75 74 20 74 69  ts @ >timeout ti
a8e0: 63 6b 73 20 36 34 2b 20 3b 0a 3a 20 2b 74 69 6d  cks 64+ ;.: +tim
a8f0: 65 6f 75 74 73 20 28 20 2d 2d 20 74 69 6d 65 6f  eouts ( -- timeo
a900: 75 74 20 29 20 0a 20 20 20 20 2b 6e 65 78 74 2d  ut ) .    +next-
a910: 74 69 6d 65 6f 75 74 73 20 31 20 74 69 6d 65 6f  timeouts 1 timeo
a920: 75 74 73 20 2b 21 20 28 20 40 20 2e 22 20 54 4f  uts +! ( @ ." TO
a930: 20 69 6e 63 3a 20 22 20 2e 20 63 72 20 29 20 3b   inc: " . cr ) ;
a940: 0a 3a 20 2b 74 69 6d 65 6f 75 74 30 20 28 20 2d  .: +timeout0 ( -
a950: 2d 20 74 69 6d 65 6f 75 74 20 29 0a 20 20 20 20  - timeout ).    
a960: 72 74 64 65 6c 61 79 20 36 34 40 20 74 69 63 6b  rtdelay 64@ tick
a970: 65 72 20 36 34 40 20 36 34 2b 20 3b 0a 3a 20 30  er 64@ 64+ ;.: 0
a980: 74 69 6d 65 6f 75 74 20 28 20 2d 2d 20 29 0a 20  timeout ( -- ). 
a990: 20 20 20 30 20 61 63 6b 40 20 2e 74 69 6d 65 6f     0 ack@ .timeo
a9a0: 75 74 73 20 21 40 20 20 49 46 20 20 74 69 6d 65  uts !@  IF  time
a9b0: 6f 75 74 2d 74 61 73 6b 20 77 61 6b 65 20 20 54  out-task wake  T
a9c0: 48 45 4e 0a 20 20 20 20 61 63 6b 40 20 2e 2b 6e  HEN.    ack@ .+n
a9d0: 65 78 74 2d 74 69 6d 65 6f 75 74 73 20 6e 65 78  ext-timeouts nex
a9e0: 74 2d 74 69 6d 65 6f 75 74 20 36 34 21 20 3b 0a  t-timeout 64! ;.
a9f0: 0a 3a 20 6f 2b 74 69 6d 65 6f 75 74 20 28 20 2d  .: o+timeout ( -
aa00: 2d 20 29 20 20 30 74 69 6d 65 6f 75 74 0a 20 20  - )  0timeout.  
aa10: 20 20 74 69 6d 65 6f 75 74 28 20 2e 22 20 2b 74    timeout( ." +t
aa20: 69 6d 65 6f 75 74 3a 20 22 20 6f 20 68 65 78 2e  imeout: " o hex.
aa30: 20 2e 22 20 74 61 73 6b 3a 20 22 20 74 61 73 6b   ." task: " task
aa40: 23 20 3f 20 61 64 64 72 20 74 69 6d 65 6f 75 74  # ? addr timeout
aa50: 2d 78 74 20 40 20 2e 6e 61 6d 65 20 63 72 20 29  -xt @ .name cr )
aa60: 0a 20 20 20 20 5b 3a 20 74 69 6d 65 6f 75 74 2d  .    [: timeout-
aa70: 74 61 73 6b 73 20 24 40 20 62 6f 75 6e 64 73 20  tasks $@ bounds 
aa80: 3f 44 4f 20 20 49 20 40 20 6f 20 3d 20 49 46 0a  ?DO  I @ o = IF.
aa90: 09 20 20 20 20 20 20 55 4e 4c 4f 4f 50 20 20 45  .      UNLOOP  E
aaa0: 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20 20 20  XIT  THEN.      
aab0: 63 65 6c 6c 20 2b 4c 4f 4f 50 0a 20 20 20 20 20  cell +LOOP.     
aac0: 20 6f 20 7b 20 77 5e 20 74 69 6d 65 6f 75 74 2d   o { w^ timeout-
aad0: 6f 20 7d 20 20 74 69 6d 65 6f 75 74 2d 6f 20 63  o }  timeout-o c
aae0: 65 6c 6c 20 74 69 6d 65 6f 75 74 2d 74 61 73 6b  ell timeout-task
aaf0: 73 20 24 2b 21 20 3b 5d 0a 20 20 20 20 74 69 6d  s $+! ;].    tim
ab00: 65 6f 75 74 2d 73 65 6d 61 20 63 2d 73 65 63 74  eout-sema c-sect
ab10: 69 6f 6e 20 20 74 69 6d 65 6f 75 74 2d 74 61 73  ion  timeout-tas
ab20: 6b 20 77 61 6b 65 20 3b 0a 3a 20 6f 2d 74 69 6d  k wake ;.: o-tim
ab30: 65 6f 75 74 20 28 20 2d 2d 20 29 0a 20 20 20 20  eout ( -- ).    
ab40: 30 74 69 6d 65 6f 75 74 20 20 74 69 6d 65 6f 75  0timeout  timeou
ab50: 74 28 20 2e 22 20 2d 74 69 6d 65 6f 75 74 3a 20  t( ." -timeout: 
ab60: 22 20 6f 20 68 65 78 2e 20 2e 22 20 74 61 73 6b  " o hex. ." task
ab70: 3a 20 22 20 74 61 73 6b 23 20 3f 20 63 72 20 29  : " task# ? cr )
ab80: 0a 20 20 20 20 5b 3a 20 6f 20 74 69 6d 65 6f 75  .    [: o timeou
ab90: 74 2d 74 61 73 6b 73 20 64 65 6c 24 63 65 6c 6c  t-tasks del$cell
aba0: 20 3b 5d 20 74 69 6d 65 6f 75 74 2d 73 65 6d 61   ;] timeout-sema
abb0: 20 63 2d 73 65 63 74 69 6f 6e 20 3b 0a 0a 3a 20   c-section ;..: 
abc0: 3e 6e 65 78 74 2d 74 69 6d 65 6f 75 74 20 28 20  >next-timeout ( 
abd0: 2d 2d 20 29 20 20 61 63 6b 40 20 2e 2b 74 69 6d  -- )  ack@ .+tim
abe0: 65 6f 75 74 73 20 6e 65 78 74 2d 74 69 6d 65 6f  eouts next-timeo
abf0: 75 74 20 36 34 21 20 3b 0a 3a 20 36 34 6d 69 6e  ut 64! ;.: 64min
ac00: 3f 20 28 20 61 20 62 20 2d 2d 20 6d 69 6e 20 66  ? ( a b -- min f
ac10: 6c 61 67 20 29 0a 20 20 20 20 36 34 6f 76 65 72  lag ).    64over
ac20: 20 36 34 6f 76 65 72 20 36 34 3c 20 49 46 20 20   64over 64< IF  
ac30: 36 34 64 72 6f 70 20 66 61 6c 73 65 20 20 45 4c  64drop false  EL
ac40: 53 45 20 20 36 34 6e 69 70 20 74 72 75 65 20 20  SE  64nip true  
ac50: 54 48 45 4e 20 3b 0a 3a 20 6e 65 78 74 2d 74 69  THEN ;.: next-ti
ac60: 6d 65 6f 75 74 3f 20 28 20 2d 2d 20 74 69 6d 65  meout? ( -- time
ac70: 20 63 6f 6e 74 65 78 74 20 29 20 5b 3a 20 30 20   context ) [: 0 
ac80: 7b 20 63 74 78 20 7d 20 6d 61 78 2d 69 6e 74 36  { ctx } max-int6
ac90: 34 0a 20 20 20 20 74 69 6d 65 6f 75 74 2d 74 61  4.    timeout-ta
aca0: 73 6b 73 20 24 40 20 62 6f 75 6e 64 73 20 3f 44  sks $@ bounds ?D
acb0: 4f 0a 09 49 20 40 20 2e 6e 65 78 74 2d 74 69 6d  O..I @ .next-tim
acc0: 65 6f 75 74 20 36 34 40 20 36 34 6d 69 6e 3f 20  eout 64@ 64min? 
acd0: 49 46 20 20 49 20 40 20 74 6f 20 63 74 78 20 20  IF  I @ to ctx  
ace0: 54 48 45 4e 0a 20 20 20 20 63 65 6c 6c 20 2b 4c  THEN.    cell +L
acf0: 4f 4f 50 20 20 63 74 78 20 3b 5d 20 74 69 6d 65  OOP  ctx ;] time
ad00: 6f 75 74 2d 73 65 6d 61 20 63 2d 73 65 63 74 69  out-sema c-secti
ad10: 6f 6e 20 3b 0a 3a 20 3f 74 69 6d 65 6f 75 74 20  on ;.: ?timeout 
ad20: 28 20 2d 2d 20 63 6f 6e 74 65 78 74 2f 30 20 29  ( -- context/0 )
ad30: 0a 20 20 20 20 74 69 63 6b 65 72 20 36 34 40 20  .    ticker 64@ 
ad40: 6e 65 78 74 2d 74 69 6d 65 6f 75 74 3f 20 3e 72  next-timeout? >r
ad50: 20 36 34 2d 20 36 34 2d 30 3e 3d 20 72 3e 20 61   64- 64-0>= r> a
ad60: 6e 64 20 3b 0a 0a 3a 20 2d 74 69 6d 65 6f 75 74  nd ;..: -timeout
ad70: 20 20 20 20 20 20 5b 27 5d 20 6e 6f 2d 74 69 6d        ['] no-tim
ad80: 65 6f 75 74 20 20 69 73 20 74 69 6d 65 6f 75 74  eout  is timeout
ad90: 2d 78 74 20 6f 2d 74 69 6d 65 6f 75 74 20 3b 0a  -xt o-timeout ;.
ada0: 0a 5c 20 68 61 6e 64 6c 69 6e 67 20 6c 61 73 74  .\ handling last
adb0: 20 70 61 63 6b 65 74 73 0a 0a 62 65 67 69 6e 2d   packets..begin-
adc0: 73 74 72 75 63 74 75 72 65 20 6c 61 73 74 2d 70  structure last-p
add0: 61 63 6b 65 74 0a 20 20 20 20 36 34 76 61 6c 75  acket.    64valu
ade0: 65 3a 20 6c 70 2d 61 64 64 72 0a 20 20 20 20 36  e: lp-addr.    6
adf0: 34 76 61 6c 75 65 3a 20 6c 70 2d 74 69 6d 65 0a  4value: lp-time.
ae00: 20 20 20 20 24 76 61 6c 75 65 3a 20 6c 70 24 0a      $value: lp$.
ae10: 65 6e 64 2d 73 74 72 75 63 74 75 72 65 0a 0a 6c  end-structure..l
ae20: 61 73 74 2d 70 61 63 6b 65 74 20 62 75 66 66 65  ast-packet buffe
ae30: 72 3a 20 6c 61 73 74 2d 70 61 63 6b 65 74 2d 64  r: last-packet-d
ae40: 65 73 63 0a 0a 56 61 72 69 61 62 6c 65 20 6c 61  esc..Variable la
ae50: 73 74 2d 70 61 63 6b 65 74 73 0a 0a 53 65 6d 61  st-packets..Sema
ae60: 20 6c 70 2d 73 65 6d 61 0a 0a 3a 20 6c 61 73 74   lp-sema..: last
ae70: 2d 70 61 63 6b 65 74 21 20 28 20 2d 2d 20 29 0a  -packet! ( -- ).
ae80: 20 20 20 20 75 6e 68 61 6e 64 6c 65 64 28 20 2e      unhandled( .
ae90: 22 20 6c 61 73 74 20 70 61 63 6b 65 74 20 40 22  " last packet @"
aea0: 20 64 65 73 74 2d 61 64 64 72 20 36 34 40 20 78   dest-addr 64@ x
aeb0: 36 34 2e 20 63 72 20 29 0a 20 20 20 20 6f 75 74  64. cr ).    out
aec0: 62 75 66 20 64 75 70 20 70 61 63 6b 65 74 2d 73  buf dup packet-s
aed0: 69 7a 65 20 6c 61 73 74 2d 70 61 63 6b 65 74 2d  ize last-packet-
aee0: 64 65 73 63 20 74 6f 20 6c 70 24 0a 20 20 20 20  desc to lp$.    
aef0: 64 65 73 74 2d 61 64 64 72 20 36 34 40 20 6c 61  dest-addr 64@ la
af00: 73 74 2d 70 61 63 6b 65 74 2d 64 65 73 63 20 74  st-packet-desc t
af10: 6f 20 6c 70 2d 61 64 64 72 0a 20 20 20 20 74 69  o lp-addr.    ti
af20: 63 6b 73 20 6c 61 73 74 2d 70 61 63 6b 65 74 2d  cks last-packet-
af30: 64 65 73 63 20 74 6f 20 6c 70 2d 74 69 6d 65 0a  desc to lp-time.
af40: 20 20 20 20 5b 3a 20 6c 61 73 74 2d 70 61 63 6b      [: last-pack
af50: 65 74 2d 64 65 73 63 20 6c 61 73 74 2d 70 61 63  et-desc last-pac
af60: 6b 65 74 20 6c 61 73 74 2d 70 61 63 6b 65 74 73  ket last-packets
af70: 20 24 2b 21 20 3b 5d 0a 20 20 20 20 6c 70 2d 73   $+! ;].    lp-s
af80: 65 6d 61 20 63 2d 73 65 63 74 69 6f 6e 0a 20 20  ema c-section.  
af90: 20 20 6c 61 73 74 2d 70 61 63 6b 65 74 2d 64 65    last-packet-de
afa0: 73 63 20 61 64 64 72 20 6c 70 24 20 6f 66 66 20  sc addr lp$ off 
afb0: 3b 0a 0a 3a 20 6c 61 73 74 2d 70 61 63 6b 65 74  ;..: last-packet
afc0: 3f 20 28 20 61 64 64 72 20 2d 2d 20 66 6c 61 67  ? ( addr -- flag
afd0: 20 29 0a 20 20 20 20 5b 3a 20 6c 61 73 74 2d 70   ).    [: last-p
afe0: 61 63 6b 65 74 73 20 24 40 20 62 6f 75 6e 64 73  ackets $@ bounds
aff0: 20 55 2b 44 4f 0a 09 20 20 36 34 64 75 70 20 49   U+DO..  64dup I
b000: 20 6c 70 2d 61 64 64 72 20 36 34 3d 20 49 46 0a   lp-addr 64= IF.
b010: 09 20 20 20 20 20 20 75 6e 68 61 6e 64 6c 65 64  .      unhandled
b020: 28 20 2e 22 20 72 65 73 65 6e 64 20 6c 61 73 74  ( ." resend last
b030: 20 70 61 63 6b 65 74 20 40 22 20 36 34 64 75 70   packet @" 64dup
b040: 20 78 36 34 2e 20 63 72 20 29 0a 09 20 20 20 20   x64. cr )..    
b050: 20 20 49 20 6c 70 24 20 6f 76 65 72 20 30 20 73    I lp$ over 0 s
b060: 77 61 70 20 70 61 63 6b 65 74 2d 72 6f 75 74 65  wap packet-route
b070: 20 64 72 6f 70 20 73 65 6e 64 2d 61 2d 70 61 63   drop send-a-pac
b080: 6b 65 74 20 3f 6d 73 67 73 69 7a 65 0a 09 20 20  ket ?msgsize..  
b090: 20 20 20 20 36 34 64 72 6f 70 20 74 72 75 65 20      64drop true 
b0a0: 75 6e 6c 6f 6f 70 20 20 45 58 49 54 0a 09 20 20  unloop  EXIT..  
b0b0: 54 48 45 4e 0a 20 20 20 20 20 20 6c 61 73 74 2d  THEN.      last-
b0c0: 70 61 63 6b 65 74 20 2b 4c 4f 4f 50 20 20 36 34  packet +LOOP  64
b0d0: 64 72 6f 70 20 66 61 6c 73 65 20 3b 5d 20 6c 70  drop false ;] lp
b0e0: 2d 73 65 6d 61 20 63 2d 73 65 63 74 69 6f 6e 20  -sema c-section 
b0f0: 3b 0a 0a 3a 20 6c 61 73 74 2d 70 61 63 6b 65 74  ;..: last-packet
b100: 2d 74 6f 73 20 28 20 2d 2d 20 29 0a 20 20 20 20  -tos ( -- ).    
b110: 74 69 63 6b 73 20 63 6f 6e 6e 65 63 74 2d 74 69  ticks connect-ti
b120: 6d 65 6f 75 74 23 20 36 34 2d 0a 20 20 20 20 5b  meout# 64-.    [
b130: 3a 20 6c 61 73 74 2d 70 61 63 6b 65 74 73 20 24  : last-packets $
b140: 40 20 62 6f 75 6e 64 73 20 55 2b 44 4f 0a 09 20  @ bounds U+DO.. 
b150: 20 36 34 64 75 70 20 49 20 6c 70 2d 74 69 6d 65   64dup I lp-time
b160: 20 36 34 75 3e 20 49 46 0a 09 20 20 20 20 20 20   64u> IF..      
b170: 49 20 61 64 64 72 20 6c 70 24 20 24 66 72 65 65  I addr lp$ $free
b180: 0a 09 20 20 45 4c 53 45 0a 09 20 20 20 20 20 20  ..  ELSE..      
b190: 6c 61 73 74 2d 70 61 63 6b 65 74 73 20 30 20 49  last-packets 0 I
b1a0: 20 6c 61 73 74 2d 70 61 63 6b 65 74 73 20 24 40   last-packets $@
b1b0: 20 64 72 6f 70 20 2d 20 24 64 65 6c 0a 09 20 20   drop - $del..  
b1c0: 20 20 20 20 36 34 64 72 6f 70 20 75 6e 6c 6f 6f      64drop unloo
b1d0: 70 20 20 45 58 49 54 0a 09 20 20 54 48 45 4e 0a  p  EXIT..  THEN.
b1e0: 20 20 20 20 20 20 6c 61 73 74 2d 70 61 63 6b 65        last-packe
b1f0: 74 20 2b 4c 4f 4f 50 20 20 36 34 64 72 6f 70 20  t +LOOP  64drop 
b200: 20 73 22 20 22 20 6c 61 73 74 2d 70 61 63 6b 65   s" " last-packe
b210: 74 73 20 24 21 20 3b 5d 0a 20 20 20 20 6c 70 2d  ts $! ;].    lp-
b220: 73 65 6d 61 20 63 2d 73 65 63 74 69 6f 6e 20 3b  sema c-section ;
b230: 0a 0a 5c 20 68 61 6e 64 6c 69 6e 67 20 70 61 63  ..\ handling pac
b240: 6b 65 74 73 0a 0a 46 6f 72 77 61 72 64 20 63 6d  kets..Forward cm
b250: 64 2d 65 78 65 63 20 28 20 61 64 64 72 20 75 20  d-exec ( addr u 
b260: 2d 2d 20 29 0a 0a 3a 20 21 21 3c 6f 72 64 65 72  -- )..: !!<order
b270: 3f 20 20 20 28 20 6e 20 2d 2d 20 29 20 20 64 75  ?   ( n -- )  du
b280: 70 20 63 2d 73 74 61 74 65 20 40 20 75 3e 20 20  p c-state @ u>  
b290: 21 21 69 6e 76 2d 6f 72 64 65 72 21 21 20 63 2d  !!inv-order!! c-
b2a0: 73 74 61 74 65 20 6f 72 21 20 3b 0a 3a 20 21 21  state or! ;.: !!
b2b0: 3e 6f 72 64 65 72 3f 20 20 20 28 20 6e 20 2d 2d  >order?   ( n --
b2c0: 20 29 20 20 64 75 70 20 63 2d 73 74 61 74 65 20   )  dup c-state 
b2d0: 40 20 75 3c 3d 20 21 21 69 6e 76 2d 6f 72 64 65  @ u<= !!inv-orde
b2e0: 72 21 21 20 63 2d 73 74 61 74 65 20 6f 72 21 20  r!! c-state or! 
b2f0: 3b 0a 3a 20 21 21 3e 3d 6f 72 64 65 72 3f 20 20  ;.: !!>=order?  
b300: 20 28 20 6e 20 2d 2d 20 29 20 20 64 75 70 20 63   ( n -- )  dup c
b310: 2d 73 74 61 74 65 20 40 20 6f 76 65 72 20 31 2d  -state @ over 1-
b320: 20 69 6e 76 65 72 74 20 61 6e 64 20 75 3c 20 21   invert and u< !
b330: 21 69 6e 76 2d 6f 72 64 65 72 21 21 20 63 2d 73  !inv-order!! c-s
b340: 74 61 74 65 20 6f 72 21 20 3b 0a 3a 20 21 21 3c  tate or! ;.: !!<
b350: 3e 6f 72 64 65 72 3f 20 20 20 28 20 6e 31 20 6e  >order?   ( n1 n
b360: 32 20 2d 2d 20 29 20 20 64 75 70 20 3e 72 0a 20  2 -- )  dup >r. 
b370: 20 20 20 63 2d 73 74 61 74 65 20 40 20 2d 72 6f     c-state @ -ro
b380: 74 20 73 77 61 70 20 77 69 74 68 69 6e 20 21 21  t swap within !!
b390: 69 6e 76 2d 6f 72 64 65 72 21 21 20 72 3e 20 63  inv-order!! r> c
b3a0: 2d 73 74 61 74 65 20 6f 72 21 20 3b 0a 3a 20 21  -state or! ;.: !
b3b0: 21 3c 3e 3d 6f 72 64 65 72 3f 20 20 20 28 20 6e  !<>=order?   ( n
b3c0: 31 20 6e 32 20 2d 2d 20 29 20 20 64 75 70 20 3e  1 n2 -- )  dup >
b3d0: 72 20 31 2b 0a 20 20 20 20 63 2d 73 74 61 74 65  r 1+.    c-state
b3e0: 20 40 20 2d 72 6f 74 20 73 77 61 70 20 77 69 74   @ -rot swap wit
b3f0: 68 69 6e 20 21 21 69 6e 76 2d 6f 72 64 65 72 21  hin !!inv-order!
b400: 21 20 72 3e 20 63 2d 73 74 61 74 65 20 6f 72 21  ! r> c-state or!
b410: 20 3b 0a 0a 55 73 65 72 20 72 65 6d 6f 74 65 3f   ;..User remote?
b420: 0a 0a 3a 20 68 61 6e 64 6c 65 2d 63 6d 64 30 20  ..: handle-cmd0 
b430: 28 20 2d 2d 20 29 20 5c 20 68 61 6e 64 6c 65 20  ( -- ) \ handle 
b440: 70 61 63 6b 65 74 20 74 6f 20 61 64 64 72 65 73  packet to addres
b450: 73 20 30 0a 20 20 20 20 63 6d 64 30 28 20 2e 74  s 0.    cmd0( .t
b460: 69 6d 65 20 2e 22 20 68 61 6e 64 6c 65 20 63 6d  ime ." handle cm
b470: 64 30 20 22 20 73 6f 63 6b 61 64 64 72 3c 20 61  d0 " sockaddr< a
b480: 6c 65 6e 20 40 20 2e 61 64 64 72 65 73 73 20 63  len @ .address c
b490: 72 20 29 0a 20 20 20 20 30 20 3e 6f 20 72 64 72  r ).    0 >o rdr
b4a0: 6f 70 20 72 65 6d 6f 74 65 3f 20 6f 6e 20 5c 20  op remote? on \ 
b4b0: 61 64 64 72 65 73 73 20 30 20 68 61 73 20 6e 6f  address 0 has no
b4c0: 20 6a 6f 62 20 63 6f 6e 74 65 78 74 21 0a 20 20   job context!.  
b4d0: 20 20 69 6e 62 75 66 30 2d 64 65 63 72 79 70 74    inbuf0-decrypt
b4e0: 20 30 3d 20 49 46 0a 09 69 6e 76 61 6c 69 64 28   0= IF..invalid(
b4f0: 20 2e 22 20 69 6e 76 61 6c 69 64 20 70 61 63 6b   ." invalid pack
b500: 65 74 20 74 6f 20 30 22 20 63 72 20 29 20 45 58  et to 0" cr ) EX
b510: 49 54 20 20 54 48 45 4e 0a 20 20 20 20 61 64 64  IT  THEN.    add
b520: 2d 73 6f 75 72 63 65 20 20 3e 72 65 74 2d 61 64  -source  >ret-ad
b530: 64 72 0a 20 20 20 20 76 61 6c 69 64 61 74 65 64  dr.    validated
b540: 20 6f 66 66 20 20 20 20 20 5c 20 77 65 20 68 61   off     \ we ha
b550: 76 65 20 6e 6f 20 76 61 6c 69 64 61 74 65 64 20  ve no validated 
b560: 65 6e 63 72 79 70 74 69 6f 6e 2c 20 6f 6e 6c 79  encryption, only
b570: 20 61 6e 6f 6e 79 6d 6f 75 73 0a 20 20 20 20 64   anonymous.    d
b580: 6f 2d 6b 65 79 70 61 64 20 73 65 63 2d 66 72 65  o-keypad sec-fre
b590: 65 20 5c 20 6e 6f 20 6b 65 79 20 65 78 63 68 61  e \ no key excha
b5a0: 6e 67 65 20 6d 61 79 20 68 61 76 65 20 68 61 70  nge may have hap
b5b0: 70 65 6e 65 64 0a 20 20 20 20 24 65 72 72 6f 72  pened.    $error
b5c0: 2d 69 64 20 24 6f 66 66 20 20 20 20 5c 20 6e 6f  -id $off    \ no
b5d0: 20 65 72 72 6f 72 20 69 64 20 73 6f 20 66 61 72   error id so far
b5e0: 0a 20 20 20 20 73 74 61 74 65 6c 65 73 73 23 20  .    stateless# 
b5f0: 6f 75 74 66 6c 61 67 20 21 20 20 74 6d 70 2d 70  outflag !  tmp-p
b600: 65 72 6d 20 6f 66 66 0a 20 20 20 20 69 6e 62 75  erm off.    inbu
b610: 66 20 70 61 63 6b 65 74 2d 64 61 74 61 20 63 6d  f packet-data cm
b620: 64 2d 65 78 65 63 0a 20 20 20 20 75 70 64 61 74  d-exec.    updat
b630: 65 2d 63 64 6d 61 70 20 20 6e 65 74 32 6f 3a 75  e-cdmap  net2o:u
b640: 70 64 61 74 65 2d 6b 65 79 20 20 72 65 6d 6f 74  pdate-key  remot
b650: 65 3f 20 6f 66 66 20 3b 0a 0a 73 63 6f 70 65 7b  e? off ;..scope{
b660: 20 6d 61 70 63 0a 0a 3a 20 68 61 6e 64 6c 65 2d   mapc..: handle-
b670: 64 61 74 61 20 28 20 61 64 64 72 20 2d 2d 20 29  data ( addr -- )
b680: 20 70 61 72 65 6e 74 20 3e 6f 20 20 6f 20 74 6f   parent >o  o to
b690: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
b6a0: 6d 73 67 28 20 2e 22 20 48 61 6e 64 6c 65 20 64  msg( ." Handle d
b6b0: 61 74 61 20 22 20 69 6e 62 75 66 20 68 64 72 66  ata " inbuf hdrf
b6c0: 6c 61 67 73 20 62 65 2d 75 77 40 20 68 65 78 2e  lags be-uw@ hex.
b6d0: 20 2e 22 20 74 6f 20 61 64 64 72 3a 20 22 20 69   ." to addr: " i
b6e0: 6e 62 75 66 20 6d 61 70 61 64 64 72 20 6c 65 2d  nbuf mapaddr le-
b6f0: 36 34 40 20 68 65 78 2e 20 63 72 20 29 0a 20 20  64@ hex. cr ).  
b700: 20 20 3e 72 20 69 6e 62 75 66 20 70 61 63 6b 65    >r inbuf packe
b710: 74 2d 64 61 74 61 20 72 3e 20 73 77 61 70 20 6d  t-data r> swap m
b720: 6f 76 65 0a 20 20 20 20 2b 69 6e 6d 6f 76 65 20  ove.    +inmove 
b730: 61 63 6b 2d 78 74 20 2b 61 63 6b 20 30 74 69 6d  ack-xt +ack 0tim
b740: 65 6f 75 74 20 6f 3e 20 3b 0a 27 20 68 61 6e 64  eout o> ;.' hand
b750: 6c 65 2d 64 61 74 61 20 72 64 61 74 61 2d 63 6c  le-data rdata-cl
b760: 61 73 73 20 74 6f 20 68 61 6e 64 6c 65 0a 27 20  ass to handle.' 
b770: 64 72 6f 70 20 64 61 74 61 2d 63 6c 61 73 73 20  drop data-class 
b780: 74 6f 20 68 61 6e 64 6c 65 0a 0a 3a 20 68 61 6e  to handle..: han
b790: 64 6c 65 2d 63 6d 64 20 28 20 61 64 64 72 20 2d  dle-cmd ( addr -
b7a0: 2d 20 29 20 20 70 61 72 65 6e 74 20 3e 6f 0a 20  - )  parent >o. 
b7b0: 20 20 20 6d 73 67 28 20 2e 22 20 48 61 6e 64 6c     msg( ." Handl
b7c0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 64 64  e command to add
b7d0: 72 3a 20 22 20 69 6e 62 75 66 20 6d 61 70 61 64  r: " inbuf mapad
b7e0: 64 72 20 6c 65 2d 36 34 40 20 78 36 34 2e 20 63  dr le-64@ x64. c
b7f0: 72 20 29 0a 20 20 20 20 6f 75 74 66 6c 61 67 20  r ).    outflag 
b800: 6f 66 66 20 20 77 61 69 74 2d 74 61 73 6b 20 40  off  wait-task @
b810: 20 30 3d 20 72 65 6d 6f 74 65 3f 20 21 0a 20 20   0= remote? !.  
b820: 20 20 24 65 72 72 6f 72 2d 69 64 20 24 6f 66 66    $error-id $off
b830: 20 20 20 20 5c 20 6e 6f 20 65 72 72 6f 72 20 69      \ no error i
b840: 64 20 73 6f 20 66 61 72 0a 20 20 20 20 6d 61 78  d so far.    max
b850: 64 61 74 61 20 6e 65 67 61 74 65 20 61 6e 64 20  data negate and 
b860: 3e 72 20 69 6e 62 75 66 20 70 61 63 6b 65 74 2d  >r inbuf packet-
b870: 64 61 74 61 20 72 40 20 73 77 61 70 20 64 75 70  data r@ swap dup
b880: 20 3e 72 20 6d 6f 76 65 0a 20 20 20 20 72 3e 20   >r move.    r> 
b890: 72 3e 20 73 77 61 70 20 63 6d 64 2d 65 78 65 63  r> swap cmd-exec
b8a0: 0a 20 20 20 20 6f 20 49 46 20 20 63 6c 6f 73 69  .    o IF  closi
b8b0: 6e 67 3f 20 20 49 46 20 20 6c 61 73 74 2d 70 61  ng?  IF  last-pa
b8c0: 63 6b 65 74 21 20 20 54 48 45 4e 20 20 6f 3e 20  cket!  THEN  o> 
b8d0: 20 45 4c 53 45 20 20 72 64 72 6f 70 20 20 54 48   ELSE  rdrop  TH
b8e0: 45 4e 0a 20 20 20 20 72 65 6d 6f 74 65 3f 20 6f  EN.    remote? o
b8f0: 66 66 20 3b 0a 27 20 68 61 6e 64 6c 65 2d 63 6d  ff ;.' handle-cm
b900: 64 20 72 63 6f 64 65 2d 63 6c 61 73 73 20 74 6f  d rcode-class to
b910: 20 68 61 6e 64 6c 65 0a 27 20 64 72 6f 70 20 63   handle.' drop c
b920: 6f 64 65 2d 63 6c 61 73 73 20 74 6f 20 68 61 6e  ode-class to han
b930: 64 6c 65 0a 0a 3a 20 2e 69 6e 76 2d 70 61 63 6b  dle..: .inv-pack
b940: 65 74 20 28 20 2d 2d 20 29 0a 20 20 20 20 2e 22  et ( -- ).    ."
b950: 20 69 6e 76 61 6c 69 64 20 70 61 63 6b 65 74 20   invalid packet 
b960: 74 6f 20 22 0a 20 20 20 20 64 65 73 74 2d 61 64  to ".    dest-ad
b970: 64 72 20 36 34 40 20 6f 20 49 46 20 20 64 65 73  dr 64@ o IF  des
b980: 74 2d 76 61 64 64 72 20 36 34 2d 20 20 54 48 45  t-vaddr 64-  THE
b990: 4e 20 20 78 36 34 2e 0a 20 20 20 20 2e 22 20 73  N  x64..    ." s
b9a0: 69 7a 65 20 22 20 6d 69 6e 2d 73 69 7a 65 20 69  ize " min-size i
b9b0: 6e 62 75 66 20 63 40 20 64 61 74 61 73 69 7a 65  nbuf c@ datasize
b9c0: 23 20 61 6e 64 20 6c 73 68 69 66 74 20 68 65 78  # and lshift hex
b9d0: 2e 20 63 72 20 3b 0a 0a 7d 73 63 6f 70 65 0a 0a  . cr ;..}scope..
b9e0: 3a 20 68 61 6e 64 6c 65 2d 64 65 73 74 20 28 20  : handle-dest ( 
b9f0: 61 64 64 72 20 6d 61 70 20 2d 2d 20 29 20 5c 20  addr map -- ) \ 
ba00: 68 61 6e 64 6c 65 20 70 61 63 6b 65 74 20 74 6f  handle packet to
ba10: 20 76 61 6c 69 64 20 64 65 73 74 69 6e 61 74 69   valid destinati
ba20: 6f 6e 73 0a 20 20 20 20 74 69 63 6b 65 72 20 36  ons.    ticker 6
ba30: 34 40 20 20 61 63 6b 40 20 2e 72 65 63 76 2d 74  4@  ack@ .recv-t
ba40: 69 63 6b 20 36 34 21 20 5c 20 74 69 6d 65 20 73  ick 64! \ time s
ba50: 74 61 6d 70 20 6f 66 20 61 72 72 69 76 61 6c 0a  tamp of arrival.
ba60: 20 20 20 20 64 75 70 20 3e 72 20 69 6e 62 75 66      dup >r inbuf
ba70: 2d 64 65 63 72 79 70 74 20 30 3d 20 49 46 0a 09  -decrypt 0= IF..
ba80: 69 6e 76 61 6c 69 64 28 20 72 3e 20 2e 6d 61 70  invalid( r> .map
ba90: 63 3a 2e 69 6e 76 2d 70 61 63 6b 65 74 20 64 72  c:.inv-packet dr
baa0: 6f 70 20 29 65 6c 73 65 28 20 72 64 72 6f 70 20  op )else( rdrop 
bab0: 64 72 6f 70 20 29 20 45 58 49 54 0a 20 20 20 20  drop ) EXIT.    
bac0: 54 48 45 4e 0a 20 20 20 20 61 64 64 2d 73 6f 75  THEN.    add-sou
bad0: 72 63 65 20 20 3e 72 65 74 2d 61 64 64 72 0a 20  rce  >ret-addr. 
bae0: 20 20 20 63 72 79 70 74 2d 76 61 6c 20 76 61 6c     crypt-val val
baf0: 69 64 61 74 65 64 20 21 20 5c 20 6f 6b 2c 20 77  idated ! \ ok, w
bb00: 65 20 68 61 76 65 20 61 20 76 61 6c 69 64 61 74  e have a validat
bb10: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  ed connection.  
bb20: 20 20 72 3e 20 77 69 74 68 20 6d 61 70 63 20 68    r> with mapc h
bb30: 61 6e 64 6c 65 20 6f 20 49 46 20 20 65 6e 64 77  andle o IF  endw
bb40: 69 74 68 20 20 45 4c 53 45 20 20 72 64 72 6f 70  ith  ELSE  rdrop
bb50: 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 68 61 6e 64    THEN ;..: hand
bb60: 6c 65 2d 70 61 63 6b 65 74 20 28 20 2d 2d 20 29  le-packet ( -- )
bb70: 20 5c 20 68 61 6e 64 6c 65 20 6c 6f 63 61 6c 20   \ handle local 
bb80: 70 61 63 6b 65 74 0a 20 20 20 20 3e 64 65 73 74  packet.    >dest
bb90: 2d 61 64 64 72 20 2b 64 65 73 74 61 0a 20 20 20  -addr +desta.   
bba0: 20 64 65 73 74 2d 66 6c 61 67 73 20 31 2b 20 63   dest-flags 1+ c
bbb0: 40 20 73 74 61 74 65 6c 65 73 73 23 20 61 6e 64  @ stateless# and
bbc0: 20 20 49 46 0a 09 68 61 6e 64 6c 65 2d 63 6d 64    IF..handle-cmd
bbd0: 30 0a 20 20 20 20 45 4c 53 45 0a 09 69 6e 62 75  0.    ELSE..inbu
bbe0: 66 20 62 6f 64 79 2d 73 69 7a 65 20 63 68 65 63  f body-size chec
bbf0: 6b 2d 64 65 73 74 20 64 75 70 20 30 3d 20 49 46  k-dest dup 0= IF
bc00: 0a 09 20 20 20 20 64 72 6f 70 20 20 64 65 73 74  ..    drop  dest
bc10: 2d 61 64 64 72 20 36 34 40 20 6c 61 73 74 2d 70  -addr 64@ last-p
bc20: 61 63 6b 65 74 3f 20 30 3d 20 49 46 0a 09 09 75  acket? 0= IF...u
bc30: 6e 68 61 6e 64 6c 65 64 28 20 2e 22 20 75 6e 68  nhandled( ." unh
bc40: 61 6e 64 6c 65 64 20 70 61 63 6b 65 74 20 74 6f  andled packet to
bc50: 3a 20 22 20 64 65 73 74 2d 61 64 64 72 20 36 34  : " dest-addr 64
bc60: 40 20 78 36 34 2e 20 63 72 20 29 0a 09 20 20 20  @ x64. cr )..   
bc70: 20 54 48 45 4e 20 20 45 58 49 54 20 20 54 48 45   THEN  EXIT  THE
bc80: 4e 20 2b 64 65 73 74 0a 09 68 61 6e 64 6c 65 2d  N +dest..handle-
bc90: 64 65 73 74 0a 20 20 20 20 54 48 45 4e 20 3b 0a  dest.    THEN ;.
bca0: 0a 3a 20 72 6f 75 74 65 2d 70 61 63 6b 65 74 20  .: route-packet 
bcb0: 28 20 2d 2d 20 29 0a 20 20 20 20 61 64 64 2d 73  ( -- ).    add-s
bcc0: 6f 75 72 63 65 0a 20 20 20 20 69 6e 62 75 66 20  ource.    inbuf 
bcd0: 3e 72 20 72 40 20 67 65 74 2d 64 65 73 74 20 72  >r r@ get-dest r
bce0: 6f 75 74 65 3e 61 64 64 72 65 73 73 20 49 46 0a  oute>address IF.
bcf0: 09 72 6f 75 74 65 28 20 2e 22 20 72 6f 75 74 65  .route( ." route
bd00: 20 74 6f 3a 20 22 20 73 6f 63 6b 61 64 64 72 3e   to: " sockaddr>
bd10: 20 61 6c 65 6e 20 40 20 2e 61 64 64 72 65 73 73   alen @ .address
bd20: 20 73 70 61 63 65 0a 09 69 6e 62 75 66 20 64 65   space..inbuf de
bd30: 73 74 69 6e 61 74 69 6f 6e 20 2e 61 64 64 72 2d  stination .addr-
bd40: 70 61 74 68 20 63 72 20 29 0a 09 72 40 20 64 75  path cr )..r@ du
bd50: 70 20 70 61 63 6b 65 74 2d 73 69 7a 65 20 73 65  p packet-size se
bd60: 6e 64 2d 61 2d 70 61 63 6b 65 74 20 30 3c 0a 09  nd-a-packet 0<..
bd70: 49 46 20 20 2e 22 20 66 61 69 6c 65 64 20 74 6f  IF  ." failed to
bd80: 20 73 65 6e 64 20 66 72 6f 6d 3a 20 22 20 73 6f   send from: " so
bd90: 63 6b 61 64 64 72 3c 20 64 75 70 20 3e 61 6c 65  ckaddr< dup >ale
bda0: 6e 20 2e 61 64 64 72 65 73 73 0a 09 20 20 20 20  n .address..    
bdb0: 2e 22 20 20 74 6f 3a 20 22 20 73 6f 63 6b 61 64  ."  to: " sockad
bdc0: 64 72 3e 20 61 6c 65 6e 20 40 20 2e 61 64 64 72  dr> alen @ .addr
bdd0: 65 73 73 20 63 72 20 74 72 75 65 20 3f 69 6f 72  ess cr true ?ior
bde0: 20 20 54 48 45 4e 0a 20 20 20 20 54 48 45 4e 20    THEN.    THEN 
bdf0: 20 72 64 72 6f 70 20 3b 0a 0a 5c 20 64 69 73 70   rdrop ;..\ disp
be00: 6f 73 65 20 63 6f 6e 74 65 78 74 0a 0a 3a 20 75  ose context..: u
be10: 6e 6c 69 6e 6b 2d 63 74 78 20 28 20 6e 65 78 74  nlink-ctx ( next
be20: 20 68 69 74 20 70 74 72 20 2d 2d 20 29 0a 20 20   hit ptr -- ).  
be30: 20 20 6e 65 78 74 2d 63 6f 6e 74 65 78 74 20 40    next-context @
be40: 20 6f 20 63 6f 6e 74 65 78 74 73 0a 20 20 20 20   o contexts.    
be50: 42 45 47 49 4e 20 20 32 64 75 70 20 40 20 3c 3e  BEGIN  2dup @ <>
be60: 20 57 48 49 4c 45 20 20 40 20 64 75 70 20 2e 6e   WHILE  @ dup .n
be70: 65 78 74 2d 63 6f 6e 74 65 78 74 20 73 77 61 70  ext-context swap
be80: 20 30 3d 20 55 4e 54 49 4c 0a 09 32 64 72 6f 70   0= UNTIL..2drop
be90: 20 64 72 6f 70 20 45 58 49 54 20 20 54 48 45 4e   drop EXIT  THEN
bea0: 20 20 6e 69 70 20 21 20 3b 0a 3a 20 75 6e 67 72    nip ! ;.: ungr
beb0: 6f 75 70 2d 63 74 78 20 28 20 2d 2d 20 29 0a 20  oup-ctx ( -- ). 
bec0: 20 20 20 6d 73 67 2d 67 72 6f 75 70 23 20 5b 3a     msg-group# [:
bed0: 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f 70 20 63   cell+ $@ drop c
bee0: 65 6c 6c 2b 20 2e 6d 73 67 3a 70 65 65 72 73 5b  ell+ .msg:peers[
bef0: 5d 20 6f 20 73 77 61 70 20 64 65 6c 24 63 65 6c  ] o swap del$cel
bf00: 6c 20 3b 5d 20 23 6d 61 70 20 3b 0a 0a 44 65 66  l ;] #map ;..Def
bf10: 65 72 20 65 78 74 72 61 2d 64 69 73 70 6f 73 65  er extra-dispose
bf20: 20 27 20 6e 6f 6f 70 20 69 73 20 65 78 74 72 61   ' noop is extra
bf30: 2d 64 69 73 70 6f 73 65 0a 0a 69 6e 20 6e 65 74  -dispose..in net
bf40: 32 6f 20 3a 20 64 69 73 70 6f 73 65 2d 63 6f 6e  2o : dispose-con
bf50: 74 65 78 74 20 28 20 6f 3a 61 64 64 72 20 2d 2d  text ( o:addr --
bf60: 20 6f 3a 61 64 64 72 20 29 0a 20 20 20 20 5b 3a   o:addr ).    [:
bf70: 20 63 6d 64 28 20 2e 22 20 44 69 73 70 6f 73 69   cmd( ." Disposi
bf80: 6e 67 20 63 6f 6e 74 65 78 74 2e 2e 2e 20 22 20  ng context... " 
bf90: 6f 20 68 65 78 2e 20 63 72 20 29 0a 20 20 20 20  o hex. cr ).    
bfa0: 20 20 74 69 6d 65 6f 75 74 28 20 2e 22 20 44 69    timeout( ." Di
bfb0: 73 70 6f 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  sposing context.
bfc0: 2e 2e 20 22 20 6f 20 68 65 78 2e 20 2e 22 20 74  .. " o hex. ." t
bfd0: 61 73 6b 3a 20 22 20 74 61 73 6b 23 20 3f 20 63  ask: " task# ? c
bfe0: 72 20 29 0a 20 20 20 20 20 20 6f 2d 74 69 6d 65  r ).      o-time
bff0: 6f 75 74 20 6f 2d 63 68 75 6e 6b 73 20 65 78 74  out o-chunks ext
c000: 72 61 2d 64 69 73 70 6f 73 65 0a 20 20 20 20 20  ra-dispose.     
c010: 20 64 61 74 61 2d 72 6d 61 70 20 49 46 20 20 23   data-rmap IF  #
c020: 30 2e 20 64 61 74 61 2d 72 6d 61 70 20 2e 6d 61  0. data-rmap .ma
c030: 70 63 3a 64 65 73 74 2d 76 61 64 64 72 20 3e 64  pc:dest-vaddr >d
c040: 65 73 74 2d 6d 61 70 20 32 21 20 20 54 48 45 4e  est-map 2!  THEN
c050: 0a 20 20 20 20 20 20 65 6e 64 2d 6d 61 70 73 20  .      end-maps 
c060: 73 74 61 72 74 2d 6d 61 70 73 20 44 4f 20 20 49  start-maps DO  I
c070: 20 40 20 3f 64 75 70 2d 49 46 20 2e 6d 61 70 63   @ ?dup-IF .mapc
c080: 3a 66 72 65 65 2d 64 61 74 61 20 54 48 45 4e 20  :free-data THEN 
c090: 20 63 65 6c 6c 20 2b 4c 4f 4f 50 0a 20 20 20 20   cell +LOOP.    
c0a0: 20 20 65 6e 64 2d 73 74 72 69 6e 67 73 20 73 74    end-strings st
c0b0: 61 72 74 2d 73 74 72 69 6e 67 73 20 44 4f 20 20  art-strings DO  
c0c0: 49 20 24 6f 66 66 20 20 20 20 20 20 63 65 6c 6c  I $off      cell
c0d0: 20 2b 4c 4f 4f 50 0a 20 20 20 20 20 20 65 6e 64   +LOOP.      end
c0e0: 2d 73 65 63 72 65 74 73 20 73 74 61 72 74 2d 73  -secrets start-s
c0f0: 65 63 72 65 74 73 20 44 4f 20 20 49 20 73 65 63  ecrets DO  I sec
c100: 2d 66 72 65 65 20 20 63 65 6c 6c 20 2b 4c 4f 4f  -free  cell +LOO
c110: 50 0a 20 20 20 20 20 20 66 73 74 61 74 65 2d 66  P.      fstate-f
c120: 72 65 65 0a 20 20 20 20 20 20 5c 20 65 72 61 73  ree.      \ eras
c130: 65 20 63 72 79 70 74 6f 20 6b 65 79 73 0a 20 20  e crypto keys.  
c140: 20 20 20 20 6c 6f 67 2d 63 6f 6e 74 65 78 74 20      log-context 
c150: 40 20 3f 64 75 70 2d 49 46 20 20 2e 64 69 73 70  @ ?dup-IF  .disp
c160: 6f 73 65 20 20 54 48 45 4e 0a 20 20 20 20 20 20  ose  THEN.      
c170: 61 63 6b 2d 63 6f 6e 74 65 78 74 20 40 20 3f 64  ack-context @ ?d
c180: 75 70 2d 49 46 0a 09 20 20 3e 6f 20 74 69 6d 69  up-IF..  >o timi
c190: 6e 67 2d 73 74 61 74 20 24 6f 66 66 20 74 72 61  ng-stat $off tra
c1a0: 63 6b 2d 74 69 6d 69 6e 67 20 24 6f 66 66 20 64  ck-timing $off d
c1b0: 69 73 70 6f 73 65 20 6f 3e 0a 20 20 20 20 20 20  ispose o>.      
c1c0: 54 48 45 4e 0a 20 20 20 20 20 20 6d 73 67 69 6e  THEN.      msgin
c1d0: 67 2d 63 6f 6e 74 65 78 74 20 40 20 3f 64 75 70  g-context @ ?dup
c1e0: 2d 49 46 20 20 2e 64 69 73 70 6f 73 65 20 20 54  -IF  .dispose  T
c1f0: 48 45 4e 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  HEN.      unlink
c200: 2d 63 74 78 20 20 75 6e 67 72 6f 75 70 2d 63 74  -ctx  ungroup-ct
c210: 78 0a 20 20 20 20 20 20 65 6e 64 2d 73 65 6d 61  x.      end-sema
c220: 73 20 73 74 61 72 74 2d 73 65 6d 61 73 20 44 4f  s start-semas DO
c230: 20 20 49 20 70 74 68 72 65 61 64 5f 6d 75 74 65    I pthread_mute
c240: 78 5f 64 65 73 74 72 6f 79 20 64 72 6f 70 0a 20  x_destroy drop. 
c250: 20 20 20 20 20 31 20 70 74 68 72 65 61 64 2d 6d       1 pthread-m
c260: 75 74 65 78 65 73 20 2b 4c 4f 4f 50 0a 20 20 20  utexes +LOOP.   
c270: 20 20 20 64 69 73 70 6f 73 65 20 20 30 20 74 6f     dispose  0 to
c280: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20   connection.    
c290: 20 20 63 6d 64 28 20 2e 22 20 64 69 73 70 6f 73    cmd( ." dispos
c2a0: 65 64 22 20 63 72 20 29 20 3b 5d 20 66 69 6c 65  ed" cr ) ;] file
c2b0: 2d 73 65 6d 61 20 63 2d 73 65 63 74 69 6f 6e 20  -sema c-section 
c2c0: 3b 0a 0a 65 76 65 6e 74 3a 20 3a 3e 64 69 73 70  ;..event: :>disp
c2d0: 6f 73 65 2d 63 6f 6e 74 65 78 74 20 28 20 6f 20  ose-context ( o 
c2e0: 2d 2d 20 29 20 20 2e 6e 65 74 32 6f 3a 64 69 73  -- )  .net2o:dis
c2f0: 70 6f 73 65 2d 63 6f 6e 74 65 78 74 20 3b 0a 0a  pose-context ;..
c300: 5c 20 6c 6f 6f 70 73 20 66 6f 72 20 73 65 72 76  \ loops for serv
c310: 65 72 20 61 6e 64 20 63 6c 69 65 6e 74 0a 0a 38  er and client..8
c320: 20 63 65 6c 6c 73 20 31 2d 20 43 6f 6e 73 74 61   cells 1- Consta
c330: 6e 74 20 6d 61 78 72 65 71 75 65 73 74 23 0a 0a  nt maxrequest#..
c340: 3a 20 6e 65 78 74 2d 72 65 71 75 65 73 74 20 28  : next-request (
c350: 20 2d 2d 20 6e 20 29 0a 20 20 20 20 31 20 64 75   -- n ).    1 du
c360: 70 20 72 65 71 75 65 73 74 23 20 2b 21 40 20 6d  p request# +!@ m
c370: 61 78 72 65 71 75 65 73 74 23 20 61 6e 64 20 74  axrequest# and t
c380: 75 63 6b 20 6c 73 68 69 66 74 20 72 65 71 6d 61  uck lshift reqma
c390: 73 6b 20 6f 72 21 0a 20 20 20 20 72 65 71 75 65  sk or!.    reque
c3a0: 73 74 28 20 2e 22 20 52 65 71 75 65 73 74 20 61  st( ." Request a
c3b0: 64 64 65 64 3a 20 22 20 64 75 70 20 2e 20 2e 22  dded: " dup . ."
c3c0: 20 6f 20 22 20 6f 20 68 65 78 2e 20 2e 22 20 74   o " o hex. ." t
c3d0: 61 73 6b 3a 20 22 20 74 61 73 6b 23 20 3f 20 63  ask: " task# ? c
c3e0: 72 20 29 20 3b 0a 0a 3a 20 70 61 63 6b 65 74 2d  r ) ;..: packet-
c3f0: 65 76 65 6e 74 20 28 20 2d 2d 20 29 0a 20 20 20  event ( -- ).   
c400: 20 6e 65 78 74 2d 70 61 63 6b 65 74 20 21 74 69   next-packet !ti
c410: 63 6b 73 20 6e 69 70 20 30 3d 20 3f 45 58 49 54  cks nip 0= ?EXIT
c420: 20 20 69 6e 62 75 66 20 72 6f 75 74 65 3f 0a 20    inbuf route?. 
c430: 20 20 20 49 46 20 20 72 6f 75 74 65 2d 70 61 63     IF  route-pac
c440: 6b 65 74 20 20 45 4c 53 45 20 20 68 61 6e 64 6c  ket  ELSE  handl
c450: 65 2d 70 61 63 6b 65 74 20 20 54 48 45 4e 20 3b  e-packet  THEN ;
c460: 0a 0a 3a 20 63 6c 65 61 6e 2d 72 65 71 75 65 73  ..: clean-reques
c470: 74 20 28 20 6e 20 2d 2d 20 29 0a 20 20 20 20 31  t ( n -- ).    1
c480: 20 6f 76 65 72 20 6c 73 68 69 66 74 20 69 6e 76   over lshift inv
c490: 65 72 74 20 72 65 71 6d 61 73 6b 20 61 6e 64 21  ert reqmask and!
c4a0: 0a 20 20 20 20 72 65 71 75 65 73 74 28 20 2e 22  .    request( ."
c4b0: 20 52 65 71 75 65 73 74 20 63 6f 6d 70 6c 65 74   Request complet
c4c0: 65 64 3a 20 22 20 2e 20 2e 22 20 6f 20 22 20 6f  ed: " . ." o " o
c4d0: 20 68 65 78 2e 20 2e 22 20 74 61 73 6b 3a 20 22   hex. ." task: "
c4e0: 20 74 61 73 6b 23 20 3f 20 63 72 0a 20 20 20 20   task# ? cr.    
c4f0: 29 65 6c 73 65 28 20 64 72 6f 70 20 29 20 3b 0a  )else( drop ) ;.
c500: 0a 3a 20 72 71 64 40 20 28 20 6e 20 2d 2d 20 78  .: rqd@ ( n -- x
c510: 74 20 29 0a 20 20 20 20 30 20 73 77 61 70 20 72  t ).    0 swap r
c520: 71 64 2d 78 74 73 20 24 5b 5d 20 21 40 20 3f 64  qd-xts $[] !@ ?d
c530: 75 70 2d 30 3d 2d 49 46 20 20 5b 27 5d 20 63 6c  up-0=-IF  ['] cl
c540: 65 61 6e 2d 72 65 71 75 65 73 74 20 20 54 48 45  ean-request  THE
c550: 4e 20 3b 0a 0a 3a 20 72 71 64 21 20 28 20 78 74  N ;..: rqd! ( xt
c560: 20 2d 2d 20 29 0a 20 20 20 20 5c 47 20 73 74 6f   -- ).    \G sto
c570: 72 65 20 72 65 71 75 65 73 74 0a 20 20 20 20 72  re request.    r
c580: 65 71 75 65 73 74 23 20 40 20 72 71 64 2d 78 74  equest# @ rqd-xt
c590: 73 20 24 5b 5d 20 21 20 3b 0a 3a 20 72 71 64 3f  s $[] ! ;.: rqd?
c5a0: 20 28 20 78 74 20 2d 2d 20 29 0a 20 20 20 20 5c   ( xt -- ).    \
c5b0: 47 20 73 74 6f 72 65 20 72 65 71 75 65 73 74 20  G store request 
c5c0: 69 66 20 6e 6f 20 62 65 74 74 65 72 20 69 73 20  if no better is 
c5d0: 61 76 61 69 6c 61 62 6c 65 0a 20 20 20 20 72 65  available.    re
c5e0: 71 75 65 73 74 23 20 40 20 72 71 64 2d 78 74 73  quest# @ rqd-xts
c5f0: 20 24 5b 5d 20 64 75 70 20 40 20 49 46 20 20 32   $[] dup @ IF  2
c600: 64 72 6f 70 20 20 45 4c 53 45 20 20 21 20 20 54  drop  ELSE  !  T
c610: 48 45 4e 20 3b 0a 0a 65 76 65 6e 74 3a 20 3a 3e  HEN ;..event: :>
c620: 72 65 71 75 65 73 74 20 28 20 6e 20 6f 20 2d 2d  request ( n o --
c630: 20 29 20 3e 6f 20 6d 61 78 72 65 71 75 65 73 74   ) >o maxrequest
c640: 23 20 61 6e 64 0a 20 20 20 20 64 75 70 20 72 71  # and.    dup rq
c650: 64 40 20 72 65 71 75 65 73 74 28 20 2e 22 20 72  d@ request( ." r
c660: 65 71 75 65 73 74 20 78 74 3a 20 22 20 64 75 70  equest xt: " dup
c670: 20 2e 6e 61 6d 65 20 63 72 20 29 20 20 65 78 65   .name cr )  exe
c680: 63 75 74 65 0a 20 20 20 20 72 65 71 6d 61 73 6b  cute.    reqmask
c690: 20 40 20 30 3d 20 49 46 20 20 72 65 71 75 65 73   @ 0= IF  reques
c6a0: 74 28 20 2e 22 20 52 65 6d 6f 76 65 20 74 69 6d  t( ." Remove tim
c6b0: 65 6f 75 74 22 20 63 72 20 29 20 2d 74 69 6d 65  eout" cr ) -time
c6c0: 6f 75 74 0a 20 20 20 20 45 4c 53 45 20 20 72 65  out.    ELSE  re
c6d0: 71 75 65 73 74 28 20 2e 22 20 54 69 6d 65 6f 75  quest( ." Timeou
c6e0: 74 20 72 65 6d 61 69 6e 73 3a 20 22 20 72 65 71  t remains: " req
c6f0: 6d 61 73 6b 20 40 20 68 65 78 2e 20 63 72 20 29  mask @ hex. cr )
c700: 20 54 48 45 4e 20 20 6f 3e 20 3b 0a 65 76 65 6e   THEN  o> ;.even
c710: 74 3a 20 3a 3e 74 69 6d 65 6f 75 74 20 28 20 6f  t: :>timeout ( o
c720: 20 2d 2d 20 29 0a 20 20 20 20 74 69 6d 65 6f 75   -- ).    timeou
c730: 74 28 20 2e 22 20 52 65 71 75 65 73 74 20 74 69  t( ." Request ti
c740: 6d 65 64 20 6f 75 74 22 20 66 6f 72 74 68 3a 63  med out" forth:c
c750: 72 20 29 0a 20 20 20 20 3e 6f 20 30 20 72 65 71  r ).    >o 0 req
c760: 6d 61 73 6b 20 21 40 20 3e 72 20 2d 74 69 6d 65  mask !@ >r -time
c770: 6f 75 74 20 72 3e 20 6f 3e 20 6d 73 67 28 20 2e  out r> o> msg( .
c780: 22 20 52 65 71 75 65 73 74 20 74 69 6d 65 64 20  " Request timed 
c790: 6f 75 74 22 20 63 72 20 29 0a 20 20 20 20 30 3c  out" cr ).    0<
c7a0: 3e 20 21 21 74 69 6d 65 6f 75 74 21 21 20 3b 0a  > !!timeout!! ;.
c7b0: 65 76 65 6e 74 3a 20 3a 3e 74 68 72 6f 77 20 28  event: :>throw (
c7c0: 20 65 72 72 6f 72 20 2d 2d 20 29 20 74 68 72 6f   error -- ) thro
c7d0: 77 20 3b 0a 0a 3a 20 74 69 6d 65 6f 75 74 2d 65  w ;..: timeout-e
c7e0: 78 70 69 72 65 64 3f 20 28 20 2d 2d 20 66 6c 61  xpired? ( -- fla
c7f0: 67 20 29 0a 20 20 20 20 61 63 6b 40 20 2e 74 69  g ).    ack@ .ti
c800: 6d 65 6f 75 74 73 20 40 20 6d 61 78 2d 74 69 6d  meouts @ max-tim
c810: 65 6f 75 74 73 20 3e 3d 20 3b 0a 3a 20 70 75 73  eouts >= ;.: pus
c820: 68 2d 74 69 6d 65 6f 75 74 20 28 20 6f 3a 63 6f  h-timeout ( o:co
c830: 6e 6e 65 63 74 69 6f 6e 20 2d 2d 20 29 0a 20 20  nnection -- ).  
c840: 20 20 74 69 6d 65 6f 75 74 2d 65 78 70 69 72 65    timeout-expire
c850: 64 3f 20 77 61 69 74 2d 74 61 73 6b 20 40 20 61  d? wait-task @ a
c860: 6e 64 20 20 3f 64 75 70 2d 49 46 0a 09 6f 20 65  nd  ?dup-IF..o e
c870: 6c 69 74 2c 20 3a 3e 74 69 6d 65 6f 75 74 20 65  lit, :>timeout e
c880: 76 65 6e 74 3e 20 20 54 48 45 4e 20 3b 0a 0a 3a  vent>  THEN ;..:
c890: 20 72 65 71 75 65 73 74 2d 74 69 6d 65 6f 75 74   request-timeout
c8a0: 20 28 20 2d 2d 20 29 0a 20 20 20 20 3f 74 69 6d   ( -- ).    ?tim
c8b0: 65 6f 75 74 20 3f 64 75 70 2d 49 46 20 20 3e 6f  eout ?dup-IF  >o
c8c0: 20 72 64 72 6f 70 0a 09 74 69 6d 65 6f 75 74 28   rdrop..timeout(
c8d0: 20 2e 22 20 64 6f 20 74 69 6d 65 6f 75 74 3a 20   ." do timeout: 
c8e0: 22 20 6f 20 68 65 78 2e 20 61 64 64 72 20 74 69  " o hex. addr ti
c8f0: 6d 65 6f 75 74 2d 78 74 20 40 20 2e 6e 61 6d 65  meout-xt @ .name
c900: 20 63 72 20 29 0a 09 74 69 6d 65 6f 75 74 2d 78   cr )..timeout-x
c910: 74 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 5c 20  t.    THEN ;..\ 
c920: 62 65 61 63 6f 6e 73 0a 5c 20 55 44 50 20 63 6f  beacons.\ UDP co
c930: 6e 6e 65 63 74 69 6f 6e 73 20 74 68 72 6f 75 67  nnections throug
c940: 68 20 61 20 4e 41 54 20 63 6c 6f 73 65 20 61 66  h a NAT close af
c950: 74 65 72 20 74 69 6d 65 6f 75 74 2c 0a 5c 20 74  ter timeout,.\ t
c960: 79 70 69 63 61 6c 6c 79 20 61 66 74 65 72 20 61  ypically after a
c970: 20 6d 69 6e 75 74 65 20 6f 72 20 73 6f 2e 0a 5c   minute or so..\
c980: 20 54 6f 20 6b 65 65 70 20 63 6f 6e 6e 65 63 74   To keep connect
c990: 69 6f 6e 73 20 61 6c 69 76 65 2c 20 79 6f 75 20  ions alive, you 
c9a0: 68 61 76 65 20 74 6f 20 73 65 6e 64 20 61 20 22  have to send a "
c9b0: 62 65 61 63 6f 6e 22 20 61 20 62 69 74 20 62 65  beacon" a bit be
c9c0: 66 6f 72 65 0a 5c 20 74 68 65 20 63 6f 6e 6e 65  fore.\ the conne
c9d0: 63 74 69 6f 6e 20 77 6f 75 6c 64 20 65 78 70 69  ction would expi
c9e0: 72 65 20 74 6f 20 72 65 66 72 65 73 68 20 74 68  re to refresh th
c9f0: 65 20 4e 41 54 20 77 69 6e 64 6f 77 2e 0a 5c 20  e NAT window..\ 
ca00: 62 65 61 63 6f 6e 73 20 61 72 65 20 73 65 6e 64  beacons are send
ca10: 20 72 65 67 75 6c 61 72 6c 79 20 72 65 67 61 72   regularly regar
ca20: 64 6c 65 73 73 20 69 66 20 79 6f 75 20 68 61 76  dless if you hav
ca30: 65 20 61 6e 79 20 6f 74 68 65 72 20 74 72 61 66  e any other traf
ca40: 66 69 63 2c 0a 5c 20 62 65 63 61 75 73 65 20 74  fic,.\ because t
ca50: 68 61 74 27 73 20 65 61 73 69 65 72 20 74 6f 20  hat's easier to 
ca60: 64 6f 2e 0a 5c 20 62 65 61 63 6f 6e 73 20 61 72  do..\ beacons ar
ca70: 65 20 6f 6e 65 2d 62 79 74 65 20 70 61 63 6b 65  e one-byte packe
ca80: 74 73 2c 20 77 69 74 68 20 41 53 43 49 49 20 63  ts, with ASCII c
ca90: 68 61 72 61 63 74 65 72 73 20 74 6f 20 73 61 79  haracters to say
caa0: 20 77 68 61 74 20 74 68 65 79 20 6d 65 61 6e 0a   what they mean.
cab0: 0a 23 35 30 2e 30 30 30 2e 30 30 30 2e 30 30 30  .#50.000.000.000
cac0: 20 64 3e 36 34 20 36 34 56 61 6c 75 65 20 62 65   d>64 64Value be
cad0: 61 63 6f 6e 2d 74 69 63 6b 73 23 20 5c 20 35 30  acon-ticks# \ 50
cae0: 73 20 62 65 61 63 6f 6e 20 74 69 63 6b 20 72 61  s beacon tick ra
caf0: 74 65 0a 23 32 2e 30 30 30 2e 30 30 30 2e 30 30  te.#2.000.000.00
cb00: 30 20 64 3e 36 34 20 36 34 56 61 6c 75 65 20 62  0 d>64 64Value b
cb10: 65 61 63 6f 6e 2d 73 68 6f 72 74 2d 74 69 63 6b  eacon-short-tick
cb20: 73 23 20 5c 20 32 73 20 73 68 6f 72 74 20 62 65  s# \ 2s short be
cb30: 61 63 6f 6e 20 74 69 63 6b 20 72 61 74 65 0a 0a  acon tick rate..
cb40: 68 61 73 68 3a 20 62 65 61 63 6f 6e 73 23 20 5c  hash: beacons# \
cb50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f   destinations to
cb60: 20 73 65 6e 64 20 62 65 61 63 6f 6e 73 20 74 6f   send beacons to
cb70: 0a 56 61 72 69 61 62 6c 65 20 6e 65 65 64 2d 62  .Variable need-b
cb80: 65 61 63 6f 6e 23 20 6e 65 65 64 2d 62 65 61 63  eacon# need-beac
cb90: 6f 6e 23 20 6f 6e 20 5c 20 74 72 75 65 20 69 66  on# on \ true if
cba0: 20 6e 65 65 64 73 20 61 20 68 61 73 68 20 66 6f   needs a hash fo
cbb0: 72 20 74 68 65 20 3f 20 62 65 61 63 6f 6e 0a 0a  r the ? beacon..
cbc0: 3a 20 6e 65 78 74 2d 62 65 61 63 6f 6e 20 28 20  : next-beacon ( 
cbd0: 2d 2d 20 36 34 74 69 63 6b 20 29 0a 20 20 20 20  -- 64tick ).    
cbe0: 36 34 23 2d 31 20 62 65 61 63 6f 6e 73 23 20 5b  64#-1 beacons# [
cbf0: 3a 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f 70 20  : cell+ $@ drop 
cc00: 36 34 40 20 36 34 75 6d 69 6e 20 3b 5d 20 23 6d  64@ 64umin ;] #m
cc10: 61 70 20 3b 0a 0a 3a 20 73 65 6e 64 2d 62 65 61  ap ;..: send-bea
cc20: 63 6f 6e 73 20 28 20 2d 2d 20 29 20 21 74 69 63  cons ( -- ) !tic
cc30: 6b 73 0a 20 20 20 20 62 65 61 63 6f 6e 73 23 20  ks.    beacons# 
cc40: 5b 3a 20 64 75 70 20 24 40 20 7b 20 62 61 64 64  [: dup $@ { badd
cc50: 72 20 75 20 7d 20 63 65 6c 6c 2b 20 24 40 20 64  r u } cell+ $@ d
cc60: 72 6f 70 20 7b 20 62 65 61 63 6f 6e 20 7d 0a 09  rop { beacon }..
cc70: 62 65 61 63 6f 6e 20 36 34 40 20 74 69 63 6b 65  beacon 64@ ticke
cc80: 72 20 36 34 40 20 36 34 75 3c 3d 20 49 46 0a 09  r 64@ 64u<= IF..
cc90: 20 20 20 20 62 65 61 63 6f 6e 28 20 74 69 63 6b      beacon( tick
cca0: 73 20 2e 74 69 63 6b 73 20 2e 22 20 20 73 65 6e  s .ticks ."  sen
ccb0: 64 20 62 65 61 63 6f 6e 20 74 6f 3a 20 22 20 62  d beacon to: " b
ccc0: 61 64 64 72 20 75 20 2e 61 64 64 72 65 73 73 20  addr u .address 
ccd0: 29 0a 09 20 20 20 20 74 69 63 6b 65 72 20 36 34  )..    ticker 64
cce0: 40 20 62 65 61 63 6f 6e 2d 73 68 6f 72 74 2d 74  @ beacon-short-t
ccf0: 69 63 6b 73 23 20 36 34 2b 20 62 65 61 63 6f 6e  icks# 64+ beacon
cd00: 20 36 34 21 0a 09 20 20 20 20 6e 65 74 32 6f 2d   64!..    net2o-
cd10: 73 6f 63 6b 0a 09 20 20 20 20 62 65 61 63 6f 6e  sock..    beacon
cd20: 20 36 34 27 2b 20 40 20 3f 64 75 70 2d 49 46 0a   64'+ @ ?dup-IF.
cd30: 09 09 2e 62 65 61 63 6f 6e 2d 68 61 73 68 20 24  ...beacon-hash $
cd40: 40 20 62 65 61 63 6f 6e 28 20 2e 22 20 20 68 61  @ beacon( ."  ha
cd50: 73 68 3a 20 22 20 32 64 75 70 20 38 35 74 79 70  sh: " 2dup 85typ
cd60: 65 20 29 0a 09 20 20 20 20 45 4c 53 45 0a 09 09  e )..    ELSE...
cd70: 73 22 20 3f 22 0a 09 20 20 20 20 54 48 45 4e 0a  s" ?"..    THEN.
cd80: 09 20 20 20 20 62 65 61 63 6f 6e 28 20 63 72 20  .    beacon( cr 
cd90: 29 0a 09 20 20 20 20 30 20 62 61 64 64 72 20 75  )..    0 baddr u
cda0: 20 73 65 6e 64 74 6f 20 64 72 6f 70 20 2b 73 65   sendto drop +se
cdb0: 6e 64 0a 09 54 48 45 4e 0a 09 3b 5d 20 23 6d 61  nd..THEN..;] #ma
cdc0: 70 20 3b 0a 0a 3a 20 62 65 61 63 6f 6e 3f 20 28  p ;..: beacon? (
cdd0: 20 2d 2d 20 29 0a 20 20 20 20 6e 65 78 74 2d 62   -- ).    next-b
cde0: 65 61 63 6f 6e 20 74 69 63 6b 65 72 20 36 34 40  eacon ticker 64@
cdf0: 20 36 34 75 3c 3d 20 49 46 20 20 73 65 6e 64 2d   64u<= IF  send-
ce00: 62 65 61 63 6f 6e 73 20 20 54 48 45 4e 20 3b 0a  beacons  THEN ;.
ce10: 0a 3a 20 2b 62 65 61 63 6f 6e 20 28 20 73 6f 63  .: +beacon ( soc
ce20: 6b 61 64 64 72 20 6c 65 6e 20 78 74 20 2d 2d 20  kaddr len xt -- 
ce30: 29 0a 20 20 20 20 3e 72 20 74 69 63 6b 73 20 62  ).    >r ticks b
ce40: 65 61 63 6f 6e 2d 73 68 6f 72 74 2d 74 69 63 6b  eacon-short-tick
ce50: 73 23 20 36 34 2b 20 6f 20 72 3e 20 7b 20 36 34  s# 64+ o r> { 64
ce60: 5e 20 64 65 73 74 20 77 5e 20 6f 62 6a 20 77 5e  ^ dest w^ obj w^
ce70: 20 78 74 20 7d 0a 20 20 20 20 62 65 61 63 6f 6e   xt }.    beacon
ce80: 28 20 2e 22 20 61 64 64 20 62 65 61 63 6f 6e 3a  ( ." add beacon:
ce90: 20 22 20 32 64 75 70 20 2e 61 64 64 72 65 73 73   " 2dup .address
cea0: 20 2e 22 20 20 27 20 22 20 78 74 20 40 20 2e 6e   ."  ' " xt @ .n
ceb0: 61 6d 65 20 63 72 20 29 0a 20 20 20 20 32 64 75  ame cr ).    2du
cec0: 70 20 62 65 61 63 6f 6e 73 23 20 23 40 20 64 30  p beacons# #@ d0
ced0: 3d 20 49 46 0a 09 64 65 73 74 20 31 20 36 34 73  = IF..dest 1 64s
cee0: 20 63 65 6c 6c 2b 20 63 65 6c 6c 2b 20 32 73 77   cell+ cell+ 2sw
cef0: 61 70 20 62 65 61 63 6f 6e 73 23 20 23 21 0a 20  ap beacons# #!. 
cf00: 20 20 20 45 4c 53 45 0a 09 6f 62 6a 20 32 20 63     ELSE..obj 2 c
cf10: 65 6c 6c 73 20 6c 61 73 74 23 20 63 65 6c 6c 2b  ells last# cell+
cf20: 20 24 2b 21 20 32 64 72 6f 70 0a 20 20 20 20 54   $+! 2drop.    T
cf30: 48 45 4e 20 3b 0a 0a 3a 20 6f 2d 62 65 61 63 6f  HEN ;..: o-beaco
cf40: 6e 20 28 20 2d 2d 20 29 0a 20 20 20 20 62 65 61  n ( -- ).    bea
cf50: 63 6f 6e 28 20 2e 22 20 72 65 6d 6f 76 65 20 62  con( ." remove b
cf60: 65 61 63 6f 6e 73 3a 20 22 20 6f 20 68 65 78 2e  eacons: " o hex.
cf70: 20 63 72 20 29 0a 20 20 20 20 62 65 61 63 6f 6e   cr ).    beacon
cf80: 73 23 20 5b 3a 20 7b 20 62 75 63 6b 65 74 20 7d  s# [: { bucket }
cf90: 20 62 75 63 6b 65 74 20 63 65 6c 6c 2b 20 24 40   bucket cell+ $@
cfa0: 20 31 20 36 34 73 20 2f 73 74 72 69 6e 67 20 62   1 64s /string b
cfb0: 6f 75 6e 64 73 20 3f 44 4f 0a 09 20 20 20 20 49  ounds ?DO..    I
cfc0: 20 40 20 6f 20 3d 20 49 46 0a 09 09 62 75 63 6b   @ o = IF...buck
cfd0: 65 74 20 63 65 6c 6c 2b 20 49 20 6f 76 65 72 20  et cell+ I over 
cfe0: 24 40 20 64 72 6f 70 20 2d 20 32 20 63 65 6c 6c  $@ drop - 2 cell
cff0: 73 20 24 64 65 6c 20 20 4c 45 41 56 45 20 20 54  s $del  LEAVE  T
d000: 48 45 4e 0a 09 32 20 63 65 6c 6c 73 20 2b 4c 4f  HEN..2 cells +LO
d010: 4f 50 0a 09 62 75 63 6b 65 74 20 63 65 6c 6c 2b  OP..bucket cell+
d020: 20 24 40 6c 65 6e 20 38 20 3d 20 49 46 0a 09 20   $@len 8 = IF.. 
d030: 20 20 20 62 75 63 6b 65 74 20 24 6f 66 66 20 62     bucket $off b
d040: 75 63 6b 65 74 20 63 65 6c 6c 2b 20 24 6f 66 66  ucket cell+ $off
d050: 0a 09 54 48 45 4e 0a 20 20 20 20 3b 5d 20 23 6d  ..THEN.    ;] #m
d060: 61 70 20 3b 0a 0a 3a 20 62 65 61 63 6f 6e 73 2d  ap ;..: beacons-
d070: 6e 6f 77 21 20 28 20 2d 2d 20 29 0a 20 20 20 20  now! ( -- ).    
d080: 74 69 63 6b 73 20 62 65 61 63 6f 6e 73 23 20 5b  ticks beacons# [
d090: 3a 20 3e 72 20 36 34 64 75 70 20 72 3e 20 63 65  : >r 64dup r> ce
d0a0: 6c 6c 2b 20 24 40 20 64 72 6f 70 20 36 34 21 20  ll+ $@ drop 64! 
d0b0: 3b 5d 20 23 6d 61 70 0a 20 20 20 20 36 34 64 72  ;] #map.    64dr
d0c0: 6f 70 20 3b 0a 0a 3a 6e 6f 6e 61 6d 65 20 6f 2d  op ;..:noname o-
d0d0: 62 65 61 63 6f 6e 20 64 65 66 65 72 73 20 65 78  beacon defers ex
d0e0: 74 72 61 2d 64 69 73 70 6f 73 65 20 3b 20 69 73  tra-dispose ; is
d0f0: 20 65 78 74 72 61 2d 64 69 73 70 6f 73 65 0a 0a   extra-dispose..
d100: 3a 20 67 65 6e 2d 62 65 61 63 6f 6e 2d 68 61 73  : gen-beacon-has
d110: 68 20 28 20 2d 2d 20 68 61 73 68 20 75 20 29 0a  h ( -- hash u ).
d120: 20 20 20 20 64 65 73 74 2d 30 6b 65 79 20 73 65      dest-0key se
d130: 63 40 20 22 62 65 61 63 6f 6e 22 20 6b 65 79 65  c@ "beacon" keye
d140: 64 2d 68 61 73 68 23 31 32 38 20 32 2f 20 3b 0a  d-hash#128 2/ ;.
d150: 0a 3a 20 61 64 64 2d 62 65 61 63 6f 6e 20 28 20  .: add-beacon ( 
d160: 6e 65 74 32 6f 61 64 64 72 20 78 74 20 2d 2d 20  net2oaddr xt -- 
d170: 29 0a 20 20 20 20 3e 72 20 72 6f 75 74 65 3e 61  ).    >r route>a
d180: 64 64 72 65 73 73 20 49 46 0a 09 73 6f 63 6b 61  ddress IF..socka
d190: 64 64 72 3e 20 61 6c 65 6e 20 40 20 72 40 20 2b  ddr> alen @ r@ +
d1a0: 62 65 61 63 6f 6e 0a 09 6f 20 49 46 0a 09 20 20  beacon..o IF..  
d1b0: 20 20 73 22 20 3f 22 20 62 65 61 63 6f 6e 2d 68    s" ?" beacon-h
d1c0: 61 73 68 20 24 21 20 20 67 65 6e 2d 62 65 61 63  ash $!  gen-beac
d1d0: 6f 6e 2d 68 61 73 68 20 62 65 61 63 6f 6e 2d 68  on-hash beacon-h
d1e0: 61 73 68 20 24 2b 21 0a 09 54 48 45 4e 0a 20 20  ash $+!..THEN.  
d1f0: 20 20 54 48 45 4e 20 20 72 64 72 6f 70 20 3b 0a    THEN  rdrop ;.
d200: 3a 20 72 65 74 2b 62 65 61 63 6f 6e 20 28 20 2d  : ret+beacon ( -
d210: 2d 20 29 20 20 72 65 74 2d 61 64 64 72 20 62 65  - )  ret-addr be
d220: 40 20 5b 27 5d 20 32 64 72 6f 70 20 61 64 64 2d  @ ['] 2drop add-
d230: 62 65 61 63 6f 6e 20 3b 0a 0a 5c 20 74 69 6d 65  beacon ;..\ time
d240: 6f 75 74 20 6c 6f 6f 70 0a 0a 3a 20 65 76 65 6e  out loop..: even
d250: 74 2d 73 65 6e 64 20 28 20 2d 2d 20 29 0a 20 20  t-send ( -- ).  
d260: 20 20 6f 20 49 46 20 20 77 61 69 74 2d 74 61 73    o IF  wait-tas
d270: 6b 20 40 20 3f 71 75 65 72 79 2d 74 61 73 6b 20  k @ ?query-task 
d280: 6f 76 65 72 20 73 65 6c 65 63 74 20 65 76 65 6e  over select even
d290: 74 3e 20 30 20 3e 6f 20 72 64 72 6f 70 20 20 54  t> 0 >o rdrop  T
d2a0: 48 45 4e 20 3b 0a 0a 23 31 30 30 30 30 30 30 30  HEN ;..#10000000
d2b0: 20 43 6f 6e 73 74 61 6e 74 20 77 61 74 63 68 2d   Constant watch-
d2c0: 74 69 6d 65 6f 75 74 23 20 5c 20 31 30 6d 73 20  timeout# \ 10ms 
d2d0: 74 69 6d 65 6f 75 74 20 63 68 65 63 6b 20 69 6e  timeout check in
d2e0: 74 65 72 76 61 6c 0a 23 31 30 2e 30 30 30 30 30  terval.#10.00000
d2f0: 30 30 30 30 20 64 3e 36 34 20 36 34 43 6f 6e 73  0000 d>64 64Cons
d300: 74 61 6e 74 20 6d 61 78 2d 74 69 6d 65 6f 75 74  tant max-timeout
d310: 23 20 5c 20 31 30 73 20 73 6c 65 65 70 2c 20 6e  # \ 10s sleep, n
d320: 6f 20 6d 6f 72 65 0a 0a 5b 49 46 44 45 46 5d 20  o more..[IFDEF] 
d330: 61 6e 64 72 6f 69 64 0a 20 20 20 20 61 6c 73 6f  android.    also
d340: 20 6a 6e 69 0a 20 20 20 20 36 34 56 61 72 69 61   jni.    64Varia
d350: 62 6c 65 20 6f 6c 64 2d 62 65 61 63 6f 6e 20 36  ble old-beacon 6
d360: 34 23 2d 31 20 6f 6c 64 2d 62 65 61 63 6f 6e 20  4#-1 old-beacon 
d370: 36 34 21 0a 20 20 20 20 3a 20 73 65 74 2d 62 65  64!.    : set-be
d380: 61 63 6f 6e 2d 61 6c 61 72 6d 20 28 20 62 65 61  acon-alarm ( bea
d390: 63 6f 6e 2d 74 69 63 6b 20 2d 2d 20 29 0a 09 36  con-tick -- )..6
d3a0: 34 64 75 70 20 6f 6c 64 2d 62 65 61 63 6f 6e 20  4dup old-beacon 
d3b0: 36 34 40 20 36 34 3d 20 49 46 20 20 36 34 64 72  64@ 64= IF  64dr
d3c0: 6f 70 20 20 45 58 49 54 20 20 54 48 45 4e 0a 09  op  EXIT  THEN..
d3d0: 36 34 64 75 70 20 6f 6c 64 2d 62 65 61 63 6f 6e  64dup old-beacon
d3e0: 20 36 34 21 0a 09 36 34 3e 64 20 31 30 30 30 30   64!..64>d 10000
d3f0: 30 30 20 75 64 2f 6d 6f 64 20 63 6c 61 7a 7a 20  00 ud/mod clazz 
d400: 2e 73 65 74 5f 61 6c 61 72 6d 20 64 72 6f 70 20  .set_alarm drop 
d410: 3b 0a 20 20 20 20 3a 20 61 6e 64 72 6f 69 64 2d  ;.    : android-
d420: 77 61 6b 65 75 70 20 28 20 30 20 2d 2d 20 29 20  wakeup ( 0 -- ) 
d430: 64 72 6f 70 0a 09 74 69 6d 65 6f 75 74 2d 74 61  drop..timeout-ta
d440: 73 6b 20 3f 64 75 70 2d 49 46 20 20 77 61 6b 65  sk ?dup-IF  wake
d450: 20 20 54 48 45 4e 20 3b 0a 20 20 20 20 61 6c 73    THEN ;.    als
d460: 6f 20 61 6e 64 72 6f 69 64 0a 20 20 20 20 27 20  o android.    ' 
d470: 61 6e 64 72 6f 69 64 2d 77 61 6b 65 75 70 20 69  android-wakeup i
d480: 73 20 61 6e 64 72 6f 69 64 2d 61 6c 61 72 6d 0a  s android-alarm.
d490: 20 20 20 20 70 72 65 76 69 6f 75 73 20 70 72 65      previous pre
d4a0: 76 69 6f 75 73 0a 5b 54 48 45 4e 5d 0a 0a 46 6f  vious.[THEN]..Fo
d4b0: 72 77 61 72 64 20 73 61 76 65 2d 6d 73 67 73 3f  rward save-msgs?
d4c0: 0a 46 6f 72 77 61 72 64 20 6e 65 78 74 2d 73 61  .Forward next-sa
d4d0: 76 65 64 2d 6d 73 67 0a 0a 3a 20 3e 6e 65 78 74  ved-msg..: >next
d4e0: 2d 74 69 63 6b 73 20 28 20 2d 2d 20 29 0a 20 20  -ticks ( -- ).  
d4f0: 20 20 6e 65 78 74 2d 74 69 6d 65 6f 75 74 3f 20    next-timeout? 
d500: 64 72 6f 70 20 6e 65 78 74 2d 62 65 61 63 6f 6e  drop next-beacon
d510: 0a 20 20 20 20 5b 49 46 44 45 46 5d 20 61 6e 64  .    [IFDEF] and
d520: 72 6f 69 64 20 36 34 64 75 70 20 73 65 74 2d 62  roid 64dup set-b
d530: 65 61 63 6f 6e 2d 61 6c 61 72 6d 20 5b 54 48 45  eacon-alarm [THE
d540: 4e 5d 0a 20 20 20 20 36 34 75 6d 69 6e 20 6e 65  N].    64umin ne
d550: 78 74 2d 73 61 76 65 64 2d 6d 73 67 20 36 34 75  xt-saved-msg 64u
d560: 6d 69 6e 20 74 69 63 6b 73 20 36 34 2d 0a 20 20  min ticks 64-.  
d570: 20 20 36 34 23 30 20 36 34 6d 61 78 20 6d 61 78    64#0 64max max
d580: 2d 74 69 6d 65 6f 75 74 23 20 36 34 6d 69 6e 20  -timeout# 64min 
d590: 5c 20 6c 69 6d 69 74 20 73 6c 65 65 70 20 74 69  \ limit sleep ti
d5a0: 6d 65 20 74 6f 20 31 20 73 65 63 6f 6e 64 73 0a  me to 1 seconds.
d5b0: 20 20 20 20 77 61 69 74 28 20 2e 22 20 77 61 69      wait( ." wai
d5c0: 74 20 66 6f 72 20 22 20 36 34 64 75 70 20 75 36  t for " 64dup u6
d5d0: 34 2e 20 2e 22 20 6e 73 22 20 63 72 20 29 20 73  4. ." ns" cr ) s
d5e0: 74 6f 70 2d 36 34 6e 73 0a 20 20 20 20 77 61 69  top-64ns.    wai
d5f0: 74 28 20 74 69 63 6b 65 72 20 36 34 40 20 29 20  t( ticker 64@ ) 
d600: 21 74 69 63 6b 73 0a 20 20 20 20 77 61 69 74 28  !ticks.    wait(
d610: 20 74 69 63 6b 65 72 20 36 34 40 20 36 34 73 77   ticker 64@ 64sw
d620: 61 70 20 36 34 2d 20 2e 22 20 77 61 69 74 65 64  ap 64- ." waited
d630: 20 66 6f 72 20 22 20 75 36 34 2e 20 2e 22 20 6e   for " u64. ." n
d640: 73 22 20 63 72 20 29 20 3b 0a 0a 3a 20 74 69 6d  s" cr ) ;..: tim
d650: 65 6f 75 74 2d 6c 6f 6f 70 20 28 20 2d 2d 20 29  eout-loop ( -- )
d660: 20 5b 49 46 44 45 46 5d 20 61 6e 64 72 6f 69 64   [IFDEF] android
d670: 20 6a 6e 69 3a 61 74 74 61 63 68 20 5b 54 48 45   jni:attach [THE
d680: 4e 5d 0a 20 20 20 20 21 74 69 63 6b 73 20 20 42  N].    !ticks  B
d690: 45 47 49 4e 0a 09 3e 6e 65 78 74 2d 74 69 63 6b  EGIN..>next-tick
d6a0: 73 20 20 20 20 20 21 21 30 64 65 70 74 68 21 21  s     !!0depth!!
d6b0: 0a 09 62 65 61 63 6f 6e 3f 20 20 20 20 20 20 20  ..beacon?       
d6c0: 20 20 21 21 30 64 65 70 74 68 21 21 0a 09 73 61    !!0depth!!..sa
d6d0: 76 65 2d 6d 73 67 73 3f 20 20 20 20 20 20 21 21  ve-msgs?      !!
d6e0: 30 64 65 70 74 68 21 21 0a 09 72 65 71 75 65 73  0depth!!..reques
d6f0: 74 2d 74 69 6d 65 6f 75 74 20 21 21 30 64 65 70  t-timeout !!0dep
d700: 74 68 21 21 0a 09 65 76 65 6e 74 2d 73 65 6e 64  th!!..event-send
d710: 20 20 20 20 20 20 21 21 30 64 65 70 74 68 21 21        !!0depth!!
d720: 0a 09 6c 61 73 74 2d 70 61 63 6b 65 74 2d 74 6f  ..last-packet-to
d730: 73 20 21 21 30 64 65 70 74 68 21 21 0a 20 20 20  s !!0depth!!.   
d740: 20 41 47 41 49 4e 20 3b 0a 0a 3a 20 63 72 65 61   AGAIN ;..: crea
d750: 74 65 2d 74 69 6d 65 6f 75 74 2d 74 61 73 6b 20  te-timeout-task 
d760: 28 20 2d 2d 20 29 20 20 74 69 6d 65 6f 75 74 2d  ( -- )  timeout-
d770: 74 61 73 6b 20 3f 45 58 49 54 0a 20 20 20 20 5b  task ?EXIT.    [
d780: 27 5d 20 74 69 6d 65 6f 75 74 2d 6c 6f 6f 70 20  '] timeout-loop 
d790: 31 20 6e 65 74 32 6f 2d 74 61 73 6b 20 74 6f 20  1 net2o-task to 
d7a0: 74 69 6d 65 6f 75 74 2d 74 61 73 6b 20 3b 0a 0a  timeout-task ;..
d7b0: 5c 20 70 61 63 6b 65 74 20 72 65 63 69 76 65 72  \ packet reciver
d7c0: 20 74 61 73 6b 0a 0a 3a 20 70 61 63 6b 65 74 2d   task..: packet-
d7d0: 6c 6f 6f 70 20 28 20 2d 2d 20 29 20 5c 20 31 20  loop ( -- ) \ 1 
d7e0: 73 74 69 63 6b 2d 74 6f 2d 63 6f 72 65 0a 20 20  stick-to-core.  
d7f0: 20 20 42 45 47 49 4e 20 20 70 61 63 6b 65 74 2d    BEGIN  packet-
d800: 65 76 65 6e 74 20 20 21 21 30 64 65 70 74 68 21  event  !!0depth!
d810: 21 20 20 65 76 65 6e 74 2d 73 65 6e 64 20 20 21  !  event-send  !
d820: 21 30 64 65 70 74 68 21 21 20 20 41 47 41 49 4e  !0depth!!  AGAIN
d830: 20 3b 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 72   ;..in net2o : r
d840: 65 71 75 65 73 74 2d 64 6f 6e 65 20 28 20 6e 20  equest-done ( n 
d850: 2d 2d 20 29 20 20 65 6c 69 74 2c 20 6f 20 65 6c  -- )  elit, o el
d860: 69 74 2c 20 3a 3e 72 65 71 75 65 73 74 20 3b 0a  it, :>request ;.
d870: 0a 3a 20 63 72 65 61 74 65 2d 72 65 63 65 69 76  .: create-receiv
d880: 65 72 2d 74 61 73 6b 20 28 20 2d 2d 20 29 0a 20  er-task ( -- ). 
d890: 20 20 20 5b 27 5d 20 70 61 63 6b 65 74 2d 6c 6f     ['] packet-lo
d8a0: 6f 70 20 31 20 6e 65 74 32 6f 2d 74 61 73 6b 20  op 1 net2o-task 
d8b0: 74 6f 20 72 65 63 65 69 76 65 72 2d 74 61 73 6b  to receiver-task
d8c0: 20 3b 0a 0a 3a 20 65 76 65 6e 74 2d 6c 6f 6f 70   ;..: event-loop
d8d0: 2d 74 61 73 6b 20 28 20 2d 2d 20 29 0a 20 20 20  -task ( -- ).   
d8e0: 20 72 65 63 65 69 76 65 72 2d 74 61 73 6b 20 30   receiver-task 0
d8f0: 3d 20 49 46 20 20 63 72 65 61 74 65 2d 72 65 63  = IF  create-rec
d900: 65 69 76 65 72 2d 74 61 73 6b 20 20 54 48 45 4e  eiver-task  THEN
d910: 20 3b 0a 0a 3a 20 72 65 71 75 65 73 74 73 2d 3e   ;..: requests->
d920: 30 20 28 20 2d 2d 20 29 20 72 65 71 75 65 73 74  0 ( -- ) request
d930: 28 20 2e 22 20 77 61 69 74 20 72 65 71 6d 61 73  ( ." wait reqmas
d940: 6b 3d 22 20 6f 20 49 46 20 72 65 71 6d 61 73 6b  k=" o IF reqmask
d950: 20 40 20 68 65 78 2e 20 54 48 45 4e 20 63 72 20   @ hex. THEN cr 
d960: 29 0a 20 20 20 20 42 45 47 49 4e 20 20 73 74 6f  ).    BEGIN  sto
d970: 70 0a 09 6f 20 49 46 20 20 72 65 71 6d 61 73 6b  p..o IF  reqmask
d980: 20 40 20 66 69 6c 65 2d 63 6f 75 6e 74 20 40 20   @ file-count @ 
d990: 6f 72 20 30 3d 20 28 20 72 65 71 63 6f 75 6e 74  or 0= ( reqcount
d9a0: 20 40 20 30 3d 20 61 6e 64 20 29 0a 09 45 4c 53   @ 0= and )..ELS
d9b0: 45 20 20 66 61 6c 73 65 20 20 54 48 45 4e 0a 20  E  false  THEN. 
d9c0: 20 20 20 55 4e 54 49 4c 0a 20 20 20 20 6f 20 49     UNTIL.    o I
d9d0: 46 20 20 6f 2d 74 69 6d 65 6f 75 74 20 20 54 48  F  o-timeout  TH
d9e0: 45 4e 20 20 72 65 71 75 65 73 74 28 20 2e 22 20  EN  request( ." 
d9f0: 77 61 69 74 20 64 6f 6e 65 22 20 63 72 20 29 20  wait done" cr ) 
da00: 3b 0a 0a 3a 20 63 6c 69 65 6e 74 2d 6c 6f 6f 70  ;..: client-loop
da10: 20 28 20 2d 2d 20 29 0a 20 20 20 20 21 74 69 63   ( -- ).    !tic
da20: 6b 73 0a 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  ks.    connectio
da30: 6e 20 3e 6f 0a 20 20 20 20 6f 20 49 46 20 20 75  n >o.    o IF  u
da40: 70 40 20 77 61 69 74 2d 74 61 73 6b 20 21 20 20  p@ wait-task !  
da50: 6f 2b 74 69 6d 65 6f 75 74 20 20 54 48 45 4e 0a  o+timeout  THEN.
da60: 20 20 20 20 65 76 65 6e 74 2d 6c 6f 6f 70 2d 74      event-loop-t
da70: 61 73 6b 20 72 65 71 75 65 73 74 73 2d 3e 30 20  ask requests->0 
da80: 6f 3e 20 3b 0a 0a 3a 20 73 65 72 76 65 72 2d 6c  o> ;..: server-l
da90: 6f 6f 70 20 28 20 2d 2d 20 29 0a 20 20 20 20 30  oop ( -- ).    0
daa0: 20 3e 6f 20 72 64 72 6f 70 20 20 42 45 47 49 4e   >o rdrop  BEGIN
dab0: 20 20 63 6c 69 65 6e 74 2d 6c 6f 6f 70 20 20 41    client-loop  A
dac0: 47 41 49 4e 20 3b 0a 0a 3a 20 73 65 72 76 65 72  GAIN ;..: server
dad0: 2d 6c 6f 6f 70 2d 63 61 74 63 68 20 28 20 2d 2d  -loop-catch ( --
dae0: 20 29 0a 20 20 20 20 5b 27 5d 20 73 65 72 76 65   ).    ['] serve
daf0: 72 2d 6c 6f 6f 70 20 63 61 74 63 68 0a 20 20 20  r-loop catch.   
db00: 20 64 75 70 20 23 2d 32 38 20 3c 3e 20 6f 76 65   dup #-28 <> ove
db10: 72 20 23 2d 35 36 20 3c 3e 20 61 6e 64 20 61 6e  r #-56 <> and an
db20: 64 20 74 68 72 6f 77 20 3b 0a 0a 5c 20 63 6c 69  d throw ;..\ cli
db30: 65 6e 74 2f 73 65 72 76 65 72 20 69 6e 69 74 69  ent/server initi
db40: 61 6c 69 7a 65 72 0a 0a 44 65 66 65 72 20 69 6e  alizer..Defer in
db50: 69 74 2d 72 65 73 74 0a 0a 3a 6e 6f 6e 61 6d 65  it-rest..:noname
db60: 20 28 20 70 6f 72 74 20 2d 2d 20 29 20 20 69 6e   ( port -- )  in
db70: 69 74 2d 6d 79 6b 65 79 20 69 6e 69 74 2d 6d 79  it-mykey init-my
db80: 6b 65 79 20 5c 20 67 65 6e 65 72 61 74 65 20 74  key \ generate t
db90: 77 6f 20 6b 65 79 73 0a 20 20 20 20 6d 79 2d 30  wo keys.    my-0
dba0: 6b 65 79 20 40 20 30 3d 20 49 46 20 20 69 6e 69  key @ 0= IF  ini
dbb0: 74 2d 6d 79 30 6b 65 79 20 20 54 48 45 4e 20 20  t-my0key  THEN  
dbc0: 69 6e 69 74 2d 68 65 61 64 65 72 2d 6b 65 79 0a  init-header-key.
dbd0: 20 20 20 20 5c 20 68 61 73 68 2d 69 6e 69 74 2d      \ hash-init-
dbe0: 72 6e 67 0a 20 20 20 20 69 6e 69 74 2d 74 69 6d  rng.    init-tim
dbf0: 65 72 20 6e 65 74 32 6f 2d 73 6f 63 6b 65 74 20  er net2o-socket 
dc00: 69 6e 69 74 2d 72 6f 75 74 65 20 70 72 65 70 2d  init-route prep-
dc10: 73 6f 63 6b 73 0a 20 20 20 20 73 65 6e 64 65 72  socks.    sender
dc20: 28 20 63 72 65 61 74 65 2d 73 65 6e 64 65 72 2d  ( create-sender-
dc30: 74 61 73 6b 20 29 20 63 72 65 61 74 65 2d 74 69  task ) create-ti
dc40: 6d 65 6f 75 74 2d 74 61 73 6b 20 3b 20 69 73 20  meout-task ; is 
dc50: 69 6e 69 74 2d 72 65 73 74 0a 0a 56 61 72 69 61  init-rest..Varia
dc60: 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  ble initialized.
dc70: 0a 3a 20 69 6e 69 74 2d 63 6c 69 65 6e 74 20 28  .: init-client (
dc80: 20 2d 2d 20 29 20 20 74 72 75 65 20 69 6e 69 74   -- )  true init
dc90: 69 61 6c 69 7a 65 64 20 21 40 20 30 3d 20 49 46  ialized !@ 0= IF
dca0: 0a 09 69 6e 69 74 2d 64 69 72 73 20 20 63 6f 6e  ..init-dirs  con
dcb0: 66 69 67 3a 70 6f 72 74 23 20 40 20 20 69 6e 69  fig:port# @  ini
dcc0: 74 2d 72 65 73 74 20 20 54 48 45 4e 20 3b 0a 3a  t-rest  THEN ;.:
dcd0: 20 69 6e 69 74 2d 73 65 72 76 65 72 20 28 20 2d   init-server ( -
dce0: 2d 20 29 20 20 74 72 75 65 20 69 6e 69 74 69 61  - )  true initia
dcf0: 6c 69 7a 65 64 20 21 40 20 30 3d 20 49 46 0a 09  lized !@ 0= IF..
dd00: 69 6e 69 74 2d 64 69 72 73 20 20 63 6f 6e 66 69  init-dirs  confi
dd10: 67 3a 70 6f 72 74 23 20 40 20 6e 65 74 32 6f 2d  g:port# @ net2o-
dd20: 70 6f 72 74 20 6f 76 65 72 20 73 65 6c 65 63 74  port over select
dd30: 20 20 69 6e 69 74 2d 72 65 73 74 20 20 54 48 45    init-rest  THE
dd40: 4e 20 3b 0a 0a 5c 20 63 6f 6e 6e 65 63 74 69 6f  N ;..\ connectio
dd50: 6e 20 63 6f 6f 6b 69 65 73 0a 0a 56 61 72 69 61  n cookies..Varia
dd60: 62 6c 65 20 63 6f 6f 6b 69 65 73 0a 0a 63 6f 6f  ble cookies..coo
dd70: 6b 69 65 2d 73 69 7a 65 23 20 62 75 66 66 65 72  kie-size# buffer
dd80: 3a 20 74 6d 70 2d 63 6f 6f 6b 69 65 0a 0a 3a 20  : tmp-cookie..: 
dd90: 61 64 64 2d 63 6f 6f 6b 69 65 20 28 20 2d 2d 20  add-cookie ( -- 
dda0: 63 6f 6f 6b 69 65 36 34 20 29 0a 20 20 20 20 5b  cookie64 ).    [
ddb0: 3a 20 74 69 63 6b 73 20 36 34 64 75 70 20 5b 20  : ticks 64dup [ 
ddc0: 74 6d 70 2d 63 6f 6f 6b 69 65 20 2e 63 63 2d 74  tmp-cookie .cc-t
ddd0: 69 6d 65 6f 75 74 20 5d 4c 20 36 34 21 0a 09 6f  imeout ]L 64!..o
dde0: 20 5b 20 74 6d 70 2d 63 6f 6f 6b 69 65 20 2e 63   [ tmp-cookie .c
ddf0: 63 2d 63 6f 6e 74 65 78 74 20 5d 4c 20 21 0a 09  c-context ]L !..
de00: 74 6d 70 2d 63 6f 6f 6b 69 65 20 63 6f 6f 6b 69  tmp-cookie cooki
de10: 65 2d 73 69 7a 65 23 20 20 63 6f 6f 6b 69 65 73  e-size#  cookies
de20: 20 24 2b 21 20 3b 5d 0a 20 20 20 20 72 65 73 69   $+! ;].    resi
de30: 7a 65 2d 73 65 6d 61 20 63 2d 73 65 63 74 69 6f  ze-sema c-sectio
de40: 6e 20 3b 0a 0a 3a 20 64 6f 2d 3f 63 6f 6f 6b 69  n ;..: do-?cooki
de50: 65 20 28 20 63 6f 6f 6b 69 65 20 2d 2d 20 63 6f  e ( cookie -- co
de60: 6e 74 65 78 74 20 74 72 75 65 20 2f 20 66 61 6c  ntext true / fal
de70: 73 65 20 29 0a 20 20 20 20 74 69 63 6b 65 72 20  se ).    ticker 
de80: 36 34 40 20 63 6f 6e 6e 65 63 74 2d 74 69 6d 65  64@ connect-time
de90: 6f 75 74 23 20 36 34 2d 20 7b 20 36 34 3a 20 74  out# 64- { 64: t
dea0: 69 6d 65 6f 75 74 20 7d 0a 20 20 20 20 63 6f 6f  imeout }.    coo
deb0: 6b 69 65 73 20 24 40 20 62 6f 75 6e 64 73 20 3f  kies $@ bounds ?
dec0: 44 4f 0a 09 36 34 64 75 70 20 49 20 2e 63 63 2d  DO..64dup I .cc-
ded0: 74 69 6d 65 6f 75 74 20 36 34 40 20 36 34 3d 20  timeout 64@ 64= 
dee0: 49 46 20 5c 20 69 66 20 77 65 20 68 61 76 65 20  IF \ if we have 
def0: 61 20 68 69 74 2c 20 75 73 65 20 74 68 61 74 0a  a hit, use that.
df00: 09 20 20 20 20 36 34 64 72 6f 70 20 49 20 2e 63  .    64drop I .c
df10: 63 2d 63 6f 6e 74 65 78 74 20 40 0a 09 20 20 20  c-context @..   
df20: 20 49 20 2e 63 63 2d 73 65 63 72 65 74 20 5b 20   I .cc-secret [ 
df30: 74 6d 70 2d 63 6f 6f 6b 69 65 20 2e 63 63 2d 73  tmp-cookie .cc-s
df40: 65 63 72 65 74 20 5d 4c 20 4b 45 59 42 59 54 45  ecret ]L KEYBYTE
df50: 53 20 6d 6f 76 65 0a 09 20 20 20 20 63 6f 6f 6b  S move..    cook
df60: 69 65 73 20 49 20 63 6f 6f 6b 69 65 2d 73 69 7a  ies I cookie-siz
df70: 65 23 20 64 65 6c 24 6f 6e 65 20 64 72 6f 70 0a  e# del$one drop.
df80: 09 20 20 20 20 75 6e 6c 6f 6f 70 20 20 64 75 70  .    unloop  dup
df90: 20 49 46 20 20 74 72 75 65 20 20 54 48 45 4e 20   IF  true  THEN 
dfa0: 20 45 58 49 54 0a 09 54 48 45 4e 0a 09 49 20 2e   EXIT..THEN..I .
dfb0: 63 63 2d 74 69 6d 65 6f 75 74 20 36 34 40 20 74  cc-timeout 64@ t
dfc0: 69 6d 65 6f 75 74 20 36 34 75 3c 20 49 46 0a 09  imeout 64u< IF..
dfd0: 20 20 20 20 63 6f 6f 6b 69 65 73 20 49 20 63 6f      cookies I co
dfe0: 6f 6b 69 65 2d 73 69 7a 65 23 20 64 65 6c 24 6f  okie-size# del$o
dff0: 6e 65 0a 09 20 20 20 20 63 6f 6f 6b 69 65 73 20  ne..    cookies 
e000: 6e 65 78 74 24 0a 09 20 20 20 20 75 6e 6c 6f 6f  next$..    unloo
e010: 70 20 20 3f 44 4f 20 20 4e 4f 50 45 20 5c 20 74  p  ?DO  NOPE \ t
e020: 68 69 73 20 72 65 70 6c 61 63 65 73 20 74 68 65  his replaces the
e030: 20 6c 6f 6f 70 20 76 61 72 69 61 62 6c 65 73 0a   loop variables.
e040: 09 20 20 20 20 30 20 5c 20 77 65 20 72 65 2d 69  .    0 \ we re-i
e050: 74 65 72 61 74 65 20 6f 76 65 72 20 74 68 65 20  terate over the 
e060: 65 78 61 63 74 6c 79 20 73 61 6d 65 20 69 6e 64  exactly same ind
e070: 65 78 0a 09 45 4c 53 45 0a 09 20 20 20 20 63 6f  ex..ELSE..    co
e080: 6f 6b 69 65 2d 73 69 7a 65 23 0a 09 54 48 45 4e  okie-size#..THEN
e090: 0a 20 20 20 20 2b 4c 4f 4f 50 20 20 36 34 64 72  .    +LOOP  64dr
e0a0: 6f 70 20 30 20 3b 0a 0a 3a 20 3f 63 6f 6f 6b 69  op 0 ;..: ?cooki
e0b0: 65 20 28 20 63 6f 6f 6b 69 65 20 2d 2d 20 63 6f  e ( cookie -- co
e0c0: 6e 74 65 78 74 20 74 72 75 65 20 2f 20 66 61 6c  ntext true / fal
e0d0: 73 65 20 29 0a 20 20 20 20 5b 27 5d 20 64 6f 2d  se ).    ['] do-
e0e0: 3f 63 6f 6f 6b 69 65 20 72 65 73 69 7a 65 2d 73  ?cookie resize-s
e0f0: 65 6d 61 20 63 2d 73 65 63 74 69 6f 6e 20 3b 0a  ema c-section ;.
e100: 0a 3a 20 63 6f 6f 6b 69 65 3e 63 6f 6e 74 65 78  .: cookie>contex
e110: 74 3f 20 28 20 63 6f 6f 6b 69 65 20 2d 2d 20 63  t? ( cookie -- c
e120: 6f 6e 74 65 78 74 20 74 72 75 65 20 2f 20 66 61  ontext true / fa
e130: 6c 73 65 20 29 0a 20 20 20 20 3f 63 6f 6f 6b 69  lse ).    ?cooki
e140: 65 20 6f 76 65 72 20 30 3d 20 6f 76 65 72 20 61  e over 0= over a
e150: 6e 64 20 49 46 0a 09 6e 69 70 20 6e 65 74 32 6f  nd IF..nip net2o
e160: 3a 6e 65 77 2d 63 6f 6e 74 65 78 74 20 73 77 61  :new-context swa
e170: 70 0a 20 20 20 20 54 48 45 4e 20 3b 0a 0a 3a 20  p.    THEN ;..: 
e180: 61 64 6a 75 73 74 2d 74 69 63 6b 73 20 28 20 74  adjust-ticks ( t
e190: 69 6d 65 20 2d 2d 20 29 20 20 6f 20 30 3d 20 49  ime -- )  o 0= I
e1a0: 46 20 20 36 34 64 72 6f 70 20 20 45 58 49 54 20  F  64drop  EXIT 
e1b0: 20 54 48 45 4e 0a 20 20 20 20 72 65 63 76 2d 74   THEN.    recv-t
e1c0: 69 63 6b 20 36 34 40 20 36 34 2d 20 72 74 64 65  ick 64@ 64- rtde
e1d0: 6c 61 79 20 36 34 40 20 36 34 64 75 70 20 36 34  lay 64@ 64dup 64
e1e0: 2d 30 3c 3e 20 3e 72 20 36 34 2d 32 2f 0a 20 20  -0<> >r 64-2/.  
e1f0: 20 20 36 34 6f 76 65 72 20 36 34 61 62 73 20 36    64over 64abs 6
e200: 34 6f 76 65 72 20 36 34 3e 20 72 3e 20 61 6e 64  4over 64> r> and
e210: 20 49 46 0a 09 36 34 2b 20 61 64 6a 75 73 74 2d   IF..64+ adjust-
e220: 74 69 6d 65 72 28 20 2e 22 20 61 64 6a 75 73 74  timer( ." adjust
e230: 20 74 69 6d 65 72 3a 20 22 20 36 34 64 75 70 20   timer: " 64dup 
e240: 75 36 34 2e 20 66 6f 72 74 68 3a 63 72 20 29 0a  u64. forth:cr ).
e250: 09 74 69 63 6b 2d 61 64 6a 75 73 74 20 36 34 21  .tick-adjust 64!
e260: 0a 20 20 20 20 45 4c 53 45 0a 09 36 34 2b 20 61  .    ELSE..64+ a
e270: 64 6a 75 73 74 2d 74 69 6d 65 72 28 20 2e 22 20  djust-timer( ." 
e280: 64 6f 6e 27 74 20 61 64 6a 75 73 74 20 74 69 6d  don't adjust tim
e290: 65 72 3a 20 22 20 36 34 64 75 70 20 75 36 34 2e  er: " 64dup u64.
e2a0: 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 36 34 64   forth:cr )..64d
e2b0: 72 6f 70 20 20 54 48 45 4e 20 3b 0a 0a 5c 20 6c  rop  THEN ;..\ l
e2c0: 6f 61 64 20 6e 65 74 32 6f 20 70 6c 75 67 69 6e  oad net2o plugin
e2d0: 73 3a 20 66 69 72 73 74 20 6f 6e 65 20 77 69 74  s: first one wit
e2e0: 68 20 69 6e 74 65 67 72 61 64 65 64 20 63 6f 6d  h integraded com
e2f0: 6d 61 6e 64 20 73 70 61 63 65 0a 0a 72 65 71 75  mand space..requ
e300: 69 72 65 20 6e 6f 74 69 66 79 2e 66 73 0a 72 65  ire notify.fs.re
e310: 71 75 69 72 65 20 63 6d 64 2e 66 73 0a 72 65 71  quire cmd.fs.req
e320: 75 69 72 65 20 63 6f 6e 6e 65 63 74 2e 66 73 0a  uire connect.fs.
e330: 72 65 71 75 69 72 65 20 63 6f 6e 6e 65 63 74 65  require connecte
e340: 64 2e 66 73 0a 72 65 71 75 69 72 65 20 6c 6f 67  d.fs.require log
e350: 2e 66 73 0a 72 65 71 75 69 72 65 20 6b 65 79 73  .fs.require keys
e360: 2e 66 73 0a 72 65 71 75 69 72 65 20 61 64 64 72  .fs.require addr
e370: 2e 66 73 0a 72 65 71 75 69 72 65 20 64 68 74 2e  .fs.require dht.
e380: 66 73 0a 72 65 71 75 69 72 65 20 76 61 75 6c 74  fs.require vault
e390: 2e 66 73 0a 72 65 71 75 69 72 65 20 6d 73 67 2e  .fs.require msg.
e3a0: 66 73 0a 72 65 71 75 69 72 65 20 68 65 6c 70 65  fs.require helpe
e3b0: 72 2e 66 73 0a 72 65 71 75 69 72 65 20 71 72 2e  r.fs.require qr.
e3c0: 66 73 0a 5c 20 72 65 71 75 69 72 65 20 74 65 72  fs.\ require ter
e3d0: 6d 2e 66 73 0a 72 65 71 75 69 72 65 20 64 76 63  m.fs.require dvc
e3e0: 73 2e 66 73 0a 72 65 71 75 69 72 65 20 73 71 75  s.fs.require squ
e3f0: 69 64 2e 66 73 0a 0a 5c 20 63 6f 6e 66 69 67 75  id.fs..\ configu
e400: 72 61 74 69 6f 6e 20 73 74 75 66 66 0a 0a 72 65  ration stuff..re
e410: 71 75 69 72 65 20 64 68 74 72 6f 6f 74 2e 66 73  quire dhtroot.fs
e420: 20 5c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   \ configuration
e430: 20 66 6f 72 20 44 48 54 20 72 6f 6f 74 0a 0a 5c   for DHT root..\
e440: 20 66 72 65 65 7a 65 20 74 61 62 6c 65 73 0a 0a   freeze tables..
e450: 63 6f 6e 74 65 78 74 2d 74 61 62 6c 65 20 20 20  context-table   
e460: 24 73 61 76 65 0a 0a 5c 20 73 68 6f 77 20 70 72  $save..\ show pr
e470: 6f 62 6c 65 6d 73 0a 0a 2e 75 6e 72 65 73 6f 6c  oblems...unresol
e480: 76 65 64 0a 0a 5c 5c 5c 0a 4c 6f 63 61 6c 20 56  ved..\\\.Local V
e490: 61 72 69 61 62 6c 65 73 3a 0a 66 6f 72 74 68 2d  ariables:.forth-
e4a0: 6c 6f 63 61 6c 2d 77 6f 72 64 73 3a 0a 20 20 20  local-words:.   
e4b0: 20 28 0a 20 20 20 20 20 28 28 22 6e 65 74 32 6f   (.     (("net2o
e4c0: 3a 22 20 22 2b 6e 65 74 32 6f 3a 22 29 20 64 65  :" "+net2o:") de
e4d0: 66 69 6e 69 74 69 6f 6e 2d 73 74 61 72 74 65 72  finition-starter
e4e0: 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 6b 65 79 77   (font-lock-keyw
e4f0: 6f 72 64 2d 66 61 63 65 20 2e 20 31 29 0a 20 20  ord-face . 1).  
e500: 20 20 20 20 22 5b 20 5c 74 5c 6e 5d 22 20 74 20      "[ \t\n]" t 
e510: 6e 61 6d 65 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d  name (font-lock-
e520: 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 2d 66 61  function-name-fa
e530: 63 65 20 2e 20 33 29 29 0a 20 20 20 20 20 28 28  ce . 3)).     ((
e540: 22 36 34 66 69 65 6c 64 3a 22 29 20 6e 6f 6e 2d  "64field:") non-
e550: 69 6d 6d 65 64 69 61 74 65 20 28 66 6f 6e 74 2d  immediate (font-
e560: 6c 6f 63 6b 2d 74 79 70 65 2d 66 61 63 65 20 2e  lock-type-face .
e570: 20 32 29 0a 20 20 20 20 20 20 22 5b 20 5c 74 5c   2).      "[ \t\
e580: 6e 5d 22 20 74 20 6e 61 6d 65 20 28 66 6f 6e 74  n]" t name (font
e590: 2d 6c 6f 63 6b 2d 76 61 72 69 61 62 6c 65 2d 6e  -lock-variable-n
e5a0: 61 6d 65 2d 66 61 63 65 20 2e 20 33 29 29 0a 20  ame-face . 3)). 
e5b0: 20 20 20 20 28 28 22 68 61 73 68 3a 22 29 20 6e      (("hash:") n
e5c0: 6f 6e 2d 69 6d 6d 65 64 69 61 74 65 20 28 66 6f  on-immediate (fo
e5d0: 6e 74 2d 6c 6f 63 6b 2d 74 79 70 65 2d 66 61 63  nt-lock-type-fac
e5e0: 65 20 2e 20 32 29 0a 20 20 20 20 20 20 22 5b 20  e . 2).      "[ 
e5f0: 5c 74 5c 6e 5d 22 20 74 20 6e 61 6d 65 20 28 66  \t\n]" t name (f
e600: 6f 6e 74 2d 6c 6f 63 6b 2d 76 61 72 69 61 62 6c  ont-lock-variabl
e610: 65 2d 6e 61 6d 65 2d 66 61 63 65 20 2e 20 33 29  e-name-face . 3)
e620: 29 0a 20 20 20 20 20 28 28 22 77 69 74 68 22 29  ).     (("with")
e630: 20 63 6f 6d 70 69 6c 65 2d 6f 6e 6c 79 20 28 66   compile-only (f
e640: 6f 6e 74 2d 6c 6f 63 6b 2d 74 79 70 65 2d 66 61  ont-lock-type-fa
e650: 63 65 20 2e 20 32 29 0a 20 20 20 20 20 20 22 5b  ce . 2).      "[
e660: 20 5c 74 5c 6e 5d 22 20 74 20 6e 61 6d 65 20 28   \t\n]" t name (
e670: 66 6f 6e 74 2d 6c 6f 63 6b 2d 76 61 72 69 61 62  font-lock-variab
e680: 6c 65 2d 6e 61 6d 65 2d 66 61 63 65 20 2e 20 33  le-name-face . 3
e690: 29 29 0a 20 20 20 20 20 28 28 22 65 6e 64 77 69  )).     (("endwi
e6a0: 74 68 22 29 20 63 6f 6d 70 69 6c 65 2d 6f 6e 6c  th") compile-onl
e6b0: 79 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 74 79 70  y (font-lock-typ
e6c0: 65 2d 66 61 63 65 20 2e 20 32 29 29 0a 20 20 20  e-face . 2)).   
e6d0: 20 29 0a 66 6f 72 74 68 2d 6c 6f 63 61 6c 2d 69   ).forth-local-i
e6e0: 6e 64 65 6e 74 2d 77 6f 72 64 73 3a 0a 20 20 20  ndent-words:.   
e6f0: 20 28 0a 20 20 20 20 28 28 22 6e 65 74 32 6f 3a   (.    (("net2o:
e700: 22 20 22 2b 6e 65 74 32 6f 3a 22 29 20 28 30 20  " "+net2o:") (0 
e710: 2e 20 32 29 20 28 30 20 2e 20 32 29 20 6e 6f 6e  . 2) (0 . 2) non
e720: 2d 69 6d 6d 65 64 69 61 74 65 29 0a 20 20 20 20  -immediate).    
e730: 28 28 22 77 69 74 68 22 29 20 28 30 20 2e 20 32  (("with") (0 . 2
e740: 29 20 28 30 20 2e 20 32 29 20 63 6f 6d 70 69 6c  ) (0 . 2) compil
e750: 65 2d 6f 6e 6c 79 29 0a 20 20 20 20 28 28 22 65  e-only).    (("e
e760: 6e 64 77 69 74 68 22 29 20 28 2d 32 20 2e 20 30  ndwith") (-2 . 0
e770: 29 20 28 30 20 2e 20 2d 32 29 20 63 6f 6d 70 69  ) (0 . -2) compi
e780: 6c 65 2d 6f 6e 6c 79 29 0a 20 20 20 20 29 0a 45  le-only).    ).E
e790: 6e 64 3a 0a 5b 54 48 45 4e 5d 0a                 nd:.[THEN].