packetgen 1.3.0 → 1.4.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 +4 -4
- data/README.md +18 -41
- data/lib/packetgen.rb +1 -1
- data/lib/packetgen/header.rb +14 -9
- data/lib/packetgen/header/arp.rb +1 -0
- data/lib/packetgen/header/base.rb +50 -1
- data/lib/packetgen/header/dot11.rb +349 -0
- data/lib/packetgen/header/dot11/control.rb +59 -0
- data/lib/packetgen/header/dot11/data.rb +43 -0
- data/lib/packetgen/header/dot11/element.rb +35 -0
- data/lib/packetgen/header/dot11/management.rb +25 -0
- data/lib/packetgen/header/dot11/sub_mngt.rb +178 -0
- data/lib/packetgen/header/dot1q.rb +42 -0
- data/lib/packetgen/header/dot1x.rb +78 -0
- data/lib/packetgen/header/esp.rb +2 -2
- data/lib/packetgen/header/eth.rb +1 -8
- data/lib/packetgen/header/ip.rb +13 -2
- data/lib/packetgen/header/ipv6.rb +12 -1
- data/lib/packetgen/header/llc.rb +56 -0
- data/lib/packetgen/inspect.rb +1 -1
- data/lib/packetgen/packet.rb +12 -8
- data/lib/packetgen/pcapng.rb +11 -0
- data/lib/packetgen/pcapng/file.rb +5 -2
- data/lib/packetgen/types.rb +1 -0
- data/lib/packetgen/types/fields.rb +80 -10
- data/lib/packetgen/types/int_string.rb +1 -1
- data/lib/packetgen/types/oui.rb +48 -0
- data/lib/packetgen/types/string.rb +9 -4
- data/lib/packetgen/types/tlv.rb +83 -6
- data/lib/packetgen/version.rb +1 -1
- metadata +12 -2
data/lib/packetgen/types/tlv.rb
CHANGED
@@ -2,6 +2,24 @@ module PacketGen
|
|
2
2
|
module Types
|
3
3
|
|
4
4
|
# Class to handle Type-Length-Value attributes
|
5
|
+
#
|
6
|
+
# TLV fields handles three subfields:
|
7
|
+
# * a tag/type field (defaults: {Int8} type),
|
8
|
+
# * a length field (defaults: {Int8} type),
|
9
|
+
# * a value field (defaults: {String} type).
|
10
|
+
#
|
11
|
+
# {#initialize} supports options to change tag and length type. By example, to
|
12
|
+
# declare a TLV using {Int16}:
|
13
|
+
# define_field :tlv, PacketGen::Types::TLV, builder: ->(obj) { PacketGen::Types::TLV.new(t: PacketGen::Types::Int16, l: PacketGen::Types::Int16) }
|
14
|
+
#
|
15
|
+
# == Subclasses
|
16
|
+
# A subclass may defined a constant hash TYPES. This hash defines human readable
|
17
|
+
# types versus their integer values. Hash keys are integer values, and hash values
|
18
|
+
# are types as strings.
|
19
|
+
#
|
20
|
+
# If TYPES is defined, a subclass may:
|
21
|
+
# * print human readable type using {#human_type},
|
22
|
+
# * set type as String with {#type=}.
|
5
23
|
# @author Sylvain Daubert
|
6
24
|
class TLV < Fields
|
7
25
|
# @!attribute type
|
@@ -26,16 +44,75 @@ module PacketGen
|
|
26
44
|
def initialize(options={})
|
27
45
|
super
|
28
46
|
self[:type] = options[:t].new(type) if options[:t]
|
29
|
-
if options[:l]
|
30
|
-
|
31
|
-
|
47
|
+
self[:length] = options[:l].new(length) if options[:l]
|
48
|
+
self[:value] = String.new('', length_from: self[:length])
|
49
|
+
self.type = options[:type] if options[:type]
|
50
|
+
self.value = options[:value] if options[:value]
|
51
|
+
self.length = options[:length] if options[:length]
|
52
|
+
end
|
53
|
+
|
54
|
+
# @private
|
55
|
+
alias old_type= type=
|
56
|
+
|
57
|
+
# Set type
|
58
|
+
# @param [::String,Integer] val
|
59
|
+
# @return [Integer]
|
60
|
+
# @raise [TypeError] class does not define TYPES
|
61
|
+
# @raise [ArgumentError] unknown string type
|
62
|
+
def type=(val)
|
63
|
+
case val
|
64
|
+
when Integer
|
65
|
+
self.old_type = val
|
66
|
+
else
|
67
|
+
unless has_human_types?
|
68
|
+
raise TypeError, "no human types defined for #{self.class}"
|
69
|
+
end
|
70
|
+
new_val = self.class::TYPES[val.to_s]
|
71
|
+
raise ArgumentError, "unknown #{val.to_s} type" if new_val.nil?
|
72
|
+
self.old_type = new_val
|
32
73
|
end
|
33
74
|
end
|
34
75
|
|
35
|
-
|
36
|
-
|
37
|
-
|
76
|
+
# Set +value+ and +length+ fields
|
77
|
+
# @param [::String] str
|
78
|
+
# @return [::String]
|
79
|
+
def value=(str)
|
80
|
+
self.length = str.length
|
81
|
+
self[:value].read str
|
82
|
+
str
|
83
|
+
end
|
84
|
+
|
85
|
+
# Return human readable type, if TYPES is defined
|
86
|
+
# @return [String]
|
87
|
+
def human_type
|
88
|
+
if has_human_types?
|
89
|
+
htype = self.class::TYPES[type]
|
90
|
+
htype = type if htype.nil?
|
91
|
+
htype.to_s
|
92
|
+
else
|
93
|
+
type.to_s
|
38
94
|
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# @return [String]
|
98
|
+
def to_human
|
99
|
+
name = self.class.to_s.gsub(/.*::/, '')
|
100
|
+
@typestr ||= if has_human_types?
|
101
|
+
types = self.class::TYPES.values
|
102
|
+
"%-#{types.max { |a,b| a.length <=> b.length }.size}s"
|
103
|
+
else
|
104
|
+
"%s"
|
105
|
+
end
|
106
|
+
@lenstr ||= "%-#{(2**(self[:length].width*8) - 1).to_s.size}u"
|
107
|
+
"#{name} type:#@typestr length:#@lenstr value:#{value.inspect}" % [human_type,
|
108
|
+
length]
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def has_human_types?
|
114
|
+
self.class.const_defined? :TYPES
|
115
|
+
end
|
39
116
|
end
|
40
117
|
end
|
41
118
|
end
|
data/lib/packetgen/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: packetgen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Daubert
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pcaprub
|
@@ -120,12 +120,21 @@ files:
|
|
120
120
|
- lib/packetgen/header/dns/question.rb
|
121
121
|
- lib/packetgen/header/dns/rr.rb
|
122
122
|
- lib/packetgen/header/dns/rrsection.rb
|
123
|
+
- lib/packetgen/header/dot11.rb
|
124
|
+
- lib/packetgen/header/dot11/control.rb
|
125
|
+
- lib/packetgen/header/dot11/data.rb
|
126
|
+
- lib/packetgen/header/dot11/element.rb
|
127
|
+
- lib/packetgen/header/dot11/management.rb
|
128
|
+
- lib/packetgen/header/dot11/sub_mngt.rb
|
129
|
+
- lib/packetgen/header/dot1q.rb
|
130
|
+
- lib/packetgen/header/dot1x.rb
|
123
131
|
- lib/packetgen/header/esp.rb
|
124
132
|
- lib/packetgen/header/eth.rb
|
125
133
|
- lib/packetgen/header/icmp.rb
|
126
134
|
- lib/packetgen/header/icmpv6.rb
|
127
135
|
- lib/packetgen/header/ip.rb
|
128
136
|
- lib/packetgen/header/ipv6.rb
|
137
|
+
- lib/packetgen/header/llc.rb
|
129
138
|
- lib/packetgen/header/tcp.rb
|
130
139
|
- lib/packetgen/header/tcp/option.rb
|
131
140
|
- lib/packetgen/header/tcp/options.rb
|
@@ -145,6 +154,7 @@ files:
|
|
145
154
|
- lib/packetgen/types/fields.rb
|
146
155
|
- lib/packetgen/types/int.rb
|
147
156
|
- lib/packetgen/types/int_string.rb
|
157
|
+
- lib/packetgen/types/oui.rb
|
148
158
|
- lib/packetgen/types/string.rb
|
149
159
|
- lib/packetgen/types/tlv.rb
|
150
160
|
- lib/packetgen/version.rb
|