DIY-pcap 0.4.1 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -4
- data/DIY-pcap.gemspec +17 -17
- data/Gemfile +3 -3
- data/Rakefile +1 -1
- data/lib/DIY-pcap.rb +2 -2
- data/lib/diy/command.rb +7 -1
- data/lib/diy/controller.rb +10 -15
- data/lib/diy/live.rb +9 -2
- data/lib/diy/parser/mu/pcap/ethernet.rb +148 -148
- data/lib/diy/parser/mu/pcap/header.rb +75 -75
- data/lib/diy/parser/mu/pcap/io_pair.rb +67 -67
- data/lib/diy/parser/mu/pcap/io_wrapper.rb +76 -76
- data/lib/diy/parser/mu/pcap/ip.rb +61 -61
- data/lib/diy/parser/mu/pcap/ipv4.rb +257 -257
- data/lib/diy/parser/mu/pcap/ipv6.rb +148 -148
- data/lib/diy/parser/mu/pcap/packet.rb +104 -104
- data/lib/diy/parser/mu/pcap/pkthdr.rb +155 -155
- data/lib/diy/parser/mu/pcap/reader.rb +61 -61
- data/lib/diy/parser/mu/pcap/reader/http_family.rb +170 -170
- data/lib/diy/parser/mu/pcap/sctp.rb +367 -367
- data/lib/diy/parser/mu/pcap/sctp/chunk.rb +123 -123
- data/lib/diy/parser/mu/pcap/sctp/chunk/data.rb +134 -134
- data/lib/diy/parser/mu/pcap/sctp/chunk/init.rb +100 -100
- data/lib/diy/parser/mu/pcap/sctp/chunk/init_ack.rb +68 -68
- data/lib/diy/parser/mu/pcap/sctp/parameter.rb +110 -110
- data/lib/diy/parser/mu/pcap/sctp/parameter/ip_address.rb +48 -48
- data/lib/diy/parser/mu/pcap/stream_packetizer.rb +72 -72
- data/lib/diy/parser/mu/pcap/tcp.rb +505 -505
- data/lib/diy/parser/mu/pcap/udp.rb +69 -69
- data/lib/diy/parser/mu/scenario/pcap.rb +172 -172
- data/lib/diy/parser/mu/scenario/pcap/fields.rb +50 -50
- data/lib/diy/parser/mu/scenario/pcap/rtp.rb +71 -71
- data/lib/diy/parser/pcap.rb +109 -109
- data/lib/diy/version.rb +1 -1
- metadata +7 -9
@@ -1,100 +1,100 @@
|
|
1
|
-
# http://www.mudynamics.com
|
2
|
-
# http://labs.mudynamics.com
|
3
|
-
# http://www.pcapr.net
|
4
|
-
|
5
|
-
module Mu
|
6
|
-
class Pcap
|
7
|
-
class SCTP
|
8
|
-
class Chunk
|
9
|
-
|
10
|
-
class Init < Chunk
|
11
|
-
attr_accessor :init_tag, :a_rwnd, :o_streams, :i_streams, :init_tsn
|
12
|
-
|
13
|
-
def initialize
|
14
|
-
super
|
15
|
-
|
16
|
-
@type = CHUNK_INIT
|
17
|
-
@init_tag = 0
|
18
|
-
@a_rwnd = 0
|
19
|
-
@o_streams = 0
|
20
|
-
@i_streams = 0
|
21
|
-
@init_tsn = 0
|
22
|
-
@payload = []
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.from_bytes flags, size, bytes
|
26
|
-
# Basic validation
|
27
|
-
Pcap.assert(bytes.length >= 16,
|
28
|
-
"Truncated init chunk header: 16 > #{bytes.length}")
|
29
|
-
|
30
|
-
# Read init chunk header
|
31
|
-
init_tag, a_rwnd, o_streams, i_streams, init_tsn = bytes.unpack('NNnnN')
|
32
|
-
|
33
|
-
# Create init chunk
|
34
|
-
init = Init.new
|
35
|
-
init.flags = flags
|
36
|
-
init.size = size
|
37
|
-
init.init_tag = init_tag
|
38
|
-
init.a_rwnd = a_rwnd
|
39
|
-
init.o_streams = o_streams
|
40
|
-
init.i_streams = i_streams
|
41
|
-
init.init_tsn = init_tsn
|
42
|
-
|
43
|
-
# Initialize the counter
|
44
|
-
length = 16
|
45
|
-
|
46
|
-
# Collect the chunks
|
47
|
-
while length < bytes.length
|
48
|
-
# Parse new parameter from the bytes
|
49
|
-
parameter = Parameter.from_bytes(bytes[length..-1])
|
50
|
-
|
51
|
-
# Get parameter size with padding
|
52
|
-
length += parameter.padded_size
|
53
|
-
|
54
|
-
# Add chunk to the list
|
55
|
-
init << parameter
|
56
|
-
end
|
57
|
-
|
58
|
-
# Return the result
|
59
|
-
return init
|
60
|
-
end
|
61
|
-
|
62
|
-
def write io, ip
|
63
|
-
chunk_header = [@type, @flags, @size].pack('CCn')
|
64
|
-
init_header = [@init_tag,
|
65
|
-
@a_rwnd,
|
66
|
-
@o_streams,
|
67
|
-
@i_streams,
|
68
|
-
@init_tsn].pack('NNnnN')
|
69
|
-
|
70
|
-
# Write Chunk header followed by the Init chunk header
|
71
|
-
io.write(chunk_header)
|
72
|
-
io.write(init_header)
|
73
|
-
|
74
|
-
# Write each parameter
|
75
|
-
@payload.each do |parameter|
|
76
|
-
parameter.write(io, ip)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def << parameter
|
81
|
-
@payload << parameter
|
82
|
-
end
|
83
|
-
|
84
|
-
def to_s
|
85
|
-
return "init(%d, %d, %d, %d, %d, %d, %s)" % [@size,
|
86
|
-
@init_tag,
|
87
|
-
@a_rwnd,
|
88
|
-
@o_streams,
|
89
|
-
@i_streams,
|
90
|
-
@init_tsn,
|
91
|
-
@payload.join(", ")]
|
92
|
-
end
|
93
|
-
end # class Init
|
94
|
-
|
95
|
-
end # class Chunk
|
96
|
-
end # class SCTP
|
97
|
-
end # class Pcap
|
98
|
-
end # module Mu
|
99
|
-
|
100
|
-
require 'mu/pcap/sctp/parameter'
|
1
|
+
# http://www.mudynamics.com
|
2
|
+
# http://labs.mudynamics.com
|
3
|
+
# http://www.pcapr.net
|
4
|
+
|
5
|
+
module Mu
|
6
|
+
class Pcap
|
7
|
+
class SCTP
|
8
|
+
class Chunk
|
9
|
+
|
10
|
+
class Init < Chunk
|
11
|
+
attr_accessor :init_tag, :a_rwnd, :o_streams, :i_streams, :init_tsn
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
super
|
15
|
+
|
16
|
+
@type = CHUNK_INIT
|
17
|
+
@init_tag = 0
|
18
|
+
@a_rwnd = 0
|
19
|
+
@o_streams = 0
|
20
|
+
@i_streams = 0
|
21
|
+
@init_tsn = 0
|
22
|
+
@payload = []
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.from_bytes flags, size, bytes
|
26
|
+
# Basic validation
|
27
|
+
Pcap.assert(bytes.length >= 16,
|
28
|
+
"Truncated init chunk header: 16 > #{bytes.length}")
|
29
|
+
|
30
|
+
# Read init chunk header
|
31
|
+
init_tag, a_rwnd, o_streams, i_streams, init_tsn = bytes.unpack('NNnnN')
|
32
|
+
|
33
|
+
# Create init chunk
|
34
|
+
init = Init.new
|
35
|
+
init.flags = flags
|
36
|
+
init.size = size
|
37
|
+
init.init_tag = init_tag
|
38
|
+
init.a_rwnd = a_rwnd
|
39
|
+
init.o_streams = o_streams
|
40
|
+
init.i_streams = i_streams
|
41
|
+
init.init_tsn = init_tsn
|
42
|
+
|
43
|
+
# Initialize the counter
|
44
|
+
length = 16
|
45
|
+
|
46
|
+
# Collect the chunks
|
47
|
+
while length < bytes.length
|
48
|
+
# Parse new parameter from the bytes
|
49
|
+
parameter = Parameter.from_bytes(bytes[length..-1])
|
50
|
+
|
51
|
+
# Get parameter size with padding
|
52
|
+
length += parameter.padded_size
|
53
|
+
|
54
|
+
# Add chunk to the list
|
55
|
+
init << parameter
|
56
|
+
end
|
57
|
+
|
58
|
+
# Return the result
|
59
|
+
return init
|
60
|
+
end
|
61
|
+
|
62
|
+
def write io, ip
|
63
|
+
chunk_header = [@type, @flags, @size].pack('CCn')
|
64
|
+
init_header = [@init_tag,
|
65
|
+
@a_rwnd,
|
66
|
+
@o_streams,
|
67
|
+
@i_streams,
|
68
|
+
@init_tsn].pack('NNnnN')
|
69
|
+
|
70
|
+
# Write Chunk header followed by the Init chunk header
|
71
|
+
io.write(chunk_header)
|
72
|
+
io.write(init_header)
|
73
|
+
|
74
|
+
# Write each parameter
|
75
|
+
@payload.each do |parameter|
|
76
|
+
parameter.write(io, ip)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def << parameter
|
81
|
+
@payload << parameter
|
82
|
+
end
|
83
|
+
|
84
|
+
def to_s
|
85
|
+
return "init(%d, %d, %d, %d, %d, %d, %s)" % [@size,
|
86
|
+
@init_tag,
|
87
|
+
@a_rwnd,
|
88
|
+
@o_streams,
|
89
|
+
@i_streams,
|
90
|
+
@init_tsn,
|
91
|
+
@payload.join(", ")]
|
92
|
+
end
|
93
|
+
end # class Init
|
94
|
+
|
95
|
+
end # class Chunk
|
96
|
+
end # class SCTP
|
97
|
+
end # class Pcap
|
98
|
+
end # module Mu
|
99
|
+
|
100
|
+
require 'mu/pcap/sctp/parameter'
|
@@ -1,68 +1,68 @@
|
|
1
|
-
# http://www.mudynamics.com
|
2
|
-
# http://labs.mudynamics.com
|
3
|
-
# http://www.pcapr.net
|
4
|
-
|
5
|
-
module Mu
|
6
|
-
class Pcap
|
7
|
-
class SCTP
|
8
|
-
class Chunk
|
9
|
-
|
10
|
-
class InitAck < Init
|
11
|
-
def initialize
|
12
|
-
super
|
13
|
-
|
14
|
-
@type = CHUNK_INIT_ACK
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.from_bytes flags, size, bytes
|
18
|
-
# Basic validation
|
19
|
-
Pcap.assert(bytes.length >= 16,
|
20
|
-
"Truncated init_ack chunk header: 16 > #{bytes.length}")
|
21
|
-
|
22
|
-
# Read init_ack chunk header
|
23
|
-
init_tag, a_rwnd, o_streams, i_streams, init_tsn = bytes.unpack('NNnnN')
|
24
|
-
|
25
|
-
# Create init chunk
|
26
|
-
init_ack = InitAck.new
|
27
|
-
init_ack.flags = flags
|
28
|
-
init_ack.size = size
|
29
|
-
init_ack.init_tag = init_tag
|
30
|
-
init_ack.a_rwnd = a_rwnd
|
31
|
-
init_ack.o_streams = o_streams
|
32
|
-
init_ack.i_streams = i_streams
|
33
|
-
init_ack.init_tsn = init_tsn
|
34
|
-
|
35
|
-
# Initialize the counter
|
36
|
-
length = 16
|
37
|
-
|
38
|
-
# Collect the chunks
|
39
|
-
while length < bytes.length
|
40
|
-
# Parse new parameter from the bytes
|
41
|
-
parameter = Parameter.from_bytes(bytes[length..-1])
|
42
|
-
|
43
|
-
# Get parameter size with padding
|
44
|
-
length += parameter.padded_size
|
45
|
-
|
46
|
-
# Add chunk to the list
|
47
|
-
init_ack << parameter
|
48
|
-
end
|
49
|
-
|
50
|
-
# Return the result
|
51
|
-
return init_ack
|
52
|
-
end
|
53
|
-
|
54
|
-
def to_s
|
55
|
-
return "init_ack(%d, %d, %d, %d, %d, %d, %s)" % [@size,
|
56
|
-
@init_tag,
|
57
|
-
@a_rwnd,
|
58
|
-
@o_streams,
|
59
|
-
@i_streams,
|
60
|
-
@init_tsn,
|
61
|
-
@payload.join(", ")]
|
62
|
-
end
|
63
|
-
end # class InitAck
|
64
|
-
|
65
|
-
end # class Chunk
|
66
|
-
end # class SCTP
|
67
|
-
end # class Pcap
|
68
|
-
end # module Mu
|
1
|
+
# http://www.mudynamics.com
|
2
|
+
# http://labs.mudynamics.com
|
3
|
+
# http://www.pcapr.net
|
4
|
+
|
5
|
+
module Mu
|
6
|
+
class Pcap
|
7
|
+
class SCTP
|
8
|
+
class Chunk
|
9
|
+
|
10
|
+
class InitAck < Init
|
11
|
+
def initialize
|
12
|
+
super
|
13
|
+
|
14
|
+
@type = CHUNK_INIT_ACK
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.from_bytes flags, size, bytes
|
18
|
+
# Basic validation
|
19
|
+
Pcap.assert(bytes.length >= 16,
|
20
|
+
"Truncated init_ack chunk header: 16 > #{bytes.length}")
|
21
|
+
|
22
|
+
# Read init_ack chunk header
|
23
|
+
init_tag, a_rwnd, o_streams, i_streams, init_tsn = bytes.unpack('NNnnN')
|
24
|
+
|
25
|
+
# Create init chunk
|
26
|
+
init_ack = InitAck.new
|
27
|
+
init_ack.flags = flags
|
28
|
+
init_ack.size = size
|
29
|
+
init_ack.init_tag = init_tag
|
30
|
+
init_ack.a_rwnd = a_rwnd
|
31
|
+
init_ack.o_streams = o_streams
|
32
|
+
init_ack.i_streams = i_streams
|
33
|
+
init_ack.init_tsn = init_tsn
|
34
|
+
|
35
|
+
# Initialize the counter
|
36
|
+
length = 16
|
37
|
+
|
38
|
+
# Collect the chunks
|
39
|
+
while length < bytes.length
|
40
|
+
# Parse new parameter from the bytes
|
41
|
+
parameter = Parameter.from_bytes(bytes[length..-1])
|
42
|
+
|
43
|
+
# Get parameter size with padding
|
44
|
+
length += parameter.padded_size
|
45
|
+
|
46
|
+
# Add chunk to the list
|
47
|
+
init_ack << parameter
|
48
|
+
end
|
49
|
+
|
50
|
+
# Return the result
|
51
|
+
return init_ack
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
return "init_ack(%d, %d, %d, %d, %d, %d, %s)" % [@size,
|
56
|
+
@init_tag,
|
57
|
+
@a_rwnd,
|
58
|
+
@o_streams,
|
59
|
+
@i_streams,
|
60
|
+
@init_tsn,
|
61
|
+
@payload.join(", ")]
|
62
|
+
end
|
63
|
+
end # class InitAck
|
64
|
+
|
65
|
+
end # class Chunk
|
66
|
+
end # class SCTP
|
67
|
+
end # class Pcap
|
68
|
+
end # module Mu
|
@@ -1,110 +1,110 @@
|
|
1
|
-
# http://www.mudynamics.com
|
2
|
-
# http://labs.mudynamics.com
|
3
|
-
# http://www.pcapr.net
|
4
|
-
|
5
|
-
module Mu
|
6
|
-
class Pcap
|
7
|
-
class SCTP
|
8
|
-
|
9
|
-
class Parameter < Packet
|
10
|
-
attr_accessor :type, :size
|
11
|
-
|
12
|
-
def initialize
|
13
|
-
super
|
14
|
-
|
15
|
-
@type = 0
|
16
|
-
@size = 0
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.from_bytes bytes
|
20
|
-
# Basic validation
|
21
|
-
Pcap.assert(bytes.length >= 4,
|
22
|
-
"Truncated parameter header: 4 > #{bytes.length}")
|
23
|
-
|
24
|
-
# Read chunk header
|
25
|
-
type, size = bytes.unpack('nn')
|
26
|
-
|
27
|
-
# Validate chunk size
|
28
|
-
Pcap.assert(bytes.length >= size,
|
29
|
-
"Truncated parameter: #{size} set, #{bytes.length} available")
|
30
|
-
|
31
|
-
# Create chunk based on type
|
32
|
-
case type
|
33
|
-
when PARAM_IPV4
|
34
|
-
parameter = IpAddress.from_bytes(type, size, bytes[4..-1])
|
35
|
-
when PARAM_IPV6
|
36
|
-
parameter = IpAddress.from_bytes(type, size, bytes[4..-1])
|
37
|
-
when PARAM_STATE_COOKIE
|
38
|
-
parameter = dummy_parameter(type, size, bytes)
|
39
|
-
when PARAM_COOKIE_PRESERVATIVE
|
40
|
-
parameter = dummy_parameter(type, size, bytes)
|
41
|
-
when PARAM_HOST_NAME_ADDR
|
42
|
-
parameter = dummy_parameter(type, size, bytes)
|
43
|
-
when PARAM_SUPPORTED_ADDR_TYPES
|
44
|
-
parameter = dummy_parameter(type, size, bytes)
|
45
|
-
when PARAM_ECN
|
46
|
-
parameter = dummy_parameter(type, size, bytes)
|
47
|
-
when PARAM_RANDOM
|
48
|
-
parameter = dummy_parameter(type, size, bytes)
|
49
|
-
when PARAM_CHUNK_LIST
|
50
|
-
parameter = dummy_parameter(type, size, bytes)
|
51
|
-
when PARAM_HMAC_ALGORITHM
|
52
|
-
parameter = dummy_parameter(type, size, bytes)
|
53
|
-
when PARAM_PADDING
|
54
|
-
parameter = dummy_parameter(type, size, bytes)
|
55
|
-
when PARAM_SUPPORTED_EXTENSIONS
|
56
|
-
parameter = dummy_parameter(type, size, bytes)
|
57
|
-
when PARAM_FORWARD_TSN
|
58
|
-
parameter = dummy_parameter(type, size, bytes)
|
59
|
-
when PARAM_SET_PRIMARY_ADDR
|
60
|
-
parameter = dummy_parameter(type, size, bytes)
|
61
|
-
when PARAM_ADAPTATION_LAYER_INDICATION
|
62
|
-
parameter = dummy_parameter(type, size, bytes)
|
63
|
-
else
|
64
|
-
parameter = dummy_parameter(type, size, bytes)
|
65
|
-
end
|
66
|
-
|
67
|
-
# Return the result
|
68
|
-
return parameter
|
69
|
-
end
|
70
|
-
|
71
|
-
def write io, ip
|
72
|
-
header = [@type, @size].pack('nn')
|
73
|
-
|
74
|
-
# Write Parameter header followed by the payload
|
75
|
-
io.write(header)
|
76
|
-
io.write(@payload_raw)
|
77
|
-
end
|
78
|
-
|
79
|
-
def padded_size
|
80
|
-
if 0 == @size % 4
|
81
|
-
return @size
|
82
|
-
else
|
83
|
-
return (@size + 4 - (@size % 4))
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def to_s
|
88
|
-
return "parameter(%d, %d)" % [@type, @size]
|
89
|
-
end
|
90
|
-
|
91
|
-
def self.dummy_parameter type, size, bytes
|
92
|
-
# Create new dummy parameter
|
93
|
-
parameter = Parameter.new
|
94
|
-
parameter.type = type
|
95
|
-
parameter.size = size
|
96
|
-
|
97
|
-
# Save the payload
|
98
|
-
parameter.payload = bytes[4..parameter.padded_size - 1]
|
99
|
-
parameter.payload_raw = parameter.payload
|
100
|
-
|
101
|
-
# Return the result
|
102
|
-
return parameter
|
103
|
-
end
|
104
|
-
end # class Parameter
|
105
|
-
|
106
|
-
end # class SCTP
|
107
|
-
end # class Pcap
|
108
|
-
end # module Mu
|
109
|
-
|
110
|
-
require 'mu/pcap/sctp/parameter/ip_address'
|
1
|
+
# http://www.mudynamics.com
|
2
|
+
# http://labs.mudynamics.com
|
3
|
+
# http://www.pcapr.net
|
4
|
+
|
5
|
+
module Mu
|
6
|
+
class Pcap
|
7
|
+
class SCTP
|
8
|
+
|
9
|
+
class Parameter < Packet
|
10
|
+
attr_accessor :type, :size
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
super
|
14
|
+
|
15
|
+
@type = 0
|
16
|
+
@size = 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.from_bytes bytes
|
20
|
+
# Basic validation
|
21
|
+
Pcap.assert(bytes.length >= 4,
|
22
|
+
"Truncated parameter header: 4 > #{bytes.length}")
|
23
|
+
|
24
|
+
# Read chunk header
|
25
|
+
type, size = bytes.unpack('nn')
|
26
|
+
|
27
|
+
# Validate chunk size
|
28
|
+
Pcap.assert(bytes.length >= size,
|
29
|
+
"Truncated parameter: #{size} set, #{bytes.length} available")
|
30
|
+
|
31
|
+
# Create chunk based on type
|
32
|
+
case type
|
33
|
+
when PARAM_IPV4
|
34
|
+
parameter = IpAddress.from_bytes(type, size, bytes[4..-1])
|
35
|
+
when PARAM_IPV6
|
36
|
+
parameter = IpAddress.from_bytes(type, size, bytes[4..-1])
|
37
|
+
when PARAM_STATE_COOKIE
|
38
|
+
parameter = dummy_parameter(type, size, bytes)
|
39
|
+
when PARAM_COOKIE_PRESERVATIVE
|
40
|
+
parameter = dummy_parameter(type, size, bytes)
|
41
|
+
when PARAM_HOST_NAME_ADDR
|
42
|
+
parameter = dummy_parameter(type, size, bytes)
|
43
|
+
when PARAM_SUPPORTED_ADDR_TYPES
|
44
|
+
parameter = dummy_parameter(type, size, bytes)
|
45
|
+
when PARAM_ECN
|
46
|
+
parameter = dummy_parameter(type, size, bytes)
|
47
|
+
when PARAM_RANDOM
|
48
|
+
parameter = dummy_parameter(type, size, bytes)
|
49
|
+
when PARAM_CHUNK_LIST
|
50
|
+
parameter = dummy_parameter(type, size, bytes)
|
51
|
+
when PARAM_HMAC_ALGORITHM
|
52
|
+
parameter = dummy_parameter(type, size, bytes)
|
53
|
+
when PARAM_PADDING
|
54
|
+
parameter = dummy_parameter(type, size, bytes)
|
55
|
+
when PARAM_SUPPORTED_EXTENSIONS
|
56
|
+
parameter = dummy_parameter(type, size, bytes)
|
57
|
+
when PARAM_FORWARD_TSN
|
58
|
+
parameter = dummy_parameter(type, size, bytes)
|
59
|
+
when PARAM_SET_PRIMARY_ADDR
|
60
|
+
parameter = dummy_parameter(type, size, bytes)
|
61
|
+
when PARAM_ADAPTATION_LAYER_INDICATION
|
62
|
+
parameter = dummy_parameter(type, size, bytes)
|
63
|
+
else
|
64
|
+
parameter = dummy_parameter(type, size, bytes)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Return the result
|
68
|
+
return parameter
|
69
|
+
end
|
70
|
+
|
71
|
+
def write io, ip
|
72
|
+
header = [@type, @size].pack('nn')
|
73
|
+
|
74
|
+
# Write Parameter header followed by the payload
|
75
|
+
io.write(header)
|
76
|
+
io.write(@payload_raw)
|
77
|
+
end
|
78
|
+
|
79
|
+
def padded_size
|
80
|
+
if 0 == @size % 4
|
81
|
+
return @size
|
82
|
+
else
|
83
|
+
return (@size + 4 - (@size % 4))
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def to_s
|
88
|
+
return "parameter(%d, %d)" % [@type, @size]
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.dummy_parameter type, size, bytes
|
92
|
+
# Create new dummy parameter
|
93
|
+
parameter = Parameter.new
|
94
|
+
parameter.type = type
|
95
|
+
parameter.size = size
|
96
|
+
|
97
|
+
# Save the payload
|
98
|
+
parameter.payload = bytes[4..parameter.padded_size - 1]
|
99
|
+
parameter.payload_raw = parameter.payload
|
100
|
+
|
101
|
+
# Return the result
|
102
|
+
return parameter
|
103
|
+
end
|
104
|
+
end # class Parameter
|
105
|
+
|
106
|
+
end # class SCTP
|
107
|
+
end # class Pcap
|
108
|
+
end # module Mu
|
109
|
+
|
110
|
+
require 'mu/pcap/sctp/parameter/ip_address'
|