packetgen 2.6.0 → 2.7.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 (134) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +28 -0
  4. data/Rakefile +6 -6
  5. data/bin/pgconsole +6 -6
  6. data/lib/packetgen.rb +4 -3
  7. data/lib/packetgen/capture.rb +5 -7
  8. data/lib/packetgen/config.rb +3 -3
  9. data/lib/packetgen/deprecation.rb +17 -0
  10. data/lib/packetgen/header.rb +40 -38
  11. data/lib/packetgen/header/arp.rb +46 -31
  12. data/lib/packetgen/header/asn1_base.rb +8 -8
  13. data/lib/packetgen/header/base.rb +108 -36
  14. data/lib/packetgen/header/bootp.rb +28 -19
  15. data/lib/packetgen/header/crypto.rb +6 -8
  16. data/lib/packetgen/header/dhcp.rb +4 -5
  17. data/lib/packetgen/header/dhcp/option.rb +46 -34
  18. data/lib/packetgen/header/dhcp/options.rb +0 -1
  19. data/lib/packetgen/header/dhcpv6.rb +10 -10
  20. data/lib/packetgen/header/dhcpv6/duid.rb +2 -3
  21. data/lib/packetgen/header/dhcpv6/option.rb +16 -21
  22. data/lib/packetgen/header/dhcpv6/relay.rb +6 -4
  23. data/lib/packetgen/header/dns.rb +13 -11
  24. data/lib/packetgen/header/dns/name.rb +4 -6
  25. data/lib/packetgen/header/dns/opt.rb +31 -31
  26. data/lib/packetgen/header/dns/option.rb +0 -2
  27. data/lib/packetgen/header/dns/qdsection.rb +1 -2
  28. data/lib/packetgen/header/dns/question.rb +19 -13
  29. data/lib/packetgen/header/dns/rr.rb +11 -14
  30. data/lib/packetgen/header/dns/rrsection.rb +5 -7
  31. data/lib/packetgen/header/dot11.rb +45 -29
  32. data/lib/packetgen/header/dot11/control.rb +3 -5
  33. data/lib/packetgen/header/dot11/data.rb +34 -6
  34. data/lib/packetgen/header/dot11/element.rb +0 -1
  35. data/lib/packetgen/header/dot11/management.rb +9 -5
  36. data/lib/packetgen/header/dot11/sub_mngt.rb +13 -14
  37. data/lib/packetgen/header/dot1q.rb +2 -2
  38. data/lib/packetgen/header/dot1x.rb +3 -4
  39. data/lib/packetgen/header/eap.rb +62 -53
  40. data/lib/packetgen/header/eap/fast.rb +0 -1
  41. data/lib/packetgen/header/eap/md5.rb +1 -2
  42. data/lib/packetgen/header/eap/tls.rb +9 -10
  43. data/lib/packetgen/header/eap/ttls.rb +9 -10
  44. data/lib/packetgen/header/esp.rb +33 -33
  45. data/lib/packetgen/header/eth.rb +11 -8
  46. data/lib/packetgen/header/gre.rb +5 -6
  47. data/lib/packetgen/header/http/headers.rb +11 -14
  48. data/lib/packetgen/header/http/request.rb +20 -20
  49. data/lib/packetgen/header/http/response.rb +16 -18
  50. data/lib/packetgen/header/http/verbs.rb +5 -5
  51. data/lib/packetgen/header/icmp.rb +1 -3
  52. data/lib/packetgen/header/icmpv6.rb +1 -3
  53. data/lib/packetgen/header/igmp.rb +5 -6
  54. data/lib/packetgen/header/igmpv3.rb +5 -9
  55. data/lib/packetgen/header/igmpv3/group_record.rb +4 -5
  56. data/lib/packetgen/header/igmpv3/mq.rb +2 -2
  57. data/lib/packetgen/header/igmpv3/mr.rb +4 -3
  58. data/lib/packetgen/header/ike.rb +33 -8
  59. data/lib/packetgen/header/ike/auth.rb +4 -6
  60. data/lib/packetgen/header/ike/cert.rb +0 -2
  61. data/lib/packetgen/header/ike/certreq.rb +1 -3
  62. data/lib/packetgen/header/ike/id.rb +1 -3
  63. data/lib/packetgen/header/ike/ke.rb +0 -2
  64. data/lib/packetgen/header/ike/nonce.rb +0 -2
  65. data/lib/packetgen/header/ike/notify.rb +22 -24
  66. data/lib/packetgen/header/ike/payload.rb +198 -199
  67. data/lib/packetgen/header/ike/sa.rb +21 -30
  68. data/lib/packetgen/header/ike/sk.rb +16 -17
  69. data/lib/packetgen/header/ike/ts.rb +22 -24
  70. data/lib/packetgen/header/ike/vendor_id.rb +0 -2
  71. data/lib/packetgen/header/ip.rb +30 -23
  72. data/lib/packetgen/header/ip/addr.rb +5 -6
  73. data/lib/packetgen/header/ip/option.rb +11 -15
  74. data/lib/packetgen/header/ip/options.rb +1 -2
  75. data/lib/packetgen/header/ipv6.rb +27 -12
  76. data/lib/packetgen/header/ipv6/addr.rb +2 -2
  77. data/lib/packetgen/header/ipv6/extension.rb +1 -1
  78. data/lib/packetgen/header/ipv6/hop_by_hop.rb +11 -11
  79. data/lib/packetgen/header/llc.rb +4 -3
  80. data/lib/packetgen/header/mdns.rb +11 -5
  81. data/lib/packetgen/header/mld.rb +4 -4
  82. data/lib/packetgen/header/mldv2.rb +4 -3
  83. data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -4
  84. data/lib/packetgen/header/mldv2/mlq.rb +3 -4
  85. data/lib/packetgen/header/mldv2/mlr.rb +4 -3
  86. data/lib/packetgen/header/netbios.rb +18 -5
  87. data/lib/packetgen/header/ospfv2.rb +6 -7
  88. data/lib/packetgen/header/ospfv2/db_description.rb +3 -4
  89. data/lib/packetgen/header/ospfv2/hello.rb +2 -3
  90. data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -3
  91. data/lib/packetgen/header/ospfv2/ls_request.rb +2 -3
  92. data/lib/packetgen/header/ospfv2/ls_update.rb +5 -6
  93. data/lib/packetgen/header/ospfv2/lsa.rb +13 -14
  94. data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -5
  95. data/lib/packetgen/header/ospfv3.rb +3 -4
  96. data/lib/packetgen/header/ospfv3/db_description.rb +3 -5
  97. data/lib/packetgen/header/ospfv3/hello.rb +2 -3
  98. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -8
  99. data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -3
  100. data/lib/packetgen/header/ospfv3/ls_request.rb +2 -3
  101. data/lib/packetgen/header/ospfv3/ls_update.rb +5 -6
  102. data/lib/packetgen/header/ospfv3/lsa.rb +10 -11
  103. data/lib/packetgen/header/ospfv3/lsa_header.rb +3 -4
  104. data/lib/packetgen/header/snmp.rb +45 -32
  105. data/lib/packetgen/header/tcp.rb +13 -9
  106. data/lib/packetgen/header/tcp/option.rb +16 -11
  107. data/lib/packetgen/header/tcp/options.rb +3 -4
  108. data/lib/packetgen/header/tftp.rb +15 -17
  109. data/lib/packetgen/header/udp.rb +10 -4
  110. data/lib/packetgen/inspect.rb +7 -9
  111. data/lib/packetgen/packet.rb +44 -22
  112. data/lib/packetgen/pcapng.rb +1 -5
  113. data/lib/packetgen/pcapng/block.rb +17 -11
  114. data/lib/packetgen/pcapng/epb.rb +6 -11
  115. data/lib/packetgen/pcapng/file.rb +37 -44
  116. data/lib/packetgen/pcapng/idb.rb +17 -22
  117. data/lib/packetgen/pcapng/shb.rb +7 -10
  118. data/lib/packetgen/pcapng/spb.rb +21 -17
  119. data/lib/packetgen/pcapng/unknown_block.rb +17 -13
  120. data/lib/packetgen/proto.rb +1 -2
  121. data/lib/packetgen/types/array.rb +119 -34
  122. data/lib/packetgen/types/cstring.rb +1 -5
  123. data/lib/packetgen/types/enum.rb +8 -10
  124. data/lib/packetgen/types/fields.rb +34 -28
  125. data/lib/packetgen/types/int.rb +11 -13
  126. data/lib/packetgen/types/int_string.rb +6 -8
  127. data/lib/packetgen/types/oui.rb +3 -6
  128. data/lib/packetgen/types/string.rb +4 -6
  129. data/lib/packetgen/types/tlv.rb +11 -14
  130. data/lib/packetgen/utils.rb +15 -23
  131. data/lib/packetgen/utils/arp_spoofer.rb +12 -18
  132. data/lib/packetgen/version.rb +1 -1
  133. data/packetgen.gemspec +9 -8
  134. metadata +19 -17
