Moontalk server and client (provided by many parties)
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

124 wiersze
3.5KB

  1. \ Denial of service protection.
  2. \ TODO: Use hash table instead?
  3. require util.4th
  4. [UNDEFINED] MAX_CONNECTIONS [IF] 32 constant MAX_CONNECTIONS [THEN]
  5. 10 constant DOS_UPDATE_INTERVAL
  6. 1024 constant DOS_BYTES_PER_INTERVAL
  7. 10 constant DOS_LINES_PER_INTERVAL
  8. 3 constant DOS_MAX_CONNECTIONS
  9. MAX_CONNECTIONS constant DOS_MAX_MAPPINGS
  10. \ TODO: is 0 a valid circuit id?
  11. \ TODO: if not, then we could use the circuit id instead of dos.set
  12. 0
  13. cell +field dos.set
  14. cell +field dos.circuit-id
  15. cell +field dos.handled
  16. cell +field dos.connections
  17. cell +field dos.total-bytes
  18. cell +field dos.total-lines
  19. cell +field dos.bytes
  20. cell +field dos.lines
  21. constant /DOS
  22. /DOS DOS_MAX_MAPPINGS * constant DOS_ARRAY_SIZE
  23. create dos DOS_ARRAY_SIZE alloterase
  24. \ Lookup table: connection index -> dos stats
  25. create doslt DOS_MAX_MAPPINGS cells alloterase
  26. : (translate) ( index-n -- dos-addr )
  27. /DOS * dos + ;
  28. : (init-dos) ( free-addr circuit-id-n -- dos-addr )
  29. over dos.circuit-id !
  30. true over dos.set ! ;
  31. : (find) ( circuit-id-n -- dos-addr )
  32. 0 swap dos DOS_ARRAY_SIZE + dos DO ( -- free-addr circuit-id-n )
  33. I dos.set @ IF
  34. dup I dos.circuit-id @ = IF
  35. 2drop I UNLOOP EXIT
  36. THEN
  37. ELSE
  38. over 0= IF
  39. nip I swap
  40. THEN
  41. THEN
  42. /DOS +LOOP
  43. (init-dos) ;
  44. : (lttranslate) ( connection-index-n -- lookup-addr )
  45. cells doslt + ;
  46. : (lookup) ( connection-index-n -- dos-addr )
  47. (lttranslate) @ ;
  48. : (mod-connections) ( n dos-addr -- ) dos.connections +! ;
  49. : (inc-connections) ( dos-addr -- ) 1 swap (mod-connections) ;
  50. : (dec-connections) ( dos-addr -- ) -1 swap (mod-connections) ;
  51. : dos-add-connection ( circuit-id-n connection-index-n -- )
  52. (lttranslate) dup @ 0= IF
  53. swap (find) tuck (inc-connections) !
  54. ELSE
  55. 2drop EXIT
  56. THEN ;
  57. : dos-remove-connection ( connection-index-n -- )
  58. \ erase if last connection
  59. (lttranslate) dup 0<> IF
  60. dup @ >r 0 swap ! r>
  61. dup (dec-connections)
  62. dup dos.connections @ 0= IF
  63. /DOS erase
  64. ELSE
  65. drop
  66. THEN
  67. ELSE
  68. drop
  69. THEN ;
  70. : dos-add-bytes ( bytes-n connection-index-n -- )
  71. (lookup) dos.bytes +! ;
  72. : dos-add-lines ( lines-n connection-index-n -- )
  73. (lookup) dos.lines +! ;
  74. : (update) ( dos-addr -- )
  75. dup dos.bytes @ over dos.total-bytes +!
  76. dup dos.lines @ over dos.total-lines +!
  77. 0 over dos.bytes !
  78. 0 over dos.lines !
  79. drop ;
  80. : dos-update ( -- )
  81. \ add time interval bytes and lines to total and set to 0
  82. dos DOS_ARRAY_SIZE + dos DO
  83. I dos.set @ IF
  84. I (update)
  85. THEN
  86. /DOS +LOOP ;
  87. : (check-bytes) ( dos-addr -- flag ) dos.bytes @ DOS_BYTES_PER_INTERVAL > ;
  88. : (check-lines) ( dos-addr -- flag ) dos.lines @ DOS_LINES_PER_INTERVAL > ;
  89. : (check-connections) ( dos-addr -- flag ) dos.connections @ DOS_MAX_CONNECTIONS > ;
  90. : dos-handled! ( flag connection-index-n -- )
  91. (lttranslate) @ dos.handled ! ;
  92. : dos-handled? ( connection-index-n -- flag )
  93. (lttranslate) @ dos.handled @ ;
  94. : dos? ( connection-index-n -- flag )
  95. (lttranslate) @
  96. dup (check-bytes) over (check-lines)
  97. rot (check-connections) or or ;
  98. : (.dos-info) ( dos-addr -- )
  99. dup ." CircuitID: " dos.circuit-id @ . cr
  100. dup ." Connections: " dos.connections @ . cr
  101. dup ." Total bytes: " dos.total-bytes @ . cr
  102. dup ." Total lines: " dos.total-lines @ . cr
  103. dup ." Bytes: " dos.bytes @ . cr
  104. dup ." Lines: " dos.lines @ . cr
  105. drop ;
  106. : .dos-info ( connection-index-u -- )
  107. (lttranslate) @ (.dos-info) ;
  108. : .dos ( -- )
  109. dos DOS_ARRAY_SIZE + dos DO
  110. I dos.set @ IF
  111. cr I (.dos-info)
  112. THEN
  113. /DOS +LOOP ;