Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
P
Pcap-Net
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Pcap-Net
Commits
47ed4887
Commit
47ed4887
authored
Nov 27, 2009
by
Brickner_cp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
new packet builder design
parent
bcd8ec16
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
219 additions
and
48 deletions
+219
-48
IgmpTests.cs
PcapDotNet/src/PcapDotNet.Packets.Test/IgmpTests.cs
+96
-48
PacketBuilder2.cs
PcapDotNet/src/PcapDotNet.Packets/PacketBuilder2.cs
+123
-0
No files found.
PcapDotNet/src/PcapDotNet.Packets.Test/IgmpTests.cs
View file @
47ed4887
...
...
@@ -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
...
...
PcapDotNet/src/PcapDotNet.Packets/PacketBuilder2.cs
View file @
47ed4887
...
...
@@ -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
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment