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.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -22
  3. data/lib/packetgen/capture.rb +2 -2
  4. data/lib/packetgen/config.rb +0 -1
  5. data/lib/packetgen/deprecation.rb +14 -8
  6. data/lib/packetgen/header/arp.rb +17 -18
  7. data/lib/packetgen/header/asn1_base.rb +2 -1
  8. data/lib/packetgen/header/base.rb +42 -40
  9. data/lib/packetgen/header/bootp.rb +35 -37
  10. data/lib/packetgen/header/dhcp/option.rb +21 -21
  11. data/lib/packetgen/header/dhcp/options.rb +3 -3
  12. data/lib/packetgen/header/dhcp.rb +8 -9
  13. data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
  14. data/lib/packetgen/header/dhcpv6/option.rb +83 -61
  15. data/lib/packetgen/header/dhcpv6/options.rb +4 -4
  16. data/lib/packetgen/header/dhcpv6/relay.rb +6 -5
  17. data/lib/packetgen/header/dhcpv6.rb +17 -18
  18. data/lib/packetgen/header/dns/name.rb +21 -16
  19. data/lib/packetgen/header/dns/opt.rb +5 -2
  20. data/lib/packetgen/header/dns/option.rb +14 -14
  21. data/lib/packetgen/header/dns/qdsection.rb +3 -3
  22. data/lib/packetgen/header/dns/question.rb +7 -8
  23. data/lib/packetgen/header/dns/rr.rb +56 -43
  24. data/lib/packetgen/header/dns/rrsection.rb +6 -6
  25. data/lib/packetgen/header/dns.rb +103 -90
  26. data/lib/packetgen/header/dot11/control.rb +12 -12
  27. data/lib/packetgen/header/dot11/data.rb +25 -24
  28. data/lib/packetgen/header/dot11/element.rb +4 -4
  29. data/lib/packetgen/header/dot11/management.rb +21 -18
  30. data/lib/packetgen/header/dot11/sub_mngt.rb +40 -53
  31. data/lib/packetgen/header/dot11.rb +117 -122
  32. data/lib/packetgen/header/dot1q.rb +12 -13
  33. data/lib/packetgen/header/dot1x.rb +13 -13
  34. data/lib/packetgen/header/eap/fast.rb +4 -4
  35. data/lib/packetgen/header/eap/md5.rb +16 -8
  36. data/lib/packetgen/header/eap/tls.rb +18 -19
  37. data/lib/packetgen/header/eap/ttls.rb +22 -21
  38. data/lib/packetgen/header/eap.rb +73 -48
  39. data/lib/packetgen/header/eth.rb +41 -27
  40. data/lib/packetgen/header/gre.rb +33 -11
  41. data/lib/packetgen/header/http/headers.rb +7 -6
  42. data/lib/packetgen/header/http/request.rb +38 -29
  43. data/lib/packetgen/header/http/response.rb +35 -27
  44. data/lib/packetgen/header/http/verbs.rb +1 -3
  45. data/lib/packetgen/header/icmp.rb +14 -14
  46. data/lib/packetgen/header/icmpv6.rb +10 -9
  47. data/lib/packetgen/header/igmp.rb +26 -15
  48. data/lib/packetgen/header/igmpv3/group_record.rb +18 -13
  49. data/lib/packetgen/header/igmpv3/mq.rb +16 -18
  50. data/lib/packetgen/header/igmpv3/mr.rb +5 -5
  51. data/lib/packetgen/header/igmpv3.rb +12 -11
  52. data/lib/packetgen/header/ip/addr.rb +19 -15
  53. data/lib/packetgen/header/ip/option.rb +47 -36
  54. data/lib/packetgen/header/ip/options.rb +1 -1
  55. data/lib/packetgen/header/ip.rb +77 -95
  56. data/lib/packetgen/header/ipv6/addr.rb +28 -27
  57. data/lib/packetgen/header/ipv6/extension.rb +13 -11
  58. data/lib/packetgen/header/ipv6/hop_by_hop.rb +32 -13
  59. data/lib/packetgen/header/ipv6.rb +42 -35
  60. data/lib/packetgen/header/llc.rb +28 -21
  61. data/lib/packetgen/header/mdns.rb +10 -3
  62. data/lib/packetgen/header/mld.rb +15 -13
  63. data/lib/packetgen/header/mldv2/mcast_address_record.rb +17 -12
  64. data/lib/packetgen/header/mldv2/mlq.rb +22 -24
  65. data/lib/packetgen/header/mldv2/mlr.rb +8 -8
  66. data/lib/packetgen/header/mldv2.rb +1 -1
  67. data/lib/packetgen/header/ospfv2/db_description.rb +17 -18
  68. data/lib/packetgen/header/ospfv2/hello.rb +18 -17
  69. data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
  70. data/lib/packetgen/header/ospfv2/ls_request.rb +14 -13
  71. data/lib/packetgen/header/ospfv2/ls_update.rb +9 -9
  72. data/lib/packetgen/header/ospfv2/lsa.rb +79 -60
  73. data/lib/packetgen/header/ospfv2/lsa_header.rb +12 -11
  74. data/lib/packetgen/header/ospfv2.rb +49 -46
  75. data/lib/packetgen/header/ospfv3/db_description.rb +20 -22
  76. data/lib/packetgen/header/ospfv3/hello.rb +17 -16
  77. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +22 -20
  78. data/lib/packetgen/header/ospfv3/ls_ack.rb +7 -8
  79. data/lib/packetgen/header/ospfv3/ls_request.rb +18 -18
  80. data/lib/packetgen/header/ospfv3/ls_update.rb +10 -10
  81. data/lib/packetgen/header/ospfv3/lsa.rb +62 -51
  82. data/lib/packetgen/header/ospfv3/lsa_header.rb +12 -11
  83. data/lib/packetgen/header/ospfv3.rb +54 -52
  84. data/lib/packetgen/header/sctp/chunk.rb +80 -56
  85. data/lib/packetgen/header/sctp/error.rb +174 -202
  86. data/lib/packetgen/header/sctp/padded32.rb +3 -3
  87. data/lib/packetgen/header/sctp/parameter.rb +89 -136
  88. data/lib/packetgen/header/sctp.rb +19 -8
  89. data/lib/packetgen/header/snmp.rb +108 -7
  90. data/lib/packetgen/header/tcp/option.rb +52 -39
  91. data/lib/packetgen/header/tcp/options.rb +13 -5
  92. data/lib/packetgen/header/tcp.rb +83 -65
  93. data/lib/packetgen/header/tftp.rb +31 -25
  94. data/lib/packetgen/header/udp.rb +21 -19
  95. data/lib/packetgen/header.rb +23 -18
  96. data/lib/packetgen/headerable.rb +21 -5
  97. data/lib/packetgen/inspect.rb +3 -8
  98. data/lib/packetgen/packet.rb +146 -71
  99. data/lib/packetgen/pcap.rb +15 -4
  100. data/lib/packetgen/pcapng/block.rb +20 -18
  101. data/lib/packetgen/pcapng/epb.rb +13 -15
  102. data/lib/packetgen/pcapng/file.rb +44 -111
  103. data/lib/packetgen/pcapng/idb.rb +11 -12
  104. data/lib/packetgen/pcapng/shb.rb +15 -16
  105. data/lib/packetgen/pcapng/spb.rb +9 -11
  106. data/lib/packetgen/pcapng/unknown_block.rb +6 -17
  107. data/lib/packetgen/pcapng.rb +6 -4
  108. data/lib/packetgen/pcaprub_wrapper.rb +17 -1
  109. data/lib/packetgen/proto.rb +5 -1
  110. data/lib/packetgen/unknown_packet.rb +5 -5
  111. data/lib/packetgen/utils/arp_spoofer.rb +18 -19
  112. data/lib/packetgen/utils.rb +4 -3
  113. data/lib/packetgen/version.rb +1 -1
  114. data/lib/packetgen.rb +12 -5
  115. metadata +29 -38
  116. data/lib/packetgen/types/abstract_tlv.rb +0 -278
  117. data/lib/packetgen/types/array.rb +0 -287
  118. data/lib/packetgen/types/cstring.rb +0 -109
  119. data/lib/packetgen/types/enum.rb +0 -171
  120. data/lib/packetgen/types/fieldable.rb +0 -66
  121. data/lib/packetgen/types/fields.rb +0 -622
  122. data/lib/packetgen/types/int.rb +0 -473
  123. data/lib/packetgen/types/int_string.rb +0 -102
  124. data/lib/packetgen/types/length_from.rb +0 -54
  125. data/lib/packetgen/types/oui.rb +0 -52
  126. data/lib/packetgen/types/string.rb +0 -97
  127. data/lib/packetgen/types/tlv.rb +0 -161
  128. 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 < Types::Fields
