1pub const MTU: usize = 500;
10
11pub const TRUNCATED_HASHLENGTH: usize = 128;
13
14pub const HEADER_MINSIZE: usize = 2 + 1 + (TRUNCATED_HASHLENGTH / 8);
16
17pub const HEADER_MAXSIZE: usize = 2 + 1 + (TRUNCATED_HASHLENGTH / 8) * 2;
19
20pub const IFAC_MIN_SIZE: usize = 1;
22
23pub const MDU: usize = MTU - HEADER_MAXSIZE - IFAC_MIN_SIZE;
25
26pub const KEYSIZE: usize = 512;
30
31pub const RATCHETSIZE: usize = 256;
33
34pub const TOKEN_OVERHEAD: usize = 48;
36
37pub const AES128_BLOCKSIZE: usize = 16;
39
40pub const HASHLENGTH: usize = 256;
42
43pub const SIGLENGTH: usize = KEYSIZE;
45
46pub const NAME_HASH_LENGTH: usize = 80;
48
49pub const DERIVED_KEY_LENGTH: usize = 64;
51
52pub const PACKET_TYPE_DATA: u8 = 0x00;
56pub const PACKET_TYPE_ANNOUNCE: u8 = 0x01;
57pub const PACKET_TYPE_LINKREQUEST: u8 = 0x02;
58pub const PACKET_TYPE_PROOF: u8 = 0x03;
59
60pub const HEADER_1: u8 = 0x00;
62pub const HEADER_2: u8 = 0x01;
63
64pub const CONTEXT_NONE: u8 = 0x00;
66pub const CONTEXT_RESOURCE: u8 = 0x01;
67pub const CONTEXT_RESOURCE_ADV: u8 = 0x02;
68pub const CONTEXT_RESOURCE_REQ: u8 = 0x03;
69pub const CONTEXT_RESOURCE_HMU: u8 = 0x04;
70pub const CONTEXT_RESOURCE_PRF: u8 = 0x05;
71pub const CONTEXT_RESOURCE_ICL: u8 = 0x06;
72pub const CONTEXT_RESOURCE_RCL: u8 = 0x07;
73pub const CONTEXT_CACHE_REQUEST: u8 = 0x08;
74pub const CONTEXT_REQUEST: u8 = 0x09;
75pub const CONTEXT_RESPONSE: u8 = 0x0A;
76pub const CONTEXT_PATH_RESPONSE: u8 = 0x0B;
77pub const CONTEXT_COMMAND: u8 = 0x0C;
78pub const CONTEXT_COMMAND_STATUS: u8 = 0x0D;
79pub const CONTEXT_CHANNEL: u8 = 0x0E;
80pub const CONTEXT_KEEPALIVE: u8 = 0xFA;
81pub const CONTEXT_LINKIDENTIFY: u8 = 0xFB;
82pub const CONTEXT_LINKCLOSE: u8 = 0xFC;
83pub const CONTEXT_LINKPROOF: u8 = 0xFD;
84pub const CONTEXT_LRRTT: u8 = 0xFE;
85pub const CONTEXT_LRPROOF: u8 = 0xFF;
86
87pub const FLAG_SET: u8 = 0x01;
89pub const FLAG_UNSET: u8 = 0x00;
90
91pub const ENCRYPTED_MDU: usize = {
93 let numerator = MDU - TOKEN_OVERHEAD - KEYSIZE / 16;
94 (numerator / AES128_BLOCKSIZE) * AES128_BLOCKSIZE - 1
95};
96
97pub const PLAIN_MDU: usize = MDU;
99
100pub const EXPL_LENGTH: usize = HASHLENGTH / 8 + SIGLENGTH / 8;
102
103pub const IMPL_LENGTH: usize = SIGLENGTH / 8;
105
106pub const RECEIPT_FAILED: u8 = 0x00;
108pub const RECEIPT_SENT: u8 = 0x01;
109pub const RECEIPT_DELIVERED: u8 = 0x02;
110pub const RECEIPT_CULLED: u8 = 0xFF;
111
112pub const DESTINATION_SINGLE: u8 = 0x00;
116pub const DESTINATION_GROUP: u8 = 0x01;
117pub const DESTINATION_PLAIN: u8 = 0x02;
118pub const DESTINATION_LINK: u8 = 0x03;
119
120pub const DESTINATION_IN: u8 = 0x11;
122pub const DESTINATION_OUT: u8 = 0x12;
123
124pub const TRANSPORT_BROADCAST: u8 = 0x00;
128pub const TRANSPORT_TRANSPORT: u8 = 0x01;
129pub const TRANSPORT_RELAY: u8 = 0x02;
130pub const TRANSPORT_TUNNEL: u8 = 0x03;
131
132pub const PATHFINDER_M: u8 = 128;
134
135pub const PATHFINDER_R: u8 = 1;
139
140pub const PATHFINDER_G: f64 = 5.0;
142
143pub const PATHFINDER_RW: f64 = 0.5;
145
146pub const PATHFINDER_E: f64 = 604800.0;
148
149pub const AP_PATH_TIME: f64 = 86400.0;
153
154pub const ROAMING_PATH_TIME: f64 = 21600.0;
156
157pub const ANNOUNCE_CAP: f64 = 0.02;
161
162pub const MAX_QUEUED_ANNOUNCES: usize = 16384;
164
165pub const QUEUED_ANNOUNCE_LIFE: f64 = 86400.0;
167
168pub const ANNOUNCE_TABLE_TTL: f64 = 30.0;
170
171pub const ANNOUNCE_TABLE_MAX_BYTES: usize = 4 * 1024 * 1024;
173
174pub const LOCAL_REBROADCASTS_MAX: u8 = 2;
178
179pub const MAX_RANDOM_BLOBS: usize = 64;
181
182pub const MAX_RATE_TIMESTAMPS: usize = 16;
184
185pub const HASHLIST_MAXSIZE: usize = 250_000;
187
188pub const ANNOUNCE_SIG_CACHE_MAXSIZE: usize = 2_000;
190
191pub const ANNOUNCE_SIG_CACHE_TTL: f64 = 600.0;
193
194pub const REVERSE_TIMEOUT: f64 = 480.0;
198
199pub const DESTINATION_TIMEOUT: f64 = 604800.0;
201
202pub const LINK_STALE_TIME: f64 = 720.0;
204
205pub const LINK_TIMEOUT: f64 = 900.0;
207
208pub const LINK_ESTABLISHMENT_TIMEOUT_PER_HOP: f64 = 6.0;
210
211pub const PATH_REQUEST_TIMEOUT: f64 = 15.0;
215
216pub const PATH_REQUEST_GRACE: f64 = 0.4;
218
219pub const PATH_REQUEST_RG: f64 = 1.5;
221
222pub const PATH_REQUEST_MI: f64 = 20.0;
224
225pub const MAX_PR_TAGS: usize = 32000;
227
228pub const ANNOUNCES_CHECK_INTERVAL: f64 = 1.0;
232
233pub const TABLES_CULL_INTERVAL: f64 = 5.0;
235
236pub const LINKS_CHECK_INTERVAL: f64 = 1.0;
238
239pub const IC_NEW_TIME: f64 = 7200.0;
243pub const IC_BURST_FREQ_NEW: f64 = 3.5;
245pub const IC_BURST_FREQ: f64 = 12.0;
247pub const IC_BURST_HOLD: f64 = 60.0;
249pub const IC_BURST_PENALTY: f64 = 300.0;
251pub const IC_HELD_RELEASE_INTERVAL: f64 = 30.0;
253pub const IC_MAX_HELD_ANNOUNCES: usize = 256;
255
256pub const MODE_FULL: u8 = 0x01;
259pub const MODE_POINT_TO_POINT: u8 = 0x02;
260pub const MODE_ACCESS_POINT: u8 = 0x03;
261pub const MODE_ROAMING: u8 = 0x04;
262pub const MODE_BOUNDARY: u8 = 0x05;
263pub const MODE_GATEWAY: u8 = 0x06;
264
265pub const DISCOVER_PATHS_FOR: [u8; 3] = [MODE_ACCESS_POINT, MODE_GATEWAY, MODE_ROAMING];
268
269pub const DISCOVERY_PATH_REQUEST_TIMEOUT: f64 = 15.0;
271
272pub const STATE_UNKNOWN: u8 = 0x00;
275pub const STATE_UNRESPONSIVE: u8 = 0x01;
276pub const STATE_RESPONSIVE: u8 = 0x02;
277
278pub const LINK_ECPUBSIZE: usize = 64;
282
283pub const LINK_KEYSIZE: usize = 32;
285
286pub const LINK_MTU_SIZE: usize = 3;
288
289pub const LINK_KEEPALIVE_MAX: f64 = 360.0;
291
292pub const LINK_KEEPALIVE_MIN: f64 = 5.0;
294
295pub const LINK_KEEPALIVE_MAX_RTT: f64 = 1.75;
297
298pub const LINK_KEEPALIVE_TIMEOUT_FACTOR: f64 = 4.0;
300
301pub const LINK_STALE_GRACE: f64 = 5.0;
303
304pub const LINK_STALE_FACTOR: f64 = 2.0;
306
307pub const LINK_TRAFFIC_TIMEOUT_FACTOR: f64 = 6.0;
309
310pub const LINK_MDU: usize = {
312 let numerator = MTU - IFAC_MIN_SIZE - HEADER_MINSIZE - TOKEN_OVERHEAD;
313 (numerator / AES128_BLOCKSIZE) * AES128_BLOCKSIZE - 1
314};
315
316pub const LINK_MTU_BYTEMASK: u32 = 0x1FFFFF;
318
319pub const LINK_MODE_BYTEMASK: u8 = 0xE0;
321
322pub const CHANNEL_WINDOW: u16 = 2;
326
327pub const CHANNEL_WINDOW_MIN: u16 = 2;
329
330pub const CHANNEL_WINDOW_MIN_LIMIT_SLOW: u16 = 2;
332
333pub const CHANNEL_WINDOW_MIN_LIMIT_MEDIUM: u16 = 5;
335
336pub const CHANNEL_WINDOW_MIN_LIMIT_FAST: u16 = 16;
338
339pub const CHANNEL_WINDOW_MAX_SLOW: u16 = 5;
341
342pub const CHANNEL_WINDOW_MAX_MEDIUM: u16 = 12;
344
345pub const CHANNEL_WINDOW_MAX_FAST: u16 = 48;
347
348pub const CHANNEL_WINDOW_FLEXIBILITY: u16 = 4;
350
351pub const CHANNEL_SEQ_MAX: u16 = 0xFFFF;
353
354pub const CHANNEL_SEQ_MODULUS: u32 = 0x10000;
356
357pub const CHANNEL_MAX_TRIES: u8 = 5;
359
360pub const CHANNEL_RTT_FAST: f64 = 0.18;
362
363pub const CHANNEL_RTT_MEDIUM: f64 = 0.75;
365
366pub const CHANNEL_RTT_SLOW: f64 = 1.45;
368
369pub const CHANNEL_FAST_RATE_THRESHOLD: u16 = 10;
371
372pub const CHANNEL_ENVELOPE_OVERHEAD: usize = 6;
374
375pub const STREAM_DATA_MSGTYPE: u16 = 0xFF00;
379
380pub const STREAM_ID_MAX: u16 = 0x3FFF;
382
383pub const STREAM_DATA_OVERHEAD: usize = 2 + CHANNEL_ENVELOPE_OVERHEAD;
385
386pub const RESOURCE_WINDOW: usize = 4;
390
391pub const RESOURCE_WINDOW_MIN: usize = 2;
393
394pub const RESOURCE_WINDOW_MAX_SLOW: usize = 10;
396
397pub const RESOURCE_WINDOW_MAX_VERY_SLOW: usize = 4;
399
400pub const RESOURCE_WINDOW_MAX_FAST: usize = 75;
402
403pub const RESOURCE_WINDOW_MAX: usize = RESOURCE_WINDOW_MAX_FAST;
405
406pub const RESOURCE_WINDOW_FLEXIBILITY: usize = 4;
408
409pub const RESOURCE_FAST_RATE_THRESHOLD: usize = RESOURCE_WINDOW_MAX_SLOW - RESOURCE_WINDOW - 2;
412
413pub const RESOURCE_VERY_SLOW_RATE_THRESHOLD: usize = 2;
415
416pub const RESOURCE_RATE_FAST: f64 = (50 * 1000) as f64 / 8.0;
418
419pub const RESOURCE_RATE_VERY_SLOW: f64 = (2 * 1000) as f64 / 8.0;
421
422pub const RESOURCE_MAPHASH_LEN: usize = 4;
424
425pub const RESOURCE_SDU: usize = MDU;
427
428pub const RESOURCE_RANDOM_HASH_SIZE: usize = 4;
430
431pub const RESOURCE_MAX_EFFICIENT_SIZE: usize = 1024 * 1024 - 1;
433
434pub const RESOURCE_METADATA_MAX_SIZE: usize = 16 * 1024 * 1024 - 1;
436
437pub const RESOURCE_AUTO_COMPRESS_MAX_SIZE: usize = 64 * 1024 * 1024;
439
440pub const RESOURCE_PART_TIMEOUT_FACTOR: f64 = 4.0;
442
443pub const RESOURCE_PART_TIMEOUT_FACTOR_AFTER_RTT: f64 = 2.0;
445
446pub const RESOURCE_PROOF_TIMEOUT_FACTOR: f64 = 3.0;
448
449pub const RESOURCE_MAX_RETRIES: usize = 16;
451
452pub const RESOURCE_MAX_ADV_RETRIES: usize = 4;
454
455pub const RESOURCE_SENDER_GRACE_TIME: f64 = 10.0;
457
458pub const RESOURCE_PROCESSING_GRACE: f64 = 1.0;
460
461pub const RESOURCE_RETRY_GRACE_TIME: f64 = 0.25;
463
464pub const RESOURCE_PER_RETRY_DELAY: f64 = 0.5;
466
467pub const RESOURCE_WATCHDOG_MAX_SLEEP: f64 = 1.0;
469
470pub const RESOURCE_RESPONSE_MAX_GRACE_TIME: f64 = 10.0;
472
473pub const RESOURCE_ADVERTISEMENT_OVERHEAD: usize = 134;
475
476pub const RESOURCE_HASHMAP_MAX_LEN: usize =
479 (LINK_MDU - RESOURCE_ADVERTISEMENT_OVERHEAD) / RESOURCE_MAPHASH_LEN;
480
481pub const RESOURCE_COLLISION_GUARD_SIZE: usize = 2 * RESOURCE_WINDOW_MAX + RESOURCE_HASHMAP_MAX_LEN;
483
484pub const RESOURCE_HASHMAP_IS_NOT_EXHAUSTED: u8 = 0x00;
486
487pub const RESOURCE_HASHMAP_IS_EXHAUSTED: u8 = 0xFF;
489
490#[cfg(test)]
491mod tests {
492 use super::*;
493
494 #[test]
495 fn test_derived_constants() {
496 assert_eq!(MTU, 500);
498
499 assert_eq!(HEADER_MINSIZE, 19);
501
502 assert_eq!(HEADER_MAXSIZE, 35);
504
505 assert_eq!(MDU, 464);
507
508 assert_eq!(ENCRYPTED_MDU, 383);
510
511 assert_eq!(PLAIN_MDU, 464);
513
514 assert_eq!(EXPL_LENGTH, 96);
516
517 assert_eq!(IMPL_LENGTH, 64);
519
520 assert_eq!(NAME_HASH_LENGTH / 8, 10);
522
523 assert_eq!(KEYSIZE / 8, 64);
525
526 assert_eq!(SIGLENGTH / 8, 64);
528
529 assert_eq!(TRUNCATED_HASHLENGTH / 8, 16);
531 }
532
533 #[test]
534 fn test_link_constants() {
535 assert_eq!(LINK_ECPUBSIZE, 64);
536 assert_eq!(LINK_MTU_SIZE, 3);
537 assert_eq!(LINK_MDU, 431);
539 assert_eq!(CHANNEL_ENVELOPE_OVERHEAD, 6);
540 assert_eq!(STREAM_DATA_OVERHEAD, 8);
541 assert_eq!(STREAM_ID_MAX, 0x3FFF);
542 }
543
544 #[test]
545 fn test_transport_constants() {
546 assert_eq!(PATHFINDER_E, 60.0 * 60.0 * 24.0 * 7.0);
548
549 assert_eq!(AP_PATH_TIME, 60.0 * 60.0 * 24.0);
551
552 assert_eq!(ROAMING_PATH_TIME, 60.0 * 60.0 * 6.0);
554
555 assert_eq!(LINK_STALE_TIME, 720.0);
557
558 assert_eq!(LINK_TIMEOUT, LINK_STALE_TIME * 1.25);
560
561 assert_eq!(REVERSE_TIMEOUT, 8.0 * 60.0);
563
564 assert_eq!(DESTINATION_TIMEOUT, 60.0 * 60.0 * 24.0 * 7.0);
566 }
567
568 #[test]
569 fn test_resource_constants() {
570 assert_eq!(RESOURCE_SDU, 464);
572 assert_eq!(RESOURCE_SDU, MDU);
573
574 assert_eq!(RESOURCE_FAST_RATE_THRESHOLD, 4);
576
577 assert_eq!(RESOURCE_RATE_FAST, 6250.0);
579
580 assert_eq!(RESOURCE_RATE_VERY_SLOW, 250.0);
582
583 assert_eq!(RESOURCE_HASHMAP_MAX_LEN, 74);
585
586 assert_eq!(RESOURCE_COLLISION_GUARD_SIZE, 224);
588
589 assert_eq!(RESOURCE_WINDOW, 4);
591 assert_eq!(RESOURCE_WINDOW_MIN, 2);
592 assert_eq!(RESOURCE_WINDOW_MAX_SLOW, 10);
593 assert_eq!(RESOURCE_WINDOW_MAX_VERY_SLOW, 4);
594 assert_eq!(RESOURCE_WINDOW_MAX_FAST, 75);
595 assert_eq!(RESOURCE_WINDOW_MAX, 75);
596 assert_eq!(RESOURCE_WINDOW_FLEXIBILITY, 4);
597 }
598}