packetgen 2.4.0 → 2.5.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.
Files changed (127) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +13 -4
  3. data/lib/packetgen.rb +3 -1
  4. data/lib/packetgen/capture.rb +2 -0
  5. data/lib/packetgen/config.rb +1 -0
  6. data/lib/packetgen/header.rb +5 -0
  7. data/lib/packetgen/header/arp.rb +2 -0
  8. data/lib/packetgen/header/asn1_base.rb +2 -0
  9. data/lib/packetgen/header/base.rb +16 -0
  10. data/lib/packetgen/header/bootp.rb +2 -0
  11. data/lib/packetgen/header/crypto.rb +2 -0
  12. data/lib/packetgen/header/dhcp.rb +2 -0
  13. data/lib/packetgen/header/dhcp/option.rb +3 -0
  14. data/lib/packetgen/header/dhcp/options.rb +2 -0
  15. data/lib/packetgen/header/dhcpv6.rb +109 -0
  16. data/lib/packetgen/header/dhcpv6/duid.rb +147 -0
  17. data/lib/packetgen/header/dhcpv6/option.rb +391 -0
  18. data/lib/packetgen/header/dhcpv6/options.rb +29 -0
  19. data/lib/packetgen/header/dhcpv6/relay.rb +48 -0
  20. data/lib/packetgen/header/dns.rb +10 -2
  21. data/lib/packetgen/header/dns/name.rb +7 -0
  22. data/lib/packetgen/header/dns/opt.rb +6 -0
  23. data/lib/packetgen/header/dns/option.rb +7 -0
  24. data/lib/packetgen/header/dns/qdsection.rb +7 -1
  25. data/lib/packetgen/header/dns/question.rb +7 -0
  26. data/lib/packetgen/header/dns/rr.rb +7 -0
  27. data/lib/packetgen/header/dns/rrsection.rb +7 -0
  28. data/lib/packetgen/header/dot11.rb +4 -2
  29. data/lib/packetgen/header/dot11/control.rb +2 -0
  30. data/lib/packetgen/header/dot11/data.rb +2 -0
  31. data/lib/packetgen/header/dot11/element.rb +2 -0
  32. data/lib/packetgen/header/dot11/management.rb +2 -0
  33. data/lib/packetgen/header/dot11/sub_mngt.rb +2 -0
  34. data/lib/packetgen/header/dot1q.rb +2 -0
  35. data/lib/packetgen/header/dot1x.rb +3 -1
  36. data/lib/packetgen/header/eap.rb +3 -1
  37. data/lib/packetgen/header/eap/fast.rb +2 -0
  38. data/lib/packetgen/header/eap/md5.rb +2 -0
  39. data/lib/packetgen/header/eap/tls.rb +2 -0
  40. data/lib/packetgen/header/eap/ttls.rb +2 -0
  41. data/lib/packetgen/header/esp.rb +7 -0
  42. data/lib/packetgen/header/eth.rb +2 -0
  43. data/lib/packetgen/header/gre.rb +4 -9
  44. data/lib/packetgen/header/http/headers.rb +2 -0
  45. data/lib/packetgen/header/http/request.rb +3 -1
  46. data/lib/packetgen/header/http/response.rb +3 -1
  47. data/lib/packetgen/header/icmp.rb +4 -11
  48. data/lib/packetgen/header/icmpv6.rb +4 -11
  49. data/lib/packetgen/header/igmp.rb +4 -11
  50. data/lib/packetgen/header/igmpv3.rb +4 -11
  51. data/lib/packetgen/header/igmpv3/group_record.rb +2 -0
  52. data/lib/packetgen/header/igmpv3/mq.rb +2 -0
  53. data/lib/packetgen/header/igmpv3/mr.rb +2 -0
  54. data/lib/packetgen/header/ike.rb +13 -6
  55. data/lib/packetgen/header/ike/auth.rb +2 -0
  56. data/lib/packetgen/header/ike/cert.rb +2 -0
  57. data/lib/packetgen/header/ike/certreq.rb +2 -0
  58. data/lib/packetgen/header/ike/id.rb +2 -0
  59. data/lib/packetgen/header/ike/ke.rb +2 -0
  60. data/lib/packetgen/header/ike/nonce.rb +2 -0
  61. data/lib/packetgen/header/ike/notify.rb +7 -0
  62. data/lib/packetgen/header/ike/payload.rb +9 -0
  63. data/lib/packetgen/header/ike/sa.rb +11 -4
  64. data/lib/packetgen/header/ike/sk.rb +7 -0
  65. data/lib/packetgen/header/ike/ts.rb +2 -0
  66. data/lib/packetgen/header/ike/vendor_id.rb +2 -0
  67. data/lib/packetgen/header/ip.rb +48 -11
  68. data/lib/packetgen/header/ip/addr.rb +8 -0
  69. data/lib/packetgen/header/ip/option.rb +2 -0
  70. data/lib/packetgen/header/ip/options.rb +2 -0
  71. data/lib/packetgen/header/ipv6.rb +5 -3
  72. data/lib/packetgen/header/ipv6/addr.rb +8 -0
  73. data/lib/packetgen/header/ipv6/extension.rb +2 -0
  74. data/lib/packetgen/header/ipv6/hop_by_hop.rb +2 -0
  75. data/lib/packetgen/header/llc.rb +2 -0
  76. data/lib/packetgen/header/mld.rb +2 -0
  77. data/lib/packetgen/header/mldv2.rb +4 -2
  78. data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -1
  79. data/lib/packetgen/header/mldv2/mlq.rb +2 -0
  80. data/lib/packetgen/header/mldv2/mlr.rb +4 -2
  81. data/lib/packetgen/header/ospfv2.rb +249 -0
  82. data/lib/packetgen/header/ospfv2/db_description.rb +105 -0
  83. data/lib/packetgen/header/ospfv2/hello.rb +104 -0
  84. data/lib/packetgen/header/ospfv2/ls_ack.rb +55 -0
  85. data/lib/packetgen/header/ospfv2/ls_request.rb +90 -0
  86. data/lib/packetgen/header/ospfv2/ls_update.rb +72 -0
  87. data/lib/packetgen/header/ospfv2/lsa.rb +252 -0
  88. data/lib/packetgen/header/ospfv2/lsa_header.rb +122 -0
  89. data/lib/packetgen/header/ospfv3.rb +216 -0
  90. data/lib/packetgen/header/ospfv3/db_description.rb +114 -0
  91. data/lib/packetgen/header/ospfv3/hello.rb +104 -0
  92. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +103 -0
  93. data/lib/packetgen/header/ospfv3/ls_ack.rb +51 -0
  94. data/lib/packetgen/header/ospfv3/ls_request.rb +108 -0
  95. data/lib/packetgen/header/ospfv3/ls_update.rb +74 -0
  96. data/lib/packetgen/header/ospfv3/lsa.rb +252 -0
  97. data/lib/packetgen/header/ospfv3/lsa_header.rb +123 -0
  98. data/lib/packetgen/header/snmp.rb +2 -0
  99. data/lib/packetgen/header/tcp.rb +14 -14
  100. data/lib/packetgen/header/tcp/option.rb +7 -1
  101. data/lib/packetgen/header/tcp/options.rb +7 -0
  102. data/lib/packetgen/header/tftp.rb +2 -0
  103. data/lib/packetgen/header/udp.rb +6 -14
  104. data/lib/packetgen/inspect.rb +5 -1
  105. data/lib/packetgen/packet.rb +3 -1
  106. data/lib/packetgen/pcapng.rb +2 -0
  107. data/lib/packetgen/pcapng/block.rb +2 -0
  108. data/lib/packetgen/pcapng/epb.rb +2 -0
  109. data/lib/packetgen/pcapng/file.rb +2 -0
  110. data/lib/packetgen/pcapng/idb.rb +2 -0
  111. data/lib/packetgen/pcapng/shb.rb +2 -0
  112. data/lib/packetgen/pcapng/spb.rb +2 -0
  113. data/lib/packetgen/pcapng/unknown_block.rb +2 -0
  114. data/lib/packetgen/proto.rb +2 -0
  115. data/lib/packetgen/types/array.rb +3 -0
  116. data/lib/packetgen/types/cstring.rb +3 -1
  117. data/lib/packetgen/types/enum.rb +2 -0
  118. data/lib/packetgen/types/fields.rb +8 -4
  119. data/lib/packetgen/types/int.rb +3 -1
  120. data/lib/packetgen/types/int_string.rb +2 -0
  121. data/lib/packetgen/types/oui.rb +2 -0
  122. data/lib/packetgen/types/string.rb +3 -0
  123. data/lib/packetgen/types/tlv.rb +8 -0
  124. data/lib/packetgen/utils.rb +6 -4
  125. data/lib/packetgen/utils/arp_spoofer.rb +2 -0
  126. data/lib/packetgen/version.rb +3 -1
  127. metadata +25 -3
