packetgen 4.0.0 → 4.1.1

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 (117) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -9
  3. data/lib/packetgen/capture.rb +3 -6
  4. data/lib/packetgen/config.rb +1 -1
  5. data/lib/packetgen/deprecation.rb +7 -1
  6. data/lib/packetgen/header/arp.rb +7 -8
  7. data/lib/packetgen/header/asn1_base.rb +3 -2
  8. data/lib/packetgen/header/base.rb +39 -27
  9. data/lib/packetgen/header/bootp.rb +15 -15
  10. data/lib/packetgen/header/dhcp/option.rb +9 -9
  11. data/lib/packetgen/header/dhcp/options.rb +3 -3
  12. data/lib/packetgen/header/dhcp.rb +7 -8
  13. data/lib/packetgen/header/dhcpv6/duid.rb +3 -5
  14. data/lib/packetgen/header/dhcpv6/option.rb +38 -16
  15. data/lib/packetgen/header/dhcpv6/options.rb +4 -4
  16. data/lib/packetgen/header/dhcpv6/relay.rb +2 -1
  17. data/lib/packetgen/header/dhcpv6.rb +14 -15
  18. data/lib/packetgen/header/dns/name.rb +10 -9
  19. data/lib/packetgen/header/dns/opt.rb +4 -1
  20. data/lib/packetgen/header/dns/option.rb +8 -8
  21. data/lib/packetgen/header/dns/qdsection.rb +3 -3
  22. data/lib/packetgen/header/dns/question.rb +2 -1
  23. data/lib/packetgen/header/dns/rr.rb +2 -4
  24. data/lib/packetgen/header/dns/rrsection.rb +3 -3
  25. data/lib/packetgen/header/dns.rb +77 -61
  26. data/lib/packetgen/header/dot11/control.rb +6 -6
  27. data/lib/packetgen/header/dot11/data.rb +12 -11
  28. data/lib/packetgen/header/dot11/element.rb +2 -2
  29. data/lib/packetgen/header/dot11/management.rb +19 -16
  30. data/lib/packetgen/header/dot11/sub_mngt.rb +23 -22
  31. data/lib/packetgen/header/dot11.rb +39 -39
  32. data/lib/packetgen/header/dot1q.rb +6 -5
  33. data/lib/packetgen/header/dot1x.rb +9 -9
  34. data/lib/packetgen/header/eap/fast.rb +4 -4
  35. data/lib/packetgen/header/eap/md5.rb +12 -4
  36. data/lib/packetgen/header/eap/tls.rb +10 -9
  37. data/lib/packetgen/header/eap/ttls.rb +14 -11
  38. data/lib/packetgen/header/eap.rb +59 -34
  39. data/lib/packetgen/header/eth.rb +27 -13
  40. data/lib/packetgen/header/gre.rb +27 -3
  41. data/lib/packetgen/header/http/headers.rb +7 -6
  42. data/lib/packetgen/header/http/request.rb +25 -17
  43. data/lib/packetgen/header/http/response.rb +23 -16
  44. data/lib/packetgen/header/http/verbs.rb +1 -1
  45. data/lib/packetgen/header/http.rb +1 -1
  46. data/lib/packetgen/header/icmp.rb +11 -11
  47. data/lib/packetgen/header/icmpv6.rb +11 -10
  48. data/lib/packetgen/header/igmp.rb +22 -11
  49. data/lib/packetgen/header/igmpv3/group_record.rb +8 -3
  50. data/lib/packetgen/header/igmpv3/mq.rb +2 -2
  51. data/lib/packetgen/header/igmpv3/mr.rb +2 -2
  52. data/lib/packetgen/header/igmpv3.rb +12 -11
  53. data/lib/packetgen/header/ip/addr.rb +7 -3
  54. data/lib/packetgen/header/ip/option.rb +19 -6
  55. data/lib/packetgen/header/ip/options.rb +1 -1
  56. data/lib/packetgen/header/ip.rb +53 -36
  57. data/lib/packetgen/header/ipv6/addr.rb +15 -14
  58. data/lib/packetgen/header/ipv6/extension.rb +10 -8
  59. data/lib/packetgen/header/ipv6/hop_by_hop.rb +27 -8
  60. data/lib/packetgen/header/ipv6.rb +32 -23
  61. data/lib/packetgen/header/llc.rb +21 -14
  62. data/lib/packetgen/header/mdns.rb +10 -3
  63. data/lib/packetgen/header/mld.rb +12 -10
  64. data/lib/packetgen/header/mldv2/mcast_address_record.rb +7 -2
  65. data/lib/packetgen/header/mldv2/mlq.rb +9 -9
  66. data/lib/packetgen/header/mldv2/mlr.rb +5 -5
  67. data/lib/packetgen/header/mldv2.rb +2 -2
  68. data/lib/packetgen/header/ospfv2/db_description.rb +11 -11
  69. data/lib/packetgen/header/ospfv2/hello.rb +12 -11
  70. data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
  71. data/lib/packetgen/header/ospfv2/ls_request.rb +8 -7
  72. data/lib/packetgen/header/ospfv2/ls_update.rb +8 -8
  73. data/lib/packetgen/header/ospfv2/lsa.rb +34 -11
  74. data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -3
  75. data/lib/packetgen/header/ospfv2.rb +32 -27
  76. data/lib/packetgen/header/ospfv3/db_description.rb +13 -14
  77. data/lib/packetgen/header/ospfv3/hello.rb +11 -10
  78. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -3
  79. data/lib/packetgen/header/ospfv3/ls_ack.rb +6 -7
  80. data/lib/packetgen/header/ospfv3/ls_request.rb +11 -11
  81. data/lib/packetgen/header/ospfv3/ls_update.rb +8 -8
  82. data/lib/packetgen/header/ospfv3/lsa.rb +24 -10
  83. data/lib/packetgen/header/ospfv3/lsa_header.rb +4 -3
  84. data/lib/packetgen/header/ospfv3.rb +39 -35
  85. data/lib/packetgen/header/sctp/chunk.rb +39 -18
  86. data/lib/packetgen/header/sctp/error.rb +170 -198
  87. data/lib/packetgen/header/sctp/padded32.rb +4 -4
  88. data/lib/packetgen/header/sctp/parameter.rb +86 -133
  89. data/lib/packetgen/header/sctp.rb +15 -4
  90. data/lib/packetgen/header/snmp.rb +111 -10
  91. data/lib/packetgen/header/tcp/option.rb +8 -1
  92. data/lib/packetgen/header/tcp/options.rb +12 -4
  93. data/lib/packetgen/header/tcp.rb +34 -27
  94. data/lib/packetgen/header/tftp.rb +17 -11
  95. data/lib/packetgen/header/udp.rb +16 -14
  96. data/lib/packetgen/header.rb +20 -14
  97. data/lib/packetgen/headerable.rb +10 -4
  98. data/lib/packetgen/inject.rb +1 -1
  99. data/lib/packetgen/inspect.rb +3 -8
  100. data/lib/packetgen/packet.rb +95 -37
  101. data/lib/packetgen/pcap.rb +1 -1
  102. data/lib/packetgen/pcapng/block.rb +3 -2
  103. data/lib/packetgen/pcapng/epb.rb +1 -1
  104. data/lib/packetgen/pcapng/file.rb +42 -15
  105. data/lib/packetgen/pcapng/idb.rb +3 -2
  106. data/lib/packetgen/pcapng/shb.rb +3 -2
  107. data/lib/packetgen/pcapng/spb.rb +2 -2
  108. data/lib/packetgen/pcapng/unknown_block.rb +1 -1
  109. data/lib/packetgen/pcapng.rb +3 -1
  110. data/lib/packetgen/pcaprub_wrapper.rb +1 -1
  111. data/lib/packetgen/proto.rb +5 -1
  112. data/lib/packetgen/unknown_packet.rb +4 -4
  113. data/lib/packetgen/utils/arp_spoofer.rb +1 -1
  114. data/lib/packetgen/utils.rb +4 -5
  115. data/lib/packetgen/version.rb +2 -2
  116. data/lib/packetgen.rb +9 -3
  117. metadata +8 -9
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
4
+ # See https://codeberg.org/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
6
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
7
  # This program is published under MIT license.
