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
const int PacketSize = 100;
// 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
TestReceivePackets(NumPacketsToSend, NumPacketsToSend / 2, int.MaxValue, 2, PacketSize, PacketCommunicatorReceiveResult.Ok, NumPacketsToSend / 2, 0, 0.02);
......@@ -131,7 +131,7 @@ namespace PcapDotNet.Core.Test
// Wait for more packets
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, 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
TestReceivePackets(NumPacketsToSend, NumPacketsToSend, 0, 2, PacketSize, PacketCommunicatorReceiveResult.BreakLoop, 0, 0, 0.02);
......
......@@ -169,9 +169,13 @@ namespace PcapDotNet.Packets.Arp
return Length >= HeaderBaseLength && Length == HeaderLength;
}
internal ArpDatagram(byte[] buffer, int offset, int length)
: base(buffer, offset, length)
internal static ArpDatagram CreateInstance(byte[] buffer, int offset, int 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)
......@@ -195,6 +199,11 @@ namespace PcapDotNet.Packets.Arp
buffer.Write(ref offset, targetProtocolAddress);
}
private ArpDatagram(byte[] buffer, int offset, int length)
: base(buffer, offset, length)
{
}
private int OffsetSenderProtocolAddress
{
get { return Offset.SenderHardwareAddress + HardwareLength; }
......
......@@ -121,7 +121,7 @@ namespace PcapDotNet.Packets.Ethernet
get
{
if (_arp == null && Length >= HeaderLength)
_arp = new ArpDatagram(Buffer, StartOffset + HeaderLength, Length - HeaderLength);
_arp = ArpDatagram.CreateInstance(Buffer, StartOffset + HeaderLength, Length - HeaderLength);
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