0000: 5c 20 6e 65 74 32 6f 20 63 6f 6e 6e 65 63 74 65 \ net2o connecte
0010: 64 20 63 6f 6d 6d 61 6e 64 73 0a 0a 5c 20 43 6f d commands..\ Co
0020: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 31 31 pyright (C) 2011
0030: 2d 32 30 31 34 20 20 20 42 65 72 6e 64 20 50 61 -2014 Bernd Pa
0040: 79 73 61 6e 0a 0a 5c 20 54 68 69 73 20 70 72 6f ysan..\ This pro
0050: 67 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66 gram is free sof
0060: 74 77 61 72 65 3a 20 79 6f 75 20 63 61 6e 20 72 tware: you can r
0070: 65 64 69 73 74 72 69 62 75 74 65 20 69 74 20 61 edistribute it a
0080: 6e 64 2f 6f 72 20 6d 6f 64 69 66 79 0a 5c 20 69 nd/or modify.\ i
0090: 74 20 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d t under the term
00a0: 73 20 6f 66 20 74 68 65 20 47 4e 55 20 41 66 66 s of the GNU Aff
00b0: 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 62 6c ero General Publ
00c0: 69 63 20 4c 69 63 65 6e 73 65 20 61 73 20 70 75 ic License as pu
00d0: 62 6c 69 73 68 65 64 20 62 79 0a 5c 20 74 68 65 blished by.\ the
00e0: 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46 Free Software F
00f0: 6f 75 6e 64 61 74 69 6f 6e 2c 20 65 69 74 68 65 oundation, eithe
0100: 72 20 76 65 72 73 69 6f 6e 20 33 20 6f 66 20 74 r version 3 of t
0110: 68 65 20 4c 69 63 65 6e 73 65 2c 20 6f 72 0a 5c he License, or.\
0120: 20 28 61 74 20 79 6f 75 72 20 6f 70 74 69 6f 6e (at your option
0130: 29 20 61 6e 79 20 6c 61 74 65 72 20 76 65 72 73 ) any later vers
0140: 69 6f 6e 2e 0a 0a 5c 20 54 68 69 73 20 70 72 6f ion...\ This pro
0150: 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 62 75 gram is distribu
0160: 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70 65 20 ted in the hope
0170: 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 that it will be
0180: 75 73 65 66 75 6c 2c 0a 5c 20 62 75 74 20 57 49 useful,.\ but WI
0190: 54 48 4f 55 54 20 41 4e 59 20 57 41 52 52 41 4e THOUT ANY WARRAN
01a0: 54 59 3b 20 77 69 74 68 6f 75 74 20 65 76 65 6e TY; without even
01b0: 20 74 68 65 20 69 6d 70 6c 69 65 64 20 77 61 72 the implied war
01c0: 72 61 6e 74 79 20 6f 66 0a 5c 20 4d 45 52 43 48 ranty of.\ MERCH
01d0: 41 4e 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 ANTABILITY or FI
01e0: 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 TNESS FOR A PART
01f0: 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 ICULAR PURPOSE.
0200: 20 53 65 65 20 74 68 65 0a 5c 20 47 4e 55 20 41 See the.\ GNU A
0210: 66 66 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 ffero General Pu
0220: 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f 72 blic License for
0230: 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 0a more details...
0240: 5c 20 59 6f 75 20 73 68 6f 75 6c 64 20 68 61 76 \ You should hav
0250: 65 20 72 65 63 65 69 76 65 64 20 61 20 63 6f 70 e received a cop
0260: 79 20 6f 66 20 74 68 65 20 47 4e 55 20 41 66 66 y of the GNU Aff
0270: 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 62 6c ero General Publ
0280: 69 63 20 4c 69 63 65 6e 73 65 0a 5c 20 61 6c 6f ic License.\ alo
0290: 6e 67 20 77 69 74 68 20 74 68 69 73 20 70 72 6f ng with this pro
02a0: 67 72 61 6d 2e 20 20 49 66 20 6e 6f 74 2c 20 73 gram. If not, s
02b0: 65 65 20 3c 68 74 74 70 3a 2f 2f 77 77 77 2e 67 ee <http://www.g
02c0: 6e 75 2e 6f 72 67 2f 6c 69 63 65 6e 73 65 73 2f nu.org/licenses/
02d0: 3e 2e 0a 0a 5c 20 65 76 65 72 79 74 68 69 6e 67 >...\ everything
02e0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 68 65 that follows he
02f0: 72 65 20 63 61 6e 20 61 73 73 75 6d 65 20 74 6f re can assume to
0300: 20 68 61 76 65 20 61 20 63 6f 6e 6e 65 63 74 69 have a connecti
0310: 6f 6e 20 63 6f 6e 74 65 78 74 0a 0a 73 63 6f 70 on context..scop
0320: 65 7b 20 6e 65 74 32 6f 2d 62 61 73 65 0a 0a 63 e{ net2o-base..c
0330: 6f 6e 6e 65 63 74 2d 74 61 62 6c 65 20 24 40 20 onnect-table $@
0340: 69 6e 68 65 72 69 74 2d 74 61 62 6c 65 20 63 6f inherit-table co
0350: 6e 74 65 78 74 2d 74 61 62 6c 65 0a 0a 5c 20 67 ntext-table..\ g
0360: 65 6e 65 72 69 63 20 66 75 6e 63 74 69 6f 6e 73 eneric functions
0370: 0a 5c 67 20 0a 5c 67 20 23 23 23 20 63 6f 6e 6e .\g .\g ### conn
0380: 65 63 74 69 6f 6e 20 63 6f 6d 6d 61 6e 64 73 20 ection commands
0390: 23 23 23 0a 5c 67 20 0a 2b 6e 65 74 32 6f 3a 20 ###.\g .+net2o:
03a0: 64 69 73 63 6f 6e 6e 65 63 74 20 28 20 2d 2d 20 disconnect ( --
03b0: 29 20 5c 67 20 63 6c 6f 73 65 20 63 6f 6e 6e 65 ) \g close conne
03c0: 63 74 69 6f 6e 0a 20 20 20 20 6f 20 49 46 0a 09 ction. o IF..
03d0: 77 61 69 74 2d 74 61 73 6b 20 40 20 3f 64 75 70 wait-task @ ?dup
03e0: 2d 49 46 0a 09 20 20 20 20 3c 65 76 65 6e 74 20 -IF.. <event
03f0: 6f 20 65 6c 69 74 2c 20 3a 3e 64 69 73 70 6f 73 o elit, :>dispos
0400: 65 2d 63 6f 6e 74 65 78 74 20 65 76 65 6e 74 3e e-context event>
0410: 0a 09 45 4c 53 45 20 20 6e 65 74 32 6f 3a 64 69 ..ELSE net2o:di
0420: 73 70 6f 73 65 2d 63 6f 6e 74 65 78 74 20 20 54 spose-context T
0430: 48 45 4e 0a 09 75 6e 2d 63 6d 64 20 20 54 48 45 HEN..un-cmd THE
0440: 4e 20 3b 0a 2b 6e 65 74 32 6f 3a 20 73 65 74 2d N ;.+net2o: set-
0450: 69 70 20 28 20 24 3a 73 74 72 69 6e 67 20 2d 2d ip ( $:string --
0460: 20 29 20 5c 67 20 73 65 74 20 61 64 64 72 65 73 ) \g set addres
0470: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 s information.
0480: 20 20 24 3e 20 73 65 74 69 70 2d 78 74 20 3b 0a $> setip-xt ;.
0490: 2b 6e 65 74 32 6f 3a 20 67 65 74 2d 69 70 20 28 +net2o: get-ip (
04a0: 20 2d 2d 20 29 20 5c 67 20 72 65 71 75 65 73 74 -- ) \g request
04b0: 20 61 64 64 72 65 73 73 20 69 6e 66 6f 72 6d 61 address informa
04c0: 74 69 6f 6e 0a 20 20 20 20 3e 73 6f 63 6b 61 64 tion. >sockad
04d0: 64 72 20 24 2c 20 73 65 74 2d 69 70 20 5b 3a 20 dr $, set-ip [:
04e0: 24 2c 20 73 65 74 2d 69 70 20 3b 5d 20 6e 32 6f $, set-ip ;] n2o
04f0: 61 64 64 72 73 20 3b 0a 0a 2b 6e 65 74 32 6f 3a addrs ;..+net2o:
0500: 20 73 65 74 2d 62 6c 6f 63 6b 73 69 7a 65 20 28 set-blocksize (
0510: 20 6e 20 2d 2d 20 29 20 5c 67 20 73 65 74 20 62 n -- ) \g set b
0520: 6c 6f 63 6b 73 69 7a 65 20 74 6f 20 32 5e 6e 0a locksize to 2^n.
0530: 20 20 20 20 36 34 3e 6e 20 31 20 73 77 61 70 20 64>n 1 swap
0540: 6d 61 78 2d 62 6c 6f 63 6b 23 20 75 6d 69 6e 20 max-block# umin
0550: 6c 73 68 69 66 74 20 62 6c 6f 63 6b 73 69 7a 65 lshift blocksize
0560: 73 21 20 3b 0a 2b 6e 65 74 32 6f 3a 20 73 65 74 s! ;.+net2o: set
0570: 2d 62 6c 6f 63 6b 61 6c 69 67 6e 20 28 20 6e 20 -blockalign ( n
0580: 2d 2d 20 29 20 5c 67 20 73 65 74 20 62 6c 6f 63 -- ) \g set bloc
0590: 6b 20 61 6c 69 67 6e 6d 65 6e 74 20 74 6f 20 32 k alignment to 2
05a0: 5e 6e 0a 20 20 20 20 36 34 3e 6e 20 31 20 73 77 ^n. 64>n 1 sw
05b0: 61 70 20 6d 61 78 2d 62 6c 6f 63 6b 23 20 75 6d ap max-block# um
05c0: 69 6e 20 6c 73 68 69 66 74 20 62 6c 6f 63 6b 61 in lshift blocka
05d0: 6c 69 67 6e 20 21 20 3b 0a 2b 6e 65 74 32 6f 3a lign ! ;.+net2o:
05e0: 20 63 6c 6f 73 65 2d 61 6c 6c 20 28 20 2d 2d 20 close-all ( --
05f0: 29 20 5c 67 20 63 6c 6f 73 65 20 61 6c 6c 20 66 ) \g close all f
0600: 69 6c 65 73 0a 20 20 20 20 6e 65 74 32 6f 3a 63 iles. net2o:c
0610: 6c 6f 73 65 2d 61 6c 6c 20 3b 0a 5c 20 62 65 74 lose-all ;.\ bet
0620: 74 65 72 20 73 6c 75 72 70 69 6e 67 0a 0a 2b 6e ter slurping..+n
0630: 65 74 32 6f 3a 20 73 65 74 2d 74 6f 70 20 28 20 et2o: set-top (
0640: 75 74 6f 70 20 66 6c 61 67 20 2d 2d 20 29 20 5c utop flag -- ) \
0650: 67 20 73 65 74 20 74 6f 70 2c 20 66 6c 61 67 20 g set top, flag
0660: 69 73 20 74 72 75 65 20 77 68 65 6e 20 61 6c 6c is true when all
0670: 20 64 61 74 61 20 69 73 20 73 65 6e 74 0a 20 20 data is sent.
0680: 20 20 3e 72 20 36 34 3e 6e 20 72 3e 20 64 61 74 >r 64>n r> dat
0690: 61 2d 72 6d 61 70 20 77 69 74 68 20 6d 61 70 63 a-rmap with mapc
06a0: 0a 20 20 20 20 6f 76 65 72 20 64 65 73 74 2d 74 . over dest-t
06b0: 6f 70 20 3c 3e 20 61 6e 64 20 64 65 73 74 2d 65 op <> and dest-e
06c0: 6e 64 20 6f 72 21 20 64 65 73 74 2d 74 6f 70 21 nd or! dest-top!
06d0: 0a 20 20 20 20 65 6e 64 77 69 74 68 20 3b 0a 2b . endwith ;.+
06e0: 6e 65 74 32 6f 3a 20 73 6c 75 72 70 20 28 20 2d net2o: slurp ( -
06f0: 2d 20 29 20 5c 67 20 73 6c 75 72 70 20 69 6e 20 - ) \g slurp in
0700: 74 72 61 63 6b 65 64 20 66 69 6c 65 73 0a 20 20 tracked files.
0710: 20 20 5c 20 21 21 46 49 58 4d 45 21 21 20 74 68 \ !!FIXME!! th
0720: 69 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 is should probab
0730: 6c 79 20 62 65 20 61 73 79 6e 63 68 72 6f 6e 6f ly be asynchrono
0740: 75 73 0a 20 20 20 20 6e 65 74 32 6f 3a 73 6c 75 us. net2o:slu
0750: 72 70 20 73 77 61 70 20 75 6c 69 74 2c 20 66 6c rp swap ulit, fl
0760: 61 67 2c 20 73 65 74 2d 74 6f 70 0a 20 20 20 20 ag, set-top.
0770: 5b 27 5d 20 64 6f 2d 74 72 61 63 6b 2d 73 65 65 ['] do-track-see
0780: 6b 20 6e 65 74 32 6f 3a 74 72 61 63 6b 2d 61 6c k net2o:track-al
0790: 6c 2d 73 65 65 6b 73 20 6e 65 74 32 6f 3a 73 65 l-seeks net2o:se
07a0: 6e 64 2d 63 68 75 6e 6b 73 20 3b 0a 2b 6e 65 74 nd-chunks ;.+net
07b0: 32 6f 3a 20 61 63 6b 2d 72 65 73 65 74 20 28 20 2o: ack-reset (
07c0: 2d 2d 20 29 20 5c 67 20 72 65 73 65 74 20 61 63 -- ) \g reset ac
07d0: 6b 20 73 74 61 74 65 0a 20 20 20 20 30 20 61 63 k state. 0 ac
07e0: 6b 2d 73 74 61 74 65 20 63 21 20 3b 0a 0a 5c 20 k-state c! ;..\
07f0: 6f 62 6a 65 63 74 20 68 61 6e 64 6c 65 73 0a 5c object handles.\
0800: 67 20 0a 5c 67 20 23 23 23 20 66 69 6c 65 20 63 g .\g ### file c
0810: 6f 6d 6d 61 6e 64 73 20 23 23 23 0a 5c 67 20 0a ommands ###.\g .
0820: 0a 24 33 30 20 6e 65 74 32 6f 3a 20 66 69 6c 65 .$30 net2o: file
0830: 2d 69 64 20 28 20 75 69 64 20 2d 2d 20 6f 3a 66 -id ( uid -- o:f
0840: 69 6c 65 20 29 20 5c 67 20 63 68 6f 6f 73 65 20 ile ) \g choose
0850: 61 20 66 69 6c 65 20 6f 62 6a 65 63 74 0a 20 20 a file object.
0860: 20 20 36 34 3e 6e 20 73 74 61 74 65 2d 61 64 64 64>n state-add
0870: 72 20 6e 3a 3e 6f 20 3b 0a 66 73 2d 74 61 62 6c r n:>o ;.fs-tabl
0880: 65 20 3e 74 61 62 6c 65 0a 0a 72 65 70 6c 79 2d e >table..reply-
0890: 74 61 62 6c 65 20 24 40 20 69 6e 68 65 72 69 74 table $@ inherit
08a0: 2d 74 61 62 6c 65 20 66 73 2d 74 61 62 6c 65 0a -table fs-table.
08b0: 0a 3a 20 66 69 6c 65 2d 73 74 61 72 74 2d 72 65 .: file-start-re
08c0: 71 20 66 73 2d 69 64 20 40 20 75 6c 69 74 2c 20 q fs-id @ ulit,
08d0: 66 69 6c 65 2d 69 64 20 3b 0a 27 20 66 69 6c 65 file-id ;.' file
08e0: 2d 73 74 61 72 74 2d 72 65 71 0a 66 69 6c 65 2d -start-req.file-
08f0: 63 6c 61 73 73 65 73 20 66 69 6c 65 2d 63 6c 61 classes file-cla
0900: 73 73 65 73 23 20 63 65 6c 6c 73 20 62 6f 75 6e sses# cells boun
0910: 64 73 0a 5b 44 4f 5d 20 64 75 70 20 5b 49 5d 20 ds.[DO] dup [I]
0920: 40 20 74 6f 20 73 74 61 72 74 2d 72 65 71 20 63 @ to start-req c
0930: 65 6c 6c 20 5b 2b 4c 4f 4f 50 5d 0a 64 72 6f 70 ell [+LOOP].drop
0940: 0a 0a 24 32 30 20 6e 65 74 32 6f 3a 20 6f 70 65 ..$20 net2o: ope
0950: 6e 2d 66 69 6c 65 20 28 20 24 3a 73 74 72 69 6e n-file ( $:strin
0960: 67 20 6d 6f 64 65 20 2d 2d 20 29 20 5c 67 20 6f g mode -- ) \g o
0970: 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 6d 6f pen file with mo
0980: 64 65 0a 20 20 20 20 70 61 72 65 6e 74 20 2e 70 de. parent .p
0990: 65 72 6d 2d 6d 61 73 6b 20 40 20 3e 72 20 72 40 erm-mask @ >r r@
09a0: 20 66 73 2d 70 65 72 6d 3f 0a 20 20 20 20 36 34 fs-perm?. 64
09b0: 3e 6e 20 2d 32 20 61 6e 64 20 34 20 75 6d 69 6e >n -2 and 4 umin
09c0: 20 64 75 70 20 72 3e 20 3f 72 77 2d 70 65 72 6d dup r> ?rw-perm
09d0: 20 20 3e 72 20 24 3e 20 72 3e 20 66 73 2d 6f 70 >r $> r> fs-op
09e0: 65 6e 20 3b 0a 2b 6e 65 74 32 6f 3a 20 66 69 6c en ;.+net2o: fil
09f0: 65 2d 74 79 70 65 20 28 20 6e 20 2d 2d 20 29 20 e-type ( n -- )
0a00: 5c 67 20 63 68 6f 6f 73 65 20 66 69 6c 65 20 74 \g choose file t
0a10: 79 70 65 0a 20 20 20 20 36 34 3e 6e 20 66 73 2d ype. 64>n fs-
0a20: 63 6c 61 73 73 21 20 3b 0a 2b 6e 65 74 32 6f 3a class! ;.+net2o:
0a30: 20 63 6c 6f 73 65 2d 66 69 6c 65 20 28 20 2d 2d close-file ( --
0a40: 20 29 20 5c 67 20 63 6c 6f 73 65 20 66 69 6c 65 ) \g close file
0a50: 0a 20 20 20 20 66 73 2d 63 6c 6f 73 65 20 3b 0a . fs-close ;.
0a60: 2b 6e 65 74 32 6f 3a 20 73 65 74 2d 73 69 7a 65 +net2o: set-size
0a70: 20 28 20 73 69 7a 65 20 2d 2d 20 29 20 5c 67 20 ( size -- ) \g
0a80: 73 65 74 20 73 69 7a 65 20 61 74 74 72 69 62 75 set size attribu
0a90: 74 65 20 6f 66 20 63 75 72 72 65 6e 74 20 66 69 te of current fi
0aa0: 6c 65 0a 20 20 20 20 74 72 61 63 6b 28 20 2e 22 le. track( ."
0ab0: 20 66 69 6c 65 20 3c 22 20 66 73 2d 69 64 20 40 file <" fs-id @
0ac0: 20 30 20 2e 72 20 2e 22 20 3e 20 73 69 7a 65 3a 0 .r ." > size:
0ad0: 20 22 20 36 34 64 75 70 20 75 36 34 2e 20 66 6f " 64dup u64. fo
0ae0: 72 74 68 3a 63 72 20 29 20 73 69 7a 65 21 20 3b rth:cr ) size! ;
0af0: 0a 2b 6e 65 74 32 6f 3a 20 73 65 74 2d 73 65 65 .+net2o: set-see
0b00: 6b 20 28 20 75 73 65 65 6b 20 2d 2d 20 29 20 5c k ( useek -- ) \
0b10: 67 20 73 65 74 20 73 65 65 6b 20 61 74 74 72 69 g set seek attri
0b20: 62 75 74 65 20 6f 66 20 63 75 72 72 65 6e 74 20 bute of current
0b30: 66 69 6c 65 0a 20 20 20 20 74 72 61 63 6b 28 20 file. track(
0b40: 2e 22 20 66 69 6c 65 20 3c 22 20 66 73 2d 69 64 ." file <" fs-id
0b50: 20 40 20 30 20 2e 72 20 2e 22 20 3e 20 73 65 65 @ 0 .r ." > see
0b60: 6b 3a 20 22 20 36 34 64 75 70 20 75 36 34 2e 20 k: " 64dup u64.
0b70: 66 6f 72 74 68 3a 63 72 20 29 20 73 65 65 6b 74 forth:cr ) seekt
0b80: 6f 21 20 3b 0a 2b 6e 65 74 32 6f 3a 20 73 65 74 o! ;.+net2o: set
0b90: 2d 6c 69 6d 69 74 20 28 20 75 6c 69 6d 69 74 20 -limit ( ulimit
0ba0: 2d 2d 20 29 20 5c 67 20 73 65 74 20 6c 69 6d 69 -- ) \g set limi
0bb0: 74 20 61 74 74 72 69 62 75 74 65 20 6f 66 20 63 t attribute of c
0bc0: 75 72 72 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 urrent file.
0bd0: 74 72 61 63 6b 28 20 2e 22 20 66 69 6c 65 20 3c track( ." file <
0be0: 22 20 66 73 2d 69 64 20 40 20 30 20 2e 72 20 2e " fs-id @ 0 .r .
0bf0: 22 20 3e 20 73 65 65 6b 20 74 6f 3a 20 22 20 36 " > seek to: " 6
0c00: 34 64 75 70 20 75 36 34 2e 20 66 6f 72 74 68 3a 4dup u64. forth:
0c10: 63 72 20 29 20 6c 69 6d 69 74 2d 6d 69 6e 21 20 cr ) limit-min!
0c20: 3b 0a 2b 6e 65 74 32 6f 3a 20 73 65 74 2d 73 74 ;.+net2o: set-st
0c30: 61 74 20 28 20 75 6d 74 69 6d 65 20 75 6d 6f 64 at ( umtime umod
0c40: 20 2d 2d 20 29 20 5c 67 20 73 65 74 20 74 69 6d -- ) \g set tim
0c50: 65 20 61 6e 64 20 6d 6f 64 65 20 6f 66 20 63 75 e and mode of cu
0c60: 72 72 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 36 rrent file. 6
0c70: 34 3e 6e 20 66 73 2d 73 65 74 2d 73 74 61 74 20 4>n fs-set-stat
0c80: 3b 0a 2b 6e 65 74 32 6f 3a 20 67 65 74 2d 73 69 ;.+net2o: get-si
0c90: 7a 65 20 28 20 2d 2d 20 29 20 5c 67 20 72 65 71 ze ( -- ) \g req
0ca0: 75 65 73 74 20 66 69 6c 65 20 73 69 7a 65 0a 20 uest file size.
0cb0: 20 20 20 66 73 2d 73 69 7a 65 20 6c 69 74 2c 20 fs-size lit,
0cc0: 73 65 74 2d 73 69 7a 65 20 3b 0a 2b 6e 65 74 32 set-size ;.+net2
0cd0: 6f 3a 20 67 65 74 2d 73 74 61 74 20 28 20 2d 2d o: get-stat ( --
0ce0: 20 29 20 5c 67 20 72 65 71 75 65 73 74 20 73 74 ) \g request st
0cf0: 61 74 20 6f 66 20 63 75 72 72 65 6e 74 20 66 69 at of current fi
0d00: 6c 65 0a 20 20 20 20 66 73 2d 67 65 74 2d 73 74 le. fs-get-st
0d10: 61 74 20 3e 72 20 6c 69 74 2c 20 72 3e 20 75 6c at >r lit, r> ul
0d20: 69 74 2c 20 73 65 74 2d 73 74 61 74 20 3b 0a 2b it, set-stat ;.+
0d30: 6e 65 74 32 6f 3a 20 73 65 74 2d 66 6f 72 6d 20 net2o: set-form
0d40: 28 20 77 20 68 20 2d 2d 20 29 20 5c 67 20 69 66 ( w h -- ) \g if
0d50: 20 66 69 6c 65 20 69 73 20 61 20 74 65 72 6d 69 file is a termi
0d60: 6e 61 6c 2c 20 73 65 74 20 73 69 7a 65 0a 20 20 nal, set size.
0d70: 20 20 74 65 72 6d 2d 68 20 21 20 74 65 72 6d 2d term-h ! term-
0d80: 77 20 21 20 3b 0a 2b 6e 65 74 32 6f 3a 20 67 65 w ! ;.+net2o: ge
0d90: 74 2d 66 6f 72 6d 20 28 20 2d 2d 20 29 20 5c 67 t-form ( -- ) \g
0da0: 20 69 66 20 66 69 6c 65 20 69 73 20 61 20 74 65 if file is a te
0db0: 72 6d 69 6e 61 6c 2c 20 72 65 71 75 65 73 74 20 rminal, request
0dc0: 73 69 7a 65 0a 20 20 20 20 74 65 72 6d 2d 77 20 size. term-w
0dd0: 40 20 75 6c 69 74 2c 20 74 65 72 6d 2d 68 20 40 @ ulit, term-h @
0de0: 20 75 6c 69 74 2c 20 73 65 74 2d 66 6f 72 6d 20 ulit, set-form
0df0: 3b 0a 2b 6e 65 74 32 6f 3a 20 70 6f 6c 6c 2d 72 ;.+net2o: poll-r
0e00: 65 71 75 65 73 74 20 28 20 75 6c 69 6d 69 74 20 equest ( ulimit
0e10: 2d 2d 20 29 20 5c 67 20 70 6f 6c 6c 20 61 20 66 -- ) \g poll a f
0e20: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 ile to check for
0e30: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 0a 20 20 size changes.
0e40: 20 20 70 6f 6c 6c 21 20 6c 69 74 2c 20 73 65 74 poll! lit, set
0e50: 2d 73 69 7a 65 20 3b 0a 0a 67 65 6e 2d 74 61 62 -size ;..gen-tab
0e60: 6c 65 20 24 66 72 65 65 7a 65 0a 27 20 63 6f 6e le $freeze.' con
0e70: 74 65 78 74 2d 74 61 62 6c 65 20 69 73 20 67 65 text-table is ge
0e80: 6e 2d 74 61 62 6c 65 0a 0a 3a 6e 6f 6e 61 6d 65 n-table..:noname
0e90: 20 28 20 75 69 64 20 75 73 65 65 6b 20 2d 2d 20 ( uid useek --
0ea0: 29 20 36 34 3e 72 20 75 6c 69 74 2c 20 66 69 6c ) 64>r ulit, fil
0eb0: 65 2d 69 64 0a 20 20 20 20 36 34 72 3e 20 6c 69 e-id. 64r> li
0ec0: 74 2c 20 73 65 74 2d 73 65 65 6b 20 65 6e 64 2d t, set-seek end-
0ed0: 77 69 74 68 20 3b 20 69 73 20 64 6f 2d 74 72 61 with ; is do-tra
0ee0: 63 6b 2d 73 65 65 6b 0a 0a 5c 20 66 6c 6f 77 20 ck-seek..\ flow
0ef0: 63 6f 6e 74 72 6f 6c 20 66 75 6e 63 74 69 6f 6e control function
0f00: 73 0a 5c 67 20 0a 5c 67 20 23 23 23 20 61 63 6b s.\g .\g ### ack
0f10: 20 63 6f 6d 6d 61 6e 64 73 20 23 23 23 0a 5c 67 commands ###.\g
0f20: 20 0a 0a 24 33 31 20 6e 65 74 32 6f 3a 20 61 63 ..$31 net2o: ac
0f30: 6b 20 28 20 2d 2d 20 6f 3a 61 63 6b 6f 20 29 20 k ( -- o:acko )
0f40: 5c 67 20 61 63 6b 20 6f 62 6a 65 63 74 0a 20 20 \g ack object.
0f50: 20 20 61 63 6b 40 20 6e 3a 3e 6f 20 3b 0a 61 63 ack@ n:>o ;.ac
0f60: 6b 2d 74 61 62 6c 65 20 3e 74 61 62 6c 65 0a 72 k-table >table.r
0f70: 65 70 6c 79 2d 74 61 62 6c 65 20 24 40 20 69 6e eply-table $@ in
0f80: 68 65 72 69 74 2d 74 61 62 6c 65 20 61 63 6b 2d herit-table ack-
0f90: 74 61 62 6c 65 0a 0a 3a 6e 6f 6e 61 6d 65 20 61 table..:noname a
0fa0: 63 6b 20 3b 20 61 63 6b 2d 63 6c 61 73 73 20 74 ck ; ack-class t
0fb0: 6f 20 73 74 61 72 74 2d 72 65 71 0a 24 32 30 20 o start-req.$20
0fc0: 6e 65 74 32 6f 3a 20 61 63 6b 2d 61 64 64 72 74 net2o: ack-addrt
0fd0: 69 6d 65 20 28 20 75 74 69 6d 65 20 61 64 64 72 ime ( utime addr
0fe0: 20 2d 2d 20 29 20 5c 67 20 70 61 63 6b 65 74 20 -- ) \g packet
0ff0: 61 74 20 61 64 64 72 20 72 65 63 65 69 76 65 64 at addr received
1000: 20 61 74 20 74 69 6d 65 0a 20 20 20 20 6e 65 74 at time. net
1010: 32 6f 3a 61 63 6b 2d 61 64 64 72 74 69 6d 65 20 2o:ack-addrtime
1020: 3b 0a 2b 6e 65 74 32 6f 3a 20 61 63 6b 2d 72 65 ;.+net2o: ack-re
1030: 73 65 6e 64 20 28 20 66 6c 61 67 20 2d 2d 20 29 send ( flag -- )
1040: 20 5c 67 20 73 65 74 20 72 65 73 65 6e 64 20 74 \g set resend t
1050: 6f 67 67 6c 65 20 66 6c 61 67 0a 20 20 20 20 36 oggle flag. 6
1060: 34 3e 6e 20 20 70 61 72 65 6e 74 20 2e 6e 65 74 4>n parent .net
1070: 32 6f 3a 61 63 6b 2d 72 65 73 65 6e 64 20 3b 0a 2o:ack-resend ;.
1080: 2b 6e 65 74 32 6f 3a 20 73 65 74 2d 72 61 74 65 +net2o: set-rate
1090: 20 28 20 75 72 61 74 65 20 75 64 65 6c 74 61 2d ( urate udelta-
10a0: 74 20 2d 2d 20 29 20 5c 67 20 73 65 74 20 72 61 t -- ) \g set ra
10b0: 74 65 20 0a 20 20 20 20 70 61 72 65 6e 74 20 3e te . parent >
10c0: 6f 20 63 6f 6f 6b 69 65 3f 20 49 46 20 20 61 63 o cookie? IF ac
10d0: 6b 40 20 2e 6e 65 74 32 6f 3a 73 65 74 2d 72 61 k@ .net2o:set-ra
10e0: 74 65 0a 20 20 20 20 45 4c 53 45 20 20 36 34 64 te. ELSE 64d
10f0: 72 6f 70 20 36 34 64 72 6f 70 20 61 63 6b 2d 6f rop 64drop ack-o
1100: 72 64 65 72 3f 0a 09 49 46 20 20 61 63 6b 40 20 rder?..IF ack@
1110: 2e 6e 73 2f 62 75 72 73 74 20 64 75 70 20 3e 72 .ns/burst dup >r
1120: 20 36 34 40 20 36 34 2d 32 2a 20 36 34 2d 32 2a 64@ 64-2* 64-2*
1130: 20 72 3e 20 36 34 21 0a 09 54 48 45 4e 0a 20 20 r> 64!..THEN.
1140: 20 20 54 48 45 4e 20 6f 3e 20 3b 0a 2b 6e 65 74 THEN o> ;.+net
1150: 32 6f 3a 20 72 65 73 65 6e 64 2d 6d 61 73 6b 20 2o: resend-mask
1160: 28 20 61 64 64 72 20 75 6d 61 73 6b 20 2d 2d 20 ( addr umask --
1170: 29 20 5c 67 20 72 65 73 65 6e 64 20 6d 61 73 6b ) \g resend mask
1180: 20 62 6c 6f 63 6b 73 20 73 74 61 72 74 69 6e 67 blocks starting
1190: 20 61 74 20 61 64 64 72 0a 20 20 20 20 32 2a 36 at addr. 2*6
11a0: 34 3e 6e 20 70 61 72 65 6e 74 20 3e 6f 20 6e 65 4>n parent >o ne
11b0: 74 32 6f 3a 72 65 73 65 6e 64 2d 6d 61 73 6b 20 t2o:resend-mask
11c0: 6e 65 74 32 6f 3a 73 65 6e 64 2d 63 68 75 6e 6b net2o:send-chunk
11d0: 73 20 6f 3e 20 3b 0a 2b 6e 65 74 32 6f 3a 20 74 s o> ;.+net2o: t
11e0: 72 61 63 6b 2d 74 69 6d 69 6e 67 20 28 20 2d 2d rack-timing ( --
11f0: 20 29 20 5c 67 20 74 72 61 63 6b 20 74 69 6d 69 ) \g track timi
1200: 6e 67 0a 20 20 20 20 6e 65 74 32 6f 3a 74 72 61 ng. net2o:tra
1210: 63 6b 2d 74 69 6d 69 6e 67 20 3b 0a 2b 6e 65 74 ck-timing ;.+net
1220: 32 6f 3a 20 72 65 63 2d 74 69 6d 69 6e 67 20 28 2o: rec-timing (
1230: 20 24 3a 73 74 72 69 6e 67 20 2d 2d 20 29 20 5c $:string -- ) \
1240: 67 20 72 65 63 6f 72 64 65 64 20 74 69 6d 69 6e g recorded timin
1250: 67 0a 20 20 20 20 24 3e 20 6e 65 74 32 6f 3a 72 g. $> net2o:r
1260: 65 63 2d 74 69 6d 69 6e 67 20 3b 0a 2b 6e 65 74 ec-timing ;.+net
1270: 32 6f 3a 20 73 65 6e 64 2d 74 69 6d 69 6e 67 20 2o: send-timing
1280: 28 20 2d 2d 20 29 20 5c 67 20 72 65 71 75 65 73 ( -- ) \g reques
1290: 74 20 72 65 63 6f 72 64 65 64 20 74 69 6d 69 6e t recorded timin
12a0: 67 0a 20 20 20 20 6e 65 74 32 6f 3a 74 69 6d 69 g. net2o:timi
12b0: 6e 67 24 20 6d 61 78 74 69 6d 69 6e 67 20 75 6d ng$ maxtiming um
12c0: 69 6e 20 74 75 63 6b 20 24 2c 20 6e 65 74 32 6f in tuck $, net2o
12d0: 3a 2f 74 69 6d 69 6e 67 20 72 65 63 2d 74 69 6d :/timing rec-tim
12e0: 69 6e 67 20 3b 0a 2b 6e 65 74 32 6f 3a 20 61 63 ing ;.+net2o: ac
12f0: 6b 2d 62 32 62 74 69 6d 65 20 28 20 75 74 69 6d k-b2btime ( utim
1300: 65 20 61 64 64 72 20 2d 2d 20 29 20 5c 67 20 62 e addr -- ) \g b
1310: 75 72 73 74 2d 74 6f 2d 62 75 72 73 74 20 74 69 urst-to-burst ti
1320: 6d 65 20 61 74 20 70 61 63 6b 65 74 20 61 64 64 me at packet add
1330: 72 0a 20 20 20 20 6e 65 74 32 6f 3a 61 63 6b 2d r. net2o:ack-
1340: 62 32 62 74 69 6d 65 20 3b 0a 2b 6e 65 74 32 6f b2btime ;.+net2o
1350: 3a 20 61 63 6b 2d 72 65 73 65 6e 64 23 20 28 20 : ack-resend# (
1360: 61 64 64 72 20 24 3a 73 74 72 69 6e 67 20 2d 2d addr $:string --
1370: 20 29 20 5c 67 20 72 65 73 65 6e 64 20 6e 75 6d ) \g resend num
1380: 62 65 72 73 0a 20 20 20 20 36 34 3e 6e 20 24 3e bers. 64>n $>
1390: 0a 20 20 20 20 61 63 6b 2d 6f 72 64 65 72 3f 20 . ack-order?
13a0: 49 46 0a 09 70 61 72 65 6e 74 20 2e 64 61 74 61 IF..parent .data
13b0: 2d 6d 61 70 20 2e 6d 61 70 63 3a 72 65 73 65 6e -map .mapc:resen
13c0: 64 23 3f 20 64 75 70 20 30 3d 20 49 46 0a 09 20 d#? dup 0= IF..
13d0: 20 20 20 64 72 6f 70 20 74 69 6d 65 6f 75 74 28 drop timeout(
13e0: 20 2e 22 20 72 65 73 65 6e 64 23 20 64 6f 6e 27 ." resend# don'
13f0: 74 20 6d 61 74 63 68 21 22 20 66 6f 72 74 68 3a t match!" forth:
1400: 63 72 0a 09 20 20 20 20 70 61 72 65 6e 74 20 2e cr.. parent .
1410: 6e 65 74 32 6f 3a 73 65 65 2d 6d 65 20 29 0a 09 net2o:see-me )..
1420: 20 20 20 20 5b 20 63 6f 6f 6b 69 65 2d 76 61 6c [ cookie-val
1430: 20 31 20 76 61 6c 69 64 61 74 65 64 23 20 6c 73 1 validated# ls
1440: 68 69 66 74 20 31 2d 20 78 6f 72 20 5d 4c 20 76 hift 1- xor ]L v
1450: 61 6c 69 64 61 74 65 64 20 61 6e 64 21 0a 09 45 alidated and!..E
1460: 4c 53 45 0a 09 20 20 20 20 76 61 6c 69 64 61 74 LSE.. validat
1470: 65 64 23 20 6c 73 68 69 66 74 20 76 61 6c 69 64 ed# lshift valid
1480: 61 74 65 64 20 2b 21 20 63 6f 6f 6b 69 65 2d 76 ated +! cookie-v
1490: 61 6c 20 76 61 6c 69 64 61 74 65 64 20 6f 72 21 al validated or!
14a0: 0a 09 54 48 45 4e 0a 20 20 20 20 45 4c 53 45 20 ..THEN. ELSE
14b0: 20 74 69 6d 65 6f 75 74 28 20 2e 22 20 6f 75 74 timeout( ." out
14c0: 20 6f 66 20 6f 72 64 65 72 20 61 72 72 69 76 61 of order arriva
14d0: 6c 20 6f 66 20 61 63 6b 22 20 66 6f 72 74 68 3a l of ack" forth:
14e0: 63 72 20 29 0a 09 32 64 72 6f 70 20 64 72 6f 70 cr )..2drop drop
14f0: 0a 20 20 20 20 54 48 45 4e 20 3b 0a 2b 6e 65 74 . THEN ;.+net
1500: 32 6f 3a 20 61 63 6b 2d 66 6c 75 73 68 20 28 20 2o: ack-flush (
1510: 61 64 64 72 20 2d 2d 20 29 20 5c 67 20 66 6c 75 addr -- ) \g flu
1520: 73 68 65 64 20 74 6f 20 61 64 64 72 0a 20 20 20 shed to addr.
1530: 20 36 34 3e 6e 20 70 61 72 65 6e 74 20 2e 6e 65 64>n parent .ne
1540: 74 32 6f 3a 72 65 77 69 6e 64 2d 73 65 6e 64 65 t2o:rewind-sende
1550: 72 2d 70 61 72 74 69 61 6c 20 3b 0a 2b 6e 65 74 r-partial ;.+net
1560: 32 6f 3a 20 73 65 74 2d 68 65 61 64 20 28 20 61 2o: set-head ( a
1570: 64 64 72 20 2d 2d 20 29 20 5c 67 20 73 65 74 20 ddr -- ) \g set
1580: 68 65 61 64 0a 20 20 20 20 36 34 3e 6e 20 70 61 head. 64>n pa
1590: 72 65 6e 74 20 2e 64 61 74 61 2d 72 6d 61 70 20 rent .data-rmap
15a0: 3e 6f 20 61 64 64 72 20 6d 61 70 63 3a 64 65 73 >o addr mapc:des
15b0: 74 2d 68 65 61 64 20 6f 3e 20 75 6d 61 78 21 20 t-head o> umax!
15c0: 3b 0a 2b 6e 65 74 32 6f 3a 20 74 69 6d 65 6f 75 ;.+net2o: timeou
15d0: 74 20 28 20 75 74 69 63 6b 73 20 2d 2d 20 29 20 t ( uticks -- )
15e0: 5c 67 20 74 69 6d 65 6f 75 74 20 72 65 71 75 65 \g timeout reque
15f0: 73 74 0a 20 20 20 20 70 61 72 65 6e 74 20 3e 6f st. parent >o
1600: 20 6e 65 74 32 6f 3a 74 69 6d 65 6f 75 74 20 20 net2o:timeout
1610: 64 61 74 61 2d 6d 61 70 20 2e 6d 61 70 63 3a 64 data-map .mapc:d
1620: 65 73 74 2d 74 61 69 6c 20 6f 3e 20 75 6c 69 74 est-tail o> ulit
1630: 2c 20 73 65 74 2d 68 65 61 64 20 3b 0a 2b 6e 65 , set-head ;.+ne
1640: 74 32 6f 3a 20 73 65 74 2d 72 74 64 65 6c 61 79 t2o: set-rtdelay
1650: 20 28 20 74 69 63 6b 73 20 2d 2d 20 29 20 5c 67 ( ticks -- ) \g
1660: 20 73 65 74 20 72 6f 75 6e 64 20 74 72 69 70 20 set round trip
1670: 64 65 6c 61 79 20 6f 6e 6c 79 0a 20 20 20 20 72 delay only. r
1680: 74 64 65 6c 61 79 21 20 3b 0a 2b 6e 65 74 32 6f tdelay! ;.+net2o
1690: 3a 20 73 65 71 23 20 28 20 6e 20 2d 2d 20 29 20 : seq# ( n -- )
16a0: 5c 67 20 73 65 74 20 74 68 65 20 61 63 6b 20 6e \g set the ack n
16b0: 75 6d 62 65 72 20 61 6e 64 20 63 68 65 63 6b 20 umber and check
16c0: 66 6f 72 20 73 6d 61 6c 6c 65 72 0a 20 20 20 20 for smaller.
16d0: 36 34 3e 6e 20 70 61 72 65 6e 74 20 2e 64 61 74 64>n parent .dat
16e0: 61 2d 6d 61 70 20 77 69 74 68 20 6d 61 70 63 0a a-map with mapc.
16f0: 20 20 20 20 64 75 70 20 73 65 6e 64 2d 61 63 6b dup send-ack
1700: 23 20 75 3e 20 49 46 20 20 74 6f 20 73 65 6e 64 # u> IF to send
1710: 2d 61 63 6b 23 20 20 61 63 6b 2d 6f 72 64 65 72 -ack# ack-order
1720: 2d 76 61 6c 20 76 61 6c 69 64 61 74 65 64 20 6f -val validated o
1730: 72 21 20 20 45 4c 53 45 0a 09 64 72 6f 70 20 5b r! ELSE..drop [
1740: 20 61 63 6b 2d 6f 72 64 65 72 2d 76 61 6c 20 69 ack-order-val i
1750: 6e 76 65 72 74 20 5d 4c 20 76 61 6c 69 64 61 74 nvert ]L validat
1760: 65 64 20 61 6e 64 21 0a 20 20 20 20 54 48 45 4e ed and!. THEN
1770: 0a 20 20 20 20 65 6e 64 77 69 74 68 20 3b 0a 0a . endwith ;..
1780: 5c 20 70 72 6f 66 69 6c 69 6e 67 2c 20 6e 61 74 \ profiling, nat
1790: 20 74 72 61 76 65 72 73 61 6c 0a 0a 67 65 6e 2d traversal..gen-
17a0: 74 61 62 6c 65 20 24 66 72 65 65 7a 65 0a 27 20 table $freeze.'
17b0: 63 6f 6e 74 65 78 74 2d 74 61 62 6c 65 20 69 73 context-table is
17c0: 20 67 65 6e 2d 74 61 62 6c 65 0a 0a 69 6e 20 6e gen-table..in n
17d0: 65 74 32 6f 20 3a 20 67 65 6e 2d 72 65 73 65 6e et2o : gen-resen
17e0: 64 20 28 20 2d 2d 20 29 0a 20 20 20 20 61 63 6b d ( -- ). ack
17f0: 2d 72 65 63 65 69 76 65 20 69 6e 76 65 72 74 20 -receive invert
1800: 72 65 73 65 6e 64 2d 74 6f 67 67 6c 65 23 20 61 resend-toggle# a
1810: 6e 64 20 75 6c 69 74 2c 20 61 63 6b 2d 72 65 73 nd ulit, ack-res
1820: 65 6e 64 20 3b 0a 69 6e 20 6e 65 74 32 6f 20 3a end ;.in net2o :
1830: 20 67 65 6e 2d 72 65 73 65 74 20 28 20 2d 2d 20 gen-reset ( --
1840: 29 0a 20 20 20 20 61 63 6b 2d 72 65 73 65 74 20 ). ack-reset
1850: 30 20 74 6f 20 61 63 6b 2d 72 65 63 65 69 76 65 0 to ack-receive
1860: 20 3b 0a 0a 3a 20 72 65 77 69 6e 64 20 28 20 2d ;..: rewind ( -
1870: 2d 20 29 0a 20 20 20 20 64 61 74 61 2d 72 6d 61 - ). data-rma
1880: 70 20 2e 6d 61 70 63 3a 64 65 73 74 2d 62 61 63 p .mapc:dest-bac
1890: 6b 20 75 6c 69 74 2c 20 61 63 6b 2d 66 6c 75 73 k ulit, ack-flus
18a0: 68 20 3b 0a 0a 5c 20 73 61 66 65 20 69 6e 69 74 h ;..\ safe init
18b0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 0a 3a 20 6c 69 ialization..: li
18c0: 74 3c 20 20 20 6c 69 74 2c 20 70 75 73 68 2d 6c t< lit, push-l
18d0: 69 74 20 3b 0a 3a 6e 6f 6e 61 6d 65 20 28 20 74 it ;.:noname ( t
18e0: 68 72 6f 77 63 6f 64 65 20 2d 2d 20 29 0a 20 20 hrowcode -- ).
18f0: 20 20 72 65 6d 6f 74 65 3f 20 40 20 49 46 0a 09 remote? @ IF..
1900: 3f 64 75 70 2d 49 46 20 20 69 6e 69 74 2d 72 65 ?dup-IF init-re
1910: 70 6c 79 0a 09 20 20 20 20 24 65 72 72 6f 72 2d ply.. $error-
1920: 69 64 20 24 40 20 64 75 70 20 49 46 20 20 24 2c id $@ dup IF $,
1930: 20 65 72 72 6f 72 2d 69 64 20 20 45 4c 53 45 20 error-id ELSE
1940: 20 32 64 72 6f 70 20 20 54 48 45 4e 0a 09 20 20 2drop THEN..
1950: 20 20 6e 6c 69 74 2c 20 6b 6f 20 20 54 48 45 4e nlit, ko THEN
1960: 0a 20 20 20 20 45 4c 53 45 0a 09 65 72 72 6f 72 . ELSE..error
1970: 2d 69 64 3e 6f 20 3f 64 75 70 2d 49 46 0a 09 20 -id>o ?dup-IF..
1980: 20 20 20 3e 6f 20 3c 65 76 65 6e 74 20 65 6c 69 >o <event eli
1990: 74 2c 20 3a 3e 74 68 72 6f 77 20 77 61 69 74 2d t, :>throw wait-
19a0: 74 61 73 6b 20 40 20 65 76 65 6e 74 3e 20 6f 3e task @ event> o>
19b0: 0a 09 45 4c 53 45 20 20 74 68 72 6f 77 20 20 54 ..ELSE throw T
19c0: 48 45 4e 0a 20 20 20 20 54 48 45 4e 20 3b 20 49 HEN. THEN ; I
19d0: 53 20 3e 74 68 72 6f 77 0a 0a 61 6c 73 6f 20 7d S >throw..also }
19e0: 73 63 6f 70 65 0a 0a 3a 20 62 6c 6f 63 6b 73 69 scope..: blocksi
19f0: 7a 65 21 20 28 20 6e 20 2d 2d 20 29 20 20 6d 61 ze! ( n -- ) ma
1a00: 78 2d 62 6c 6f 63 6b 23 20 75 6d 69 6e 20 64 75 x-block# umin du
1a10: 70 20 75 6c 69 74 2c 20 73 65 74 2d 62 6c 6f 63 p ulit, set-bloc
1a20: 6b 73 69 7a 65 0a 20 20 20 20 31 20 73 77 61 70 ksize. 1 swap
1a30: 20 6c 73 68 69 66 74 20 62 6c 6f 63 6b 73 69 7a lshift blocksiz
1a40: 65 73 21 20 3b 0a 3a 20 62 6c 6f 63 6b 61 6c 69 es! ;.: blockali
1a50: 67 6e 21 20 28 20 6e 20 2d 2d 20 29 20 6d 61 78 gn! ( n -- ) max
1a60: 2d 62 6c 6f 63 6b 23 20 75 6d 69 6e 20 64 75 70 -block# umin dup
1a70: 20 75 6c 69 74 2c 20 73 65 74 2d 62 6c 6f 63 6b ulit, set-block
1a80: 61 6c 69 67 6e 0a 20 20 20 20 31 20 73 77 61 70 align. 1 swap
1a90: 20 6c 73 68 69 66 74 20 62 6c 6f 63 6b 61 6c 69 lshift blockali
1aa0: 67 6e 20 21 20 3b 0a 0a 3a 20 6f 70 65 6e 2d 73 gn ! ;..: open-s
1ab0: 69 7a 65 64 2d 66 69 6c 65 20 28 20 61 64 64 72 ized-file ( addr
1ac0: 20 75 20 6d 6f 64 65 20 2d 2d 29 0a 20 20 20 20 u mode --).
1ad0: 6f 70 65 6e 2d 66 69 6c 65 20 67 65 74 2d 73 69 open-file get-si
1ae0: 7a 65 20 3b 0a 3a 20 6f 70 65 6e 2d 74 72 61 63 ze ;.: open-trac
1af0: 6b 65 64 2d 66 69 6c 65 20 28 20 61 64 64 72 20 ked-file ( addr
1b00: 75 20 6d 6f 64 65 20 2d 2d 29 0a 20 20 20 20 6f u mode --). o
1b10: 70 65 6e 2d 73 69 7a 65 64 2d 66 69 6c 65 20 67 pen-sized-file g
1b20: 65 74 2d 73 74 61 74 20 3b 0a 0a 3a 20 6e 32 6f et-stat ;..: n2o
1b30: 3e 66 69 6c 65 20 28 20 78 74 20 2d 2d 20 29 0a >file ( xt -- ).
1b40: 20 20 20 20 66 69 6c 65 2d 72 65 67 23 20 40 20 file-reg# @
1b50: 75 6c 69 74 2c 20 66 69 6c 65 2d 69 64 20 20 63 ulit, file-id c
1b60: 61 74 63 68 20 20 65 6e 64 2d 77 69 74 68 0a 20 atch end-with.
1b70: 20 20 20 74 68 72 6f 77 20 20 31 20 66 69 6c 65 throw 1 file
1b80: 2d 72 65 67 23 20 2b 21 20 3b 0a 0a 69 6e 20 6e -reg# +! ;..in n
1b90: 65 74 32 6f 20 3a 20 63 6f 70 79 20 28 20 61 64 et2o : copy ( ad
1ba0: 64 72 73 72 63 20 75 73 20 61 64 64 72 64 65 73 drsrc us addrdes
1bb0: 74 20 75 64 20 2d 2d 20 29 0a 20 20 20 20 5b 3a t ud -- ). [:
1bc0: 20 66 69 6c 65 28 20 2e 22 20 63 6f 70 79 20 27 file( ." copy '
1bd0: 22 20 32 6f 76 65 72 20 66 6f 72 74 68 3a 74 79 " 2over forth:ty
1be0: 70 65 20 2e 22 20 27 20 2d 3e 20 27 22 20 32 64 pe ." ' -> '" 2d
1bf0: 75 70 20 66 6f 72 74 68 3a 74 79 70 65 0a 20 20 up forth:type.
1c00: 20 20 20 20 2e 22 20 27 22 20 66 6f 72 74 68 3a ." '" forth:
1c10: 63 72 20 29 0a 20 20 20 20 20 20 32 73 77 61 70 cr ). 2swap
1c20: 20 24 2c 20 72 2f 6f 20 75 6c 69 74 2c 20 6f 70 $, r/o ulit, op
1c30: 65 6e 2d 74 72 61 63 6b 65 64 2d 66 69 6c 65 0a en-tracked-file.
1c40: 20 20 20 20 20 20 66 69 6c 65 2d 72 65 67 23 20 file-reg#
1c50: 40 20 73 61 76 65 2d 74 6f 20 3b 5d 20 6e 32 6f @ save-to ;] n2o
1c60: 3e 66 69 6c 65 0a 20 20 20 20 31 20 66 69 6c 65 >file. 1 file
1c70: 2d 63 6f 75 6e 74 20 2b 21 20 3b 0a 0a 69 6e 20 -count +! ;..in
1c80: 6e 65 74 32 6f 20 3a 20 63 6f 70 79 23 20 28 20 net2o : copy# (
1c90: 61 64 64 72 68 61 73 68 20 75 20 2d 2d 20 29 0a addrhash u -- ).
1ca0: 20 20 20 20 5b 3a 20 66 69 6c 65 28 20 2e 22 20 [: file( ."
1cb0: 63 6f 70 79 23 20 22 20 32 64 75 70 20 38 35 74 copy# " 2dup 85t
1cc0: 79 70 65 20 66 6f 72 74 68 3a 63 72 20 29 0a 20 ype forth:cr ).
1cd0: 20 20 20 20 20 31 20 75 6c 69 74 2c 20 66 69 6c 1 ulit, fil
1ce0: 65 2d 74 79 70 65 20 32 64 75 70 20 24 2c 20 72 e-type 2dup $, r
1cf0: 2f 6f 20 75 6c 69 74 2c 20 6f 70 65 6e 2d 74 72 /o ulit, open-tr
1d00: 61 63 6b 65 64 2d 66 69 6c 65 0a 20 20 20 20 20 acked-file.
1d10: 20 66 69 6c 65 2d 72 65 67 23 20 40 20 73 61 76 file-reg# @ sav
1d20: 65 2d 74 6f 23 20 3b 5d 20 6e 32 6f 3e 66 69 6c e-to# ;] n2o>fil
1d30: 65 0a 20 20 20 20 31 20 66 69 6c 65 2d 63 6f 75 e. 1 file-cou
1d40: 6e 74 20 2b 21 20 3b 0a 0a 3a 20 73 65 65 6b 21 nt +! ;..: seek!
1d50: 20 28 20 70 6f 73 20 69 64 20 2d 2d 20 29 20 3e ( pos id -- ) >
1d60: 72 20 64 3e 36 34 0a 20 20 20 20 36 34 64 75 70 r d>64. 64dup
1d70: 20 72 40 20 73 74 61 74 65 2d 61 64 64 72 20 3e r@ state-addr >
1d80: 6f 20 74 6f 20 66 73 2d 73 65 65 6b 20 6f 3e 0a o to fs-seek o>.
1d90: 20 20 20 20 72 3e 20 75 6c 69 74 2c 20 66 69 6c r> ulit, fil
1da0: 65 2d 69 64 20 6c 69 74 2c 20 73 65 74 2d 73 65 e-id lit, set-se
1db0: 65 6b 20 65 6e 64 2d 77 69 74 68 20 3b 0a 0a 3a ek end-with ;..:
1dc0: 20 6c 69 6d 69 74 21 20 28 20 70 6f 73 20 69 64 limit! ( pos id
1dd0: 20 2d 2d 20 29 20 3e 72 20 64 3e 36 34 0a 20 20 -- ) >r d>64.
1de0: 20 20 72 40 20 75 6c 69 74 2c 20 66 69 6c 65 2d r@ ulit, file-
1df0: 69 64 20 36 34 64 75 70 20 6c 69 74 2c 20 73 65 id 64dup lit, se
1e00: 74 2d 6c 69 6d 69 74 20 65 6e 64 2d 77 69 74 68 t-limit end-with
1e10: 0a 20 20 20 20 72 3e 20 69 6e 69 74 2d 6c 69 6d . r> init-lim
1e20: 69 74 21 20 3b 0a 0a 70 72 65 76 69 6f 75 73 0a it! ;..previous.
1e30: 0a 5c 20 63 6c 69 65 6e 74 20 73 69 64 65 20 74 .\ client side t
1e40: 69 6d 69 6e 67 0a 0a 3a 20 61 63 6b 2d 73 69 7a iming..: ack-siz
1e50: 65 20 28 20 2d 2d 20 29 20 20 31 20 61 63 6b 73 e ( -- ) 1 acks
1e60: 20 2b 21 0a 20 20 20 20 61 63 6b 40 20 2e 72 65 +!. ack@ .re
1e70: 63 76 2d 74 69 63 6b 20 36 34 40 20 36 34 64 75 cv-tick 64@ 64du
1e80: 70 20 6c 61 73 74 62 2d 74 69 63 6b 73 20 36 34 p lastb-ticks 64
1e90: 21 40 20 36 34 2d 20 6d 61 78 2d 64 74 69 63 6b !@ 64- max-dtick
1ea0: 73 20 36 34 6d 61 78 21 20 3b 0a 3a 20 61 63 6b s 64max! ;.: ack
1eb0: 2d 66 69 72 73 74 20 28 20 2d 2d 20 29 0a 20 20 -first ( -- ).
1ec0: 20 20 6c 61 73 74 62 2d 74 69 63 6b 73 20 36 34 lastb-ticks 64
1ed0: 40 20 66 69 72 73 74 62 2d 74 69 63 6b 73 20 36 @ firstb-ticks 6
1ee0: 34 40 20 36 34 2d 20 64 65 6c 74 61 2d 74 69 63 4@ 64- delta-tic
1ef0: 6b 73 20 36 34 2b 21 0a 20 20 20 20 61 63 6b 40 ks 64+!. ack@
1f00: 20 2e 72 65 63 76 2d 74 69 63 6b 20 36 34 40 20 .recv-tick 64@
1f10: 36 34 64 75 70 20 66 69 72 73 74 62 2d 74 69 63 64dup firstb-tic
1f20: 6b 73 20 36 34 21 20 20 36 34 64 75 70 20 6c 61 ks 64! 64dup la
1f30: 73 74 62 2d 74 69 63 6b 73 20 36 34 21 0a 20 20 stb-ticks 64!.
1f40: 20 20 6c 61 73 74 2d 72 74 69 63 6b 20 36 34 21 last-rtick 64!
1f50: 20 20 72 65 63 76 2d 61 64 64 72 20 36 34 40 20 recv-addr 64@
1f60: 6c 61 73 74 2d 72 61 64 64 72 20 36 34 21 20 3b last-raddr 64! ;
1f70: 0a 0a 3a 20 61 63 6b 2d 74 69 6d 69 6e 67 20 28 ..: ack-timing (
1f80: 20 6e 20 2d 2d 20 29 0a 20 20 20 20 62 32 62 2d n -- ). b2b-
1f90: 74 6f 67 67 6c 65 23 20 61 6e 64 20 20 49 46 20 toggle# and IF
1fa0: 20 61 63 6b 2d 66 69 72 73 74 20 20 45 4c 53 45 ack-first ELSE
1fb0: 20 20 61 63 6b 2d 73 69 7a 65 20 20 54 48 45 4e ack-size THEN
1fc0: 20 3b 0a 0a 61 6c 73 6f 20 6e 65 74 32 6f 2d 62 ;..also net2o-b
1fd0: 61 73 65 0a 0a 3a 20 73 65 74 72 61 74 65 2d 6c ase..: setrate-l
1fe0: 69 6d 69 74 20 28 20 72 61 74 65 20 2d 2d 20 72 imit ( rate -- r
1ff0: 61 74 65 27 20 29 0a 20 20 20 20 5c 20 64 6f 20 ate' ). \ do
2000: 6e 6f 74 20 63 68 61 6e 67 65 20 72 65 71 75 65 not change reque
2010: 73 74 65 64 20 72 61 74 65 20 62 79 20 6d 6f 72 sted rate by mor
2020: 65 20 74 68 61 6e 20 61 20 66 61 63 74 6f 72 20 e than a factor
2030: 32 0a 20 20 20 20 6c 61 73 74 2d 72 61 74 65 20 2. last-rate
2040: 36 34 40 0a 20 20 20 20 36 34 64 75 70 20 36 34 64@. 64dup 64
2050: 2d 30 3c 3e 20 49 46 20 20 36 34 74 75 63 6b 20 -0<> IF 64tuck
2060: 36 34 2d 32 2a 20 36 34 6d 69 6e 20 36 34 73 77 64-2* 64min 64sw
2070: 61 70 20 36 34 2d 32 2f 20 36 34 6d 61 78 20 20 ap 64-2/ 64max
2080: 45 4c 53 45 20 20 36 34 64 72 6f 70 20 20 54 48 ELSE 64drop TH
2090: 45 4e 0a 20 20 20 20 36 34 64 75 70 20 6c 61 73 EN. 64dup las
20a0: 74 2d 72 61 74 65 20 36 34 21 20 3b 0a 0a 3a 20 t-rate 64! ;..:
20b0: 3e 72 61 74 65 20 28 20 2d 2d 20 29 20 20 64 65 >rate ( -- ) de
20c0: 6c 74 61 2d 74 69 63 6b 73 20 36 34 40 20 36 34 lta-ticks 64@ 64
20d0: 2d 30 3d 20 61 63 6b 73 20 40 20 30 3d 20 6f 72 -0= acks @ 0= or
20e0: 20 3f 45 58 49 54 0a 20 20 20 20 61 63 6b 40 20 ?EXIT. ack@
20f0: 2e 72 65 63 76 2d 74 69 63 6b 20 36 34 40 20 36 .recv-tick 64@ 6
2100: 34 64 75 70 20 62 75 72 73 74 2d 74 69 63 6b 73 4dup burst-ticks
2110: 20 36 34 21 40 20 36 34 64 75 70 20 36 34 2d 30 64!@ 64dup 64-0
2120: 3c 3e 20 49 46 0a 09 36 34 2d 20 6d 61 78 2d 64 <> IF..64- max-d
2130: 74 69 63 6b 73 20 36 34 40 20 74 69 63 6b 2d 69 ticks 64@ tick-i
2140: 6e 69 74 20 31 2b 20 6e 3e 36 34 20 36 34 2a 20 nit 1+ n>64 64*
2150: 36 34 6d 61 78 20 36 34 3e 72 0a 09 64 65 6c 74 64max 64>r..delt
2160: 61 2d 74 69 63 6b 73 20 36 34 40 20 74 69 63 6b a-ticks 64@ tick
2170: 2d 69 6e 69 74 20 31 2b 20 61 63 6b 73 20 40 20 -init 1+ acks @
2180: 36 34 2a 2f 20 73 65 74 72 61 74 65 2d 6c 69 6d 64*/ setrate-lim
2190: 69 74 0a 09 6c 69 74 2c 20 36 34 72 3e 20 6c 69 it..lit, 64r> li
21a0: 74 2c 20 73 65 74 2d 72 61 74 65 0a 20 20 20 20 t, set-rate.
21b0: 45 4c 53 45 0a 09 36 34 64 72 6f 70 20 36 34 64 ELSE..64drop 64d
21c0: 72 6f 70 0a 20 20 20 20 54 48 45 4e 0a 20 20 20 rop. THEN.
21d0: 20 64 65 6c 74 61 2d 74 69 63 6b 73 20 36 34 6f delta-ticks 64o
21e0: 66 66 20 20 6d 61 78 2d 64 74 69 63 6b 73 20 36 ff max-dticks 6
21f0: 34 6f 66 66 20 20 61 63 6b 73 20 6f 66 66 20 3b 4off acks off ;
2200: 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 61 63 6b ..in net2o : ack
2210: 74 69 6d 65 20 28 20 2d 2d 20 29 0a 20 20 20 20 time ( -- ).
2220: 72 65 63 76 2d 61 64 64 72 20 36 34 40 20 61 63 recv-addr 64@ ac
2230: 6b 40 20 2e 72 65 63 76 2d 74 69 63 6b 20 36 34 k@ .recv-tick 64
2240: 40 20 61 63 6b 40 20 2e 74 69 6d 65 2d 6f 66 66 @ ack@ .time-off
2250: 73 65 74 20 36 34 40 20 36 34 2d 0a 20 20 20 20 set 64@ 64-.
2260: 74 69 6d 69 6e 67 28 20 36 34 3e 72 20 36 34 64 timing( 64>r 64d
2270: 75 70 20 78 36 34 2e 20 36 34 72 3e 20 36 34 64 up x64. 64r> 64d
2280: 75 70 20 75 36 34 2e 20 2e 22 20 61 63 6b 74 69 up u64. ." ackti
2290: 6d 65 22 20 66 6f 72 74 68 3a 63 72 20 29 0a 20 me" forth:cr ).
22a0: 20 20 20 6c 69 74 2c 20 6c 69 74 2c 20 61 63 6b lit, lit, ack
22b0: 2d 61 64 64 72 74 69 6d 65 20 3b 0a 69 6e 20 6e -addrtime ;.in n
22c0: 65 74 32 6f 20 3a 20 62 32 62 74 69 6d 65 20 28 et2o : b2btime (
22d0: 20 2d 2d 20 29 0a 20 20 20 20 6c 61 73 74 2d 72 -- ). last-r
22e0: 61 64 64 72 20 36 34 40 20 6c 61 73 74 2d 72 74 addr 64@ last-rt
22f0: 69 63 6b 20 36 34 40 20 36 34 64 75 70 20 36 34 ick 64@ 64dup 64
2300: 2d 30 3d 0a 20 20 20 20 49 46 20 20 36 34 64 72 -0=. IF 64dr
2310: 6f 70 20 36 34 64 72 6f 70 0a 20 20 20 20 45 4c op 64drop. EL
2320: 53 45 20 20 61 63 6b 40 20 2e 74 69 6d 65 2d 6f SE ack@ .time-o
2330: 66 66 73 65 74 20 36 34 40 20 36 34 2d 20 6c 69 ffset 64@ 64- li
2340: 74 2c 20 6c 69 74 2c 20 61 63 6b 2d 62 32 62 74 t, lit, ack-b2bt
2350: 69 6d 65 20 20 54 48 45 4e 20 3b 0a 0a 5c 20 61 ime THEN ;..\ a
2360: 63 6b 20 62 69 74 73 2c 20 6e 65 77 20 63 6f 64 ck bits, new cod
2370: 65 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 61 63 e..in net2o : ac
2380: 6b 2d 72 65 73 65 6e 64 23 20 28 20 2d 2d 20 29 k-resend# ( -- )
2390: 20 20 64 61 74 61 2d 72 6d 61 70 20 7b 20 6d 61 data-rmap { ma
23a0: 70 20 7d 0a 20 20 20 20 6d 61 70 20 2e 6d 61 70 p }. map .map
23b0: 63 3a 64 61 74 61 2d 72 65 73 65 6e 64 23 2d 62 c:data-resend#-b
23c0: 75 66 20 24 40 0a 20 20 20 20 62 6f 75 6e 64 73 uf $@. bounds
23d0: 20 3f 44 4f 0a 09 49 20 24 40 20 6f 76 65 72 20 ?DO..I $@ over
23e0: 40 20 3e 72 20 63 65 6c 6c 20 2f 73 74 72 69 6e @ >r cell /strin
23f0: 67 20 24 46 46 20 2d 73 6b 69 70 0a 09 64 75 70 g $FF -skip..dup
2400: 20 3e 72 20 24 46 46 20 73 6b 69 70 20 64 75 70 >r $FF skip dup
2410: 20 49 46 0a 09 20 20 20 20 72 3e 20 6f 76 65 72 IF.. r> over
2420: 20 2d 20 72 3e 20 2b 20 75 6c 69 74 2c 20 24 2c - r> + ulit, $,
2430: 20 61 63 6b 2d 72 65 73 65 6e 64 23 0a 09 45 4c ack-resend#..EL
2440: 53 45 20 20 32 64 72 6f 70 20 72 64 72 6f 70 20 SE 2drop rdrop
2450: 72 64 72 6f 70 20 20 54 48 45 4e 0a 20 20 20 20 rdrop THEN.
2460: 63 65 6c 6c 20 2b 4c 4f 4f 50 0a 20 20 20 20 6d cell +LOOP. m
2470: 61 70 20 2e 6d 61 70 63 3a 64 61 74 61 2d 72 65 ap .mapc:data-re
2480: 73 65 6e 64 23 2d 62 75 66 20 24 5b 5d 6f 66 66 send#-buf $[]off
2490: 20 3b 0a 0a 5c 20 63 6c 69 65 6e 74 20 73 69 64 ;..\ client sid
24a0: 65 20 61 63 6b 6e 6f 77 6c 65 64 67 65 0a 0a 69 e acknowledge..i
24b0: 6e 20 6e 65 74 32 6f 20 3a 20 67 65 6e 61 63 6b n net2o : genack
24c0: 20 28 20 2d 2d 20 29 0a 20 20 20 20 6e 65 74 32 ( -- ). net2
24d0: 6f 3a 61 63 6b 2d 72 65 73 65 6e 64 23 20 20 6e o:ack-resend# n
24e0: 65 74 32 6f 3a 62 32 62 74 69 6d 65 20 20 6e 65 et2o:b2btime ne
24f0: 74 32 6f 3a 61 63 6b 74 69 6d 65 20 20 3e 72 61 t2o:acktime >ra
2500: 74 65 20 3b 0a 0a 3a 20 21 72 64 61 74 61 2d 74 te ;..: !rdata-t
2510: 61 69 6c 20 28 20 2d 2d 20 29 0a 20 20 20 20 64 ail ( -- ). d
2520: 61 74 61 2d 72 6d 61 70 20 77 69 74 68 20 6d 61 ata-rmap with ma
2530: 70 63 0a 20 20 20 20 64 61 74 61 2d 61 63 6b 23 pc. data-ack#
2540: 20 40 20 62 79 74 65 73 3e 61 64 64 72 0a 20 20 @ bytes>addr.
2550: 20 20 64 65 73 74 2d 68 65 61 64 20 75 6d 69 6e dest-head umin
2560: 20 64 65 73 74 2d 74 6f 70 20 75 6d 69 6e 0a 20 dest-top umin.
2570: 20 20 20 64 65 73 74 2d 74 61 69 6c 20 75 6d 61 dest-tail uma
2580: 78 20 64 75 70 20 61 64 64 72 20 64 65 73 74 2d x dup addr dest-
2590: 74 61 69 6c 20 21 40 20 65 6e 64 77 69 74 68 0a tail !@ endwith.
25a0: 20 20 20 20 61 63 6b 28 20 2e 22 20 74 61 69 6c ack( ." tail
25b0: 3a 20 22 20 6f 76 65 72 20 68 65 78 2e 20 64 75 : " over hex. du
25c0: 70 20 68 65 78 2e 20 66 6f 72 74 68 3a 63 72 20 p hex. forth:cr
25d0: 29 0a 20 20 20 20 75 3e 20 49 46 20 20 6e 65 74 ). u> IF net
25e0: 32 6f 3a 73 61 76 65 26 20 36 34 23 30 20 62 75 2o:save& 64#0 bu
25f0: 72 73 74 2d 74 69 63 6b 73 20 36 34 21 20 20 54 rst-ticks 64! T
2600: 48 45 4e 20 3b 0a 0a 24 32 30 20 56 61 6c 75 65 HEN ;..$20 Value
2610: 20 6d 61 78 2d 72 65 73 65 6e 64 23 0a 0a 3a 20 max-resend#..:
2620: 70 72 65 70 61 72 65 2d 72 65 73 65 6e 64 20 28 prepare-resend (
2630: 20 66 6c 61 67 20 2d 2d 20 65 6e 64 20 73 74 61 flag -- end sta
2640: 72 74 20 61 63 6b 73 20 61 63 6b 6d 20 74 61 69 rt acks ackm tai
2650: 62 69 74 73 20 62 61 63 6b 62 69 74 73 20 29 0a bits backbits ).
2660: 20 20 20 20 64 61 74 61 2d 72 6d 61 70 20 77 69 data-rmap wi
2670: 74 68 20 6d 61 70 63 0a 20 20 20 20 61 63 6b 28 th mapc. ack(
2680: 20 2e 22 20 68 65 61 64 2f 74 61 69 6c 3a 20 22 ." head/tail: "
2690: 20 64 75 70 20 66 6f 72 74 68 3a 2e 20 64 65 73 dup forth:. des
26a0: 74 2d 68 65 61 64 20 68 65 78 2e 20 64 65 73 74 t-head hex. dest
26b0: 2d 74 61 69 6c 20 68 65 78 2e 20 66 6f 72 74 68 -tail hex. forth
26c0: 3a 63 72 20 29 0a 20 20 20 20 49 46 20 20 20 20 :cr ). IF
26d0: 64 65 73 74 2d 68 65 61 64 20 61 64 64 72 3e 62 dest-head addr>b
26e0: 79 74 65 73 20 2d 34 20 61 6e 64 0a 20 20 20 20 ytes -4 and.
26f0: 45 4c 53 45 20 20 64 65 73 74 2d 68 65 61 64 20 ELSE dest-head
2700: 31 2d 20 61 64 64 72 3e 62 79 74 65 73 20 31 2b 1- addr>bytes 1+
2710: 20 20 54 48 45 4e 20 30 20 6d 61 78 0a 20 20 20 THEN 0 max.
2720: 20 64 65 73 74 2d 74 61 69 6c 20 61 64 64 72 3e dest-tail addr>
2730: 62 79 74 65 73 20 2d 34 20 61 6e 64 20 5c 20 64 bytes -4 and \ d
2740: 75 70 20 64 61 74 61 2d 61 63 6b 23 20 75 6d 69 up data-ack# umi
2750: 6e 21 0a 20 20 20 20 64 61 74 61 2d 61 63 6b 62 n!. data-ackb
2760: 69 74 73 20 40 20 64 65 73 74 2d 73 69 7a 65 20 its @ dest-size
2770: 61 64 64 72 3e 62 79 74 65 73 20 31 2d 0a 20 20 addr>bytes 1-.
2780: 20 20 64 65 73 74 2d 74 61 69 6c 20 61 64 64 72 dest-tail addr
2790: 3e 62 69 74 73 20 64 65 73 74 2d 62 61 63 6b 20 >bits dest-back
27a0: 64 65 73 74 2d 73 69 7a 65 20 2b 20 61 64 64 72 dest-size + addr
27b0: 3e 62 69 74 73 20 65 6e 64 77 69 74 68 20 3b 0a >bits endwith ;.
27c0: 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 64 6f 2d 72 .in net2o : do-r
27d0: 65 73 65 6e 64 20 28 20 66 6c 61 67 20 2d 2d 20 esend ( flag --
27e0: 29 0a 20 20 20 20 6f 20 30 3d 20 49 46 20 20 64 ). o 0= IF d
27f0: 72 6f 70 20 45 58 49 54 20 20 54 48 45 4e 20 20 rop EXIT THEN
2800: 64 61 74 61 2d 72 6d 61 70 20 30 3d 20 49 46 20 data-rmap 0= IF
2810: 20 64 72 6f 70 20 45 58 49 54 20 20 54 48 45 4e drop EXIT THEN
2820: 0a 20 20 20 20 30 20 73 77 61 70 20 20 70 72 65 . 0 swap pre
2830: 70 61 72 65 2d 72 65 73 65 6e 64 20 7b 20 61 63 pare-resend { ac
2840: 6b 73 20 61 63 6b 6d 20 74 61 69 6c 62 69 74 73 ks ackm tailbits
2850: 20 62 61 63 6b 62 69 74 73 20 7d 0a 20 20 20 20 backbits }.
2860: 61 63 6b 28 20 2e 22 20 61 63 6b 20 6c 6f 6f 70 ack( ." ack loop
2870: 3a 20 22 20 6f 76 65 72 20 68 65 78 2e 20 64 75 : " over hex. du
2880: 70 20 68 65 78 2e 20 66 6f 72 74 68 3a 63 72 20 p hex. forth:cr
2890: 29 0a 20 20 20 20 2b 44 4f 0a 09 61 63 6b 73 20 ). +DO..acks
28a0: 49 20 61 63 6b 6d 20 61 6e 64 20 2b 20 6c 40 0a I ackm and + l@.
28b0: 09 61 63 6b 73 28 20 2e 22 20 61 63 6b 73 5b 22 .acks( ." acks["
28c0: 20 49 20 62 79 74 65 73 3e 62 69 74 73 20 68 65 I bytes>bits he
28d0: 78 2e 0a 09 49 20 64 61 74 61 2d 72 6d 61 70 20 x...I data-rmap
28e0: 2e 6d 61 70 63 3a 64 61 74 61 2d 61 63 6b 23 20 .mapc:data-ack#
28f0: 40 20 3d 20 49 46 20 27 2a 27 20 65 6d 69 74 20 @ = IF '*' emit
2900: 54 48 45 4e 0a 09 2e 22 20 5d 3d 22 20 64 75 70 THEN..." ]=" dup
2910: 20 68 65 78 2e 20 62 61 63 6b 62 69 74 73 20 68 hex. backbits h
2920: 65 78 2e 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 ex. forth:cr )..
2930: 49 20 62 79 74 65 73 3e 62 69 74 73 20 74 61 69 I bytes>bits tai
2940: 6c 62 69 74 73 20 75 3c 20 49 46 0a 09 20 20 20 lbits u< IF..
2950: 20 2d 31 20 74 61 69 6c 62 69 74 73 20 49 20 62 -1 tailbits I b
2960: 79 74 65 73 3e 62 69 74 73 20 2d 20 6c 73 68 69 ytes>bits - lshi
2970: 66 74 20 69 6e 76 65 72 74 20 6f 72 0a 09 54 48 ft invert or..TH
2980: 45 4e 0a 09 64 75 70 20 24 46 46 46 46 46 46 46 EN..dup $FFFFFFF
2990: 46 20 3c 3e 20 49 46 0a 09 20 20 20 20 72 65 73 F <> IF.. res
29a0: 65 6e 64 28 20 2e 22 20 72 65 73 65 6e 64 3a 20 end( ." resend:
29b0: 22 20 64 75 70 20 68 65 78 2e 20 6f 76 65 72 20 " dup hex. over
29c0: 68 65 78 2e 20 66 6f 72 74 68 3a 63 72 20 29 0a hex. forth:cr ).
29d0: 09 20 20 20 20 49 20 61 63 6b 6d 20 61 6e 64 20 . I ackm and
29e0: 62 79 74 65 73 3e 61 64 64 72 20 75 6c 69 74 2c bytes>addr ulit,
29f0: 20 24 46 46 46 46 46 46 46 46 20 78 6f 72 20 75 $FFFFFFFF xor u
2a00: 6c 69 74 2c 20 72 65 73 65 6e 64 2d 6d 61 73 6b lit, resend-mask
2a10: 20 20 31 2b 0a 09 45 4c 53 45 0a 09 20 20 20 20 1+..ELSE..
2a20: 64 72 6f 70 20 64 75 70 20 30 3d 20 49 46 20 5c drop dup 0= IF \
2a30: 20 69 66 20 77 65 20 64 69 64 6e 27 74 20 68 61 if we didn't ha
2a40: 76 65 20 61 20 72 65 73 65 6e 64 20 79 65 74 2c ve a resend yet,
2a50: 20 69 6e 63 72 65 61 73 65 20 64 61 74 61 2d 61 increase data-a
2a60: 63 6b 23 0a 09 09 49 20 34 20 2b 20 62 79 74 65 ck#...I 4 + byte
2a70: 73 3e 62 69 74 73 20 62 61 63 6b 62 69 74 73 20 s>bits backbits
2a80: 75 3c 3d 20 49 46 20 5c 20 6e 6f 20 62 61 63 6b u<= IF \ no back
2a90: 62 69 74 73 2c 20 70 6c 65 61 73 65 0a 09 09 20 bits, please...
2aa0: 20 20 20 49 20 34 20 2b 20 64 61 74 61 2d 72 6d I 4 + data-rm
2ab0: 61 70 20 2e 6d 61 70 63 3a 64 61 74 61 2d 61 63 ap .mapc:data-ac
2ac0: 6b 23 20 75 6d 61 78 21 0a 09 09 54 48 45 4e 0a k# umax!...THEN.
2ad0: 09 20 20 20 20 54 48 45 4e 0a 09 54 48 45 4e 0a . THEN..THEN.
2ae0: 09 64 75 70 20 6d 61 78 2d 72 65 73 65 6e 64 23 .dup max-resend#
2af0: 20 3e 3d 20 3f 4c 45 41 56 45 20 5c 20 6e 6f 20 >= ?LEAVE \ no
2b00: 6d 6f 72 65 20 74 68 61 6e 20 78 20 72 65 73 65 more than x rese
2b10: 6e 64 73 0a 20 20 20 20 34 20 2b 4c 4f 4f 50 20 nds. 4 +LOOP
2b20: 20 64 72 6f 70 20 21 72 64 61 74 61 2d 74 61 69 drop !rdata-tai
2b30: 6c 20 3b 0a 0a 3a 20 64 6f 2d 65 78 70 65 63 74 l ;..: do-expect
2b40: 2d 72 65 70 6c 79 20 28 20 2d 2d 20 29 0a 20 20 -reply ( -- ).
2b50: 20 20 63 6d 64 62 75 66 23 20 40 20 30 3e 20 49 cmdbuf# @ 0> I
2b60: 46 20 5c 20 74 68 65 72 65 27 73 20 61 63 74 75 F \ there's actu
2b70: 61 6c 6c 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e all something in
2b80: 20 74 68 65 20 62 75 66 66 65 72 0a 09 72 65 70 the buffer..rep
2b90: 6c 79 2d 69 6e 64 65 78 20 75 6c 69 74 2c 20 6f ly-index ulit, o
2ba0: 6b 3f 20 20 65 6e 64 2d 63 6d 64 0a 09 6e 65 74 k? end-cmd..net
2bb0: 32 6f 3a 65 78 70 65 63 74 2d 72 65 70 6c 79 20 2o:expect-reply
2bc0: 20 6d 61 78 64 61 74 61 20 63 6f 64 65 2b 20 5c maxdata code+ \
2bd0: 20 64 6f 6e 27 74 20 72 65 75 73 65 20 74 68 69 don't reuse thi
2be0: 73 20 62 75 66 66 65 72 0a 20 20 20 20 54 48 45 s buffer. THE
2bf0: 4e 20 20 5b 27 5d 20 65 6e 64 2d 63 6d 64 20 49 N ['] end-cmd I
2c00: 53 20 65 78 70 65 63 74 2d 72 65 70 6c 79 3f 20 S expect-reply?
2c10: 3b 0a 0a 3a 20 64 6f 2d 65 78 70 65 63 74 2b 73 ;..: do-expect+s
2c20: 6c 75 72 70 20 28 20 2d 2d 20 29 0a 20 20 20 20 lurp ( -- ).
2c30: 63 6d 64 62 75 66 23 20 40 20 30 3e 20 49 46 20 cmdbuf# @ 0> IF
2c40: 5c 20 74 68 65 72 65 27 73 20 61 63 74 75 61 6c \ there's actual
2c50: 6c 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e 20 74 l something in t
2c60: 68 65 20 62 75 66 66 65 72 0a 09 73 6c 75 72 70 he buffer..slurp
2c70: 20 6e 65 78 74 2d 72 65 71 75 65 73 74 20 66 69 next-request fi
2c80: 6c 65 72 65 71 23 20 21 20 20 74 72 75 65 20 64 lereq# ! true d
2c90: 61 74 61 2d 72 6d 61 70 20 3e 6f 20 74 6f 20 6d ata-rmap >o to m
2ca0: 61 70 63 3a 64 65 73 74 2d 72 65 71 20 6f 3e 0a apc:dest-req o>.
2cb0: 09 72 65 70 6c 79 2d 69 6e 64 65 78 20 75 6c 69 .reply-index uli
2cc0: 74 2c 20 6f 6b 3f 20 20 65 6e 64 2d 63 6d 64 0a t, ok? end-cmd.
2cd0: 09 6e 65 74 32 6f 3a 65 78 70 65 63 74 2d 72 65 .net2o:expect-re
2ce0: 70 6c 79 20 20 6d 61 78 64 61 74 61 20 63 6f 64 ply maxdata cod
2cf0: 65 2b 20 5c 20 64 6f 6e 27 74 20 72 65 75 73 65 e+ \ don't reuse
2d00: 20 74 68 69 73 20 62 75 66 66 65 72 0a 20 20 20 this buffer.
2d10: 20 54 48 45 4e 20 20 5b 27 5d 20 65 6e 64 2d 63 THEN ['] end-c
2d20: 6d 64 20 49 53 20 65 78 70 65 63 74 2d 72 65 70 md IS expect-rep
2d30: 6c 79 3f 20 3b 0a 0a 3a 20 65 78 70 65 63 74 2d ly? ;..: expect-
2d40: 72 65 70 6c 79 2d 78 74 20 28 20 78 74 20 2d 2d reply-xt ( xt --
2d50: 20 29 20 5c 20 63 6d 64 28 20 2e 22 20 65 78 70 ) \ cmd( ." exp
2d60: 65 63 74 20 72 65 70 6c 79 3a 22 20 66 6f 72 74 ect reply:" fort
2d70: 68 3a 63 72 20 29 0a 20 20 20 20 5b 27 5d 20 64 h:cr ). ['] d
2d80: 6f 2d 65 78 70 65 63 74 2d 72 65 70 6c 79 20 49 o-expect-reply I
2d90: 53 20 65 78 70 65 63 74 2d 72 65 70 6c 79 3f 0a S expect-reply?.
2da0: 20 20 20 20 63 6d 64 2d 72 65 70 6c 79 2d 78 74 cmd-reply-xt
2db0: 20 21 20 3b 0a 0a 3a 20 65 78 70 65 63 74 2d 72 ! ;..: expect-r
2dc0: 65 70 6c 79 20 28 20 2d 2d 20 29 0a 20 20 20 20 eply ( -- ).
2dd0: 5b 27 5d 20 64 72 6f 70 20 65 78 70 65 63 74 2d ['] drop expect-
2de0: 72 65 70 6c 79 2d 78 74 20 3b 0a 0a 3a 20 65 78 reply-xt ;..: ex
2df0: 70 65 63 74 2b 73 6c 75 72 70 2d 78 74 20 28 20 pect+slurp-xt (
2e00: 78 74 20 2d 2d 20 29 20 5c 20 63 6d 64 28 20 2e xt -- ) \ cmd( .
2e10: 22 20 65 78 70 65 63 74 20 72 65 70 6c 79 3a 22 " expect reply:"
2e20: 20 66 6f 72 74 68 3a 63 72 20 29 0a 20 20 20 20 forth:cr ).
2e30: 5b 27 5d 20 64 6f 2d 65 78 70 65 63 74 2b 73 6c ['] do-expect+sl
2e40: 75 72 70 20 49 53 20 65 78 70 65 63 74 2d 72 65 urp IS expect-re
2e50: 70 6c 79 3f 0a 20 20 20 20 63 6d 64 2d 72 65 70 ply?. cmd-rep
2e60: 6c 79 2d 78 74 20 21 20 3b 0a 0a 3a 20 65 78 70 ly-xt ! ;..: exp
2e70: 65 63 74 2b 73 6c 75 72 70 20 28 20 2d 2d 20 29 ect+slurp ( -- )
2e80: 0a 20 20 20 20 5b 27 5d 20 64 72 6f 70 20 65 78 . ['] drop ex
2e90: 70 65 63 74 2b 73 6c 75 72 70 2d 78 74 20 3b 0a pect+slurp-xt ;.
2ea0: 0a 55 56 61 6c 75 65 20 72 65 63 2d 61 63 6b 2d .UValue rec-ack-
2eb0: 70 6f 73 23 0a 0a 3a 20 73 65 71 23 2c 20 28 20 pos#..: seq#, (
2ec0: 2d 2d 20 29 0a 20 20 20 20 63 6d 64 62 75 66 23 -- ). cmdbuf#
2ed0: 20 40 20 31 20 3d 20 49 46 0a 09 64 61 74 61 2d @ 1 = IF..data-
2ee0: 72 6d 61 70 20 2e 6d 61 70 63 3a 72 65 63 2d 61 rmap .mapc:rec-a
2ef0: 63 6b 23 20 75 6c 69 74 2c 20 73 65 71 23 0a 09 ck# ulit, seq#..
2f00: 63 6d 64 62 75 66 23 20 40 20 74 6f 20 72 65 63 cmdbuf# @ to rec
2f10: 2d 61 63 6b 2d 70 6f 73 23 0a 20 20 20 20 54 48 -ack-pos#. TH
2f20: 45 4e 20 3b 0a 0a 3a 20 72 65 73 65 6e 64 2d 61 EN ;..: resend-a
2f30: 6c 6c 20 28 20 2d 2d 20 29 0a 20 20 20 20 73 65 ll ( -- ). se
2f40: 71 23 2c 0a 20 20 20 20 66 61 6c 73 65 20 6e 65 q#,. false ne
2f50: 74 32 6f 3a 64 6f 2d 72 65 73 65 6e 64 0a 20 20 t2o:do-resend.
2f60: 20 20 61 63 6b 40 20 2e 2b 74 69 6d 65 6f 75 74 ack@ .+timeout
2f70: 73 20 72 65 73 65 6e 64 2d 61 6c 6c 2d 74 6f 20 s resend-all-to
2f80: 36 34 21 20 3b 0a 0a 30 20 56 61 6c 75 65 20 72 64! ;..0 Value r
2f90: 65 71 75 65 73 74 2d 73 74 61 74 73 3f 0a 0a 3a equest-stats?..:
2fa0: 20 75 70 64 61 74 65 2d 72 74 64 65 6c 61 79 20 update-rtdelay
2fb0: 28 20 2d 2d 20 29 0a 20 20 20 20 74 69 63 6b 73 ( -- ). ticks
2fc0: 20 6c 69 74 2c 20 70 75 73 68 2d 6c 69 74 20 70 lit, push-lit p
2fd0: 75 73 68 27 20 73 65 74 2d 72 74 64 65 6c 61 79 ush' set-rtdelay
2fe0: 20 3b 0a 0a 3a 20 64 61 74 61 2d 65 6e 64 3f 20 ;..: data-end?
2ff0: 28 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 20 20 ( -- flag ).
3000: 30 20 64 61 74 61 2d 72 6d 61 70 20 2e 6d 61 70 0 data-rmap .map
3010: 63 3a 64 65 73 74 2d 65 6e 64 20 21 40 20 3b 0a c:dest-end !@ ;.
3020: 0a 3a 20 65 78 70 65 63 74 65 64 40 20 28 20 2d .: expected@ ( -
3030: 2d 20 68 65 61 64 20 74 6f 70 20 29 0a 20 20 20 - head top ).
3040: 20 6f 20 49 46 20 20 64 61 74 61 2d 72 6d 61 70 o IF data-rmap
3050: 20 77 69 74 68 20 6d 61 70 63 0a 09 6f 20 49 46 with mapc..o IF
3060: 20 20 64 65 73 74 2d 74 61 69 6c 20 64 65 73 74 dest-tail dest
3070: 2d 74 6f 70 0a 09 20 20 20 20 6d 73 67 28 20 2e -top.. msg( .
3080: 22 20 65 78 70 65 63 74 65 64 3a 20 22 20 6f 76 " expected: " ov
3090: 65 72 20 68 65 78 2e 20 64 75 70 20 68 65 78 2e er hex. dup hex.
30a0: 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 45 4c 53 forth:cr )..ELS
30b0: 45 20 20 23 30 2e 20 6d 73 67 28 20 2e 22 20 65 E #0. msg( ." e
30c0: 78 70 65 63 74 65 64 3a 20 6e 6f 20 64 61 74 61 xpected: no data
30d0: 2d 72 6d 61 70 22 20 66 6f 72 74 68 3a 63 72 20 -rmap" forth:cr
30e0: 29 20 20 54 48 45 4e 20 65 6e 64 77 69 74 68 0a ) THEN endwith.
30f0: 20 20 20 20 45 4c 53 45 20 20 23 30 2e 20 6d 73 ELSE #0. ms
3100: 67 28 20 2e 22 20 65 78 70 65 63 74 65 64 3a 20 g( ." expected:
3110: 6e 6f 20 6f 62 6a 65 63 74 22 20 66 6f 72 74 68 no object" forth
3120: 3a 63 72 20 29 20 20 54 48 45 4e 20 20 3b 0a 0a :cr ) THEN ;..
3130: 3a 20 72 65 77 69 6e 64 2d 74 72 61 6e 73 66 65 : rewind-transfe
3140: 72 20 28 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 r ( -- flag ).
3150: 20 20 64 61 74 61 2d 65 6e 64 3f 20 49 46 20 20 data-end? IF
3160: 66 69 6c 65 72 65 71 23 20 40 20 6e 65 74 32 6f filereq# @ net2o
3170: 3a 72 65 71 75 65 73 74 2d 64 6f 6e 65 20 20 66 :request-done f
3180: 61 6c 73 65 0a 09 64 61 74 61 2d 72 6d 61 70 20 alse..data-rmap
3190: 3e 6f 20 64 75 70 20 74 6f 20 6d 61 70 63 3a 64 >o dup to mapc:d
31a0: 65 73 74 2d 72 65 71 20 6f 3e 0a 20 20 20 20 45 est-req o>. E
31b0: 4c 53 45 20 20 64 61 74 61 2d 72 6d 61 70 20 2e LSE data-rmap .
31c0: 6d 61 70 63 3a 64 65 73 74 2d 72 65 71 20 20 54 mapc:dest-req T
31d0: 48 45 4e 20 3b 0a 0a 3a 20 72 65 71 75 65 73 74 HEN ;..: request
31e0: 2d 73 74 61 74 73 20 20 20 66 6f 72 74 68 3a 74 -stats forth:t
31f0: 72 75 65 20 74 6f 20 72 65 71 75 65 73 74 2d 73 rue to request-s
3200: 74 61 74 73 3f 20 20 61 63 6b 20 74 72 61 63 6b tats? ack track
3210: 2d 74 69 6d 69 6e 67 20 65 6e 64 2d 77 69 74 68 -timing end-with
3220: 20 3b 0a 0a 3a 20 65 78 70 65 63 74 65 64 3f 20 ;..: expected?
3230: 28 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 20 20 ( -- flag ).
3240: 65 78 70 65 63 74 65 64 40 20 75 3e 3d 20 49 46 expected@ u>= IF
3250: 0a 09 65 78 70 65 63 74 2d 72 65 70 6c 79 0a 09 ..expect-reply..
3260: 6d 73 67 28 20 2e 22 20 63 68 65 63 6b 3a 20 22 msg( ." check: "
3270: 20 64 61 74 61 2d 72 6d 61 70 20 77 69 74 68 20 data-rmap with
3280: 6d 61 70 63 0a 09 64 65 73 74 2d 62 61 63 6b 20 mapc..dest-back
3290: 68 65 78 2e 20 64 65 73 74 2d 74 61 69 6c 20 68 hex. dest-tail h
32a0: 65 78 2e 20 64 65 73 74 2d 68 65 61 64 20 68 65 ex. dest-head he
32b0: 78 2e 0a 09 64 61 74 61 2d 61 63 6b 62 69 74 73 x...data-ackbits
32c0: 20 40 20 64 61 74 61 2d 61 63 6b 23 20 40 20 64 @ data-ack# @ d
32d0: 75 70 20 68 65 78 2e 20 2b 20 6c 40 20 68 65 78 up hex. + l@ hex
32e0: 2e 0a 09 65 6e 64 77 69 74 68 0a 09 66 6f 72 74 ...endwith..fort
32f0: 68 3a 63 72 20 2e 22 20 42 6c 6f 63 6b 20 74 72 h:cr ." Block tr
3300: 61 6e 73 66 65 72 20 64 6f 6e 65 3a 20 22 20 65 ansfer done: " e
3310: 78 70 65 63 74 65 64 40 20 68 65 78 2e 20 68 65 xpected@ hex. he
3320: 78 2e 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 73 x. forth:cr )..s
3330: 65 71 23 2c 0a 09 6e 65 74 32 6f 3a 73 61 76 65 eq#,..net2o:save
3340: 26 64 6f 6e 65 20 20 6e 65 74 32 6f 3a 61 63 6b &done net2o:ack
3350: 2d 72 65 73 65 6e 64 23 20 20 72 65 77 69 6e 64 -resend# rewind
3360: 20 20 72 65 77 69 6e 64 2d 74 72 61 6e 73 66 65 rewind-transfe
3370: 72 0a 09 36 34 23 30 20 62 75 72 73 74 2d 74 69 r..64#0 burst-ti
3380: 63 6b 73 20 36 34 21 0a 20 20 20 20 45 4c 53 45 cks 64!. ELSE
3390: 20 20 66 61 6c 73 65 20 20 54 48 45 4e 20 3b 0a false THEN ;.
33a0: 0a 63 65 6c 6c 20 38 20 3d 20 5b 49 46 5d 20 36 .cell 8 = [IF] 6
33b0: 20 5b 45 4c 53 45 5d 20 35 20 5b 54 48 45 4e 5d [ELSE] 5 [THEN]
33c0: 20 43 6f 6e 73 74 61 6e 74 20 63 65 6c 6c 3e 3e Constant cell>>
33d0: 0a 0a 43 72 65 61 74 65 20 6e 6f 2d 72 65 73 65 ..Create no-rese
33e0: 6e 64 23 20 62 75 72 73 74 73 23 20 34 20 2a 20 nd# bursts# 4 *
33f0: 30 20 5b 44 4f 5d 20 2d 31 20 63 2c 20 5b 4c 4f 0 [DO] -1 c, [LO
3400: 4f 50 5d 0a 0a 73 63 6f 70 65 7b 20 6d 61 70 63 OP]..scope{ mapc
3410: 0a 0a 3a 20 2b 72 65 73 65 6e 64 23 20 28 20 62 ..: +resend# ( b
3420: 69 74 20 2d 2d 20 29 20 3e 72 0a 20 20 20 20 64 it -- ) >r. d
3430: 65 73 74 2d 61 64 64 72 20 36 34 40 20 36 34 3e est-addr 64@ 64>
3440: 6e 20 5b 20 6d 69 6e 2d 73 69 7a 65 20 31 2d 20 n [ min-size 1-
3450: 5d 4c 20 61 6e 64 0a 20 20 20 20 72 40 20 5b 20 ]L and. r@ [
3460: 62 75 72 73 74 73 23 20 34 20 2a 20 31 2d 20 5d bursts# 4 * 1- ]
3470: 4c 20 61 6e 64 0a 20 20 20 20 72 3e 20 5b 20 62 L and. r> [ b
3480: 75 72 73 74 73 23 20 2d 34 20 2a 20 5d 4c 20 61 ursts# -4 * ]L a
3490: 6e 64 20 5c 20 6f 6e 65 20 62 6c 6f 63 6b 20 70 nd \ one block p
34a0: 65 72 20 62 75 72 73 74 0a 20 20 20 20 64 61 74 er burst. dat
34b0: 61 2d 72 65 73 65 6e 64 23 2d 62 75 66 20 24 5b a-resend#-buf $[
34c0: 5d 23 20 30 20 3f 44 4f 0a 09 64 75 70 20 49 20 ]# 0 ?DO..dup I
34d0: 64 61 74 61 2d 72 65 73 65 6e 64 23 2d 62 75 66 data-resend#-buf
34e0: 20 24 5b 5d 40 20 64 72 6f 70 20 40 20 3d 20 49 $[]@ drop @ = I
34f0: 46 0a 09 20 20 20 20 64 72 6f 70 20 49 20 64 61 F.. drop I da
3500: 74 61 2d 72 65 73 65 6e 64 23 2d 62 75 66 20 24 ta-resend#-buf $
3510: 5b 5d 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 2b []@ drop cell+ +
3520: 20 63 21 0a 09 20 20 20 20 55 4e 4c 4f 4f 50 20 c!.. UNLOOP
3530: 20 45 58 49 54 20 20 54 48 45 4e 0a 20 20 20 20 EXIT THEN.
3540: 4c 4f 4f 50 0a 20 20 20 20 64 61 74 61 2d 72 65 LOOP. data-re
3550: 73 65 6e 64 23 2d 62 75 66 20 24 5b 5d 23 20 7b send#-buf $[]# {
3560: 20 77 5e 20 62 75 72 73 74 62 6c 6f 63 6b 20 6e w^ burstblock n
3570: 20 7d 0a 20 20 20 20 62 75 72 73 74 62 6c 6f 63 }. burstbloc
3580: 6b 20 63 65 6c 6c 20 64 61 74 61 2d 72 65 73 65 k cell data-rese
3590: 6e 64 23 2d 62 75 66 20 24 2b 5b 5d 21 0a 20 20 nd#-buf $+[]!.
35a0: 20 20 6e 6f 2d 72 65 73 65 6e 64 23 20 5b 20 62 no-resend# [ b
35b0: 75 72 73 74 73 23 20 34 20 2a 20 5d 4c 20 6e 20 ursts# 4 * ]L n
35c0: 64 61 74 61 2d 72 65 73 65 6e 64 23 2d 62 75 66 data-resend#-buf
35d0: 20 24 5b 5d 2b 21 0a 20 20 20 20 6e 20 64 61 74 $[]+!. n dat
35e0: 61 2d 72 65 73 65 6e 64 23 2d 62 75 66 20 24 5b a-resend#-buf $[
35f0: 5d 40 20 64 72 6f 70 20 63 65 6c 6c 2b 20 2b 20 ]@ drop cell+ +
3600: 63 21 20 3b 0a 0a 7d 73 63 6f 70 65 0a 0a 3a 20 c! ;..}scope..:
3610: 2b 63 6f 6f 6b 69 65 20 28 20 2d 2d 20 29 0a 20 +cookie ( -- ).
3620: 20 20 20 64 61 74 61 2d 72 6d 61 70 20 77 69 74 data-rmap wit
3630: 68 20 6d 61 70 63 20 20 61 63 6b 2d 62 69 74 23 h mapc ack-bit#
3640: 20 40 20 3e 72 20 20 72 40 20 2b 72 65 73 65 6e @ >r r@ +resen
3650: 64 23 0a 20 20 20 20 64 61 74 61 2d 61 63 6b 62 d#. data-ackb
3660: 69 74 73 20 40 20 72 3e 20 2b 62 69 74 40 0a 20 its @ r> +bit@.
3670: 20 20 20 65 6e 64 77 69 74 68 20 6e 65 67 61 74 endwith negat
3680: 65 20 70 61 63 6b 65 74 72 32 20 2b 21 20 3b 0a e packetr2 +! ;.
3690: 0a 3a 20 72 65 73 65 6e 64 2d 61 6c 6c 3f 20 28 .: resend-all? (
36a0: 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20 20 20 64 -- flag ). d
36b0: 61 74 61 2d 72 6d 61 70 20 77 69 74 68 20 6d 61 ata-rmap with ma
36c0: 70 63 0a 20 20 20 20 61 63 6b 2d 61 64 76 61 6e pc. ack-advan
36d0: 63 65 3f 20 20 64 65 73 74 2d 68 65 61 64 20 64 ce? dest-head d
36e0: 65 73 74 2d 74 6f 70 20 75 3e 3d 20 20 61 6e 64 est-top u>= and
36f0: 20 65 6e 64 77 69 74 68 0a 20 20 20 20 74 69 63 endwith. tic
3700: 6b 65 72 20 36 34 40 20 72 65 73 65 6e 64 2d 61 ker 64@ resend-a
3710: 6c 6c 2d 74 6f 20 36 34 40 20 36 34 75 3e 3d 20 ll-to 64@ 64u>=
3720: 61 6e 64 0a 20 20 20 20 74 69 6d 65 6f 75 74 28 and. timeout(
3730: 20 64 75 70 20 49 46 20 20 2e 22 20 72 65 73 65 dup IF ." rese
3740: 6e 64 20 61 6c 6c 22 20 66 6f 72 74 68 3a 63 72 nd all" forth:cr
3750: 20 20 54 48 45 4e 20 29 20 3b 0a 0a 3a 20 2b 65 THEN ) ;..: +e
3760: 78 70 65 63 74 65 64 20 28 20 2d 2d 20 66 6c 61 xpected ( -- fla
3770: 67 20 29 0a 20 20 20 20 72 65 73 65 6e 64 2d 61 g ). resend-a
3780: 6c 6c 3f 20 20 49 46 20 20 20 72 65 73 65 6e 64 ll? IF resend
3790: 2d 61 6c 6c 20 20 54 48 45 4e 20 20 65 78 70 65 -all THEN expe
37a0: 63 74 65 64 3f 20 3b 0a 0a 5c 20 68 69 67 68 65 cted? ;..\ highe
37b0: 72 20 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e r level function
37c0: 73 0a 0a 3a 20 6d 61 70 2d 72 65 71 75 65 73 74 s..: map-request
37d0: 2c 20 28 20 75 63 6f 64 65 20 75 64 61 74 61 20 , ( ucode udata
37e0: 2d 2d 20 29 0a 20 20 20 20 6e 65 74 32 6f 3a 6e -- ). net2o:n
37f0: 65 77 2d 6d 61 70 20 6c 69 74 2c 20 73 77 61 70 ew-map lit, swap
3800: 20 75 6c 69 74 2c 20 75 6c 69 74 2c 20 6d 61 70 ulit, ulit, map
3810: 2d 72 65 71 75 65 73 74 20 3b 0a 0a 61 6c 73 6f -request ;..also
3820: 20 6e 65 74 32 6f 2d 62 61 73 65 0a 3a 20 6e 61 net2o-base.: na
3830: 74 2d 70 75 6e 63 68 20 28 20 6f 3a 63 6f 6e 6e t-punch ( o:conn
3840: 65 63 74 69 6f 6e 20 2d 2d 20 29 0a 20 20 20 20 ection -- ).
3850: 70 69 6e 67 73 20 6e 65 77 2d 72 65 71 75 65 73 pings new-reques
3860: 74 20 66 61 6c 73 65 20 67 65 6e 2d 70 75 6e 63 t false gen-punc
3870: 68 6c 6f 61 64 20 67 65 6e 2d 70 75 6e 63 68 20 hload gen-punch
3880: 3b 0a 70 72 65 76 69 6f 75 73 0a 0a 3a 20 70 75 ;.previous..: pu
3890: 6e 63 68 2d 72 65 70 6c 79 20 28 20 61 64 64 72 nch-reply ( addr
38a0: 20 75 20 2d 2d 20 29 0a 20 20 20 20 6f 75 74 66 u -- ). outf
38b0: 6c 61 67 20 40 20 3e 72 20 20 63 6d 64 62 75 66 lag @ >r cmdbuf
38c0: 2d 6f 20 40 20 3e 72 0a 20 20 20 20 5b 3a 20 63 -o @ >r. [: c
38d0: 6d 64 30 21 20 63 6d 64 72 65 73 65 74 20 69 6e md0! cmdreset in
38e0: 69 74 2d 72 65 70 6c 79 20 61 6c 73 6f 20 6e 65 it-reply also ne
38f0: 74 32 6f 2d 62 61 73 65 0a 20 20 20 20 20 20 5b t2o-base. [
3900: 20 61 6c 73 6f 20 6e 65 74 32 6f 2d 62 61 73 65 also net2o-base
3910: 20 5d 0a 20 20 20 20 20 20 24 2c 20 6e 65 73 74 ]. $, nest
3920: 20 65 6e 64 2d 63 6f 64 65 20 3b 5d 20 63 61 74 end-code ;] cat
3930: 63 68 0a 20 20 20 20 72 3e 20 63 6d 64 62 75 66 ch. r> cmdbuf
3940: 2d 6f 20 21 20 20 72 3e 20 6f 75 74 66 6c 61 67 -o ! r> outflag
3950: 20 21 20 20 74 68 72 6f 77 20 3b 0a 0a 3a 20 30 ! throw ;..: 0
3960: 2d 72 65 73 65 6e 64 3f 20 28 20 2d 2d 20 6e 20 -resend? ( -- n
3970: 29 0a 20 20 20 20 72 65 73 65 6e 64 30 20 40 20 ). resend0 @
3980: 49 46 0a 09 5c 20 2e 22 20 52 65 73 65 6e 64 20 IF..\ ." Resend
3990: 74 6f 20 30 22 20 63 72 0a 09 63 6d 64 30 21 0a to 0" cr..cmd0!.
39a0: 09 5b 3a 0a 09 20 20 72 65 73 65 6e 64 28 20 2e .[:.. resend( .
39b0: 22 20 72 65 73 65 6e 64 30 3a 20 22 20 72 65 73 " resend0: " res
39c0: 65 6e 64 30 20 24 40 20 6e 65 74 32 6f 3a 73 65 end0 $@ net2o:se
39d0: 65 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 20 20 e forth:cr )..
39e0: 6d 73 67 28 20 2e 22 20 72 65 73 65 6e 64 30 3a msg( ." resend0:
39f0: 20 22 20 72 65 73 65 6e 64 30 20 24 40 20 73 77 " resend0 $@ sw
3a00: 61 70 20 68 65 78 2e 20 68 65 78 2e 20 66 6f 72 ap hex. hex. for
3a10: 74 68 3a 63 72 20 29 0a 09 20 20 63 6d 64 72 65 th:cr ).. cmdre
3a20: 73 65 74 20 69 6e 69 74 2d 72 65 70 6c 79 20 72 set init-reply r
3a30: 65 73 65 6e 64 30 20 24 40 20 2b 63 6d 64 62 75 esend0 $@ +cmdbu
3a40: 66 0a 09 20 20 72 30 2d 61 64 64 72 65 73 73 20 f.. r0-address
3a50: 72 65 74 75 72 6e 2d 61 64 64 72 20 24 31 30 20 return-addr $10
3a60: 6d 6f 76 65 0a 09 20 20 63 6d 64 62 75 66 24 20 move.. cmdbuf$
3a70: 72 6e 67 36 34 20 73 65 6e 64 2d 63 6d 64 20 64 rng64 send-cmd d
3a80: 72 6f 70 0a 09 20 20 31 20 70 61 63 6b 65 74 73 rop.. 1 packets
3a90: 32 20 2b 21 20 3b 5d 0a 09 63 6d 64 6c 6f 63 6b 2 +! ;]..cmdlock
3aa0: 20 63 2d 73 65 63 74 69 6f 6e 20 20 31 0a 20 20 c-section 1.
3ab0: 20 20 45 4c 53 45 20 20 30 20 20 54 48 45 4e 20 ELSE 0 THEN
3ac0: 3b 0a 0a 3a 20 6d 61 70 2d 72 65 73 65 6e 64 3f ;..: map-resend?
3ad0: 20 28 20 2d 2d 20 6e 20 29 0a 20 20 20 20 63 6f ( -- n ). co
3ae0: 64 65 2d 6d 61 70 20 3f 64 75 70 2d 49 46 20 20 de-map ?dup-IF
3af0: 77 69 74 68 20 6d 61 70 63 20 30 20 20 6f 75 74 with mapc 0 out
3b00: 66 6c 61 67 20 6f 66 66 0a 09 64 65 73 74 2d 72 flag off..dest-r
3b10: 65 70 6c 69 65 73 0a 09 64 65 73 74 2d 73 69 7a eplies..dest-siz
3b20: 65 20 61 64 64 72 3e 72 65 70 6c 69 65 73 20 62 e addr>replies b
3b30: 6f 75 6e 64 73 20 65 6e 64 77 69 74 68 20 55 2b ounds endwith U+
3b40: 44 4f 0a 09 20 20 20 20 49 20 61 63 74 69 6f 6e DO.. I action
3b50: 2d 6f 66 20 72 65 70 6c 79 2d 78 74 20 49 46 0a -of reply-xt IF.
3b60: 09 09 74 69 6d 65 6f 75 74 28 20 2e 22 20 72 65 ..timeout( ." re
3b70: 73 65 6e 64 3a 20 22 20 49 20 61 63 74 69 6f 6e send: " I action
3b80: 2d 6f 66 20 72 65 70 6c 79 2d 78 74 20 2e 6e 61 -of reply-xt .na
3b90: 6d 65 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 09 me forth:cr )...
3ba0: 72 65 73 65 6e 64 28 20 2e 22 20 72 65 73 65 6e resend( ." resen
3bb0: 64 3a 20 22 20 49 20 72 65 70 6c 79 2d 64 65 73 d: " I reply-des
3bc0: 74 20 36 34 40 20 78 36 34 2e 20 49 20 32 40 20 t 64@ x64. I 2@
3bd0: 6e 65 74 32 6f 3a 73 65 65 20 66 6f 72 74 68 3a net2o:see forth:
3be0: 63 72 20 29 0a 09 09 6d 73 67 28 20 2e 22 20 72 cr )...msg( ." r
3bf0: 65 73 65 6e 64 3a 20 22 20 49 20 72 65 70 6c 79 esend: " I reply
3c00: 2d 64 65 73 74 20 36 34 40 20 78 36 34 2e 20 49 -dest 64@ x64. I
3c10: 20 32 40 20 73 77 61 70 20 68 65 78 2e 20 68 65 2@ swap hex. he
3c20: 78 2e 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 09 x. forth:cr )...
3c30: 74 69 63 6b 73 20 49 20 72 65 70 6c 79 2d 74 69 ticks I reply-ti
3c40: 6d 65 20 36 34 21 0a 09 09 49 20 32 40 20 49 20 me 64!...I 2@ I
3c50: 72 65 70 6c 79 2d 64 65 73 74 20 36 34 40 20 73 reply-dest 64@ s
3c60: 65 6e 64 2d 63 6d 64 20 64 72 6f 70 0a 09 09 31 end-cmd drop...1
3c70: 20 70 61 63 6b 65 74 73 32 20 2b 21 20 31 2b 0a packets2 +! 1+.
3c80: 09 20 20 20 20 54 48 45 4e 0a 09 72 65 70 6c 79 . THEN..reply
3c90: 20 2b 4c 4f 4f 50 0a 20 20 20 20 45 4c 53 45 20 +LOOP. ELSE
3ca0: 20 30 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 63 6d 0 THEN ;..: cm
3cb0: 64 2d 72 65 73 65 6e 64 3f 20 28 20 2d 2d 20 6e d-resend? ( -- n
3cc0: 20 29 0a 20 20 20 20 30 2d 72 65 73 65 6e 64 3f ). 0-resend?
3cd0: 20 6d 61 70 2d 72 65 73 65 6e 64 3f 0a 20 20 20 map-resend?.
3ce0: 20 74 69 6d 65 6f 75 74 28 20 2e 22 20 72 65 73 timeout( ." res
3cf0: 65 6e 64 20 22 20 6f 76 65 72 20 2e 20 64 75 70 end " over . dup
3d00: 20 2e 20 2e 22 20 63 6f 6d 6d 61 6e 64 73 20 30 . ." commands 0
3d10: 2f 6d 61 70 22 20 63 72 20 29 20 2b 20 3b 0a 0a /map" cr ) + ;..
3d20: 3a 20 2e 65 78 70 65 63 74 65 64 20 28 20 2d 2d : .expected ( --
3d30: 20 29 0a 20 20 20 20 66 6f 72 74 68 3a 2e 74 69 ). forth:.ti
3d40: 6d 65 20 2e 22 20 65 78 70 65 63 74 65 64 2f 72 me ." expected/r
3d50: 65 63 65 69 76 65 64 3a 20 22 20 72 65 63 76 2d eceived: " recv-
3d60: 61 64 64 72 20 40 20 68 65 78 2e 0a 20 20 20 20 addr @ hex..
3d70: 64 61 74 61 2d 72 6d 61 70 20 2e 6d 61 70 63 3a data-rmap .mapc:
3d80: 64 61 74 61 2d 61 63 6b 23 20 40 20 68 65 78 2e data-ack# @ hex.
3d90: 0a 20 20 20 20 65 78 70 65 63 74 65 64 40 20 68 . expected@ h
3da0: 65 78 2e 20 68 65 78 2e 20 66 6f 72 74 68 3a 63 ex. hex. forth:c
3db0: 72 20 3b 0a 0a 5c 20 61 63 6b 6e 6f 77 6c 65 64 r ;..\ acknowled
3dc0: 67 65 20 74 6f 70 6c 65 76 65 6c 0a 0a 69 6e 20 ge toplevel..in
3dd0: 6e 65 74 32 6f 20 3a 20 61 63 6b 2d 63 6f 64 65 net2o : ack-code
3de0: 20 28 20 61 63 6b 66 6c 61 67 20 2d 2d 20 61 63 ( ackflag -- ac
3df0: 6b 66 6c 61 67 20 29 20 20 3e 72 0a 20 20 20 20 kflag ) >r.
3e00: 66 61 6c 73 65 20 64 75 70 20 7b 20 73 6c 75 72 false dup { slur
3e10: 70 3f 20 73 74 61 74 73 3f 20 7d 0a 20 20 20 20 p? stats? }.
3e20: 6e 65 74 32 6f 2d 63 6f 64 65 0a 20 20 20 20 61 net2o-code. a
3e30: 63 6b 20 65 78 70 65 63 74 2d 72 65 70 6c 79 20 ck expect-reply
3e40: 20 31 20 74 6f 20 72 65 63 2d 61 63 6b 2d 70 6f 1 to rec-ack-po
3e50: 73 23 0a 20 20 20 20 61 63 6b 28 20 2e 22 20 61 s#. ack( ." a
3e60: 63 6b 3a 20 22 20 72 40 20 68 65 78 2e 20 66 6f ck: " r@ hex. fo
3e70: 72 74 68 3a 63 72 20 29 0a 20 20 20 20 72 40 20 rth:cr ). r@
3e80: 61 63 6b 2d 74 6f 67 67 6c 65 23 20 61 6e 64 20 ack-toggle# and
3e90: 49 46 0a 09 73 65 71 23 2c 0a 09 6e 65 74 32 6f IF..seq#,..net2o
3ea0: 3a 67 65 6e 2d 72 65 73 65 6e 64 20 20 6e 65 74 :gen-resend net
3eb0: 32 6f 3a 67 65 6e 61 63 6b 0a 09 72 40 20 72 65 2o:genack..r@ re
3ec0: 73 65 6e 64 2d 74 6f 67 67 6c 65 23 20 61 6e 64 send-toggle# and
3ed0: 20 49 46 0a 09 20 20 20 20 61 63 6b 28 20 2e 22 IF.. ack( ."
3ee0: 20 61 63 6b 3a 20 64 6f 2d 72 65 73 65 6e 64 22 ack: do-resend"
3ef0: 20 66 6f 72 74 68 3a 63 72 20 29 0a 09 20 20 20 forth:cr )..
3f00: 20 74 72 75 65 20 6e 65 74 32 6f 3a 64 6f 2d 72 true net2o:do-r
3f10: 65 73 65 6e 64 0a 09 54 48 45 4e 0a 09 30 20 64 esend..THEN..0 d
3f20: 61 74 61 2d 72 6d 61 70 20 2e 6d 61 70 63 3a 64 ata-rmap .mapc:d
3f30: 6f 2d 73 6c 75 72 70 20 21 40 0a 09 3f 64 75 70 o-slurp !@..?dup
3f40: 2d 49 46 20 20 75 6c 69 74 2c 20 61 63 6b 2d 66 -IF ulit, ack-f
3f50: 6c 75 73 68 0a 09 20 20 20 20 72 65 71 75 65 73 lush.. reques
3f60: 74 2d 73 74 61 74 73 3f 20 74 6f 20 73 74 61 74 t-stats? to stat
3f70: 73 3f 20 20 74 72 75 65 20 74 6f 20 73 6c 75 72 s? true to slur
3f80: 70 3f 20 20 54 48 45 4e 0a 20 20 20 20 54 48 45 p? THEN. THE
3f90: 4e 20 20 2b 65 78 70 65 63 74 65 64 0a 20 20 20 N +expected.
3fa0: 20 73 6c 75 72 70 3f 20 6f 72 20 74 6f 20 73 6c slurp? or to sl
3fb0: 75 72 70 3f 0a 20 20 20 20 73 74 61 74 73 3f 20 urp?. stats?
3fc0: 49 46 20 20 73 65 6e 64 2d 74 69 6d 69 6e 67 20 IF send-timing
3fd0: 20 54 48 45 4e 0a 20 20 20 20 65 6e 64 2d 77 69 THEN. end-wi
3fe0: 74 68 20 20 63 6d 64 62 75 66 23 20 40 20 72 65 th cmdbuf# @ re
3ff0: 63 2d 61 63 6b 2d 70 6f 73 23 20 31 2b 20 73 74 c-ack-pos# 1+ st
4000: 61 74 73 3f 20 2d 20 3d 20 49 46 20 20 63 6d 64 ats? - = IF cmd
4010: 62 75 66 23 20 6f 66 66 0a 20 20 20 20 45 4c 53 buf# off. ELS
4020: 45 20 20 31 20 64 61 74 61 2d 72 6d 61 70 20 77 E 1 data-rmap w
4030: 69 74 68 20 6d 61 70 63 20 2b 74 6f 20 72 65 63 ith mapc +to rec
4040: 2d 61 63 6b 23 20 65 6e 64 77 69 74 68 20 20 54 -ack# endwith T
4050: 48 45 4e 0a 20 20 20 20 73 6c 75 72 70 3f 20 49 HEN. slurp? I
4060: 46 20 20 73 6c 75 72 70 20 20 54 48 45 4e 0a 20 F slurp THEN.
4070: 20 20 20 65 6e 64 2d 63 6f 64 65 20 72 3e 20 28 end-code r> (
4080: 20 64 75 70 20 61 63 6b 2d 74 6f 67 67 6c 65 23 dup ack-toggle#
4090: 20 61 6e 64 20 49 46 20 20 6d 61 70 2d 72 65 73 and IF map-res
40a0: 65 6e 64 3f 20 20 54 48 45 4e 20 29 20 3b 0a 0a end? THEN ) ;..
40b0: 69 6e 20 6e 65 74 32 6f 20 3a 20 64 6f 2d 61 63 in net2o : do-ac
40c0: 6b 2d 72 65 73 74 20 28 20 61 63 6b 66 6c 61 67 k-rest ( ackflag
40d0: 20 2d 2d 20 29 0a 20 20 20 20 64 75 70 20 72 65 -- ). dup re
40e0: 73 65 6e 64 2d 74 6f 67 67 6c 65 23 20 61 6e 64 send-toggle# and
40f0: 20 49 46 0a 09 63 6d 64 2d 72 65 73 65 6e 64 3f IF..cmd-resend?
4100: 20 64 72 6f 70 0a 20 20 20 20 54 48 45 4e 0a 20 drop. THEN.
4110: 20 20 20 61 63 6b 73 23 20 61 6e 64 20 64 61 74 acks# and dat
4120: 61 2d 72 6d 61 70 20 2e 6d 61 70 63 3a 61 63 6b a-rmap .mapc:ack
4130: 2d 61 64 76 61 6e 63 65 3f 0a 20 20 20 20 49 46 -advance?. IF
4140: 20 20 6e 65 74 32 6f 3a 61 63 6b 2d 63 6f 64 65 net2o:ack-code
4150: 20 20 54 48 45 4e 20 20 61 63 6b 2d 74 69 6d 69 THEN ack-timi
4160: 6e 67 20 3b 0a 0a 69 6e 20 6e 65 74 32 6f 20 3a ng ;..in net2o :
4170: 20 64 6f 2d 61 63 6b 20 28 20 2d 2d 20 29 0a 20 do-ack ( -- ).
4180: 20 20 20 64 65 73 74 2d 61 64 64 72 20 36 34 40 dest-addr 64@
4190: 20 72 65 63 76 2d 61 64 64 72 20 36 34 21 20 20 recv-addr 64!
41a0: 2b 63 6f 6f 6b 69 65 20 5c 20 6c 61 73 74 20 72 +cookie \ last r
41b0: 65 63 65 69 76 65 64 20 70 61 63 6b 65 74 0a 20 eceived packet.
41c0: 20 20 20 69 6e 62 75 66 20 31 2b 20 63 40 20 61 inbuf 1+ c@ a
41d0: 63 6b 2d 72 65 63 65 69 76 65 20 6f 76 65 72 20 ck-receive over
41e0: 74 6f 20 61 63 6b 2d 72 65 63 65 69 76 65 20 78 to ack-receive x
41f0: 6f 72 0a 20 20 20 20 2b 74 69 6d 65 6f 75 74 30 or. +timeout0
4200: 20 72 65 73 65 6e 64 2d 61 6c 6c 2d 74 6f 20 36 resend-all-to 6
4210: 34 21 0a 20 20 20 20 6e 65 74 32 6f 3a 64 6f 2d 4!. net2o:do-
4220: 61 63 6b 2d 72 65 73 74 20 3b 0a 0a 3a 20 2b 66 ack-rest ;..: +f
4230: 6c 6f 77 2d 63 6f 6e 74 72 6f 6c 20 5b 27 5d 20 low-control [']
4240: 6e 65 74 32 6f 3a 64 6f 2d 61 63 6b 20 69 73 20 net2o:do-ack is
4250: 61 63 6b 2d 78 74 20 3b 0a 0a 5c 20 6b 65 65 70 ack-xt ;..\ keep
4260: 61 6c 69 76 65 0a 0a 61 6c 73 6f 20 6e 65 74 32 alive..also net2
4270: 6f 2d 62 61 73 65 0a 3a 20 2e 6b 65 65 70 61 6c o-base.: .keepal
4280: 69 76 65 20 28 20 2d 2d 20 29 20 20 2e 22 20 74 ive ( -- ) ." t
4290: 72 61 6e 73 66 65 72 20 6b 65 65 70 61 6c 69 76 ransfer keepaliv
42a0: 65 20 65 2f 65 20 68 20 74 20 62 20 22 20 65 78 e e/e h t b " ex
42b0: 70 65 63 74 65 64 40 20 68 65 78 2e 20 68 65 78 pected@ hex. hex
42c0: 2e 0a 20 20 20 20 64 61 74 61 2d 72 6d 61 70 20 .. data-rmap
42d0: 77 69 74 68 20 6d 61 70 63 20 20 64 65 73 74 2d with mapc dest-
42e0: 68 65 61 64 20 68 65 78 2e 20 64 65 73 74 2d 74 head hex. dest-t
42f0: 61 69 6c 20 68 65 78 2e 20 64 65 73 74 2d 62 61 ail hex. dest-ba
4300: 63 6b 20 68 65 78 2e 0a 20 20 20 20 64 61 74 61 ck hex.. data
4310: 2d 61 63 6b 62 69 74 73 20 40 20 64 65 73 74 2d -ackbits @ dest-
4320: 73 69 7a 65 20 61 64 64 72 3e 62 79 74 65 73 20 size addr>bytes
4330: 64 75 6d 70 0a 20 20 20 20 65 6e 64 77 69 74 68 dump. endwith
4340: 0a 20 20 20 20 66 6f 72 74 68 3a 63 72 20 3b 0a . forth:cr ;.
4350: 3a 20 74 72 61 6e 73 66 65 72 2d 6b 65 65 70 61 : transfer-keepa
4360: 6c 69 76 65 3f 20 28 20 2d 2d 20 66 6c 61 67 20 live? ( -- flag
4370: 29 0a 20 20 20 20 6f 20 74 6f 20 63 6f 6e 6e 65 ). o to conne
4380: 63 74 69 6f 6e 0a 20 20 20 20 74 69 6d 65 6f 75 ction. timeou
4390: 74 28 20 2e 6b 65 65 70 61 6c 69 76 65 20 29 0a t( .keepalive ).
43a0: 20 20 20 20 64 61 74 61 2d 72 6d 61 70 20 77 69 data-rmap wi
43b0: 74 68 20 6d 61 70 63 20 64 65 73 74 2d 72 65 71 th mapc dest-req
43c0: 20 64 75 70 20 61 63 6b 2d 61 64 76 61 6e 63 65 dup ack-advance
43d0: 3f 20 6f 72 20 74 6f 20 61 63 6b 2d 61 64 76 61 ? or to ack-adva
43e0: 6e 63 65 3f 20 65 6e 64 77 69 74 68 0a 20 20 20 nce? endwith.
43f0: 20 64 75 70 20 49 46 0a 09 21 74 69 63 6b 73 20 dup IF..!ticks
4400: 74 69 63 6b 65 72 20 36 34 40 20 72 65 73 65 6e ticker 64@ resen
4410: 64 2d 61 6c 6c 2d 74 6f 20 36 34 21 0a 09 5b 20 d-all-to 64!..[
4420: 61 63 6b 2d 74 6f 67 67 6c 65 23 20 72 65 73 65 ack-toggle# rese
4430: 6e 64 2d 74 6f 67 67 6c 65 23 20 6f 72 20 5d 4c nd-toggle# or ]L
4440: 20 6e 65 74 32 6f 3a 64 6f 2d 61 63 6b 2d 72 65 net2o:do-ack-re
4450: 73 74 20 20 54 48 45 4e 20 3b 0a 70 72 65 76 69 st THEN ;.previ
4460: 6f 75 73 0a 0a 3a 20 63 6d 64 2d 74 69 6d 65 6f ous..: cmd-timeo
4470: 75 74 20 28 20 2d 2d 20 29 20 20 3e 6e 65 78 74 ut ( -- ) >next
4480: 2d 74 69 6d 65 6f 75 74 20 63 6d 64 2d 72 65 73 -timeout cmd-res
4490: 65 6e 64 3f 0a 20 20 20 20 49 46 20 20 70 75 73 end?. IF pus
44a0: 68 2d 74 69 6d 65 6f 75 74 20 20 45 4c 53 45 20 h-timeout ELSE
44b0: 20 61 63 6b 40 20 2e 74 69 6d 65 6f 75 74 73 20 ack@ .timeouts
44c0: 6f 66 66 20 20 54 48 45 4e 20 3b 0a 3a 20 63 6f off THEN ;.: co
44d0: 6e 6e 65 63 74 65 64 2d 74 69 6d 65 6f 75 74 20 nnected-timeout
44e0: 28 20 2d 2d 20 29 20 74 69 6d 65 6f 75 74 28 20 ( -- ) timeout(
44f0: 2e 22 20 63 6f 6e 6e 65 63 74 65 64 20 74 69 6d ." connected tim
4500: 65 6f 75 74 20 22 20 61 63 6b 40 20 3e 6f 20 72 eout " ack@ >o r
4510: 74 64 65 6c 61 79 20 36 34 40 20 75 36 34 2e 20 tdelay 64@ u64.
4520: 74 69 6d 65 6f 75 74 73 20 3f 20 6f 3e 20 66 6f timeouts ? o> fo
4530: 72 74 68 3a 63 72 20 29 0a 20 20 20 20 3e 6e 65 rth:cr ). >ne
4540: 78 74 2d 74 69 6d 65 6f 75 74 20 63 6d 64 2d 72 xt-timeout cmd-r
4550: 65 73 65 6e 64 3f 0a 20 20 20 20 49 46 0a 09 70 esend?. IF..p
4560: 75 73 68 2d 74 69 6d 65 6f 75 74 0a 20 20 20 20 ush-timeout.
4570: 45 4c 53 45 0a 09 74 72 61 6e 73 66 65 72 2d 6b ELSE..transfer-k
4580: 65 65 70 61 6c 69 76 65 3f 20 30 3d 0a 09 49 46 eepalive? 0=..IF
4590: 20 20 61 63 6b 40 20 2e 74 69 6d 65 6f 75 74 73 ack@ .timeouts
45a0: 20 6f 66 66 20 20 45 4c 53 45 20 20 70 75 73 68 off ELSE push
45b0: 2d 74 69 6d 65 6f 75 74 20 20 54 48 45 4e 0a 20 -timeout THEN.
45c0: 20 20 20 54 48 45 4e 20 3b 0a 0a 5c 20 3a 20 2b THEN ;..\ : +
45d0: 63 6f 6e 6e 65 63 74 69 6e 67 20 20 20 5b 27 5d connecting [']
45e0: 20 63 6f 6e 6e 65 63 74 69 6e 67 2d 74 69 6d 65 connecting-time
45f0: 6f 75 74 20 69 73 20 74 69 6d 65 6f 75 74 2d 78 out is timeout-x
4600: 74 20 3b 0a 3a 20 2b 72 65 73 65 6e 64 20 28 20 t ;.: +resend (
4610: 2d 2d 20 29 20 72 65 73 65 6e 64 28 20 2e 22 20 -- ) resend( ."
4620: 2b 72 65 73 65 6e 64 22 20 63 72 20 29 0a 20 20 +resend" cr ).
4630: 20 20 5b 27 5d 20 63 6f 6e 6e 65 63 74 65 64 2d ['] connected-
4640: 74 69 6d 65 6f 75 74 20 20 69 73 20 74 69 6d 65 timeout is time
4650: 6f 75 74 2d 78 74 20 6f 2b 74 69 6d 65 6f 75 74 out-xt o+timeout
4660: 0a 20 20 20 20 36 34 23 30 20 72 65 73 65 6e 64 . 64#0 resend
4670: 2d 61 6c 6c 2d 74 6f 20 36 34 21 20 3b 0a 3a 20 -all-to 64! ;.:
4680: 2b 72 65 73 65 6e 64 2d 63 6d 64 20 28 20 2d 2d +resend-cmd ( --
4690: 20 29 20 72 65 73 65 6e 64 28 20 2e 22 20 2b 72 ) resend( ." +r
46a0: 65 73 65 6e 64 2d 63 6d 64 22 20 63 72 20 29 0a esend-cmd" cr ).
46b0: 20 20 20 20 5b 27 5d 20 63 6d 64 2d 74 69 6d 65 ['] cmd-time
46c0: 6f 75 74 20 20 20 20 20 20 20 20 69 73 20 74 69 out is ti
46d0: 6d 65 6f 75 74 2d 78 74 20 6f 2b 74 69 6d 65 6f meout-xt o+timeo
46e0: 75 74 20 3b 0a 0a 3a 20 2b 67 65 74 2d 74 69 6d ut ;..: +get-tim
46f0: 65 20 20 20 20 20 5b 27 5d 20 67 65 74 2d 74 69 e ['] get-ti
4700: 63 6b 20 69 73 20 6f 74 68 65 72 20 3b 0a 0a 3a ck is other ;..:
4710: 20 72 65 71 73 69 7a 65 21 20 28 20 75 63 6f 64 reqsize! ( ucod
4720: 65 20 75 64 61 74 61 20 2d 2d 20 29 20 20 74 6f e udata -- ) to
4730: 20 72 65 71 2d 64 61 74 61 73 69 7a 65 20 20 74 req-datasize t
4740: 6f 20 72 65 71 2d 63 6f 64 65 73 69 7a 65 20 3b o req-codesize ;
4750: 0a 3a 20 63 6f 6e 6e 65 63 74 2d 72 65 73 74 20 .: connect-rest
4760: 28 20 6e 20 2d 2d 20 29 0a 20 20 20 20 63 6c 65 ( n -- ). cle
4770: 61 6e 2d 72 65 71 75 65 73 74 20 2d 74 69 6d 65 an-request -time
4780: 6f 75 74 20 74 73 6b 63 20 4b 45 59 42 59 54 45 out tskc KEYBYTE
4790: 53 20 65 72 61 73 65 20 63 6f 6e 74 65 78 74 21 S erase context!
47a0: 20 3b 0a 0a 3a 20 65 6e 64 2d 63 6f 64 65 7c 20 ;..: end-code|
47b0: 28 20 2d 2d 20 29 20 20 5d 5d 20 65 6e 64 2d 63 ( -- ) ]] end-c
47c0: 6f 64 65 20 63 6c 69 65 6e 74 2d 6c 6f 6f 70 20 ode client-loop
47d0: 5b 5b 20 3b 20 69 6d 6d 65 64 69 61 74 65 20 63 [[ ; immediate c
47e0: 6f 6d 70 69 6c 65 2d 6f 6e 6c 79 0a 0a 3a 20 67 ompile-only..: g
47f0: 65 6e 2d 72 65 71 75 65 73 74 20 28 20 2d 2d 20 en-request ( --
4800: 29 0a 20 20 20 20 73 65 74 75 70 21 20 20 2b 72 ). setup! +r
4810: 65 73 65 6e 64 2d 63 6d 64 20 20 67 65 6e 2d 74 esend-cmd gen-t
4820: 6d 70 6b 65 79 73 20 20 5b 27 5d 20 63 6f 6e 6e mpkeys ['] conn
4830: 65 63 74 2d 72 65 73 74 20 72 71 64 3f 0a 20 20 ect-rest rqd?.
4840: 20 20 63 6d 64 28 20 69 6e 64 2d 61 64 64 72 20 cmd( ind-addr
4850: 40 20 49 46 20 20 2e 22 20 69 6e 22 20 54 48 45 @ IF ." in" THE
4860: 4e 20 2e 22 20 64 69 72 65 63 74 20 63 6f 6e 6e N ." direct conn
4870: 65 63 74 22 20 66 6f 72 74 68 3a 63 72 20 29 0a ect" forth:cr ).
4880: 20 20 20 20 69 76 73 28 20 2e 22 20 67 65 6e 20 ivs( ." gen
4890: 72 65 71 75 65 73 74 22 20 66 6f 72 74 68 3a 63 request" forth:c
48a0: 72 20 29 0a 20 20 20 20 6e 65 74 32 6f 2d 63 6f r ). net2o-co
48b0: 64 65 30 0a 20 20 20 20 6e 65 74 32 6f 2d 76 65 de0. net2o-ve
48c0: 72 73 69 6f 6e 20 24 2c 20 76 65 72 73 69 6f 6e rsion $, version
48d0: 3f 20 20 30 6b 65 79 2c 0a 20 20 20 20 74 70 6b ? 0key,. tpk
48e0: 63 20 6b 65 79 73 69 7a 65 20 24 2c 20 72 65 63 c keysize $, rec
48f0: 65 69 76 65 2d 74 6d 70 6b 65 79 0a 20 20 20 20 eive-tmpkey.
4900: 6e 65 73 74 5b 20 63 6f 6f 6b 69 65 2c 20 67 65 nest[ cookie, ge
4910: 6e 2d 72 65 70 6c 79 20 72 65 71 75 65 73 74 2c n-reply request,
4920: 20 5d 6e 65 73 74 20 20 6f 74 68 65 72 0a 20 20 ]nest other.
4930: 20 20 74 6d 70 6b 65 79 2d 72 65 71 75 65 73 74 tmpkey-request
4940: 0a 20 20 20 20 69 6e 64 2d 61 64 64 72 20 40 20 . ind-addr @
4950: 20 49 46 20 20 70 75 6e 63 68 3f 20 20 54 48 45 IF punch? THE
4960: 4e 0a 20 20 20 20 72 65 71 2d 63 6f 64 65 73 69 N. req-codesi
4970: 7a 65 20 20 72 65 71 2d 64 61 74 61 73 69 7a 65 ze req-datasize
4980: 20 20 6d 61 70 2d 72 65 71 75 65 73 74 2c 20 20 map-request,
4990: 63 6c 6f 73 65 2d 74 6d 70 6e 65 73 74 0a 20 20 close-tmpnest.
49a0: 20 20 5b 27 5d 20 70 75 73 68 2d 63 6d 64 20 49 ['] push-cmd I
49b0: 53 20 65 78 70 65 63 74 2d 72 65 70 6c 79 3f 0a S expect-reply?.
49c0: 20 20 20 20 65 6e 64 2d 63 6f 64 65 7c 20 3b 0a end-code| ;.
49d0: 0a 69 6e 20 6e 65 74 32 6f 20 3a 20 63 6f 6e 6e .in net2o : conn
49e0: 65 63 74 20 28 20 75 63 6f 64 65 20 75 64 61 74 ect ( ucode udat
49f0: 61 20 2d 2d 20 29 20 20 72 65 71 73 69 7a 65 21 a -- ) reqsize!
4a00: 20 67 65 6e 2d 72 65 71 75 65 73 74 20 3b 0a 0a gen-request ;..
4a10: 70 72 65 76 69 6f 75 73 0a 0a 30 20 5b 49 46 5d previous..0 [IF]
4a20: 0a 4c 6f 63 61 6c 20 56 61 72 69 61 62 6c 65 73 .Local Variables
4a30: 3a 0a 66 6f 72 74 68 2d 6c 6f 63 61 6c 2d 77 6f :.forth-local-wo
4a40: 72 64 73 3a 0a 20 20 20 20 28 0a 20 20 20 20 20 rds:. (.
4a50: 28 28 22 6e 65 74 32 6f 3a 22 20 22 2b 6e 65 74 (("net2o:" "+net
4a60: 32 6f 3a 22 29 20 64 65 66 69 6e 69 74 69 6f 6e 2o:") definition
4a70: 2d 73 74 61 72 74 65 72 20 28 66 6f 6e 74 2d 6c -starter (font-l
4a80: 6f 63 6b 2d 6b 65 79 77 6f 72 64 2d 66 61 63 65 ock-keyword-face
4a90: 20 2e 20 31 29 0a 20 20 20 20 20 20 22 5b 20 5c . 1). "[ \
4aa0: 74 5c 6e 5d 22 20 74 20 6e 61 6d 65 20 28 66 6f t\n]" t name (fo
4ab0: 6e 74 2d 6c 6f 63 6b 2d 66 75 6e 63 74 69 6f 6e nt-lock-function
4ac0: 2d 6e 61 6d 65 2d 66 61 63 65 20 2e 20 33 29 29 -name-face . 3))
4ad0: 0a 20 20 20 20 20 28 22 5b 61 2d 7a 5c 2d 30 2d . ("[a-z\-0-
4ae0: 39 5d 2b 28 22 20 69 6d 6d 65 64 69 61 74 65 20 9]+(" immediate
4af0: 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 63 6f 6d 6d 65 (font-lock-comme
4b00: 6e 74 2d 66 61 63 65 20 2e 20 31 29 0a 20 20 20 nt-face . 1).
4b10: 20 20 20 22 29 22 20 6e 69 6c 20 63 6f 6d 6d 65 ")" nil comme
4b20: 6e 74 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 63 6f nt (font-lock-co
4b30: 6d 6d 65 6e 74 2d 66 61 63 65 20 2e 20 31 29 29 mment-face . 1))
4b40: 0a 20 20 20 20 29 0a 66 6f 72 74 68 2d 6c 6f 63 . ).forth-loc
4b50: 61 6c 2d 69 6e 64 65 6e 74 2d 77 6f 72 64 73 3a al-indent-words:
4b60: 0a 20 20 20 20 28 0a 20 20 20 20 20 28 28 22 6e . (. (("n
4b70: 65 74 32 6f 3a 22 20 22 2b 6e 65 74 32 6f 3a 22 et2o:" "+net2o:"
4b80: 29 20 28 30 20 2e 20 32 29 20 28 30 20 2e 20 32 ) (0 . 2) (0 . 2
4b90: 29 20 6e 6f 6e 2d 69 6d 6d 65 64 69 61 74 65 29 ) non-immediate)
4ba0: 0a 20 20 20 20 20 28 28 22 5b 3a 22 29 20 28 30 . (("[:") (0
4bb0: 20 2e 20 31 29 20 28 30 20 2e 20 31 29 20 69 6d . 1) (0 . 1) im
4bc0: 6d 65 64 69 61 74 65 29 0a 20 20 20 20 20 28 28 mediate). ((
4bd0: 22 3b 5d 22 29 20 28 2d 31 20 2e 20 30 29 20 28 ";]") (-1 . 0) (
4be0: 30 20 2e 20 2d 31 29 20 69 6d 6d 65 64 69 61 74 0 . -1) immediat
4bf0: 65 29 0a 20 20 20 20 29 0a 45 6e 64 3a 0a 5b 54 e). ).End:.[T
4c00: 48 45 4e 5d 0a HEN].