From 90b134186b9b48701645bfd8c7b221120960a8d8 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Fri, 9 Jan 2026 22:54:03 +0700 Subject: [PATCH] dynamic fragmentation --- bitchat/Services/BLE/BLEService.swift | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/bitchat/Services/BLE/BLEService.swift b/bitchat/Services/BLE/BLEService.swift index 44cee0be..384fb450 100644 --- a/bitchat/Services/BLE/BLEService.swift +++ b/bitchat/Services/BLE/BLEService.swift @@ -17,7 +17,7 @@ final class BLEService: NSObject { // MARK: - Constants #if DEBUG - static let serviceUUID = CBUUID(string: "F47B5E2D-4A9E-4C5A-9B3F-8E1D2C3A4B5A") // testnet + static let serviceUUID = CBUUID(string: "F47B5E2D-4A9E-4C5A-9B3F-8E1D2C3A4B5C") // testnet #else static let serviceUUID = CBUUID(string: "F47B5E2D-4A9E-4C5A-9B3F-8E1D2C3A4B5C") // mainnet #endif @@ -3015,7 +3015,21 @@ extension BLEService { } // Fragment the unpadded frame; each fragment will be encoded independently let fragmentID = Data((0..<8).map { _ in UInt8.random(in: 0...255) }) - let chunk = context.maxChunk ?? defaultFragmentSize + // Dynamic Fragment Sizing (Source Routing v2) + // See docs/SOURCE_ROUTING.md Section 5.1 + var fragmentVersion: UInt8 = 1 + var calculatedChunk = defaultFragmentSize + + if let route = packet.route, !route.isEmpty { + fragmentVersion = 2 + // RouteSize = 1 + (Hops * 8) + let routeSize = 1 + (route.count * 8) + // Overhead = HeaderV2(16) + SenderID(8) + RecipientID(8) + RouteSize + FragmentHeader(13) + PaddingBuffer(16) + let overhead = 16 + 8 + 8 + routeSize + 13 + 16 + calculatedChunk = 512 - overhead + } + + let chunk = context.maxChunk ?? calculatedChunk let safeChunk = max(64, chunk) let fragments = stride(from: 0, to: fullData.count, by: safeChunk).map { offset in Data(fullData[offset..