Commit 47ed4887 authored by Brickner_cp's avatar Brickner_cp

new packet builder design

parent bcd8ec16
...@@ -68,18 +68,24 @@ namespace PcapDotNet.Packets.Test ...@@ -68,18 +68,24 @@ namespace PcapDotNet.Packets.Test
[TestMethod] [TestMethod]
public void RandomIgmpTest() public void RandomIgmpTest()
{ {
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 = new IpV4Layer
ushort ipV4Identification = random.NextUShort(); {
byte ipV4Ttl = random.NextByte(); TypeOfService = random.NextByte(),
IpV4Fragmentation ipV4Fragmentation = random.NextIpV4Fragmentation(); Identification = random.NextUShort(),
IpV4Address ipV4Source = new IpV4Address(random.NextUInt()); Ttl = random.NextByte(),
IpV4Address ipV4Destination = new IpV4Address(random.NextUInt()); Fragmentation = random.NextIpV4Fragmentation(),
IpV4Options ipV4Options = random.NextIpV4Options(); Source = random.NextIpV4Address(),
Destination = random.NextIpV4Address(),
Options = random.NextIpV4Options()
};
for (int i = 0; i != 1000; ++i) for (int i = 0; i != 1000; ++i)
{ {
...@@ -93,7 +99,7 @@ namespace PcapDotNet.Packets.Test ...@@ -93,7 +99,7 @@ namespace PcapDotNet.Packets.Test
IpV4Address[] igmpSourceAddresses = null; IpV4Address[] igmpSourceAddresses = null;
IgmpGroupRecord[] igmpGroupRecords = null; IgmpGroupRecord[] igmpGroupRecords = null;
Packet packet; IgmpLayer igmpLayer;
switch (igmpMessageType) switch (igmpMessageType)
{ {
case IgmpMessageType.MembershipQuery: case IgmpMessageType.MembershipQuery:
...@@ -102,19 +108,29 @@ namespace PcapDotNet.Packets.Test ...@@ -102,19 +108,29 @@ namespace PcapDotNet.Packets.Test
{ {
case IgmpQueryVersion.Version1: case IgmpQueryVersion.Version1:
igmpMaxResponseTime = TimeSpan.Zero; igmpMaxResponseTime = TimeSpan.Zero;
packet = PacketBuilder.EthernetIpV4IgmpQueryVersion1(DateTime.Now, igmpLayer = new IgmpQueryVersion1Layer
ethernetSource, ethernetDestination, {
ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl, GroupAddress = igmpGroupAddress
ipV4Source, ipV4Destination, ipV4Options, };
igmpGroupAddress);
// packet = PacketBuilder.EthernetIpV4IgmpQueryVersion1(DateTime.Now,
// ethernetSource, ethernetDestination,
// ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl,
// ipV4Source, ipV4Destination, ipV4Options,
// igmpGroupAddress);
break; break;
case IgmpQueryVersion.Version2: case IgmpQueryVersion.Version2:
packet = PacketBuilder.EthernetIpV4IgmpQueryVersion2(DateTime.Now, igmpLayer = new IgmpQueryVersion2Layer
ethernetSource, ethernetDestination, {
ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl, MaxResponseTime = igmpMaxResponseTime,
ipV4Source, ipV4Destination, ipV4Options, GroupAddress = igmpGroupAddress
igmpMaxResponseTime, igmpGroupAddress); };
// packet = PacketBuilder.EthernetIpV4IgmpQueryVersion2(DateTime.Now,
// ethernetSource, ethernetDestination,
// ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl,
// ipV4Source, ipV4Destination, ipV4Options,
// igmpMaxResponseTime, igmpGroupAddress);
break; break;
case IgmpQueryVersion.Version3: case IgmpQueryVersion.Version3:
...@@ -124,14 +140,24 @@ namespace PcapDotNet.Packets.Test ...@@ -124,14 +140,24 @@ namespace PcapDotNet.Packets.Test
IgmpDatagram.MaxVersion3MaxResponseTime - TimeSpan.FromTicks(1)); IgmpDatagram.MaxVersion3MaxResponseTime - TimeSpan.FromTicks(1));
igmpQueryInterval = random.NextTimeSpan(TimeSpan.Zero, IgmpDatagram.MaxQueryInterval - TimeSpan.FromTicks(1)); igmpQueryInterval = random.NextTimeSpan(TimeSpan.Zero, IgmpDatagram.MaxQueryInterval - TimeSpan.FromTicks(1));
igmpSourceAddresses = random.NextIpV4Addresses(random.Next(1000)); igmpSourceAddresses = random.NextIpV4Addresses(random.Next(1000));
packet = PacketBuilder.EthernetIpV4IgmpQueryVersion3(DateTime.Now, igmpLayer = new IgmpQueryVersion3Layer
ethernetSource, ethernetDestination, {
ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl, MaxResponseTime = igmpMaxResponseTime,
ipV4Source, ipV4Destination, ipV4Options, GroupAddress = igmpGroupAddress,
igmpMaxResponseTime, igmpGroupAddress, IsSuppressRouterSideProcessing = igmpIsSuppressRouterSideProcessing.Value,
igmpIsSuppressRouterSideProcessing.Value, QueryRobustnessVariable = igmpQueryRobustnessVariable.Value,
igmpQueryRobustnessVariable.Value, igmpQueryInterval.Value, QueryInterval = igmpQueryInterval.Value,
igmpSourceAddresses); SourceAddresses = igmpSourceAddresses
};
// packet = PacketBuilder.EthernetIpV4IgmpQueryVersion3(DateTime.Now,
// ethernetSource, ethernetDestination,
// ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl,
// ipV4Source, ipV4Destination, ipV4Options,
// igmpMaxResponseTime, igmpGroupAddress,
// igmpIsSuppressRouterSideProcessing.Value,
// igmpQueryRobustnessVariable.Value, igmpQueryInterval.Value,
// igmpSourceAddresses);
break; break;
default: default:
...@@ -141,43 +167,65 @@ namespace PcapDotNet.Packets.Test ...@@ -141,43 +167,65 @@ namespace PcapDotNet.Packets.Test
case IgmpMessageType.MembershipReportVersion1: case IgmpMessageType.MembershipReportVersion1:
igmpMaxResponseTime = TimeSpan.Zero; igmpMaxResponseTime = TimeSpan.Zero;
packet = PacketBuilder.EthernetIpV4IgmpReportVersion1(DateTime.Now, igmpLayer = new IgmpReportVersion1Layer
ethernetSource, ethernetDestination, {
ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl, GroupAddress = igmpGroupAddress
ipV4Source, ipV4Destination, ipV4Options, };
igmpGroupAddress);
// packet = PacketBuilder.EthernetIpV4IgmpReportVersion1(DateTime.Now,
// ethernetSource, ethernetDestination,
// ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl,
// ipV4Source, ipV4Destination, ipV4Options,
// igmpGroupAddress);
break; break;
case IgmpMessageType.MembershipReportVersion2: case IgmpMessageType.MembershipReportVersion2:
packet = PacketBuilder.EthernetIpV4IgmpReportVersion2(DateTime.Now, igmpLayer = new IgmpReportVersion2Layer
ethernetSource, ethernetDestination, {
ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl, MaxResponseTime = igmpMaxResponseTime,
ipV4Source, ipV4Destination, ipV4Options, GroupAddress = igmpGroupAddress
igmpMaxResponseTime, igmpGroupAddress); };
// packet = PacketBuilder.EthernetIpV4IgmpReportVersion2(DateTime.Now,
// ethernetSource, ethernetDestination,
// ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl,
// ipV4Source, ipV4Destination, ipV4Options,
// igmpMaxResponseTime, igmpGroupAddress);
break; break;
case IgmpMessageType.LeaveGroupVersion2: case IgmpMessageType.LeaveGroupVersion2:
packet = PacketBuilder.EthernetIpV4IgmpLeaveGroupVersion2(DateTime.Now, igmpLayer = new IgmpLeaveGroupVersion2Layer
ethernetSource, ethernetDestination, {
ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl, MaxResponseTime = igmpMaxResponseTime,
ipV4Source, ipV4Destination, ipV4Options, GroupAddress = igmpGroupAddress
igmpMaxResponseTime, igmpGroupAddress); };
// packet = PacketBuilder.EthernetIpV4IgmpLeaveGroupVersion2(DateTime.Now,
// ethernetSource, ethernetDestination,
// ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl,
// ipV4Source, ipV4Destination, ipV4Options,
// igmpMaxResponseTime, igmpGroupAddress);
break; break;
case IgmpMessageType.MembershipReportVersion3: case IgmpMessageType.MembershipReportVersion3:
igmpMaxResponseTime = TimeSpan.Zero; igmpMaxResponseTime = TimeSpan.Zero;
igmpGroupRecords = random.NextIgmpGroupRecords(random.Next(100)); igmpGroupRecords = random.NextIgmpGroupRecords(random.Next(100));
packet = PacketBuilder.EthernetIpV4IgmpReportVersion3(DateTime.Now, igmpLayer = new IgmpReportVersion3Layer
ethernetSource, ethernetDestination, {
ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl, GroupRecords = igmpGroupRecords
ipV4Source, ipV4Destination, ipV4Options, };
igmpGroupRecords); // packet = PacketBuilder.EthernetIpV4IgmpReportVersion3(DateTime.Now,
// ethernetSource, ethernetDestination,
// ipV4TypeOfService, ipV4Identification, ipV4Fragmentation, ipV4Ttl,
// ipV4Source, ipV4Destination, ipV4Options,
// igmpGroupRecords);
break; break;
default: default:
continue; continue;
} }
Packet packet = new PacketBuilder2(ethernetLayer, ipV4Layer, igmpLayer).Build(DateTime.Now);
Assert.IsTrue(packet.IsValid, "IsValid"); Assert.IsTrue(packet.IsValid, "IsValid");
// IGMP // IGMP
......
...@@ -3,6 +3,7 @@ using System.Collections.Generic; ...@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using PcapDotNet.Packets.Arp; using PcapDotNet.Packets.Arp;
using PcapDotNet.Packets.Ethernet; using PcapDotNet.Packets.Ethernet;
using PcapDotNet.Packets.Igmp;
using PcapDotNet.Packets.IpV4; using PcapDotNet.Packets.IpV4;
using PcapDotNet.Packets.Transport; using PcapDotNet.Packets.Transport;
...@@ -365,6 +366,128 @@ namespace PcapDotNet.Packets ...@@ -365,6 +366,128 @@ namespace PcapDotNet.Packets
} }
} }
public abstract class IgmpLayer : SimpleLayer, IIpV4NextLayer
{
public IpV4Protocol PreviousLayerProtocol
{
get { return IpV4Protocol.InternetGroupManagementProtocol; }
}
}
public abstract class SimpleIgmpLayer : IgmpLayer
{
public IpV4Address GroupAddress { get; set; }
public abstract IgmpMessageType MessageType { get; }
public abstract TimeSpan MaxResponseTimeValue { get; }
public override int Length
{
get { return IgmpDatagram.HeaderLength; }
}
protected override void Write(byte[] buffer, int offset)
{
IgmpDatagram.WriteHeader(buffer, offset,
MessageType, MaxResponseTimeValue, GroupAddress);
}
}
public abstract class IgmpVersion1Layer : SimpleIgmpLayer
{
public override TimeSpan MaxResponseTimeValue
{
get { return TimeSpan.Zero; }
}
}
public abstract class IgmpVersion2Layer : SimpleIgmpLayer
{
public TimeSpan MaxResponseTime { get; set; }
public override TimeSpan MaxResponseTimeValue
{
get { return MaxResponseTime; }
}
}
public class IgmpQueryVersion1Layer : IgmpVersion1Layer
{
public override IgmpMessageType MessageType
{
get { return IgmpMessageType.MembershipQuery; }
}
}
public class IgmpQueryVersion2Layer : IgmpVersion2Layer
{
public override IgmpMessageType MessageType
{
get { return IgmpMessageType.MembershipQuery; }
}
}
public class IgmpQueryVersion3Layer : IgmpLayer
{
public TimeSpan MaxResponseTime { get; set; }
public IpV4Address GroupAddress { get; set; }
public bool IsSuppressRouterSideProcessing { get; set; }
public byte QueryRobustnessVariable{get; set ;}
public TimeSpan QueryInterval{get; set ;}
public IpV4Address[] SourceAddresses{get; set ;}
public override int Length
{
get { return IgmpDatagram.GetQueryVersion3Length(SourceAddresses.Length); }
}
protected override void Write(byte[] buffer, int offset)
{
IgmpDatagram.WriteQueryVersion3(buffer, offset,
MaxResponseTime, GroupAddress, IsSuppressRouterSideProcessing, QueryRobustnessVariable,
QueryInterval, SourceAddresses);
}
}
public class IgmpReportVersion1Layer : IgmpVersion1Layer
{
public override IgmpMessageType MessageType
{
get { return IgmpMessageType.MembershipReportVersion1; }
}
}
public class IgmpReportVersion2Layer : IgmpVersion2Layer
{
public override IgmpMessageType MessageType
{
get { return IgmpMessageType.MembershipReportVersion2; }
}
}
public class IgmpLeaveGroupVersion2Layer : IgmpVersion2Layer
{
public override IgmpMessageType MessageType
{
get { return IgmpMessageType.LeaveGroupVersion2; }
}
}
public class IgmpReportVersion3Layer : IgmpLayer
{
public IgmpGroupRecord[] GroupRecords{get; set ;}
public override int Length
{
get { return IgmpDatagram.GetReportVersion3Length(GroupRecords); }
}
protected override void Write(byte[] buffer, int offset)
{
IgmpDatagram.WriteReportVersion3(buffer, offset, GroupRecords);
}
}
public class PacketBuilder2 public class PacketBuilder2
{ {
public PacketBuilder2(params ILayer[] layers) public PacketBuilder2(params ILayer[] layers)
......
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