Skip to content

Commit

Permalink
Merge pull request #14 from Vect0rZ/draft-32-v2
Browse files Browse the repository at this point in the history
Draft 32
  • Loading branch information
Vect0rZ committed Dec 21, 2020
2 parents efb916a + 926ff1e commit fa75e2c
Show file tree
Hide file tree
Showing 37 changed files with 541 additions and 327 deletions.
13 changes: 9 additions & 4 deletions QuicNet.Infrastructure/ErrorCodes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,20 @@ public enum ErrorCode : UInt16
{
NO_ERROR = 0x0,
INTERNAL_ERROR = 0x1,
SERVER_BUSY = 0x2,
CONNECTION_REFUSED = 0x2,
FLOW_CONTROL_ERROR = 0x3,
STREAM_LIMIT_ERROR = 0x4,
STREAM_STATE_ERROR = 0x5,
FINAL_OFFSET_ERROR = 0x6,
FINAL_SIZE_ERROR = 0x6,
FRAME_ENCODING_ERROR = 0x7,
TRANSPORT_PARAMETER_ERROR = 0x8,
VERSION_NEGOTIATION_ERROR = 0x9,
CONNECTION_ID_LIMIT_ERROR = 0x9,
PROTOCOL_VIOLATION = 0xA,
INVALID_MIGRATION = 0xC
INVALID_TOKEN = 0xB,
APPLICATION_ERROR = 0xC,
CRYPTO_BUFFER_EXCEEDED = 0xD,
KEY_UPDATE_ERROR = 0xE,
AEAD_LIMIT_REACHED = 0xF,
CRYPTO_ERROR = 0x100
}
}
44 changes: 33 additions & 11 deletions QuicNet.Infrastructure/Frames/ConnectionCloseFrame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ namespace QuicNet.Infrastructure.Frames
{
public class ConnectionCloseFrame : Frame
{
public byte ActualType { get; set; }
public override byte Type => 0x1c;
public UInt16 ErrorCode { get; set; }
public VariableInteger ErrorCode { get; set; }
public VariableInteger FrameType { get; set; }
public VariableInteger ReasonPhraseLength { get; set; }
public string ReasonPhrase { get; set; }

Expand All @@ -20,19 +22,36 @@ public ConnectionCloseFrame()
ReasonPhraseLength = new VariableInteger(0);
}

public ConnectionCloseFrame(ErrorCode error, string reason)
/// <summary>
/// 0x1d not yet supported (Application Protocol Error)
/// </summary>
public ConnectionCloseFrame(ErrorCode error, byte frameType, string reason)
{
ReasonPhraseLength = new VariableInteger(0);
ActualType = 0x1c;

ErrorCode = (UInt64)error;
FrameType = new VariableInteger((UInt64)frameType);
if (!string.IsNullOrWhiteSpace(reason))
{
ReasonPhraseLength = new VariableInteger((UInt64)reason.Length);
}
else
{
ReasonPhraseLength = new VariableInteger(0);
}

ErrorCode = (UInt16)error;
ReasonPhrase = reason;
}

public override void Decode(ByteArray array)
{
byte type = array.ReadByte();
ActualType = array.ReadByte();
ErrorCode = array.ReadVariableInteger();
if (ActualType == 0x1c)
{
FrameType = array.ReadVariableInteger();
}

ErrorCode = array.ReadUInt16();
ReasonPhraseLength = array.ReadVariableInteger();

byte[] rp = array.ReadBytes((int)ReasonPhraseLength.Value);
Expand All @@ -42,16 +61,19 @@ public override void Decode(ByteArray array)
public override byte[] Encode()
{
List<byte> result = new List<byte>();
result.Add(Type);

byte[] errorCode = ByteUtilities.GetBytes(ErrorCode);
result.AddRange(errorCode);
result.Add(ActualType);
result.AddRange(ErrorCode.ToByteArray());
if (ActualType == 0x1c)
{
result.AddRange(FrameType.ToByteArray());
}

if (string.IsNullOrWhiteSpace(ReasonPhrase) == false)
{
byte[] reasonPhrase = ByteUtilities.GetBytes(ReasonPhrase);
byte[] rpl = new VariableInteger((UInt64)ReasonPhrase.Length);
result.AddRange(rpl);

byte[] reasonPhrase = ByteUtilities.GetBytes(ReasonPhrase);
result.AddRange(reasonPhrase);
}

Expand Down
10 changes: 4 additions & 6 deletions QuicNet.Infrastructure/Frames/DataBlockedFrame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace QuicNet.Infrastructure.Frames
public class DataBlockedFrame : Frame
{
public override byte Type => 0x14;
public VariableInteger DataLimit { get; set; }
public VariableInteger MaximumData { get; set; }

public DataBlockedFrame()
{
Expand All @@ -19,22 +19,20 @@ public DataBlockedFrame()

public DataBlockedFrame(UInt64 dataLimit)
{
DataLimit = dataLimit;
MaximumData = dataLimit;
}

public override void Decode(ByteArray array)
{
byte type = array.ReadByte();
DataLimit = array.ReadVariableInteger();
MaximumData = array.ReadVariableInteger();
}

public override byte[] Encode()
{
List<byte> result = new List<byte>();
result.Add(Type);
byte[] dataLimit = DataLimit;

result.AddRange(dataLimit);
result.AddRange(MaximumData.ToByteArray());

return result.ToArray();
}
Expand Down
3 changes: 1 addition & 2 deletions QuicNet.Infrastructure/Frames/MaxDataFrame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,9 @@ public override void Decode(ByteArray array)
public override byte[] Encode()
{
List<byte> result = new List<byte>();
byte[] maxData = MaximumData;

result.Add(Type);
result.AddRange(maxData);
result.AddRange(MaximumData.ToByteArray());

return result.ToArray();
}
Expand Down
9 changes: 3 additions & 6 deletions QuicNet.Infrastructure/Frames/MaxStreamDataFrame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,10 @@ public override void Decode(ByteArray array)
public override byte[] Encode()
{
List<byte> result = new List<byte>();
result.Add(Type);

byte[] streamId = StreamId;
result.AddRange(streamId);

byte[] maximumStreamData = MaximumStreamData;
result.AddRange(maximumStreamData);
result.Add(Type);
result.AddRange(StreamId.ToByteArray());
result.AddRange(MaximumStreamData.ToByteArray());

return result.ToArray();
}
Expand Down
5 changes: 2 additions & 3 deletions QuicNet.Infrastructure/Frames/MaxStreamsFrame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,9 @@ public override void Decode(ByteArray array)
public override byte[] Encode()
{
List<byte> result = new List<byte>();
result.Add(Type);

byte[] streamId = MaximumStreams;
result.AddRange(streamId);
result.Add(Type);
result.AddRange(MaximumStreams.ToByteArray());

return result.ToArray();
}
Expand Down
7 changes: 5 additions & 2 deletions QuicNet.Infrastructure/Frames/PingFrame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@ public class PingFrame : Frame

public override void Decode(ByteArray array)
{
throw new NotImplementedException();
byte type = array.ReadByte();
}

public override byte[] Encode()
{
throw new NotImplementedException();
List<byte> data = new List<byte>();
data.Add(Type);

return data.ToArray();
}
}
}
18 changes: 7 additions & 11 deletions QuicNet.Infrastructure/Frames/ResetStreamFrame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,29 +11,25 @@ public class ResetStreamFrame : Frame
{
public override byte Type => 0x04;
public VariableInteger StreamId { get; set; }
public UInt16 ApplicationErrorCode { get; set; }
public VariableInteger FinalOffset { get; set; }
public VariableInteger ApplicationProtocolErrorCode { get; set; }
public VariableInteger FinalSize { get; set; }

public override void Decode(ByteArray array)
{
byte type = array.ReadByte();
StreamId = array.ReadVariableInteger();
ApplicationErrorCode = array.ReadUInt16();
FinalOffset = array.ReadVariableInteger();
ApplicationProtocolErrorCode = array.ReadVariableInteger();
FinalSize = array.ReadVariableInteger();
}

public override byte[] Encode()
{
List<byte> result = new List<byte>();

result.Add(Type);
byte[] streamId = StreamId;
result.AddRange(streamId);

result.AddRange(ByteUtilities.GetBytes(ApplicationErrorCode));

byte[] offset = FinalOffset;
result.AddRange(offset);
result.AddRange(StreamId.ToByteArray());
result.AddRange(ApplicationProtocolErrorCode.ToByteArray());
result.AddRange(FinalSize.ToByteArray());

return result.ToArray();
}
Expand Down
17 changes: 6 additions & 11 deletions QuicNet.Infrastructure/Frames/StreamDataBlockedFrame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,7 @@ public class StreamDataBlockedFrame : Frame
{
public override byte Type => 0x15;
public VariableInteger StreamId { get; set; }
public VariableInteger StreamDataLimit { get; set; }

public StreamId ConvertedStreamId { get; set; }
public VariableInteger MaximumStreamData { get; set; }

public StreamDataBlockedFrame()
{
Expand All @@ -23,26 +21,23 @@ public StreamDataBlockedFrame()
public StreamDataBlockedFrame(UInt64 streamId, UInt64 streamDataLimit)
{
StreamId = streamId;
StreamDataLimit = streamDataLimit;
MaximumStreamData = streamDataLimit;
}

public override void Decode(ByteArray array)
{
byte type = array.ReadByte();
StreamId = array.ReadVariableInteger();
StreamDataLimit = array.ReadVariableInteger();
MaximumStreamData = array.ReadVariableInteger();
}

public override byte[] Encode()
{
List<byte> result = new List<byte>();
result.Add(Type);

byte[] streamId = StreamId;
byte[] streamDataLimit = StreamDataLimit;

result.AddRange(streamId);
result.AddRange(streamDataLimit);
result.Add(Type);
result.AddRange(StreamId.ToByteArray());
result.AddRange(MaximumStreamData.ToByteArray());

return result.ToArray();
}
Expand Down
18 changes: 5 additions & 13 deletions QuicNet.Infrastructure/Frames/StreamFrame.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,13 @@ namespace QuicNet.Infrastructure.Frames
{
public class StreamFrame : Frame
{
private byte ActualType = 0x08;
public byte ActualType = 0x08;

public override byte Type => 0x08;
public VariableInteger StreamId { get; set; }
public VariableInteger Offset { get; set; }
public VariableInteger Length { get; set; }
public byte[] StreamData { get; set; }
public StreamId ConvertedStreamId { get; set; }
public bool EndOfStream { get; set; }

public StreamFrame()
Expand All @@ -28,8 +27,8 @@ public StreamFrame(UInt64 streamId, byte[] data, UInt64 offset, bool eos)
{
StreamId = streamId;
StreamData = data;
Length = (UInt64)data.Length;
Offset = offset;
Length = (UInt64)data.Length;
EndOfStream = eos;
}

Expand All @@ -48,9 +47,8 @@ public override void Decode(ByteArray array)
Length = array.ReadVariableInteger();
if (FIN_BIT > 0)
EndOfStream = true;

StreamData = array.ReadBytes((int)Length.Value);
ConvertedStreamId = QuickNet.Utilities.StreamId.Decode(ByteUtilities.GetBytes(StreamId.Value));
}

public override byte[] Encode()
Expand All @@ -72,16 +70,10 @@ public override byte[] Encode()
result.AddRange(streamId);

if (OFF_BIT > 0)
{
byte[] offset = Offset;
result.AddRange(offset);
}
result.AddRange(Offset.ToByteArray());

if (LEN_BIT > 0)
{
byte[] length = Length;
result.AddRange(length);
}
result.AddRange(Length.ToByteArray());

result.AddRange(StreamData);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
using QuicNet.Infrastructure.Frames;
using QuickNet.Utilities;
using QuicNet.Infrastructure.Frames;
using QuicNet.Infrastructure.Packets;
using QuicNet.Infrastructure.Settings;

namespace QuicNet.Infrastructure.PacketProcessing
{
public class InitialPacketCreator
{
public InitialPacket CreateInitialPacket(byte sourceConnectionId, byte destinationConnectionId)
public InitialPacket CreateInitialPacket(GranularInteger sourceConnectionId, GranularInteger destinationConnectionId)
{
InitialPacket packet = new InitialPacket();
InitialPacket packet = new InitialPacket(destinationConnectionId, sourceConnectionId);
packet.PacketNumber = 0;
packet.SourceConnectionId = sourceConnectionId;
packet.DestinationConnectionId = destinationConnectionId;
Expand Down
Loading

0 comments on commit fa75e2c

Please sign in to comment.