Commit 1d6bf681 authored by Brickner_cp's avatar Brickner_cp

Fixed ARP over Ethernet invalidity due to Ethernet's trailer

parent 8450970e
...@@ -123,7 +123,7 @@ namespace PcapDotNet.Core.Test ...@@ -123,7 +123,7 @@ namespace PcapDotNet.Core.Test
const int PacketSize = 100; const int PacketSize = 100;
// Normal // Normal
TestReceivePackets(NumPacketsToSend, NumPacketsToSend, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend, 0, 0.021); TestReceivePackets(NumPacketsToSend, NumPacketsToSend, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend, 0, 0.041);
// Wait for less packets // Wait for less packets
TestReceivePackets(NumPacketsToSend, NumPacketsToSend / 2, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend / 2, 0, 0.02); TestReceivePackets(NumPacketsToSend, NumPacketsToSend / 2, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend / 2, 0, 0.02);
...@@ -131,7 +131,7 @@ namespace PcapDotNet.Core.Test ...@@ -131,7 +131,7 @@ namespace PcapDotNet.Core.Test
// Wait for more packets // Wait for more packets
TestReceivePackets(NumPacketsToSend, 0, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.043); TestReceivePackets(NumPacketsToSend, 0, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.043);
TestReceivePackets(NumPacketsToSend, -1, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.3); TestReceivePackets(NumPacketsToSend, -1, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.3);
TestReceivePackets(NumPacketsToSend, NumPacketsToSend + 1, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.03); TestReceivePackets(NumPacketsToSend, NumPacketsToSend + 1, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.None, NumPacketsToSend, 2, 2.035);
// Break loop // Break loop
TestReceivePackets(NumPacketsToSend, NumPacketsToSend, 0, 2, PacketSize, PacketCommunicatorReceiveResult.BreakLoop, 0, 0, 0.02); TestReceivePackets(NumPacketsToSend, NumPacketsToSend, 0, 2, PacketSize, PacketCommunicatorReceiveResult.BreakLoop, 0, 0, 0.02);
......
...@@ -169,9 +169,13 @@ namespace PcapDotNet.Packets.Arp ...@@ -169,9 +169,13 @@ namespace PcapDotNet.Packets.Arp
return Length >= HeaderBaseLength && Length == HeaderLength; return Length >= HeaderBaseLength && Length == HeaderLength;
} }
internal ArpDatagram(byte[] buffer, int offset, int length) internal static ArpDatagram CreateInstance(byte[] buffer, int offset, int length)
: base(buffer, offset, length)
{ {
if (length <= HeaderBaseLength)
return new ArpDatagram(buffer, offset, length);
int headerLength = GetHeaderLength(buffer[offset + Offset.HardwareLength], buffer[offset + Offset.ProtocolLength]);
return new ArpDatagram(buffer, offset, Math.Min(length, headerLength));
} }
internal static int GetHeaderLength(int hardwareLength, int protocolLength) internal static int GetHeaderLength(int hardwareLength, int protocolLength)
...@@ -195,6 +199,11 @@ namespace PcapDotNet.Packets.Arp ...@@ -195,6 +199,11 @@ namespace PcapDotNet.Packets.Arp
buffer.Write(ref offset, targetProtocolAddress); buffer.Write(ref offset, targetProtocolAddress);
} }
private ArpDatagram(byte[] buffer, int offset, int length)
: base(buffer, offset, length)
{
}
private int OffsetSenderProtocolAddress private int OffsetSenderProtocolAddress
{ {
get { return Offset.SenderHardwareAddress + HardwareLength; } get { return Offset.SenderHardwareAddress + HardwareLength; }
......
...@@ -121,7 +121,7 @@ namespace PcapDotNet.Packets.Ethernet ...@@ -121,7 +121,7 @@ namespace PcapDotNet.Packets.Ethernet
get get
{ {
if (_arp == null && Length >= HeaderLength) if (_arp == null && Length >= HeaderLength)
_arp = new ArpDatagram(Buffer, StartOffset + HeaderLength, Length - HeaderLength); _arp = ArpDatagram.CreateInstance(Buffer, StartOffset + HeaderLength, Length - HeaderLength);
return _arp; return _arp;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment