packetgen 3.3.3 → 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 +38 -22
- data/lib/packetgen/capture.rb +2 -2
- data/lib/packetgen/config.rb +0 -1
- data/lib/packetgen/deprecation.rb +14 -8
- data/lib/packetgen/header/arp.rb +17 -18
- data/lib/packetgen/header/asn1_base.rb +2 -1
- data/lib/packetgen/header/base.rb +42 -40
- data/lib/packetgen/header/bootp.rb +35 -37
- data/lib/packetgen/header/dhcp/option.rb +21 -21
- data/lib/packetgen/header/dhcp/options.rb +3 -3
- data/lib/packetgen/header/dhcp.rb +8 -9
- data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
- data/lib/packetgen/header/dhcpv6/option.rb +83 -61
- data/lib/packetgen/header/dhcpv6/options.rb +4 -4
- data/lib/packetgen/header/dhcpv6/relay.rb +6 -5
- data/lib/packetgen/header/dhcpv6.rb +17 -18
- data/lib/packetgen/header/dns/name.rb +21 -16
- data/lib/packetgen/header/dns/opt.rb +5 -2
- data/lib/packetgen/header/dns/option.rb +14 -14
- data/lib/packetgen/header/dns/qdsection.rb +3 -3
- data/lib/packetgen/header/dns/question.rb +7 -8
- data/lib/packetgen/header/dns/rr.rb +56 -43
- data/lib/packetgen/header/dns/rrsection.rb +6 -6
- data/lib/packetgen/header/dns.rb +103 -90
- data/lib/packetgen/header/dot11/control.rb +12 -12
- data/lib/packetgen/header/dot11/data.rb +25 -24
- data/lib/packetgen/header/dot11/element.rb +4 -4
- data/lib/packetgen/header/dot11/management.rb +21 -18
- data/lib/packetgen/header/dot11/sub_mngt.rb +40 -53
- data/lib/packetgen/header/dot11.rb +117 -122
- data/lib/packetgen/header/dot1q.rb +12 -13
- data/lib/packetgen/header/dot1x.rb +13 -13
- data/lib/packetgen/header/eap/fast.rb +4 -4
- data/lib/packetgen/header/eap/md5.rb +16 -8
- data/lib/packetgen/header/eap/tls.rb +18 -19
- data/lib/packetgen/header/eap/ttls.rb +22 -21
- data/lib/packetgen/header/eap.rb +73 -48
- data/lib/packetgen/header/eth.rb +41 -27
- data/lib/packetgen/header/gre.rb +33 -11
- data/lib/packetgen/header/http/headers.rb +7 -6
- data/lib/packetgen/header/http/request.rb +38 -29
- data/lib/packetgen/header/http/response.rb +35 -27
- data/lib/packetgen/header/http/verbs.rb +1 -3
- data/lib/packetgen/header/icmp.rb +14 -14
- data/lib/packetgen/header/icmpv6.rb +10 -9
- data/lib/packetgen/header/igmp.rb +26 -15
- data/lib/packetgen/header/igmpv3/group_record.rb +18 -13
- data/lib/packetgen/header/igmpv3/mq.rb +16 -18
- data/lib/packetgen/header/igmpv3/mr.rb +5 -5
- data/lib/packetgen/header/igmpv3.rb +12 -11
- data/lib/packetgen/header/ip/addr.rb +19 -15
- data/lib/packetgen/header/ip/option.rb +47 -36
- data/lib/packetgen/header/ip/options.rb +1 -1
- data/lib/packetgen/header/ip.rb +77 -95
- data/lib/packetgen/header/ipv6/addr.rb +28 -27
- data/lib/packetgen/header/ipv6/extension.rb +13 -11
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +32 -13
- data/lib/packetgen/header/ipv6.rb +42 -35
- data/lib/packetgen/header/llc.rb +28 -21
- data/lib/packetgen/header/mdns.rb +10 -3
- data/lib/packetgen/header/mld.rb +15 -13
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +17 -12
- data/lib/packetgen/header/mldv2/mlq.rb +22 -24
- data/lib/packetgen/header/mldv2/mlr.rb +8 -8
- data/lib/packetgen/header/mldv2.rb +1 -1
- data/lib/packetgen/header/ospfv2/db_description.rb +17 -18
- data/lib/packetgen/header/ospfv2/hello.rb +18 -17
- data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
- data/lib/packetgen/header/ospfv2/ls_request.rb +14 -13
- data/lib/packetgen/header/ospfv2/ls_update.rb +9 -9
- data/lib/packetgen/header/ospfv2/lsa.rb +79 -60
- data/lib/packetgen/header/ospfv2/lsa_header.rb +12 -11
- data/lib/packetgen/header/ospfv2.rb +49 -46
- data/lib/packetgen/header/ospfv3/db_description.rb +20 -22
- data/lib/packetgen/header/ospfv3/hello.rb +17 -16
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +22 -20
- data/lib/packetgen/header/ospfv3/ls_ack.rb +7 -8
- data/lib/packetgen/header/ospfv3/ls_request.rb +18 -18
- data/lib/packetgen/header/ospfv3/ls_update.rb +10 -10
- data/lib/packetgen/header/ospfv3/lsa.rb +62 -51
- data/lib/packetgen/header/ospfv3/lsa_header.rb +12 -11
- data/lib/packetgen/header/ospfv3.rb +54 -52
- data/lib/packetgen/header/sctp/chunk.rb +80 -56
- data/lib/packetgen/header/sctp/error.rb +174 -202
- data/lib/packetgen/header/sctp/padded32.rb +3 -3
- data/lib/packetgen/header/sctp/parameter.rb +89 -136
- data/lib/packetgen/header/sctp.rb +19 -8
- data/lib/packetgen/header/snmp.rb +108 -7
- data/lib/packetgen/header/tcp/option.rb +52 -39
- data/lib/packetgen/header/tcp/options.rb +13 -5
- data/lib/packetgen/header/tcp.rb +83 -65
- data/lib/packetgen/header/tftp.rb +31 -25
- data/lib/packetgen/header/udp.rb +21 -19
- data/lib/packetgen/header.rb +23 -18
- data/lib/packetgen/headerable.rb +21 -5
- data/lib/packetgen/inspect.rb +3 -8
- data/lib/packetgen/packet.rb +146 -71
- data/lib/packetgen/pcap.rb +15 -4
- data/lib/packetgen/pcapng/block.rb +20 -18
- data/lib/packetgen/pcapng/epb.rb +13 -15
- data/lib/packetgen/pcapng/file.rb +44 -111
- data/lib/packetgen/pcapng/idb.rb +11 -12
- data/lib/packetgen/pcapng/shb.rb +15 -16
- data/lib/packetgen/pcapng/spb.rb +9 -11
- data/lib/packetgen/pcapng/unknown_block.rb +6 -17
- data/lib/packetgen/pcapng.rb +6 -4
- data/lib/packetgen/pcaprub_wrapper.rb +17 -1
- data/lib/packetgen/proto.rb +5 -1
- data/lib/packetgen/unknown_packet.rb +5 -5
- data/lib/packetgen/utils/arp_spoofer.rb +18 -19
- data/lib/packetgen/utils.rb +4 -3
- data/lib/packetgen/version.rb +1 -1
- data/lib/packetgen.rb +12 -5
- 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
@@ -29,8 +29,8 @@ module PacketGen
|
|
29
29
|
# LSA headers are used as-is in {DbDescription} payload. But this class
|
30
30
|
# is also a base class for different LSA class, as {LSARouter}.
|
31
31
|
# @author Sylvain Daubert
|
32
|
-
class LSAHeader <
|
33
|
-
include
|
32
|
+
class LSAHeader < BinStruct::Struct
|
33
|
+
include BinStruct::Structable
|
34
34
|
|
35
35
|
# LSA Types
|
36
36
|
TYPES = {
|
@@ -44,38 +44,38 @@ module PacketGen
|
|
44
44
|
# @!attribute age
|
45
45
|
# The time in seconds since the LSA was originated.
|
46
46
|
# @return [Integer]
|
47
|
-
|
47
|
+
define_attr :age, BinStruct::Int16
|
48
48
|
# @!macro define_options
|
49
49
|
OSPFv2.define_options(self)
|
50
50
|
# @!attribute type
|
51
51
|
# The type of the LSA.
|
52
52
|
# @return [Integer]
|
53
|
-
|
53
|
+
define_attr :type, BinStruct::Int8Enum, enum: TYPES
|
54
54
|
# @!attribute link_state_id
|
55
55
|
# This field identifies the portion of the internet environment
|
56
56
|
# that is being described by the LSA.
|
57
57
|
# @return [String]
|
58
|
-
|
58
|
+
define_attr :link_state_id, IP::Addr
|
59
59
|
# @!attribute advertising_router
|
60
60
|
# The Router ID of the router that originated the LSA.
|
61
61
|
# @return [String]
|
62
|
-
|
62
|
+
define_attr :advertising_router, IP::Addr
|
63
63
|
# @!attribute sequence_number
|
64
64
|
# @return [Integer]
|
65
|
-
|
65
|
+
define_attr :sequence_number, BinStruct::Int32
|
66
66
|
alias seqnum sequence_number
|
67
67
|
alias seqnum= sequence_number=
|
68
68
|
# @!attribute checksum
|
69
69
|
# The Fletcher checksum of the complete contents of the LSA,
|
70
70
|
# including the LSA header but excluding the LS age field.
|
71
71
|
# @return [Integer]
|
72
|
-
|
72
|
+
define_attr :checksum, BinStruct::Int16
|
73
73
|
# @!attribute length
|
74
74
|
# Length of the LSA, including the header.
|
75
75
|
# @return [Integer]
|
76
|
-
|
76
|
+
define_attr :length, BinStruct::Int16
|
77
77
|
|
78
|
-
# Compute and set Fletcher-16 checksum on LSA
|
78
|
+
# Compute and set Fletcher-16 {#checksum} on LSA
|
79
79
|
# @return [Integer]
|
80
80
|
def calc_checksum
|
81
81
|
c0 = c1 = 0
|
@@ -93,7 +93,7 @@ module PacketGen
|
|
93
93
|
self.checksum = (x << 8) | y
|
94
94
|
end
|
95
95
|
|
96
|
-
# Compute length and set
|
96
|
+
# Compute length and set {#length} field
|
97
97
|
# @return [Integer]
|
98
98
|
def calc_length
|
99
99
|
self.length = Base.calculate_and_set_length(self)
|
@@ -105,6 +105,7 @@ module PacketGen
|
|
105
105
|
self[:type].to_human
|
106
106
|
end
|
107
107
|
|
108
|
+
# Get human-readable description
|
108
109
|
# @return [String]
|
109
110
|
def to_human
|
110
111
|
"LSA<#{human_type},#{link_state_id},#{advertising_router}>"
|
@@ -9,7 +9,7 @@
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
11
|
# This class supports OSPFv2 (RFC 2328).
|
12
|
-
#
|
12
|
+
# An OSPFv2 header has the following format:
|
13
13
|
#
|
14
14
|
# 0 1 2 3
|
15
15
|
# 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
|
@@ -28,37 +28,38 @@ module PacketGen
|
|
28
28
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
29
29
|
#
|
30
30
|
# An OSPFv2 header consists of:
|
31
|
-
# * a {#version} field (
|
32
|
-
# * a {#type} field (
|
33
|
-
# * a {#length} field (
|
34
|
-
# * a {#router_id} field (
|
35
|
-
# * an {#area_id} field (
|
36
|
-
# * a {#checksum} field (
|
37
|
-
# * an {#au_type} field (
|
38
|
-
# * an {#authentication} field (
|
39
|
-
# * and a {#body} (
|
31
|
+
# * a {#version} field (+BinStruct::Int8+),
|
32
|
+
# * a {#type} field (+BinStruct::Int8Enum+),
|
33
|
+
# * a {#length} field (+BinStruct::Int16+). The length includes the header,
|
34
|
+
# * a {#router_id} field (+BinStruct::Int32+),
|
35
|
+
# * an {#area_id} field (+BinStruct::Int32+),
|
36
|
+
# * a {#checksum} field (+BinStruct::Int16+),
|
37
|
+
# * an {#au_type} field (+BinStruct::Int16Enum+),
|
38
|
+
# * an {#authentication} field (+BinStruct::Int64+),
|
39
|
+
# * and a {#body} (+BinStruct::String+ or {Headerable}).
|
40
40
|
#
|
41
|
-
#
|
41
|
+
# @example Create an OSPFv2 header
|
42
42
|
# # standalone
|
43
43
|
# ospf = PacketGen::Header::OSPFv2.new
|
44
44
|
# # in a packet
|
45
|
-
# pkt = PacketGen.gen('IP'
|
45
|
+
# pkt = PacketGen.gen('IP').add('OSPFv2')
|
46
46
|
# # make IP header correct for OSPF
|
47
47
|
# pkt.ospfize
|
48
48
|
# # or make it correct with specific destination address
|
49
49
|
# pkt.ospfize(dst: :all_spf_routers)
|
50
50
|
# # access to OSPF header
|
51
|
-
# pkt.ospfv2 # => PacketGen::Header::OSPFv2
|
51
|
+
# pkt.ospfv2.class # => PacketGen::Header::OSPFv2
|
52
52
|
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
53
|
+
# @example OSPFv2 attributes
|
54
|
+
# ospf = PacketGen::Header::OSPFv2.new
|
55
|
+
# ospf.version # => 2
|
56
|
+
# ospf.type = 'LS_ACK' # or 5
|
57
|
+
# ospf.length = 154
|
58
|
+
# ospf.router_id = 0xc0a80001
|
59
|
+
# ospf.area_id = 1
|
60
|
+
# ospf.checksum = 0xabcd
|
61
|
+
# ospf.au_type = 'NO_AUTH' # or 0
|
62
|
+
# ospf.authentication = 0
|
62
63
|
#
|
63
64
|
# == OSPFv2 body
|
64
65
|
# OSPFv2 {#body} should contain OSPF payload for given {#type}:
|
@@ -94,38 +95,39 @@ module PacketGen
|
|
94
95
|
# @!attribute version
|
95
96
|
# 8-bit OSPF version
|
96
97
|
# @return [Integer]
|
97
|
-
|
98
|
+
define_attr :version, BinStruct::Int8, default: 2
|
98
99
|
# @!attribute type
|
99
100
|
# 8-bit OSPF packet type. Types are defined in {TYPES}.
|
100
101
|
# @return [Integer]
|
101
|
-
|
102
|
+
define_attr :type, BinStruct::Int8Enum, enum: TYPES
|
102
103
|
# @!attribute length
|
103
104
|
# 16-bit OSPF packet length
|
104
105
|
# @return [Integer]
|
105
|
-
|
106
|
+
define_attr :length, BinStruct::Int16
|
106
107
|
# @!attribute router_id
|
107
108
|
# 32-bit router ID
|
108
109
|
# @return [Integer]
|
109
|
-
|
110
|
+
define_attr :router_id, BinStruct::Int32
|
110
111
|
# @!attribute area_id
|
111
112
|
# 32-bit area ID
|
112
113
|
# @return [Integer]
|
113
|
-
|
114
|
+
define_attr :area_id, BinStruct::Int32
|
114
115
|
# @!attribute checksum
|
115
116
|
# 16-bit OSPF packet checksum
|
116
117
|
# @return [Integer]
|
117
|
-
|
118
|
+
define_attr :checksum, BinStruct::Int16
|
118
119
|
# @!attribute au_type
|
119
120
|
# 16-bit authentication type. Types are defined in {AU_TYPES}.
|
120
121
|
# @return [Integer]
|
121
|
-
|
122
|
+
define_attr :au_type, BinStruct::Int16Enum, enum: AU_TYPES
|
122
123
|
# @!attribute authentication
|
123
124
|
# 64-bit authentication data
|
124
125
|
# @return [Integer]
|
125
|
-
|
126
|
+
define_attr :authentication, BinStruct::Int64
|
126
127
|
# @!attribute body
|
127
|
-
#
|
128
|
-
|
128
|
+
# OSPF body
|
129
|
+
# @return [String,Headerable]
|
130
|
+
define_attr :body, BinStruct::String
|
129
131
|
|
130
132
|
# @api private
|
131
133
|
# Helper class method to define an OSPFv2 options field.
|
@@ -137,41 +139,42 @@ module PacketGen
|
|
137
139
|
# {#n_opt}, {#l_opt}, {#dc_opt}, {#o_opt} and {#dn_opt}.
|
138
140
|
# @return [Integer]
|
139
141
|
# @!attribute dn_opt
|
140
|
-
# @return [
|
142
|
+
# @return [Integer]
|
141
143
|
# @!attribute o_opt
|
142
|
-
# @return [
|
144
|
+
# @return [Integer]
|
143
145
|
# @!attribute dc_opt
|
144
146
|
# This bit describes the router's handling of demand circuits.
|
145
|
-
# @return [
|
147
|
+
# @return [Integer]
|
146
148
|
# @!attribute l_opt
|
147
149
|
# This specifies if a LLS Data block is present.
|
148
|
-
# @return [
|
150
|
+
# @return [Integer]
|
149
151
|
# @!attribute n_opt
|
150
152
|
# This bit specifies if NSSA is supported.
|
151
|
-
# @return [
|
153
|
+
# @return [Integer]
|
152
154
|
# @!attribute mc_opt
|
153
155
|
# This bit describes whether IP multicast datagrams are forwarded.
|
154
|
-
# @return [
|
156
|
+
# @return [Integer]
|
155
157
|
# @!attribute e_opt
|
156
158
|
# This bit describes the way AS-external-LSAs are flooded.
|
157
|
-
# @return [
|
159
|
+
# @return [Integer]
|
158
160
|
# @!attribute mt_opt
|
159
|
-
# @return [
|
161
|
+
# @return [Integer]
|
160
162
|
def self.define_options(hdr)
|
161
|
-
hdr.
|
162
|
-
hdr.define_bit_fields_on :options, :dn_opt, :o_opt, :dc_opt, :l_opt,
|
163
|
-
:n_opt, :mc_opt, :e_opt, :mt_opt
|
163
|
+
hdr.define_bit_attr :options, dn_opt: 1, o_opt: 1, dc_opt: 1, l_opt: 1, n_opt: 1, mc_opt: 1, e_opt: 1, mt_opt: 1
|
164
164
|
end
|
165
165
|
|
166
166
|
# @api private
|
167
167
|
# @note This method is used internally by PacketGen and should not be
|
168
168
|
# directly called
|
169
|
+
# @param [Packet] packet
|
170
|
+
# @return [void]
|
171
|
+
# Add +#ospfize+ method to +packet+. This method calls {#ospfize}.
|
169
172
|
def added_to_packet(packet)
|
170
173
|
ospf_idx = packet.headers.size
|
171
174
|
packet.instance_eval "def ospfize(**kwargs) @headers[#{ospf_idx}].ospfize(**kwargs); end" # def ospfize(**kwargs) @headers[2].ospfize(**kwargs); end
|
172
175
|
end
|
173
176
|
|
174
|
-
# Compute checksum and set
|
177
|
+
# Compute checksum and set {#checksum} attribute
|
175
178
|
# @return [Integer]
|
176
179
|
def calc_checksum
|
177
180
|
# #authentication field is not used in checksum calculation,
|
@@ -200,7 +203,7 @@ module PacketGen
|
|
200
203
|
self[:au_type].to_human
|
201
204
|
end
|
202
205
|
|
203
|
-
# Compute length and set
|
206
|
+
# Compute length and set {#length} attribute
|
204
207
|
# @return [Integer]
|
205
208
|
def calc_length
|
206
209
|
self[:length].value = Base.calculate_and_set_length(self)
|
@@ -215,7 +218,7 @@ module PacketGen
|
|
215
218
|
# pkt.ospfv2.ospfize
|
216
219
|
# # second way
|
217
220
|
# pkt.ospfize
|
218
|
-
# @param [String,
|
221
|
+
# @param [String,Symbolnil] dst destination address. May be a dotted IP
|
219
222
|
# address (by example '224.0.0.5') or a Symbol (+:all_spf_routers+ or
|
220
223
|
# +:all_d_routers+)
|
221
224
|
# @return [void]
|
@@ -33,25 +33,26 @@ module PacketGen
|
|
33
33
|
# | ... |
|
34
34
|
#
|
35
35
|
# A DB description payload is composed of:
|
36
|
-
# * a 8-bit {#reserved} field (
|
37
|
-
# * a 24-bit {#options} field (
|
38
|
-
# * a 16-bit {#mtu} field (
|
39
|
-
# * a 16-bit {#flags} field (
|
36
|
+
# * a 8-bit {#reserved} field (+BinStruct::Int8+),
|
37
|
+
# * a 24-bit {#options} field (+BinStruct::Int24+),
|
38
|
+
# * a 16-bit {#mtu} field (+BinStruct::Int16+),
|
39
|
+
# * a 16-bit {#flags} field (+BinStruct::Int16+). Supported flags are:
|
40
40
|
# * {i_flag},
|
41
41
|
# * {m_flag},
|
42
42
|
# * {ms_flag},
|
43
|
-
# * a 32-bit {#sequence_number} field (
|
43
|
+
# * a 32-bit {#sequence_number} field (+BinStruct::Int32+),
|
44
44
|
# * and an array of {LSAHeader LSAHeaders} ({#lsas}, {ArrayOfLSA}).
|
45
45
|
#
|
46
|
-
#
|
46
|
+
# @example Create a DbDescription payload
|
47
47
|
# # standalone
|
48
48
|
# dbd = PacketGen::Header::OSPFv3::DbDescription.new
|
49
49
|
# # in a packet
|
50
|
-
# pkt = PacketGen.gen('IPv6'
|
50
|
+
# pkt = PacketGen.gen('IPv6').add('OSPFv3').add('OSPFv3::DbDescription')
|
51
51
|
# # access to DbDescription payload
|
52
|
-
# pkt.ospfv3_dbdescription # => PacketGen::Header::OSPFv3::DbDescription
|
52
|
+
# pkt.ospfv3_dbdescription.class # => PacketGen::Header::OSPFv3::DbDescription
|
53
53
|
#
|
54
|
-
#
|
54
|
+
# @example DbDescription attributes
|
55
|
+
# dbd = PacketGen::Header::OSPFv3::DbDescription.new
|
55
56
|
# dbd.reserved = 0
|
56
57
|
# # set options. Options may also be set one by one with #v6_opt, #e_opt,
|
57
58
|
# # #n_opt, #r_opt and #dc_opt
|
@@ -61,49 +62,46 @@ module PacketGen
|
|
61
62
|
# dbd.seqnum = 0x800001
|
62
63
|
# # add a LSA Router header
|
63
64
|
# dbd.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 }
|
64
|
-
# # a header may also be set from an existing lsa
|
65
|
-
# dbd.lsas << existing_lsa.to_lsa_header
|
66
65
|
# @author Sylvain Daubert
|
67
66
|
class DbDescription < Base
|
68
67
|
# @!attribute reserved
|
69
68
|
# 8-bit zero field before {#options} one
|
70
69
|
# @return [Integer]
|
71
|
-
|
70
|
+
define_attr :reserved, BinStruct::Int8, default: 0
|
72
71
|
|
73
|
-
# @!macro
|
72
|
+
# @!macro define_ospfv3_options
|
74
73
|
OSPFv3.define_options(self)
|
75
74
|
|
76
75
|
# @!attribute mtu
|
77
76
|
# 16-bit interface MTU
|
78
77
|
# @return [Integer]
|
79
|
-
|
78
|
+
define_attr :mtu, BinStruct::Int16
|
80
79
|
# @!attribute flags
|
81
80
|
# 16-bit interface flags ({#i_flag}, {#m_flag} and {#ms_flag})
|
82
81
|
# @return [Integer]
|
83
|
-
define_field :flags, Types::Int16
|
84
82
|
# @!attribute i_flag
|
85
83
|
# Init bit from {#flags} field
|
86
|
-
# @return [
|
84
|
+
# @return [Integer]
|
87
85
|
# @!attribute m_flag
|
88
86
|
# More bit from {#flags} field
|
89
|
-
# @return [
|
87
|
+
# @return [Integer]
|
90
88
|
# @!attribute ms_flag
|
91
89
|
# Master/Slave bit from {#flags} field
|
92
|
-
# @return [
|
93
|
-
|
90
|
+
# @return [Integer]
|
91
|
+
define_bit_attr :flags, zz: 13, i_flag: 1, m_flag: 1, ms_flag: 1
|
94
92
|
|
95
93
|
# @!attribute sequence_number
|
96
94
|
# 32-bit DD sequence number, used to sequence the collection of Database
|
97
95
|
# Description Packets.
|
98
96
|
# @return [Integer]
|
99
|
-
|
97
|
+
define_attr :sequence_number, BinStruct::Int32
|
100
98
|
alias seqnum sequence_number
|
101
99
|
alias seqnum= sequence_number=
|
102
100
|
|
103
101
|
# @!attribute lsas
|
104
102
|
# Array of LSA headers
|
105
|
-
# @return [
|
106
|
-
|
103
|
+
# @return [ArrayOfLSA]
|
104
|
+
define_attr :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
|
107
105
|
end
|
108
106
|
end
|
109
107
|
|
@@ -28,26 +28,27 @@ module PacketGen
|
|
28
28
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
29
29
|
# | ... |
|
30
30
|
# A HELLO payload consists of:
|
31
|
-
# * a {#interface_id} field (
|
32
|
-
# * a {#priority} field (
|
33
|
-
# * an {#options} field (
|
34
|
-
# * a {#hello_interval} field (
|
35
|
-
# * a {#dead_interval} field (
|
31
|
+
# * a {#interface_id} field (+BinStruct::Int32+),
|
32
|
+
# * a {#priority} field (+BinStruct::Int8+),
|
33
|
+
# * an {#options} field (+BinStruct::Int24+),
|
34
|
+
# * a {#hello_interval} field (+BinStruct::Int16+),
|
35
|
+
# * a {#dead_interval} field (+BinStruct::Int16+),
|
36
36
|
# * a {#designated_router} field ({IP::Addr}),
|
37
37
|
# * a {#backup_designated_router} field ({IP::Addr}),
|
38
38
|
# * a {#neighbors} array containing neighbors as {IP::Addr}.
|
39
39
|
#
|
40
|
-
#
|
40
|
+
# @example Create a HELLO payload
|
41
41
|
# # standalone
|
42
42
|
# hello = PacketGen::Header::OSPFv3::Hello.new
|
43
43
|
# # in a packet
|
44
|
-
# pkt = PacketGen.gen('IPv6'
|
44
|
+
# pkt = PacketGen.gen('IPv6').add('OSPFv3').add('OSPFv3::Hello')
|
45
45
|
# # make IPv6 header correct for OSPF
|
46
46
|
# pkt.ospfize
|
47
47
|
# # access to Hello payload
|
48
|
-
# pkt.ospfv3_hello # => PacketGen::Header::OSPFv3::Hello
|
48
|
+
# pkt.ospfv3_hello.class # => PacketGen::Header::OSPFv3::Hello
|
49
49
|
#
|
50
|
-
#
|
50
|
+
# @example HELLO attributes
|
51
|
+
# hello = PacketGen::Header::OSPFv3::Hello.new
|
51
52
|
# hello.interface_id = 1
|
52
53
|
# hello.priority = 1
|
53
54
|
# # set options. Options may also be set one by one with #v6_opt, #e_opt,
|
@@ -65,36 +66,36 @@ module PacketGen
|
|
65
66
|
# @!attribute interface_id
|
66
67
|
# The network mask associated with this interface.
|
67
68
|
# @return [String]
|
68
|
-
|
69
|
+
define_attr :interface_id, BinStruct::Int32
|
69
70
|
# @!attribute priority
|
70
71
|
# This router's Router Priority. Used in (Backup) Designated
|
71
72
|
# Router election.
|
72
73
|
# @return [Integer]
|
73
|
-
|
74
|
+
define_attr :priority, BinStruct::Int8
|
74
75
|
# @!macro define_ospfv3_options
|
75
76
|
OSPFv3.define_options(self)
|
76
77
|
# @!attribute hello_interval
|
77
78
|
# The number of seconds between this router's Hello packets.
|
78
79
|
# @return [Integer]
|
79
|
-
|
80
|
+
define_attr :hello_interval, BinStruct::Int16
|
80
81
|
# @!attribute dead_interval
|
81
82
|
# The number of seconds before declaring a silent router down.
|
82
83
|
# @return [Integer]
|
83
|
-
|
84
|
+
define_attr :dead_interval, BinStruct::Int16
|
84
85
|
# @!attribute designated_router
|
85
86
|
# The identity of the Designated Router for this network, in the
|
86
87
|
# view of the sending router.
|
87
88
|
# @return [String]
|
88
|
-
|
89
|
+
define_attr :designated_router, IP::Addr
|
89
90
|
# @!attribute backup_designated_router
|
90
91
|
# The identity of the Backup Designated Router for this network,
|
91
92
|
# in the view of the sending router.
|
92
93
|
# @return [String]
|
93
|
-
|
94
|
+
define_attr :backup_designated_router, IP::Addr
|
94
95
|
# @!attribute neighbors
|
95
96
|
# Array of neighbors
|
96
97
|
# @return [IP::ArrayOfAddr]
|
97
|
-
|
98
|
+
define_attr :neighbors, IP::ArrayOfAddr
|
98
99
|
end
|
99
100
|
end
|
100
101
|
|
@@ -17,44 +17,42 @@ module PacketGen
|
|
17
17
|
# * and an array of 32-bit words to encode prefix itself ({#prefix}). This
|
18
18
|
# array consumes ((PrefixLength + 31) / 32) 32-bit words.
|
19
19
|
# @author Sylvain Daubert
|
20
|
-
class IPv6Prefix <
|
21
|
-
include
|
20
|
+
class IPv6Prefix < BinStruct::Struct
|
21
|
+
include BinStruct::Structable
|
22
22
|
|
23
23
|
# @!attribute length
|
24
24
|
# Prefix length, in bits
|
25
25
|
# @return [Integer]
|
26
|
-
|
26
|
+
define_attr :length, BinStruct::Int8
|
27
27
|
# @!attribute options
|
28
28
|
# Prefix capabilities. See also capability bits: {#dn_opt}, {#p_opt},
|
29
29
|
# {#la_opt} and {#nu_opt}.
|
30
30
|
# @return [Options]
|
31
|
-
define_field :options, Types::Int8
|
32
|
-
# @!attribute reserved
|
33
|
-
# Reserved field in most of LSA types.
|
34
|
-
# @return [Integer]
|
35
|
-
define_field :reserved, Types::Int16
|
36
|
-
# @!attribute prefix
|
37
|
-
# IPv6 Prefix as an array of 32-bit words
|
38
|
-
# @return [Prefix]
|
39
|
-
define_field :prefix, Types::ArrayOfInt32, builder: ->(h, t) { t.new(length_from: -> { h.length / 8 }) }
|
40
|
-
|
41
31
|
# @!attribute dn_opt
|
42
32
|
# This bit controls an inter-area-prefix-LSAs or AS-external-LSAs
|
43
33
|
# re-advertisement in a VPN environment.
|
44
|
-
# @return [
|
34
|
+
# @return [Integer]
|
45
35
|
# @!attribute p_opt
|
46
36
|
# The "propagate" bit. Set on NSSA area prefixes that should be
|
47
37
|
# readvertised by the translating NSSA area border.
|
48
|
-
# @return [
|
38
|
+
# @return [Integer]
|
49
39
|
# @!attribute la_opt
|
50
40
|
# The "local address" capability bit. If set, the prefix is
|
51
41
|
# actually an IPv6 interface address of the Advertising Router.
|
52
|
-
# @return [
|
42
|
+
# @return [Integer]
|
53
43
|
# @!attribute nu_opt
|
54
44
|
# The "no unicast" capability bit. If set, the prefix should be
|
55
45
|
# excluded from IPv6 unicast calculations.
|
56
|
-
# @return [
|
57
|
-
|
46
|
+
# @return [Integer]
|
47
|
+
define_bit_attr :options, zz: 3, dn_opt: 1, p_opt: 1, z: 1, la_opt: 1, nu_opt: 1
|
48
|
+
# @!attribute reserved
|
49
|
+
# Reserved field in most of LSA types.
|
50
|
+
# @return [Integer]
|
51
|
+
define_attr :reserved, BinStruct::Int16
|
52
|
+
# @!attribute prefix
|
53
|
+
# IPv6 Prefix as an array of 32-bit words
|
54
|
+
# @return [BinStruct::ArrayOfInt32]
|
55
|
+
define_attr :prefix, BinStruct::ArrayOfInt32, builder: ->(h, t) { t.new(length_from: -> { h.length / 8 }) }
|
58
56
|
|
59
57
|
# Get human-readable prefix
|
60
58
|
# @return [String]
|
@@ -70,7 +68,10 @@ module PacketGen
|
|
70
68
|
# Set prefix from a human-readable string. This method cannot set
|
71
69
|
# {#options} field.
|
72
70
|
# @param [String] str
|
73
|
-
# @return [
|
71
|
+
# @return [self]
|
72
|
+
# @example
|
73
|
+
# prefix = PacketGen::Header::OSPFv3::IPv6Prefix.new.from_human("2000::/64")
|
74
|
+
# prefix.to_human #=> "2000::/64"
|
74
75
|
def from_human(str)
|
75
76
|
ary, len = ary_and_prefix_len_from_str(str)
|
76
77
|
|
@@ -83,6 +84,7 @@ module PacketGen
|
|
83
84
|
end
|
84
85
|
end
|
85
86
|
self.length = len
|
87
|
+
self
|
86
88
|
end
|
87
89
|
|
88
90
|
private
|
@@ -100,7 +102,7 @@ module PacketGen
|
|
100
102
|
|
101
103
|
# Array of {IPv6Prefix}
|
102
104
|
# @author Sylvain Daubert
|
103
|
-
class ArrayOfIPv6Prefix <
|
105
|
+
class ArrayOfIPv6Prefix < BinStruct::Array
|
104
106
|
set_of IPv6Prefix
|
105
107
|
end
|
106
108
|
end
|
@@ -23,25 +23,24 @@ 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
|
41
40
|
# Array of {LSA LSAs}
|
42
41
|
# @return [ArrayOfLSA]
|
43
|
-
|
44
|
-
|
42
|
+
define_attr :lsas, ArrayOfLSA,
|
43
|
+
builder: ->(_h, t) { t.new(only_headers: true) }
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
@@ -22,31 +22,31 @@ 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
|
-
class LSR <
|
31
|
-
include
|
30
|
+
class LSR < BinStruct::Struct
|
31
|
+
include BinStruct::Structable
|
32
32
|
|
33
33
|
# @!attribute reserved
|
34
34
|
# reserved field.
|
35
35
|
# @return [Integer]
|
36
|
-
|
36
|
+
define_attr :reserved, BinStruct::Int16, default: 0
|
37
37
|
# @!attribute type
|
38
38
|
# The type of the LSA to request.
|
39
39
|
# @return [Integer]
|
40
|
-
|
40
|
+
define_attr :type, BinStruct::Int16Enum, enum: LSAHeader::TYPES
|
41
41
|
# @!attribute link_state_id
|
42
42
|
# This field identifies the portion of the internet environment
|
43
43
|
# that is being described by the LSA to request.
|
44
44
|
# @return [String]
|
45
|
-
|
45
|
+
define_attr :link_state_id, IP::Addr
|
46
46
|
# @!attribute advertising_router
|
47
47
|
# The Router ID of the requested LSA.
|
48
48
|
# @return [String]
|
49
|
-
|
49
|
+
define_attr :advertising_router, IP::Addr
|
50
50
|
|
51
51
|
# Get human-readable type
|
52
52
|
# @return [String]
|
@@ -60,10 +60,9 @@ 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
|
-
class ArrayOfLSR <
|
65
|
+
class ArrayOfLSR < BinStruct::Array
|
67
66
|
set_of LSR
|
68
67
|
end
|
69
68
|
|
@@ -83,24 +82,25 @@ 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
|
100
100
|
# @!attribute lsrs
|
101
101
|
# Array of {LSR}
|
102
102
|
# @return [ArrayOfLSR]
|
103
|
-
|
103
|
+
define_attr :lsrs, ArrayOfLSR
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|