33
- include Types::Fieldable
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
- define_field :age, Types::Int16
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
- define_field :type, Types::Int8Enum, enum: TYPES
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
- define_field :link_state_id, IP::Addr
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
- define_field :advertising_router, IP::Addr
62
+ define_attr :advertising_router, IP::Addr
63
63
  # @!attribute sequence_number
64
64
  # @return [Integer]
65
- define_field :sequence_number, Types::Int32
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
- define_field :checksum, Types::Int16
72
+ define_attr :checksum, BinStruct::Int16
73
73
  # @!attribute length
74
74
  # Length of the LSA, including the header.
75
75
  # @return [Integer]
76
- define_field :length, Types::Int16
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 +length+ field
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
- # A OSPFv2 header has the following format:
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 ({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}).
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
- # == Create an OSPFv2 header
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', src: source_ip).add('OSPFv2')
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
- # == 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
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
- define_field :version, Types::Int8, default: 2
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
- define_field :type, Types::Int8Enum, enum: TYPES
102
+ define_attr :type, BinStruct::Int8Enum, enum: TYPES
102
103
  # @!attribute length
103
104
  # 16-bit OSPF packet length
104
105
  # @return [Integer]
105
- define_field :length, Types::Int16
106
+ define_attr :length, BinStruct::Int16
106
107
  # @!attribute router_id
