Skip to content

Three-way protocol parity matrix — stock vs emulebb-mfc vs emulebb-rust

Current policy note (2026-07-08): this matrix is retained as evidence. The active product target is stock eMule parity; emulebb-mfc remains a frozen witness, not the forward parity oracle.

Date: 2026-07-05. References: STOCK = community eMule 0.72.0 (analysis/community-0.72/srchybrid), MFC = emulebb-mfc fork (workspaces/workspace/app/emulebb-main/srchybrid, 0.72.0), RUST = repos/emulebb-rust. Method: 4 specialized sub-agents, one per protocol surface, byte/bit-level. Companion to RUST-REF-003 (rust↔stock fixes).

Headline

Stock ≡ MFC byte-for-byte on the wire almost everywhere; the fork's divergences are mostly off-wire. Rust is a faithful wire port of both, is cleaner than MFC on the fork's one big wire fingerprint (CT_MOD_VERSION), and follows MFC only on operator-directed / MFC-behavioral deviations.

MFC-vs-stock wire divergences, and where rust sits

# Divergence STOCK MFC RUST = Disposition
1 Hello CT_MOD_VERSION none (6 tags) "eMuleBB 0.7.3" always (7 tags) STOCK rust cleaner than MFC (mod tag off by default)
2 MISCOPTIONS1 SX1 nibble 4 0 MFC operator F2
3 Preview bit (MISC1 + ET_FEATURES) 1 0 (ffmpeg-gated) MFC registered preview omission
4 Download block-request reserve cap 9 +512K→12, +1M→18 MFC operator B2
5 Upload compression exclusion set 8 exts 49 exts (+ unconditional avi) MFC operator B1
6 Login crypt-flag gating per-prefs unconditional suppress REQUEST/REQUIRE on obfuscated socket MFC RUST-REF-003 C4 (kept)
7 Offer-file selection/ordering single-factor priority multi-factor rank + republish MFC per-entry wire identical

MFC-vs-stock OFF-WIRE divergences (no packet change)

Kad flood-accounting bug fix (PacketTracking.cpp ==!=), malformed-count hardening (RequireSaneKadCount), VPN startup bind guards, FastKad node-reachability tracking, memory-safety (unique_ptr, GetTickCount64), diag hooks (ed2k_packet_v1 / kad_udp), and tuning constants (MAX_SOURCES_FILE_SOFT 750→1000, UPLOAD_CLIENT_MAXDATARATE 25KB→8MB, CLIENTBANTIME 2h→4h, etc.).

Where rust lands (summary)

  • = STOCK (cleaner than MFC): no CT_MOD_VERSION; all RUST-REF-003 fixes.
  • = both STOCK and MFC: the vast majority — full hello structure + MISCOPTIONS2 (incl. captcha) + version bytes; every transfer packet (REQUESTPARTS/_I64, fragmentation, queue-ranking, accept-upload, hashset, AICH); all Kad UDP (version 0x0a, HELLO tags/gating, >200-byte 0xE5 pack gate, bootstrap/req/res/ search/publish, firewalled2/firewallUDP, obfuscation framing + reserved-marker set + key derivations); server login/offer/search structure.
  • = MFC (not stock): only rows 1-7 above.

Follow-up

  • Verify rust's Kad flood tracker matches MFC's corrected per-opcode accounting (stock had a genuine == bug MFC fixed to !=) rather than stock's buggy behavior. Anti-abuse correctness, not a wire fingerprint.
  • Cosmetic (rust-only, not an MFC divergence): rust hardcodes the login/hello nick to "eMule" rather than a configurable value; structure identical.