packetgen 3.3.3 → 4.0.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 +37 -21
- data/lib/packetgen/capture.rb +2 -2
- data/lib/packetgen/config.rb +0 -1
- data/lib/packetgen/deprecation.rb +7 -7
- data/lib/packetgen/header/arp.rb +13 -13
- data/lib/packetgen/header/asn1_base.rb +1 -1
- data/lib/packetgen/header/base.rb +17 -18
- data/lib/packetgen/header/bootp.rb +32 -34
- data/lib/packetgen/header/dhcp/option.rb +19 -19
- data/lib/packetgen/header/dhcp/options.rb +1 -1
- data/lib/packetgen/header/dhcp.rb +3 -3
- data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
- data/lib/packetgen/header/dhcpv6/option.rb +53 -53
- data/lib/packetgen/header/dhcpv6/options.rb +1 -1
- data/lib/packetgen/header/dhcpv6/relay.rb +5 -5
- data/lib/packetgen/header/dhcpv6.rb +6 -6
- data/lib/packetgen/header/dns/name.rb +14 -10
- data/lib/packetgen/header/dns/opt.rb +2 -2
- data/lib/packetgen/header/dns/option.rb +11 -11
- data/lib/packetgen/header/dns/qdsection.rb +1 -1
- data/lib/packetgen/header/dns/question.rb +6 -8
- data/lib/packetgen/header/dns/rr.rb +56 -43
- data/lib/packetgen/header/dns/rrsection.rb +4 -4
- data/lib/packetgen/header/dns.rb +27 -30
- data/lib/packetgen/header/dot11/control.rb +11 -11
- data/lib/packetgen/header/dot11/data.rb +20 -20
- data/lib/packetgen/header/dot11/element.rb +4 -4
- data/lib/packetgen/header/dot11/management.rb +8 -8
- data/lib/packetgen/header/dot11/sub_mngt.rb +39 -53
- data/lib/packetgen/header/dot11.rb +88 -93
- data/lib/packetgen/header/dot1q.rb +10 -12
- data/lib/packetgen/header/dot1x.rb +9 -9
- data/lib/packetgen/header/eap/fast.rb +4 -4
- data/lib/packetgen/header/eap/md5.rb +6 -6
- data/lib/packetgen/header/eap/tls.rb +13 -15
- data/lib/packetgen/header/eap/ttls.rb +13 -15
- data/lib/packetgen/header/eap.rb +22 -22
- data/lib/packetgen/header/eth.rb +18 -18
- data/lib/packetgen/header/gre.rb +8 -10
- data/lib/packetgen/header/http/headers.rb +2 -2
- data/lib/packetgen/header/http/request.rb +17 -16
- data/lib/packetgen/header/http/response.rb +18 -17
- data/lib/packetgen/header/http/verbs.rb +1 -3
- data/lib/packetgen/header/icmp.rb +8 -8
- data/lib/packetgen/header/icmpv6.rb +3 -3
- data/lib/packetgen/header/igmp.rb +8 -8
- data/lib/packetgen/header/igmpv3/group_record.rb +12 -12
- data/lib/packetgen/header/igmpv3/mq.rb +16 -18
- data/lib/packetgen/header/igmpv3/mr.rb +4 -4
- data/lib/packetgen/header/igmpv3.rb +7 -7
- data/lib/packetgen/header/ip/addr.rb +13 -13
- data/lib/packetgen/header/ip/option.rb +31 -33
- data/lib/packetgen/header/ip/options.rb +1 -1
- data/lib/packetgen/header/ip.rb +37 -72
- data/lib/packetgen/header/ipv6/addr.rb +14 -14
- data/lib/packetgen/header/ipv6/extension.rb +8 -8
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +9 -9
- data/lib/packetgen/header/ipv6.rb +20 -22
- data/lib/packetgen/header/llc.rb +17 -17
- data/lib/packetgen/header/mdns.rb +1 -1
- data/lib/packetgen/header/mld.rb +6 -6
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +11 -11
- data/lib/packetgen/header/mldv2/mlq.rb +21 -23
- data/lib/packetgen/header/mldv2/mlr.rb +8 -8
- data/lib/packetgen/header/ospfv2/db_description.rb +11 -12
- data/lib/packetgen/header/ospfv2/hello.rb +11 -11
- data/lib/packetgen/header/ospfv2/ls_ack.rb +1 -1
- data/lib/packetgen/header/ospfv2/ls_request.rb +9 -9
- data/lib/packetgen/header/ospfv2/ls_update.rb +3 -3
- data/lib/packetgen/header/ospfv2/lsa.rb +54 -58
- data/lib/packetgen/header/ospfv2/lsa_header.rb +9 -9
- data/lib/packetgen/header/ospfv2.rb +27 -29
- data/lib/packetgen/header/ospfv3/db_description.rb +13 -14
- data/lib/packetgen/header/ospfv3/hello.rb +12 -12
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +17 -19
- data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -2
- data/lib/packetgen/header/ospfv3/ls_request.rb +9 -9
- data/lib/packetgen/header/ospfv3/ls_update.rb +4 -4
- data/lib/packetgen/header/ospfv3/lsa.rb +48 -51
- data/lib/packetgen/header/ospfv3/lsa_header.rb +9 -9
- data/lib/packetgen/header/ospfv3.rb +25 -27
- data/lib/packetgen/header/sctp/chunk.rb +44 -41
- data/lib/packetgen/header/sctp/error.rb +52 -52
- data/lib/packetgen/header/sctp/parameter.rb +38 -38
- data/lib/packetgen/header/sctp.rb +5 -5
- data/lib/packetgen/header/snmp.rb +2 -2
- data/lib/packetgen/header/tcp/option.rb +45 -39
- data/lib/packetgen/header/tcp/options.rb +2 -2
- data/lib/packetgen/header/tcp.rb +55 -44
- data/lib/packetgen/header/tftp.rb +16 -16
- data/lib/packetgen/header/udp.rb +8 -8
- data/lib/packetgen/header.rb +9 -10
- data/lib/packetgen/headerable.rb +13 -3
- data/lib/packetgen/inspect.rb +2 -2
- data/lib/packetgen/packet.rb +54 -37
- data/lib/packetgen/pcap.rb +15 -4
- data/lib/packetgen/pcapng/block.rb +18 -17
- data/lib/packetgen/pcapng/epb.rb +13 -15
- data/lib/packetgen/pcapng/file.rb +3 -97
- data/lib/packetgen/pcapng/idb.rb +9 -11
- data/lib/packetgen/pcapng/shb.rb +13 -15
- data/lib/packetgen/pcapng/spb.rb +8 -10
- data/lib/packetgen/pcapng/unknown_block.rb +6 -17
- data/lib/packetgen/pcapng.rb +4 -4
- data/lib/packetgen/pcaprub_wrapper.rb +17 -1
- data/lib/packetgen/proto.rb +1 -1
- data/lib/packetgen/unknown_packet.rb +2 -2
- data/lib/packetgen/utils/arp_spoofer.rb +18 -19
- data/lib/packetgen/utils.rb +2 -2
- data/lib/packetgen/version.rb +1 -1
- data/lib/packetgen.rb +4 -3
- metadata +29 -38
- data/lib/packetgen/types/abstract_tlv.rb +0 -278
- data/lib/packetgen/types/array.rb +0 -287
- data/lib/packetgen/types/cstring.rb +0 -109
- data/lib/packetgen/types/enum.rb +0 -171
- data/lib/packetgen/types/fieldable.rb +0 -66
- data/lib/packetgen/types/fields.rb +0 -622
- data/lib/packetgen/types/int.rb +0 -473
- data/lib/packetgen/types/int_string.rb +0 -102
- data/lib/packetgen/types/length_from.rb +0 -54
- data/lib/packetgen/types/oui.rb +0 -52
- data/lib/packetgen/types/string.rb +0 -97
- data/lib/packetgen/types/tlv.rb +0 -161
- data/lib/packetgen/types.rb +0 -26
data/lib/packetgen/header/eap.rb
CHANGED
@@ -12,15 +12,15 @@ module PacketGen
|
|
12
12
|
# {https://tools.ietf.org/html/rfc3748 RFC 3748}
|
13
13
|
#
|
14
14
|
# A EAP header has:
|
15
|
-
# * a {#code} field ({
|
16
|
-
# * a {#id} field ({
|
17
|
-
# * a {#length} field ({
|
15
|
+
# * a {#code} field ({BinStruct::Int8Enum}),
|
16
|
+
# * a {#id} field ({BinStruct::Int8}),
|
17
|
+
# * a {#length} field ({BinStruct::Int16}).
|
18
18
|
# Request (code 1) and Response (code 2) packets also have:
|
19
|
-
# * a {#type} field (+
|
19
|
+
# * a {#type} field (+BinStruct::Int8Enum+).
|
20
20
|
# And Expanded Types (type 254) packets also have:
|
21
|
-
# * a {#vendor_id} field ({
|
22
|
-
# * a {#vendor_type} field ({
|
23
|
-
# Finally, all packets have a {#body} ({
|
21
|
+
# * a {#vendor_id} field ({BinStruct::Int24}),
|
22
|
+
# * a {#vendor_type} field ({BinStruct::Int32}).
|
23
|
+
# Finally, all packets have a {#body} ({BinStruct::String}).
|
24
24
|
#
|
25
25
|
# == Create EAP headers
|
26
26
|
# An EAP header may be created this way:
|
@@ -82,41 +82,41 @@ module PacketGen
|
|
82
82
|
|
83
83
|
# @!attribute code
|
84
84
|
# @return [Integer] 8-bit EAP code
|
85
|
-
|
85
|
+
define_attr :code, BinStruct::Int8Enum, enum: CODES
|
86
86
|
|
87
87
|
# @!attribute id
|
88
88
|
# @return [Integer] 8-bit identifier
|
89
|
-
|
89
|
+
define_attr :id, BinStruct::Int8
|
90
90
|
|
91
91
|
# @!attribute length
|
92
92
|
# @return [Integer] 16-bit length of EAP packet
|
93
|
-
|
93
|
+
define_attr :length, BinStruct::Int16, default: 4
|
94
94
|
|
95
95
|
# @!attribute type
|
96
96
|
# This field is present only for Request or Response packets,
|
97
97
|
# with type different from Expanded Types (254).
|
98
98
|
# @return [Integer] 8-bit request or response type
|
99
|
-
|
100
|
-
|
101
|
-
|
99
|
+
define_attr :type, BinStruct::Int8Enum,
|
100
|
+
enum: TYPES,
|
101
|
+
optional: lambda(&:type?)
|
102
102
|
|
103
103
|
# @!attribute vendor_id
|
104
104
|
# This field is present only for Request or Response packets,
|
105
105
|
# with type equal to +Expanded Types+ (254).
|
106
106
|
# @return [Integer] 24-bit vendor ID
|
107
|
-
|
108
|
-
|
107
|
+
define_attr :vendor_id, BinStruct::Int24,
|
108
|
+
optional: ->(eap) { eap.type? && (eap.type == 254) }
|
109
109
|
|
110
110
|
# @!attribute vendor_type
|
111
111
|
# This field is present only for Request or Response packets,
|
112
112
|
# with type equal to +Expanded Types+ (254).
|
113
113
|
# @return [Integer] 32-bit vendor type
|
114
|
-
|
115
|
-
|
114
|
+
define_attr :vendor_type, BinStruct::Int32,
|
115
|
+
optional: ->(eap) { eap.type? && (eap.type == 254) }
|
116
116
|
|
117
117
|
# @!attribute body
|
118
|
-
# @return [
|
119
|
-
|
118
|
+
# @return [BinStruct::String, Header::Base]
|
119
|
+
define_attr :body, BinStruct::String
|
120
120
|
|
121
121
|
# @return [EAP]
|
122
122
|
def initialize(options={})
|
@@ -132,7 +132,7 @@ module PacketGen
|
|
132
132
|
# @return [Dot11] may return a subclass object if a more specific class
|
133
133
|
# may be determined
|
134
134
|
def read(str)
|
135
|
-
super
|
135
|
+
super
|
136
136
|
return self unless self.instance_of?(EAP)
|
137
137
|
return self unless type?
|
138
138
|
|
@@ -201,7 +201,7 @@ module PacketGen
|
|
201
201
|
# Calculate length field from content
|
202
202
|
# @return [Integer]
|
203
203
|
def calc_length
|
204
|
-
Base.calculate_and_set_length
|
204
|
+
Base.calculate_and_set_length(self)
|
205
205
|
end
|
206
206
|
|
207
207
|
# Say is this EAP header has {#type} field
|
@@ -217,7 +217,7 @@ module PacketGen
|
|
217
217
|
# @param [Packet] packet
|
218
218
|
# @return [void]
|
219
219
|
def added_to_packet(packet)
|
220
|
-
return if packet.respond_to?
|
220
|
+
return if packet.respond_to?(:eap)
|
221
221
|
|
222
222
|
packet.instance_eval("def eap(arg=nil); header(#{self.class}, arg); end") # def eap(arg=nil); header(EAP, arg); end
|
223
223
|
end
|
data/lib/packetgen/header/eth.rb
CHANGED
@@ -11,8 +11,8 @@ module PacketGen
|
|
11
11
|
# An Ethernet header consists of:
|
12
12
|
# * a destination MAC address ({MacAddr}),
|
13
13
|
# * a source MAC address (MacAddr),
|
14
|
-
# * a {#ethertype} ({
|
15
|
-
# * and a body (a {
|
14
|
+
# * a {#ethertype} ({BinStruct::Int16}),
|
15
|
+
# * and a body (a {BinStruct::String} or another Header class).
|
16
16
|
#
|
17
17
|
# == Create a Ethernet header
|
18
18
|
# # standalone
|
@@ -33,27 +33,27 @@ module PacketGen
|
|
33
33
|
class Eth < Base
|
34
34
|
# Ethernet MAC address, as a group of 6 bytes
|
35
35
|
# @author Sylvain Daubert
|
36
|
-
class MacAddr <
|
37
|
-
include
|
36
|
+
class MacAddr < BinStruct::Struct
|
37
|
+
include BinStruct::Structable
|
38
38
|
|
39
39
|
# @!attribute a0
|
40
40
|
# @return [Integer] first byte from MacAddr
|
41
|
-
|
41
|
+
define_attr :a0, BinStruct::Int8
|
42
42
|
# @!attribute a1
|
43
43
|
# @return [Integer] second byte from MacAddr
|
44
|
-
|
44
|
+
define_attr :a1, BinStruct::Int8
|
45
45
|
# @!attribute a2
|
46
46
|
# @return [Integer] third byte from MacAddr
|
47
|
-
|
47
|
+
define_attr :a2, BinStruct::Int8
|
48
48
|
# @!attribute a3
|
49
49
|
# @return [Integer] fourth byte from MacAddr
|
50
|
-
|
50
|
+
define_attr :a3, BinStruct::Int8
|
51
51
|
# @!attribute a4
|
52
52
|
# @return [Integer] fifth byte from MacAddr
|
53
|
-
|
53
|
+
define_attr :a4, BinStruct::Int8
|
54
54
|
# @!attribute a5
|
55
55
|
# @return [Integer] sixth byte from MacAddr
|
56
|
-
|
56
|
+
define_attr :a5, BinStruct::Int8
|
57
57
|
|
58
58
|
# Read a human-readable string to populate +MacAddr+
|
59
59
|
# @param [String] str
|
@@ -65,7 +65,7 @@ module PacketGen
|
|
65
65
|
raise ArgumentError, 'not a MAC address' unless bytes.size == 6
|
66
66
|
|
67
67
|
6.times do |i|
|
68
|
-
self[:"a#{i}"].
|
68
|
+
self[:"a#{i}"].from_human(bytes[i].to_i(16))
|
69
69
|
end
|
70
70
|
self
|
71
71
|
end
|
@@ -73,27 +73,27 @@ module PacketGen
|
|
73
73
|
# +MacAddr+ in human readable form (colon format)
|
74
74
|
# @return [String]
|
75
75
|
def to_human
|
76
|
-
|
76
|
+
attributes.map { |m| '%02x' % self[m] }.join(':')
|
77
77
|
end
|
78
78
|
|
79
79
|
def ==(other)
|
80
80
|
other.is_a?(self.class) &&
|
81
|
-
|
81
|
+
attributes.all? { |attr| self[attr].value == other[attr].value }
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
85
|
# @!attribute dst
|
86
86
|
# @return [MacAddr] Destination MAC address
|
87
|
-
|
87
|
+
define_attr :dst, MacAddr, default: '00:00:00:00:00:00'
|
88
88
|
# @!attribute src
|
89
89
|
# @return [MacAddr] Source MAC address
|
90
|
-
|
90
|
+
define_attr :src, MacAddr, default: '00:00:00:00:00:00'
|
91
91
|
# @!attribute ethertype
|
92
92
|
# @return [Integer] 16-bit integer to determine payload type
|
93
|
-
|
93
|
+
define_attr :ethertype, BinStruct::Int16, default: 0
|
94
94
|
# @!attribute body
|
95
|
-
# @return [
|
96
|
-
|
95
|
+
# @return [BinStruct::String,Header::Base]
|
96
|
+
define_attr :body, BinStruct::String
|
97
97
|
|
98
98
|
# send Eth packet on wire.
|
99
99
|
# @param [String] iface interface name
|
data/lib/packetgen/header/gre.rb
CHANGED
@@ -26,8 +26,6 @@ module PacketGen
|
|
26
26
|
# IP protocol number for GRE
|
27
27
|
IP_PROTOCOL = 47
|
28
28
|
|
29
|
-
define_field :u16, Types::Int16
|
30
|
-
|
31
29
|
# @!attribute c
|
32
30
|
# @return [Boolean]
|
33
31
|
# @!attribute k
|
@@ -38,26 +36,26 @@ module PacketGen
|
|
38
36
|
# @return [Integer]
|
39
37
|
# @!attribute ver
|
40
38
|
# @return [Integer]
|
41
|
-
|
39
|
+
define_bit_attr :u16, c: 1, r: 1, k: 1, s: 1, reserved0: 9, ver: 3
|
42
40
|
|
43
41
|
# @!attribute protocol_type
|
44
42
|
# @return [Integer]
|
45
|
-
|
43
|
+
define_attr :protocol_type, BinStruct::Int16
|
46
44
|
# @!attribute checksum
|
47
45
|
# @return [Integer]
|
48
|
-
|
46
|
+
define_attr :checksum, BinStruct::Int16, default: 0, optional: lambda(&:c?)
|
49
47
|
# @!attribute reserved1
|
50
48
|
# @return [Integer]
|
51
|
-
|
49
|
+
define_attr :reserved1, BinStruct::Int16, default: 0, optional: lambda(&:c?)
|
52
50
|
# @!attribute key
|
53
51
|
# @return [Integer]
|
54
|
-
|
52
|
+
define_attr :key, BinStruct::Int32, optional: lambda(&:k?)
|
55
53
|
# @!attribute sequence_number
|
56
54
|
# @return [Integer]
|
57
|
-
|
55
|
+
define_attr :sequence_number, BinStruct::Int32, optional: lambda(&:s?)
|
58
56
|
# @!attribute body
|
59
|
-
# @return [
|
60
|
-
|
57
|
+
# @return [BinStruct::String,Header::Base]
|
58
|
+
define_attr :body, BinStruct::String
|
61
59
|
|
62
60
|
alias seqnum sequence_number
|
63
61
|
alias seqnum= sequence_number=
|
@@ -13,7 +13,7 @@ module PacketGen
|
|
13
13
|
# @abstract Base class for HTTP headers.
|
14
14
|
# @author Kent 'picat' Gruber
|
15
15
|
class Headers
|
16
|
-
include
|
16
|
+
include BinStruct::Structable
|
17
17
|
|
18
18
|
# Underlying Headers data (or nil).
|
19
19
|
# @return [Hash, nil]
|
@@ -76,7 +76,7 @@ module PacketGen
|
|
76
76
|
end
|
77
77
|
|
78
78
|
# Read human-readable data to populate header data.
|
79
|
-
# @param [
|
79
|
+
# @param [Hash] data
|
80
80
|
# @return [self]
|
81
81
|
def from_human(data)
|
82
82
|
read(data)
|
@@ -10,9 +10,9 @@ module PacketGen
|
|
10
10
|
module Header
|
11
11
|
module HTTP
|
12
12
|
# An HTTP/1.1 Request packet consists of:
|
13
|
-
# * the http verb ({
|
14
|
-
# * the path ({
|
15
|
-
# * the version ({
|
13
|
+
# * the http verb ({BinStruct::String}).
|
14
|
+
# * the path ({BinStruct::String}).
|
15
|
+
# * the version ({BinStruct::String}).
|
16
16
|
# * associated http headers ({HTTP::Headers}).
|
17
17
|
#
|
18
18
|
# == Create a HTTP Request header
|
@@ -35,25 +35,26 @@ module PacketGen
|
|
35
35
|
#
|
36
36
|
# @author Kent 'picat' Gruber
|
37
37
|
# @author Sylvain Daubert
|
38
|
+
# @author LemonTree55
|
38
39
|
# @since 3.1.0 Rename +#method+ into {#verb} to not mask +Object#method+.
|
39
40
|
class Request < Base
|
40
41
|
# @!attribute verb
|
41
|
-
# @return [
|
42
|
+
# @return [BinStruct::String]
|
42
43
|
# @since 3.1.0
|
43
|
-
|
44
|
+
define_attr :verb, BinStruct::String
|
44
45
|
# @!attribute path
|
45
|
-
# @return [
|
46
|
-
|
46
|
+
# @return [BinStruct::String]
|
47
|
+
define_attr :path, BinStruct::String
|
47
48
|
# @!attribute version
|
48
|
-
# @return [
|
49
|
-
|
49
|
+
# @return [BinStruct::String]
|
50
|
+
define_attr :version, BinStruct::String, default: 'HTTP/1.1'
|
50
51
|
# @!attribute headers
|
51
52
|
# associated http/1.1 headers
|
52
53
|
# @return [HTTP::Headers]
|
53
|
-
|
54
|
+
define_attr :headers, HTTP::Headers
|
54
55
|
# @!attribute body
|
55
|
-
# @return [
|
56
|
-
|
56
|
+
# @return [BinStruct::String]
|
57
|
+
define_attr :body, BinStruct::String
|
57
58
|
|
58
59
|
# @param [Hash] options
|
59
60
|
# @option options [String] :verb
|
@@ -61,7 +62,7 @@ module PacketGen
|
|
61
62
|
# @option options [String] :version
|
62
63
|
# @option options [Hash] :headers
|
63
64
|
def initialize(options={})
|
64
|
-
super
|
65
|
+
super
|
65
66
|
self.headers ||= options[:headers]
|
66
67
|
end
|
67
68
|
|
@@ -70,9 +71,9 @@ module PacketGen
|
|
70
71
|
def read(str)
|
71
72
|
lines = lines(str)
|
72
73
|
first_line_words = lines.shift.split
|
73
|
-
self[:verb].read
|
74
|
-
self[:path].read
|
75
|
-
self[:version].read
|
74
|
+
self[:verb].read(first_line_words[0])
|
75
|
+
self[:path].read(first_line_words[1])
|
76
|
+
self[:version].read(first_line_words[2])
|
76
77
|
|
77
78
|
# requests can sometimes have a payload
|
78
79
|
headers, data = headers_and_payload_from_lines(lines)
|
@@ -10,11 +10,11 @@ module PacketGen
|
|
10
10
|
module Header
|
11
11
|
module HTTP
|
12
12
|
# An HTTP/1.1 Response packet consists of:
|
13
|
-
# * the version ({
|
14
|
-
# * the status code ({
|
15
|
-
# * the status message ({
|
13
|
+
# * the version ({BinStruct::String}).
|
14
|
+
# * the status code ({BinStruct::String}).
|
15
|
+
# * the status message ({BinStruct::String}).
|
16
16
|
# * associated http headers ({HTTP::Headers}).
|
17
|
-
# * the actual http payload body ({
|
17
|
+
# * the actual http payload body ({BinStruct::String}).
|
18
18
|
#
|
19
19
|
# == Create a HTTP Response header
|
20
20
|
# # standalone
|
@@ -36,23 +36,24 @@ module PacketGen
|
|
36
36
|
# http_resp.headers = { "Host": "tcpdump.org" } # even a hash
|
37
37
|
#
|
38
38
|
# @author Kent 'picat' Gruber
|
39
|
+
# @author LemonTree55
|
39
40
|
class Response < Base
|
40
41
|
# @!attribute version
|
41
|
-
# @return [
|
42
|
-
|
42
|
+
# @return [BinStruct::String]
|
43
|
+
define_attr :version, BinStruct::String, default: 'HTTP/1.1'
|
43
44
|
# @!attribute status_code
|
44
|
-
# @return [
|
45
|
-
|
45
|
+
# @return [BinStruct::String]
|
46
|
+
define_attr :status_code, BinStruct::String
|
46
47
|
# @!attribute status_mesg
|
47
|
-
# @return [
|
48
|
-
|
48
|
+
# @return [BinStruct::String]
|
49
|
+
define_attr :status_mesg, BinStruct::String
|
49
50
|
# @!attribute headers
|
50
51
|
# associated http/1.1 headers
|
51
|
-
# @return [
|
52
|
-
|
52
|
+
# @return [BinStruct::String]
|
53
|
+
define_attr :headers, HTTP::Headers
|
53
54
|
# @!attribute body
|
54
55
|
# @return [HTTP::PHeaders]
|
55
|
-
|
56
|
+
define_attr :body, BinStruct::String
|
56
57
|
|
57
58
|
# @param [Hash] options
|
58
59
|
# @option options [String] :version
|
@@ -61,7 +62,7 @@ module PacketGen
|
|
61
62
|
# @option options [String] :body
|
62
63
|
# @option options [Hash] :headers
|
63
64
|
def initialize(options={})
|
64
|
-
super
|
65
|
+
super
|
65
66
|
self.headers ||= options[:headers]
|
66
67
|
end
|
67
68
|
|
@@ -125,9 +126,9 @@ module PacketGen
|
|
125
126
|
first_line = headers.shift.split
|
126
127
|
return if first_line.size < 3
|
127
128
|
|
128
|
-
self[:version].read
|
129
|
-
self[:status_code].read
|
130
|
-
self[:status_mesg].read
|
129
|
+
self[:version].read(first_line[0])
|
130
|
+
self[:status_code].read(first_line[1])
|
131
|
+
self[:status_mesg].read(first_line[2..].join(' '))
|
131
132
|
end
|
132
133
|
|
133
134
|
def raise_on_bad_version_status
|
@@ -9,10 +9,8 @@
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
11
|
# @since 2.2.0
|
12
|
+
# @author Kent 'picat' Gruber
|
12
13
|
module HTTP
|
13
|
-
# @abstract Collection of useful HTTP verbs.
|
14
|
-
# @author Kent 'picat' Gruber
|
15
|
-
|
16
14
|
# Valid HTTP Verbs
|
17
15
|
VERBS = %w[GET HEAD POST PUT DELETE CONNECT OPTIONS TRACE PATCH].freeze
|
18
16
|
|
@@ -15,9 +15,9 @@ module PacketGen
|
|
15
15
|
# | Type | Code | Checksum |
|
16
16
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
17
17
|
# A ICMP header consists of:
|
18
|
-
# * a {#type} field ({
|
19
|
-
# * a {#code} field ({
|
20
|
-
# * a {#checksum} field ({
|
18
|
+
# * a {#type} field ({BinStruct::Int8} type),
|
19
|
+
# * a {#code} field ({BinStruct::Int8} type),
|
20
|
+
# * a {#checksum} field ({BinStruct::Int16} type),
|
21
21
|
# * and a {#body}.
|
22
22
|
#
|
23
23
|
# == Create a ICMP header
|
@@ -41,18 +41,18 @@ module PacketGen
|
|
41
41
|
# @!attribute type
|
42
42
|
# 8-bit ICMP type
|
43
43
|
# @return [Integer]
|
44
|
-
|
44
|
+
define_attr :type, BinStruct::Int8
|
45
45
|
# @!attribute code
|
46
46
|
# 8-bit ICMP code
|
47
47
|
# @return [Integer]
|
48
|
-
|
48
|
+
define_attr :code, BinStruct::Int8
|
49
49
|
# @!attribute checksum
|
50
50
|
# 16-bit ICMP checksum
|
51
51
|
# @return [Integer]
|
52
|
-
|
52
|
+
define_attr :checksum, BinStruct::Int16
|
53
53
|
# @!attribute body
|
54
|
-
# @return [
|
55
|
-
|
54
|
+
# @return [BinStruct::String,Header::Base]
|
55
|
+
define_attr :body, BinStruct::String
|
56
56
|
|
57
57
|
# Compute checksum and set +checksum+ field
|
58
58
|
# @return [Integer]
|
@@ -15,9 +15,9 @@ module PacketGen
|
|
15
15
|
# | Type | Code | Checksum |
|
16
16
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
17
17
|
# A ICMPv6 header consists of:
|
18
|
-
# * a +type+ field ({
|
19
|
-
# * a +code+ field ({
|
20
|
-
# * a +checksum+ field ({
|
18
|
+
# * a +type+ field ({BinStruct::Int8} type),
|
19
|
+
# * a +code+ field ({BinStruct::Int8} type),
|
20
|
+
# * a +checksum+ field ({BinStruct::Int16} type),
|
21
21
|
# * and a +body+.
|
22
22
|
#
|
23
23
|
# == Create a ICMPv6 header
|
@@ -20,9 +20,9 @@ module PacketGen
|
|
20
20
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
21
21
|
#
|
22
22
|
# A IGMP header consists of:
|
23
|
-
# * a {#type} field ({
|
24
|
-
# * a {#max_resp_time} field ({
|
25
|
-
# * a {#checksum} field ({
|
23
|
+
# * a {#type} field ({BinStruct::Int8Enum} type),
|
24
|
+
# * a {#max_resp_time} field ({BinStruct::Int8} type),
|
25
|
+
# * a {#checksum} field ({BinStruct::Int16} type),
|
26
26
|
# * a {#group_addr} field ({Header::IP::Addr} type),
|
27
27
|
# * and a {#body} (unused for IGMPv2).
|
28
28
|
#
|
@@ -56,22 +56,22 @@ module PacketGen
|
|
56
56
|
# @!attribute type
|
57
57
|
# 8-bit IGMP Type
|
58
58
|
# @return [Integer]
|
59
|
-
|
59
|
+
define_attr :type, BinStruct::Int8Enum, enum: TYPES
|
60
60
|
# @!attribute max_resp_time
|
61
61
|
# 8-bit IGMP Max Response Time
|
62
62
|
# @return [Integer]
|
63
|
-
|
63
|
+
define_attr :max_resp_time, BinStruct::Int8
|
64
64
|
# @!attribute checksum
|
65
65
|
# 16-bit IGMP Checksum
|
66
66
|
# @return [Integer]
|
67
|
-
|
67
|
+
define_attr :checksum, BinStruct::Int16
|
68
68
|
# @!attribute group_addr
|
69
69
|
# IP Group address
|
70
70
|
# @return [IP::Addr]
|
71
|
-
|
71
|
+
define_attr :group_addr, IP::Addr, default: '0.0.0.0'
|
72
72
|
# @!attribute body
|
73
73
|
# @return [String,Base]
|
74
|
-
|
74
|
+
define_attr :body, BinStruct::String
|
75
75
|
|
76
76
|
# @api private
|
77
77
|
# @note This method is used internally by PacketGen and should not be
|
@@ -11,7 +11,7 @@ module PacketGen
|
|
11
11
|
class IGMPv3
|
12
12
|
# Class to handle IGMPv3 Group Records.
|
13
13
|
#
|
14
|
-
# A Group Record is a block of
|
14
|
+
# A Group Record is a block of attributes.containing information
|
15
15
|
# pertaining to the sender's membership in a single multicast group on
|
16
16
|
# the interface from which the Report is sent.
|
17
17
|
#
|
@@ -40,8 +40,8 @@ module PacketGen
|
|
40
40
|
# | |
|
41
41
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
42
42
|
# @author Sylvain Daubert
|
43
|
-
class GroupRecord <
|
44
|
-
include
|
43
|
+
class GroupRecord < BinStruct::Struct
|
44
|
+
include BinStruct::Structable
|
45
45
|
|
46
46
|
# Known record types
|
47
47
|
RECORD_TYPES = {
|
@@ -56,29 +56,29 @@ module PacketGen
|
|
56
56
|
# @!attribute type
|
57
57
|
# 8-bit record type
|
58
58
|
# @return [Integer]
|
59
|
-
|
59
|
+
define_attr :type, BinStruct::Int8Enum, enum: RECORD_TYPES
|
60
60
|
# @!attribute aux_data_len
|
61
61
|
# 8-bit length of of the Auxiliary Data field ({#aux_data}), in unit of
|
62
62
|
# 32-bit words
|
63
63
|
# @return [Integer]
|
64
|
-
|
64
|
+
define_attr :aux_data_len, BinStruct::Int8, default: 0
|
65
65
|
# @!attribute number_of_sources
|
66
66
|
# 16-bit Number of source addresses in {#source_addr}
|
67
67
|
# @return [Integer]
|
68
|
-
|
68
|
+
define_attr :number_of_sources, BinStruct::Int16, default: 0
|
69
69
|
# @!attribute multicast_addr
|
70
70
|
# IP multicast address to which this Group Record pertains
|
71
71
|
# @return [IP::Addr]
|
72
|
-
|
72
|
+
define_attr :multicast_addr, IP::Addr, default: '0.0.0.0'
|
73
73
|
# @!attribute source_addr
|
74
74
|
# Array of source addresses
|
75
75
|
# @return [IP::ArrayOfAddr]
|
76
|
-
|
77
|
-
|
76
|
+
define_attr :source_addr, IP::ArrayOfAddr,
|
77
|
+
builder: ->(h, t) { t.new(counter: h[:number_of_sources]) }
|
78
78
|
# @!attribute aux_data
|
79
79
|
# @return [String]
|
80
|
-
|
81
|
-
|
80
|
+
define_attr :aux_data, BinStruct::String,
|
81
|
+
builder: ->(h, t) { t.new(length_from: -> { h[:aux_data_len].to_i * 4 }) }
|
82
82
|
|
83
83
|
def human_type
|
84
84
|
self[:type].to_human
|
@@ -91,7 +91,7 @@ module PacketGen
|
|
91
91
|
|
92
92
|
# Class to handle series of {GroupRecord}.
|
93
93
|
# @author Sylvain Daubert
|
94
|
-
class GroupRecords <
|
94
|
+
class GroupRecords < BinStruct::Array
|
95
95
|
set_of GroupRecord
|
96
96
|
|
97
97
|
# Separator used in {#to_human}.
|
@@ -31,7 +31,7 @@ module PacketGen
|
|
31
31
|
# | Source Address [N] |
|
32
32
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
33
33
|
#
|
34
|
-
#
|
34
|
+
# Struct are:
|
35
35
|
# * 32-bit {#group_addr} field ({Header::IP::Addr} type),
|
36
36
|
# * 4-bit {#resv}, a reserved field,
|
37
37
|
# * 1-bit {#flag_s} (Suppress Router-Side Processing),
|
@@ -44,36 +44,34 @@ module PacketGen
|
|
44
44
|
# @!attribute group_addr
|
45
45
|
# IP Group address
|
46
46
|
# @return [IP::Addr]
|
47
|
-
|
47
|
+
define_attr :group_addr, IP::Addr, default: '0.0.0.0'
|
48
48
|
# @!attribute u8
|
49
49
|
# First 8-bit field, composed of {#resv}, {#flag_s} and {#qrv}
|
50
50
|
# @return [Integer]
|
51
|
-
|
51
|
+
# @!attribute resv
|
52
|
+
# 4-bit reserved field in
|
53
|
+
# @return [Integer]
|
54
|
+
# @!attribute flag_s
|
55
|
+
# 1-bit S flag (Suppress Router-Side Processing)
|
56
|
+
# @return [Integer]
|
57
|
+
# @!attribute qrv
|
58
|
+
# 3-bit Querier's Robustness Variable
|
59
|
+
# @return [Integer]
|
60
|
+
define_bit_attr :u8, resv: 4, flag_s: 1, qrv: 3
|
52
61
|
# @!attribute qqic
|
53
62
|
# 8-bit QQIC
|
54
63
|
# @return [Integer,Float]
|
55
|
-
|
64
|
+
define_attr :qqic, BinStruct::Int8
|
56
65
|
# @!attribute number_of_sources
|
57
66
|
# 16-bit Number of Sources in {#source_addr}
|
58
67
|
# @return [Integer]
|
59
|
-
|
68
|
+
define_attr :number_of_sources, BinStruct::Int16
|
60
69
|
|
61
70
|
# @!attribute source_addr
|
62
71
|
# Array of IP source addresses
|
63
72
|
# @return [IP::ArrayOfAddr]
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
# @!attribute resv
|
68
|
-
# 4-bit reserved field in
|
69
|
-
# @return [Integer]
|
70
|
-
# @!attribute flag_s
|
71
|
-
# 1-bit S flag (Suppress Router-Side Processing)
|
72
|
-
# @return [Boolean]
|
73
|
-
# @!attribute qrv
|
74
|
-
# 3-bit Querier's Robustness Variable
|
75
|
-
# @return [Integer]
|
76
|
-
define_bit_fields_on :u8, :resv, 4, :flag_s, :qrv, 3
|
73
|
+
define_attr :source_addr, IP::ArrayOfAddr,
|
74
|
+
builder: ->(h, t) { t.new(counter: h[:number_of_sources]) }
|
77
75
|
|
78
76
|
undef qqic, qqic=
|
79
77
|
|
@@ -49,17 +49,17 @@ module PacketGen
|
|
49
49
|
# @!attribute reserved
|
50
50
|
# 16-bit reserved field
|
51
51
|
# @return [Integer]
|
52
|
-
|
52
|
+
define_attr :reserved, BinStruct::Int16, default: 0
|
53
53
|
# @!attribute number_of_gr
|
54
54
|
# 16-bit Number of group records in {#group_records}
|
55
55
|
# @return [Integer]
|
56
|
-
|
56
|
+
define_attr :number_of_gr, BinStruct::Int16, default: 0
|
57
57
|
|
58
58
|
# @!attribute group_records
|
59
59
|
# Array of group records
|
60
60
|
# @return [GroupRecords]
|
61
|
-
|
62
|
-
|
61
|
+
define_attr :group_records, GroupRecords,
|
62
|
+
builder: ->(h, t) { t.new(counter: h[:number_of_gr]) }
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|