packetgen 4.0.0 → 4.1.0

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