Bring code/key deserialization into serializer
Duplicates first byte parsing but makes testing more meaningful, because there's no need to provide a bogus code/key pair.
This commit is contained in:
parent
11cb312c02
commit
ce94a594f9
|
@ -82,9 +82,8 @@ class ControlChannel {
|
|||
serializer.reset()
|
||||
}
|
||||
|
||||
func readInboundPacket(withCode code: PacketCode, key: UInt8, data: Data, offset: Int) throws -> ControlPacket {
|
||||
log.debug("Control: Try read packet with code \(code) and key \(key)")
|
||||
let packet = try serializer.deserialize(code: code, key: key, data: data, start: offset, end: nil)
|
||||
func readInboundPacket(withData data: Data, offset: Int) throws -> ControlPacket {
|
||||
let packet = try serializer.deserialize(data: data, start: offset, end: nil)
|
||||
log.debug("Control: Read packet \(packet)")
|
||||
if let ackIds = packet.ackIds as? [UInt32], let ackRemoteSessionId = packet.ackRemoteSessionId {
|
||||
try readAcks(ackIds, acksRemoteSessionId: ackRemoteSessionId)
|
||||
|
|
|
@ -34,7 +34,7 @@ protocol ControlChannelSerializer {
|
|||
|
||||
func serialize(packet: ControlPacket) throws -> Data
|
||||
|
||||
func deserialize(code: PacketCode, key: UInt8, data: Data, start: Int, end: Int?) throws -> ControlPacket
|
||||
func deserialize(data: Data, start: Int, end: Int?) throws -> ControlPacket
|
||||
}
|
||||
|
||||
extension ControlChannel {
|
||||
|
@ -46,10 +46,22 @@ extension ControlChannel {
|
|||
return packet.serialized()
|
||||
}
|
||||
|
||||
func deserialize(code: PacketCode, key: UInt8, data packet: Data, start: Int, end: Int?) throws -> ControlPacket {
|
||||
func deserialize(data packet: Data, start: Int, end: Int?) throws -> ControlPacket {
|
||||
var offset = start
|
||||
let end = end ?? packet.count
|
||||
|
||||
guard end >= offset + PacketHeaderLength else {
|
||||
throw ControlChannelError("Missing header")
|
||||
}
|
||||
let codeValue = packet[offset] >> 3
|
||||
guard let code = PacketCode(rawValue: codeValue) else {
|
||||
throw ControlChannelError("Unknown code: \(codeValue))")
|
||||
}
|
||||
let key = packet[offset] & 0b111
|
||||
offset += PacketHeaderLength
|
||||
|
||||
log.debug("Control: Try read packet with code \(code) and key \(key)")
|
||||
|
||||
guard end >= offset + PacketSessionIdLength else {
|
||||
throw ControlChannelError("Missing sessionId")
|
||||
}
|
||||
|
|
|
@ -418,7 +418,7 @@ public class SessionProxy {
|
|||
// log.verbose("Received data from LINK (\(packet.count) bytes): \(packet.toHex())")
|
||||
|
||||
guard let firstByte = packet.first else {
|
||||
log.warning("Dropped malformed packet (missing header)")
|
||||
log.warning("Dropped malformed packet (missing opcode)")
|
||||
continue
|
||||
}
|
||||
let codeValue = firstByte >> 3
|
||||
|
@ -426,10 +426,9 @@ public class SessionProxy {
|
|||
log.warning("Dropped malformed packet (unknown code: \(codeValue))")
|
||||
continue
|
||||
}
|
||||
let key = firstByte & 0b111
|
||||
|
||||
// log.verbose("Parsed packet with (code, key) = (\(code.rawValue), \(key))")
|
||||
|
||||
// log.verbose("Parsed packet with code \(code)")
|
||||
|
||||
var offset = 1
|
||||
if (code == .dataV2) {
|
||||
guard packet.count >= offset + PacketPeerIdLength else {
|
||||
|
@ -440,6 +439,7 @@ public class SessionProxy {
|
|||
}
|
||||
|
||||
if (code == .dataV1) || (code == .dataV2) {
|
||||
let key = firstByte & 0b111
|
||||
guard let _ = keys[key] else {
|
||||
log.error("Key with id \(key) not found")
|
||||
deferStop(.shutdown, SessionError.badKey)
|
||||
|
@ -454,10 +454,10 @@ public class SessionProxy {
|
|||
continue
|
||||
}
|
||||
|
||||
log.debug("Packet has code \(code.rawValue), key \(key)")
|
||||
log.debug("Packet has code \(code.rawValue)")
|
||||
let controlPacket: ControlPacket
|
||||
do {
|
||||
let parsedPacket = try controlChannel.readInboundPacket(withCode: code, key: key, data: packet, offset: offset)
|
||||
let parsedPacket = try controlChannel.readInboundPacket(withData: packet, offset: 0)
|
||||
handleAcks()
|
||||
if parsedPacket.code == .ackV1 {
|
||||
continue
|
||||
|
|
Loading…
Reference in New Issue