@@ -3,6 +3,8 @@
3
3
  # See https://github.com/sdaubert/packetgen for more informations
4
4
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
5
5
  # This program is published under MIT license.
6
+
7
+ # frozen_string_literal: true
6
8
  require 'ipaddr'
7
9
 
8
10
  module PacketGen
@@ -75,6 +77,12 @@ module PacketGen
75
77
  def to_a
76
78
  @fields.values
77
79
  end
80
+
81
+ # Return true if this address is a multicast one
82
+ # @return [Boolean]
83
+ def mcast?
84
+ self.a1 & 0xff00 == 0xff00
85
+ end
78
86
  end
79
87
 
80
88
  # Class to handle series of IPv6 addresses
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
  class IPv6
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
  class IPv6
@@ -4,6 +4,8 @@
4
4
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
5
5
  # This program is published under MIT license.
6
6
 
7
+ # frozen_string_literal: true
8
+
7
9
  module PacketGen
8
10
  module Header
9
11
 
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
 
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
  # This module contains all MLDv2 specific classes.
@@ -11,7 +13,7 @@ module PacketGen
11
13
  # Encode value for MLDv2 Max Resp Code.
12
14
  # Value may be encoded as a float, so some error may occur.
13
15
  # See RFC 3810 §5.1.3
14
- # @param [Integer] value3
16
+ # @param [Integer] value value to encode
15
17
  # @return [Integer]