@@ -8,21 +8,20 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class IP
11
-
12
11
  # IP address, as a group of 4 bytes
13
12
  # @author Sylvain Daubert
14
13
  class Addr < Types::Fields
15
14
  # @!attribute a1
16
- # @return [Integer] IP address first byte
15
+ # @return [Integer] IP address first byte
17
16
  define_field :a1, Types::Int8
18
17
  # @!attribute a2
19
- # @return [Integer] IP address seconf byte
18
+ # @return [Integer] IP address seconf byte
20
19
  define_field :a2, Types::Int8
21
20
  # @!attribute a3
22
- # @return [Integer] IP address third byte
21
+ # @return [Integer] IP address third byte
23
22
  define_field :a3, Types::Int8
24
23
  # @!attribute a4
25
- # @return [Integer] IP address fourth byte
24
+ # @return [Integer] IP address fourth byte
26
25
  define_field :a4, Types::Int8
27
26
 
28
27
  IPV4_ADDR_REGEX = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
@@ -45,7 +44,7 @@ module PacketGen
45
44
  # Addr in human readable form (dotted format)
46
45
  # @return [String]
47
46
  def to_human
48
- fields.map { |f| "#{self[f].to_i}" }.join('.')
47
+ fields.map { |f| self[f].to_i.to_s }.join('.')
49
48
  end