@@ -9,7 +9,7 @@
9
9
  module PacketGen
10
10
  module Header
11
11
  class IPv6
12
- # Base class to handle IPv6 extensions
12
+ # Base class to handle IPv6 extensions.
13
13
  # @abstract You should not use this class but its subclasses.
14
14
  # A IPv6 extension header has the following format:
15
15
  # 0 1 2 3
@@ -25,11 +25,12 @@ module PacketGen
25
25
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26
26
  #
27
27
  # Such a header consists of:
28
- # * a {#next} header field ({BinStruct::Int8}),
29
- # * a {#length} field ({BinStruct::Int8}),
30
- # * an {#options} field ({BinStruct::String}),
28
+ # * a {#next} header field (+BinStruct::Int8+),
29
+ # * a {#length} field (+BinStruct::Int8+),
30
+ # * an {#options} field (+BinStruct::String+),
31
31
  # * and a {#body}, containing next header.
32
32
  # @author Sylvain Daubert
33
+ # @since 2.4.0
33
34
  class Extension < Base
34
35
  # @!attribute next
35
36
  # 8-bit Next header field
@@ -44,9 +45,10 @@ module PacketGen
44
45
  # Specific options of extension header
45
46
  # @return [String]
46
47
  define_attr :options, BinStruct::String,