16
18
  def self.encode(value)
17
19
  if value < 32768
@@ -31,7 +33,7 @@ module PacketGen
31
33
 
32
34
  # Decode value for MLDv2 Max Resp Code.
33
35
  # See RFC 3810 §5.1.3
34
- # @param [Integer] value
36
+ # @param [Integer] value value to decode
35
37
  # @return [Integer]
36
38
  def self.decode(value)
37
39
  if value < 32768
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
  module MLDv2
@@ -90,7 +92,7 @@ module PacketGen
90
92
  end
91
93
  end
92
94
 
93
- # Class to handle series of {MAR}.
95
+ # Class to handle series of {McastAddressRecord}.
94
96
  # @author Sylvain Daubert
95
97
  class McastAddressRecords < Types::Array
96
98
  set_of McastAddressRecord
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
  module MLDv2
@@ -2,6 +2,8 @@
2
2
  # See https://github.com/sdaubert/packetgen for more informations
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
5
7
  require_relative 'mcast_address_record'
6
8
 
7
9
  module PacketGen
@@ -39,7 +41,7 @@ module PacketGen
39
41
  # MLR fields are:
40
42
  # * {#reserved} ({Types::Int16}),
41
43
  # * {#number_of_mar} (number of mcast address records, {Types::Int16}),
42
- # * {#records} ({McastAddrRecords}).
44
+ # * {#records} ({McastAddressRecords}).
43
45
  # @author Sylvain Daubert
44
46
  class MLR < Base
45
47
  # @!attribute reserved
@@ -47,7 +49,7 @@ module PacketGen
47
49
  # @return [Integer]
48
50
  define_field :reserved, Types::Int16, default: 0
49
51
  # @!attribute number_of_mar
50
- # 16-bit Number of group records in {#group_records}
52
+ # 16-bit Number of group records in {#records}
51
53
  # @return [Integer]
52
54
  define_field :number_of_mar, Types::Int16, default: 0
53
55
 