50
49
 
51
50
  # Addr as an integer
@@ -8,12 +8,11 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class IP
11
-
12
11
  # Class to handle series of IP addresses
13
12
  # @author Sylvain Daubert
14
13
  class ArrayOfAddr < Types::Array
15
14
  set_of IP::Addr
16
-
15
+
17
16
  # Push a IP address to the array
18
17
  # @param [String,Addr] addr
19
18
  # @return [self]
@@ -27,7 +26,6 @@ module PacketGen
27
26
  # Base class for IP options
28
27
  # @author Sylvain Daubert
29
28
  class Option < Types::Fields
30
-
31
29
  # EOL option type
32
30
  EOL_TYPE = 0x00
33
31
  # NOP option type
@@ -55,7 +53,7 @@ module PacketGen
55
53
  # option data
56
54
  # @return [String]
57
55
  define_field :data, Types::String, optional: ->(h) { h.length > 2 },
58
- builder: ->(h,t) { t.new(length_from: ->() { h.length - 2 }) }
56
+ builder: ->(h, t) { t.new(length_from: -> { h.length - 2 }) }
59
57
 
60
58
  # @!attribute copied
61
59
  # 1-bit copied flag from {#type} field
@@ -94,9 +92,7 @@ module PacketGen
94
92
  # Get binary string. Set {#length} field.
95
93
  # @return [String]
96
94
  def to_s
97
- if respond_to? :length
98
- self.length = super.size
99
- end
95
+ self.length = super.size if respond_to? :length
100
96
  super
101
97
  end
102
98
 
@@ -104,7 +100,7 @@ module PacketGen
104
100
  # @return [String]
105
101
  def to_human
106
102
  str = self.class == Option ? "unk-#{type}" : self.class.to_s.sub(/.*::/, '')
107
- if respond_to?(:length) and length > 2 and self[:data].to_s.size > 0
103
+ if respond_to?(:length) && (length > 2) && !self[:data].to_s.empty?
108
104
  str << ":#{self[:data].to_s.inspect}"
109
105
  end
110
106
  str
@@ -122,12 +118,12 @@ module PacketGen
122
118
  # No OPeration IP option
123
119
  class NOP < EOL
124
120
  end
125
-
121
+
126
122
  # Loose Source and Record Route IP option
127
123
  class LSRR < Option
128
124
  delete_field :data
129
125
  undef data
130
-
126
+
131
127
  # @!attribute pointer
132
128
  # 8-bit pointer on next address
133
129
  # @return [Integer]
@@ -136,7 +132,7 @@ module PacketGen
136
132
  # Array of IP addresses
137
133
  # @return [Types::Array<IP::Addr>]
138
134
  define_field :data, ArrayOfAddr,
139
- builder: ->(h,t) { t.new(length_from: ->() { h.length - 2 }) }
135
+ builder: ->(h, t) { t.new(length_from: -> { h.length - 2 }) }
140
136
 
141
137
  # Populate object from a binary string
142
138
  # @param [String] str
@@ -156,7 +152,7 @@ module PacketGen
156
152
  def pointed_addr
