packetgen 2.4.0 → 2.5.0
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.
- checksums.yaml +5 -5
- data/.travis.yml +13 -4
- data/lib/packetgen.rb +3 -1
- data/lib/packetgen/capture.rb +2 -0
- data/lib/packetgen/config.rb +1 -0
- data/lib/packetgen/header.rb +5 -0
- data/lib/packetgen/header/arp.rb +2 -0
- data/lib/packetgen/header/asn1_base.rb +2 -0
- data/lib/packetgen/header/base.rb +16 -0
- data/lib/packetgen/header/bootp.rb +2 -0
- data/lib/packetgen/header/crypto.rb +2 -0
- data/lib/packetgen/header/dhcp.rb +2 -0
- data/lib/packetgen/header/dhcp/option.rb +3 -0
- data/lib/packetgen/header/dhcp/options.rb +2 -0
- data/lib/packetgen/header/dhcpv6.rb +109 -0
- data/lib/packetgen/header/dhcpv6/duid.rb +147 -0
- data/lib/packetgen/header/dhcpv6/option.rb +391 -0
- data/lib/packetgen/header/dhcpv6/options.rb +29 -0
- data/lib/packetgen/header/dhcpv6/relay.rb +48 -0
- data/lib/packetgen/header/dns.rb +10 -2
- data/lib/packetgen/header/dns/name.rb +7 -0
- data/lib/packetgen/header/dns/opt.rb +6 -0
- data/lib/packetgen/header/dns/option.rb +7 -0
- data/lib/packetgen/header/dns/qdsection.rb +7 -1
- data/lib/packetgen/header/dns/question.rb +7 -0
- data/lib/packetgen/header/dns/rr.rb +7 -0
- data/lib/packetgen/header/dns/rrsection.rb +7 -0
- data/lib/packetgen/header/dot11.rb +4 -2
- data/lib/packetgen/header/dot11/control.rb +2 -0
- data/lib/packetgen/header/dot11/data.rb +2 -0
- data/lib/packetgen/header/dot11/element.rb +2 -0
- data/lib/packetgen/header/dot11/management.rb +2 -0
- data/lib/packetgen/header/dot11/sub_mngt.rb +2 -0
- data/lib/packetgen/header/dot1q.rb +2 -0
- data/lib/packetgen/header/dot1x.rb +3 -1
- data/lib/packetgen/header/eap.rb +3 -1
- data/lib/packetgen/header/eap/fast.rb +2 -0
- data/lib/packetgen/header/eap/md5.rb +2 -0
- data/lib/packetgen/header/eap/tls.rb +2 -0
- data/lib/packetgen/header/eap/ttls.rb +2 -0
- data/lib/packetgen/header/esp.rb +7 -0
- data/lib/packetgen/header/eth.rb +2 -0
- data/lib/packetgen/header/gre.rb +4 -9
- data/lib/packetgen/header/http/headers.rb +2 -0
- data/lib/packetgen/header/http/request.rb +3 -1
- data/lib/packetgen/header/http/response.rb +3 -1
- data/lib/packetgen/header/icmp.rb +4 -11
- data/lib/packetgen/header/icmpv6.rb +4 -11
- data/lib/packetgen/header/igmp.rb +4 -11
- data/lib/packetgen/header/igmpv3.rb +4 -11
- data/lib/packetgen/header/igmpv3/group_record.rb +2 -0
- data/lib/packetgen/header/igmpv3/mq.rb +2 -0
- data/lib/packetgen/header/igmpv3/mr.rb +2 -0
- data/lib/packetgen/header/ike.rb +13 -6
- data/lib/packetgen/header/ike/auth.rb +2 -0
- data/lib/packetgen/header/ike/cert.rb +2 -0
- data/lib/packetgen/header/ike/certreq.rb +2 -0
- data/lib/packetgen/header/ike/id.rb +2 -0
- data/lib/packetgen/header/ike/ke.rb +2 -0
- data/lib/packetgen/header/ike/nonce.rb +2 -0
- data/lib/packetgen/header/ike/notify.rb +7 -0
- data/lib/packetgen/header/ike/payload.rb +9 -0
- data/lib/packetgen/header/ike/sa.rb +11 -4
- data/lib/packetgen/header/ike/sk.rb +7 -0
- data/lib/packetgen/header/ike/ts.rb +2 -0
- data/lib/packetgen/header/ike/vendor_id.rb +2 -0
- data/lib/packetgen/header/ip.rb +48 -11
- data/lib/packetgen/header/ip/addr.rb +8 -0
- data/lib/packetgen/header/ip/option.rb +2 -0
- data/lib/packetgen/header/ip/options.rb +2 -0
- data/lib/packetgen/header/ipv6.rb +5 -3
- data/lib/packetgen/header/ipv6/addr.rb +8 -0
- data/lib/packetgen/header/ipv6/extension.rb +2 -0
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +2 -0
- data/lib/packetgen/header/llc.rb +2 -0
- data/lib/packetgen/header/mld.rb +2 -0
- data/lib/packetgen/header/mldv2.rb +4 -2
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -1
- data/lib/packetgen/header/mldv2/mlq.rb +2 -0
- data/lib/packetgen/header/mldv2/mlr.rb +4 -2
- data/lib/packetgen/header/ospfv2.rb +249 -0
- data/lib/packetgen/header/ospfv2/db_description.rb +105 -0
- data/lib/packetgen/header/ospfv2/hello.rb +104 -0
- data/lib/packetgen/header/ospfv2/ls_ack.rb +55 -0
- data/lib/packetgen/header/ospfv2/ls_request.rb +90 -0
- data/lib/packetgen/header/ospfv2/ls_update.rb +72 -0
- data/lib/packetgen/header/ospfv2/lsa.rb +252 -0
- data/lib/packetgen/header/ospfv2/lsa_header.rb +122 -0
- data/lib/packetgen/header/ospfv3.rb +216 -0
- data/lib/packetgen/header/ospfv3/db_description.rb +114 -0
- data/lib/packetgen/header/ospfv3/hello.rb +104 -0
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +103 -0
- data/lib/packetgen/header/ospfv3/ls_ack.rb +51 -0
- data/lib/packetgen/header/ospfv3/ls_request.rb +108 -0
- data/lib/packetgen/header/ospfv3/ls_update.rb +74 -0
- data/lib/packetgen/header/ospfv3/lsa.rb +252 -0
- data/lib/packetgen/header/ospfv3/lsa_header.rb +123 -0
- data/lib/packetgen/header/snmp.rb +2 -0
- data/lib/packetgen/header/tcp.rb +14 -14
- data/lib/packetgen/header/tcp/option.rb +7 -1
- data/lib/packetgen/header/tcp/options.rb +7 -0
- data/lib/packetgen/header/tftp.rb +2 -0
- data/lib/packetgen/header/udp.rb +6 -14
- data/lib/packetgen/inspect.rb +5 -1
- data/lib/packetgen/packet.rb +3 -1
- data/lib/packetgen/pcapng.rb +2 -0
- data/lib/packetgen/pcapng/block.rb +2 -0
- data/lib/packetgen/pcapng/epb.rb +2 -0
- data/lib/packetgen/pcapng/file.rb +2 -0
- data/lib/packetgen/pcapng/idb.rb +2 -0
- data/lib/packetgen/pcapng/shb.rb +2 -0
- data/lib/packetgen/pcapng/spb.rb +2 -0
- data/lib/packetgen/pcapng/unknown_block.rb +2 -0
- data/lib/packetgen/proto.rb +2 -0
- data/lib/packetgen/types/array.rb +3 -0
- data/lib/packetgen/types/cstring.rb +3 -1
- data/lib/packetgen/types/enum.rb +2 -0
- data/lib/packetgen/types/fields.rb +8 -4
- data/lib/packetgen/types/int.rb +3 -1
- data/lib/packetgen/types/int_string.rb +2 -0
- data/lib/packetgen/types/oui.rb +2 -0
- data/lib/packetgen/types/string.rb +3 -0
- data/lib/packetgen/types/tlv.rb +8 -0
- data/lib/packetgen/utils.rb +6 -4
- data/lib/packetgen/utils/arp_spoofer.rb +2 -0
- data/lib/packetgen/version.rb +3 -1
- metadata +25 -3
@@ -0,0 +1,123 @@
|
|
1
|
+
# This file is part of PacketGen
|
2
|
+
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
+
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
+
# This program is published under MIT license.
|
5
|
+
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
8
|
+
module PacketGen
|
9
|
+
module Header
|
10
|
+
class OSPFv3
|
11
|
+
|
12
|
+
# This class handles {OSPFv3 OSPFv3} LSA header. A LSA header has the
|
13
|
+
# following format:
|
14
|
+
# 0 1 2 3
|
15
|
+
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
16
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
17
|
+
# | LS Age | LS Type |
|
18
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
19
|
+
# | Link State ID |
|
20
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
21
|
+
# | Advertising Router |
|
22
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
23
|
+
# | LS sequence number |
|
24
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
25
|
+
# | LS checksum | length |
|
26
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
27
|
+
#
|
28
|
+
# == About LSA headers
|
29
|
+
# LSA headers are used as-is in {DbDescription} and {LSAck} payloads.
|
30
|
+
# But this class is also a base class for different LSA class, as {LSARouter}.
|
31
|
+
# @author Sylvain Daubert
|
32
|
+
class LSAHeader < Types::Fields
|
33
|
+
# LSA known types
|
34
|
+
TYPES = {
|
35
|
+
'Router' => 0x2001,
|
36
|
+
'Network' => 0x2002,
|
37
|
+
'Inter-Area-Prefix' => 0x2003,
|
38
|
+
'Inter-Area-Router' => 0x2004,
|
39
|
+
'AS-External' => 0x4005,
|
40
|
+
'NSSA' => 0x2007,
|
41
|
+
'Link' => 0x0008,
|
42
|
+
'Intra-Area-Prefix' => 0x2009
|
43
|
+
}
|
44
|
+
|
45
|
+
# @!attribute age
|
46
|
+
# The time in seconds since the LSA was originated.
|
47
|
+
# @return [Integer]
|
48
|
+
define_field :age, Types::Int16
|
49
|
+
# @!attribute type
|
50
|
+
# The type of the LSA.
|
51
|
+
# @return [Integer]
|
52
|
+
define_field :type, Types::Int16Enum, enum: TYPES
|
53
|
+
# @!attribute link_state_id
|
54
|
+
# This field identifies the portion of the internet environment
|
55
|
+
# that is being described by the LSA.
|
56
|
+
# @return [String]
|
57
|
+
define_field :link_state_id, IP::Addr
|
58
|
+
# @!attribute advertising_router
|
59
|
+
# The Router ID of the router that originated the LSA.
|
60
|
+
# @return [String]
|
61
|
+
define_field :advertising_router, IP::Addr
|
62
|
+
# @!attribute sequence_number
|
63
|
+
# @return [Integer]
|
64
|
+
define_field :sequence_number, Types::Int32
|
65
|
+
alias seqnum sequence_number
|
66
|
+
alias seqnum= sequence_number=
|
67
|
+
# @!attribute checksum
|
68
|
+
# The Fletcher checksum of the complete contents of the LSA,
|
69
|
+
# including the LSA header but excluding the LS age field.
|
70
|
+
# @return [Integer]
|
71
|
+
define_field :checksum, Types::Int16
|
72
|
+
# @!attribute length
|
73
|
+
# Length of the LSA, including the header.
|
74
|
+
# @return [Integer]
|
75
|
+
define_field :length, Types::Int16
|
76
|
+
|
77
|
+
# Compute and set Fletcher-16 checksum on LSA
|
78
|
+
# @return [Integer]
|
79
|
+
def calc_checksum
|
80
|
+
self.checksum = 0
|
81
|
+
bytes = to_s[2..-1].unpack('C*')
|
82
|
+
|
83
|
+
c0 = c1 = 0
|
84
|
+
bytes.each do |byte|
|
85
|
+
c0 += byte
|
86
|
+
c1 += c0
|
87
|
+
end
|
88
|
+
c0 %= 255
|
89
|
+
c1 %= 255
|
90
|
+
|
91
|
+
x = ((sz - 16 - 1) * c0 - c1) % 255
|
92
|
+
x += 255 if x <= 0
|
93
|
+
y = 255 * 2 - c0 - x
|
94
|
+
y -= 255 if y > 255
|
95
|
+
self.checksum = (x << 8) | y
|
96
|
+
end
|
97
|
+
|
98
|
+
# Compute length and set +length+ field
|
99
|
+
# @return [Integer]
|
100
|
+
def calc_length
|
101
|
+
self.length = Base.calculate_and_set_length(self)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Get human-readable type
|
105
|
+
# @return [String]
|
106
|
+
def human_type
|
107
|
+
self[:type].to_human
|
108
|
+
end
|
109
|
+
|
110
|
+
# @return [String]
|
111
|
+
def to_human
|
112
|
+
"LSA<#{human_type},#{link_state_id},#{advertising_router}>"
|
113
|
+
end
|
114
|
+
|
115
|
+
# Extract header from current LSA
|
116
|
+
# @return [LSAHeader]
|
117
|
+
def to_lsa_header
|
118
|
+
LSAHeader.new(self.to_h)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
data/lib/packetgen/header/tcp.rb
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# This file is part of PacketGen
|
2
|
+
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
+
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
+
# This program is published under MIT license.
|
5
|
+
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
1
8
|
module PacketGen
|
2
9
|
module Header
|
3
10
|
|
@@ -7,7 +14,7 @@ module PacketGen
|
|
7
14
|
# * a sequence number ({#seqnum}, {Types::Int32} type),
|
8
15
|
# * an acknownledge number ({#acknum}, +Int32+ type),
|
9
16
|
# * a 16-bit field ({#u16}, +Int16+ type) composed of:
|
10
|
-
# * a 4-bit {#data_offset}
|
17
|
+
# * a 4-bit {#data_offset} self[attr],
|
11
18
|
# * a 3-bit {#reserved} field,
|
12
19
|
# * a 9-bit {#flags} field,
|
13
20
|
# * a {#window} field (+Int16+ type),
|
@@ -44,7 +51,7 @@ module PacketGen
|
|
44
51
|
# {#options} TCP attribute is a {Options}. {Option} may added to it:
|
45
52
|
# tcph.options << PacketGen::Header::TCP::MSS.new(1250)
|
46
53
|
# or:
|
47
|
-
# tcph.options << { opt: 'MSS',
|
54
|
+
# tcph.options << { opt: 'MSS', self[attr]: 1250 }
|
48
55
|
# @author Sylvain Daubert
|
49
56
|
class TCP < Base
|
50
57
|
end
|
@@ -188,15 +195,8 @@ module PacketGen
|
|
188
195
|
sum = ip_header(self).pseudo_header_checksum
|
189
196
|
sum += IP_PROTOCOL
|
190
197
|
sum += self.sz
|
191
|
-
|
192
|
-
|
193
|
-
sum += str.unpack('n*').reduce(:+)
|
194
|
-
|
195
|
-
while sum > 0xffff do
|
196
|
-
sum = (sum & 0xffff) + (sum >> 16)
|
197
|
-
end
|
198
|
-
sum = ~sum & 0xffff
|
199
|
-
self[:checksum].value = (sum == 0) ? 0xffff : sum
|
198
|
+
sum += IP.sum16(self)
|
199
|
+
self.checksum = IP.reduce_checksum(sum)
|
200
200
|
end
|
201
201
|
|
202
202
|
# Compute header length and set +data_offset+ field
|
@@ -212,14 +212,14 @@ module PacketGen
|
|
212
212
|
def inspect
|
213
213
|
str = Inspect.dashed_line(self.class, 2)
|
214
214
|
shift = Inspect.shift_level(2)
|
215
|
-
|
215
|
+
fields.each do |attr|
|
216
216
|
next if attr == :body
|
217
|
-
str << Inspect.inspect_attribute(attr,
|
217
|
+
str << Inspect.inspect_attribute(attr, self[attr], 2)
|
218
218
|
if attr == :u16
|
219
219
|
doff = Inspect.int_dec_hex(data_offset, 1)
|
220
220
|
str << shift + Inspect::FMT_ATTR % ['', 'data_offset', doff]
|
221
221
|
str << shift + Inspect::FMT_ATTR % ['', 'reserved', reserved]
|
222
|
-
flags = ''
|
222
|
+
flags = ''.dup
|
223
223
|
%w(ns cwr ece urg ack psh rst syn fin).each do |fl|
|
224
224
|
flags << (send("flag_#{fl}?") ? fl[0].upcase : '.')
|
225
225
|
end
|
@@ -1,3 +1,10 @@
|
|
1
|
+
# This file is part of PacketGen
|
2
|
+
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
+
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
+
# This program is published under MIT license.
|
5
|
+
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
1
8
|
module PacketGen
|
2
9
|
module Header
|
3
10
|
class TCP
|
@@ -235,4 +242,3 @@ module PacketGen
|
|
235
242
|
end
|
236
243
|
end
|
237
244
|
end
|
238
|
-
|
@@ -1,3 +1,10 @@
|
|
1
|
+
# This file is part of PacketGen
|
2
|
+
# See https://github.com/sdaubert/packetgen for more informations
|
3
|
+
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
|
+
# This program is published under MIT license.
|
5
|
+
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
1
8
|
module PacketGen
|
2
9
|
module Header
|
3
10
|
class TCP
|
data/lib/packetgen/header/udp.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
4
|
# This program is published under MIT license.
|
5
5
|
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
6
8
|
module PacketGen
|
7
9
|
module Header
|
8
10
|
|
@@ -72,25 +74,15 @@ module PacketGen
|
|
72
74
|
ip = ip_header(self)
|
73
75
|
sum = ip.pseudo_header_checksum
|
74
76
|
sum += IP_PROTOCOL
|
75
|
-
sum +=
|
76
|
-
sum +=
|
77
|
-
|
78
|
-
sum += length
|
79
|
-
payload = body.to_s
|
80
|
-
payload << "\x00" unless payload.size % 2 == 0
|
81
|
-
payload.unpack('n*').each { |x| sum += x }
|
82
|
-
|
83
|
-
while sum > 0xffff do
|
84
|
-
sum = (sum & 0xffff) + (sum >> 16)
|
85
|
-
end
|
86
|
-
sum = ~sum & 0xffff
|
87
|
-
self[:checksum].value = (sum == 0) ? 0xffff : sum
|
77
|
+
sum += self.sz
|
78
|
+
sum += IP.sum16(self)
|
79
|
+
self.checksum = IP.reduce_checksum(sum)
|
88
80
|
end
|
89
81
|
|
90
82
|
# Compute length and set +length+ field
|
91
83
|
# @return [Integer]
|
92
84
|
def calc_length
|
93
|
-
|
85
|
+
Base.calculate_and_set_length self
|
94
86
|
end
|
95
87
|
end
|
96
88
|
|
data/lib/packetgen/inspect.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
4
|
# This program is published under MIT license.
|
5
5
|
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
6
8
|
module PacketGen
|
7
9
|
|
8
10
|
# {Inspect} module provides methods to help writing +inspect+
|
@@ -27,7 +29,7 @@ module PacketGen
|
|
27
29
|
|
28
30
|
# @return [String]
|
29
31
|
def self.shift_level(level=1)
|
30
|
-
' '
|
32
|
+
' ' * (level + 1)
|
31
33
|
end
|
32
34
|
|
33
35
|
# @param [#to_i] value
|
@@ -53,6 +55,8 @@ module PacketGen
|
|
53
55
|
"%-10s (0x%0#{value.sz * 2}x)" % [value.to_human, value.to_i]
|
54
56
|
elsif value.is_a?(Types::Int) or value.is_a?(Integer)
|
55
57
|
int_dec_hex(value, value.sz * 2)
|
58
|
+
elsif value.is_a?(String)
|
59
|
+
value.to_s.inspect
|
56
60
|
elsif value.respond_to? :to_human
|
57
61
|
value.to_human
|
58
62
|
else
|
data/lib/packetgen/packet.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
# See https://github.com/sdaubert/packetgen for more informations
|
4
4
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
5
5
|
# This program is published under MIT license.
|
6
|
+
|
7
|
+
# frozen_string_literal: true
|
6
8
|
require 'pcaprub'
|
7
9
|
|
8
10
|
module PacketGen
|
@@ -377,7 +379,7 @@ module PacketGen
|
|
377
379
|
if bindings.nil?
|
378
380
|
bindings = prev_header.class.known_headers[header.class.superclass]
|
379
381
|
if bindings.nil?
|
380
|
-
msg = "#{prev_header.class} knowns no layer association with #{header.protocol_name}. "
|
382
|
+
msg = "#{prev_header.class} knowns no layer association with #{header.protocol_name}. ".dup
|
381
383
|
msg << "Try #{prev_header.class}.bind_layer(#{header.class}, "
|
382
384
|
msg << "#{prev_header.method_name}_proto_field: "
|
383
385
|
msg << "value_for_#{header.method_name})"
|
data/lib/packetgen/pcapng.rb
CHANGED
data/lib/packetgen/pcapng/epb.rb
CHANGED
data/lib/packetgen/pcapng/idb.rb
CHANGED
data/lib/packetgen/pcapng/shb.rb
CHANGED
data/lib/packetgen/pcapng/spb.rb
CHANGED
data/lib/packetgen/proto.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
4
4
|
# This program is published under MIT license.
|
5
5
|
|
6
|
+
# frozen_string_literal: true
|
7
|
+
|
6
8
|
module PacketGen
|
7
9
|
module Types
|
8
10
|
|
@@ -40,6 +42,7 @@ module PacketGen
|
|
40
42
|
def read(str)
|
41
43
|
clear
|
42
44
|
return self if str.nil?
|
45
|
+
return self if @counter and @counter.to_i == 0
|
43
46
|
force_binary str
|
44
47
|
klass = self.class.class_eval { @klass }
|
45
48
|
while str.length > 0
|
@@ -4,6 +4,8 @@
|
|
4
4
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
5
5
|
# This program is published under MIT license.
|
6
6
|
|
7
|
+
# frozen_string_literal: true
|
8
|
+
|
7
9
|
module PacketGen
|
8
10
|
module Types
|
9
11
|
|
@@ -59,7 +61,7 @@ module PacketGen
|
|
59
61
|
# @return [String]
|
60
62
|
def to_human
|
61
63
|
idx = self.index(0.chr) || self.sz
|
62
|
-
self[0, idx]
|
64
|
+
self[0, idx]
|
63
65
|
end
|
64
66
|
end
|
65
67
|
end
|