mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 02:25:20 +00:00
dynamic fragmentation
This commit is contained in:
@@ -17,7 +17,7 @@ final class BLEService: NSObject {
|
|||||||
// MARK: - Constants
|
// MARK: - Constants
|
||||||
|
|
||||||
#if DEBUG
|
#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
|
#else
|
||||||
static let serviceUUID = CBUUID(string: "F47B5E2D-4A9E-4C5A-9B3F-8E1D2C3A4B5C") // mainnet
|
static let serviceUUID = CBUUID(string: "F47B5E2D-4A9E-4C5A-9B3F-8E1D2C3A4B5C") // mainnet
|
||||||
#endif
|
#endif
|
||||||
@@ -3015,7 +3015,21 @@ extension BLEService {
|
|||||||
}
|
}
|
||||||
// Fragment the unpadded frame; each fragment will be encoded independently
|
// Fragment the unpadded frame; each fragment will be encoded independently
|
||||||
let fragmentID = Data((0..<8).map { _ in UInt8.random(in: 0...255) })
|
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 safeChunk = max(64, chunk)
|
||||||
let fragments = stride(from: 0, to: fullData.count, by: safeChunk).map { offset in
|
let fragments = stride(from: 0, to: fullData.count, by: safeChunk).map { offset in
|
||||||
Data(fullData[offset..<min(offset + safeChunk, fullData.count)])
|
Data(fullData[offset..<min(offset + safeChunk, fullData.count)])
|
||||||
@@ -3074,6 +3088,7 @@ extension BLEService {
|
|||||||
payload: payload,
|
payload: payload,
|
||||||
signature: nil,
|
signature: nil,
|
||||||
ttl: packet.ttl,
|
ttl: packet.ttl,
|
||||||
|
version: fragmentVersion,
|
||||||
route: packet.route
|
route: packet.route
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user