static void DecodeConnectPacket(Packet buffer, ConnectPacket packet, ref Int32 remainingLength, IHandlerContext context) { var protocolName = DecodeString(buffer, ref remainingLength); if (!Util.ProtocolName.Equals(protocolName, StringComparison.Ordinal)) { throw new DecoderException($"Unexpected protocol name. Expected: {Util.ProtocolName}. Actual: {protocolName}"); } packet.ProtocolName = Util.ProtocolName; DecreaseRemainingLength(ref remainingLength, 1); packet.ProtocolLevel = buffer.ReadByte(); if (packet.ProtocolLevel != Util.ProtocolLevel) { var connAckPacket = new ConnAckPacket(); connAckPacket.ReturnCode = ConnectReturnCode.RefusedUnacceptableProtocolVersion; context.WriteAndFlushAsync(connAckPacket); throw new DecoderException($"Unexpected protocol level. Expected: {Util.ProtocolLevel}. Actual: {packet.ProtocolLevel}"); } DecreaseRemainingLength(ref remainingLength, 1); Int32 connectFlags = buffer.ReadByte(); packet.CleanSession = (connectFlags & 0x02) == 0x02; var hasWill = (connectFlags & 0x04) == 0x04; if (hasWill) { packet.HasWill = true; packet.WillRetain = (connectFlags & 0x20) == 0x20; packet.WillQualityOfService = (QualityOfService)((connectFlags & 0x18) >> 3); if (packet.WillQualityOfService == QualityOfService.Reserved) { throw new DecoderException($"[MQTT-3.1.2-14] Unexpected Will QoS value of {(Int32)packet.WillQualityOfService}."); } packet.WillTopicName = String.Empty; } else if ((connectFlags & 0x38) != 0) // bits 3,4,5 [MQTT-3.1.2-11] { throw new DecoderException("[MQTT-3.1.2-11]"); } packet.HasUsername = (connectFlags & 0x80) == 0x80; packet.HasPassword = (connectFlags & 0x40) == 0x40; if (packet.HasPassword && !packet.HasUsername) { throw new DecoderException("[MQTT-3.1.2-22]"); } if ((connectFlags & 0x1) != 0) // [MQTT-3.1.2-3] { throw new DecoderException("[MQTT-3.1.2-3]"); } packet.KeepAliveInSeconds = DecodeUnsignedShort(buffer, ref remainingLength); var clientId = DecodeString(buffer, ref remainingLength); Util.ValidateClientId(clientId); packet.ClientId = clientId; if (hasWill) { packet.WillTopicName = DecodeString(buffer, ref remainingLength); var willMessageLength = DecodeUnsignedShort(buffer, ref remainingLength); DecreaseRemainingLength(ref remainingLength, willMessageLength); packet.WillMessage = buffer.ReadBytes(willMessageLength); } if (packet.HasUsername) { packet.Username = DecodeString(buffer, ref remainingLength); } if (packet.HasPassword) { packet.Password = DecodeString(buffer, ref remainingLength); } }