157
153
  data[pointer / 4 - 1]
158
154
  end
159
-
155
+
160
156
  # Get a human readable string
161
157
  # @return [String]
162
158
  def to_human
@@ -174,18 +170,18 @@ module PacketGen
174
170
  class SI < Option
175
171
  delete_field :data
176
172
  undef data
177
-
173
+
178
174
  # @!attribute id
179
175
  # 16-bit stream ID
180
176
  # @return [Integer]
181
177
  define_field :id, Types::Int16
182
178
  end
183
-
179
+
184
180
  # Router Alert IP option
185
181
  class RA < Option
186
182
  delete_field :data
187
183
  undef data
188
-
184
+
189
185
  # @!attribute value
190
186
  # 16-bit value. Should be 0.
191
187
  # @return [Integer]
@@ -8,12 +8,11 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class IP
11
-
12
11
  # Class to handle IP options
13
12
  # @author Sylvain Daubert
14
13
  class Options < Types::Array
15
14
  set_of Option
16
-
15
+
17
16
  HUMAN_SEPARATOR = ';'
18
17
 
19
18
  # Read IP header options from a string
@@ -5,11 +5,11 @@
5
5
  # This program is published under MIT license.
6
6
 
7
7
  # frozen_string_literal: true
8
+
8
9
  require 'ipaddr'
9
10
 
10
11
  module PacketGen
11
12
  module Header
12
-
13
13
  # A IPv6 header consists of:
14
14
  # * a first 32-bit word ({#u32}, of {Types::Int32} type) composoed of:
15
15
  # * a 4-bit {#version} field,
@@ -45,7 +45,7 @@ module PacketGen
45
45
  # ipv6.dst = '2001:1234:5678:abcd::123'
46
46
  # ipv6.body.read 'this is a body'
47
47
  # @author Sylvain Daubert
48
- class IPv6 < Base;end
48
+ class IPv6 < Base; end
49
49
 
50
50
  require_relative 'ipv6/addr'
51
51
 
@@ -103,7 +103,7 @@ module PacketGen
103
103
  self[:dst].to_a.each { |word| sum += word.to_i }
104
104
  sum
105
105
  end
106
-
106
+
107
107
  # Send IPv6 packet on wire.
108
108
  #
109
109
  # When sending packet at IPv6 level, +version+, +flow_label+ and +length+
@@ -158,14 +158,22 @@ module PacketGen
158
158
  def parse?
159
159
  version == 6
160
160
  end
161
+
162
+ # Invert source and destination addresses
163
+ # @return [self]
164
+ # @since 2.7.0
165
+ def reply!
166
+ self[:src], self[:dst] = self[:dst], self[:src]
167
+ self
168
+ end
161
169
  end
162
170
 
163
171
  self.add_class IPv6
164
172
 
165
- Eth.bind_header IPv6, ethertype: IPv6::ETHERTYPE
166
- SNAP.bind_header IPv6, proto_id: IPv6::ETHERTYPE
167
- Dot1q.bind_header IPv6, ethertype: IPv6::ETHERTYPE
168
- IP.bind_header IPv6, protocol: 41 # 6to4
173
+ Eth.bind IPv6, ethertype: IPv6::ETHERTYPE
174
+ SNAP.bind IPv6, proto_id: IPv6::ETHERTYPE
175
+ Dot1q.bind IPv6, ethertype: IPv6::ETHERTYPE
176
+ IP.bind IPv6, protocol: 41 # 6to4
169
177
  end
170
178
  end
171
179
 
@@ -175,16 +183,23 @@ module PacketGen
175
183
  module Header
176
184
  class IPv6
177
185
  class << self
178
- alias old_bind_header bind_header
186
+ alias old_bind bind
179
187
 
180
188
  # Bind a upper header to IPv6 and its defined extension headers.
181
- # @see Base.bind_header
182
- def bind_header(header_klass, args={})
183
- IPv6.old_bind_header header_klass, args
189
+ # @see Base.bind
190
+ def bind(header_klass, args={})
191
+ IPv6.old_bind header_klass, args
184
192
  [IPv6::HopByHop].each do |klass|
185
- klass.bind_header header_klass, args
193
+ klass.bind header_klass, args
186
194
  end
187
195
  end
196
+ # Bind a upper header to IPv6 and its defined extension headers.
197
+ # @see Base.bind_header
198
+ # @deprecated USe {bind}.
199
+ def bind_header(header_klass, args={})
200
+ Deprecation.deprecated(self, __method__, 'bind', klass_method: true)
201
+ bind header_klass, args
202
+ end
188
203
  end
