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
@@ -9,7 +9,6 @@
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
11
|
class Dot11
|
12
|
-
|
13
12
|
# IEEE 802.11 management frame header
|
14
13
|
#
|
15
14
|
# This class make a {Dot11} header with {#type} set to +0+
|
@@ -25,7 +24,7 @@ module PacketGen
|
|
25
24
|
# * a {#body} (a {Types::String} or another {Base} class),
|
26
25
|
# * and a Frame check sequence ({#fcs}, of type {Types::Int32le}).
|
27
26
|
#
|
28
|
-
# Management frames should be constructed with more headers from
|
27
|
+
# Management frames should be constructed with more headers from
|
29
28
|
# {SubMngt} subclasses.
|
30
29
|
#
|
31
30
|
# By example, build a {DeAuth} frame:
|
@@ -40,12 +39,11 @@ module PacketGen
|
|
40
39
|
# pkt.dot11_beacon.add_elements(type: 'TIM', value: "\x00\x01\x00\x00")
|
41
40
|
# @author Sylvain Daubert
|
42
41
|
class Management < Dot11
|
43
|
-
|
44
42
|
# @param [Hash] options
|
45
43
|
# @see Base#initialize
|
46
44
|
def initialize(options={})
|
47
|
-
super({type: 0}.merge!(options))
|
48
|
-
@applicable_fields -= %i
|
45
|
+
super({ type: 0 }.merge!(options))
|
46
|
+
@applicable_fields -= %i[mac4 qos_ctrl ht_ctrl]
|
49
47
|
define_applicable_fields
|
50
48
|
end
|
51
49
|
|
@@ -64,6 +62,12 @@ module PacketGen
|
|
64
62
|
|
65
63
|
self
|
66
64
|
end
|
65
|
+
|
66
|
+
# Invert mac1 and mac2 (resp. destination address and source address).
|
67
|
+
# @return [self]
|
68
|
+
def reply!
|
69
|
+
self[:mac1], self[:mac2] = self[:mac2], self[:mac1]
|
70
|
+
end
|
67
71
|
end
|
68
72
|
end
|
69
73
|
end
|
@@ -9,7 +9,6 @@
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
11
|
class Dot11
|
12
|
-
|
13
12
|
# @abstract Base class for all subtype management frames
|
14
13
|
# Subclasses of this class are used to specialize {Management}. A
|
15
14
|
# +SubMngt+ class set +subtype+ field in Dot11 header and may add some
|
@@ -52,7 +51,7 @@ module PacketGen
|
|
52
51
|
end
|
53
52
|
str
|
54
53
|
end
|
55
|
-
|
54
|
+
|
56
55
|
# Add an {Element} to header
|
57
56
|
# @param [Integer,String] type element type
|
58
57
|
# @param [Object] value element value
|
@@ -69,7 +68,7 @@ module PacketGen
|
|
69
68
|
def read_elements(str)
|
70
69
|
start = 0
|
71
70
|
elsz = Element.new.sz
|
72
|
-
while str.size - start >= elsz
|
71
|
+
while str.size - start >= elsz
|
73
72
|
el = Element.new.read(str[start, str.size])
|
74
73
|
@elements << el
|
75
74
|
start += el.sz
|
@@ -94,7 +93,7 @@ module PacketGen
|
|
94
93
|
define_field :listen_interval, Types::Int16le, default: 0x00c8
|
95
94
|
end
|
96
95
|
Header.add_class AssoReq
|
97
|
-
Management.
|
96
|
+
Management.bind AssoReq, type: 0, subtype: 0
|
98
97
|
|
99
98
|
# IEEE 802.11 Association Response frame
|
100
99
|
#
|
@@ -117,7 +116,7 @@ module PacketGen
|
|
117
116
|
define_field :aid, Types::Int16le
|
118
117
|
end
|
119
118
|
Header.add_class AssoResp
|
120
|
-
Management.
|
119
|
+
Management.bind AssoResp, type: 0, subtype: 1
|
121
120
|
|
122
121
|
# IEEE 802.11 ReAssociation Request frame
|
123
122
|
#
|
@@ -134,7 +133,7 @@ module PacketGen
|
|
134
133
|
define_field :current_ap, Eth::MacAddr
|
135
134
|
end
|
136
135
|
Header.add_class ReAssoReq
|
137
|
-
Management.
|
136
|
+
Management.bind ReAssoReq, type: 0, subtype: 2
|
138
137
|
|
139
138
|
# IEEE 802.11 ReAssociation Response frame
|
140
139
|
#
|
@@ -148,7 +147,7 @@ module PacketGen
|
|
148
147
|
class ReAssoResp < AssoResp
|
149
148
|
end
|
150
149
|
Header.add_class ReAssoResp
|
151
|
-
Management.
|
150
|
+
Management.bind ReAssoResp, type: 0, subtype: 3
|
152
151
|
|
153
152
|
# IEEE 802.11 Probe Request frame
|
154
153
|
#
|
@@ -159,7 +158,7 @@ module PacketGen
|
|
159
158
|
class ProbeReq < SubMngt
|
160
159
|
end
|
161
160
|
Header.add_class ProbeReq
|
162
|
-
Management.
|
161
|
+
Management.bind ProbeReq, type: 0, subtype: 4
|
163
162
|
|
164
163
|
# IEEE 802.11 Probe Response frame
|
165
164
|
#
|
@@ -182,7 +181,7 @@ module PacketGen
|
|
182
181
|
define_field :cap, Types::Int16le
|
183
182
|
end
|
184
183
|
Header.add_class ProbeResp
|
185
|
-
Management.
|
184
|
+
Management.bind ProbeResp, type: 0, subtype: 5
|
186
185
|
|
187
186
|
# IEEE 802.11 Beacon frame
|
188
187
|
#
|
@@ -205,7 +204,7 @@ module PacketGen
|
|
205
204
|
define_field :cap, Types::Int16le
|
206
205
|
end
|
207
206
|
Header.add_class Beacon
|
208
|
-
Management.
|
207
|
+
Management.bind Beacon, type: 0, subtype: 8
|
209
208
|
|
210
209
|
# IEEE 802.11 ATIM frame
|
211
210
|
#
|
@@ -215,7 +214,7 @@ module PacketGen
|
|
215
214
|
# @author Sylvain Daubert
|
216
215
|
class ATIM < SubMngt; end
|
217
216
|
Header.add_class ATIM
|
218
|
-
Management.
|
217
|
+
Management.bind ATIM, type: 0, subtype: 9
|
219
218
|
|
220
219
|
# IEEE 802.11 Disassociation frame
|
221
220
|
#
|
@@ -230,7 +229,7 @@ module PacketGen
|
|
230
229
|
define_field :reason, Types::Int16le
|
231
230
|
end
|
232
231
|
Header.add_class Disas
|
233
|
-
Management.
|
232
|
+
Management.bind Disas, type: 0, subtype: 10
|
234
233
|
|
235
234
|
# IEEE 802.11 Authentication frame
|
236
235
|
#
|
@@ -253,7 +252,7 @@ module PacketGen
|
|
253
252
|
define_field :status, Types::Int16le
|
254
253
|
end
|
255
254
|
Header.add_class Auth
|
256
|
-
Management.
|
255
|
+
Management.bind Auth, type: 0, subtype: 11
|
257
256
|
|
258
257
|
# IEEE 802.11 Deauthentication frame
|
259
258
|
#
|
@@ -268,7 +267,7 @@ module PacketGen
|
|
268
267
|
define_field :reason, Types::Int16le
|
269
268
|
end
|
270
269
|
Header.add_class DeAuth
|
271
|
-
Management.
|
270
|
+
Management.bind DeAuth, type: 0, subtype: 12
|
272
271
|
end
|
273
272
|
end
|
274
273
|
end
|
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
|
-
|
11
10
|
# IEEE 802.1Q VLAN tagging
|
12
11
|
#
|
13
12
|
# A VLAN tag consists of:
|
@@ -19,6 +18,7 @@ module PacketGen
|
|
19
18
|
# # Create a IP packet in VLAN #43
|
20
19
|
# pkt = PacketGen.gen('Eth').add('Dot1q', vid: 43).add('IP')
|
21
20
|
# @author Sylvain Daubert
|
21
|
+
# @since 1.4.0
|
22
22
|
class Dot1q < Base
|
23
23
|
# @!attribute tci
|
24
24
|
# @return [Integer] 16-bit Tag Control Information
|
@@ -39,6 +39,6 @@ module PacketGen
|
|
39
39
|
define_bit_fields_on :tci, :pcp, 3, :dei, :vid, 12
|
40
40
|
end
|
41
41
|
|
42
|
-
Eth.
|
42
|
+
Eth.bind Dot1q, ethertype: 0x8100
|
43
43
|
end
|
44
44
|
end
|
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
|
-
|
11
10
|
# IEEE 802.1X / EAPOL
|
12
11
|
#
|
13
12
|
# A IEEE 802.1X header consists of:
|
@@ -21,8 +20,8 @@ module PacketGen
|
|
21
20
|
# pkt2.dot1x.type = 'EAP Packet'
|
22
21
|
# pkt2.dot1x.body.read 'body'
|
23
22
|
# @author Sylvain Daubert
|
23
|
+
# @since 1.4.0
|
24
24
|
class Dot1x < Base
|
25
|
-
|
26
25
|
# IEEE 802.1x Ether type
|
27
26
|
ETHERTYPE = 0x888e
|
28
27
|
|
@@ -74,7 +73,7 @@ module PacketGen
|
|
74
73
|
end
|
75
74
|
end
|
76
75
|
|
77
|
-
Eth.
|
78
|
-
SNAP.
|
76
|
+
Eth.bind Dot1x, ethertype: Dot1x::ETHERTYPE
|
77
|
+
SNAP.bind Dot1x, proto_id: Dot1x::ETHERTYPE
|
79
78
|
end
|
80
79
|
end
|
data/lib/packetgen/header/eap.rb
CHANGED
@@ -7,7 +7,6 @@
|
|
7
7
|
|
8
8
|
module PacketGen
|
9
9
|
module Header
|
10
|
-
|
11
10
|
# Extensible Authentication Protocol (EAP),
|
12
11
|
# {https://tools.ietf.org/html/rfc3748 RFC 3748}
|
13
12
|
#
|
@@ -57,15 +56,14 @@ module PacketGen
|
|
57
56
|
# @author Sylvain Daubert
|
58
57
|
# @since 2.1.4
|
59
58
|
class EAP < Base
|
60
|
-
|
61
59
|
# EAP known codes
|
62
60
|
CODES = {
|
63
61
|
'Request' => 1,
|
64
62
|
'Response' => 2,
|
65
63
|
'Success' => 3,
|
66
64
|
'Failure' => 4
|
67
|
-
}
|
68
|
-
|
65
|
+
}.freeze
|
66
|
+
|
69
67
|
# EAP known request/response types
|
70
68
|
TYPES = {
|
71
69
|
'Identity' => 1,
|
@@ -79,7 +77,7 @@ module PacketGen
|
|
79
77
|
'EAP-FAST' => 43,
|
80
78
|
'Expanded Types' => 254,
|
81
79
|
'Experimental Use' => 255
|
82
|
-
}
|
80
|
+
}.freeze
|
83
81
|
|
84
82
|
# @!attribute code
|
85
83
|
# @return [Integer] 8-bit EAP code
|
@@ -92,70 +90,65 @@ module PacketGen
|
|
92
90
|
# @!attribute length
|
93
91
|
# @return [Integer] 16-bit length of EAP packet
|
94
92
|
define_field :length, Types::Int16, default: 4
|
95
|
-
|
93
|
+
|
96
94
|
# @!attribute type
|
97
95
|
# This field is present only for Request or Response packets,
|
98
96
|
# with type different from Expanded Types (254).
|
99
97
|
# @return [Integer] 8-bit request or response type
|
100
|
-
define_field :type, Types::Int8Enum, enum: TYPES,
|
101
|
-
optional: ->(eap) { eap.
|
102
|
-
|
98
|
+
define_field :type, Types::Int8Enum, enum: TYPES,
|
99
|
+
optional: ->(eap) { eap.type? }
|
100
|
+
|
103
101
|
# @!attribute vendor_id
|
104
102
|
# This field is present only for Request or Response packets,
|
105
103
|
# with type equal to +Expanded Types+ (254).
|
106
104
|
# @return [Integer] 24-bit vendor ID
|
107
105
|
define_field :vendor_id, Types::Int24,
|
108
|
-
optional: ->(eap) { eap.
|
109
|
-
|
106
|
+
optional: ->(eap) { eap.type? && (eap.type == 254) }
|
107
|
+
|
110
108
|
# @!attribute vendor_type
|
111
109
|
# This field is present only for Request or Response packets,
|
112
110
|
# with type equal to +Expanded Types+ (254).
|
113
111
|
# @return [Integer] 32-bit vendor type
|
114
112
|
define_field :vendor_type, Types::Int32,
|
115
|
-
optional: ->(eap) { eap.
|
113
|
+
optional: ->(eap) { eap.type? && (eap.type == 254) }
|
116
114
|
|
117
115
|
# @!attribute body
|
118
116
|
# @return [Types::String, Header::Base]
|
119
117
|
define_field :body, Types::String
|
120
|
-
|
118
|
+
|
121
119
|
# @return [EAP]
|
122
120
|
def initialize(options={})
|
123
121
|
super
|
124
122
|
calc_length if options[:length].nil?
|
125
123
|
end
|
126
|
-
|
124
|
+
|
127
125
|
# @private
|
128
126
|
alias old_read read
|
129
|
-
|
127
|
+
|
130
128
|
# Populate object from a binary string
|
131
129
|
# @param [String] str
|
132
130
|
# @return [Dot11] may return a subclass object if a more specific class
|
133
131
|
# may be determined
|
134
132
|
def read(str)
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
return obj
|
152
|
-
else
|
153
|
-
return self
|
154
|
-
end
|
133
|
+
super str
|
134
|
+
return self unless self.class == EAP
|
135
|
+
if type?
|
136
|
+
obj = case self.type
|
137
|
+
when 4
|
138
|
+
EAP::MD5.new.read(str)
|
139
|
+
when 13
|
140
|
+
EAP::TLS.new.read(str)
|
141
|
+
when 21
|
142
|
+
EAP::TTLS.new.read(str)
|
143
|
+
when 43
|
144
|
+
EAP::FAST.new.read(str)
|
145
|
+
else
|
146
|
+
self
|
147
|
+
end
|
148
|
+
obj
|
155
149
|
else
|
156
|
-
|
150
|
+
self
|
157
151
|
end
|
158
|
-
self
|
159
152
|
end
|
160
153
|
|
161
154
|
# Get human readable code
|
@@ -163,49 +156,47 @@ module PacketGen
|
|
163
156
|
def human_code
|
164
157
|
self[:code].to_human
|
165
158
|
end
|
166
|
-
|
159
|
+
|
167
160
|
# Get human readable type
|
168
161
|
# @return [String]
|
169
162
|
# @raise [ParseError] not a Request nor a Response packet
|
170
163
|
def human_type
|
171
|
-
raise ParseError, 'not a Request nor a Response' unless
|
164
|
+
raise ParseError, 'not a Request nor a Response' unless type?
|
172
165
|
self[:type].to_human
|
173
166
|
end
|
174
|
-
|
167
|
+
|
175
168
|
# Is packet a request?
|
176
169
|
# @return [Boolean]
|
177
170
|
def request?
|
178
171
|
code == CODES['Request']
|
179
172
|
end
|
180
|
-
|
173
|
+
|
181
174
|
# Is packet a response?
|
182
175
|
# @return [Boolean]
|
183
176
|
def response?
|
184
177
|
code == CODES['Response']
|
185
178
|
end
|
186
|
-
|
179
|
+
|
187
180
|
# Is packet a success?
|
188
181
|
# @return [Boolean]
|
189
182
|
def success?
|
190
183
|
code == CODES['Success']
|
191
184
|
end
|
192
|
-
|
185
|
+
|
193
186
|
# Is packet a failure?
|
194
187
|
# @return [Boolean]
|
195
188
|
def failure?
|
196
189
|
code == CODES['Failure']
|
197
190
|
end
|
198
|
-
|
191
|
+
|
199
192
|
# Return an array of desired authentication types from a Nak packet
|
200
193
|
# @return [Array<Integer>]
|
201
194
|
# @raise [ParseError] not a Nak packet
|
202
195
|
def desired_auth_type
|
203
|
-
if code != 2
|
204
|
-
raise ParseError, 'not a Nak response'
|
205
|
-
end
|
196
|
+
raise ParseError, 'not a Nak response' if (code != 2) && (type != 3)
|
206
197
|
body.to_s.unpack('C*')
|
207
198
|
end
|
208
|
-
|
199
|
+
|
209
200
|
# Calculate length field from content
|
210
201
|
# @return [Integer]
|
211
202
|
def calc_length
|
@@ -214,8 +205,16 @@ module PacketGen
|
|
214
205
|
|
215
206
|
# Say is this EAP header has {#type} field
|
216
207
|
# @return [Boolean]
|
208
|
+
# @since 2.7.0
|
209
|
+
def type?
|
210
|
+
[1, 2].include?(self.code)
|
211
|
+
end
|
212
|
+
|
213
|
+
# @deprecated Use {#type?} instead.
|
214
|
+
# @return [Boolean]
|
217
215
|
def has_type?
|
218
|
-
|
216
|
+
Deprecation.deprecated(self.class, __method__, 'type?')
|
217
|
+
type?
|
219
218
|
end
|
220
219
|
|
221
220
|
# Callback called when a EAP header is added to a packet
|
@@ -224,13 +223,23 @@ module PacketGen
|
|
224
223
|
# @param [Packet] packet
|
225
224
|
# @return [void]
|
226
225
|
def added_to_packet(packet)
|
227
|
-
|
228
|
-
|
226
|
+
return if packet.respond_to? :eap
|
227
|
+
packet.instance_eval("def eap(arg=nil); header(#{self.class}, arg); end")
|
228
|
+
end
|
229
|
+
|
230
|
+
# Invert between a request and a response packet. Not action for
|
231
|
+
# others codes.
|
232
|
+
# @return [self]
|
233
|
+
def reply!
|
234
|
+
case self.code
|
235
|
+
when 1 then self.code = 2
|
236
|
+
when 2 then self.code = 1
|
229
237
|
end
|
238
|
+
self
|
230
239
|
end
|
231
240
|
end
|
232
|
-
|
233
|
-
Dot1x.
|
241
|
+
|
242
|
+
Dot1x.bind EAP, type: 0
|
234
243
|
end
|
235
244
|
end
|
236
245
|
|