47
- builder: ->(h, t) { t.new(length_from: -> { h.real_length }) }
48
+ builder: ->(h, t) { t.new(length_from: -> { h.real_length - 2}) }
48
49
  # @!attribute body
49
- # @return [String,Base]
50
+ # Next header in IPv6 packet
51
+ # @return [String,Headerable]
50
52
  define_attr :body, BinStruct::String
51
53
 
52
54
  # Get real extension header length
@@ -55,7 +57,7 @@ module PacketGen
55
57
  (length + 1) * 8
56
58
  end
57
59
 
58
- # Compute length and set +len+ field
60
+ # Compute length and set {#length}+ attribute
59
61
  # @return [Integer]
60
62
  def calc_length
61
63
  self.length = (options.sz + 2) / 8 - 1
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
4
+ # See https://codeberg.org/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
6
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
7
  # This program is published under MIT license.
@@ -11,7 +11,8 @@ module PacketGen
11
11
  class IPv6
12
12
  # @!parse
13
13
  # # Option for {HopByHop} IPv6 extension header.
14
- # # @since 3.1.0 subclass of {BinStruct::AbstractTLV}
14
+ # # @since 2.4.0
15
+ # # @since 3.1.0 subclass of +BinStruct::AbstractTLV+
15
16
  # class Option <AbstractTLV; end
16
17
  # @private
17
18
  Option = BinStruct::AbstractTLV.create
@@ -23,6 +24,7 @@ module PacketGen
23
24
  5 => 'router_alert'
24
25
  }.freeze
25
26
 
27
+ # Get human-readable string
26
28
  # @return [String]
27
29
  def to_human
28
30
  case type
@@ -35,13 +37,16 @@ module PacketGen
35
37
  end
36
38
  Option.define_type_enum Option::TYPES.invert
37
39
 
38
- # Special option pad1, for {HopByHop} IPv6 extension header
40
+ # Special option pad1 (one-byte option), for {HopByHop} IPv6 extension header
39
41
  # @author Sylvain Daubert
42
+ # @since 2.4.0
40
43
  class Pad1 < BinStruct::Struct
41
44
  # @!attribute pad
42
- # @return [Integer]
45
+ # Pad1 option type
46
+ # @return [Integer]
43
47
  define_attr :pad, BinStruct::Int8, default: 0
44
48
 
49
+ # Get human-readable string
45
50
  # @return [String]
46
51
  def to_human
47
52
  'pad1'
@@ -50,6 +55,7 @@ module PacketGen
50
55
 
51
56
  # Array of {Option}, for {HopByHop} IPv6 extension header
52
57
  # @author Sylvain Daubert
58
+ # @since 2.4.0
53
59
  class Options < BinStruct::Array
54
60
  set_of Option
55
61
 
@@ -96,18 +102,31 @@ module PacketGen
96
102
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
97
103
  #
98
104
  # Hop-by-hop IPv6 extension header consists of:
99
- # * a {#next} header field ({BinStruct::Int8}),
100
- # * a {#length} field ({BinStruct::Int8}),
105
+ # * a {#next #next} header field (+BinStruct::Int8+),
106
+ # * a {#length #length} field (+BinStruct::Int8+),
101
107
  # * an {#options} field ({Options}),
