Commit cd86ed94 authored by Brickner_cp's avatar Brickner_cp

Packet Builder design

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