107
108
  # 32-bit router ID
108
109
  # @return [Integer]
109
- define_field :router_id, Types::Int32
110
+ define_attr :router_id, BinStruct::Int32
110
111
  # @!attribute area_id
111
112
  # 32-bit area ID
112
113
  # @return [Integer]
113
- define_field :area_id, Types::Int32
114
+ define_attr :area_id, BinStruct::Int32
114
115
  # @!attribute checksum
115
116
  # 16-bit OSPF packet checksum
116
117
  # @return [Integer]
117
- define_field :checksum, Types::Int16
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
- define_field :au_type, Types::Int16Enum, enum: AU_TYPES
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
- define_field :authentication, Types::Int64
126
+ define_attr :authentication, BinStruct::Int64
126
127
  # @!attribute body
127
- # @return [String,Base]
128
- define_field :body, Types::String
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 [Boolean]
142
+ # @return [Integer]
141
143
  # @!attribute o_opt
142
- # @return [Boolean]
144
+ # @return [Integer]
143
145
  # @!attribute dc_opt
144
146
  # This bit describes the router's handling of demand circuits.
145
- # @return [Boolean]
147
+ # @return [Integer]
146
148
  # @!attribute l_opt
147
149
  # This specifies if a LLS Data block is present.
148
- # @return [Boolean]
150
+ # @return [Integer]
149
151
  # @!attribute n_opt
150
152
  # This bit specifies if NSSA is supported.
151
- # @return [Boolean]
153
+ # @return [Integer]
152
154
  # @!attribute mc_opt
153
155
  # This bit describes whether IP multicast datagrams are forwarded.
154
- # @return [Boolean]
156
+ # @return [Integer]
155
157
  # @!attribute e_opt
156
158
  # This bit describes the way AS-external-LSAs are flooded.
157
- # @return [Boolean]
159
+ # @return [Integer]
158
160
  # @!attribute mt_opt
