Commit cd86ed94 authored by Brickner_cp's avatar Brickner_cp

Packet Builder design

parent 87c607eb
...@@ -77,9 +77,12 @@ namespace PcapDotNet.Packets.Test ...@@ -77,9 +77,12 @@ namespace PcapDotNet.Packets.Test
Random random = new Random(); Random random = new Random();
IpV4Layer ipV4Layer = random.NextIpV4Layer(null); IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null;
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
IcmpLayer icmpLayer = random.NextIcmpLayer(); IcmpLayer icmpLayer = random.NextIcmpLayer();
icmpLayer.Checksum = null;
bool isIpV4Payload; bool isIpV4Payload;
switch (icmpLayer.MessageType) switch (icmpLayer.MessageType)
...@@ -148,6 +151,7 @@ namespace PcapDotNet.Packets.Test ...@@ -148,6 +151,7 @@ namespace PcapDotNet.Packets.Test
// ICMP // ICMP
IcmpLayer actualIcmpLayer = (IcmpLayer)packet.Ethernet.IpV4.Icmp.ExtractLayer(); IcmpLayer actualIcmpLayer = (IcmpLayer)packet.Ethernet.IpV4.Icmp.ExtractLayer();
icmpLayer.Checksum = actualIcmpLayer.Checksum;
Assert.AreEqual(icmpLayer, actualIcmpLayer); Assert.AreEqual(icmpLayer, actualIcmpLayer);
Assert.IsTrue(packet.Ethernet.IpV4.Icmp.IsChecksumCorrect); Assert.IsTrue(packet.Ethernet.IpV4.Icmp.IsChecksumCorrect);
} }
......
...@@ -77,6 +77,7 @@ namespace PcapDotNet.Packets.Test ...@@ -77,6 +77,7 @@ namespace PcapDotNet.Packets.Test
Random random = new Random(); Random random = new Random();
IpV4Layer ipV4Layer = random.NextIpV4Layer(null); IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null;
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
......
...@@ -116,6 +116,7 @@ namespace PcapDotNet.Packets.Test ...@@ -116,6 +116,7 @@ namespace PcapDotNet.Packets.Test
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
IpV4Layer ipV4Layer = random.NextIpV4Layer(); IpV4Layer ipV4Layer = random.NextIpV4Layer();
ipV4Layer.HeaderChecksum = null;
PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(0, 50 * 1024)); PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(0, 50 * 1024));
......
...@@ -77,6 +77,7 @@ namespace PcapDotNet.Packets.Test ...@@ -77,6 +77,7 @@ namespace PcapDotNet.Packets.Test
Random random = new Random(); Random random = new Random();
IpV4Layer ipV4Layer = random.NextIpV4Layer(null); IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ipV4Layer.HeaderChecksum = null;
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
...@@ -99,6 +100,7 @@ namespace PcapDotNet.Packets.Test ...@@ -99,6 +100,7 @@ namespace PcapDotNet.Packets.Test
ipV4Layer.HeaderChecksum = null; ipV4Layer.HeaderChecksum = null;
// TCP // TCP
tcpLayer.Checksum = packet.Ethernet.IpV4.Tcp.Checksum;
Assert.AreEqual(tcpLayer, packet.Ethernet.IpV4.Tcp.ExtractLayer(), "TCP Layer"); Assert.AreEqual(tcpLayer, packet.Ethernet.IpV4.Tcp.ExtractLayer(), "TCP Layer");
foreach (TcpOption option in packet.Ethernet.IpV4.Tcp.Options) foreach (TcpOption option in packet.Ethernet.IpV4.Tcp.Options)
{ {
......
...@@ -64,71 +64,46 @@ namespace PcapDotNet.Packets.Test ...@@ -64,71 +64,46 @@ namespace PcapDotNet.Packets.Test
[TestMethod] [TestMethod]
public void RandomUdpTest() public void RandomUdpTest()
{ {
MacAddress ethernetSource = new MacAddress("00:01:02:03:04:05"); EthernetLayer ethernetLayer = new EthernetLayer
MacAddress ethernetDestination = new MacAddress("A0:A1:A2:A3:A4:A5"); {
Source = new MacAddress("00:01:02:03:04:05"),
Destination = new MacAddress("A0:A1:A2:A3:A4:A5")
};
Random random = new Random(); Random random = new Random();
byte ipV4TypeOfService = random.NextByte(); IpV4Layer ipV4Layer = random.NextIpV4Layer(null);
ushort ipV4Identification = random.NextUShort(); ipV4Layer.HeaderChecksum = null;
byte ipV4Ttl = random.NextByte();
IpV4FragmentationOptions ipV4FragmentationOptions = random.NextEnum<IpV4FragmentationOptions>();
ushort ipV4FragmentationOffset = (ushort)(random.NextUShort(ushort.MaxValue / 8) * 8);
IpV4Fragmentation ipV4Fragmentation = new IpV4Fragmentation(ipV4FragmentationOptions, ipV4FragmentationOffset);
IpV4Address ipV4Source = new IpV4Address(random.NextUInt());
IpV4Address ipV4Destination = new IpV4Address(random.NextUInt());
IpV4Options ipV4Options = random.NextIpV4Options();
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
ushort udpSourcePort = random.NextUShort(); UdpLayer udpLayer = random.NextUdpLayer();
ushort udpDestinationPort = random.NextUShort(); udpLayer.Checksum = null;
bool udpCalculateChecksum = random.NextBool();
Datagram udpPayload = random.NextDatagram(random.Next(60000)); PayloadLayer payloadLayer = random.NextPayloadLayer(random.Next(60000));
Packet packet = new PacketBuilder2(new EthernetLayer Packet packet = PacketBuilder2.Build(DateTime.Now, ethernetLayer, ipV4Layer, udpLayer, payloadLayer);
{
Source = ethernetSource, Assert.IsTrue(packet.IsValid, "IsValid");
Destination = ethernetDestination,
}, // Ethernet
new IpV4Layer ethernetLayer.EtherType = EthernetType.IpV4;
{ Assert.AreEqual(ethernetLayer, packet.Ethernet.ExtractLayer(), "Ethernet Layer");
TypeOfService = ipV4TypeOfService,
Identification = ipV4Identification, // IpV4
Fragmentation = ipV4Fragmentation, ipV4Layer.Protocol = IpV4Protocol.Udp;
Ttl = ipV4Ttl, ipV4Layer.HeaderChecksum = ((IpV4Layer)packet.Ethernet.IpV4.ExtractLayer()).HeaderChecksum;
Source = ipV4Source, Assert.AreEqual(ipV4Layer, packet.Ethernet.IpV4.ExtractLayer(), "IP Layer");
Destination = ipV4Destination, ipV4Layer.HeaderChecksum = null;
Options = ipV4Options,
},
new UdpLayer
{
SourcePort = udpSourcePort,
DestinationPort = udpDestinationPort,
CalculateChecksum = udpCalculateChecksum,
},
new PayloadLayer
{
Data = udpPayload
})
.Build(DateTime.Now);
// Packet packet = PacketBuilder.EthernetIpV4Udp(DateTime.Now,
// ethernetSource, ethernetDestination,
// ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl,
// ipV4Source, ipV4Destination, ipV4Options,
// udpSourcePort, udpDestinationPort, udpCalculateChecksum,
// udpPayload);
Assert.IsTrue(packet.IsValid);
// UDP // UDP
Assert.AreEqual(udpSourcePort, packet.Ethernet.IpV4.Udp.SourcePort, "Source Port"); udpLayer.Checksum = packet.Ethernet.IpV4.Udp.Checksum;
Assert.AreEqual(udpDestinationPort, packet.Ethernet.IpV4.Udp.DestinationPort, "Destination Port"); Assert.AreEqual(udpLayer, packet.Ethernet.IpV4.Udp.ExtractLayer(), "UDP Layer");
Assert.AreEqual(UdpDatagram.HeaderLength + udpPayload.Length, packet.Ethernet.IpV4.Udp.TotalLength, "Total Length"); Assert.AreEqual(UdpDatagram.HeaderLength + payloadLayer.Length, packet.Ethernet.IpV4.Udp.TotalLength, "Total Length");
Assert.IsTrue(!udpCalculateChecksum && packet.Ethernet.IpV4.Udp.Checksum == 0 || Assert.IsTrue(!udpLayer.CalculateChecksum && packet.Ethernet.IpV4.Udp.Checksum == 0 ||
packet.Ethernet.IpV4.IsTransportChecksumCorrect, "IsTransportChecksumCorrect"); udpLayer.CalculateChecksum && packet.Ethernet.IpV4.IsTransportChecksumCorrect, "IsTransportChecksumCorrect");
Assert.IsTrue(packet.Ethernet.IpV4.Udp.IsChecksumOptional, "IsChecksumOptional"); Assert.IsTrue(packet.Ethernet.IpV4.Udp.IsChecksumOptional, "IsChecksumOptional");
Assert.AreEqual(udpPayload, packet.Ethernet.IpV4.Udp.Payload, "Payload"); Assert.AreEqual(payloadLayer.Data, packet.Ethernet.IpV4.Udp.Payload, "Payload");
} }
} }
......
...@@ -123,6 +123,7 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -123,6 +123,7 @@ namespace PcapDotNet.Packets.TestUtils
Identification = random.NextUShort(), Identification = random.NextUShort(),
Ttl = random.NextByte(), Ttl = random.NextByte(),
Protocol = protocol, Protocol = protocol,
HeaderChecksum = random.NextUShort(),
Fragmentation = random.NextIpV4Fragmentation(), Fragmentation = random.NextIpV4Fragmentation(),
Source = random.NextIpV4Address(), Source = random.NextIpV4Address(),
Destination = random.NextIpV4Address(), Destination = random.NextIpV4Address(),
...@@ -316,6 +317,19 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -316,6 +317,19 @@ namespace PcapDotNet.Packets.TestUtils
return new IpV4Options(options); return new IpV4Options(options);
} }
// UDP
public static UdpLayer NextUdpLayer(this Random random)
{
return new UdpLayer
{
Checksum = random.NextUShort(),
SourcePort = random.NextUShort(),
DestinationPort = random.NextUShort(),
CalculateChecksum = random.NextBool()
};
}
// TCP // TCP
public static TcpLayer NextTcpLayer(this Random random) public static TcpLayer NextTcpLayer(this Random random)
...@@ -563,34 +577,42 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -563,34 +577,42 @@ namespace PcapDotNet.Packets.TestUtils
case IcmpMessageType.DestinationUnreachable: case IcmpMessageType.DestinationUnreachable:
return new IcmpDestinationUnreachableLayer return new IcmpDestinationUnreachableLayer
{ {
Code = random.NextEnum<IcmpCodeDestinationUnrechable>() Code = random.NextEnum<IcmpCodeDestinationUnrechable>(),
Checksum = random.NextUShort(),
}; };
case IcmpMessageType.TimeExceeded: case IcmpMessageType.TimeExceeded:
return new IcmpTimeExceededLayer return new IcmpTimeExceededLayer
{ {
Code = random.NextEnum<IcmpCodeTimeExceeded>() Code = random.NextEnum<IcmpCodeTimeExceeded>(),
Checksum = random.NextUShort(),
}; };
case IcmpMessageType.ParameterProblem: case IcmpMessageType.ParameterProblem:
return new IcmpParameterProblemLayer return new IcmpParameterProblemLayer
{ {
Checksum = random.NextUShort(),
Pointer = random.NextByte() Pointer = random.NextByte()
}; };
case IcmpMessageType.SourceQuench: case IcmpMessageType.SourceQuench:
return new IcmpSourceQuenchLayer(); return new IcmpSourceQuenchLayer
{
Checksum = random.NextUShort(),
};
case IcmpMessageType.Redirect: case IcmpMessageType.Redirect:
return new IcmpRedirectLayer return new IcmpRedirectLayer
{ {
Code = random.NextEnum<IcmpCodeRedirect>(), Code = random.NextEnum<IcmpCodeRedirect>(),
Checksum = random.NextUShort(),
GatewayInternetAddress = random.NextIpV4Address() GatewayInternetAddress = random.NextIpV4Address()
}; };
case IcmpMessageType.Echo: case IcmpMessageType.Echo:
return new IcmpEchoLayer return new IcmpEchoLayer
{ {
Checksum = random.NextUShort(),
Identifier = random.NextUShort(), Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort() SequenceNumber = random.NextUShort()
}; };
...@@ -598,6 +620,7 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -598,6 +620,7 @@ namespace PcapDotNet.Packets.TestUtils
case IcmpMessageType.EchoReply: case IcmpMessageType.EchoReply:
return new IcmpEchoReplyLayer return new IcmpEchoReplyLayer
{ {
Checksum = random.NextUShort(),
Identifier = random.NextUShort(), Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort() SequenceNumber = random.NextUShort()
}; };
...@@ -606,6 +629,7 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -606,6 +629,7 @@ namespace PcapDotNet.Packets.TestUtils
case IcmpMessageType.Timestamp: case IcmpMessageType.Timestamp:
return new IcmpTimestampLayer return new IcmpTimestampLayer
{ {
Checksum = random.NextUShort(),
Identifier = random.NextUShort(), Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(), SequenceNumber = random.NextUShort(),
OriginateTimestamp = random.NextIpV4TimeOfDay(), OriginateTimestamp = random.NextIpV4TimeOfDay(),
...@@ -616,6 +640,7 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -616,6 +640,7 @@ namespace PcapDotNet.Packets.TestUtils
case IcmpMessageType.TimestampReply: case IcmpMessageType.TimestampReply:
return new IcmpTimestampReplyLayer return new IcmpTimestampReplyLayer
{ {
Checksum = random.NextUShort(),
Identifier = random.NextUShort(), Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(), SequenceNumber = random.NextUShort(),
OriginateTimestamp = random.NextIpV4TimeOfDay(), OriginateTimestamp = random.NextIpV4TimeOfDay(),
...@@ -626,6 +651,7 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -626,6 +651,7 @@ namespace PcapDotNet.Packets.TestUtils
case IcmpMessageType.InformationRequest: case IcmpMessageType.InformationRequest:
return new IcmpInformationRequestLayer return new IcmpInformationRequestLayer
{ {
Checksum = random.NextUShort(),
Identifier = random.NextUShort(), Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(), SequenceNumber = random.NextUShort(),
}; };
...@@ -633,6 +659,7 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -633,6 +659,7 @@ namespace PcapDotNet.Packets.TestUtils
case IcmpMessageType.InformationReply: case IcmpMessageType.InformationReply:
return new IcmpInformationReplyLayer return new IcmpInformationReplyLayer
{ {
Checksum = random.NextUShort(),
Identifier = random.NextUShort(), Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(), SequenceNumber = random.NextUShort(),
}; };
...@@ -641,16 +668,21 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -641,16 +668,21 @@ namespace PcapDotNet.Packets.TestUtils
case IcmpMessageType.RouterAdvertisement: case IcmpMessageType.RouterAdvertisement:
return new IcmpRouterAdvertisementLayer return new IcmpRouterAdvertisementLayer
{ {
Checksum = random.NextUShort(),
Lifetime = random.NextTimeSpan(TimeSpan.Zero, TimeSpan.FromSeconds(ushort.MaxValue)), Lifetime = random.NextTimeSpan(TimeSpan.Zero, TimeSpan.FromSeconds(ushort.MaxValue)),
Entries = random.NextIcmpRouterAdvertisementEntries(random.Next(10)).ToList() Entries = random.NextIcmpRouterAdvertisementEntries(random.Next(10)).ToList()
}; };
case IcmpMessageType.RouterSolicitation: case IcmpMessageType.RouterSolicitation:
return new IcmpRouterSolicitationLayer(); return new IcmpRouterSolicitationLayer
{
Checksum = random.NextUShort(),
};
case IcmpMessageType.AddressMaskRequest: case IcmpMessageType.AddressMaskRequest:
return new IcmpAddressMaskRequestLayer return new IcmpAddressMaskRequestLayer
{ {
Checksum = random.NextUShort(),
Identifier = random.NextUShort(), Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(), SequenceNumber = random.NextUShort(),
AddressMask = random.NextIpV4Address() AddressMask = random.NextIpV4Address()
...@@ -659,6 +691,7 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -659,6 +691,7 @@ namespace PcapDotNet.Packets.TestUtils
case IcmpMessageType.AddressMaskReply: case IcmpMessageType.AddressMaskReply:
return new IcmpAddressMaskReplyLayer return new IcmpAddressMaskReplyLayer
{ {
Checksum = random.NextUShort(),
Identifier = random.NextUShort(), Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(), SequenceNumber = random.NextUShort(),
AddressMask = random.NextIpV4Address() AddressMask = random.NextIpV4Address()
...@@ -668,6 +701,7 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -668,6 +701,7 @@ namespace PcapDotNet.Packets.TestUtils
return new IcmpTracerouteLayer return new IcmpTracerouteLayer
{ {
Code = random.NextEnum<IcmpCodeTraceroute>(), Code = random.NextEnum<IcmpCodeTraceroute>(),
Checksum = random.NextUShort(),
Identification = random.NextUShort(), Identification = random.NextUShort(),
OutboundHopCount = random.NextUShort(), OutboundHopCount = random.NextUShort(),
ReturnHopCount = random.NextUShort(), ReturnHopCount = random.NextUShort(),
...@@ -679,12 +713,14 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -679,12 +713,14 @@ namespace PcapDotNet.Packets.TestUtils
return new IcmpConversionFailedLayer return new IcmpConversionFailedLayer
{ {
Code = random.NextEnum<IcmpCodeConversionFailed>(), Code = random.NextEnum<IcmpCodeConversionFailed>(),
Checksum = random.NextUShort(),
Pointer = random.NextUInt(), Pointer = random.NextUInt(),
}; };
case IcmpMessageType.DomainNameRequest: case IcmpMessageType.DomainNameRequest:
return new IcmpDomainNameRequestLayer return new IcmpDomainNameRequestLayer
{ {
Checksum = random.NextUShort(),
Identifier = random.NextUShort(), Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(), SequenceNumber = random.NextUShort(),
}; };
...@@ -696,6 +732,7 @@ namespace PcapDotNet.Packets.TestUtils ...@@ -696,6 +732,7 @@ namespace PcapDotNet.Packets.TestUtils
return new IcmpSecurityFailuresLayer return new IcmpSecurityFailuresLayer
{ {
Code = random.NextEnum<IcmpCodeSecurityFailures>(), Code = random.NextEnum<IcmpCodeSecurityFailures>(),
Checksum = random.NextUShort(),
Pointer = random.NextUShort() Pointer = random.NextUShort()
}; };
......
...@@ -83,34 +83,42 @@ namespace PcapDotNet.Packets.Icmp ...@@ -83,34 +83,42 @@ namespace PcapDotNet.Packets.Icmp
case IcmpMessageType.DestinationUnreachable: case IcmpMessageType.DestinationUnreachable:
return new IcmpDestinationUnreachableLayer return new IcmpDestinationUnreachableLayer
{ {
Code = (IcmpCodeDestinationUnrechable)Code Code = (IcmpCodeDestinationUnrechable)Code,
Checksum = Checksum
}; };
case IcmpMessageType.TimeExceeded: case IcmpMessageType.TimeExceeded:
return new IcmpTimeExceededLayer return new IcmpTimeExceededLayer
{ {
Code = (IcmpCodeTimeExceeded)Code Code = (IcmpCodeTimeExceeded)Code,
Checksum = Checksum
}; };
case IcmpMessageType.ParameterProblem: case IcmpMessageType.ParameterProblem:
return new IcmpParameterProblemLayer return new IcmpParameterProblemLayer
{ {
Checksum = Checksum,
Pointer = ParameterProblem.Pointer Pointer = ParameterProblem.Pointer
}; };
case IcmpMessageType.SourceQuench: case IcmpMessageType.SourceQuench:
return new IcmpSourceQuenchLayer(); return new IcmpSourceQuenchLayer
{
Checksum = Checksum
};
case IcmpMessageType.Redirect: case IcmpMessageType.Redirect:
return new IcmpRedirectLayer return new IcmpRedirectLayer
{ {
Code = (IcmpCodeRedirect)Code, Code = (IcmpCodeRedirect)Code,
Checksum = Checksum,
GatewayInternetAddress = Redirect.GatewayInternetAddress GatewayInternetAddress = Redirect.GatewayInternetAddress
}; };
case IcmpMessageType.Echo: case IcmpMessageType.Echo:
return new IcmpEchoLayer return new IcmpEchoLayer
{ {
Checksum = Checksum,
Identifier = Echo.Identifier, Identifier = Echo.Identifier,
SequenceNumber = Echo.SequenceNumber SequenceNumber = Echo.SequenceNumber
}; };
...@@ -126,6 +134,7 @@ namespace PcapDotNet.Packets.Icmp ...@@ -126,6 +134,7 @@ namespace PcapDotNet.Packets.Icmp
case IcmpMessageType.Timestamp: case IcmpMessageType.Timestamp:
return new IcmpTimestampLayer return new IcmpTimestampLayer
{ {
Checksum = Checksum,
Identifier = Timestamp.Identifier, Identifier = Timestamp.Identifier,
SequenceNumber = Timestamp.SequenceNumber, SequenceNumber = Timestamp.SequenceNumber,
OriginateTimestamp = Timestamp.OriginateTimestamp, OriginateTimestamp = Timestamp.OriginateTimestamp,
...@@ -136,6 +145,7 @@ namespace PcapDotNet.Packets.Icmp ...@@ -136,6 +145,7 @@ namespace PcapDotNet.Packets.Icmp
case IcmpMessageType.TimestampReply: case IcmpMessageType.TimestampReply:
return new IcmpTimestampReplyLayer return new IcmpTimestampReplyLayer
{ {
Checksum = Checksum,
Identifier = TimestampReply.Identifier, Identifier = TimestampReply.Identifier,
SequenceNumber = TimestampReply.SequenceNumber, SequenceNumber = TimestampReply.SequenceNumber,
OriginateTimestamp = TimestampReply.OriginateTimestamp, OriginateTimestamp = TimestampReply.OriginateTimestamp,
...@@ -146,6 +156,7 @@ namespace PcapDotNet.Packets.Icmp ...@@ -146,6 +156,7 @@ namespace PcapDotNet.Packets.Icmp
case IcmpMessageType.InformationRequest: case IcmpMessageType.InformationRequest:
return new IcmpInformationRequestLayer return new IcmpInformationRequestLayer
{ {
Checksum = Checksum,
Identifier = InformationRequest.Identifier, Identifier = InformationRequest.Identifier,
SequenceNumber = InformationRequest.SequenceNumber SequenceNumber = InformationRequest.SequenceNumber
}; };
...@@ -161,16 +172,21 @@ namespace PcapDotNet.Packets.Icmp ...@@ -161,16 +172,21 @@ namespace PcapDotNet.Packets.Icmp
case IcmpMessageType.RouterAdvertisement: case IcmpMessageType.RouterAdvertisement:
return new IcmpRouterAdvertisementLayer return new IcmpRouterAdvertisementLayer
{ {
Checksum = Checksum,
Lifetime = RouterAdvertisement.Lifetime, Lifetime = RouterAdvertisement.Lifetime,
Entries = RouterAdvertisement.Entries.ToList() Entries = RouterAdvertisement.Entries.ToList()
}; };
case IcmpMessageType.RouterSolicitation: case IcmpMessageType.RouterSolicitation:
return new IcmpRouterSolicitationLayer(); return new IcmpRouterSolicitationLayer
{
Checksum = Checksum,
};
case IcmpMessageType.AddressMaskRequest: case IcmpMessageType.AddressMaskRequest:
return new IcmpAddressMaskRequestLayer return new IcmpAddressMaskRequestLayer
{ {
Checksum = Checksum,
Identifier = AddressMaskRequest.Identifier, Identifier = AddressMaskRequest.Identifier,
SequenceNumber = AddressMaskRequest.SequenceNumber, SequenceNumber = AddressMaskRequest.SequenceNumber,
AddressMask = AddressMaskRequest.AddressMask AddressMask = AddressMaskRequest.AddressMask
...@@ -179,6 +195,7 @@ namespace PcapDotNet.Packets.Icmp ...@@ -179,6 +195,7 @@ namespace PcapDotNet.Packets.Icmp
case IcmpMessageType.AddressMaskReply: case IcmpMessageType.AddressMaskReply:
return new IcmpAddressMaskReplyLayer return new IcmpAddressMaskReplyLayer
{ {
Checksum = Checksum,
Identifier = AddressMaskReply.Identifier, Identifier = AddressMaskReply.Identifier,
SequenceNumber = AddressMaskReply.SequenceNumber, SequenceNumber = AddressMaskReply.SequenceNumber,
AddressMask = AddressMaskReply.AddressMask AddressMask = AddressMaskReply.AddressMask
...@@ -188,6 +205,7 @@ namespace PcapDotNet.Packets.Icmp ...@@ -188,6 +205,7 @@ namespace PcapDotNet.Packets.Icmp
return new IcmpTracerouteLayer return new IcmpTracerouteLayer
{ {
Code = (IcmpCodeTraceroute)Code, Code = (IcmpCodeTraceroute)Code,
Checksum = Checksum,
Identification = Traceroute.Identification, Identification = Traceroute.Identification,
OutboundHopCount = Traceroute.OutboundHopCount, OutboundHopCount = Traceroute.OutboundHopCount,
ReturnHopCount = Traceroute.ReturnHopCount, ReturnHopCount = Traceroute.ReturnHopCount,
...@@ -199,12 +217,14 @@ namespace PcapDotNet.Packets.Icmp ...@@ -199,12 +217,14 @@ namespace PcapDotNet.Packets.Icmp
return new IcmpConversionFailedLayer return new IcmpConversionFailedLayer
{ {
Code = (IcmpCodeConversionFailed)Code, Code = (IcmpCodeConversionFailed)Code,
Checksum = Checksum,
Pointer = ConversionFailed.Pointer Pointer = ConversionFailed.Pointer
}; };
case IcmpMessageType.DomainNameRequest: case IcmpMessageType.DomainNameRequest:
return new IcmpDomainNameRequestLayer return new IcmpDomainNameRequestLayer
{ {
Checksum = Checksum,
Identifier = DomainNameRequest.Identifier, Identifier = DomainNameRequest.Identifier,
SequenceNumber = DomainNameRequest.SequenceNumber SequenceNumber = DomainNameRequest.SequenceNumber
}; };
...@@ -216,6 +236,7 @@ namespace PcapDotNet.Packets.Icmp ...@@ -216,6 +236,7 @@ namespace PcapDotNet.Packets.Icmp
return new IcmpSecurityFailuresLayer return new IcmpSecurityFailuresLayer
{ {
Code = (IcmpCodeSecurityFailures)Code, Code = (IcmpCodeSecurityFailures)Code,
Checksum = Checksum,
Pointer = SecurityFailures.Pointer Pointer = SecurityFailures.Pointer
}; };
...@@ -383,10 +404,12 @@ namespace PcapDotNet.Packets.Icmp ...@@ -383,10 +404,12 @@ namespace PcapDotNet.Packets.Icmp
buffer.Write(offset + Offset.Variable, valueAccordingToType, Endianity.Big); buffer.Write(offset + Offset.Variable, valueAccordingToType, Endianity.Big);
} }
internal static void WriteChecksum(byte[] buffer, int offset, int length) internal static void WriteChecksum(byte[] buffer, int offset, int length, ushort? checksum)
{ {
ushort checksum = CalculateChecksum(buffer, offset, length); ushort checksumValue = checksum == null
buffer.Write(offset + Offset.Checksum, checksum, Endianity.Big); ? CalculateChecksum(buffer, offset, length)
: checksum.Value;
buffer.Write(offset + Offset.Checksum, checksumValue, Endianity.Big);
} }
protected override bool CalculateIsValid() protected override bool CalculateIsValid()
......
...@@ -338,10 +338,13 @@ namespace PcapDotNet.Packets.IpV4 ...@@ -338,10 +338,13 @@ namespace PcapDotNet.Packets.IpV4
buffer.Write(offset + Offset.HeaderChecksum, headerChecksumValue, Endianity.Big); buffer.Write(offset + Offset.HeaderChecksum, headerChecksumValue, Endianity.Big);
} }
internal static void WriteTransportChecksum(byte[] buffer, int offset, int headerLength, ushort transportLength, int transportChecksumOffset, bool isChecksumOptional) internal static void WriteTransportChecksum(byte[] buffer, int offset, int headerLength, ushort transportLength, int transportChecksumOffset, bool isChecksumOptional, ushort? checksum)
{ {
ushort checksum = CalculateTransportChecksum(buffer, offset, headerLength, transportLength, transportChecksumOffset, isChecksumOptional); ushort checksumValue =
buffer.Write(offset + headerLength + transportChecksumOffset, checksum, Endianity.Big); checksum == null
? CalculateTransportChecksum(buffer, offset, headerLength, transportLength, transportChecksumOffset, isChecksumOptional)
: checksum.Value;
buffer.Write(offset + headerLength + transportChecksumOffset, checksumValue, Endianity.Big);
} }
private ushort CalculateTransportChecksum() private ushort CalculateTransportChecksum()
......
...@@ -255,7 +255,7 @@ namespace PcapDotNet.Packets ...@@ -255,7 +255,7 @@ namespace PcapDotNet.Packets
icmpIpV4SourceAddress, icmpIpV4DestinationAddress, icmpIpV4SourceAddress, icmpIpV4DestinationAddress,
icmpIpV4Options, icmpIpV4Payload.Length); icmpIpV4Options, icmpIpV4Payload.Length);
icmpIpV4Payload.Write(buffer, icmpOffset + IcmpDatagram.HeaderLength + icmpIpHeaderLength); icmpIpV4Payload.Write(buffer, icmpOffset + IcmpDatagram.HeaderLength + icmpIpHeaderLength);
IcmpDatagram.WriteChecksum(buffer, icmpOffset, ipPayloadLength); IcmpDatagram.WriteChecksum(buffer, icmpOffset, ipPayloadLength, null);
return new Packet(buffer, timestamp, DataLinkKind.Ethernet); return new Packet(buffer, timestamp, DataLinkKind.Ethernet);
} }
...@@ -610,7 +610,7 @@ namespace PcapDotNet.Packets ...@@ -610,7 +610,7 @@ namespace PcapDotNet.Packets
udpPayload.Write(buffer, ethernetIpV4HeadersLength + UdpDatagram.HeaderLength); udpPayload.Write(buffer, ethernetIpV4HeadersLength + UdpDatagram.HeaderLength);
if (udpCalculateChecksum) if (udpCalculateChecksum)
IpV4Datagram.WriteTransportChecksum(buffer, EthernetDatagram.HeaderLength, ipV4HeaderLength, (ushort)transportLength, UdpDatagram.Offset.Checksum, true); IpV4Datagram.WriteTransportChecksum(buffer, EthernetDatagram.HeaderLength, ipV4HeaderLength, (ushort)transportLength, UdpDatagram.Offset.Checksum, true, null);
return new Packet(buffer, timestamp, DataLinkKind.Ethernet); return new Packet(buffer, timestamp, DataLinkKind.Ethernet);
} }
...@@ -674,7 +674,7 @@ namespace PcapDotNet.Packets ...@@ -674,7 +674,7 @@ namespace PcapDotNet.Packets
tcpPayload.Write(buffer, ethernetIpV4HeadersLength + tcpHeaderLength); tcpPayload.Write(buffer, ethernetIpV4HeadersLength + tcpHeaderLength);
IpV4Datagram.WriteTransportChecksum(buffer, EthernetDatagram.HeaderLength, ipV4HeaderLength, (ushort)transportLength, IpV4Datagram.WriteTransportChecksum(buffer, EthernetDatagram.HeaderLength, ipV4HeaderLength, (ushort)transportLength,
TcpDatagram.Offset.Checksum, false); TcpDatagram.Offset.Checksum, false, null);
return new Packet(buffer, timestamp, DataLinkKind.Ethernet); return new Packet(buffer, timestamp, DataLinkKind.Ethernet);
} }
......
...@@ -32,6 +32,8 @@ namespace PcapDotNet.Packets ...@@ -32,6 +32,8 @@ namespace PcapDotNet.Packets
public interface IIpV4NextTransportLayer : IIpV4NextLayer public interface IIpV4NextTransportLayer : IIpV4NextLayer
{ {
ushort? Checksum { get; set; }
bool CalculateChecksum { get; }
int NextLayerChecksumOffset { get; } int NextLayerChecksumOffset { get; }
bool NextLayerIsChecksumOptional { get; } bool NextLayerIsChecksumOptional { get; }
bool NextLayerCalculateChecksum { get; } bool NextLayerCalculateChecksum { get; }
...@@ -252,8 +254,10 @@ namespace PcapDotNet.Packets ...@@ -252,8 +254,10 @@ namespace PcapDotNet.Packets
if (nextTransportLayer == null || !nextTransportLayer.NextLayerCalculateChecksum) if (nextTransportLayer == null || !nextTransportLayer.NextLayerCalculateChecksum)
return; return;
IpV4Datagram.WriteTransportChecksum(buffer, offset, Length, (ushort)payloadLength, if (nextTransportLayer.CalculateChecksum)
nextTransportLayer.NextLayerChecksumOffset, nextTransportLayer.NextLayerIsChecksumOptional); IpV4Datagram.WriteTransportChecksum(buffer, offset, Length, (ushort)payloadLength,
nextTransportLayer.NextLayerChecksumOffset, nextTransportLayer.NextLayerIsChecksumOptional,
nextTransportLayer.Checksum);
} }
public bool Equals(IpV4Layer other) public bool Equals(IpV4Layer other)
...@@ -280,11 +284,18 @@ namespace PcapDotNet.Packets ...@@ -280,11 +284,18 @@ namespace PcapDotNet.Packets
public abstract class TransportLayer : Layer, IIpV4NextTransportLayer public abstract class TransportLayer : Layer, IIpV4NextTransportLayer
{ {
public ushort? Checksum { get; set; }
public ushort SourcePort { get; set; } public ushort SourcePort { get; set; }
public ushort DestinationPort { get; set; } public ushort DestinationPort { get; set; }
public abstract IpV4Protocol PreviousLayerProtocol { get; } public abstract IpV4Protocol PreviousLayerProtocol { get; }
public bool CalculateChecksum
{
get { return true; }
}
public abstract int NextLayerChecksumOffset { get; } public abstract int NextLayerChecksumOffset { get; }
public abstract bool NextLayerIsChecksumOptional { get; } public abstract bool NextLayerIsChecksumOptional { get; }
public abstract bool NextLayerCalculateChecksum { get; } public abstract bool NextLayerCalculateChecksum { get; }
...@@ -293,6 +304,7 @@ namespace PcapDotNet.Packets ...@@ -293,6 +304,7 @@ namespace PcapDotNet.Packets
{ {
return other != null && return other != null &&
PreviousLayerProtocol == other.PreviousLayerProtocol && PreviousLayerProtocol == other.PreviousLayerProtocol &&
Checksum == other.Checksum &&
SourcePort == other.SourcePort && DestinationPort == other.DestinationPort; SourcePort == other.SourcePort && DestinationPort == other.DestinationPort;
} }
...@@ -703,6 +715,7 @@ namespace PcapDotNet.Packets ...@@ -703,6 +715,7 @@ namespace PcapDotNet.Packets
{ {
get { return 0; } get { return 0; }
} }
public ushort? Checksum { get; set; }
protected virtual uint Value protected virtual uint Value
{ {
get { return 0; } get { return 0; }
...@@ -725,7 +738,7 @@ namespace PcapDotNet.Packets ...@@ -725,7 +738,7 @@ namespace PcapDotNet.Packets
public override void Finalize(byte[] buffer, int offset, int payloadLength, ILayer nextLayer) public override void Finalize(byte[] buffer, int offset, int payloadLength, ILayer nextLayer)
{ {
IcmpDatagram.WriteChecksum(buffer, offset, Length + payloadLength); IcmpDatagram.WriteChecksum(buffer, offset, Length + payloadLength, Checksum);
} }
public IpV4Protocol PreviousLayerProtocol public IpV4Protocol PreviousLayerProtocol
...@@ -737,6 +750,7 @@ namespace PcapDotNet.Packets ...@@ -737,6 +750,7 @@ namespace PcapDotNet.Packets
{ {
return other != null && return other != null &&
MessageType == other.MessageType && CodeValue == other.CodeValue && MessageType == other.MessageType && CodeValue == other.CodeValue &&
Checksum == other.Checksum &&
Value == other.Value; Value == other.Value;
} }
......
...@@ -242,6 +242,7 @@ namespace PcapDotNet.Packets.Transport ...@@ -242,6 +242,7 @@ namespace PcapDotNet.Packets.Transport
{ {
return new TcpLayer return new TcpLayer
{ {
Checksum = Checksum,
SourcePort = SourcePort, SourcePort = SourcePort,
DestinationPort = DestinationPort, DestinationPort = DestinationPort,
SequenceNumber = SequenceNumber, SequenceNumber = SequenceNumber,
......
...@@ -72,6 +72,17 @@ namespace PcapDotNet.Packets.Transport ...@@ -72,6 +72,17 @@ namespace PcapDotNet.Packets.Transport
get { return true; } get { return true; }
} }
public override ILayer ExtractLayer()
{
return new UdpLayer
{
Checksum = Checksum,
SourcePort = SourcePort,
DestinationPort = DestinationPort,
CalculateChecksum = (Checksum != 0)
};
}
/// <summary> /// <summary>
/// The payload of the UDP datagram. /// The payload of the UDP datagram.
/// </summary> /// </summary>
......
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