Skip to content

Commit 7e39fff

Browse files
Merge pull request #11 from enclave-networks/fix/ipv4-fragmentation-flags
Fix alignment of IPv4 fragmentation flags
2 parents 58d33bb + b1498c5 commit 7e39fff

File tree

2 files changed

+45
-8
lines changed

2 files changed

+45
-8
lines changed

src/Enclave.FastPacket/Ipv4.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,26 @@ namespace Enclave.FastPacket;
1010
/// </summary>
1111
[Flags]
1212
public enum FragmentFlags
13-
{
13+
{
14+
/// <summary>
15+
/// None
16+
/// </summary>
17+
None = 0, // When bit shifted, gives [000][0 0000 0000 0000] in binary
18+
1419
/// <summary>
15-
/// Reserved, do not use.
20+
/// More fragments (MF).
1621
/// </summary>
17-
Reserved = 0x01,
18-
22+
MoreFragments = 1, // When bit shifted, gives [001][0 0000 0000 0000] in binary
23+
1924
/// <summary>
2025
/// Don't fragment (DF).
2126
/// </summary>
22-
DontFragment = 0x02,
27+
DontFragment = 2, // When bit shifted, gives [010][0 0000 0000 0000] in binary
2328

2429
/// <summary>
25-
/// More framgents (MF).
30+
/// Reserved, do not use.
2631
/// </summary>
27-
MoreFragments = 0x04,
32+
Reserved = 4, // When bit shifted, gives [100][0 0000 0000 0000] in binary
2833
}
2934

3035
internal ref struct Ipv4Definition

tests/Enclave.FastPacket.Tests/Ipv4Tests.cs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void CanReadIpv4PacketWithUdpPayload()
1616
var destIp = IPAddress.Parse("127.0.0.2");
1717

1818
var packet = new PacketDotNet.IPv4Packet(sourceIp, destIp);
19-
packet.FragmentFlags = (byte)FragmentFlags.MoreFragments;
19+
packet.FragmentFlags = (ushort)FragmentFlags.MoreFragments;
2020
packet.FragmentOffset = 56;
2121
packet.Id = 10;
2222
packet.HopLimit = 15;
@@ -110,5 +110,37 @@ public void CanReadIpv4PacketWithIcmpPayload()
110110

111111
// 3 is the code for port unreachable.
112112
icmp.Code.Should().Be(3);
113+
}
114+
115+
[Theory]
116+
[InlineData(IpProtocol.Udp, FragmentFlags.DontFragment)]
117+
[InlineData(IpProtocol.Icmp, FragmentFlags.MoreFragments)]
118+
[InlineData(IpProtocol.Icmp, FragmentFlags.Reserved)]
119+
[InlineData(IpProtocol.Tcp, FragmentFlags.None)]
120+
public void CanReadIpv4FragmentedPacket(IpProtocol protocol, FragmentFlags fragmentFlags)
121+
{
122+
var random = new Random();
123+
var fragmentOffset = (ushort)random.Next(0, 8191); // (13 bits available for offset)
124+
var sourceIp = IPAddress.Parse("10.0.0.1");
125+
var destIp = IPAddress.Parse("127.0.0.2");
126+
127+
var packet = new IPv4Packet(sourceIp, destIp)
128+
{
129+
Id = (ushort)random.Next(0, ushort.MaxValue),
130+
Protocol = (ProtocolType)protocol,
131+
FragmentFlags = (ushort)fragmentFlags,
132+
FragmentOffset = fragmentOffset
133+
};
134+
135+
var packetData = packet.Bytes;
136+
137+
// Parse the packet
138+
var myIp = new ReadOnlyIpv4PacketSpan(packetData);
139+
140+
myIp.Protocol.Should().Be(protocol);
141+
myIp.Source.ToIpAddress().Should().Be(sourceIp);
142+
myIp.Destination.ToIpAddress().Should().Be(destIp);
143+
myIp.FragmentFlags.Should().Be(fragmentFlags);
144+
myIp.FragmentOffset.Should().Be(fragmentOffset);
113145
}
114146
}

0 commit comments

Comments
 (0)