102
- # * and a {#body}, containing next header.
108
+ # * and a {#body #body}, containing next header.
109
+ # @example
110
+ # pkt = PacketGen.gen('Eth').add('IPv6').add('IPv6::HopByHop').add('ICMPv6')
111
+ # pkt.ipv6_hopbyhop.options << { type: 'router_alert', value: "\x00\x00".b }
103
112
  # @author Sylvain Daubert
113
+ # @since 2.4.0
104
114
  class HopByHop < Extension
105
115
  # redefine options field
106
116
  remove_attr :options
107
117
  # @!attribute options
108
- # Specific options of extension header
118
+ # Specific HopByHop options
109
119
  # @return [Options]
110
120
  define_attr_before :body, :options, Options, builder: ->(h, t) { t.new(length_from: -> { h.real_length - 2 }) }
121
+
122
+ # Generate binary string. Add padding if needed in {#options}, and update {#length} accordingly.
123
+ # @return [String]
124
+ # @since 2.4.0
125
+ # @since 4.1.0 Set {Extension#length}.
126
+ def to_s
127
+ calc_length
128
+ super
129
+ end
111
130
  end
112
131
  end
113
132
 
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/lemontree55/packetgen for more informations
5
+ # See https://codeberg.org/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
7
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
8
8
  # This program is published under MIT license.
@@ -37,26 +37,27 @@ module PacketGen
37
37
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
38
38
  #
39
39
  # A IPv6 header consists of:
40
- # * a first 32-bit word ({#u32}, of {BinStruct::Int32} type) composed of:
40
+ # * a first 32-bit word ({#u32}, of +BinStruct::Int32+ type) composed of:
41
41
  # * a 4-bit {#version} field,
42
42
  # * a 8-bit {#traffic_class} field,
43
43
  # * a 20-bit {#flow_label} field,
44
- # * a payload length field ({#length}, {BinStruct::Int16} type}),
45
- # * a next header field ({#next}, {BinStruct::Int8} type),
46
- # * a hop-limit field ({#hop}, +Int8+ type),
44
+ # * a payload length field ({#length}, +BinStruct::Int16+ type}),
45
+ # * a next header field ({#next}, +BinStruct::Int8+ type),
46
+ # * a hop-limit field ({#hop}, +BinStruct::Int8+ type),
47
47
  # * a source address field ({#src}, {IPv6::Addr} type),
48
- # * a destination address field ({#dst}, +IPv6::Addr+ type),
49
- # * and a {#body} ({BinStruct::String} type).
48
+ # * a destination address field ({#dst}, {IPv6::Addr} type),
49
+ # * and a {#body} (+BinStruct::String+ type).
50
50
  #
51
- # == Create a IPv6 header
51
+ # @example Create a IPv6 header
52
52
  # # standalone
53
53
  # ipv6 = PacketGen::Header::IPv6.new
54
54
  # # in a packet
55
55
  # pkt = PacketGen.gen('IPv6')
56
56
  # # access to IPv6 header
57
- # pkt.ipv6 # => PacketGen::Header::IPv6
57
+ # pkt.ipv6.class # => PacketGen::Header::IPv6
58
58
  #
59
- # == IPv6 attributes
59
+ # @example IPv6 attributes
60
+ # ipv6 = PacketGen::Header::IPv6.new
60
61
  # ipv6.u32 = 0x60280001
61
62
  # # the same as
62
63
  # ipv6.version = 6
@@ -68,9 +69,9 @@ module PacketGen
68
69
  # ipv6.next = 6
69
70
  # ipv6.src = '::1'
70
71
  # ipv6.src # => "::1"
71
- # ipv6[:src] # => PacketGen::Header::IPv6::Addr
72
+ # ipv6[:src].class # => PacketGen::Header::IPv6::Addr
72
73
  # ipv6.dst = '2001:1234:5678:abcd::123'
73
- # ipv6.body.read 'this is a body'
74
+ # ipv6.body ='this is a body'
74
75
  #
75
76
  # == Add IPv6 extensions
76
77
  # In IPv6, optional extensions are encoded in separate headers that
@@ -84,6 +85,7 @@ module PacketGen
84
85
  # # Add another header
