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
ac8243a6
Commit
ac8243a6
authored
Aug 16, 2009
by
Brickner_cp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
TCP
parent
1830bbda
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
172 additions
and
17 deletions
+172
-17
MoreTcpOption.cs
PcapDotNet/src/PcapDotNet.Core.Test/MoreTcpOption.cs
+47
-0
PcapDotNet.Core.Test.csproj
...tNet/src/PcapDotNet.Core.Test/PcapDotNet.Core.Test.csproj
+1
-0
WiresharkCompareTests.cs
PcapDotNet/src/PcapDotNet.Core.Test/WiresharkCompareTests.cs
+44
-1
TcpTests.cs
PcapDotNet/src/PcapDotNet.Packets.Test/TcpTests.cs
+12
-14
UdpTests.cs
PcapDotNet/src/PcapDotNet.Packets.Test/UdpTests.cs
+1
-2
MoreRandomPackets.cs
...Net/src/PcapDotNet.Packets.TestUtils/MoreRandomPackets.cs
+67
-0
No files found.
PcapDotNet/src/PcapDotNet.Core.Test/MoreTcpOption.cs
0 → 100644
View file @
ac8243a6
using
System
;
using
System.Collections.Generic
;
using
System.Text
;
using
PcapDotNet.Packets.IpV4
;
using
PcapDotNet.Packets.Transport
;
namespace
PcapDotNet.Core.Test
{
internal
static
class
MoreTcpOption
{
public
static
string
GetWiresharkString
(
this
TcpOption
option
)
{
switch
(
option
.
OptionType
)
{
case
TcpOptionType
.
EndOfOptionList
:
return
"EOL"
;
case
TcpOptionType
.
NoOperation
:
return
"NOP"
;
case
TcpOptionType
.
MaximumSegmentSize
:
return
"Security"
;
default
:
throw
new
InvalidOperationException
(
"Illegal option type "
+
option
.
OptionType
);
}
}
public
static
IEnumerable
<
string
>
GetWiresharkSubfieldStrings
(
this
TcpOption
option
)
{
switch
(
option
.
OptionType
)
{
case
TcpOptionType
.
EndOfOptionList
:
case
TcpOptionType
.
NoOperation
:
case
TcpOptionType
.
MaximumSegmentSize
:
break
;
case
TcpOptionType
.
WindowScale
:
yield
return
""
;
break
;
default
:
throw
new
InvalidOperationException
(
"Illegal option type "
+
option
.
OptionType
);
}
}
}
}
\ No newline at end of file
PcapDotNet/src/PcapDotNet.Core.Test/PcapDotNet.Core.Test.csproj
View file @
ac8243a6
...
@@ -50,6 +50,7 @@
...
@@ -50,6 +50,7 @@
<Compile Include="MoreAssert.cs" />
<Compile Include="MoreAssert.cs" />
<Compile Include="LivePacketDeviceTests.cs" />
<Compile Include="LivePacketDeviceTests.cs" />
<Compile Include="MoreIpV4Option.cs" />
<Compile Include="MoreIpV4Option.cs" />
<Compile Include="MoreTcpOption.cs" />
<Compile Include="MoreXElement.cs" />
<Compile Include="MoreXElement.cs" />
<Compile Include="PacketDumpFileTests.cs" />
<Compile Include="PacketDumpFileTests.cs" />
<Compile Include="PacketHandler.cs" />
<Compile Include="PacketHandler.cs" />
...
...
PcapDotNet/src/PcapDotNet.Core.Test/WiresharkCompareTests.cs
View file @
ac8243a6
...
@@ -153,7 +153,8 @@ namespace PcapDotNet.Core.Test
...
@@ -153,7 +153,8 @@ namespace PcapDotNet.Core.Test
random
.
NextIpV4Address
(),
random
.
NextIpV4Address
(),
random
.
NextIpV4Options
(),
random
.
NextIpV4Address
(),
random
.
NextIpV4Address
(),
random
.
NextIpV4Options
(),
random
.
NextUShort
(),
random
.
NextUShort
(),
random
.
NextUInt
(),
random
.
NextUInt
(),
random
.
NextUShort
(),
random
.
NextUShort
(),
random
.
NextUInt
(),
random
.
NextUInt
(),
random
.
NextFlags
<
TcpFlags
>(),
random
.
NextFlags
<
TcpFlags
>(),
random
.
NextUShort
(),
random
.
NextUShort
(),
new
TcpOptions
(),
random
.
NextUShort
(),
random
.
NextUShort
(),
random
.
NextTcpOptions
(),
random
.
NextDatagram
(
random
.
Next
(
100
)));
random
.
NextDatagram
(
random
.
Next
(
100
)));
break
;
break
;
}
}
...
@@ -579,7 +580,49 @@ namespace PcapDotNet.Core.Test
...
@@ -579,7 +580,49 @@ namespace PcapDotNet.Core.Test
case
"tcp.urgent_pointer"
:
case
"tcp.urgent_pointer"
:
field
.
AssertShowDecimal
(
tcpDatagram
.
UrgentPointer
);
field
.
AssertShowDecimal
(
tcpDatagram
.
UrgentPointer
);
break
;
break
;
case
"tcp.options"
:
CompareTcpOptions
(
field
,
tcpDatagram
.
Options
);
break
;
}
}
}
private
static
void
CompareTcpOptions
(
XElement
element
,
TcpOptions
options
)
{
int
currentOptionIndex
=
0
;
foreach
(
var
field
in
element
.
Fields
())
{
if
(
currentOptionIndex
>=
options
.
Count
)
{
Assert
.
IsFalse
(
options
.
IsValid
);
Assert
.
Fail
();
}
}
TcpOption
option
=
options
[
currentOptionIndex
];
switch
(
field
.
Name
())
{
case
""
:
field
.
AssertShow
(
option
.
GetWiresharkString
());
++
currentOptionIndex
;
break
;
case
"tcp.options.mss"
:
field
.
AssertShowDecimal
(
option
is
TcpOptionMaximumSegmentSize
);
break
;
case
"tcp.options.mss_val"
:
field
.
AssertShowDecimal
(((
TcpOptionMaximumSegmentSize
)
option
).
MaximumSegmentSize
);
++
currentOptionIndex
;
break
;
default
:
throw
new
InvalidOperationException
(
field
.
Name
());
}
// var optionShows = from f in field.Fields() select f.Show();
//
// Assert.IsTrue(optionShows.SequenceEqual(option.GetWiresharkSubfieldStrings()));
}
}
}
}
}
}
...
...
PcapDotNet/src/PcapDotNet.Packets.Test/TcpTests.cs
View file @
ac8243a6
...
@@ -66,7 +66,6 @@ namespace PcapDotNet.Packets.Test
...
@@ -66,7 +66,6 @@ namespace PcapDotNet.Packets.Test
{
{
MacAddress
ethernetSource
=
new
MacAddress
(
"00:01:02:03:04:05"
);
MacAddress
ethernetSource
=
new
MacAddress
(
"00:01:02:03:04:05"
);
MacAddress
ethernetDestination
=
new
MacAddress
(
"A0:A1:A2:A3:A4:A5"
);
MacAddress
ethernetDestination
=
new
MacAddress
(
"A0:A1:A2:A3:A4:A5"
);
const
EthernetType
ethernetType
=
EthernetType
.
IpV4
;
Random
random
=
new
Random
();
Random
random
=
new
Random
();
...
@@ -76,7 +75,6 @@ namespace PcapDotNet.Packets.Test
...
@@ -76,7 +75,6 @@ namespace PcapDotNet.Packets.Test
IpV4FragmentationOptions
ipV4FragmentationOptions
=
random
.
NextEnum
<
IpV4FragmentationOptions
>();
IpV4FragmentationOptions
ipV4FragmentationOptions
=
random
.
NextEnum
<
IpV4FragmentationOptions
>();
ushort
ipV4FragmentationOffset
=
(
ushort
)(
random
.
NextUShort
(
ushort
.
MaxValue
/
8
)
*
8
);
ushort
ipV4FragmentationOffset
=
(
ushort
)(
random
.
NextUShort
(
ushort
.
MaxValue
/
8
)
*
8
);
IpV4Fragmentation
ipV4Fragmentation
=
new
IpV4Fragmentation
(
ipV4FragmentationOptions
,
ipV4FragmentationOffset
);
IpV4Fragmentation
ipV4Fragmentation
=
new
IpV4Fragmentation
(
ipV4FragmentationOptions
,
ipV4FragmentationOffset
);
IpV4Protocol
ipV4Protocol
=
random
.
NextEnum
<
IpV4Protocol
>();
IpV4Address
ipV4Source
=
new
IpV4Address
(
random
.
NextUInt
());
IpV4Address
ipV4Source
=
new
IpV4Address
(
random
.
NextUInt
());
IpV4Address
ipV4Destination
=
new
IpV4Address
(
random
.
NextUInt
());
IpV4Address
ipV4Destination
=
new
IpV4Address
(
random
.
NextUInt
());
IpV4Options
ipV4Options
=
random
.
NextIpV4Options
();
IpV4Options
ipV4Options
=
random
.
NextIpV4Options
();
...
@@ -90,7 +88,7 @@ namespace PcapDotNet.Packets.Test
...
@@ -90,7 +88,7 @@ namespace PcapDotNet.Packets.Test
TcpFlags
tcpFlags
=
random
.
NextFlags
<
TcpFlags
>();
TcpFlags
tcpFlags
=
random
.
NextFlags
<
TcpFlags
>();
ushort
tcpWindow
=
random
.
NextUShort
();
ushort
tcpWindow
=
random
.
NextUShort
();
ushort
tcpUrgentPointer
=
random
.
NextUShort
();
ushort
tcpUrgentPointer
=
random
.
NextUShort
();
TcpOptions
tcpOptions
=
new
TcpOptions
();
TcpOptions
tcpOptions
=
random
.
Next
TcpOptions
();
Datagram
tcpPayload
=
random
.
NextDatagram
(
random
.
Next
(
60000
));
Datagram
tcpPayload
=
random
.
NextDatagram
(
random
.
Next
(
60000
));
Packet
packet
=
PacketBuilder
.
EthernetIpV4Tcp
(
DateTime
.
Now
,
Packet
packet
=
PacketBuilder
.
EthernetIpV4Tcp
(
DateTime
.
Now
,
...
@@ -103,7 +101,7 @@ namespace PcapDotNet.Packets.Test
...
@@ -103,7 +101,7 @@ namespace PcapDotNet.Packets.Test
Assert
.
IsTrue
(
packet
.
IsValid
);
Assert
.
IsTrue
(
packet
.
IsValid
);
//
UD
P
//
TC
P
Assert
.
AreEqual
(
tcpSourcePort
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
SourcePort
,
"Source Port"
);
Assert
.
AreEqual
(
tcpSourcePort
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
SourcePort
,
"Source Port"
);
Assert
.
AreEqual
(
tcpDestinationPort
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
DestinationPort
,
"Destination Port"
);
Assert
.
AreEqual
(
tcpDestinationPort
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
DestinationPort
,
"Destination Port"
);
Assert
.
AreEqual
(
tcpSequenceNumber
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
SequenceNumber
,
"Sequence Number"
);
Assert
.
AreEqual
(
tcpSequenceNumber
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
SequenceNumber
,
"Sequence Number"
);
...
@@ -111,20 +109,20 @@ namespace PcapDotNet.Packets.Test
...
@@ -111,20 +109,20 @@ namespace PcapDotNet.Packets.Test
Assert
.
AreEqual
(
tcpFlags
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
Flags
,
"Flags"
);
Assert
.
AreEqual
(
tcpFlags
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
Flags
,
"Flags"
);
Assert
.
AreEqual
(
tcpWindow
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
Window
,
"Window"
);
Assert
.
AreEqual
(
tcpWindow
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
Window
,
"Window"
);
Assert
.
AreEqual
(
tcpUrgentPointer
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
UrgentPointer
,
"Urgent Pointer"
);
Assert
.
AreEqual
(
tcpUrgentPointer
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
UrgentPointer
,
"Urgent Pointer"
);
Assert
.
AreEqual
(
tcpOptions
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
Options
,
"Options"
);
Assert
.
AreEqual
((
tcpFlags
&
TcpFlags
.
Ack
)
==
TcpFlags
.
Ack
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
IsAck
,
"IsAck"
);
Assert
.
AreEqual
((
tcpFlags
&
TcpFlags
.
Cwr
)
==
TcpFlags
.
Cwr
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
IsCwr
,
"IsCwr"
);
Assert
.
AreEqual
((
tcpFlags
&
TcpFlags
.
Ece
)
==
TcpFlags
.
Ece
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
IsEce
,
"IsEce"
);
Assert
.
AreEqual
((
tcpFlags
&
TcpFlags
.
Fin
)
==
TcpFlags
.
Fin
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
IsFin
,
"IsFin"
);
Assert
.
AreEqual
((
tcpFlags
&
TcpFlags
.
Psh
)
==
TcpFlags
.
Psh
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
IsPush
,
"IsPush"
);
Assert
.
AreEqual
((
tcpFlags
&
TcpFlags
.
Rst
)
==
TcpFlags
.
Rst
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
IsReset
,
"IsReset"
);
Assert
.
AreEqual
((
tcpFlags
&
TcpFlags
.
Syn
)
==
TcpFlags
.
Syn
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
IsSyn
,
"IsSyn"
);
Assert
.
AreEqual
((
tcpFlags
&
TcpFlags
.
Urg
)
==
TcpFlags
.
Urg
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
IsUrg
,
"IsUrg"
);
Assert
.
IsFalse
(
packet
.
Ethernet
.
IpV4
.
Tcp
.
IsChecksumOptional
,
"IsChecksumOptional"
);
Assert
.
AreEqual
(
TcpDatagram
.
HeaderMinimumLength
+
tcpOptions
.
BytesLength
+
tcpPayload
.
Length
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
Length
,
"Total Length"
);
Assert
.
AreEqual
(
TcpDatagram
.
HeaderMinimumLength
+
tcpOptions
.
BytesLength
+
tcpPayload
.
Length
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
Length
,
"Total Length"
);
Assert
.
IsTrue
(
packet
.
Ethernet
.
IpV4
.
IsTransportChecksumCorrect
,
"IsTransportChecksumCorrect"
);
Assert
.
IsTrue
(
packet
.
Ethernet
.
IpV4
.
IsTransportChecksumCorrect
,
"IsTransportChecksumCorrect"
);
Assert
.
AreEqual
(
tcpPayload
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
Payload
,
"Payload"
);
Assert
.
AreEqual
(
tcpPayload
,
packet
.
Ethernet
.
IpV4
.
Tcp
.
Payload
,
"Payload"
);
}
}
}
}
[
TestMethod
]
public
void
UdpChecksumTest
()
{
Packet
packet
=
Packet
.
FromHexadecimalString
(
"3352c58e71ffc4f39ec3bae508004cfe0043361200008611eec22ea2c8d11e9eb7b9520c2a33f2bbbed998980bba4404f941019404eb51880496ce00000005a87a270013a683f572c10e1504a0df15448a"
,
DateTime
.
Now
,
DataLinkKind
.
Ethernet
);
Assert
.
IsTrue
(
packet
.
Ethernet
.
IpV4
.
IsTransportChecksumCorrect
);
}
}
}
}
}
\ No newline at end of file
PcapDotNet/src/PcapDotNet.Packets.Test/UdpTests.cs
View file @
ac8243a6
...
@@ -66,7 +66,6 @@ namespace PcapDotNet.Packets.Test
...
@@ -66,7 +66,6 @@ namespace PcapDotNet.Packets.Test
{
{
MacAddress
ethernetSource
=
new
MacAddress
(
"00:01:02:03:04:05"
);
MacAddress
ethernetSource
=
new
MacAddress
(
"00:01:02:03:04:05"
);
MacAddress
ethernetDestination
=
new
MacAddress
(
"A0:A1:A2:A3:A4:A5"
);
MacAddress
ethernetDestination
=
new
MacAddress
(
"A0:A1:A2:A3:A4:A5"
);
const
EthernetType
ethernetType
=
EthernetType
.
IpV4
;
Random
random
=
new
Random
();
Random
random
=
new
Random
();
...
@@ -76,7 +75,6 @@ namespace PcapDotNet.Packets.Test
...
@@ -76,7 +75,6 @@ namespace PcapDotNet.Packets.Test
IpV4FragmentationOptions
ipV4FragmentationOptions
=
random
.
NextEnum
<
IpV4FragmentationOptions
>();
IpV4FragmentationOptions
ipV4FragmentationOptions
=
random
.
NextEnum
<
IpV4FragmentationOptions
>();
ushort
ipV4FragmentationOffset
=
(
ushort
)(
random
.
NextUShort
(
ushort
.
MaxValue
/
8
)
*
8
);
ushort
ipV4FragmentationOffset
=
(
ushort
)(
random
.
NextUShort
(
ushort
.
MaxValue
/
8
)
*
8
);
IpV4Fragmentation
ipV4Fragmentation
=
new
IpV4Fragmentation
(
ipV4FragmentationOptions
,
ipV4FragmentationOffset
);
IpV4Fragmentation
ipV4Fragmentation
=
new
IpV4Fragmentation
(
ipV4FragmentationOptions
,
ipV4FragmentationOffset
);
IpV4Protocol
ipV4Protocol
=
random
.
NextEnum
<
IpV4Protocol
>();
IpV4Address
ipV4Source
=
new
IpV4Address
(
random
.
NextUInt
());
IpV4Address
ipV4Source
=
new
IpV4Address
(
random
.
NextUInt
());
IpV4Address
ipV4Destination
=
new
IpV4Address
(
random
.
NextUInt
());
IpV4Address
ipV4Destination
=
new
IpV4Address
(
random
.
NextUInt
());
IpV4Options
ipV4Options
=
random
.
NextIpV4Options
();
IpV4Options
ipV4Options
=
random
.
NextIpV4Options
();
...
@@ -103,6 +101,7 @@ namespace PcapDotNet.Packets.Test
...
@@ -103,6 +101,7 @@ namespace PcapDotNet.Packets.Test
Assert
.
AreEqual
(
UdpDatagram
.
HeaderLength
+
udpPayload
.
Length
,
packet
.
Ethernet
.
IpV4
.
Udp
.
TotalLength
,
"Total Length"
);
Assert
.
AreEqual
(
UdpDatagram
.
HeaderLength
+
udpPayload
.
Length
,
packet
.
Ethernet
.
IpV4
.
Udp
.
TotalLength
,
"Total Length"
);
Assert
.
IsTrue
(!
udpCalculateChecksum
&&
packet
.
Ethernet
.
IpV4
.
Udp
.
Checksum
==
0
||
Assert
.
IsTrue
(!
udpCalculateChecksum
&&
packet
.
Ethernet
.
IpV4
.
Udp
.
Checksum
==
0
||
packet
.
Ethernet
.
IpV4
.
IsTransportChecksumCorrect
,
"IsTransportChecksumCorrect"
);
packet
.
Ethernet
.
IpV4
.
IsTransportChecksumCorrect
,
"IsTransportChecksumCorrect"
);
Assert
.
IsTrue
(
packet
.
Ethernet
.
IpV4
.
Udp
.
IsChecksumOptional
,
"IsChecksumOptional"
);
Assert
.
AreEqual
(
udpPayload
,
packet
.
Ethernet
.
IpV4
.
Udp
.
Payload
,
"Payload"
);
Assert
.
AreEqual
(
udpPayload
,
packet
.
Ethernet
.
IpV4
.
Udp
.
Payload
,
"Payload"
);
}
}
}
}
...
...
PcapDotNet/src/PcapDotNet.Packets.TestUtils/MoreRandomPackets.cs
View file @
ac8243a6
...
@@ -5,6 +5,7 @@ using System.Text;
...
@@ -5,6 +5,7 @@ using System.Text;
using
PcapDotNet.Packets
;
using
PcapDotNet.Packets
;
using
PcapDotNet.Packets.Ethernet
;
using
PcapDotNet.Packets.Ethernet
;
using
PcapDotNet.Packets.IpV4
;
using
PcapDotNet.Packets.IpV4
;
using
PcapDotNet.Packets.Transport
;
using
PcapDotNet.TestUtils
;
using
PcapDotNet.TestUtils
;
namespace
PcapDotNet.Packets.TestUtils
namespace
PcapDotNet.Packets.TestUtils
...
@@ -229,5 +230,71 @@ namespace PcapDotNet.Packets.TestUtils
...
@@ -229,5 +230,71 @@ namespace PcapDotNet.Packets.TestUtils
}
}
return
new
IpV4Options
(
options
);
return
new
IpV4Options
(
options
);
}
}
public
static
TcpOption
NextTcpOption
(
this
Random
random
,
int
maximumOptionLength
)
{
if
(
maximumOptionLength
==
0
)
throw
new
ArgumentOutOfRangeException
(
"maximumOptionLength"
,
maximumOptionLength
,
"option length must be positive"
);
List
<
TcpOptionType
>
impossibleOptionTypes
=
new
List
<
TcpOptionType
>();
if
(
maximumOptionLength
<
TcpOptionMaximumSegmentSize
.
OptionLength
)
impossibleOptionTypes
.
Add
(
TcpOptionType
.
MaximumSegmentSize
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
AlternateChecksumData
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
AlternateChecksumRequest
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
Cc
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
CcEcho
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
CcNew
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
Echo
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
EchoReply
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
Md5Signature
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
PartialOrderConnectionPermitted
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
PartialOrderServiceProfile
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
QuickStartResponse
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
Sack
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
SackPermitted
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
TimeStamp
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
UserTimeout
);
impossibleOptionTypes
.
Add
(
TcpOptionType
.
WindowScale
);
TcpOptionType
optionType
=
random
.
NextEnum
<
TcpOptionType
>(
impossibleOptionTypes
);
switch
(
optionType
)
{
case
TcpOptionType
.
EndOfOptionList
:
return
TcpOption
.
End
;
case
TcpOptionType
.
NoOperation
:
return
TcpOption
.
Nop
;
case
TcpOptionType
.
MaximumSegmentSize
:
return
new
TcpOptionMaximumSegmentSize
(
random
.
NextUShort
());
default
:
throw
new
InvalidOperationException
(
"optionType = "
+
optionType
);
}
}
public
static
TcpOptions
NextTcpOptions
(
this
Random
random
)
{
int
optionsLength
=
random
.
Next
(
TcpOptions
.
MaximumBytesLength
)
/
4
*
4
;
List
<
TcpOption
>
options
=
new
List
<
TcpOption
>();
while
(
optionsLength
>
0
)
{
TcpOption
option
=
random
.
NextTcpOption
(
optionsLength
);
if
(
option
.
IsAppearsAtMostOnce
&&
options
.
FindIndex
(
option
.
Equivalent
)
!=
-
1
)
{
continue
;
}
options
.
Add
(
option
);
optionsLength
-=
option
.
Length
;
if
(
option
.
OptionType
==
TcpOptionType
.
EndOfOptionList
)
break
;
}
return
new
TcpOptions
(
options
);
}
}
}
}
}
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