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].