85
86
  # pkt.add('UDP')
86
87
  # @author Sylvain Daubert
88
+ # @author LemonTree55
87
89
  class IPv6 < Base; end
88
90
 
89
91
  require_relative 'ipv6/addr'
@@ -96,11 +98,14 @@ module PacketGen
96
98
  # First 32-bit word of IPv6 header
97
99
  # @return [Integer]
98
100
  # @!attribute version
99
- # @return [Integer] 4-bit version attribute
101
+ # 4-bit version attribute
102
+ # @return [Integer]
100
103
  # @!attribute traffic_class
101
- # @return [Integer] 8-bit traffic_class attribute
104
+ # 8-bit traffic_class attribute
105
+ # @return [Integer]
102
106
  # @!attribute flow_label
103
- # @return [Integer] 20-bit flow_label attribute
107
+ # 20-bit flow_label attribute
108
+ # @return [Integer]
104
109
  define_bit_attr :u32, default: 0x60000000, version: 4, traffic_class: 8, flow_label: 20
105
110
  # @!attribute length
106
111
  # 16-bit word of IPv6 payload length
@@ -123,10 +128,11 @@ module PacketGen
123
128
  # @return [Addr]
124
129
  define_attr :dst, Addr, default: '::1'
125
130
  # @!attribute body
126
- # @return [BinStruct::String,Header::Base]
131
+ # IPv6 body
132
+ # @return [BinStruct::String,Headerable]
127
133
  define_attr :body, BinStruct::String
128
134
 
129
- # Compute length and set +len+ field
135
+ # Compute length and set {#length} field
130
136
  # @return [Integer]
131
137
  def calc_length
132
138
  Base.calculate_and_set_length self, header_in_size: false
@@ -141,7 +147,7 @@ module PacketGen
141
147
  sum
142
148
  end
143
149
 
144
- # Send IPv6 packet on wire. All attributes.may be set (even {#version}).
150
+ # Send IPv6 packet on wire. All attributes may be set (even {#version}).
145
151
  # @param [String] _iface interface name (not used)
146
152
  # @return [void]
147
153
  # @since 3.0.0 no more limitations on +flow_label+, +length+ and +src+ fields.
@@ -168,7 +174,7 @@ module PacketGen
168
174
  end
169
175
 
170
176
  # Check version field
171
- # @see [Base#parse?]
177
+ # @see Base#parse?
172
178
  def parse?
173
179
  version == 6
174
180
  end
@@ -197,15 +203,18 @@ module PacketGen
197
203
  module Header
198
204
  class IPv6
199
205
  class << self
206
+ # @private
200
207
  alias old_bind bind
201
208
 
202
209
  # Bind a upper header to IPv6 and its defined extension headers.
203
210
  # @see Base.bind
211
+ # @author LemonTree55
204
212
  def bind(header_klass, args={})
205
- IPv6.old_bind header_klass, args
206
- [IPv6::HopByHop].each do |klass|
207
- klass.bind header_klass, args
208
- end
213
+ IPv6.old_bind(header_klass, args)
214
+ IPv6.constants
215
+ .map { |cname| IPv6.const_get(cname) }
216
+ .select { |klass| klass.is_a?(Class) && (klass < Extension) }
217
+ .each { |klass| klass.bind(header_klass, args) }
209
218
  end
210
219
  end
211
220
  end
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/lemontree55/packetgen for more informations
5
+ # See https://codeberg.org/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
7
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
8
8
  # This program is published under MIT license.
@@ -12,24 +12,28 @@ module PacketGen
12
12
  # Logical-Link Control header
13
13
  #
14
14
  # A LLC header consists of:
15
- # * a {#dsap} ({BinStruct::Int8}),
16
- # * a {#ssap} ({BinStruct::Int8}),
17
- # * a {#control} ({BinStruct::Int8}),
18
- # * and a {#body} (a {BinStruct::String} or another {Base} class).
15
+ # * a {#dsap} (+BinStruct::Int8+),
16
+ # * a {#ssap} (+BinStruct::Int8+),
17
+ # * a {#control} (+BinStruct::Int8+),
18
+ # * and a {#body} (a +BinStruct::String+ or another {Headerable} class).
19
19
  # @author Sylvain Daubert