@@ -0,0 +1,249 @@
1
+ # This file is part of PacketGen
2
+ # See https://github.com/sdaubert/packetgen for more informations
3
+ # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ module PacketGen
9
+ module Header
10
+
11
+ # This class supports OSPFv2 (RFC 2328).
12
+ # A OSPFv2 header has the following format:
13
+ #
14
+ # 0 1 2 3
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
16
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
17
+ # | Version # | Type | Packet length |
18
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
19
+ # | Router ID |
20
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
21
+ # | Area ID |
22
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
23
+ # | Checksum | AuType |
24
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
25
+ # | Authentication |
26
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
27
+ # | Authentication |
28
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
29
+ #
30
+ # An OSPFv2 header consists of:
31
+ # * a {#version} field ({Types::Int8}),
32
+ # * a {#type} field ({Types::Int8Enum}),
33
+ # * a {#length} field ({Types::Int16}). The length includes the header,
34
+ # * a {#router_id} field ({Types::Int32}),
35
+ # * an {#area_id} field ({Types::Int32}),
36
+ # * a {#checksum} field ({Types::Int16}),
37
+ # * an {#au_type} field ({Types::Int16Enum}),
38
+ # * an {#authentication} field ({Types::Int64}),
39
+ # * and a {#body} ({Types::String}).
40
+ #
41
+ # == Create an OSPFv2 header
42
+ # # standalone
43
+ # ospf = PacketGen::Header::OSPFv2.new
44
+ # # in a packet
45
+ # pkt = PacketGen.gen('IP', src: source_ip).add('OSPFv2')
46
+ # # make IP header correct for OSPF
47
+ # pkt.ospfize
48
+ # # or make it correct with specific destination address
49
+ # pkt.ospfize(dst: :all_spf_routers)
50
+ # # access to OSPF header
51
+ # pkt.ospfv2 # => PacketGen::Header::OSPFv2
52
+ #
53
+ # == OSPFv2 attributes
54
+ # ospf.version # => 2
55
+ # ospf.type = 'LS_ACK' # or 5
56
+ # ospf.length = 154
57
+ # ospf.router_id = 0xc0a80001
58
+ # ospf.area_id = 1
59
+ # ospf.checksum = 0xabcd
60
+ # ospf.au_type = 'NO_AUTH' # or 0
61
+ # ospf.authentication = 0
62
+ #
63
+ # == OSPFv2 body
64
+ # OSPFv2 {#body} should contain OSPF payload for given {#type}:
65
+ # * {OSPFv2::Hello},
66
+ # * {OSPFv2::DbDescription},
67
+ # * {OSPFv2::LSRequest},
68
+ # * {OSPFv2::LSUpdate},
69
+ # * or {OSPFv2::LSAck}.
70
+ #
71
+ # @author Sylvain Daubert
72
+ class OSPFv2 < Base
73
+
74
+ # IP protocol number for OSPF
75
+ IP_PROTOCOL = 89
76
+
77
+ # OSPF packet types
78
+ TYPES = {
79
+ 'HELLO' => 1,
80
+ 'DB_DESCRIPTION' => 2,
81
+ 'LS_REQUEST' => 3,
82
+ 'LS_UPDATE' => 4,
83
+ 'LS_ACK' => 5
84
+ }
85
+
86
+ # Authentication types
87
+ AU_TYPES = {
88
+ 'NO_AUTH' => 0,
89
+ 'PASSWORD' => 1,
90
+ 'CRYPTO' => 2,
91
+ 'CRYPTO_WITH_ESN' => 3
92
+ }
93
+
94
+ # @!attribute version
95
+ # 8-bit OSPF version
96
+ # @return [Integer]
97
+ define_field :version, Types::Int8, default: 2
98
+ # @!attribute type
99
+ # 8-bit OSPF packet type. Types are defined in {TYPES}.
100
+ # @return [Integer]
101
+ define_field :type, Types::Int8Enum, enum: TYPES
102
+ # @!attribute length
103
+ # 16-bit OSPF packet length
104
+ # @return [Integer]
105
+ define_field :length, Types::Int16
106
+ # @!attribute router_id
107
+ # 32-bit router ID
108
+ # @return [Integer]
109
+ define_field :router_id, Types::Int32
110
+ # @!attribute area_id
111
+ # 32-bit area ID
112
+ # @return [Integer]
113
+ define_field :area_id, Types::Int32
114
+ # @!attribute checksum
115
+ # 16-bit OSPF packet checksum
116
+ # @return [Integer]
117
+ define_field :checksum, Types::Int16
118
+ # @!attribute au_type
119
+ # 16-bit authentication type. Types are defined in {AU_TYPES}.
120
+ # @return [Integer]
121
+ define_field :au_type, Types::Int16Enum, enum: AU_TYPES
122
+ # @!attribute authentication
123
+ # 64-bit authentication data
124
+ # @return [Integer]
125
+ define_field :authentication, Types::Int64
126
+ # @!attribute body
127
+ # @return [String,Base]
128
+ define_field :body, Types::String
129
+
130
+ # @api private
131
+ # Helper class method to define an OSPFv2 options field.
132
+ # @param [Base] hdr header on which define a OSPFv2 options field
133
+ # @return [void]
134
+ # @!macro [attach] define_options
135
+ # @!attribute options
136
+ # 8-bit options field. Handle {#mt_opt}, {#e_opt}, {#mc_opt},
137
+ # {#n_opt}, {#l_opt}, {#dc_opt}, {#o_opt} and {#dn_opt}.
138
+ # @return [Integer]
139
+ # @!attribute dn_opt
140
+ # @return [Boolean]
141
+ # @!attribute o_opt
142
+ # @return [Boolean]
143
+ # @!attribute dc_opt
144
+ # This bit describes the router's handling of demand circuits.
145
+ # @return [Boolean]
146
+ # @!attribute l_opt
147
+ # This specifies if a LLS Data block is present.
148
+ # @return [Boolean]
149
+ # @!attribute n_opt
150
+ # This bit specifies if NSSA is supported.
151
+ # @return [Boolean]
152
+ # @!attribute mc_opt
153
+ # This bit describes whether IP multicast datagrams are forwarded.
154
+ # @return [Boolean]
155
+ # @!attribute e_opt
156
+ # This bit describes the way AS-external-LSAs are flooded.
157
+ # @return [Boolean]
158
+ # @!attribute mt_opt
159
+ # @return [Boolean]
160
+ def self.define_options(hdr)
161
+ hdr.define_field :options, Types::Int8
162
+ hdr.define_bit_fields_on :options, :dn_opt, :o_opt, :dc_opt, :l_opt,
163
+ :n_opt, :mc_opt, :e_opt, :mt_opt
164
+ end
165
+
166
+ # @api private
167
+ # @note This method is used internally by PacketGen and should not be
168
+ # directly called
169
+ def added_to_packet(packet)
170
+ ospf_idx = packet.headers.size
171
+ packet.instance_eval "def ospfize(**kwargs) @headers[#{ospf_idx}].ospfize(**kwargs); end"
172
+ end
173
+
174
+ # Compute checksum and set +checksum+ field
175
+ # @return [Integer]
176
+ def calc_checksum
177
+ # #authentication field is not used in checksum calculation,
178
+ # so force it to 0 before checksumming
179
+ saved_auth = self.authentication
180
+ self.authentication = 0
181
+
182
+ sum = IP.sum16(self)
183
+ self.checksum = IP.reduce_checksum(sum)
184
+
185
+ # Restore #authentication value
186
+ self.authentication = saved_auth
187
+
188
+ self.checksum
189
+ end
190
+
191
+ # Get human-readable type
192
+ # @return [String]
193
+ def human_type
194
+ self[:type].to_human
195
+ end
196
+
197
+ # Get human-readable AU type
198
+ # @return [String]
199
+ def human_au_type
200
+ self[:au_type].to_human
201
+ end
202
+
203
+ # Compute length and set +length+ field
204
+ # @return [Integer]
205
+ def calc_length
206
+ self[:length].value = Base.calculate_and_set_length(self)
207
+ end
208
+
209
+ # Fixup IP header according to RFC 2328:
210
+ # * set TOS field to 0xc0,
211
+ # * optionally set destination address,
212
+ # * set TTL to 1 if destination is a mcast address.
213
+ # This method may be called as:
214
+ # # first way
215
+ # pkt.ospfv2.ospfize
216
+ # # second way
217
+ # pkt.ospfize
218
+ # @param [String,Symbol,nil] dst destination address. May be a dotted IP
219
+ # address (by example '224.0.0.5') or a Symbol (+:all_spf_routers+ or
220
+ # +:all_d_routers+)
221
+ # @return [void]
222
+ def ospfize(dst: nil)
223
+ ip = ip_header(self)
224
+ ip.tos = 0xc0
225
+ dst = case dst
226
+ when :all_spf_routers
227
+ '224.0.0.5'
228
+ when :all_d_routers
229
+ '224.0.0.6'
230
+ else
231
+ dst
232
+ end
233
+ ip.dst = dst unless dst.nil?
234
+ ip.ttl = 1 if ip[:dst].mcast?
235
+ end
236
+ end
237
+
238
+ self.add_class OSPFv2
239
+ IP.bind_header OSPFv2, protocol: OSPFv2::IP_PROTOCOL
240
+ end
241
+ end
242
+
243
+ require_relative 'ospfv2/hello'
244
+ require_relative 'ospfv2/lsa_header'
245
+ require_relative 'ospfv2/lsa'
246
+ require_relative 'ospfv2/db_description'
247
+ require_relative 'ospfv2/ls_request'
248
+ require_relative 'ospfv2/ls_update'
249
+ require_relative 'ospfv2/ls_ack'
@@ -0,0 +1,105 @@
1
+ # This file is part of PacketGen
2
+ # See https://github.com/sdaubert/packetgen for more informations
3
+ # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ module PacketGen
9
+ module Header
10
+ class OSPFv2
11
+
12
+ # This class handles {OSPFv2 OSPFv2} DB description packets payload.
13
+ # The DB description payload has the following format:
14
+ # 0 1 2 3
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
16
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
17
+ # | Interface MTU | Options |0|0|0|0|0|I|M|MS
18
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
19
+ # | DD sequence number |
20
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
21
+ # | |
22
+ # +- -+
23
+ # | |
24
+ # +- An LSA Header -+
25
+ # | |
26
+ # +- -+
27
+ # | |
28
+ # +- -+
29
+ # | |
30
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31
+ # | ... |
32
+ #
33
+ # A DB description payload is composed of:
34
+ # * a 16-bit {#mtu} field ({Types::Int16}),
35
+ # * a 8-bit {#options} field ({Types::Int8}),
36
+ # * a 8-bit {#flags} field ({Types::Int8}). Supported flags are:
37
+ # * {i_flag},
38
+ # * {m_flag},
39
+ # * {ms_flag},
40
+ # * a 32-bit {#sequence_number} field ({Types::Int32}),
41
+ # * and an array of {LSAHeader LSAHeaders} ({#lsas}, {ArrayOfLSA}).
42
+ #
43
+ # == Create a DbDescription payload
44
+ # # standalone
45
+ # dbd = PacketGen::Header::OSPFv2::DbDescription.new
46
+ # # in a packet
47
+ # pkt = PacketGen.gen('IP', src: source_ip).add('OSPFv2').add('OSPFv2::DbDescription')
48
+ # # access to DbDescription payload
49
+ # pkt.ospfv2_dbdescription # => PacketGen::Header::OSPFv2::DbDescription
50
+ #
51
+ # == DbDescription attributes
52
+ # dbd.mtu = 1500
53
+ # # set options. Options may also be set one by one with {#mt_opt},
54
+ # # {#e_opt}, {#mc_opt}, {#n_opt}, {#l_opt}, {#dc_opt}, {#o_opt} and {#dn_opt}
55
+ # dbd.options = 0
56
+ # dbd.flags = 0
57
+ # dbd.seqnum = 0x800001
58
+ # # add a LSA Router header
59
+ # 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
+ # @author Sylvain Daubert
63
+ class DbDescription < Base
64
+ # @!attribute mtu
65
+ # 16-bit interface MTU
66
+ # @return [Integer]
67
+ define_field :mtu, Types::Int16
68
+
69
+ # @!macro define_options
70
+ OSPFv2.define_options(self)
71
+
72
+ # @!attribute flags
73
+ # 8-bit interface flags ({#i_flag}, {#m_flag} and {#ms_flag})
74
+ # @return [Integer]
75
+ define_field :flags, Types::Int8
76
+ # @!attribute i_flag
77
+ # Init bit
78
+ # @return [Boolean]
79
+ # @!attribute m_flag
80
+ # More bit
81
+ # @return [Boolean]
82
+ # @!attribute ms_flag
83
+ # Master/Slave bit
84
+ # @return [Boolean]
85
+ define_bit_fields_on :flags, :zero, 5, :i_flag, :m_flag, :ms_flag
86
+
87
+ # @!attribute sequence_number
88
+ # 32-bit DD sequence number, used to sequence the collection of Database
89
+ # Description Packets.
90
+ # @return [Integer]
91
+ define_field :sequence_number, Types::Int32
92
+ alias seqnum sequence_number
93
+ alias seqnum= sequence_number=
94
+
95
+ # @!attribute lsas
96
+ # Array of LSA headers
97
+ # @return [ArrayOfLSAHeader]
98
+ define_field :lsas, ArrayOfLSA, builder: ->(h, t) { t.new(only_headers: true) }
99
+ end
100
+ end
101
+
102
+ self.add_class OSPFv2::DbDescription
103
+ OSPFv2.bind_header OSPFv2::DbDescription, type: OSPFv2::TYPES['DB_DESCRIPTION']
104
+ end
105
+ end