mirror of
https://github.com/jmcorgan/fips.git
synced 2026-08-09 00:04:54 +00:00
Wire format diagrams: - Add 24 SVG diagrams covering every FMP and FSP wire format: common prefix, established frame headers, Noise IK handshake messages, handshake flow, TreeAnnounce, AncestryEntry, FilterAnnounce, LookupRequest/Response, SessionDatagram, Disconnect, SenderReport, ReceiverReport, FSP complete message, SessionSetup/Ack/Msg3, PathMtuNotification, CoordsRequired, PathBroken, and MtuExceeded - Replace ASCII art in fips-wire-formats.md with SVG references - Apply text edits to fips-mesh-layer.md, fips-mesh-operation.md, fips-transport-layer.md, and fips-ipv6-adapter.md Spanning tree dynamics: - Add 12 topology SVG diagrams: node join (overview + 3-panel steps), three-node convergence (4-panel), link addition with depth labels, link removal, partition formation, and 6 real-world example diagrams (office, mixed-link, two-site WAN topologies) - Rewrite all code blocks to narrative prose with diagram references - Add inline prior art attributions distinguishing Yggdrasil-derived concepts from FIPS-novel contributions - Add 3 new references (De Couto ETX, IEEE 802.1D, RFC 2328 OSPF) and Prior Art summary - Remove outdated sections: indirect partition note, integration test gaps, DHT-based lookup reference - Change "must elect a new root" to "must rediscover its new root" Spanning tree design review (fips-spanning-tree.md): - Rename "Root Election" to "Root Discovery" across docs - Add "What Is a Spanning Tree?" introductory section - Add parent selection intro explaining self-organization role - Fix tree distance example: 4 hops, not 2 - Clarify timestamp field as advisory only - Remove unimplemented ROOT_TIMEOUT and TREE_ENTRY_TTL from timing parameters and implementation status tables Bloom filter design review (fips-bloom-filters.md): - Add "What Is a Bloom Filter?" intro section - Rewrite Purpose section to frame filters as routing path identification - Correct FPR analysis (old values were 3-50x overstated) - Add Filter Occupancy Model based on network size and tree position - Fix filter expiration to describe actual MMP-based cleanup - Combine Scale Considerations with Size Classes after Wire Format - Fix stale FPR values in src/bloom/mod.rs comments Session layer review (fips-session-layer.md): - Add inline prior art attributions: Noise Protocol Framework, WireGuard, DTLS (RFC 6347), IKEv2 (RFC 7296), RFC 1191 PMTUD, Yggdrasil, NIP-44 - Replace warmup state machine ASCII art with SVG diagram - Convert CoordsWarmup wire format code block to prose - Add External References section with full citations Level 5 implementation doc cleanup: - Delete fips-software-architecture.md (redundant with protocol layer docs) - Delete fips-state-machines.md (Rust tutorial, not protocol design) - Add fipsctl command reference to README.md - Update cross-references in fips-intro.md, docs/design/README.md, fips-transport-layer.md, fips-configuration.md Fixes: - Correct fd::/8 to fd00::/8 in fips-session-layer.md, fips-identity-derivation.svg, and fips-node-architecture.svg - Fix config example MTU: 1197 → 1472 in fips-configuration.md File organization: - Move all SVG diagrams into docs/design/diagrams/ subdirectory - Update all diagram references to use new paths
61 lines
1.8 KiB
Rust
61 lines
1.8 KiB
Rust
//! Bloom Filter Implementation
|
|
//!
|
|
//! 1KB Bloom filters for reachability in FIPS routing. Each node
|
|
//! maintains filters that summarize which destinations are reachable
|
|
//! through each peer, enabling efficient routing decisions without
|
|
//! global network knowledge.
|
|
//!
|
|
//! ## v1 Parameters
|
|
//!
|
|
//! - Size: 1 KB (8,192 bits) - sized for actual ~400-800 entry occupancy
|
|
//! - Hash functions: k=5 - optimal at ~1,200 entries, good for 800-1,600
|
|
//! - Bandwidth: 1 KB/announce (75% reduction from original 4KB design)
|
|
//!
|
|
//! These parameters are right-sized for typical network occupancy of
|
|
//! ~250-800 entries per node.
|
|
|
|
mod filter;
|
|
mod state;
|
|
|
|
use thiserror::Error;
|
|
|
|
pub use filter::BloomFilter;
|
|
pub use state::BloomState;
|
|
|
|
/// Default filter size in bits (1KB = 8,192 bits).
|
|
///
|
|
/// Sized for ~800-1,600 entries. FPR ~0.05% at 400 entries, ~0.9% at 800.
|
|
/// This is v1 protocol default (size_class=1).
|
|
pub const DEFAULT_FILTER_SIZE_BITS: usize = 8192;
|
|
|
|
/// Default filter size in bytes (1KB).
|
|
pub const DEFAULT_FILTER_SIZE_BYTES: usize = DEFAULT_FILTER_SIZE_BITS / 8;
|
|
|
|
/// Default number of hash functions.
|
|
///
|
|
/// k=5 is optimal at ~1,200 entries and a good compromise for 800-1,600.
|
|
/// At 400 entries: FPR ~0.05%. At 800 entries: FPR ~0.9%.
|
|
pub const DEFAULT_HASH_COUNT: u8 = 5;
|
|
|
|
/// Size class for v1 protocol (1 KB filters).
|
|
pub const V1_SIZE_CLASS: u8 = 1;
|
|
|
|
/// Filter sizes by size_class: bytes = 512 << size_class
|
|
pub const SIZE_CLASS_BYTES: [usize; 4] = [512, 1024, 2048, 4096];
|
|
|
|
/// Errors related to Bloom filter operations.
|
|
#[derive(Debug, Error)]
|
|
pub enum BloomError {
|
|
#[error("invalid filter size: expected {expected} bits, got {got}")]
|
|
InvalidSize { expected: usize, got: usize },
|
|
|
|
#[error("filter size must be a multiple of 8, got {0}")]
|
|
SizeNotByteAligned(usize),
|
|
|
|
#[error("hash count must be positive")]
|
|
ZeroHashCount,
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests;
|