20
20
  # @since 1.4.0
21
21
  class LLC < Base
22
22
  # @!attribute dsap
23
- # @return [Integer] 8-bit dsap value
23
+ # 8-bit Destination Service Access Point value
24
+ # @return [Integer]
24
25
  define_attr :dsap, BinStruct::Int8
25
26
  # @!attribute ssap
26
- # @return [Integer] 8-bit ssap value
27
+ # 8-bit Source Service Access Point value
28
+ # @return [Integer]
27
29
  define_attr :ssap, BinStruct::Int8
28
30
  # @!attribute control
29
- # @return [Integer] 8-bit control value
31
+ # 8-bit control value
32
+ # @return [Integer]
30
33
  define_attr :control, BinStruct::Int8
31
34
  # @!attribute body
32
- # @return [BinStruct::String,Header::Base]
35
+ # LLC body
36
+ # @return [BinStruct::String,Headerable]
33
37
  define_attr :body, BinStruct::String
34
38
  end
35
39
  self.add_class LLC
@@ -38,20 +42,23 @@ module PacketGen
38
42
  # Sub-Network Access Protocol
39
43
  #
40
44
  # A SNAP header consists of:
41
- # * a {#oui} ({BinStruct::OUI}),
42
- # * a {#proto_id} ({BinStruct::Int16}),
43
- # * and a {#body} (a {BinStruct::String} or another {Base} class).
45
+ # * a {#oui} (+BinStruct::OUI+),
46
+ # * a {#proto_id} (+BinStruct::Int16+),
47
+ # * and a {#body} (a +BinStruct::String+ or another {Headerable} class).
44
48
  # @author Sylvain Daubert
45
49
  # @since 1.4.0
46
50
  class SNAP < Base
47
51
  # @!attribute oui
52
+ # If +00:00:00+, {#proto_id} is an EtherType. Else, {#proto_id} is specified by organization specified BY +OUI+.
48
53
  # @return [BinStruct::OUI]
49
54
  define_attr :oui, BinStruct::OUI
50
55
  # @!attribute proto_id
51
- # @return [Integer] 16-bit protocol id
56
+ # 16-bit protocol id
57
+ # @return [Integer]
52
58
  define_attr :proto_id, BinStruct::Int16
53
59
  # @!attribute body
54
- # @return [BinStruct::String,Header::Base]
60
+ # SNAP header
61
+ # @return [BinStruct::String,Headerable]
55
62
  define_attr :body, BinStruct::String
56
63
  end
57
64
  self.add_class SNAP
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/lemontree55/packetgen for more informations
5
+ # See https://codeberg.org/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
7
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
8
8
  # This program is published under MIT license.
@@ -21,12 +21,18 @@ module PacketGen
21
21
  # Fixup IP header according to RFC 6762:
22
22
  # * set ethernet multicast address to +01:00:5E:00:00:FB+ (for IPv4)
23
23
  # or +33:33:00:00:00:FB+ (for IPv6),
24
- # * set IPv4 address to 224.0.0.251 or IPv6 address to ff02::fb.
24
+ # * set IPv4 address to +224.0.0.251+ or IPv6 address to +ff02::fb+.
25
25
  # This method may be called as:
26
26
  # # first way
27
27
  # pkt.mdns.mdnsize
28
28
  # # second way
29
- # pkt.mdnsize
29
+ # pkt.
30
+ # @example
31
+ # pkt = PacketGen.gen('Eth').add('IP').add('UDP').add('MDNS')
32
+ # pkt.mdnsize
33
+ # pkt.eth.dst #=> "01:00:5e:00:00:fb"
34
+ # pkt.ip.dst #=> "224.0.0.251"
35
+ # @return [void]
30
36
  def mdnsize
31
37
  iph = ip_header(self)
32
38
  case iph
@@ -42,6 +48,7 @@ module PacketGen
42
48
  # @api private
43
49
  # @note This method is used internally by PacketGen and should not be
44
50
  # directly called
51
+ # Add +#mdnsize+ method to +packet+. This method calls {#mdnsize}.
45
52
  # @since 2.7.0 Set UDP sport according to bindings, only if sport is 0.
46
53
  # Needed by new bind API.
