@@ -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