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
@@ -31,24 +31,26 @@ module PacketGen
|
|
31
31
|
# | ... |
|
32
32
|
#
|
33
33
|
# A DB description payload is composed of:
|
34
|
-
# * a 16-bit {#mtu} field (
|
35
|
-
# * a 8-bit {#options} field (
|
36
|
-
# * a 8-bit {#flags} field (
|
34
|
+
# * a 16-bit {#mtu} field (+BinStruct::Int16+),
|
35
|
+
# * a 8-bit {#options} field (+BinStruct::Int8+),
|
36
|
+
# * a 8-bit {#flags} field (+BinStruct::Int8+). Supported flags are:
|
37
37
|
# * {i_flag},
|
38
38
|
# * {m_flag},
|
39
39
|
# * {ms_flag},
|
40
|
-
# * a 32-bit {#sequence_number} field (
|
40
|
+
# * a 32-bit {#sequence_number} field (+BinStruct::Int32+),
|
41
41
|
# * and an array of {LSAHeader LSAHeaders} ({#lsas}, {ArrayOfLSA}).
|
42
42
|
#
|
43
|
-
#
|
43
|
+
# @example Create a DbDescription payload
|
44
44
|
# # standalone
|
45
45
|
# dbd = PacketGen::Header::OSPFv2::DbDescription.new
|
46
46
|
# # in a packet
|
47
|
-
# pkt = PacketGen.gen('IP'
|
47
|
+
# pkt = PacketGen.gen('IP').add('OSPFv2').add('OSPFv2::DbDescription')
|
48
|
+
# pkt.ospfize
|
48
49
|
# # access to DbDescription payload
|
49
|
-
# pkt.ospfv2_dbdescription # => PacketGen::Header::OSPFv2::DbDescription
|
50
|
+
# pkt.ospfv2_dbdescription.class # => PacketGen::Header::OSPFv2::DbDescription
|
50
51
|
#
|
51
|
-
#
|
52
|
+
# @example DbDescription attributes
|
53
|
+
# dbd = PacketGen::Header::OSPFv2::DbDescription.new
|
52
54
|
# dbd.mtu = 1500
|
53
55
|
# # set options. Options may also be set one by one with {#mt_opt},
|
54
56
|
# # {#e_opt}, {#mc_opt}, {#n_opt}, {#l_opt}, {#dc_opt}, {#o_opt} and {#dn_opt}
|
@@ -57,14 +59,12 @@ module PacketGen
|
|
57
59
|
# dbd.seqnum = 0x800001
|
58
60
|
# # add a LSA Router header
|
59
61
|
# 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 }
|
60
|
-
# # a header may also be set from an existing lsa
|
61
|
-
# dbd.lsas << existing_lsa.to_lsa_header
|
62
62
|
# @author Sylvain Daubert
|
63
63
|
class DbDescription < Base
|
64
64
|
# @!attribute mtu
|
65
65
|
# 16-bit interface MTU
|
66
66
|
# @return [Integer]
|
67
|
-
|
67
|
+
define_attr :mtu, BinStruct::Int16
|
68
68
|
|
69
69
|
# @!macro define_options
|
70
70
|
OSPFv2.define_options(self)
|
@@ -72,30 +72,29 @@ module PacketGen
|
|
72
72
|
# @!attribute flags
|
73
73
|
# 8-bit interface flags ({#i_flag}, {#m_flag} and {#ms_flag})
|
74
74
|
# @return [Integer]
|
75
|
-
define_field :flags, Types::Int8
|
76
75
|
# @!attribute i_flag
|
77
76
|
# Init bit
|
78
|
-
# @return [
|
77
|
+
# @return [Integer]
|
79
78
|
# @!attribute m_flag
|
80
79
|
# More bit
|
81
|
-
# @return [
|
80
|
+
# @return [Integer]
|
82
81
|
# @!attribute ms_flag
|
83
82
|
# Master/Slave bit
|
84
|
-
# @return [
|
85
|
-
|
83
|
+
# @return [Integer]
|
84
|
+
define_bit_attr :flags, zero: 5, i_flag: 1, m_flag: 1, ms_flag: 1
|
86
85
|
|
87
86
|
# @!attribute sequence_number
|
88
87
|
# 32-bit DD sequence number, used to sequence the collection of Database
|
89
88
|
# Description Packets.
|
90
89
|
# @return [Integer]
|
91
|
-
|
90
|
+
define_attr :sequence_number, BinStruct::Int32
|
92
91
|
alias seqnum sequence_number
|
93
92
|
alias seqnum= sequence_number=
|
94
93
|
|
95
94
|
# @!attribute lsas
|
96
95
|
# Array of LSA headers
|
97
96
|
# @return [ArrayOfLSAHeader]
|
98
|
-
|
97
|
+
define_attr :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
|
99
98
|
end
|
100
99
|
end
|
101
100
|
|
@@ -29,25 +29,26 @@ module PacketGen
|
|
29
29
|
# | ... |
|
30
30
|
# A HELLO payload consists of:
|
31
31
|
# * a {#network_mask} field ({IP::Addr}),
|
32
|
-
# * a {#hello_interval} field (
|
33
|
-
# * an {#options} field (
|
34
|
-
# * a {#priority} field (
|
35
|
-
# * a {#dead_interval} field (
|
32
|
+
# * a {#hello_interval} field (+BinStruct::Int16+),
|
33
|
+
# * an {#options} field (+BinStruct::Int8+),
|
34
|
+
# * a {#priority} field (+BinStruct::Int8+),
|
35
|
+
# * a {#dead_interval} field (+BinStruct::Int32+),
|
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::OSPFv2::Hello.new
|
43
43
|
# # in a packet
|
44
|
-
# pkt = PacketGen.gen('IP'
|
44
|
+
# pkt = PacketGen.gen('IP').add('OSPFv2').add('OSPFv2::Hello')
|
45
45
|
# # make IP header correct for OSPF
|
46
46
|
# pkt.ospfize
|
47
47
|
# # access to Hello payload
|
48
|
-
# pkt.ospfv2_hello # => PacketGen::Header::OSPFv2::Hello
|
48
|
+
# pkt.ospfv2_hello.class # => PacketGen::Header::OSPFv2::Hello
|
49
49
|
#
|
50
|
-
#
|
50
|
+
# @example HELLO attributes
|
51
|
+
# hello = PacketGen::Header::OSPFv2::Hello.new
|
51
52
|
# hello.network_mask = '255.255.255.0'
|
52
53
|
# hello.hello_interval = 10
|
53
54
|
# hello.options = 0
|
@@ -63,11 +64,11 @@ module PacketGen
|
|
63
64
|
# @!attribute network_mask
|
64
65
|
# The network mask associated with this interface.
|
65
66
|
# @return [String]
|
66
|
-
|
67
|
+
define_attr :network_mask, IP::Addr
|
67
68
|
# @!attribute hello_interval
|
68
69
|
# The number of seconds between this router's Hello packets.
|
69
70
|
# @return [Integer]
|
70
|
-
|
71
|
+
define_attr :hello_interval, BinStruct::Int16
|
71
72
|
|
72
73
|
# @!macro define_options
|
73
74
|
OSPFv2.define_options(self)
|
@@ -76,25 +77,25 @@ module PacketGen
|
|
76
77
|
# This router's Router Priority. Used in (Backup) Designated
|
77
78
|
# Router election.
|
78
79
|
# @return [Integer]
|
79
|
-
|
80
|
+
define_attr :priority, BinStruct::Int8
|
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::Int32
|
84
85
|
# @!attribute designated_router
|
85
|
-
# The identity of the Designated Router for this network, in the
|
86
|
+
# The identity (as an IP address) 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
|
-
# The identity of the Backup Designated Router for this network,
|
91
|
+
# The identity (as an IP address) 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
|
|
@@ -28,24 +28,23 @@ module PacketGen
|
|
28
28
|
# This paylod is implemented as a unique field: {#lsas}, which is an
|
29
29
|
# {ArrayOfLSA} object.
|
30
30
|
#
|
31
|
-
#
|
31
|
+
# @example Create a LSAck payload
|
32
32
|
# # standalone
|
33
33
|
# lsack = PacketGen::Header::OSPFv2::LSAck.new
|
34
34
|
# # in a packet
|
35
|
-
# pkt = PacketGen.gen('IP'
|
35
|
+
# pkt = PacketGen.gen('IP').add('OSPFv2').add('OSPFv2::LSAck')
|
36
36
|
# # access to LSAck payload
|
37
|
-
# lasck = pkt.ospfv2_lsack
|
37
|
+
# lasck = pkt.ospfv2_lsack.class # => PacketGen::Header::OSPFv2::LSAck
|
38
38
|
#
|
39
|
-
#
|
39
|
+
# @example Adding LSA headers to a LSAck payload
|
40
|
+
# lsack = PacketGen::Header::OSPFv2::LSAck.new
|
40
41
|
# 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 }
|
41
|
-
# # a header may also be set from an existing lsa
|
42
|
-
# lasck.lsas << existing_lsa.to_lsa_header
|
43
42
|
# @author Sylvain Daubert
|
44
43
|
class LSAck < Base
|
45
44
|
# @!attribute lsas
|
46
45
|
# Array of LSA headers
|
47
46
|
# @return [ArrayOfLSA]
|
48
|
-
|
47
|
+
define_attr :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
@@ -9,27 +9,27 @@
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
11
|
class OSPFv2
|
12
|
-
# This class handle a LS request, which is composed 3
|
12
|
+
# This class handle a LS request, which is composed 3 +BinStruct::Int32+ fields:
|
13
13
|
# * {#type},
|
14
14
|
# * {#link_state_id},
|
15
15
|
# * and {#advertising_router}.
|
16
16
|
# @author Sylvain Daubert
|
17
|
-
class LSR <
|
18
|
-
include
|
17
|
+
class LSR < BinStruct::Struct
|
18
|
+
include BinStruct::Structable
|
19
19
|
|
20
20
|
# @!attribute type
|
21
21
|
# The type of the LSA to request.
|
22
22
|
# @return [Integer]
|
23
|
-
|
23
|
+
define_attr :type, BinStruct::Int32Enum, enum: LSAHeader::TYPES
|
24
24
|
# @!attribute link_state_id
|
25
25
|
# This field identifies the portion of the internet environment
|
26
26
|
# that is being described by the LSA to request.
|
27
27
|
# @return [String]
|
28
|
-
|
28
|
+
define_attr :link_state_id, IP::Addr
|
29
29
|
# @!attribute advertising_router
|
30
30
|
# The Router ID of the requested LSA.
|
31
31
|
# @return [String]
|
32
|
-
|
32
|
+
define_attr :advertising_router, IP::Addr
|
33
33
|
|
34
34
|
# Get human-readable type
|
35
35
|
# @return [String]
|
@@ -43,10 +43,10 @@ module PacketGen
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
# This class defines a specialized
|
46
|
+
# This class defines a specialized +BinStruct::Array+ to handle series
|
47
47
|
# of {LSR LSRs}.
|
48
48
|
# @author Sylvain Daubert
|
49
|
-
class ArrayOfLSR <
|
49
|
+
class ArrayOfLSR < BinStruct::Array
|
50
50
|
set_of LSR
|
51
51
|
end
|
52
52
|
|
@@ -65,24 +65,25 @@ module PacketGen
|
|
65
65
|
# This paylod is implemented as a unique field: {#lsrs}, which is an
|
66
66
|
# {ArrayOfLSR} object.
|
67
67
|
#
|
68
|
-
#
|
68
|
+
# @example Create a LSRequest payload
|
69
69
|
# # standalone
|
70
70
|
# lsr = PacketGen::Header::OSPFv2::LSRequest.new
|
71
71
|
# # in a packet
|
72
|
-
# pkt = PacketGen.gen('IP'
|
72
|
+
# pkt = PacketGen.gen('IP').add('OSPFv2').add('OSPFv2::LSRequest')
|
73
73
|
# # make IP header correct for OSPF
|
74
74
|
# pkt.ospfize
|
75
75
|
# # access to LSRequest payload
|
76
|
-
# pkt.ospfv2_lsrequest # => PacketGen::Header::OSPFv2::LSRequest
|
76
|
+
# pkt.ospfv2_lsrequest.class # => PacketGen::Header::OSPFv2::LSRequest
|
77
77
|
#
|
78
|
-
#
|
78
|
+
# @example Add LSA requests to a LSRequest
|
79
|
+
# lsr = PacketGen::Header::OSPFv2::LSRequest.new
|
79
80
|
# lsr.lsrs << { type: 'Router', link_state_id: '0.0.0.1', advertising_router: '1.1.1.1'}
|
80
81
|
# @author Sylvain Daubert
|
81
82
|
class LSRequest < Base
|
82
83
|
# @!attribute lsrs
|
83
84
|
# Array of {LSR}
|
84
85
|
# @return [ArrayOfLSR]
|
85
|
-
|
86
|
+
define_attr :lsrs, ArrayOfLSR
|
86
87
|
end
|
87
88
|
end
|
88
89
|
|
@@ -22,22 +22,22 @@ module PacketGen
|
|
22
22
|
# +- +-+
|
23
23
|
# | ... |
|
24
24
|
# This paylod is implemented with two fields:
|
25
|
-
# * {#lsas_count}, a
|
25
|
+
# * {#lsas_count}, a +BinStruct::Int32+ field,
|
26
26
|
# * and {#lsas}, an {ArrayOfLSA} object.
|
27
27
|
#
|
28
|
-
#
|
28
|
+
# @example Create a LSUpdate payload
|
29
29
|
# # standalone
|
30
30
|
# lsu = PacketGen::Header::OSPFv2::LSUpdate.new
|
31
31
|
# # in a packet
|
32
|
-
# pkt = PacketGen.gen('IP'
|
32
|
+
# pkt = PacketGen.gen('IP').add('OSPFv2').add('OSPFv2::LSUpdate')
|
33
33
|
# # make IP header correct for OSPF
|
34
34
|
# pkt.ospfize
|
35
35
|
# # access to LSUpdate payload
|
36
|
-
# lsu = pkt.ospfv2_lsupdate # => PacketGen::Header::OSPFv2::LSUpdate
|
36
|
+
# lsu = pkt.ospfv2_lsupdate.class # => PacketGen::Header::OSPFv2::LSUpdate
|
37
37
|
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
38
|
+
# @example Add LSAs to a LSUpdate payload
|
39
|
+
# lsu = PacketGen::Header::OSPFv2::LSUpdate.new
|
40
|
+
# # Adding LSAs with #<< automagically update #lsas_count. To not update it, use #push.
|
41
41
|
# lsu.lsas << { type: 'Router', age: 40, link_state_id: '0.0.0.1', advertising_router: '1.1.1.1', sequence_number: 42 }
|
42
42
|
# lsu.lsas_count #=> 1
|
43
43
|
# # add a link to Router LSA
|
@@ -47,11 +47,11 @@ module PacketGen
|
|
47
47
|
# @!attribute lsas_count
|
48
48
|
# Count of LSAs included in this update
|
49
49
|
# @return [Integer]
|
50
|
-
|
50
|
+
define_attr :lsas_count, BinStruct::Int32
|
51
51
|
# @!attribute lsas
|
52
52
|
# Array of {LSA LSAs}
|
53
53
|
# @return [ArrayOfLSA]
|
54
|
-
|
54
|
+
define_attr :lsas, ArrayOfLSA, builder: ->(h, t) { t.new(counter: h[:lsas_count]) }
|
55
55
|
|
56
56
|
# Calculate checksums of all LSAs
|
57
57
|
# @return [void]
|
@@ -16,28 +16,28 @@ module PacketGen
|
|
16
16
|
# @!attribute body
|
17
17
|
# LSA body
|
18
18
|
# @return [String]
|
19
|
-
|
20
|
-
|
19
|
+
define_attr :body, BinStruct::String,
|
20
|
+
builder: ->(h, t) { t.new(length_from: -> { h.length - 20 }) }
|
21
21
|
end
|
22
22
|
|
23
23
|
# This class handles TOS metrics for {Link links} in a {LSARouter
|
24
24
|
# LSA router payload}.
|
25
25
|
# @author Sylvain Daubert
|
26
|
-
class TosMetric <
|
27
|
-
include
|
26
|
+
class TosMetric < BinStruct::Struct
|
27
|
+
include BinStruct::Structable
|
28
28
|
|
29
29
|
# @!attribute tos
|
30
30
|
# 8-bit IP Type of Service that this metric refers to.
|
31
31
|
# @return [Integer]
|
32
|
-
|
32
|
+
define_attr :tos, BinStruct::Int8
|
33
33
|
# @!attribute reserved
|
34
34
|
# 8-bit reserved field.
|
35
35
|
# @return [Integer]
|
36
|
-
|
36
|
+
define_attr :reserved, BinStruct::Int8, default: 0
|
37
37
|
# @!attribute tos_metric
|
38
38
|
# 16-bit TOS-specific metric information..
|
39
39
|
# @return [Integer]
|
40
|
-
|
40
|
+
define_attr :tos_metric, BinStruct::Int16
|
41
41
|
|
42
42
|
# @return [String]
|
43
43
|
def to_human
|
@@ -45,48 +45,58 @@ module PacketGen
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
# This class defines a specialized
|
48
|
+
# This class defines a specialized +BinStruct::Array+ to handle series
|
49
49
|
# of {TosMetric TOS metrics}.
|
50
50
|
# @author Sylvain Daubert
|
51
|
-
class ArrayOfTosMetric <
|
51
|
+
class ArrayOfTosMetric < BinStruct::Array
|
52
52
|
set_of TosMetric
|
53
53
|
end
|
54
54
|
|
55
55
|
# This class handles links in a {LSARouter LSA router payload}.
|
56
56
|
# @author Sylvain Daubert
|
57
|
-
class Link <
|
58
|
-
include
|
57
|
+
class Link < BinStruct::Struct
|
58
|
+
include BinStruct::Structable
|
59
59
|
|
60
60
|
# @!attribute id
|
61
|
+
# Identify the link
|
61
62
|
# @return [IP::Addr]
|
62
|
-
|
63
|
+
define_attr :id, IP::Addr
|
63
64
|
# @!attribute data
|
65
|
+
# Link data
|
64
66
|
# @return [IP::Addr]
|
65
|
-
|
67
|
+
define_attr :data, IP::Addr
|
66
68
|
# @!attribute type
|
69
|
+
# Link type.
|
70
|
+
# * 1: Point-to-point connection to another router
|
71
|
+
# * 2: Connection to a transit network
|
72
|
+
# * 3: Connection to a stub network
|
73
|
+
# * 4: Virtual link
|
67
74
|
# @return [Integer]
|
68
|
-
|
75
|
+
define_attr :type, BinStruct::Int8
|
69
76
|
# @!attribute tos_count
|
77
|
+
# Count of #{#tos TOS metrics}
|
70
78
|
# @return [Integer]
|
71
|
-
|
79
|
+
define_attr :tos_count, BinStruct::Int8
|
72
80
|
# @!attribute metric
|
81
|
+
# The cost of using this router link
|
73
82
|
# @return [Integer]
|
74
|
-
|
83
|
+
define_attr :metric, BinStruct::Int16
|
75
84
|
# @!attribute tos
|
76
85
|
# Additionnal TOS metrics
|
77
86
|
# @return [ArrayOfTosMetric]
|
78
|
-
|
87
|
+
define_attr :tos, ArrayOfTosMetric, builder: ->(h, t) { t.new(counter: h[:tos_count]) }
|
79
88
|
|
89
|
+
# Get human-readable description
|
80
90
|
# @return [String]
|
81
91
|
def to_human
|
82
92
|
"<type:#{type},metric:#{metric},id:#{id},data:#{data}>"
|
83
93
|
end
|
84
94
|
end
|
85
95
|
|
86
|
-
# This class defines a specialized
|
96
|
+
# This class defines a specialized +BinStruct::Array+ to handle series
|
87
97
|
# of {Link Links}.
|
88
98
|
# @author Sylvain Daubert
|
89
|
-
class ArrayOfLink <
|
99
|
+
class ArrayOfLink < BinStruct::Array
|
90
100
|
set_of Link
|
91
101
|
end
|
92
102
|
|
@@ -94,30 +104,32 @@ module PacketGen
|
|
94
104
|
#
|
95
105
|
# A LSA router payload is composed of:
|
96
106
|
# * a header (see methods inherited from {LSAHeader}),
|
97
|
-
# * a 16-bit flag word {#u16} (
|
98
|
-
# * a 16-bit {#link_count} field (
|
107
|
+
# * a 16-bit flag word {#u16} (+BinStruct::Int16+),
|
108
|
+
# * a 16-bit {#link_count} field (+BinStruct::Int16+),
|
99
109
|
# * an array of {#links} ({ArrayOfLink}).
|
100
110
|
# @author Sylvain Daubert
|
101
111
|
class LSARouter < LSAHeader
|
102
112
|
# @attribute u16
|
103
113
|
# 16-bit flag word
|
104
114
|
# @return [Integer]
|
105
|
-
|
115
|
+
# @attribute v_flag
|
116
|
+
# Virtual link point flag
|
117
|
+
# @return [Integer]
|
118
|
+
# @attribute e_flag*
|
119
|
+
# AS boundary flag
|
120
|
+
# @return [Integer]
|
121
|
+
# @attribute b_flag
|
122
|
+
# Area border router flag
|
123
|
+
# @return [Integer]
|
124
|
+
define_bit_attr :u16, z: 5, v_flag: 1, e_flag: 1, b_flag: 1, zz: 8
|
106
125
|
# @attribute link_count
|
107
126
|
# Number of links
|
108
127
|
# @return [Integer]
|
109
|
-
|
128
|
+
define_attr :link_count, BinStruct::Int16
|
110
129
|
# @attribute links
|
130
|
+
# Router links
|
111
131
|
# @return [ArrayOfLink]
|
112
|
-
|
113
|
-
|
114
|
-
# @attribute v_flag
|
115
|
-
# @return [Boolean]
|
116
|
-
# @attribute e_flag
|
117
|
-
# @return [Boolean]
|
118
|
-
# @attribute b_flag
|
119
|
-
# @return [Boolean]
|
120
|
-
define_bit_fields_on :u16, :z, 5, :v_flag, :e_flag, :b_flag, :zz, 8
|
132
|
+
define_attr :links, ArrayOfLink, builder: ->(h, t) { t.new(counter: h[:link_count]) }
|
121
133
|
end
|
122
134
|
|
123
135
|
# This class handles LSA Network payloads.
|
@@ -130,48 +142,55 @@ module PacketGen
|
|
130
142
|
class LSANetwork < LSAHeader
|
131
143
|
# @!attribute netmask
|
132
144
|
# @return [IP::Addr]
|
133
|
-
|
145
|
+
define_attr :netmask, IP::Addr
|
134
146
|
# @!attribute routers
|
135
147
|
# List of routers in network
|
136
148
|
# @return [IP::ArrayOfAddr]
|
137
|
-
|
138
|
-
|
149
|
+
define_attr :routers, IP::ArrayOfAddr,
|
150
|
+
builder: ->(h, t) { t.new(length_from: -> { h.length - 24 }) }
|
139
151
|
end
|
140
152
|
|
141
153
|
# This class handles external links in {LSAASExternal LSA AS-External payloads}.
|
142
154
|
# @author Sylvain Daubert
|
143
|
-
|
144
|
-
|
155
|
+
# @author LemonTree55
|
156
|
+
class External < BinStruct::Struct
|
157
|
+
include BinStruct::Structable
|
145
158
|
|
146
159
|
# @!attribute u8
|
160
|
+
# 1st byte containing {#e_flag} and #{tos}
|
147
161
|
# @return [Integer]
|
148
|
-
|
162
|
+
# @!attribute e_flag
|
163
|
+
# 1-bit type of external metric.
|
164
|
+
# If set, {#metric} is Type 2 external metric, else it is Type1.
|
165
|
+
# @return [Integer]
|
166
|
+
# @!attribute tos
|
167
|
+
# 7-bit TOS
|
168
|
+
# @return [Integer]
|
169
|
+
define_bit_attr :u8, e_flag: 1, tos: 7
|
149
170
|
# @!attribute metric
|
171
|
+
# Cost of this route
|
150
172
|
# @return [Integer]
|
151
|
-
|
173
|
+
define_attr :metric, BinStruct::Int24
|
152
174
|
# @!attribute forwarding_addr
|
175
|
+
# Forwarding address
|
153
176
|
# @return [IP::Addr]
|
154
|
-
|
177
|
+
define_attr :forwarding_addr, IP::Addr
|
155
178
|
# @!attribute ext_route_tag
|
179
|
+
# 32-bit external route tag. Not used by OSPF protocol.
|
156
180
|
# @return [Integer]
|
157
|
-
|
158
|
-
|
159
|
-
# @!attribute e_flag
|
160
|
-
# @return [Boolean]
|
161
|
-
# @!attribute tos
|
162
|
-
# @return [Integer]
|
163
|
-
define_bit_fields_on :u8, :e_flag, :tos, 7
|
181
|
+
define_attr :ext_route_tag, BinStruct::Int32
|
164
182
|
|
183
|
+
# Get human-readable string
|
165
184
|
# @return [String]
|
166
185
|
def to_human
|
167
186
|
"<type:#{e_flag? ? 2 : 1},tos:#{tos},metric:#{metric},fwaddr:#{forwarding_addr},tag:#{ext_route_tag}>"
|
168
187
|
end
|
169
188
|
end
|
170
189
|
|
171
|
-
# This class defines a specialized
|
190
|
+
# This class defines a specialized +BinStruct::Array+ to handle series
|
172
191
|
# of {External Externals}.
|
173
192
|
# @author Sylvain Daubert
|
174
|
-
class ArrayOfExternal <
|
193
|
+
class ArrayOfExternal < BinStruct::Array
|
175
194
|
set_of External
|
176
195
|
end
|
177
196
|
|
@@ -185,33 +204,33 @@ module PacketGen
|
|
185
204
|
class LSAASExternal < LSAHeader
|
186
205
|
# @!attribute netmask
|
187
206
|
# @return [IP::Addr]
|
188
|
-
|
207
|
+
define_attr :netmask, IP::Addr
|
189
208
|
# @!attribute externals
|
190
209
|
# List of external destinations
|
191
210
|
# @return [ArrayOfExternal]
|
192
|
-
|
193
|
-
|
211
|
+
define_attr :externals, ArrayOfExternal,
|
212
|
+
builder: ->(h, t) { t.new(length_from: -> { h.length - 24 }) }
|
194
213
|
end
|
195
214
|
|
196
|
-
# This class defines a specialized
|
215
|
+
# This class defines a specialized +BinStruct::Array+ to handle series
|
197
216
|
# of {LSA LSAs}. It recognizes known LSA types and infers correct type.
|
198
217
|
# @author Sylvain Daubert
|
199
|
-
class ArrayOfLSA <
|
218
|
+
class ArrayOfLSA < BinStruct::Array
|
200
219
|
set_of LSAHeader
|
201
220
|
|
202
221
|
# @param [Hash] options
|
203
|
-
# @option options [
|
204
|
-
# @option options [Boolean] only_headers if +true+, only {LSAHeader LSAHeaders}
|
222
|
+
# @option options [BinStruct::Int] :counter +BinStruct::Int+ object used as a counter for this set
|
223
|
+
# @option options [Boolean] :only_headers if +true+, only {LSAHeader LSAHeaders}
|
205
224
|
# will be added to this array.
|
206
225
|
def initialize(options={})
|
207
|
-
super
|
226
|
+
super
|
208
227
|
@only_headers = options[:only_headers] || false
|
209
228
|
end
|
210
229
|
|
211
230
|
private
|
212
231
|
|
213
232
|
def record_from_hash(hsh)
|
214
|
-
raise ArgumentError, 'hash should have :type key' unless hsh.key?
|
233
|
+
raise ArgumentError, 'hash should have :type key' unless hsh.key?(:type)
|
215
234
|
|
216
235
|
klass = if @only_headers
|
217
236
|
LSAHeader
|
@@ -231,8 +250,8 @@ module PacketGen
|
|
231
250
|
def get_lsa_class_by_human_type(htype)
|
232
251
|
klassname = "LSA#{htype.to_s.delete('-')}"
|
233
252
|
begin
|
234
|
-
if OSPFv2.const_defined?
|
235
|
-
OSPFv2.const_get
|
253
|
+
if OSPFv2.const_defined?(klassname)
|
254
|
+
OSPFv2.const_get(klassname)
|
236
255
|
else
|
237
256
|
LSA
|
238
257
|
end
|