Commit 4fdf1ff5 authored by Brickner_cp's avatar Brickner_cp

Reafctoring - only empty constructors for all Layer types.

CA2227 (Usage): Collection properties should be read only - Can be suppressed only if the Collection is a ReadOnlyCollection<T>
parent 4863044c
......@@ -538,6 +538,8 @@ namespace PcapDotNet.Core.Test
{
communicator.SetFilter("ether src " + sourceMac + " and ether dst " + destinationMac);
communicator.SetSamplingMethod(new SamplingMethodFirstAfterInterval(TimeSpan.FromSeconds(1)));
int numPacketsGot;
communicator.ReceiveSomePackets(out numPacketsGot, 100, p => { });
Packet expectedPacket = _random.NextEthernetPacket(60, sourceMac, destinationMac);
List<Packet> packets = new List<Packet>(6);
Thread thread = new Thread(() => packets.AddRange(communicator.ReceivePackets(6)));
......
......@@ -77,7 +77,7 @@ namespace PcapDotNet.Packets.Test
Assert.AreEqual(EthernetType.Arp, packet.Ethernet.EtherType, "Ethernet EtherType");
// Arp
Assert.AreEqual(ArpDatagram.HeaderBaseLength + 2 * arpLayer.SenderHardwareAddress.Count+ 2 * arpLayer.SenderProtocolAddress.Count, packet.Ethernet.Arp.Length, "Arp length");
Assert.AreEqual(ArpDatagram.HeaderBaseLength + 2 * arpLayer.SenderHardwareAddress.Count + 2 * arpLayer.SenderProtocolAddress.Count, packet.Ethernet.Arp.Length, "Arp length");
Assert.AreEqual(ArpHardwareType.Ethernet, packet.Ethernet.Arp.HardwareType, "Arp hardware type");
Assert.AreEqual(arpLayer, packet.Ethernet.Arp.ExtractLayer(), "ARP Layer");
Assert.AreNotEqual(arpLayer, random.NextArpLayer(), "ARP Layer");
......@@ -90,15 +90,19 @@ namespace PcapDotNet.Packets.Test
public void ArpProtocolIpV4Address()
{
Packet packet = PacketBuilder.Build(DateTime.Now,
new EthernetLayer
{
Source = new MacAddress(),
EtherType = EthernetType.QInQ
},
new ArpLayer(new byte[8], new byte[] { 1, 2, 3, 4 }, new byte[8], new byte[] { 11, 22, 33, 44 })
{
Operation = ArpOperation.Request,
});
new EthernetLayer
{
Source = new MacAddress(),
EtherType = EthernetType.QInQ
},
new ArpLayer
{
SenderHardwareAddress = new byte[8].AsReadOnly(),
SenderProtocolAddress = new byte[] { 1, 2, 3, 4 }.AsReadOnly(),
TargetHardwareAddress = new byte[8].AsReadOnly(),
TargetProtocolAddress = new byte[] { 11, 22, 33, 44 }.AsReadOnly(),
Operation = ArpOperation.Request,
});
Assert.AreEqual(new IpV4Address("1.2.3.4"), packet.Ethernet.Arp.SenderProtocolIpV4Address);
Assert.AreEqual(new IpV4Address("11.22.33.44"), packet.Ethernet.Arp.TargetProtocolIpV4Address);
......@@ -109,15 +113,19 @@ namespace PcapDotNet.Packets.Test
public void ArpIncosistentSenderAddressSizeTest()
{
Packet packet = PacketBuilder.Build(DateTime.Now,
new EthernetLayer
{
Source = new MacAddress(),
EtherType = EthernetType.IpV4
},
new ArpLayer(new byte[4], new byte[6], new byte[5], new byte[6])
{
Operation = ArpOperation.Request,
});
new EthernetLayer
{
Source = new MacAddress(),
EtherType = EthernetType.IpV4
},
new ArpLayer
{
SenderHardwareAddress = new byte[4].AsReadOnly(),
SenderProtocolAddress = new byte[6].AsReadOnly(),
TargetHardwareAddress = new byte[5].AsReadOnly(),
TargetProtocolAddress = new byte[6].AsReadOnly(),
Operation = ArpOperation.Request,
});
Assert.IsNull(packet);
Assert.Fail();
}
......@@ -132,8 +140,12 @@ namespace PcapDotNet.Packets.Test
Source = new MacAddress(),
EtherType = EthernetType.IpV4
},
new ArpLayer(new byte[4], new byte[6], new byte[4], new byte[7])
new ArpLayer
{
SenderHardwareAddress = new byte[4].AsReadOnly(),
SenderProtocolAddress = new byte[6].AsReadOnly(),
TargetHardwareAddress = new byte[4].AsReadOnly(),
TargetProtocolAddress = new byte[7].AsReadOnly(),
Operation = ArpOperation.Request,
});
Assert.IsNull(packet);
......
......@@ -262,14 +262,15 @@ namespace PcapDotNet.Packets.Test
// non zero max response code report version 3
Packet reportVersion3 = PacketBuilder.Build(DateTime.Now, new EthernetLayer(), new IpV4Layer(),
new IgmpReportVersion3Layer(
new[]
{
new IgmpGroupRecord(
IgmpRecordType.CurrentStateRecordModeIsExclude,
IpV4Address.Zero, new List<IpV4Address>(), Datagram.Empty)
}
));
new IgmpReportVersion3Layer
{
GroupRecords = new[]
{
new IgmpGroupRecord(
IgmpRecordType.CurrentStateRecordModeIsExclude,
IpV4Address.Zero, new List<IpV4Address>(), Datagram.Empty)
}.AsReadOnly()
});
buffer = new byte[reportVersion3.Length];
reportVersion3.Buffer.BlockCopy(0, buffer, 0, buffer.Length);
......
......@@ -114,12 +114,15 @@ namespace PcapDotNet.Packets.TestUtils
{
byte hardwareAddressLength = random.NextByte();
byte protocolAddressLength = random.NextByte();
return new ArpLayer(random.NextBytes(hardwareAddressLength).AsReadOnly(), random.NextBytes(protocolAddressLength).AsReadOnly(),
random.NextBytes(hardwareAddressLength).AsReadOnly(),random.NextBytes(protocolAddressLength).AsReadOnly())
{
ProtocolType = random.NextEnum<EthernetType>(),
Operation = random.NextEnum<ArpOperation>(),
};
return new ArpLayer
{
SenderHardwareAddress = random.NextBytes(hardwareAddressLength).AsReadOnly(),
SenderProtocolAddress = random.NextBytes(protocolAddressLength).AsReadOnly(),
TargetHardwareAddress = random.NextBytes(hardwareAddressLength).AsReadOnly(),
TargetProtocolAddress = random.NextBytes(protocolAddressLength).AsReadOnly(),
ProtocolType = random.NextEnum<EthernetType>(),
Operation = random.NextEnum<ArpOperation>(),
};
}
// IPv4
......@@ -540,8 +543,9 @@ namespace PcapDotNet.Packets.TestUtils
IgmpDatagram.MaxVersion3MaxResponseTime - TimeSpan.FromTicks(1));
igmpQueryInterval = random.NextTimeSpan(TimeSpan.Zero, IgmpDatagram.MaxQueryInterval - TimeSpan.FromTicks(1));
igmpSourceAddresses = random.NextIpV4Addresses(random.Next(1000));
return new IgmpQueryVersion3Layer(igmpSourceAddresses)
return new IgmpQueryVersion3Layer
{
SourceAddresses = igmpSourceAddresses.AsReadOnly(),
MaxResponseTime = igmpMaxResponseTime,
GroupAddress = igmpGroupAddress,
IsSuppressRouterSideProcessing = igmpIsSuppressRouterSideProcessing.Value,
......@@ -577,7 +581,10 @@ namespace PcapDotNet.Packets.TestUtils
igmpGroupRecords = random.NextIgmpGroupRecords(random.Next(100));
if (igmpGroupRecords.Count() == 0 && random.NextBool())
return new IgmpReportVersion3Layer();
return new IgmpReportVersion3Layer(igmpGroupRecords);
return new IgmpReportVersion3Layer
{
GroupRecords = igmpGroupRecords.AsReadOnly()
};
default:
throw new InvalidOperationException("Invalid message type " + igmpMessageType);
......@@ -673,7 +680,7 @@ namespace PcapDotNet.Packets.TestUtils
}
// ICMP
public static IcmpLayer NextIcmpLayer(this Random random)
{
IcmpMessageType icmpMessageType = random.NextEnum(IcmpMessageType.DomainNameReply);
......@@ -683,170 +690,170 @@ namespace PcapDotNet.Packets.TestUtils
{
case IcmpMessageType.DestinationUnreachable:
return new IcmpDestinationUnreachableLayer
{
Code = random.NextEnum<IcmpCodeDestinationUnreachable>(),
Checksum = checksum,
NextHopMaximumTransmissionUnit = random.NextUShort(),
};
{
Code = random.NextEnum<IcmpCodeDestinationUnreachable>(),
Checksum = checksum,
NextHopMaximumTransmissionUnit = random.NextUShort(),
};
case IcmpMessageType.TimeExceeded:
return new IcmpTimeExceededLayer
{
Code = random.NextEnum<IcmpCodeTimeExceeded>(),
Checksum = checksum,
};
{
Code = random.NextEnum<IcmpCodeTimeExceeded>(),
Checksum = checksum,
};
case IcmpMessageType.ParameterProblem:
return new IcmpParameterProblemLayer
{
Checksum = checksum,
Pointer = random.NextByte()
};
{
Checksum = checksum,
Pointer = random.NextByte()
};
case IcmpMessageType.SourceQuench:
return new IcmpSourceQuenchLayer
{
Checksum = checksum
};
{
Checksum = checksum
};
case IcmpMessageType.Redirect:
return new IcmpRedirectLayer
{
Code = random.NextEnum<IcmpCodeRedirect>(),
Checksum = checksum,
GatewayInternetAddress = random.NextIpV4Address()
};
{
Code = random.NextEnum<IcmpCodeRedirect>(),
Checksum = checksum,
GatewayInternetAddress = random.NextIpV4Address()
};
case IcmpMessageType.Echo:
return new IcmpEchoLayer
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort()
};
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort()
};
case IcmpMessageType.EchoReply:
return new IcmpEchoReplyLayer
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort()
};
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort()
};
case IcmpMessageType.Timestamp:
return new IcmpTimestampLayer
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
OriginateTimestamp = random.NextIpV4TimeOfDay(),
ReceiveTimestamp = random.NextIpV4TimeOfDay(),
TransmitTimestamp = random.NextIpV4TimeOfDay()
};
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
OriginateTimestamp = random.NextIpV4TimeOfDay(),
ReceiveTimestamp = random.NextIpV4TimeOfDay(),
TransmitTimestamp = random.NextIpV4TimeOfDay()
};
case IcmpMessageType.TimestampReply:
return new IcmpTimestampReplyLayer
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
OriginateTimestamp = random.NextIpV4TimeOfDay(),
ReceiveTimestamp = random.NextIpV4TimeOfDay(),
TransmitTimestamp = random.NextIpV4TimeOfDay()
};
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
OriginateTimestamp = random.NextIpV4TimeOfDay(),
ReceiveTimestamp = random.NextIpV4TimeOfDay(),
TransmitTimestamp = random.NextIpV4TimeOfDay()
};
case IcmpMessageType.InformationRequest:
return new IcmpInformationRequestLayer
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
};
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
};
case IcmpMessageType.InformationReply:
return new IcmpInformationReplyLayer
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
};
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
};
case IcmpMessageType.RouterAdvertisement:
return new IcmpRouterAdvertisementLayer(random.NextIcmpRouterAdvertisementEntries(random.Next(10)).ToList())
{
Checksum = checksum,
Lifetime = random.NextTimeSpan(TimeSpan.Zero, TimeSpan.FromSeconds(ushort.MaxValue)),
};
return new IcmpRouterAdvertisementLayer
{
Entries = random.NextIcmpRouterAdvertisementEntries(random.Next(10)).ToList().AsReadOnly(),
Checksum = checksum,
Lifetime = random.NextTimeSpan(TimeSpan.Zero, TimeSpan.FromSeconds(ushort.MaxValue)),
};
case IcmpMessageType.RouterSolicitation:
return new IcmpRouterSolicitationLayer
{
Checksum = checksum,
};
{
Checksum = checksum,
};
case IcmpMessageType.AddressMaskRequest:
return new IcmpAddressMaskRequestLayer
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
AddressMask = random.NextIpV4Address()
};
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
AddressMask = random.NextIpV4Address()
};
case IcmpMessageType.AddressMaskReply:
return new IcmpAddressMaskReplyLayer
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
AddressMask = random.NextIpV4Address()
};
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
AddressMask = random.NextIpV4Address()
};
case IcmpMessageType.TraceRoute:
return new IcmpTraceRouteLayer
{
Code = random.NextEnum<IcmpCodeTraceRoute>(),
Checksum = checksum,
Identification = random.NextUShort(),
OutboundHopCount = random.NextUShort(),
ReturnHopCount = random.NextUShort(),
OutputLinkSpeed = random.NextUInt(),
OutputLinkMaximumTransmissionUnit = random.NextUInt(),
};
{
Code = random.NextEnum<IcmpCodeTraceRoute>(),
Checksum = checksum,
Identification = random.NextUShort(),
OutboundHopCount = random.NextUShort(),
ReturnHopCount = random.NextUShort(),
OutputLinkSpeed = random.NextUInt(),
OutputLinkMaximumTransmissionUnit = random.NextUInt(),
};
case IcmpMessageType.ConversionFailed:
return new IcmpConversionFailedLayer
{
Code = random.NextEnum<IcmpCodeConversionFailed>(),
Checksum = checksum,
Pointer = random.NextUInt(),
};
{
Code = random.NextEnum<IcmpCodeConversionFailed>(),
Checksum = checksum,
Pointer = random.NextUInt(),
};
case IcmpMessageType.DomainNameRequest:
return new IcmpDomainNameRequestLayer
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
};
{
Checksum = checksum,
Identifier = random.NextUShort(),
SequenceNumber = random.NextUShort(),
};
case IcmpMessageType.DomainNameReply:
throw new NotSupportedException("Message Type " + icmpMessageType + " is not supported");
case IcmpMessageType.SecurityFailures:
return new IcmpSecurityFailuresLayer
{
Code = random.NextEnum<IcmpCodeSecurityFailure>(),
Checksum = checksum,
Pointer = random.NextUShort()
};
{
Code = random.NextEnum<IcmpCodeSecurityFailure>(),
Checksum = checksum,
Pointer = random.NextUShort()
};
default:
throw new InvalidOperationException("Invalid icmpMessageType " + icmpMessageType);
}
}
public static IEnumerable<ILayer> NextIcmpPayloadLayers(this Random random, IcmpLayer icmpLayer)
......
......@@ -154,11 +154,15 @@ namespace PcapDotNet.Packets.Arp
/// </summary>
public override ILayer ExtractLayer()
{
return new ArpLayer(SenderHardwareAddress, SenderProtocolAddress, TargetHardwareAddress, TargetProtocolAddress)
{
ProtocolType = ProtocolType,
Operation = Operation,
};
return new ArpLayer
{
SenderHardwareAddress = SenderHardwareAddress,
SenderProtocolAddress = SenderProtocolAddress,
TargetHardwareAddress = TargetHardwareAddress,
TargetProtocolAddress = TargetProtocolAddress,
ProtocolType = ProtocolType,
Operation = Operation,
};
}
/// <summary>
......
......@@ -14,18 +14,10 @@ namespace PcapDotNet.Packets.Arp
public class ArpLayer : Layer, IEthernetNextLayer
{
/// <summary>
/// Create an ARP layer by giving the different addresses.
/// Create an ARP layer.
/// </summary>
/// <param name="senderHardwareAddress">Hardware address of the sender.</param>
/// <param name="senderProtocolAddress">Protocol address of the sender.</param>
/// <param name="targetHardwareAddress">Hardware address of the intended receiver. This field is ignored in requests.</param>
/// <param name="targetProtocolAddress">Protocol address of the intended receiver.</param>
public ArpLayer(IList<byte> senderHardwareAddress, IList<byte> senderProtocolAddress, IList<byte> targetHardwareAddress, IList<byte> targetProtocolAddress)
public ArpLayer()
{
_senderHardwareAddress = senderHardwareAddress;
_senderProtocolAddress = senderProtocolAddress;
_targetHardwareAddress = targetHardwareAddress;
_targetProtocolAddress = targetProtocolAddress;
}
/// <summary>
......@@ -41,23 +33,27 @@ namespace PcapDotNet.Packets.Arp
/// <summary>
/// Hardware address of the sender.
/// </summary>
public IList<byte> SenderHardwareAddress { get { return _senderHardwareAddress; } }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public ReadOnlyCollection<byte> SenderHardwareAddress { get; set; }
/// <summary>
/// Protocol address of the sender.
/// </summary>
public IList<byte> SenderProtocolAddress { get { return _senderProtocolAddress; } }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public ReadOnlyCollection<byte> SenderProtocolAddress { get; set; }
/// <summary>
/// Hardware address of the intended receiver.
/// This field is ignored in requests.
/// </summary>
public IList<byte> TargetHardwareAddress { get { return _targetHardwareAddress; } }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public ReadOnlyCollection<byte> TargetHardwareAddress { get; set; }
/// <summary>
/// Protocol address of the intended receiver.
/// </summary>
public IList<byte> TargetProtocolAddress { get { return _targetProtocolAddress; } }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public ReadOnlyCollection<byte> TargetProtocolAddress { get; set; }
/// <summary>
/// The Ethernet Type the Ethernet layer should write when this layer is the Ethernet payload.
......@@ -150,12 +146,6 @@ namespace PcapDotNet.Packets.Arp
{
return base.GetHashCode() ^
(((ushort)ProtocolType << 16) + (ushort)Operation);
}
private readonly IList<byte> _senderHardwareAddress;
private readonly IList<byte> _senderProtocolAddress;
private readonly IList<byte> _targetHardwareAddress;
private readonly IList<byte> _targetProtocolAddress;
}
}
\ No newline at end of file
......@@ -109,6 +109,7 @@ namespace PcapDotNet.Packets.Gre
/// The Routing field is a list of Source Route Entries (SREs).
/// null iff the routing isn't present.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public ReadOnlyCollection<GreSourceRouteEntry> Routing { get; set; }
/// <summary>
......
......@@ -108,11 +108,12 @@ namespace PcapDotNet.Packets.Icmp
/// </summary>
public override ILayer ExtractLayer()
{
return new IcmpRouterAdvertisementLayer(Entries.ToList())
{
Checksum = Checksum,
Lifetime = Lifetime,
};
return new IcmpRouterAdvertisementLayer
{
Entries = Entries.ToList().AsReadOnly(),
Checksum = Checksum,
Lifetime = Lifetime,
};
}
/// <summary>
......
......@@ -13,16 +13,10 @@ namespace PcapDotNet.Packets.Icmp
public class IcmpRouterAdvertisementLayer : IcmpLayer
{
/// <summary>
/// Creates an instance with the given router advertisement entries.
/// Creates an ICMP layer instance.
/// </summary>
/// <param name="entries">
/// The pairs of sending router's IP address(es) on the interface from which this message is sent
/// and the preferability of each Router Address[i] as a default router address, relative to other router addresses on the same subnet.
/// A signed, twos-complement value; higher values mean more preferable.
/// </param>
public IcmpRouterAdvertisementLayer(IList<IcmpRouterAdvertisementEntry> entries)
public IcmpRouterAdvertisementLayer()
{
_entries = entries;
}
/// <summary>
......@@ -35,7 +29,8 @@ namespace PcapDotNet.Packets.Icmp
/// and the preferability of each Router Address[i] as a default router address, relative to other router addresses on the same subnet.
/// A signed, twos-complement value; higher values mean more preferable.
/// </summary>
public IList<IcmpRouterAdvertisementEntry> Entries { get { return _entries; } }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public ReadOnlyCollection<IcmpRouterAdvertisementEntry> Entries { get; set; }
/// <summary>
/// The value of this field determines the format of the remaining data.
......@@ -93,7 +88,5 @@ namespace PcapDotNet.Packets.Icmp
return other != null &&
Entries.SequenceEqual(other.Entries);
}
private readonly IList<IcmpRouterAdvertisementEntry> _entries;
}
}
\ No newline at end of file
......@@ -508,8 +508,9 @@ namespace PcapDotNet.Packets.Igmp
};
case IgmpQueryVersion.Version3:
return new IgmpQueryVersion3Layer(SourceAddresses)
return new IgmpQueryVersion3Layer
{
SourceAddresses = SourceAddresses,
MaxResponseTime = MaxResponseTime,
GroupAddress = GroupAddress,
IsSuppressRouterSideProcessing = IsSuppressRouterSideProcessing,
......@@ -542,7 +543,10 @@ namespace PcapDotNet.Packets.Igmp
};
case IgmpMessageType.MembershipReportVersion3:
return new IgmpReportVersion3Layer(GroupRecords.Select(record => record.ToGroupRecord()).ToList());
return new IgmpReportVersion3Layer
{
GroupRecords = GroupRecords.Select(record => record.ToGroupRecord()).ToList().AsReadOnly()
};
default:
throw new InvalidOperationException("Invalid message type " + MessageType);
......
......@@ -14,22 +14,6 @@ namespace PcapDotNet.Packets.Igmp
/// </summary>
public class IgmpQueryVersion3Layer : IgmpLayer, IIgmpLayerWithGroupAddress
{
/// <summary>
/// A query on 0 source addresses.
/// </summary>
public IgmpQueryVersion3Layer()
:this(new List<IpV4Address>())
{
}
/// <summary>
/// A query on the given source addresses.
/// </summary>
public IgmpQueryVersion3Layer(IList<IpV4Address> sourceAddresses)
{
_sourceAddresses = sourceAddresses;
}
/// <summary>
/// The actual time allowed, called the Max Resp Time.
/// </summary>
......@@ -67,7 +51,8 @@ namespace PcapDotNet.Packets.Igmp
/// The Source Address [i] fields are a vector of n IP unicast addresses,
/// where n is the value in the Number of Sources (N) field.
/// </summary>
public IList<IpV4Address> SourceAddresses { get { return _sourceAddresses; } }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public ReadOnlyCollection<IpV4Address> SourceAddresses { get; set; }
/// <summary>
/// The number of bytes this layer will take.
......@@ -149,7 +134,5 @@ namespace PcapDotNet.Packets.Igmp
QueryInterval.Divide(2) <= other.QueryInterval && QueryInterval.Multiply(2) >= other.QueryInterval &&
SourceAddresses.SequenceEqual(other.SourceAddresses);
}
private readonly IList<IpV4Address> _sourceAddresses;
}
}
\ No newline at end of file
......@@ -13,32 +13,11 @@ namespace PcapDotNet.Packets.Igmp
/// </summary>
public class IgmpReportVersion3Layer : IgmpLayer
{
/// <summary>
/// Creates an instance with no group records.
/// </summary>
public IgmpReportVersion3Layer()
:this(new List<IgmpGroupRecord>())
{
}
/// <summary>
/// Creates an instance with the given group records.
/// </summary>
/// <param name="groupRecords">
/// Each Group Record is a block of fields containing information pertaining to the sender's membership in a single multicast group on the interface from which the Report is sent.
/// </param>
public IgmpReportVersion3Layer(IList<IgmpGroupRecord> groupRecords)
{
_groupRecords = groupRecords;
}
/// <summary>
/// Each Group Record is a block of fields containing information pertaining to the sender's membership in a single multicast group on the interface from which the Report is sent.
/// </summary>
public IList<IgmpGroupRecord> GroupRecords
{
get { return _groupRecords; }
}
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public ReadOnlyCollection<IgmpGroupRecord> GroupRecords { get; set;}
/// <summary>
/// The number of bytes this layer will take.
......@@ -100,7 +79,5 @@ namespace PcapDotNet.Packets.Igmp
return other != null &&
GroupRecords.SequenceEqual(other.GroupRecords);
}
private readonly IList<IgmpGroupRecord> _groupRecords;
}
}
\ No newline at end of file
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