47
54
  def added_to_packet(packet)
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
4
+ # See https://codeberg.org/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
6
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
7
  # This program is published under MIT license.
8
8
 
9
9
  module PacketGen
10
10
  module Header
11
- # This class supports MLDv1 (RFC 2710).
11
+ # This class supports Multicast Listener Discovery for IPv6 (RFC 2710).
12
12
  #
13
13
  # From RFC 2710, a MLD header has the following format:
14
14
  # 0 1 2 3
@@ -26,23 +26,24 @@ module PacketGen
26
26
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
27
27
  #
28
28
  # A MLD header consists of:
29
- # * a {#max_resp_delay} field ({BinStruct::Int16} type),
30
- # * a {#reserved} field ({BinStruct::Int16} type),
29
+ # * a {#max_resp_delay} field (+BinStruct::Int16+ type),
30
+ # * a {#reserved} field (+BinStruct::Int16+ type),
31
31
  # * a {#mcast_addr} field ({Header::IPv6::Addr} type),
32
32
  # * and a {#body} (unused for MLDv1).
33
33
  #
34
- # == Create a MLD header
34
+ # @example Create a MLD header
35
35
  # # standalone
36
36
  # mld = PacketGen::Header::MLD.new
37
37
  # # in a packet
38
38
  # pkt = PacketGen.gen('IPv6').add('ICMPv6').add('MLD')
39
39
  # # access to MLD header
40
- # pkt.mld # => PacketGen::Header::MLD
40
+ # pkt.mld.class # => PacketGen::Header::MLD
41
41
  #
42
- # == MLD attributes
43
- # pkt.icmpv6.type = 130 # ICMPv6 type 130 is MLD Multicast Listener Query
42
+ # @example MLD attributes
43
+ # pkt = PacketGen.gen('IPv6').add('ICMPv6').add('MLD')
44
+ # pkt.icmpv6.type = 130 # ICMPv6 type 130 is MLD Multicast Listener Query
44
45
  # pkt.mld.max_resp_delay = 20
45
- # pkt.mld.group_addr = '::'
46
+ # pkt.mld.mcast_addr = '::'
46
47
  # @author Sylvain Daubert
47
48
  # @since 2.4.0
48
49
  class MLD < Base
@@ -61,12 +62,13 @@ module PacketGen
61
62
  # @return [IPv6::Addr]
62
63
  define_attr :mcast_addr, IPv6::Addr, default: '::'
63
64
  # @!attribute body
64
- # @return [String,Base]
65
+ # @return [String,Headerable]
65
66
  define_attr :body, BinStruct::String
66
67
 
67
68
  # @api private
68
69
  # @note This method is used internally by PacketGen and should not be
69
70
  # directly called
71
+ # This method adds +#mldize+ method to +packet+. This method calls {#mldize}.
70
72
  def added_to_packet(packet)
71
73
  mld_idx = packet.headers.size
72
74
  packet.instance_eval "def mldize() @headers[#{mld_idx}].mldize; end" # def mldize() @headers[3].mldize; end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
4
+ # See https://codeberg.org/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
6
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
7
  # This program is published under MIT license.
@@ -81,14 +81,19 @@ module PacketGen
81
81
  define_attr :source_addr, IPv6::ArrayOfAddr,
82
82
  builder: ->(h, t) { t.new(counter: h[:number_of_sources]) }
83
83
  # @!attribute aux_data
84
+ # Auxiliary data
84
85
  # @return [String]
85
86
  define_attr :aux_data, BinStruct::String,
86
87
  builder: ->(h, t) { t.new(length_from: -> { h[:aux_data_len].to_i * 4 }) }
87
88
 
89
+ # Get human-readable type
90
+ # @return [String]
88
91
  def human_type
89
92
  self[:type].to_human
90
93
  end
91
94
 
95
+ # Get human-readable description
96
+ # @return [String]
92
97
  def to_human
93
98
  "#{human_type}(ma:#{multicast_addr}|src:#{source_addr.to_human})"
94
99
  end
@@ -99,7 +104,7 @@ module PacketGen
99
104
  class McastAddressRecords < BinStruct::Array
100
105
  set_of McastAddressRecord
101
106
 
102
- # Separator used in {#to_human}.
107
+ # Separator used in +#to_human+.
103
108
  HUMAN_SEPARATOR = ';'
