mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-24 23:45:18 +00:00
dynamic fragmentation
This commit is contained in:
@@ -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..<min(offset + safeChunk, fullData.count)])
|
||||
@@ -3074,6 +3088,7 @@ extension BLEService {
|
||||
payload: payload,
|
||||
signature: nil,
|
||||
ttl: packet.ttl,
|
||||
version: fragmentVersion,
|
||||
route: packet.route
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user