packetgen 2.6.0 → 2.7.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/.gitignore +1 -0
- data/.rubocop.yml +28 -0
- data/Rakefile +6 -6
- data/bin/pgconsole +6 -6
- data/lib/packetgen.rb +4 -3
- data/lib/packetgen/capture.rb +5 -7
- data/lib/packetgen/config.rb +3 -3
- data/lib/packetgen/deprecation.rb +17 -0
- data/lib/packetgen/header.rb +40 -38
- data/lib/packetgen/header/arp.rb +46 -31
- data/lib/packetgen/header/asn1_base.rb +8 -8
- data/lib/packetgen/header/base.rb +108 -36
- data/lib/packetgen/header/bootp.rb +28 -19
- data/lib/packetgen/header/crypto.rb +6 -8
- data/lib/packetgen/header/dhcp.rb +4 -5
- data/lib/packetgen/header/dhcp/option.rb +46 -34
- data/lib/packetgen/header/dhcp/options.rb +0 -1
- data/lib/packetgen/header/dhcpv6.rb +10 -10
- data/lib/packetgen/header/dhcpv6/duid.rb +2 -3
- data/lib/packetgen/header/dhcpv6/option.rb +16 -21
- data/lib/packetgen/header/dhcpv6/relay.rb +6 -4
- data/lib/packetgen/header/dns.rb +13 -11
- data/lib/packetgen/header/dns/name.rb +4 -6
- data/lib/packetgen/header/dns/opt.rb +31 -31
- data/lib/packetgen/header/dns/option.rb +0 -2
- data/lib/packetgen/header/dns/qdsection.rb +1 -2
- data/lib/packetgen/header/dns/question.rb +19 -13
- data/lib/packetgen/header/dns/rr.rb +11 -14
- data/lib/packetgen/header/dns/rrsection.rb +5 -7
- data/lib/packetgen/header/dot11.rb +45 -29
- data/lib/packetgen/header/dot11/control.rb +3 -5
- data/lib/packetgen/header/dot11/data.rb +34 -6
- data/lib/packetgen/header/dot11/element.rb +0 -1
- data/lib/packetgen/header/dot11/management.rb +9 -5
- data/lib/packetgen/header/dot11/sub_mngt.rb +13 -14
- data/lib/packetgen/header/dot1q.rb +2 -2
- data/lib/packetgen/header/dot1x.rb +3 -4
- data/lib/packetgen/header/eap.rb +62 -53
- data/lib/packetgen/header/eap/fast.rb +0 -1
- data/lib/packetgen/header/eap/md5.rb +1 -2
- data/lib/packetgen/header/eap/tls.rb +9 -10
- data/lib/packetgen/header/eap/ttls.rb +9 -10
- data/lib/packetgen/header/esp.rb +33 -33
- data/lib/packetgen/header/eth.rb +11 -8
- data/lib/packetgen/header/gre.rb +5 -6
- data/lib/packetgen/header/http/headers.rb +11 -14
- data/lib/packetgen/header/http/request.rb +20 -20
- data/lib/packetgen/header/http/response.rb +16 -18
- data/lib/packetgen/header/http/verbs.rb +5 -5
- data/lib/packetgen/header/icmp.rb +1 -3
- data/lib/packetgen/header/icmpv6.rb +1 -3
- data/lib/packetgen/header/igmp.rb +5 -6
- data/lib/packetgen/header/igmpv3.rb +5 -9
- data/lib/packetgen/header/igmpv3/group_record.rb +4 -5
- data/lib/packetgen/header/igmpv3/mq.rb +2 -2
- data/lib/packetgen/header/igmpv3/mr.rb +4 -3
- data/lib/packetgen/header/ike.rb +33 -8
- data/lib/packetgen/header/ike/auth.rb +4 -6
- data/lib/packetgen/header/ike/cert.rb +0 -2
- data/lib/packetgen/header/ike/certreq.rb +1 -3
- data/lib/packetgen/header/ike/id.rb +1 -3
- data/lib/packetgen/header/ike/ke.rb +0 -2
- data/lib/packetgen/header/ike/nonce.rb +0 -2
- data/lib/packetgen/header/ike/notify.rb +22 -24
- data/lib/packetgen/header/ike/payload.rb +198 -199
- data/lib/packetgen/header/ike/sa.rb +21 -30
- data/lib/packetgen/header/ike/sk.rb +16 -17
- data/lib/packetgen/header/ike/ts.rb +22 -24
- data/lib/packetgen/header/ike/vendor_id.rb +0 -2
- data/lib/packetgen/header/ip.rb +30 -23
- data/lib/packetgen/header/ip/addr.rb +5 -6
- data/lib/packetgen/header/ip/option.rb +11 -15
- data/lib/packetgen/header/ip/options.rb +1 -2
- data/lib/packetgen/header/ipv6.rb +27 -12
- data/lib/packetgen/header/ipv6/addr.rb +2 -2
- data/lib/packetgen/header/ipv6/extension.rb +1 -1
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +11 -11
- data/lib/packetgen/header/llc.rb +4 -3
- data/lib/packetgen/header/mdns.rb +11 -5
- data/lib/packetgen/header/mld.rb +4 -4
- data/lib/packetgen/header/mldv2.rb +4 -3
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -4
- data/lib/packetgen/header/mldv2/mlq.rb +3 -4
- data/lib/packetgen/header/mldv2/mlr.rb +4 -3
- data/lib/packetgen/header/netbios.rb +18 -5
- data/lib/packetgen/header/ospfv2.rb +6 -7
- data/lib/packetgen/header/ospfv2/db_description.rb +3 -4
- data/lib/packetgen/header/ospfv2/hello.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv2/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv2/lsa.rb +13 -14
- data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -5
- data/lib/packetgen/header/ospfv3.rb +3 -4
- data/lib/packetgen/header/ospfv3/db_description.rb +3 -5
- data/lib/packetgen/header/ospfv3/hello.rb +2 -3
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -8
- data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_request.rb +2 -3
- data/lib/packetgen/header/ospfv3/ls_update.rb +5 -6
- data/lib/packetgen/header/ospfv3/lsa.rb +10 -11
- data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -4
- data/lib/packetgen/header/snmp.rb +45 -32
- data/lib/packetgen/header/tcp.rb +13 -9
- data/lib/packetgen/header/tcp/option.rb +16 -11
- data/lib/packetgen/header/tcp/options.rb +3 -4
- data/lib/packetgen/header/tftp.rb +15 -17
- data/lib/packetgen/header/udp.rb +10 -4
- data/lib/packetgen/inspect.rb +7 -9
- data/lib/packetgen/packet.rb +44 -22
- data/lib/packetgen/pcapng.rb +1 -5
- data/lib/packetgen/pcapng/block.rb +17 -11
- data/lib/packetgen/pcapng/epb.rb +6 -11
- data/lib/packetgen/pcapng/file.rb +37 -44
- data/lib/packetgen/pcapng/idb.rb +17 -22
- data/lib/packetgen/pcapng/shb.rb +7 -10
- data/lib/packetgen/pcapng/spb.rb +21 -17
- data/lib/packetgen/pcapng/unknown_block.rb +17 -13
- data/lib/packetgen/proto.rb +1 -2
- data/lib/packetgen/types/array.rb +119 -34
- data/lib/packetgen/types/cstring.rb +1 -5
- data/lib/packetgen/types/enum.rb +8 -10
- data/lib/packetgen/types/fields.rb +34 -28
- data/lib/packetgen/types/int.rb +11 -13
- data/lib/packetgen/types/int_string.rb +6 -8
- data/lib/packetgen/types/oui.rb +3 -6
- data/lib/packetgen/types/string.rb +4 -6
- data/lib/packetgen/types/tlv.rb +11 -14
- data/lib/packetgen/utils.rb +15 -23
- data/lib/packetgen/utils/arp_spoofer.rb +12 -18
- data/lib/packetgen/version.rb +1 -1
- data/packetgen.gemspec +9 -8
- metadata +19 -17
@@ -8,21 +8,20 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class IP
|
11
|
-
|
12
11
|
# IP address, as a group of 4 bytes
|
13
12
|
# @author Sylvain Daubert
|
14
13
|
class Addr < Types::Fields
|
15
14
|
# @!attribute a1
|
16
|
-
# @return [Integer] IP address first byte
|
15
|
+
# @return [Integer] IP address first byte
|
17
16
|
define_field :a1, Types::Int8
|
18
17
|
# @!attribute a2
|
19
|
-
# @return [Integer] IP address seconf byte
|
18
|
+
# @return [Integer] IP address seconf byte
|
20
19
|
define_field :a2, Types::Int8
|
21
20
|
# @!attribute a3
|
22
|
-
# @return [Integer] IP address third byte
|
21
|
+
# @return [Integer] IP address third byte
|
23
22
|
define_field :a3, Types::Int8
|
24
23
|
# @!attribute a4
|
25
|
-
# @return [Integer] IP address fourth byte
|
24
|
+
# @return [Integer] IP address fourth byte
|
26
25
|
define_field :a4, Types::Int8
|
27
26
|
|
28
27
|
IPV4_ADDR_REGEX = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
|
@@ -45,7 +44,7 @@ module PacketGen
|
|
45
44
|
# Addr in human readable form (dotted format)
|
46
45
|
# @return [String]
|
47
46
|
def to_human
|
48
|
-
fields.map { |f|
|
47
|
+
fields.map { |f| self[f].to_i.to_s }.join('.')
|
49
48
|
end
|
50
49
|
|
51
50
|
# Addr as an integer
|
@@ -8,12 +8,11 @@
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
10
|
class IP
|
11
|
-
|
12
11
|
# Class to handle series of IP addresses
|
13
12
|
# @author Sylvain Daubert
|
14
13
|
class ArrayOfAddr < Types::Array
|
15
14
|
set_of IP::Addr
|
16
|
-
|
15
|
+
|
17
16
|
# Push a IP address to the array
|
18
17
|
# @param [String,Addr] addr
|
19
18
|
# @return [self]
|
@@ -27,7 +26,6 @@ module PacketGen
|
|
27
26
|
# Base class for IP options
|
28
27
|
# @author Sylvain Daubert
|
29
28
|
class Option < Types::Fields
|
30
|
-
|
31
29
|
# EOL option type
|
32
30
|
EOL_TYPE = 0x00
|
33
31
|
# NOP option type
|
@@ -55,7 +53,7 @@ module PacketGen
|
|
55
53
|
# option data
|
56
54
|
# @return [String]
|
57
55
|
define_field :data, Types::String, optional: ->(h) { h.length > 2 },
|
58
|
-
builder: ->(h,t) { t.new(length_from: ->
|
56
|
+
builder: ->(h, t) { t.new(length_from: -> { h.length - 2 }) }
|
59
57
|
|
60
58
|
# @!attribute copied
|
61
59
|
# 1-bit copied flag from {#type} field
|
@@ -94,9 +92,7 @@ module PacketGen
|
|
94
92
|
# Get binary string. Set {#length} field.
|
95
93
|
# @return [String]
|
96
94
|
def to_s
|
97
|
-
if respond_to? :length
|
98
|
-
self.length = super.size
|
99
|
-
end
|
95
|
+
self.length = super.size if respond_to? :length
|
100
96
|
super
|
101
97
|
end
|
102
98
|
|
@@ -104,7 +100,7 @@ module PacketGen
|
|
104
100
|
# @return [String]
|
105
101
|
def to_human
|
106
102
|
str = self.class == Option ? "unk-#{type}" : self.class.to_s.sub(/.*::/, '')
|
107
|
-
if respond_to?(:length)
|
103
|
+
if respond_to?(:length) && (length > 2) && !self[:data].to_s.empty?
|
108
104
|
str << ":#{self[:data].to_s.inspect}"
|
109
105
|
end
|
110
106
|
str
|
@@ -122,12 +118,12 @@ module PacketGen
|
|
122
118
|
# No OPeration IP option
|
123
119
|
class NOP < EOL
|
124
120
|
end
|
125
|
-
|
121
|
+
|
126
122
|
# Loose Source and Record Route IP option
|
127
123
|
class LSRR < Option
|
128
124
|
delete_field :data
|
129
125
|
undef data
|
130
|
-
|
126
|
+
|
131
127
|
# @!attribute pointer
|
132
128
|
# 8-bit pointer on next address
|
133
129
|
# @return [Integer]
|
@@ -136,7 +132,7 @@ module PacketGen
|
|
136
132
|
# Array of IP addresses
|
137
133
|
# @return [Types::Array<IP::Addr>]
|
138
134
|
define_field :data, ArrayOfAddr,
|
139
|
-
builder: ->(h,t) { t.new(length_from: ->
|
135
|
+
builder: ->(h, t) { t.new(length_from: -> { h.length - 2 }) }
|
140
136
|
|
141
137
|
# Populate object from a binary string
|
142
138
|
# @param [String] str
|
@@ -156,7 +152,7 @@ module PacketGen
|
|
156
152
|
def pointed_addr
|
157
153
|
data[pointer / 4 - 1]
|
158
154
|
end
|
159
|
-
|
155
|
+
|
160
156
|
# Get a human readable string
|
161
157
|
# @return [String]
|
162
158
|
def to_human
|
@@ -174,18 +170,18 @@ module PacketGen
|
|
174
170
|
class SI < Option
|
175
171
|
delete_field :data
|
176
172
|
undef data
|
177
|
-
|
173
|
+
|
178
174
|
# @!attribute id
|
179
175
|
# 16-bit stream ID
|
180
176
|
# @return [Integer]
|
181
177
|
define_field :id, Types::Int16
|
182
178
|
end
|
183
|
-
|
179
|
+
|
184
180
|
# Router Alert IP option
|
185
181
|
class RA < Option
|
186
182
|
delete_field :data
|
187
183
|
undef data
|
188
|
-
|
184
|
+
|
189
185
|
# @!attribute value
|
190
186
|
# 16-bit value. Should be 0.
|
191
187
|
# @return [Integer]
|
@@ -5,11 +5,11 @@
|
|
5
5
|
# This program is published under MIT license.
|
6
6
|
|
7
7
|
# frozen_string_literal: true
|
8
|
+
|
8
9
|
require 'ipaddr'
|
9
10
|
|
10
11
|
module PacketGen
|
11
12
|
module Header
|
12
|
-
|
13
13
|
# A IPv6 header consists of:
|
14
14
|
# * a first 32-bit word ({#u32}, of {Types::Int32} type) composoed of:
|
15
15
|
# * a 4-bit {#version} field,
|
@@ -45,7 +45,7 @@ module PacketGen
|
|
45
45
|
# ipv6.dst = '2001:1234:5678:abcd::123'
|
46
46
|
# ipv6.body.read 'this is a body'
|
47
47
|
# @author Sylvain Daubert
|
48
|
-
class IPv6 < Base;end
|
48
|
+
class IPv6 < Base; end
|
49
49
|
|
50
50
|
require_relative 'ipv6/addr'
|
51
51
|
|
@@ -103,7 +103,7 @@ module PacketGen
|
|
103
103
|
self[:dst].to_a.each { |word| sum += word.to_i }
|
104
104
|
sum
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
107
|
# Send IPv6 packet on wire.
|
108
108
|
#
|
109
109
|
# When sending packet at IPv6 level, +version+, +flow_label+ and +length+
|
@@ -158,14 +158,22 @@ module PacketGen
|
|
158
158
|
def parse?
|
159
159
|
version == 6
|
160
160
|
end
|
161
|
+
|
162
|
+
# Invert source and destination addresses
|
163
|
+
# @return [self]
|
164
|
+
# @since 2.7.0
|
165
|
+
def reply!
|
166
|
+
self[:src], self[:dst] = self[:dst], self[:src]
|
167
|
+
self
|
168
|
+
end
|
161
169
|
end
|
162
170
|
|
163
171
|
self.add_class IPv6
|
164
172
|
|
165
|
-
Eth.
|
166
|
-
SNAP.
|
167
|
-
Dot1q.
|
168
|
-
IP.
|
173
|
+
Eth.bind IPv6, ethertype: IPv6::ETHERTYPE
|
174
|
+
SNAP.bind IPv6, proto_id: IPv6::ETHERTYPE
|
175
|
+
Dot1q.bind IPv6, ethertype: IPv6::ETHERTYPE
|
176
|
+
IP.bind IPv6, protocol: 41 # 6to4
|
169
177
|
end
|
170
178
|
end
|
171
179
|
|
@@ -175,16 +183,23 @@ module PacketGen
|
|
175
183
|
module Header
|
176
184
|
class IPv6
|
177
185
|
class << self
|
178
|
-
alias
|
186
|
+
alias old_bind bind
|
179
187
|
|
180
188
|
# Bind a upper header to IPv6 and its defined extension headers.
|
181
|
-
# @see Base.
|
182
|
-
def
|
183
|
-
IPv6.
|
189
|
+
# @see Base.bind
|
190
|
+
def bind(header_klass, args={})
|
191
|
+
IPv6.old_bind header_klass, args
|
184
192
|
[IPv6::HopByHop].each do |klass|
|
185
|
-
klass.
|
193
|
+
klass.bind header_klass, args
|
186
194
|
end
|
187
195
|
end
|
196
|
+
# Bind a upper header to IPv6 and its defined extension headers.
|
197
|
+
# @see Base.bind_header
|
198
|
+
# @deprecated USe {bind}.
|
199
|
+
def bind_header(header_klass, args={})
|
200
|
+
Deprecation.deprecated(self, __method__, 'bind', klass_method: true)
|
201
|
+
bind header_klass, args
|
202
|
+
end
|
188
203
|
end
|
189
204
|
end
|
190
205
|
end
|
@@ -5,6 +5,7 @@
|
|
5
5
|
# This program is published under MIT license.
|
6
6
|
|
7
7
|
# frozen_string_literal: true
|
8
|
+
|
8
9
|
require 'ipaddr'
|
9
10
|
|
10
11
|
module PacketGen
|
@@ -13,7 +14,6 @@ module PacketGen
|
|
13
14
|
# IPv6 address, as a group of 8 2-byte words
|
14
15
|
# @author Sylvain Daubert
|
15
16
|
class Addr < Types::Fields
|
16
|
-
|
17
17
|
# @!attribute a1
|
18
18
|
# 1st 2-byte word of IPv6 address
|
19
19
|
# @return [Integer]
|
@@ -89,7 +89,7 @@ module PacketGen
|
|
89
89
|
# @author Sylvain Daubert
|
90
90
|
class ArrayOfAddr < Types::Array
|
91
91
|
set_of IPv6::Addr
|
92
|
-
|
92
|
+
|
93
93
|
# Push a IPv6 address to the array
|
94
94
|
# @param [String,Addr] addr
|
95
95
|
# @return [self]
|
@@ -43,7 +43,7 @@ module PacketGen
|
|
43
43
|
# Specific options of extension header
|
44
44
|
# @return [String]
|
45
45
|
define_field :options, Types::String,
|
46
|
-
builder: ->(h, t) { t.new(length_from: ->
|
46
|
+
builder: ->(h, t) { t.new(length_from: -> { h.real_length }) }
|
47
47
|
# @!attribute body
|
48
48
|
# @return [String,Base]
|
49
49
|
define_field :body, Types::String
|
@@ -15,7 +15,7 @@ module PacketGen
|
|
15
15
|
TYPES = {
|
16
16
|
1 => 'padn',
|
17
17
|
5 => 'router_alert'
|
18
|
-
}
|
18
|
+
}.freeze
|
19
19
|
|
20
20
|
# @return [String]
|
21
21
|
def to_human
|
@@ -27,7 +27,7 @@ module PacketGen
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
# Special option pad1, for {HopByHop} IPv6 extension header
|
32
32
|
# @author Sylvain Daubert
|
33
33
|
class Pad1 < Types::Fields
|
@@ -40,7 +40,7 @@ module PacketGen
|
|
40
40
|
'pad1'
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
# Array of {Option}, for {HopByHop} IPv6 extension header
|
45
45
|
# @author Sylvain Daubert
|
46
46
|
class Options < Types::Array
|
@@ -54,11 +54,9 @@ module PacketGen
|
|
54
54
|
return self if str.nil?
|
55
55
|
force_binary str
|
56
56
|
klass = self.class.class_eval { @klass }
|
57
|
-
|
57
|
+
until str.empty?
|
58
58
|
obj = klass.new.read(str)
|
59
|
-
if obj.type
|
60
|
-
obj = Pad1.new.read(str)
|
61
|
-
end
|
59
|
+
obj = Pad1.new.read(str) if obj.type.zero?
|
62
60
|
self.push obj
|
63
61
|
str.slice!(0, obj.sz)
|
64
62
|
end
|
@@ -69,16 +67,18 @@ module PacketGen
|
|
69
67
|
# @return [String]
|
70
68
|
def to_s
|
71
69
|
str = super
|
72
|
-
case str.size % 8
|
70
|
+
case (str.size + 2) % 8
|
73
71
|
when 0
|
74
72
|
return str
|
75
73
|
when 7
|
76
74
|
# only on byte needed: use pad1 option
|
75
|
+
self << Pad1.new
|
77
76
|
str << [0].pack('C')
|
78
77
|
else
|
79
78
|
# use padn option
|
80
|
-
len = 8 - (str.size % 8) -
|
79
|
+
len = 8 - 2 - (str.size % 8) - 2
|
81
80
|
padn = Option.new(type: 'padn', value: "\x00" * len)
|
81
|
+
self << padn
|
82
82
|
str << padn.to_s
|
83
83
|
end
|
84
84
|
str
|
@@ -127,8 +127,8 @@ module PacketGen
|
|
127
127
|
end
|
128
128
|
end
|
129
129
|
end
|
130
|
-
|
130
|
+
|
131
131
|
self.add_class IPv6::HopByHop
|
132
|
-
IPv6.
|
132
|
+
IPv6.bind IPv6::HopByHop, next: 0
|
133
133
|
end
|
134
134
|
end
|
data/lib/packetgen/header/llc.rb
CHANGED
@@ -8,7 +8,6 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
|
-
|
12
11
|
# Logical-Link Control header
|
13
12
|
#
|
14
13
|
# A LLC header consists of:
|
@@ -17,6 +16,7 @@ module PacketGen
|
|
17
16
|
# * a {#control} ({Types::Int8}),
|
18
17
|
# * and a {#body} (a {Types::String} or another {Base} class).
|
19
18
|
# @author Sylvain Daubert
|
19
|
+
# @since 1.4.0
|
20
20
|
class LLC < Base
|
21
21
|
# @!attribute dsap
|
22
22
|
# @return [Integer] 8-bit dsap value
|
@@ -32,7 +32,7 @@ module PacketGen
|
|
32
32
|
define_field :body, Types::String
|
33
33
|
end
|
34
34
|
self.add_class LLC
|
35
|
-
Dot11::Data.
|
35
|
+
Dot11::Data.bind LLC, type: 2, wep?: false
|
36
36
|
|
37
37
|
# Sub-Network Access Protocol
|
38
38
|
#
|
@@ -41,6 +41,7 @@ module PacketGen
|
|
41
41
|
# * a {#proto_id} ({Types::Int16}),
|
42
42
|
# * and a {#body} (a {Types::String} or another {Base} class).
|
43
43
|
# @author Sylvain Daubert
|
44
|
+
# @since 1.4.0
|
44
45
|
class SNAP < Base
|
45
46
|
# @!attribute oui
|
46
47
|
# @return [Types::OUI]
|
@@ -53,6 +54,6 @@ module PacketGen
|
|
53
54
|
define_field :body, Types::String
|
54
55
|
end
|
55
56
|
self.add_class SNAP
|
56
|
-
LLC.
|
57
|
+
LLC.bind SNAP, dsap: 170, ssap: 170, control: 3
|
57
58
|
end
|
58
59
|
end
|
@@ -8,15 +8,15 @@
|
|
8
8
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
|
-
|
12
11
|
# Multicast DNS.
|
13
12
|
#
|
14
13
|
# See {DNS} for header format.
|
14
|
+
# @since 2.6.0
|
15
15
|
# @author Sylvain Daubert
|
16
16
|
class MDNS < DNS
|
17
17
|
# Port number for mDNS over UDP
|
18
18
|
UDP_PORT = 5353
|
19
|
-
|
19
|
+
|
20
20
|
# Fixup IP header according to RFC 6762:
|
21
21
|
# * set ethernet multicast address to +01:00:5E:00:00:FB+ (for IPv4)
|
22
22
|
# or +33:33:00:00:00:FB+ (for IPv6),
|
@@ -59,17 +59,23 @@ module PacketGen
|
|
59
59
|
mac.from_human('33:33:00:00:00:FB')
|
60
60
|
end
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
# @api private
|
64
64
|
# @note This method is used internally by PacketGen and should not be
|
65
65
|
# directly called
|
66
|
+
# @since 2.7.0 Set UDP sport according to bindings, only if sport is 0.
|
67
|
+
# Needed by new bind API.
|
66
68
|
def added_to_packet(packet)
|
67
69
|
mdns_idx = packet.headers.size
|
68
70
|
packet.instance_eval "def mdnsize() @headers[#{mdns_idx}].mdnsize; end"
|
71
|
+
return unless packet.is? 'UDP'
|
72
|
+
return unless packet.udp.sport.zero?
|
73
|
+
packet.udp.sport = UDP_PORT
|
69
74
|
end
|
70
75
|
end
|
71
|
-
|
76
|
+
|
72
77
|
self.add_class MDNS
|
73
|
-
UDP.
|
78
|
+
UDP.bind MDNS, dport: MDNS::UDP_PORT
|
79
|
+
UDP.bind MDNS, sport: MDNS::UDP_PORT
|
74
80
|
end
|
75
81
|
end
|
data/lib/packetgen/header/mld.rb
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
|
-
|
11
10
|
# This class supports MLDv1 (RFC 2710).
|
12
11
|
#
|
13
12
|
# From RFC 2710, a MLD header has the following format:
|
@@ -44,6 +43,7 @@ module PacketGen
|
|
44
43
|
# pkt.mld.max_resp_delay = 20
|
45
44
|
# pkt.mld.group_addr = '::'
|
46
45
|
# @author Sylvain Daubert
|
46
|
+
# @since 2.4.0
|
47
47
|
class MLD < Base
|
48
48
|
# @!attribute max_resp_delay
|
49
49
|
# 16-bit MLD Max Response Delay
|
@@ -97,6 +97,6 @@ end
|
|
97
97
|
require_relative 'mldv2'
|
98
98
|
|
99
99
|
PacketGen::Header.add_class PacketGen::Header::MLD
|
100
|
-
PacketGen::Header::ICMPv6.
|
101
|
-
PacketGen::Header::ICMPv6.
|
102
|
-
PacketGen::Header::ICMPv6.
|
100
|
+
PacketGen::Header::ICMPv6.bind PacketGen::Header::MLD, type: 130
|
101
|
+
PacketGen::Header::ICMPv6.bind PacketGen::Header::MLD, type: 131
|
102
|
+
PacketGen::Header::ICMPv6.bind PacketGen::Header::MLD, type: 132
|