189
204
  end
190
205
  end
@@ -5,6 +5,7 @@
5
5
  # This program is published under MIT license.
6
6
 
7
7
  # frozen_string_literal: true
8
+
8
9
  require 'ipaddr'
9
10
 
10
11
  module PacketGen
@@ -13,7 +14,6 @@ module PacketGen
13
14
  # IPv6 address, as a group of 8 2-byte words
14
15
  # @author Sylvain Daubert
15
16
  class Addr < Types::Fields
16
-
17
17
  # @!attribute a1
18
18
  # 1st 2-byte word of IPv6 address
19
19
  # @return [Integer]
@@ -89,7 +89,7 @@ module PacketGen
89
89
  # @author Sylvain Daubert
90
90
  class ArrayOfAddr < Types::Array
91
91
  set_of IPv6::Addr
92
-
92
+
93
93
  # Push a IPv6 address to the array
94
94
  # @param [String,Addr] addr
95
95
  # @return [self]
@@ -43,7 +43,7 @@ module PacketGen
43
43
  # Specific options of extension header
44
44
  # @return [String]
45
45
  define_field :options, Types::String,
46
- builder: ->(h, t) { t.new(length_from: ->() { h.real_length }) }
46
+ builder: ->(h, t) { t.new(length_from: -> { h.real_length }) }
47
47
  # @!attribute body
48
48
  # @return [String,Base]
49
49
  define_field :body, Types::String
@@ -15,7 +15,7 @@ module PacketGen
15
15
  TYPES = {
16
16
  1 => 'padn',
17
17
  5 => 'router_alert'
18
- }
18
+ }.freeze
19
19
 
20
20
  # @return [String]
21
21
  def to_human
@@ -27,7 +27,7 @@ module PacketGen
27
27
  end
28
28
  end
29
29
  end
30
-
30
+
31
31
  # Special option pad1, for {HopByHop} IPv6 extension header
32
32
  # @author Sylvain Daubert
33
33
  class Pad1 < Types::Fields
@@ -40,7 +40,7 @@ module PacketGen
40
40
  'pad1'
41
41
  end
42
42
  end
43
-
43
+
44
44
  # Array of {Option}, for {HopByHop} IPv6 extension header
45
45
  # @author Sylvain Daubert
46
46
  class Options < Types::Array
@@ -54,11 +54,9 @@ module PacketGen
54
54
  return self if str.nil?
55
55
  force_binary str
56
56
  klass = self.class.class_eval { @klass }
57
- while str.length > 0
57
+ until str.empty?
58
58
  obj = klass.new.read(str)
59
- if obj.type == 0
60
- obj = Pad1.new.read(str)
61
- end
59
+ obj = Pad1.new.read(str) if obj.type.zero?
62
60
  self.push obj
63
61
  str.slice!(0, obj.sz)
64
62
  end
@@ -69,16 +67,18 @@ module PacketGen
69
67
  # @return [String]
70
68
  def to_s
71
69
  str = super
72
- case str.size % 8
70
+ case (str.size + 2) % 8
73
71
  when 0
74
72
  return str
75
73
  when 7
76
74
  # only on byte needed: use pad1 option
75
+ self << Pad1.new
77
76
  str << [0].pack('C')
78
77
  else
79
78
  # use padn option
80
- len = 8 - (str.size % 8) - 4
79
+ len = 8 - 2 - (str.size % 8) - 2
81
80
  padn = Option.new(type: 'padn', value: "\x00" * len)
81
+ self << padn
82
82
  str << padn.to_s
83
83
  end
84
84
  str
@@ -127,8 +127,8 @@ module PacketGen
127
127
  end
128
128
  end
129
129
  end
130
-
130
+
131
131
  self.add_class IPv6::HopByHop
132
- IPv6.bind_header IPv6::HopByHop, next: 0
132
+ IPv6.bind IPv6::HopByHop, next: 0
133
133
  end
134
134
  end
@@ -8,7 +8,6 @@
8
8
 
9
9
  module PacketGen
10
10
  module Header
11
-
12
11
  # Logical-Link Control header
13
12
  #
14
13
  # A LLC header consists of:
@@ -17,6 +16,7 @@ module PacketGen
17
16
  # * a {#control} ({Types::Int8}),
18
17
  # * and a {#body} (a {Types::String} or another {Base} class).
19
18
  # @author Sylvain Daubert