159
- # @return [Boolean]
161
+ # @return [Integer]
160
162
  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
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 +checksum+ field
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 +length+ field
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,Symbol,nil] dst destination address. May be a dotted IP
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 ({Types::Int8}),
37
- # * a 24-bit {#options} field ({Types::Int24}),
38
- # * a 16-bit {#mtu} field ({Types::Int16}),
39
- # * a 16-bit {#flags} field ({Types::Int16}). Supported flags are:
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 ({Types::Int32}),
43
+ # * a 32-bit {#sequence_number} field (+BinStruct::Int32+),
44
44
  # * and an array of {LSAHeader LSAHeaders} ({#lsas}, {ArrayOfLSA}).
45
45
  #
46
- # == Create a DbDescription payload
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', src: source_ip).add('OSPFv3').add('OSPFv3::DbDescription')
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
- # == DbDescription attributes
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
- define_field :reserved, Types::Int8, default: 0
70
+ define_attr :reserved, BinStruct::Int8, default: 0
72
71
 
73
- # @!macro define_options
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
- define_field :mtu, Types::Int16
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 [Boolean]
84
+ # @return [Integer]
87
85
  # @!attribute m_flag
88
86
  # More bit from {#flags} field
89
- # @return [Boolean]
87
+ # @return [Integer]
90
88
  # @!attribute ms_flag
91
89
  # Master/Slave bit from {#flags} field
92
- # @return [Boolean]
93
- define_bit_fields_on :flags, :zz, 13, :i_flag, :m_flag, :ms_flag
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
- define_field :sequence_number, Types::Int32
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 [ArrayOfLSAHeader]
106
- define_field :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
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 ({Types::Int32}),
32
- # * a {#priority} field ({Types::Int8}),
33
- # * an {#options} field ({Types::Int24}),
34
- # * a {#hello_interval} field ({Types::Int16}),
35
- # * a {#dead_interval} field ({Types::Int16}),
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
- # == Create a HELLO payload
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', src: source_ip).add('OSPFv3').add('OSPFv3::Hello')
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
- # == HELLO attributes
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
- define_field :interface_id, Types::Int32
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
- define_field :priority, Types::Int8
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
- define_field :hello_interval, Types::Int16
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
- define_field :dead_interval, Types::Int16
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
- define_field :designated_router, IP::Addr
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
- define_field :backup_designated_router, IP::Addr
94
+ define_attr :backup_designated_router, IP::Addr
94
95
  # @!attribute neighbors
95
96
  # Array of neighbors
96
97
  # @return [IP::ArrayOfAddr]
97
- define_field :neighbors, IP::ArrayOfAddr
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 < Types::Fields
21
- include Types::Fieldable
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
- define_field :length, Types::Int8
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 [Boolean]
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 [Boolean]
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 [Boolean]
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 [Boolean]
57
- define_bit_fields_on :options, :zz, 3, :dn_opt, :p_opt, :z, :la_opt, :nu_opt
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 [void]
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 < Types::Array
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
- # == Create a LSAck payload
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', src: source_ip).add('OSPFv3').add('OSPFv3::LSAck')
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
- # == Adding LSA headers to a LSAck payload
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
- define_field :lsas, ArrayOfLSA,
44
- builder: ->(_h, t) { t.new(only_headers: true) }
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 < Types::Fields
31
- include Types::Fieldable
30
+ class LSR < BinStruct::Struct
31
+ include BinStruct::Structable
32
32
 
33
33
  # @!attribute reserved
34
34
  # reserved field.
35
35
  # @return [Integer]
36
- define_field :reserved, Types::Int16, default: 0
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
- define_field :type, Types::Int16Enum, enum: LSAHeader::TYPES
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
- define_field :link_state_id, IP::Addr
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
- define_field :advertising_router, IP::Addr
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 {Types::Array array} to handle series
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 < Types::Array
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
- # == Create a LSRequest payload
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', src: source_ip).add('OSPFv3').add('OSPFv3::LSRequest')
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
- # == Add LSA requests to a LSRequest
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
- define_field :lsrs, ArrayOfLSR
103
+ define_attr :lsrs, ArrayOfLSR
104
104
  end
105
105
  end
106
106