Commit 47ed4887 authored by Brickner_cp's avatar Brickner_cp

new packet builder design

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