import Foundation protocol TransportProtocolParserProtocol { var packetData: Data! { get set } var offset: Int { get set } var bytesLength: Int { get } var payload: Data! { get set } func buildSegment(_ pseudoHeaderChecksum: UInt32) } /// Parser to process UDP packet and build packet. class UDPProtocolParser: TransportProtocolParserProtocol { /// The source port. var sourcePort: Port! /// The destination port. var destinationPort: Port! /// The data containing the UDP segment. var packetData: Data! /// The offset of the UDP segment in the `packetData`. var offset: Int = 0 /// The payload to be encapsulated. var payload: Data! /// The length of the UDP segment. var bytesLength: Int { return payload.count + 8 } init() {} init?(packetData: Data, offset: Int) { guard packetData.count >= offset + 8 else { return nil } self.packetData = packetData self.offset = offset sourcePort = Port(bytesInNetworkOrder: (packetData as NSData).bytes.advanced(by: offset)) destinationPort = Port(bytesInNetworkOrder: (packetData as NSData).bytes.advanced(by: offset + 2)) payload = packetData.subdata(in: offset+8..