packetgen 3.3.0 → 3.3.2
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 +4 -4
- data/LICENSE +1 -0
- data/README.md +7 -7
- data/lib/packetgen/capture.rb +2 -1
- data/lib/packetgen/config.rb +2 -1
- data/lib/packetgen/header/arp.rb +2 -1
- data/lib/packetgen/header/asn1_base.rb +2 -1
- data/lib/packetgen/header/base.rb +4 -3
- data/lib/packetgen/header/bootp.rb +2 -1
- data/lib/packetgen/header/dhcp/option.rb +2 -1
- data/lib/packetgen/header/dhcp/options.rb +2 -1
- data/lib/packetgen/header/dhcp.rb +2 -1
- data/lib/packetgen/header/dhcpv6/duid.rb +2 -1
- data/lib/packetgen/header/dhcpv6/option.rb +2 -1
- data/lib/packetgen/header/dhcpv6/options.rb +2 -1
- data/lib/packetgen/header/dhcpv6/relay.rb +2 -1
- data/lib/packetgen/header/dhcpv6.rb +2 -1
- data/lib/packetgen/header/dns/name.rb +2 -1
- data/lib/packetgen/header/dns/opt.rb +3 -2
- data/lib/packetgen/header/dns/option.rb +3 -2
- data/lib/packetgen/header/dns/qdsection.rb +2 -1
- data/lib/packetgen/header/dns/question.rb +2 -1
- data/lib/packetgen/header/dns/rr.rb +2 -1
- data/lib/packetgen/header/dns/rrsection.rb +2 -1
- data/lib/packetgen/header/dns.rb +3 -2
- data/lib/packetgen/header/dot11/control.rb +2 -1
- data/lib/packetgen/header/dot11/data.rb +4 -3
- data/lib/packetgen/header/dot11/element.rb +2 -1
- data/lib/packetgen/header/dot11/management.rb +2 -1
- data/lib/packetgen/header/dot11/sub_mngt.rb +2 -1
- data/lib/packetgen/header/dot11.rb +2 -1
- data/lib/packetgen/header/dot1q.rb +2 -1
- data/lib/packetgen/header/dot1x.rb +2 -1
- data/lib/packetgen/header/eap/fast.rb +2 -1
- data/lib/packetgen/header/eap/md5.rb +2 -1
- data/lib/packetgen/header/eap/tls.rb +3 -2
- data/lib/packetgen/header/eap/ttls.rb +3 -2
- data/lib/packetgen/header/eap.rb +3 -2
- data/lib/packetgen/header/eth.rb +3 -2
- data/lib/packetgen/header/gre.rb +2 -1
- data/lib/packetgen/header/http/headers.rb +4 -3
- data/lib/packetgen/header/http/request.rb +2 -1
- data/lib/packetgen/header/http/response.rb +2 -1
- data/lib/packetgen/header/http/verbs.rb +2 -1
- data/lib/packetgen/header/http.rb +2 -1
- data/lib/packetgen/header/icmp.rb +2 -1
- data/lib/packetgen/header/icmpv6.rb +2 -1
- data/lib/packetgen/header/igmp.rb +2 -1
- data/lib/packetgen/header/igmpv3/group_record.rb +2 -1
- data/lib/packetgen/header/igmpv3/mq.rb +2 -1
- data/lib/packetgen/header/igmpv3/mr.rb +2 -1
- data/lib/packetgen/header/igmpv3.rb +2 -1
- data/lib/packetgen/header/ip/addr.rb +2 -1
- data/lib/packetgen/header/ip/option.rb +3 -2
- data/lib/packetgen/header/ip/options.rb +2 -1
- data/lib/packetgen/header/ip.rb +3 -2
- data/lib/packetgen/header/ipv6/addr.rb +2 -1
- data/lib/packetgen/header/ipv6/extension.rb +2 -1
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +2 -1
- data/lib/packetgen/header/ipv6.rb +2 -1
- data/lib/packetgen/header/llc.rb +2 -1
- data/lib/packetgen/header/mdns.rb +2 -1
- data/lib/packetgen/header/mld.rb +2 -1
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +2 -1
- data/lib/packetgen/header/mldv2/mlq.rb +2 -1
- data/lib/packetgen/header/mldv2/mlr.rb +2 -1
- data/lib/packetgen/header/mldv2.rb +2 -1
- data/lib/packetgen/header/ospfv2/db_description.rb +2 -1
- data/lib/packetgen/header/ospfv2/hello.rb +2 -1
- data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -1
- data/lib/packetgen/header/ospfv2/ls_request.rb +2 -1
- data/lib/packetgen/header/ospfv2/ls_update.rb +2 -1
- data/lib/packetgen/header/ospfv2/lsa.rb +2 -1
- data/lib/packetgen/header/ospfv2/lsa_header.rb +2 -1
- data/lib/packetgen/header/ospfv2.rb +2 -1
- data/lib/packetgen/header/ospfv3/db_description.rb +2 -1
- data/lib/packetgen/header/ospfv3/hello.rb +2 -1
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +2 -1
- data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -1
- data/lib/packetgen/header/ospfv3/ls_request.rb +2 -1
- data/lib/packetgen/header/ospfv3/ls_update.rb +2 -1
- data/lib/packetgen/header/ospfv3/lsa.rb +2 -1
- data/lib/packetgen/header/ospfv3/lsa_header.rb +2 -1
- data/lib/packetgen/header/ospfv3.rb +2 -1
- data/lib/packetgen/header/sctp/chunk.rb +547 -0
- data/lib/packetgen/header/sctp/error.rb +347 -0
- data/lib/packetgen/header/sctp/padded32.rb +34 -0
- data/lib/packetgen/header/sctp/parameter.rb +229 -0
- data/lib/packetgen/header/sctp.rb +96 -0
- data/lib/packetgen/header/snmp.rb +3 -2
- data/lib/packetgen/header/tcp/option.rb +2 -1
- data/lib/packetgen/header/tcp/options.rb +2 -1
- data/lib/packetgen/header/tcp.rb +3 -2
- data/lib/packetgen/header/tftp.rb +2 -1
- data/lib/packetgen/header/udp.rb +2 -1
- data/lib/packetgen/header.rb +4 -2
- data/lib/packetgen/headerable.rb +2 -1
- data/lib/packetgen/inject.rb +2 -1
- data/lib/packetgen/inspect.rb +2 -1
- data/lib/packetgen/packet.rb +4 -3
- data/lib/packetgen/pcap.rb +2 -1
- data/lib/packetgen/pcapng/block.rb +3 -2
- data/lib/packetgen/pcapng/epb.rb +2 -1
- data/lib/packetgen/pcapng/file.rb +2 -1
- data/lib/packetgen/pcapng/idb.rb +2 -1
- data/lib/packetgen/pcapng/shb.rb +2 -1
- data/lib/packetgen/pcapng/spb.rb +2 -1
- data/lib/packetgen/pcapng/unknown_block.rb +2 -1
- data/lib/packetgen/pcapng.rb +2 -1
- data/lib/packetgen/pcaprub_wrapper.rb +2 -1
- data/lib/packetgen/proto.rb +2 -1
- data/lib/packetgen/types/abstract_tlv.rb +146 -56
- data/lib/packetgen/types/array.rb +20 -3
- data/lib/packetgen/types/cstring.rb +2 -1
- data/lib/packetgen/types/enum.rb +3 -2
- data/lib/packetgen/types/fieldable.rb +3 -2
- data/lib/packetgen/types/fields.rb +8 -7
- data/lib/packetgen/types/int.rb +114 -13
- data/lib/packetgen/types/int_string.rb +2 -1
- data/lib/packetgen/types/length_from.rb +2 -1
- data/lib/packetgen/types/oui.rb +2 -1
- data/lib/packetgen/types/string.rb +2 -1
- data/lib/packetgen/types/tlv.rb +2 -1
- data/lib/packetgen/types.rb +2 -1
- data/lib/packetgen/unknown_packet.rb +3 -2
- data/lib/packetgen/utils/arp_spoofer.rb +4 -3
- data/lib/packetgen/utils.rb +2 -1
- data/lib/packetgen/version.rb +3 -2
- data/lib/packetgen.rb +2 -1
- metadata +27 -16
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
# This file is part of PacketGen
|
|
5
|
-
# See https://github.com/
|
|
5
|
+
# See https://github.com/lemontree55/packetgen for more informations
|
|
6
6
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
|
7
|
+
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
|
7
8
|
# This program is published under MIT license.
|
|
8
9
|
|
|
9
10
|
module PacketGen
|
|
@@ -60,65 +61,125 @@ module PacketGen
|
|
|
60
61
|
class AbstractTLV < Types::Fields
|
|
61
62
|
include Fieldable
|
|
62
63
|
|
|
64
|
+
# @private
|
|
65
|
+
FIELD_TYPES = { 'T' => :type, 'L' => :length, 'V' => :value }.freeze
|
|
66
|
+
|
|
63
67
|
class << self
|
|
64
68
|
# @return [Hash]
|
|
65
69
|
attr_accessor :aliases
|
|
70
|
+
# @deprecated
|
|
66
71
|
attr_accessor :header_in_length
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
# @param [Class] type_class Class to use for +type+
|
|
72
|
-
# @param [Class] length_class Class to use for +length+
|
|
73
|
-
# @param [Class] value_class Class to use for +value+
|
|
74
|
-
# @param [Boolean] header_in_length if +true +, +type+ and +length+ fields are
|
|
75
|
-
# included in length
|
|
76
|
-
# @return [Class]
|
|
77
|
-
# @since 3.1.4 Add +header_in_length+ parameter
|
|
78
|
-
def self.create(type_class: Int8Enum, length_class: Int8, value_class: String,
|
|
79
|
-
aliases: {}, header_in_length: false)
|
|
80
|
-
raise Error, '.create cannot be called on a subclass of PacketGen::Types::AbstractTLV' unless self.equal? AbstractTLV
|
|
81
|
-
|
|
82
|
-
klass = Class.new(self)
|
|
83
|
-
klass.aliases = aliases
|
|
84
|
-
klass.header_in_length = header_in_length
|
|
85
|
-
|
|
86
|
-
if type_class < Enum
|
|
87
|
-
klass.define_field :type, type_class, enum: {}
|
|
88
|
-
else
|
|
89
|
-
klass.define_field :type, type_class
|
|
90
|
-
end
|
|
91
|
-
klass.define_field :length, length_class
|
|
92
|
-
klass.define_field :value, value_class
|
|
72
|
+
# @private
|
|
73
|
+
attr_accessor :field_in_length
|
|
74
|
+
|
|
75
|
+
# rubocop:disable Metrics/ParameterLists
|
|
93
76
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
77
|
+
# Generate a TLV class
|
|
78
|
+
# @param [Class] type_class Class to use for +type+
|
|
79
|
+
# @param [Class] length_class Class to use for +length+
|
|
80
|
+
# @param [Class] value_class Class to use for +value+
|
|
81
|
+
# @param [Boolean] header_in_length if +true +, +type+ and +length+ fields are
|
|
82
|
+
# included in length. Deprecated, use +field_in_length+ instead.
|
|
83
|
+
# @param [String] field_order give field order. Each character in [T,L,V] MUST be present once, in the desired order.
|
|
84
|
+
# @param [String] field_in_length give fields to compute length on.
|
|
85
|
+
# @return [Class]
|
|
86
|
+
# @since 3.1.4 Add +header_in_length+ parameter
|
|
87
|
+
# @since 3.3.1 Add +field_order+ and +field_in_length' parameters. Deprecate +header_in_length+ parameter.
|
|
88
|
+
def create(type_class: Int8Enum, length_class: Int8, value_class: String,
|
|
89
|
+
aliases: {}, header_in_length: false, field_order: 'TLV', field_in_length: 'V')
|
|
90
|
+
Deprecation.deprecated_option(self, 'create', 'header_in_length', klass_method: true) if header_in_length
|
|
91
|
+
raise Error, '.create cannot be called on a subclass of PacketGen::Types::AbstractTLV' unless self.equal?(AbstractTLV)
|
|
92
|
+
|
|
93
|
+
klass = Class.new(self)
|
|
94
|
+
klass.aliases = aliases
|
|
95
|
+
klass.header_in_length = header_in_length
|
|
96
|
+
klass.field_in_length = field_in_length
|
|
97
|
+
|
|
98
|
+
check_field_in_length(field_in_length)
|
|
99
|
+
check_field_order(field_order)
|
|
100
|
+
generate_fields(klass, field_order, type_class, length_class, value_class)
|
|
101
|
+
|
|
102
|
+
aliases.each do |al, orig|
|
|
103
|
+
klass.instance_eval do
|
|
104
|
+
alias_method al, orig if klass.method_defined?(orig)
|
|
105
|
+
alias_method :"#{al}=", :"#{orig}=" if klass.method_defined?(:"#{orig}=")
|
|
106
|
+
end
|
|
98
107
|
end
|
|
108
|
+
|
|
109
|
+
klass
|
|
110
|
+
end
|
|
111
|
+
# rubocop:enable Metrics/ParameterLists
|
|
112
|
+
|
|
113
|
+
# @!attribute type
|
|
114
|
+
# @abstract Type attribute for real TLV class
|
|
115
|
+
# @return [Integer]
|
|
116
|
+
# @!attribute length
|
|
117
|
+
# @abstract Length attribute for real TLV class
|
|
118
|
+
# @return [Integer]
|
|
119
|
+
# @!attribute value
|
|
120
|
+
# @abstract Value attribute for real TLV class
|
|
121
|
+
# @return [Object]
|
|
122
|
+
|
|
123
|
+
# @abstract Should only be called on real TLV classes, created by {.create}.
|
|
124
|
+
# Set enum hash for {#type} field.
|
|
125
|
+
# @param [Hash{String, Symbol => Integer}] hsh enum hash
|
|
126
|
+
# @return [void]
|
|
127
|
+
def define_type_enum(hsh)
|
|
128
|
+
field_defs[:type][:enum].clear
|
|
129
|
+
field_defs[:type][:enum].merge!(hsh)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# @abstract Should only be called on real TLV classes, created by {.create}.
|
|
133
|
+
# Set default value for {#type} field.
|
|
134
|
+
# @param [Integer,String,Symbol,nil] default default value from +hsh+ for type
|
|
135
|
+
# @return [void]
|
|
136
|
+
# @since 3.4.0
|
|
137
|
+
def define_type_default(default)
|
|
138
|
+
field_defs[:type][:default] = default
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
private
|
|
142
|
+
|
|
143
|
+
def check_field_in_length(field_in_length)
|
|
144
|
+
return if /^[TLV]{1,3}$/.match?(field_in_length)
|
|
145
|
+
|
|
146
|
+
raise 'field_in_length must only contain T, L and/or V characters'
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def check_field_order(field_order)
|
|
150
|
+
return if field_order.match(/^[TLV]{3,3}$/) && (field_order[0] != field_order[1]) && (field_order[0] != field_order[2]) && (field_order[1] != field_order[2])
|
|
151
|
+
|
|
152
|
+
raise 'field_order must contain all three letters TLV, each once'
|
|
99
153
|
end
|
|
100
154
|
|
|
101
|
-
klass
|
|
155
|
+
def generate_fields(klass, field_order, type_class, length_class, value_class)
|
|
156
|
+
field_order.each_char do |field_type|
|
|
157
|
+
case field_type
|
|
158
|
+
when 'T'
|
|
159
|
+
if type_class < Enum
|
|
160
|
+
klass.define_field(:type, type_class, enum: {})
|
|
161
|
+
else
|
|
162
|
+
klass.define_field(:type, type_class)
|
|
163
|
+
end
|
|
164
|
+
when 'L'
|
|
165
|
+
klass.define_field(:length, length_class)
|
|
166
|
+
when 'V'
|
|
167
|
+
klass.define_field(:value, value_class)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
102
171
|
end
|
|
172
|
+
|
|
103
173
|
# @!attribute type
|
|
104
|
-
# @abstract Type attribute
|
|
174
|
+
# @abstract Type attribute
|
|
105
175
|
# @return [Integer]
|
|
106
176
|
# @!attribute length
|
|
107
|
-
# @abstract Length
|
|
177
|
+
# @abstract Length
|
|
108
178
|
# @return [Integer]
|
|
109
179
|
# @!attribute value
|
|
110
|
-
# @abstract Value attribute
|
|
180
|
+
# @abstract Value attribute
|
|
111
181
|
# @return [Object]
|
|
112
182
|
|
|
113
|
-
# @abstract Should only be called on real TLV classes, created by {.create}.
|
|
114
|
-
# Set enum hash for {#type} field.
|
|
115
|
-
# @param [Hash] hsh enum hash
|
|
116
|
-
# @return [void]
|
|
117
|
-
def self.define_type_enum(hsh)
|
|
118
|
-
field_defs[:type][:enum].clear
|
|
119
|
-
field_defs[:type][:enum].merge!(hsh)
|
|
120
|
-
end
|
|
121
|
-
|
|
122
183
|
# @abstract Should only be called on real TLV classes, created by {.create}.
|
|
123
184
|
# @param [Hash] options
|
|
124
185
|
# @option options [Integer] :type
|
|
@@ -126,6 +187,7 @@ module PacketGen
|
|
|
126
187
|
# @option options [Object] :value
|
|
127
188
|
def initialize(options={})
|
|
128
189
|
@header_in_length = self.class.header_in_length
|
|
190
|
+
@field_in_length = self.class.field_in_length
|
|
129
191
|
self.class.aliases.each do |al, orig|
|
|
130
192
|
options[orig] = options[al] if options.key?(al)
|
|
131
193
|
end
|
|
@@ -133,30 +195,41 @@ module PacketGen
|
|
|
133
195
|
super
|
|
134
196
|
# used #value= defined below, which set length if needed
|
|
135
197
|
self.value = options[:value] if options[:value]
|
|
198
|
+
calc_length unless options.key?(:length)
|
|
136
199
|
end
|
|
137
200
|
|
|
138
201
|
# @abstract Should only be called on real TLV class instances.
|
|
139
202
|
# Populate object from a binary string
|
|
140
|
-
# @param [String] str
|
|
203
|
+
# @param [String,nil] str
|
|
141
204
|
# @return [Fields] self
|
|
142
205
|
def read(str)
|
|
206
|
+
return self if str.nil?
|
|
207
|
+
|
|
143
208
|
idx = 0
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
209
|
+
fields.each do |field_name|
|
|
210
|
+
field = self[field_name]
|
|
211
|
+
length = field_name == :value ? real_length : field.sz
|
|
212
|
+
field.read(str[idx, length])
|
|
213
|
+
idx += field.sz
|
|
214
|
+
end
|
|
215
|
+
|
|
149
216
|
self
|
|
150
217
|
end
|
|
151
218
|
|
|
152
219
|
# @abstract Should only be called on real TLV class instances.
|
|
153
220
|
# Set +value+. May set +length+ if value is a {Types::String}.
|
|
154
|
-
# @param [
|
|
155
|
-
# @return [
|
|
221
|
+
# @param [Object] val
|
|
222
|
+
# @return [Object]
|
|
223
|
+
# @since 3.4.0 Base on field's +#from_human+ method
|
|
156
224
|
def value=(val)
|
|
157
|
-
self[:value].
|
|
158
|
-
|
|
159
|
-
|
|
225
|
+
if val.is_a?(self[:value].class)
|
|
226
|
+
self[:value] = val
|
|
227
|
+
elsif self[:value].respond_to?(:from_human)
|
|
228
|
+
self[:value].from_human(val)
|
|
229
|
+
else
|
|
230
|
+
self[:value].read(val)
|
|
231
|
+
end
|
|
232
|
+
calc_length
|
|
160
233
|
val
|
|
161
234
|
end
|
|
162
235
|
|
|
@@ -174,13 +247,30 @@ module PacketGen
|
|
|
174
247
|
'type:%s,length:%u,value:%s' % [human_type, length, my_value]
|
|
175
248
|
end
|
|
176
249
|
|
|
250
|
+
# Calculate length
|
|
251
|
+
# @return [void]
|
|
252
|
+
# @since 3.4.0
|
|
253
|
+
def calc_length
|
|
254
|
+
fil = @field_in_length
|
|
255
|
+
fil = 'TLV' if @header_in_length
|
|
256
|
+
|
|
257
|
+
length = 0
|
|
258
|
+
fil.each_char do |field_type|
|
|
259
|
+
length += self[FIELD_TYPES[field_type]].sz
|
|
260
|
+
end
|
|
261
|
+
self.length = length
|
|
262
|
+
end
|
|
263
|
+
|
|
177
264
|
private
|
|
178
265
|
|
|
179
266
|
def real_length
|
|
180
267
|
if @header_in_length
|
|
181
268
|
self.length - self[:type].sz - self[:length].sz
|
|
182
269
|
else
|
|
183
|
-
self.length
|
|
270
|
+
length = self.length
|
|
271
|
+
length -= self[:type].sz if @field_in_length.include?('T')
|
|
272
|
+
length -= self[:length].sz if @field_in_length.include?('L')
|
|
273
|
+
length
|
|
184
274
|
end
|
|
185
275
|
end
|
|
186
276
|
end
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
# This file is part of PacketGen
|
|
4
|
-
# See https://github.com/
|
|
4
|
+
# See https://github.com/lemontree55/packetgen for more informations
|
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
|
6
|
+
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
|
6
7
|
# This program is published under MIT license.
|
|
7
8
|
|
|
8
9
|
require 'forwardable'
|
|
@@ -225,8 +226,8 @@ module PacketGen
|
|
|
225
226
|
klass == obj_klass ? obj : klass.new(hsh)
|
|
226
227
|
end
|
|
227
228
|
|
|
228
|
-
def real_type(
|
|
229
|
-
|
|
229
|
+
def real_type(_obj)
|
|
230
|
+
self.class.set_of_klass
|
|
230
231
|
end
|
|
231
232
|
|
|
232
233
|
def create_object_from_str(str)
|
|
@@ -242,28 +243,44 @@ module PacketGen
|
|
|
242
243
|
end
|
|
243
244
|
end
|
|
244
245
|
|
|
246
|
+
# @private
|
|
247
|
+
module ArrayOfIntMixin
|
|
248
|
+
def read_from_array(ary)
|
|
249
|
+
return self if ary.empty?
|
|
250
|
+
|
|
251
|
+
ary.each do |i|
|
|
252
|
+
self << self.class.set_of_klass.new(i)
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
245
257
|
# Specialized array to handle serie of {Int8}.
|
|
246
258
|
class ArrayOfInt8 < Array
|
|
259
|
+
include ArrayOfIntMixin
|
|
247
260
|
set_of Int8
|
|
248
261
|
end
|
|
249
262
|
|
|
250
263
|
# Specialized array to handle serie of {Int16}.
|
|
251
264
|
class ArrayOfInt16 < Array
|
|
265
|
+
include ArrayOfIntMixin
|
|
252
266
|
set_of Int16
|
|
253
267
|
end
|
|
254
268
|
|
|
255
269
|
# Specialized array to handle serie of {Int16le}.
|
|
256
270
|
class ArrayOfInt16le < Array
|
|
271
|
+
include ArrayOfIntMixin
|
|
257
272
|
set_of Int16le
|
|
258
273
|
end
|
|
259
274
|
|
|
260
275
|
# Specialized array to handle serie of {Int32}.
|
|
261
276
|
class ArrayOfInt32 < Types::Array
|
|
277
|
+
include ArrayOfIntMixin
|
|
262
278
|
set_of Types::Int32
|
|
263
279
|
end
|
|
264
280
|
|
|
265
281
|
# Specialized array to handle serie of {Int32le}.
|
|
266
282
|
class ArrayOfInt32le < Types::Array
|
|
283
|
+
include ArrayOfIntMixin
|
|
267
284
|
set_of Types::Int32le
|
|
268
285
|
end
|
|
269
286
|
end
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
# This file is part of PacketGen
|
|
5
|
-
# See https://github.com/
|
|
5
|
+
# See https://github.com/lemontree55/packetgen for more informations
|
|
6
6
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
|
7
|
+
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
|
7
8
|
# This program is published under MIT license.
|
|
8
9
|
|
|
9
10
|
require 'forwardable'
|
data/lib/packetgen/types/enum.rb
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
# This file is part of PacketGen
|
|
5
|
-
# See https://github.com/
|
|
5
|
+
# See https://github.com/lemontree55/packetgen for more informations
|
|
6
6
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
|
7
|
+
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
|
7
8
|
# This program is published under MIT license.
|
|
8
9
|
|
|
9
10
|
module PacketGen
|
|
@@ -14,7 +15,7 @@ module PacketGen
|
|
|
14
15
|
# and named values.
|
|
15
16
|
#
|
|
16
17
|
# == Simple example
|
|
17
|
-
# enum = Int8Enum.new(
|
|
18
|
+
# enum = Int8Enum.new('low' => 0, 'medium' => 1, 'high' => 2})
|
|
18
19
|
# In this example, +enum+ is a 8-bit field which may take one
|
|
19
20
|
# among three values: +low+, +medium+ or +high+:
|
|
20
21
|
# enum.value = 'high'
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
# This file is part of PacketGen
|
|
4
|
-
# See https://github.com/
|
|
4
|
+
# See https://github.com/lemontree55/packetgen for more informations
|
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
|
6
|
+
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
|
6
7
|
# This program is published under MIT license.
|
|
7
8
|
|
|
8
9
|
module PacketGen
|
|
@@ -55,7 +56,7 @@ module PacketGen
|
|
|
55
56
|
|
|
56
57
|
# rubocop:enable Lint/UselessMethodDefinition
|
|
57
58
|
|
|
58
|
-
# Format object when inspecting a {
|
|
59
|
+
# Format object when inspecting a {Fields} object
|
|
59
60
|
# @return [String]
|
|
60
61
|
def format_inspect
|
|
61
62
|
to_human
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
# This file is part of PacketGen
|
|
4
|
-
# See https://github.com/
|
|
4
|
+
# See https://github.com/lemontree55/packetgen for more informations
|
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
|
6
|
+
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
|
6
7
|
# This program is published under MIT license.
|
|
7
8
|
|
|
8
9
|
# rubocop:disable Metrics/ClassLength
|
|
@@ -236,7 +237,7 @@ module PacketGen
|
|
|
236
237
|
fields.delete name
|
|
237
238
|
@field_defs.delete name
|
|
238
239
|
undef_method name if method_defined?(name)
|
|
239
|
-
undef_method "#{name}=" if method_defined?("#{name}=")
|
|
240
|
+
undef_method :"#{name}=" if method_defined?(:"#{name}=")
|
|
240
241
|
end
|
|
241
242
|
|
|
242
243
|
# Update a previously defined field
|
|
@@ -309,7 +310,7 @@ module PacketGen
|
|
|
309
310
|
return if fields.nil?
|
|
310
311
|
|
|
311
312
|
fields.each do |field, size|
|
|
312
|
-
undef_method "#{field}="
|
|
313
|
+
undef_method :"#{field}="
|
|
313
314
|
undef_method(size == 1 ? "#{field}?" : field)
|
|
314
315
|
end
|
|
315
316
|
end
|
|
@@ -332,7 +333,7 @@ module PacketGen
|
|
|
332
333
|
# rubocop:enable Layout/LineContinuationLeadingSpace
|
|
333
334
|
end
|
|
334
335
|
|
|
335
|
-
define.delete_at(1) if instance_methods.include?
|
|
336
|
+
define.delete_at(1) if instance_methods.include?(:"#{name}=")
|
|
336
337
|
define.delete_at(0) if instance_methods.include? name
|
|
337
338
|
class_eval define.join("\n")
|
|
338
339
|
end
|
|
@@ -393,7 +394,7 @@ module PacketGen
|
|
|
393
394
|
end
|
|
394
395
|
|
|
395
396
|
def field_defs_property_from(field, property, options)
|
|
396
|
-
field_defs[field].send("#{property}=", options.delete(property)) if options.key?(property)
|
|
397
|
+
field_defs[field].send(:"#{property}=", options.delete(property)) if options.key?(property)
|
|
397
398
|
end
|
|
398
399
|
|
|
399
400
|
def size_from(args)
|
|
@@ -422,9 +423,9 @@ module PacketGen
|
|
|
422
423
|
initialize_optional field
|
|
423
424
|
end
|
|
424
425
|
|
|
425
|
-
self.class.bit_fields.
|
|
426
|
+
self.class.bit_fields.each_value do |hsh|
|
|
426
427
|
hsh.each_key do |bit_field|
|
|
427
|
-
self.send
|
|
428
|
+
self.send(:"#{bit_field}=", options[bit_field]) if options[bit_field]
|
|
428
429
|
end
|
|
429
430
|
end
|
|
430
431
|
end
|
data/lib/packetgen/types/int.rb
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
# This file is part of PacketGen
|
|
5
|
-
# See https://github.com/
|
|
5
|
+
# See https://github.com/lemontree55/packetgen for more informations
|
|
6
6
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
|
7
|
+
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
|
7
8
|
# This program is published under MIT license.
|
|
8
9
|
|
|
9
10
|
module PacketGen
|
|
@@ -11,6 +12,7 @@ module PacketGen
|
|
|
11
12
|
# Base integer class to handle binary integers
|
|
12
13
|
# @abstract
|
|
13
14
|
# @author Sylvain Daubert
|
|
15
|
+
# @since 3.3.1 support native endianess
|
|
14
16
|
class Int
|
|
15
17
|
include Fieldable
|
|
16
18
|
|
|
@@ -18,7 +20,8 @@ module PacketGen
|
|
|
18
20
|
# @return [Integer]
|
|
19
21
|
attr_accessor :value
|
|
20
22
|
# Integer endianness
|
|
21
|
-
# @return [:little,:big]
|
|
23
|
+
# @return [:little,:big,:native]
|
|
24
|
+
# @since 3.3.1 add :native
|
|
22
25
|
attr_accessor :endian
|
|
23
26
|
# Integer size, in bytes
|
|
24
27
|
# @return [Integer]
|
|
@@ -128,10 +131,10 @@ module PacketGen
|
|
|
128
131
|
# @author Sylvain Daubert
|
|
129
132
|
class Int16 < Int
|
|
130
133
|
# @param [Integer,nil] value
|
|
131
|
-
# @param [:big, :little] endian
|
|
134
|
+
# @param [:big, :little, :native] endian
|
|
132
135
|
def initialize(value=nil, endian=:big)
|
|
133
136
|
super(value, endian, 2)
|
|
134
|
-
@packstr = { big: 'n', little: 'v' }
|
|
137
|
+
@packstr = { big: 'n', little: 'v', native: 'S' }
|
|
135
138
|
end
|
|
136
139
|
end
|
|
137
140
|
|
|
@@ -153,6 +156,19 @@ module PacketGen
|
|
|
153
156
|
end
|
|
154
157
|
end
|
|
155
158
|
|
|
159
|
+
# native endian 2-byte unsigned integer
|
|
160
|
+
# @author Sylvain Daubert
|
|
161
|
+
# @since 3.3.1
|
|
162
|
+
class Int16n < Int16
|
|
163
|
+
# @param [Integer,nil] value
|
|
164
|
+
undef endian=
|
|
165
|
+
|
|
166
|
+
# @param [Integer, nil] value
|
|
167
|
+
def initialize(value=nil)
|
|
168
|
+
super(value, :native)
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
156
172
|
# 2-byte signed integer
|
|
157
173
|
# @author Sylvain Daubert
|
|
158
174
|
# @since 2.8.2
|
|
@@ -161,7 +177,7 @@ module PacketGen
|
|
|
161
177
|
# @param [:big, :little] endian
|
|
162
178
|
def initialize(value=nil, endian=:big)
|
|
163
179
|
super
|
|
164
|
-
@packstr = { big: 's>', little: 's<' }
|
|
180
|
+
@packstr = { big: 's>', little: 's<', native: 's' }
|
|
165
181
|
end
|
|
166
182
|
end
|
|
167
183
|
|
|
@@ -185,13 +201,33 @@ module PacketGen
|
|
|
185
201
|
end
|
|
186
202
|
end
|
|
187
203
|
|
|
204
|
+
# native endian 2-byte signed integer
|
|
205
|
+
# @author Sylvain Daubert
|
|
206
|
+
# @since 3.3.1
|
|
207
|
+
class SInt16n < SInt16
|
|
208
|
+
# @param [Integer,nil] value
|
|
209
|
+
undef endian=
|
|
210
|
+
|
|
211
|
+
# @param [Integer, nil] value
|
|
212
|
+
def initialize(value=nil)
|
|
213
|
+
super(value, :native)
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
188
217
|
# 3-byte unsigned integer
|
|
189
218
|
# @author Sylvain Daubert
|
|
190
219
|
# @since 2.1.4
|
|
191
220
|
class Int24 < Int
|
|
192
221
|
# @param [Integer,nil] value
|
|
193
|
-
# @param [:big, :little] endian
|
|
222
|
+
# @param [:big, :little, :native] endian
|
|
194
223
|
def initialize(value=nil, endian=:big)
|
|
224
|
+
if endian == :native
|
|
225
|
+
endian = if [1].pack('S').unpack1('n') == 1
|
|
226
|
+
:big
|
|
227
|
+
else
|
|
228
|
+
:little
|
|
229
|
+
end
|
|
230
|
+
end
|
|
195
231
|
super(value, endian, 3)
|
|
196
232
|
end
|
|
197
233
|
|
|
@@ -247,14 +283,27 @@ module PacketGen
|
|
|
247
283
|
end
|
|
248
284
|
end
|
|
249
285
|
|
|
286
|
+
# native endian 3-byte unsigned integer
|
|
287
|
+
# @author Sylvain Daubert
|
|
288
|
+
# @since 3.3.1
|
|
289
|
+
class Int24n < Int24
|
|
290
|
+
# @param [Integer,nil] value
|
|
291
|
+
undef endian=
|
|
292
|
+
|
|
293
|
+
# @param [Integer, nil] value
|
|
294
|
+
def initialize(value=nil)
|
|
295
|
+
super(value, :native)
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
250
299
|
# 4-byte unsigned integer
|
|
251
300
|
# @author Sylvain Daubert
|
|
252
301
|
class Int32 < Int
|
|
253
302
|
# @param [Integer,nil] value
|
|
254
|
-
# @param [:big, :little] endian
|
|
303
|
+
# @param [:big, :little, :native] endian
|
|
255
304
|
def initialize(value=nil, endian=:big)
|
|
256
305
|
super(value, endian, 4)
|
|
257
|
-
@packstr = { big: 'N', little: 'V' }
|
|
306
|
+
@packstr = { big: 'N', little: 'V', native: 'L' }
|
|
258
307
|
end
|
|
259
308
|
end
|
|
260
309
|
|
|
@@ -276,6 +325,19 @@ module PacketGen
|
|
|
276
325
|
end
|
|
277
326
|
end
|
|
278
327
|
|
|
328
|
+
# native endian 4-byte unsigned integer
|
|
329
|
+
# @author Sylvain Daubert
|
|
330
|
+
# @since 3.3.1
|
|
331
|
+
class Int32n < Int32
|
|
332
|
+
# @param [Integer,nil] value
|
|
333
|
+
undef endian=
|
|
334
|
+
|
|
335
|
+
# @param [Integer, nil] value
|
|
336
|
+
def initialize(value=nil)
|
|
337
|
+
super(value, :native)
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
|
|
279
341
|
# 4-byte unsigned integer
|
|
280
342
|
# @author Sylvain Daubert
|
|
281
343
|
# @since 2.8.2
|
|
@@ -284,7 +346,7 @@ module PacketGen
|
|
|
284
346
|
# @param [:big, :little] endian
|
|
285
347
|
def initialize(value=nil, endian=:big)
|
|
286
348
|
super
|
|
287
|
-
@packstr = { big: 'l>', little: 'l<' }
|
|
349
|
+
@packstr = { big: 'l>', little: 'l<', native: 'l' }
|
|
288
350
|
end
|
|
289
351
|
end
|
|
290
352
|
|
|
@@ -308,14 +370,27 @@ module PacketGen
|
|
|
308
370
|
end
|
|
309
371
|
end
|
|
310
372
|
|
|
373
|
+
# native endian 4-byte unsigned integer
|
|
374
|
+
# @author Sylvain Daubert
|
|
375
|
+
# @since 3.3.1
|
|
376
|
+
class SInt32n < SInt32
|
|
377
|
+
# @param [Integer,nil] value
|
|
378
|
+
undef endian=
|
|
379
|
+
|
|
380
|
+
# @param [Integer, nil] value
|
|
381
|
+
def initialize(value=nil)
|
|
382
|
+
super(value, :native)
|
|
383
|
+
end
|
|
384
|
+
end
|
|
385
|
+
|
|
311
386
|
# 8-byte unsigned integer
|
|
312
387
|
# @author Sylvain Daubert
|
|
313
388
|
class Int64 < Int
|
|
314
389
|
# @param [Integer,nil] value
|
|
315
|
-
# @param [:big, :little] endian
|
|
390
|
+
# @param [:big, :little, :native] endian
|
|
316
391
|
def initialize(value=nil, endian=:big)
|
|
317
392
|
super(value, endian, 8)
|
|
318
|
-
@packstr = { big: 'Q>', little: 'Q<' }
|
|
393
|
+
@packstr = { big: 'Q>', little: 'Q<', native: 'Q' }
|
|
319
394
|
end
|
|
320
395
|
end
|
|
321
396
|
|
|
@@ -337,15 +412,28 @@ module PacketGen
|
|
|
337
412
|
end
|
|
338
413
|
end
|
|
339
414
|
|
|
415
|
+
# native endian 8-byte unsigned integer
|
|
416
|
+
# @author Sylvain Daubert
|
|
417
|
+
# @since 3.3.1
|
|
418
|
+
class Int64n < Int64
|
|
419
|
+
# @param [Integer,nil] value
|
|
420
|
+
undef endian=
|
|
421
|
+
|
|
422
|
+
# @param [Integer, nil] value
|
|
423
|
+
def initialize(value=nil)
|
|
424
|
+
super(value, :native)
|
|
425
|
+
end
|
|
426
|
+
end
|
|
427
|
+
|
|
340
428
|
# 8-byte unsigned integer
|
|
341
429
|
# @author Sylvain Daubert
|
|
342
430
|
# @since 2.8.2
|
|
343
431
|
class SInt64 < Int64
|
|
344
432
|
# @param [Integer,nil] value
|
|
345
|
-
# @param [:big, :little] endian
|
|
433
|
+
# @param [:big, :little, :native] endian
|
|
346
434
|
def initialize(value=nil, endian=:big)
|
|
347
435
|
super
|
|
348
|
-
@packstr = { big: 'q>', little: 'q<' }
|
|
436
|
+
@packstr = { big: 'q>', little: 'q<', native: 'q' }
|
|
349
437
|
end
|
|
350
438
|
end
|
|
351
439
|
|
|
@@ -368,5 +456,18 @@ module PacketGen
|
|
|
368
456
|
super(value, :little)
|
|
369
457
|
end
|
|
370
458
|
end
|
|
459
|
+
|
|
460
|
+
# native endian 8-byte unsigned integer
|
|
461
|
+
# @author Sylvain Daubert
|
|
462
|
+
# @since 3.3.1
|
|
463
|
+
class SInt64n < SInt64
|
|
464
|
+
# @param [Integer,nil] value
|
|
465
|
+
undef endian=
|
|
466
|
+
|
|
467
|
+
# @param [Integer, nil] value
|
|
468
|
+
def initialize(value=nil)
|
|
469
|
+
super(value, :native)
|
|
470
|
+
end
|
|
471
|
+
end
|
|
371
472
|
end
|
|
372
473
|
end
|