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
457e35b8
Commit
457e35b8
authored
Nov 27, 2009
by
Brickner_cp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ICMP
parent
7bf4249c
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
489 additions
and
33 deletions
+489
-33
IcmpTests.cs
PcapDotNet/src/PcapDotNet.Packets.Test/IcmpTests.cs
+77
-17
RandomPacketsExtensions.cs
...c/PcapDotNet.Packets.TestUtils/RandomPacketsExtensions.cs
+2
-7
Datagram.cs
PcapDotNet/src/PcapDotNet.Packets/Datagram.cs
+8
-0
EthernetDatagram.cs
...otNet/src/PcapDotNet.Packets/Ethernet/EthernetDatagram.cs
+10
-0
IcmpAddressMaskDatagram.cs
...et/src/PcapDotNet.Packets/Icmp/IcmpAddressMaskDatagram.cs
+1
-1
IcmpDatagram.cs
PcapDotNet/src/PcapDotNet.Packets/Icmp/IcmpDatagram.cs
+150
-1
IcmpRouterAdvertisementDatagram.cs
...capDotNet.Packets/Icmp/IcmpRouterAdvertisementDatagram.cs
+12
-0
IcmpTracerouteLayer.cs
PcapDotNet/src/PcapDotNet.Packets/IcmpTracerouteLayer.cs
+14
-0
IpV4Datagram.cs
PcapDotNet/src/PcapDotNet.Packets/IpV4/IpV4Datagram.cs
+15
-0
PacketBuilder2.cs
PcapDotNet/src/PcapDotNet.Packets/PacketBuilder2.cs
+200
-7
No files found.
PcapDotNet/src/PcapDotNet.Packets.Test/IcmpTests.cs
View file @
457e35b8
...
...
@@ -90,28 +90,88 @@ namespace PcapDotNet.Packets.Test
for
(
int
i
=
0
;
i
!=
1000
;
++
i
)
{
IpV4Layer
icmpIpV4Layer
=
new
IpV4Layer
{
TypeOfService
=
random
.
NextByte
(),
Identification
=
random
.
NextUShort
(),
Fragmentation
=
random
.
NextIpV4Fragmentation
(),
Ttl
=
random
.
NextByte
(),
Protocol
=
random
.
NextEnum
<
IpV4Protocol
>(),
Source
=
random
.
NextIpV4Address
(),
Destination
=
random
.
NextIpV4Address
(),
Options
=
random
.
NextIpV4Options
(),
};
IcmpLayer
icmpLayer
=
random
.
NextIcmpLayer
();
PayloadLayer
icmpIpV4PayloadLayer
=
new
PayloadLayer
{
Data
=
random
.
NextDatagram
(
random
.
Next
(
200
))
};
bool
isIpV4Payload
;
switch
(
icmpLayer
.
MessageType
)
{
case
IcmpMessageType
.
DestinationUnreachable
:
case
IcmpMessageType
.
TimeExceeded
:
case
IcmpMessageType
.
ParameterProblem
:
case
IcmpMessageType
.
SourceQuench
:
case
IcmpMessageType
.
Redirect
:
case
IcmpMessageType
.
ConversionFailed
:
isIpV4Payload
=
true
;
break
;
IcmpLayer
icmpLayer
=
random
.
NextIcmpLayer
();
case
IcmpMessageType
.
Echo
:
case
IcmpMessageType
.
EchoReply
:
case
IcmpMessageType
.
Timestamp
:
case
IcmpMessageType
.
TimestampReply
:
case
IcmpMessageType
.
InformationRequest
:
case
IcmpMessageType
.
InformationReply
:
case
IcmpMessageType
.
RouterAdvertisement
:
case
IcmpMessageType
.
RouterSolicitation
:
case
IcmpMessageType
.
AddressMaskRequest
:
case
IcmpMessageType
.
AddressMaskReply
:
case
IcmpMessageType
.
Traceroute
:
case
IcmpMessageType
.
DomainNameRequest
:
case
IcmpMessageType
.
SecurityFailures
:
isIpV4Payload
=
false
;
break
;
case
IcmpMessageType
.
DomainNameReply
:
default
:
throw
new
InvalidOperationException
(
"Invalid icmpMessageType "
+
icmpLayer
.
MessageType
);
}
PacketBuilder2
packetBuilder2
;
IpV4Layer
icmpIpV4Layer
=
null
;
PayloadLayer
icmpIpV4PayloadLayer
=
null
;
if
(
isIpV4Payload
)
{
icmpIpV4Layer
=
new
IpV4Layer
{
TypeOfService
=
random
.
NextByte
(),
Identification
=
random
.
NextUShort
(),
Fragmentation
=
random
.
NextIpV4Fragmentation
(),
Ttl
=
random
.
NextByte
(),
Protocol
=
random
.
NextEnum
<
IpV4Protocol
>(),
Source
=
random
.
NextIpV4Address
(),
Destination
=
random
.
NextIpV4Address
(),
Options
=
random
.
NextIpV4Options
(),
};
Packet
packet
=
new
PacketBuilder2
(
ethernetLayer
,
ipV4Layer
,
icmpLayer
,
icmpIpV4Layer
,
icmpIpV4PayloadLayer
).
Build
(
DateTime
.
Now
);
icmpIpV4PayloadLayer
=
new
PayloadLayer
{
Data
=
random
.
NextDatagram
(
random
.
Next
(
200
))
};
packetBuilder2
=
new
PacketBuilder2
(
ethernetLayer
,
ipV4Layer
,
icmpLayer
,
icmpIpV4Layer
,
icmpIpV4PayloadLayer
);
}
else
packetBuilder2
=
new
PacketBuilder2
(
ethernetLayer
,
ipV4Layer
,
icmpLayer
);
Packet
packet
=
packetBuilder2
.
Build
(
DateTime
.
Now
);
Assert
.
IsTrue
(
packet
.
IsValid
,
"IsValid"
);
// Ethernet
ethernetLayer
.
EtherType
=
EthernetType
.
IpV4
;
Assert
.
AreEqual
(
ethernetLayer
,
packet
.
Ethernet
.
ExtractLayer
(),
"Ethernet Layer"
);
// IPv4
ipV4Layer
.
Protocol
=
IpV4Protocol
.
InternetControlMessageProtocol
;
Assert
.
AreEqual
(
ipV4Layer
,
packet
.
Ethernet
.
IpV4
.
ExtractLayer
());
Assert
.
AreEqual
(
ipV4Layer
.
Length
,
packet
.
Ethernet
.
IpV4
.
HeaderLength
);
Assert
.
IsTrue
(
packet
.
Ethernet
.
IpV4
.
IsHeaderChecksumCorrect
);
Assert
.
AreEqual
(
ipV4Layer
.
Length
+
icmpLayer
.
Length
+
(
isIpV4Payload
?
icmpIpV4Layer
.
Length
+
icmpIpV4PayloadLayer
.
Length
:
0
),
packet
.
Ethernet
.
IpV4
.
TotalLength
);
Assert
.
AreEqual
(
IpV4Datagram
.
DefaultVersion
,
packet
.
Ethernet
.
IpV4
.
Version
);
// ICMP
IcmpLayer
actualIcmpLayer
=
(
IcmpLayer
)
packet
.
Ethernet
.
IpV4
.
Icmp
.
ExtractLayer
();
Assert
.
AreEqual
(
icmpLayer
,
actualIcmpLayer
);
Assert
.
IsTrue
(
packet
.
Ethernet
.
IpV4
.
Icmp
.
IsChecksumCorrect
);
}
}
}
...
...
PcapDotNet/src/PcapDotNet.Packets.TestUtils/RandomPacketsExtensions.cs
View file @
457e35b8
...
...
@@ -476,12 +476,7 @@ namespace PcapDotNet.Packets.TestUtils
public
static
IcmpLayer
NextIcmpLayer
(
this
Random
random
)
{
IcmpMessageType
icmpMessageType
=
random
.
NextValue
(
new
[]
{
IcmpMessageType
.
DestinationUnreachable
,
IcmpMessageType
.
TimeExceeded
});
//random.NextEnum<IcmpMessageType>();
IcmpMessageType
icmpMessageType
=
random
.
NextEnum
<
IcmpMessageType
>(
IcmpMessageType
.
DomainNameReply
);
switch
(
icmpMessageType
)
{
...
...
@@ -500,7 +495,7 @@ namespace PcapDotNet.Packets.TestUtils
case
IcmpMessageType
.
ParameterProblem
:
return
new
IcmpParameterProblemLayer
{
Pointer
=
random
.
Next
UShort
()
Pointer
=
random
.
Next
Byte
()
};
case
IcmpMessageType
.
SourceQuench
:
...
...
PcapDotNet/src/PcapDotNet.Packets/Datagram.cs
View file @
457e35b8
...
...
@@ -76,6 +76,14 @@ namespace PcapDotNet.Packets
}
}
public
virtual
ILayer
ExtractLayer
()
{
return
new
PayloadLayer
{
Data
=
this
};
}
/// <summary>
/// Iterate through all the bytes in the datagram.
/// </summary>
...
...
PcapDotNet/src/PcapDotNet.Packets/Ethernet/EthernetDatagram.cs
View file @
457e35b8
...
...
@@ -88,6 +88,16 @@ namespace PcapDotNet.Packets.Ethernet
}
}
public
override
ILayer
ExtractLayer
()
{
return
new
EthernetLayer
()
{
Source
=
Source
,
Destination
=
Destination
,
EtherType
=
EtherType
,
};
}
/// <summary>
/// The Ethernet payload as an IPv4 datagram.
/// </summary>
...
...
PcapDotNet/src/PcapDotNet.Packets/Icmp/IcmpAddressMaskDatagram.cs
View file @
457e35b8
...
...
@@ -40,7 +40,7 @@ namespace PcapDotNet.Packets.Icmp
internal
static
void
WriteHeaderAdditional
(
byte
[]
buffer
,
int
offset
,
IpV4Address
addressMask
)
{
buffer
.
Write
(
offset
+
Offset
.
AddressMask
,
addressMask
,
Endianity
.
Big
);
buffer
.
Write
(
offset
,
addressMask
,
Endianity
.
Big
);
}
}
}
\ No newline at end of file
PcapDotNet/src/PcapDotNet.Packets/Icmp/IcmpDatagram.cs
View file @
457e35b8
using
System
;
using
System.Linq
;
namespace
PcapDotNet.Packets.Icmp
{
...
...
@@ -75,9 +76,157 @@ namespace PcapDotNet.Packets.Icmp
}
}
public
override
ILayer
ExtractLayer
()
{
switch
(
MessageType
)
{
case
IcmpMessageType
.
DestinationUnreachable
:
return
new
IcmpDestinationUnreachableLayer
{
Code
=
(
IcmpCodeDestinationUnrechable
)
Code
};
case
IcmpMessageType
.
TimeExceeded
:
return
new
IcmpTimeExceededLayer
{
Code
=
(
IcmpCodeTimeExceeded
)
Code
};
case
IcmpMessageType
.
ParameterProblem
:
return
new
IcmpParameterProblemLayer
{
Pointer
=
ParameterProblem
.
Pointer
};
case
IcmpMessageType
.
SourceQuench
:
return
new
IcmpSourceQuenchLayer
();
case
IcmpMessageType
.
Redirect
:
return
new
IcmpRedirectLayer
{
Code
=
(
IcmpCodeRedirect
)
Code
,
GatewayInternetAddress
=
Redirect
.
GatewayInternetAddress
};
case
IcmpMessageType
.
Echo
:
return
new
IcmpEchoLayer
{
Identifier
=
Echo
.
Identifier
,
SequenceNumber
=
Echo
.
SequenceNumber
};
case
IcmpMessageType
.
EchoReply
:
return
new
IcmpEchoReplyLayer
{
Identifier
=
EchoReply
.
Identifier
,
SequenceNumber
=
EchoReply
.
SequenceNumber
};
case
IcmpMessageType
.
Timestamp
:
return
new
IcmpTimestampLayer
{
Identifier
=
Timestamp
.
Identifier
,
SequenceNumber
=
Timestamp
.
SequenceNumber
,
OriginateTimestamp
=
Timestamp
.
OriginateTimestamp
,
ReceiveTimestamp
=
Timestamp
.
ReceiveTimestamp
,
TransmitTimestamp
=
Timestamp
.
TransmitTimestamp
};
case
IcmpMessageType
.
TimestampReply
:
return
new
IcmpTimestampReplyLayer
{
Identifier
=
TimestampReply
.
Identifier
,
SequenceNumber
=
TimestampReply
.
SequenceNumber
,
OriginateTimestamp
=
TimestampReply
.
OriginateTimestamp
,
ReceiveTimestamp
=
TimestampReply
.
ReceiveTimestamp
,
TransmitTimestamp
=
TimestampReply
.
TransmitTimestamp
,
};
case
IcmpMessageType
.
InformationRequest
:
return
new
IcmpInformationRequestLayer
{
Identifier
=
InformationRequest
.
Identifier
,
SequenceNumber
=
InformationRequest
.
SequenceNumber
};
case
IcmpMessageType
.
InformationReply
:
return
new
IcmpInformationReplyLayer
{
Identifier
=
InformationReply
.
Identifier
,
SequenceNumber
=
InformationReply
.
SequenceNumber
};
case
IcmpMessageType
.
RouterAdvertisement
:
return
new
IcmpRouterAdvertisementLayer
{
Lifetime
=
RouterAdvertisement
.
Lifetime
,
Entries
=
RouterAdvertisement
.
Entries
.
ToList
()
};
case
IcmpMessageType
.
RouterSolicitation
:
return
new
IcmpRouterSolicitationLayer
();
case
IcmpMessageType
.
AddressMaskRequest
:
return
new
IcmpAddressMaskRequestLayer
{
Identifier
=
AddressMaskRequest
.
Identifier
,
SequenceNumber
=
AddressMaskRequest
.
SequenceNumber
,
AddressMask
=
AddressMaskRequest
.
AddressMask
};
case
IcmpMessageType
.
AddressMaskReply
:
return
new
IcmpAddressMaskReplyLayer
{
Identifier
=
AddressMaskReply
.
Identifier
,
SequenceNumber
=
AddressMaskReply
.
SequenceNumber
,
AddressMask
=
AddressMaskReply
.
AddressMask
};
case
IcmpMessageType
.
Traceroute
:
return
new
IcmpTracerouteLayer
{
Code
=
(
IcmpCodeTraceroute
)
Code
,
Identification
=
Traceroute
.
Identification
,
OutboundHopCount
=
Traceroute
.
OutboundHopCount
,
ReturnHopCount
=
Traceroute
.
ReturnHopCount
,
OutputLinkSpeed
=
Traceroute
.
OutputLinkSpeed
,
OutputLinkMtu
=
Traceroute
.
OutputLinkMtu
};
case
IcmpMessageType
.
ConversionFailed
:
return
new
IcmpConversionFailedLayer
{
Code
=
(
IcmpCodeConversionFailed
)
Code
,
Pointer
=
ConversionFailed
.
Pointer
};
case
IcmpMessageType
.
DomainNameRequest
:
return
new
IcmpDomainNameRequestLayer
{
Identifier
=
DomainNameRequest
.
Identifier
,
SequenceNumber
=
DomainNameRequest
.
SequenceNumber
};
case
IcmpMessageType
.
DomainNameReply
:
throw
new
NotSupportedException
(
"Message Type "
+
MessageType
+
" is not supported"
);
case
IcmpMessageType
.
SecurityFailures
:
return
new
IcmpSecurityFailuresLayer
{
Code
=
(
IcmpCodeSecurityFailures
)
Code
,
Pointer
=
SecurityFailures
.
Pointer
};
default
:
throw
new
InvalidOperationException
(
"Invalid icmpMessageType "
+
MessageType
);
}
}
public
Datagram
Payload
{
get
{
return
new
Datagram
(
Buffer
,
StartOffset
+
HeaderLength
,
Length
-
HeaderLength
)
;
}
get
{
return
Typed
;
}
}
public
IcmpIpV4HeaderPlus64BitsPayloadDatagram
DestinationUncreachable
...
...
PcapDotNet/src/PcapDotNet.Packets/Icmp/IcmpRouterAdvertisementDatagram.cs
View file @
457e35b8
...
...
@@ -23,6 +23,18 @@ namespace PcapDotNet.Packets.Icmp
get
{
return
_routerAddressPreference
;
}
}
public
bool
Equals
(
IcmpRouterAdvertisementEntry
other
)
{
return
other
!=
null
&&
RouterAddress
==
other
.
RouterAddress
&&
RouterAddressPreference
==
other
.
RouterAddressPreference
;
}
public
override
bool
Equals
(
object
obj
)
{
return
Equals
(
obj
as
IcmpRouterAdvertisementEntry
);
}
private
readonly
IpV4Address
_routerAddress
;
private
readonly
int
_routerAddressPreference
;
}
...
...
PcapDotNet/src/PcapDotNet.Packets/IcmpTracerouteLayer.cs
View file @
457e35b8
...
...
@@ -50,5 +50,19 @@ namespace PcapDotNet.Packets
{
IcmpTracerouteDatagram
.
WriteHeaderAdditional
(
buffer
,
offset
,
OutboundHopCount
,
ReturnHopCount
,
OutputLinkSpeed
,
OutputLinkMtu
);
}
public
bool
Equals
(
IcmpTracerouteLayer
other
)
{
return
other
!=
null
&&
OutboundHopCount
==
other
.
OutboundHopCount
&&
ReturnHopCount
==
other
.
ReturnHopCount
&&
OutputLinkSpeed
==
other
.
OutputLinkSpeed
&&
OutputLinkMtu
==
other
.
OutputLinkMtu
;
}
public
override
sealed
bool
Equals
(
IcmpLayer
other
)
{
return
base
.
Equals
(
other
)
&&
Equals
(
other
as
IcmpTracerouteLayer
);
}
}
}
\ No newline at end of file
PcapDotNet/src/PcapDotNet.Packets/IpV4/IpV4Datagram.cs
View file @
457e35b8
...
...
@@ -206,6 +206,21 @@ namespace PcapDotNet.Packets.IpV4
}
}
public
override
ILayer
ExtractLayer
()
{
return
new
IpV4Layer
{
TypeOfService
=
TypeOfService
,
Identification
=
Identification
,
Fragmentation
=
Fragmentation
,
Ttl
=
Ttl
,
Protocol
=
Protocol
,
Source
=
Source
,
Destination
=
Destination
,
Options
=
Options
,
};
}
/// <summary>
/// The payload of the datagram.
/// </summary>
...
...
PcapDotNet/src/PcapDotNet.Packets/PacketBuilder2.cs
View file @
457e35b8
This diff is collapsed.
Click to expand it.
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