19
+ # @since 1.4.0
20
20
  class LLC < Base
21
21
  # @!attribute dsap
22
22
  # @return [Integer] 8-bit dsap value
@@ -32,7 +32,7 @@ module PacketGen
32
32
  define_field :body, Types::String
33
33
  end
34
34
  self.add_class LLC
35
- Dot11::Data.bind_header LLC, op: :and, type: 2, :wep? => false
35
+ Dot11::Data.bind LLC, type: 2, wep?: false
36
36
 
37
37
  # Sub-Network Access Protocol
38
38
  #
@@ -41,6 +41,7 @@ module PacketGen
41
41
  # * a {#proto_id} ({Types::Int16}),
42
42
  # * and a {#body} (a {Types::String} or another {Base} class).
43
43
  # @author Sylvain Daubert
44
+ # @since 1.4.0
44
45
  class SNAP < Base
45
46
  # @!attribute oui
46
47
  # @return [Types::OUI]
@@ -53,6 +54,6 @@ module PacketGen
53
54
  define_field :body, Types::String
54
55
  end
55
56
  self.add_class SNAP
56
- LLC.bind_header SNAP, op: :and, dsap: 170, ssap: 170, control: 3
57
+ LLC.bind SNAP, dsap: 170, ssap: 170, control: 3
57
58
  end
58
59
  end
@@ -8,15 +8,15 @@
8
8
 
9
9
  module PacketGen
10
10
  module Header
11
-
12
11
  # Multicast DNS.
13
12
  #
14
13
  # See {DNS} for header format.
14
+ # @since 2.6.0
15
15
  # @author Sylvain Daubert
16
16
  class MDNS < DNS
17
17
  # Port number for mDNS over UDP
18
18
  UDP_PORT = 5353
19
-
19
+
20
20
  # Fixup IP header according to RFC 6762:
21
21
  # * set ethernet multicast address to +01:00:5E:00:00:FB+ (for IPv4)
22
22
  # or +33:33:00:00:00:FB+ (for IPv6),
@@ -59,17 +59,23 @@ module PacketGen
59
59
  mac.from_human('33:33:00:00:00:FB')
60
60
  end
61
61
  end
62
-
62
+
63
63
  # @api private
64
64
  # @note This method is used internally by PacketGen and should not be
65
65
  # directly called
66
+ # @since 2.7.0 Set UDP sport according to bindings, only if sport is 0.
67
+ # Needed by new bind API.
66
68
  def added_to_packet(packet)
67
69
  mdns_idx = packet.headers.size
68
70
  packet.instance_eval "def mdnsize() @headers[#{mdns_idx}].mdnsize; end"
71
+ return unless packet.is? 'UDP'
72
+ return unless packet.udp.sport.zero?
73
+ packet.udp.sport = UDP_PORT
69
74
  end
70
75
  end
71
-
76
+
72
77
  self.add_class MDNS
73
- UDP.bind_header MDNS, dport: MDNS::UDP_PORT, sport: MDNS::UDP_PORT
78
+ UDP.bind MDNS, dport: MDNS::UDP_PORT
79
+ UDP.bind MDNS, sport: MDNS::UDP_PORT
74
80
  end
75
81
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # This class supports MLDv1 (RFC 2710).
12
11
  #
13
12
  # From RFC 2710, a MLD header has the following format:
@@ -44,6 +43,7 @@ module PacketGen
44
43
  # pkt.mld.max_resp_delay = 20
45
44
  # pkt.mld.group_addr = '::'
46
45
  # @author Sylvain Daubert
46
+ # @since 2.4.0
47
47
  class MLD < Base
48
48
  # @!attribute max_resp_delay
49
49
  # 16-bit MLD Max Response Delay
@@ -97,6 +97,6 @@ end
97
97
  require_relative 'mldv2'
98
98
 
99
99
  PacketGen::Header.add_class PacketGen::Header::MLD
100
- PacketGen::Header::ICMPv6.bind_header PacketGen::Header::MLD, type: 130
101
- PacketGen::Header::ICMPv6.bind_header PacketGen::Header::MLD, type: 131
102
- PacketGen::Header::ICMPv6.bind_header PacketGen::Header::MLD, type: 132
100
+ PacketGen::Header::ICMPv6.bind PacketGen::Header::MLD, type: 130
101
+ PacketGen::Header::ICMPv6.bind PacketGen::Header::MLD, type: 131
102
+ PacketGen::Header::ICMPv6.bind PacketGen::Header::MLD, type: 132