packetgen 4.0.0 → 4.1.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 +1 -1
- data/lib/packetgen/deprecation.rb +7 -1
- data/lib/packetgen/header/arp.rb +6 -7
- data/lib/packetgen/header/asn1_base.rb +2 -1
- data/lib/packetgen/header/base.rb +27 -24
- data/lib/packetgen/header/bootp.rb +14 -14
- data/lib/packetgen/header/dhcp/option.rb +8 -8
- data/lib/packetgen/header/dhcp/options.rb +2 -2
- data/lib/packetgen/header/dhcp.rb +6 -7
- data/lib/packetgen/header/dhcpv6/duid.rb +1 -1
- data/lib/packetgen/header/dhcpv6/option.rb +37 -15
- data/lib/packetgen/header/dhcpv6/options.rb +3 -3
- data/lib/packetgen/header/dhcpv6/relay.rb +1 -0
- data/lib/packetgen/header/dhcpv6.rb +13 -14
- data/lib/packetgen/header/dns/name.rb +9 -8
- data/lib/packetgen/header/dns/opt.rb +3 -0
- data/lib/packetgen/header/dns/option.rb +7 -7
- data/lib/packetgen/header/dns/qdsection.rb +2 -2
- data/lib/packetgen/header/dns/question.rb +1 -0
- data/lib/packetgen/header/dns/rrsection.rb +2 -2
- data/lib/packetgen/header/dns.rb +76 -60
- data/lib/packetgen/header/dot11/control.rb +5 -5
- data/lib/packetgen/header/dot11/data.rb +11 -10
- data/lib/packetgen/header/dot11/element.rb +1 -1
- data/lib/packetgen/header/dot11/management.rb +18 -15
- data/lib/packetgen/header/dot11/sub_mngt.rb +22 -21
- data/lib/packetgen/header/dot11.rb +38 -38
- data/lib/packetgen/header/dot1q.rb +5 -4
- data/lib/packetgen/header/dot1x.rb +8 -8
- data/lib/packetgen/header/eap/fast.rb +3 -3
- data/lib/packetgen/header/eap/md5.rb +11 -3
- data/lib/packetgen/header/eap/tls.rb +9 -8
- data/lib/packetgen/header/eap/ttls.rb +13 -10
- data/lib/packetgen/header/eap.rb +58 -33
- data/lib/packetgen/header/eth.rb +26 -12
- data/lib/packetgen/header/gre.rb +26 -2
- data/lib/packetgen/header/http/headers.rb +6 -5
- data/lib/packetgen/header/http/request.rb +24 -16
- data/lib/packetgen/header/http/response.rb +22 -15
- data/lib/packetgen/header/icmp.rb +10 -10
- data/lib/packetgen/header/icmpv6.rb +10 -9
- data/lib/packetgen/header/igmp.rb +21 -10
- data/lib/packetgen/header/igmpv3/group_record.rb +7 -2
- data/lib/packetgen/header/igmpv3/mq.rb +1 -1
- data/lib/packetgen/header/igmpv3/mr.rb +1 -1
- data/lib/packetgen/header/igmpv3.rb +11 -10
- data/lib/packetgen/header/ip/addr.rb +6 -2
- data/lib/packetgen/header/ip/option.rb +18 -5
- data/lib/packetgen/header/ip.rb +52 -35
- data/lib/packetgen/header/ipv6/addr.rb +14 -13
- data/lib/packetgen/header/ipv6/extension.rb +9 -7
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +26 -7
- data/lib/packetgen/header/ipv6.rb +31 -22
- data/lib/packetgen/header/llc.rb +20 -13
- data/lib/packetgen/header/mdns.rb +9 -2
- data/lib/packetgen/header/mld.rb +11 -9
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +6 -1
- data/lib/packetgen/header/mldv2/mlq.rb +8 -8
- data/lib/packetgen/header/mldv2/mlr.rb +4 -4
- data/lib/packetgen/header/mldv2.rb +1 -1
- data/lib/packetgen/header/ospfv2/db_description.rb +10 -10
- data/lib/packetgen/header/ospfv2/hello.rb +11 -10
- data/lib/packetgen/header/ospfv2/ls_ack.rb +5 -6
- data/lib/packetgen/header/ospfv2/ls_request.rb +7 -6
- data/lib/packetgen/header/ospfv2/ls_update.rb +7 -7
- data/lib/packetgen/header/ospfv2/lsa.rb +33 -10
- data/lib/packetgen/header/ospfv2/lsa_header.rb +3 -2
- data/lib/packetgen/header/ospfv2.rb +31 -26
- data/lib/packetgen/header/ospfv3/db_description.rb +12 -13
- data/lib/packetgen/header/ospfv3/hello.rb +10 -9
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +6 -2
- data/lib/packetgen/header/ospfv3/ls_ack.rb +5 -6
- data/lib/packetgen/header/ospfv3/ls_request.rb +10 -10
- data/lib/packetgen/header/ospfv3/ls_update.rb +7 -7
- data/lib/packetgen/header/ospfv3/lsa.rb +23 -9
- data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -2
- data/lib/packetgen/header/ospfv3.rb +38 -34
- data/lib/packetgen/header/sctp/chunk.rb +38 -17
- data/lib/packetgen/header/sctp/error.rb +169 -197
- data/lib/packetgen/header/sctp/padded32.rb +3 -3
- data/lib/packetgen/header/sctp/parameter.rb +85 -132
- data/lib/packetgen/header/sctp.rb +14 -3
- data/lib/packetgen/header/snmp.rb +108 -7
- data/lib/packetgen/header/tcp/option.rb +7 -0
- data/lib/packetgen/header/tcp/options.rb +11 -3
- data/lib/packetgen/header/tcp.rb +33 -26
- data/lib/packetgen/header/tftp.rb +16 -10
- data/lib/packetgen/header/udp.rb +15 -13
- data/lib/packetgen/header.rb +19 -13
- data/lib/packetgen/headerable.rb +9 -3
- data/lib/packetgen/inspect.rb +2 -7
- data/lib/packetgen/packet.rb +94 -36
- data/lib/packetgen/pcapng/block.rb +2 -1
- data/lib/packetgen/pcapng/file.rb +41 -14
- data/lib/packetgen/pcapng/idb.rb +2 -1
- data/lib/packetgen/pcapng/shb.rb +2 -1
- data/lib/packetgen/pcapng/spb.rb +1 -1
- data/lib/packetgen/pcapng.rb +2 -0
- data/lib/packetgen/proto.rb +4 -0
- data/lib/packetgen/unknown_packet.rb +3 -3
- data/lib/packetgen/utils.rb +2 -1
- data/lib/packetgen/version.rb +1 -1
- data/lib/packetgen.rb +8 -2
- metadata +4 -4
@@ -51,7 +51,7 @@ module PacketGen
|
|
51
51
|
define_attr :reserved, BinStruct::Int16
|
52
52
|
# @!attribute prefix
|
53
53
|
# IPv6 Prefix as an array of 32-bit words
|
54
|
-
# @return [
|
54
|
+
# @return [BinStruct::ArrayOfInt32]
|
55
55
|
define_attr :prefix, BinStruct::ArrayOfInt32, builder: ->(h, t) { t.new(length_from: -> { h.length / 8 }) }
|
56
56
|
|
57
57
|
# Get human-readable prefix
|
@@ -68,7 +68,10 @@ module PacketGen
|
|
68
68
|
# Set prefix from a human-readable string. This method cannot set
|
69
69
|
# {#options} field.
|
70
70
|
# @param [String] str
|
71
|
-
# @return [
|
71
|
+
# @return [self]
|
72
|
+
# @example
|
73
|
+
# prefix = PacketGen::Header::OSPFv3::IPv6Prefix.new.from_human("2000::/64")
|
74
|
+
# prefix.to_human #=> "2000::/64"
|
72
75
|
def from_human(str)
|
73
76
|
ary, len = ary_and_prefix_len_from_str(str)
|
74
77
|
|
@@ -81,6 +84,7 @@ module PacketGen
|
|
81
84
|
end
|
82
85
|
end
|
83
86
|
self.length = len
|
87
|
+
self
|
84
88
|
end
|
85
89
|
|
86
90
|
private
|
@@ -23,18 +23,17 @@ module PacketGen
|
|
23
23
|
# This paylod is implemented with only one field:
|
24
24
|
# * {#lsas}, an {ArrayOfLSA} object.
|
25
25
|
#
|
26
|
-
#
|
26
|
+
# @example Create a LSAck payload
|
27
27
|
# # standalone
|
28
28
|
# lsack = PacketGen::Header::OSPFv3::LSAck.new
|
29
29
|
# # in a packet
|
30
|
-
# pkt = PacketGen.gen('IPv6'
|
30
|
+
# pkt = PacketGen.gen('IPv6').add('OSPFv3').add('OSPFv3::LSAck')
|
31
31
|
# # access to LSAck payload
|
32
|
-
# lasck = pkt.ospfv3_lsack # => PacketGen::Header::OSPFv3::LSAck
|
32
|
+
# lasck = pkt.ospfv3_lsack.class # => PacketGen::Header::OSPFv3::LSAck
|
33
33
|
#
|
34
|
-
#
|
34
|
+
# @example Adding LSA headers to a LSAck payload
|
35
|
+
# lsack = PacketGen::Header::OSPFv3::LSAck.new
|
35
36
|
# lsack.lsas << { type: 'Router', age: 40, link_state_id: '0.0.0.1', advertising_router: '1.1.1.1', sequence_number: 42, checksum: 0x1234, length: 56 }
|
36
|
-
# # a header may also be set from an existing lsa
|
37
|
-
# lasck.lsas << existing_lsa.to_lsa_header
|
38
37
|
# @author Sylvain Daubert
|
39
38
|
class LSAck < Base
|
40
39
|
# @!attribute lsas
|
@@ -22,10 +22,10 @@ module PacketGen
|
|
22
22
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
23
23
|
#
|
24
24
|
# It is composed of:
|
25
|
-
# * a 16-bit {#reserved} field,
|
26
|
-
# * a 16-bit {#type} field,
|
27
|
-
# * a 32-bit {#link_state_id} field,
|
28
|
-
# * and a 32-bit {#advertising_router} field.
|
25
|
+
# * a 16-bit {#reserved} field (+BinStruct::Int16+),
|
26
|
+
# * a 16-bit {#type} field (+BinStruct::Int16+),
|
27
|
+
# * a 32-bit {#link_state_id} field ({IP::Addr}),
|
28
|
+
# * and a 32-bit {#advertising_router} field ({IP::Addr}).
|
29
29
|
# @author Sylvain Daubert
|
30
30
|
class LSR < BinStruct::Struct
|
31
31
|
include BinStruct::Structable
|
@@ -60,8 +60,7 @@ module PacketGen
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
# This class defines a specialized
|
64
|
-
# of {LSR LSRs}.
|
63
|
+
# This class defines a specialized array to handle series of {LSR LSRs}.
|
65
64
|
# @author Sylvain Daubert
|
66
65
|
class ArrayOfLSR < BinStruct::Array
|
67
66
|
set_of LSR
|
@@ -83,17 +82,18 @@ module PacketGen
|
|
83
82
|
# This paylod is implemented as a unique field: {#lsrs}, which is an
|
84
83
|
# {ArrayOfLSR} object.
|
85
84
|
#
|
86
|
-
#
|
85
|
+
# @example Create a LSRequest payload
|
87
86
|
# # standalone
|
88
87
|
# lsr = PacketGen::Header::OSPFv3::LSRequest.new
|
89
88
|
# # in a packet
|
90
|
-
# pkt = PacketGen.gen('IPv6'
|
89
|
+
# pkt = PacketGen.gen('IPv6').add('OSPFv3').add('OSPFv3::LSRequest')
|
91
90
|
# # make IPv6 header correct for OSPF
|
92
91
|
# pkt.ospfize
|
93
92
|
# # access to LSRequest payload
|
94
|
-
# pkt.ospfv3_lsrequest # => PacketGen::Header::OSPFv3::LSRequest
|
93
|
+
# pkt.ospfv3_lsrequest.class # => PacketGen::Header::OSPFv3::LSRequest
|
95
94
|
#
|
96
|
-
#
|
95
|
+
# @example Add LSA requests to a LSRequest
|
96
|
+
# lsr = PacketGen::Header::OSPFv3::LSRequest.new
|
97
97
|
# lsr.lsrs << { type: 'Router', link_state_id: '0.0.0.1', advertising_router: '1.1.1.1'}
|
98
98
|
# @author Sylvain Daubert
|
99
99
|
class LSRequest < Base
|
@@ -23,22 +23,22 @@ module PacketGen
|
|
23
23
|
# | ... |
|
24
24
|
#
|
25
25
|
# This paylod is implemented with two fields:
|
26
|
-
# * {#lsas_count}, a
|
26
|
+
# * {#lsas_count}, a +BinStruct::Int32+ field,
|
27
27
|
# * and {#lsas}, an {ArrayOfLSA} object.
|
28
28
|
#
|
29
|
-
#
|
29
|
+
# @example Create a LSUpdate payload
|
30
30
|
# # standalone
|
31
31
|
# lsu = PacketGen::Header::OSPFv3::LSUpdate.new
|
32
32
|
# # in a packet
|
33
|
-
# pkt = PacketGen.gen('IPv6'
|
33
|
+
# pkt = PacketGen.gen('IPv6').add('OSPFv3').add('OSPFv3::LSUpdate')
|
34
34
|
# # make IPv6 header correct for OSPF
|
35
35
|
# pkt.ospfize
|
36
36
|
# # access to LSUpdate payload
|
37
|
-
# lsu = pkt.ospfv3_lsupdate # => PacketGen::Header::OSPFv3::LSUpdate
|
37
|
+
# lsu = pkt.ospfv3_lsupdate.class # => PacketGen::Header::OSPFv3::LSUpdate
|
38
38
|
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
39
|
+
# @example Add LSAs to a LSUpdate payload
|
40
|
+
# lsu = PacketGen::Header::OSPFv3::LSUpdate.new
|
41
|
+
# # Adding LSAs with #<< automagically update #lsas_count. To not update it, use #push.
|
42
42
|
# lsu.lsas << { type: 'Router', age: 40, link_state_id: '0.0.0.1', advertising_router: '1.1.1.1', sequence_number: 42 }
|
43
43
|
# lsu.lsas_count #=> 1
|
44
44
|
# # add a link to Router LSA
|
@@ -15,24 +15,33 @@ module PacketGen
|
|
15
15
|
include BinStruct::Structable
|
16
16
|
|
17
17
|
# @!attribute type
|
18
|
+
# Kind of interface being described. One of the following:
|
19
|
+
# * 1: Point-to-point connection to another router
|
20
|
+
# * 2: Connection to a transit network
|
21
|
+
# * 4: Virtual link
|
18
22
|
# @return [Integer]
|
19
23
|
define_attr :type, BinStruct::Int8
|
20
24
|
# @!attribute reserved
|
21
25
|
# @return [Integer]
|
22
26
|
define_attr :reserved, BinStruct::Int8, default: 0
|
23
27
|
# @!attribute metric
|
28
|
+
# Cost of using this router interface.
|
24
29
|
# @return [Integer]
|
25
30
|
define_attr :metric, BinStruct::Int16
|
26
31
|
# @!attribute interface_id
|
32
|
+
# ID for the interface being described.
|
27
33
|
# @return [Integer]
|
28
34
|
define_attr :interface_id, BinStruct::Int32
|
29
35
|
# @!attribute neighbor_interface_id
|
36
|
+
# Interface ID the neighbor router has associated with this link.
|
30
37
|
# @return [Integer]
|
31
38
|
define_attr :neighbor_interface_id, BinStruct::Int32
|
32
39
|
# @!attribute neighbor_router_id
|
40
|
+
# Router ID of the neighbor router.
|
33
41
|
# @return [String]
|
34
42
|
define_attr :neighbor_router_id, IP::Addr
|
35
43
|
|
44
|
+
# Human-readable description
|
36
45
|
# @return [String]
|
37
46
|
def to_human
|
38
47
|
"Link<type:#{type},metric:#{metric},id:#{interface_id}," \
|
@@ -40,7 +49,7 @@ module PacketGen
|
|
40
49
|
end
|
41
50
|
end
|
42
51
|
|
43
|
-
# This class defines a specialized
|
52
|
+
# This class defines a specialized +BinStruct::Array+ to handle series
|
44
53
|
# of {Link Links}.
|
45
54
|
# @author Sylvain Daubert
|
46
55
|
class ArrayOfLink < BinStruct::Array
|
@@ -62,8 +71,8 @@ module PacketGen
|
|
62
71
|
#
|
63
72
|
# A LSA router payload is composed of:
|
64
73
|
# * a header (see methods inherited from {LSAHeader}),
|
65
|
-
# * a 8-bit flag word {#flags} (
|
66
|
-
# * a 24-bit {#options} field (
|
74
|
+
# * a 8-bit flag word {#flags} (+BinStruct::Int8+),
|
75
|
+
# * a 24-bit {#options} field (+BinStruct::Int24+),
|
67
76
|
# * and an array of {#links} ({ArrayOfLink}).
|
68
77
|
# @author Sylvain Daubert
|
69
78
|
class LSARouter < LSAHeader
|
@@ -71,17 +80,22 @@ module PacketGen
|
|
71
80
|
# 8-bit flag word
|
72
81
|
# @return [Integer]
|
73
82
|
# @!attribute nt_flag
|
83
|
+
# If set, the router is an NSSA border router that is translating NSSA-LSAs into AS-external-LSAs.
|
74
84
|
# @return [Integer]
|
75
85
|
# @!attribute v_flag
|
86
|
+
# If set, router is an endpoint or one or many fully adjacent virtual links.
|
76
87
|
# @return [Integer]
|
77
88
|
# @!attribute e_flag
|
89
|
+
# If set, router is an AS boundary router.
|
78
90
|
# @return [Integer]
|
79
91
|
# @!attribute b_flag
|
92
|
+
# If set, router is an area border router.
|
80
93
|
# @return [Integer]
|
81
94
|
define_bit_attr :flags, zz: 3, nt_flag: 1, x_flag: 1, v_flag: 1, e_flag: 1, b_flag: 1
|
82
95
|
# @!macro define_ospfv3_options
|
83
96
|
OSPFv3.define_options(self)
|
84
97
|
# @attribute links
|
98
|
+
# Router interfaces, as a list of {Link} objects.
|
85
99
|
# @return [ArrayOfLink]
|
86
100
|
define_attr :links, ArrayOfLink, builder: ->(h, t) { t.new(length_from: -> { h.length - h.offset_of(:links) }) }
|
87
101
|
end
|
@@ -109,8 +123,8 @@ module PacketGen
|
|
109
123
|
# This class handles OSPFv3 LSA Intra-Area-Prefix payloads.
|
110
124
|
#
|
111
125
|
# An Intra-Area-Prefix payloads is composed of:
|
112
|
-
# * a 16-bit {#prefix_count} field (
|
113
|
-
# * a 16-bit {#ref_ls_type} field (
|
126
|
+
# * a 16-bit {#prefix_count} field (+BinStruct::Int16+),
|
127
|
+
# * a 16-bit {#ref_ls_type} field (+BinStruct::Int16Enum+),
|
114
128
|
# * a 32-bit {#ref_link_state_id} ({IP::Addr}),
|
115
129
|
# * a 32-bit {#ref_advertising_router} ({IP::Addr}),
|
116
130
|
# * and an array of {IPv6Prefix} ({#prefixes}, {ArrayOfIPv6Prefix}). In
|
@@ -150,10 +164,10 @@ module PacketGen
|
|
150
164
|
# This class handles OSPFv3 LSA Link payloads.
|
151
165
|
#
|
152
166
|
# A Link payloads is composed of:
|
153
|
-
# * a 8-bit {#router_priority} field (
|
154
|
-
# * a 24-bit {#options} field (
|
167
|
+
# * a 8-bit {#router_priority} field (+BinStruct::Int8+),
|
168
|
+
# * a 24-bit {#options} field (+BinStruct::Int24+),
|
155
169
|
# * a 128-bit IPv6 {#interface_addr} ({IPv6::Addr}),
|
156
|
-
# * a 32-bit {#prefix_count} field (
|
170
|
+
# * a 32-bit {#prefix_count} field (+BinStruct::Int32+),
|
157
171
|
# * and an array of {IPv6Prefix} ({#prefixes}, {ArrayOfIPv6Prefix}).
|
158
172
|
# @author Sylvain Daubert
|
159
173
|
class LSALink < LSAHeader
|
@@ -178,7 +192,7 @@ module PacketGen
|
|
178
192
|
define_attr :prefixes, ArrayOfIPv6Prefix, builder: ->(h, t) { t.new(counter: h[:prefix_count]) }
|
179
193
|
end
|
180
194
|
|
181
|
-
# This class defines a specialized
|
195
|
+
# This class defines a specialized +BinStruct::Array+ to handle series
|
182
196
|
# of {LSA LSAs} or {LSAHeader LSAHeaders}. It recognizes known LSA types
|
183
197
|
# and infers correct type.
|
184
198
|
# @author Sylvain Daubert
|
@@ -76,7 +76,7 @@ module PacketGen
|
|
76
76
|
# @return [Integer]
|
77
77
|
define_attr :length, BinStruct::Int16
|
78
78
|
|
79
|
-
# Compute and set Fletcher-16 checksum on LSA
|
79
|
+
# Compute and set Fletcher-16 {#checksum} on LSA
|
80
80
|
# @return [Integer]
|
81
81
|
def calc_checksum
|
82
82
|
c0 = c1 = 0
|
@@ -94,7 +94,7 @@ module PacketGen
|
|
94
94
|
self.checksum = (x << 8) | y
|
95
95
|
end
|
96
96
|
|
97
|
-
# Compute length and set
|
97
|
+
# Compute length and set {#length} field
|
98
98
|
# @return [Integer]
|
99
99
|
def calc_length
|
100
100
|
self.length = Base.calculate_and_set_length(self)
|
@@ -106,6 +106,7 @@ module PacketGen
|
|
106
106
|
self[:type].to_human
|
107
107
|
end
|
108
108
|
|
109
|
+
# Get human-readable description
|
109
110
|
# @return [String]
|
110
111
|
def to_human
|
111
112
|
"LSA<#{human_type},#{link_state_id},#{advertising_router}>"
|
@@ -24,45 +24,47 @@ module PacketGen
|
|
24
24
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
25
25
|
#
|
26
26
|
# An OSPFv3 header consists of:
|
27
|
-
# * a {#version} field (
|
28
|
-
# * a {#type} field (
|
29
|
-
# * a {#length} field (
|
30
|
-
# * a {#router_id} field (
|
31
|
-
# * an {#area_id} field (
|
32
|
-
# * a {#checksum} field (
|
33
|
-
# * an {#instance_id} field (
|
34
|
-
# * a {#reserved} field (
|
35
|
-
# * and a {#body} (
|
27
|
+
# * a {#version} field (+BinStruct::Int8+),
|
28
|
+
# * a {#type} field (+BinStruct::Int8Enum+),
|
29
|
+
# * a {#length} field (+BinStruct::Int16+). The length includes the header,
|
30
|
+
# * a {#router_id} field (+BinStruct::Int32+),
|
31
|
+
# * an {#area_id} field (+BinStruct::Int32+),
|
32
|
+
# * a {#checksum} field (+BinStruct::Int16+),
|
33
|
+
# * an {#instance_id} field (+BinStruct::Int8+),
|
34
|
+
# * a {#reserved} field (+BinStruct::Int8+),
|
35
|
+
# * and a {#body} (+BinStruct::String+ or {Headerable}).
|
36
36
|
#
|
37
|
-
# ==
|
37
|
+
# == OSPFv3 body
|
38
|
+
# OSPFv3 {#body} should contain OSPF payload for given {#type}:
|
39
|
+
# * {OSPFv3::Hello},
|
40
|
+
# * {OSPFv3::DbDescription},
|
41
|
+
# * {OSPFv3::LSRequest},
|
42
|
+
# * {OSPFv3::LSUpdate},
|
43
|
+
# * or {OSPFv3::LSAck}.
|
44
|
+
#
|
45
|
+
# @example Create an OSPFv3 header
|
38
46
|
# # standalone
|
39
47
|
# ospf = PacketGen::Header::OSPFv3.new
|
40
48
|
# # in a packet
|
41
|
-
# pkt = PacketGen.gen('IPv6'
|
49
|
+
# pkt = PacketGen.gen('IPv6').add('OSPFv3')
|
42
50
|
# # make IPv6 header correct for OSPF
|
43
51
|
# pkt.ospfize
|
44
52
|
# # or make it correct with specific destination address
|
45
53
|
# pkt.ospfize(dst: :all_spf_routers)
|
46
54
|
# # access to OSPF header
|
47
|
-
# pkt.ospfv3 # => PacketGen::Header::OSPFv3
|
48
|
-
#
|
49
|
-
# == OSPFv3 attributes
|
50
|
-
# ospf.version # => 3
|
51
|
-
# ospf.type = 'LS_ACK' # or 5
|
52
|
-
# ospf.length = 154
|
53
|
-
# ospf.router_id = 0xc0a80001
|
54
|
-
# ospf.area_id = 1
|
55
|
-
# ospf.checksum = 0xabcd
|
56
|
-
# ospf.instance_id = 0
|
55
|
+
# pkt.ospfv3.class # => PacketGen::Header::OSPFv3
|
57
56
|
#
|
58
|
-
#
|
59
|
-
# OSPFv3
|
60
|
-
#
|
61
|
-
#
|
62
|
-
#
|
63
|
-
#
|
64
|
-
#
|
57
|
+
# @example OSPFv3 attributes
|
58
|
+
# ospf = PacketGen::Header::OSPFv3.new
|
59
|
+
# ospf.version # => 3
|
60
|
+
# ospf.type = 'LS_ACK' # or 5
|
61
|
+
# ospf.length = 154
|
62
|
+
# ospf.router_id = 0xc0a80001
|
63
|
+
# ospf.area_id = 1
|
64
|
+
# ospf.checksum = 0xabcd
|
65
|
+
# ospf.instance_id = 0
|
65
66
|
# @author Sylvain Daubert
|
67
|
+
# @author LemonTree55
|
66
68
|
# @since 2.5.0
|
67
69
|
class OSPFv3 < Base
|
68
70
|
# IP protocol number for OSPF
|
@@ -80,7 +82,7 @@ module PacketGen
|
|
80
82
|
# @return [Integer]
|
81
83
|
define_attr :type, BinStruct::Int8Enum, enum: TYPES
|
82
84
|
# @!attribute length
|
83
|
-
# 16-bit OSPF packet length
|
85
|
+
# 16-bit OSPF packet length. Header is included in length
|
84
86
|
# @return [Integer]
|
85
87
|
define_attr :length, BinStruct::Int16
|
86
88
|
# @!attribute router_id
|
@@ -104,7 +106,8 @@ module PacketGen
|
|
104
106
|
# @return [Integer]
|
105
107
|
define_attr :reserved, BinStruct::Int8, default: 0
|
106
108
|
# @!attribute body
|
107
|
-
#
|
109
|
+
# OSPFv3 body
|
110
|
+
# @return [String,Headerable]
|
108
111
|
define_attr :body, BinStruct::String
|
109
112
|
|
110
113
|
# @api private
|
@@ -142,12 +145,13 @@ module PacketGen
|
|
142
145
|
# @api private
|
143
146
|
# @note This method is used internally by PacketGen and should not be
|
144
147
|
# directly called
|
148
|
+
# Add +#ospfize+ method to +packet+. This method calls {#ospfize}.
|
145
149
|
def added_to_packet(packet)
|
146
150
|
ospf_idx = packet.headers.size
|
147
151
|
packet.instance_eval "def ospfize(**kwargs) @headers[#{ospf_idx}].ospfize(**kwargs); end" # def ospfize(**kwargs) @headers[2].ospfize(**kwargs); end
|
148
152
|
end
|
149
153
|
|
150
|
-
# Compute checksum and set
|
154
|
+
# Compute checksum and set {#checksum} attribute
|
151
155
|
# @return [Integer]
|
152
156
|
def calc_checksum
|
153
157
|
ipv6 = ip_header(self)
|
@@ -164,7 +168,7 @@ module PacketGen
|
|
164
168
|
self[:type].to_human
|
165
169
|
end
|
166
170
|
|
167
|
-
# Compute length and set
|
171
|
+
# Compute length and set {#length} attribute
|
168
172
|
# @return [Integer]
|
169
173
|
def calc_length
|
170
174
|
self[:length].value = Base.calculate_and_set_length(self)
|
@@ -179,8 +183,8 @@ module PacketGen
|
|
179
183
|
# pkt.ospfv3.ospfize
|
180
184
|
# # second way
|
181
185
|
# pkt.ospfize
|
182
|
-
# @param [String,Symbol,nil] dst destination address. May be a
|
183
|
-
# address (by example
|
186
|
+
# @param [String,Symbol,nil] dst destination address. May be a coloned IP
|
187
|
+
# address (by example +1::1234:5+) or a Symbol (+:all_spf_routers+ or
|
184
188
|
# +:all_d_routers+)
|
185
189
|
# @return [void]
|
186
190
|
def ospfize(dst: nil)
|
@@ -11,7 +11,7 @@ require_relative 'padded32'
|
|
11
11
|
module PacketGen
|
12
12
|
module Header
|
13
13
|
class SCTP
|
14
|
-
#
|
14
|
+
# Base SCTP chunk class, defining SCTP chunk common fields.
|
15
15
|
# 0 1 2 3
|
16
16
|
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
17
17
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
@@ -61,13 +61,13 @@ module PacketGen
|
|
61
61
|
str << '>'
|
62
62
|
end
|
63
63
|
|
64
|
+
# Get human-readable type
|
64
65
|
# @return [::String,Integer]
|
65
66
|
def human_type
|
66
67
|
self[:type].to_human
|
67
68
|
end
|
68
69
|
|
69
|
-
# Calculate and set chunk length
|
70
|
-
# @todo do not count last parameter padding
|
70
|
+
# Calculate and set chunk {#length}
|
71
71
|
# @return [Integer]
|
72
72
|
def calc_length
|
73
73
|
self.length = to_s(no_padding: true).size
|
@@ -124,7 +124,7 @@ module PacketGen
|
|
124
124
|
define_attr :body, BinStruct::String, builder: ->(h, t) { t.new(length_from: -> { h.length - 4 }) }
|
125
125
|
end
|
126
126
|
|
127
|
-
# Data chunk
|
127
|
+
# Data chunk. This SCTP chunk embeds user data.
|
128
128
|
# 0 1 2 3
|
129
129
|
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
130
130
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
@@ -143,7 +143,7 @@ module PacketGen
|
|
143
143
|
# @author Sylvain Daubert
|
144
144
|
class DataChunk < BaseChunk
|
145
145
|
# @!attribute tsn
|
146
|
-
# 32-bit
|
146
|
+
# 32-bit Transmission Sequence Number for this DATA chunk
|
147
147
|
# @return [Integer]
|
148
148
|
define_attr :tsn, BinStruct::Int32
|
149
149
|
# @!attribute stream_id
|
@@ -159,7 +159,7 @@ module PacketGen
|
|
159
159
|
# @return [Integer]
|
160
160
|
define_attr :ppid, BinStruct::Int32
|
161
161
|
# @!attribute body
|
162
|
-
#
|
162
|
+
# User data
|
163
163
|
# @return [String]
|
164
164
|
define_attr :body, BinStruct::String, builder: ->(h, t) { t.new(length_from: -> { h.length - 4 }) }
|
165
165
|
|
@@ -168,13 +168,13 @@ module PacketGen
|
|
168
168
|
# IMMEDIATE flag
|
169
169
|
# @return [Integer]
|
170
170
|
# @!attribute flag_u
|
171
|
-
# UNORDERED flag
|
171
|
+
# UNORDERED flag. If set, no Stream Sequence Number is assigned to this chunk.
|
172
172
|
# @return [Integer]
|
173
173
|
# @!attribute flag_b
|
174
|
-
# BEGINNING fragment flag
|
174
|
+
# BEGINNING fragment flag. If set, indicate the first fragment of a user message.
|
175
175
|
# @return [Integer]
|
176
176
|
# @!attribute flag_e
|
177
|
-
# ENDING fragment flag
|
177
|
+
# ENDING fragment flag. If set, indicate the last fragment of a user message.
|
178
178
|
# @return [Integer]
|
179
179
|
define_bit_attr_after :type, :flags, flag_res: 4, flag_i: 1, flag_u: 1, flag_b: 1, flag_e: 1
|
180
180
|
|
@@ -190,7 +190,7 @@ module PacketGen
|
|
190
190
|
end
|
191
191
|
end
|
192
192
|
|
193
|
-
# Init Chunk
|
193
|
+
# Init Chunk. This chunk is used to initiate an SCTP association.
|
194
194
|
# 0 1 2 3
|
195
195
|
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
196
196
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
@@ -241,13 +241,14 @@ module PacketGen
|
|
241
241
|
end
|
242
242
|
|
243
243
|
# Calculate lengths, including parameters ones.
|
244
|
-
# @return [
|
244
|
+
# @return [Integer] chunk length
|
245
245
|
def calc_length
|
246
246
|
parameters.each(&:calc_length)
|
247
247
|
super
|
248
248
|
end
|
249
249
|
|
250
|
-
#
|
250
|
+
# Get human-redable description.
|
251
|
+
# @return [String]
|
251
252
|
def to_human
|
252
253
|
str = "<chunk:#{human_type}"
|
253
254
|
flags_str = flags_to_human
|
@@ -345,6 +346,17 @@ module PacketGen
|
|
345
346
|
end
|
346
347
|
end
|
347
348
|
|
349
|
+
# @!parse
|
350
|
+
# # Heartbeat Information.
|
351
|
+
# # @author LemonTree55
|
352
|
+
# # @since 4.1.0 Replace +HeartbeatInfoParameter+
|
353
|
+
# class HeartbeatInfo < BinStruct::AbstractTLV; end
|
354
|
+
HearbeatInfo = BinStruct::AbstractTLV.create(type_class: BinStruct::Int16Enum,
|
355
|
+
length_class: BinStruct::Int16,
|
356
|
+
attr_in_length: 'TLV')
|
357
|
+
HearbeatInfo.define_type_enum({ 'HearbeatInfo' => 1 }.freeze)
|
358
|
+
HearbeatInfo.define_type_default('HearbeatInfo')
|
359
|
+
|
348
360
|
# Heartbeat Request Chunk
|
349
361
|
# 0 1 2 3
|
350
362
|
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
@@ -356,11 +368,14 @@ module PacketGen
|
|
356
368
|
# \ \
|
357
369
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
358
370
|
# @author Sylvain Daubert
|
371
|
+
# @author LemonTree55
|
372
|
+
# @since 3.4.0
|
373
|
+
# @since 4.1.0 {#info} is now a {HeartbeatInfo}
|
359
374
|
class HeartbeatChunk < BaseChunk
|
360
375
|
# @!attribute info
|
361
|
-
#
|
362
|
-
# @return [
|
363
|
-
define_attr :info,
|
376
|
+
# Heartbeat information TLV.
|
377
|
+
# @return [HearbeatInfo]
|
378
|
+
define_attr :info, HearbeatInfo
|
364
379
|
|
365
380
|
def initialize(options={})
|
366
381
|
options[:type] = BaseChunk::TYPES['HEARTBEAT'] unless options.key?(:type)
|
@@ -379,6 +394,8 @@ module PacketGen
|
|
379
394
|
# \ \
|
380
395
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
381
396
|
# @author Sylvain Daubert
|
397
|
+
# @since 3.4.0
|
398
|
+
# @since 4.1.0 {#info} is now a {HeartbeatInfo}
|
382
399
|
class HeartbeatAckChunk < HeartbeatChunk
|
383
400
|
def initialize(options={})
|
384
401
|
options[:type] = BaseChunk::TYPES['HEARTBEAT_ACK'] unless options.key?(:type)
|
@@ -399,7 +416,8 @@ module PacketGen
|
|
399
416
|
# @author Sylvain Daubert
|
400
417
|
class ErrorChunk < BaseChunk
|
401
418
|
# @!attribute error_causes
|
402
|
-
#
|
419
|
+
# Causes for this error chunk
|
420
|
+
# @return [ArrayOfError]
|
403
421
|
define_attr :error_causes, ArrayOfError
|
404
422
|
|
405
423
|
def initialize(options={})
|
@@ -407,13 +425,14 @@ module PacketGen
|
|
407
425
|
super
|
408
426
|
end
|
409
427
|
|
410
|
-
# Calculate lengths, including
|
428
|
+
# Calculate lengths, including causes ones.
|
411
429
|
# @return [void]
|
412
430
|
def calc_length
|
413
431
|
error_causes.each(&:calc_length)
|
414
432
|
super
|
415
433
|
end
|
416
434
|
|
435
|
+
# Get human-readable description
|
417
436
|
# @return [::String]
|
418
437
|
def to_human
|
419
438
|
str = "<chunk:#{human_type}"
|
@@ -438,6 +457,7 @@ module PacketGen
|
|
438
457
|
class AbortChunk < ErrorChunk
|
439
458
|
remove_attr :flags
|
440
459
|
# @!attribute flag_t
|
460
|
+
# Reflecting bit
|
441
461
|
# @return [Integer]
|
442
462
|
define_bit_attr_after :type, :flags, flag_res: 7, flag_t: 1
|
443
463
|
|
@@ -502,6 +522,7 @@ module PacketGen
|
|
502
522
|
# @author Sylvain Daubert
|
503
523
|
class CookieEchoChunk < BaseChunk
|
504
524
|
# @!attribute cookie
|
525
|
+
# Cookie value
|
505
526
|
# @return [String]
|
506
527
|
define_attr :cookie, BinStruct::String
|
507
528
|
|