104
109
  end
105
110
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
4
+ # See https://codeberg.org/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
6
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
7
  # This program is published under MIT license.
@@ -57,23 +57,23 @@ module PacketGen
57
57
  # * *
58
58
  # | |
59
59
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60
- # +type+, +code+ and +checksum+ are attributes.from {ICMPv6} header.
60
+ # +type+, +code+ and +checksum+ are attributes from {ICMPv6} header.
61
61
  #
62
- # MLQ attributes.are:
63
- # * {#max_resp_code #max_resp_code} ({BinStruct::Int16}),
64
- # * {#reserved #reserved} ({BinStruct::Int16}),
62
+ # MLQ attributes are:
63
+ # * {#max_resp_code #max_resp_code} (+BinStruct::Int16+),
64
+ # * {#reserved #reserved} (+BinStruct::Int16+),
65
65
  # * {#mcast_addr #mcast_addr} ({IPv6::Addr}),
66
- # * {#flags} ({BinStruct::Int8}), with sub-fields:
66
+ # * {#flags} (+BinStruct::Int8+), with sub-fields:
67
67
  # * a 4-bit {#flag_resv} field,
68
68
  # * a 1-bit {#flag_s} boolean,
69
69
  # * a 3-bit {#flag_qrv} field,
70
- # * {#qqic} ({BinStruct::Int8}),
71
- # * {#number_of_sources} ({BinStruct::Int16}),
70
+ # * {#qqic} (+BinStruct::Int8+),
71
+ # * {#number_of_sources} (+BinStruct::Int16+),
72
72
  # * and {#source_addr}, a {IPv6::ArrayOfAddr}.
73
73
  #
74
74
  # == Max Resp Delay
75
75
  # Max Resp Delay is the real delay value. Max Resp Code is the encoded
76
- # delay. So {#max_resp_delay} and {#max_resp_code} attributes reflect this
76
+ # delay. So {#max_resp_delay} and {#max_resp_code #max_resp_code} attributes reflect this
77
77
  # difference.
78
78
  # @author Sylvain Daubert
79
79
  class MLQ < MLD
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
4
+ # See https://codeberg.org/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
6
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
7
  # This program is published under MIT license.
@@ -38,11 +38,11 @@ module PacketGen
38
38
  # . .
39
39
  # | |
40
40
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
41
- # +type+, +code+ and +checksum+ are attributes.from {ICMPv6} header.
41
+ # +type+, +code+ and +checksum+ are attributes from {ICMPv6} header.
42
42
  #
43
- # MLR attributes.are:
44
- # * {#reserved} ({BinStruct::Int16}),
45
- # * {#number_of_mar} (number of mcast address records, {BinStruct::Int16}),
43
+ # MLR attributes are:
44
+ # * {#reserved} (+BinStruct::Int16+),
45
+ # * {#number_of_mar} (number of mcast address records, +BinStruct::Int16+),
46
46
  # * {#records} ({McastAddressRecords}).
47
47
  # @author Sylvain Daubert
48
48
  class MLR < Base
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
4
+ # See https://codeberg.org/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
6
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
7
  # This program is published under MIT license.
8
8
 
9
9
  module PacketGen
10
10
  module Header
11
- # This module contains all MLDv2 specific classes.
11
+ # This module contains all Multicast Listener Discovery Version 2 (MLDv2) specific classes.
12
12
  # @author Sylvain Daubert
13
13
  # @since 2.4.0
14
14
  module MLDv2
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
4
+ # See https://codeberg.org/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
6
  # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
7
  # This program is published under MIT license.
@@ -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 ({BinStruct::Int16}),
35
- # * a 8-bit {#options} field ({BinStruct::Int8}),
36
- # * a 8-bit {#flags} field ({BinStruct::Int8}). Supported flags are:
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 ({BinStruct::Int32}),
40
+ # * a 32-bit {#sequence_number} field (+BinStruct::Int32+),
41
41
  # * and an array of {LSAHeader LSAHeaders} ({#lsas}, {ArrayOfLSA}).
42
42
  #
43
- # == Create a DbDescription payload
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', src: source_ip).add('OSPFv2').add('OSPFv2::DbDescription')
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
- # == DbDescription attributes
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,8 +59,6 @@ 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