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
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # This class supports OSPFv3 (RFC 5340).
12
11
  # A OSPFv3 header has the following format:
13
12
  #
@@ -63,11 +62,11 @@ module PacketGen
63
62
  # * {OSPFv3::LSUpdate},
64
63
  # * or {OSPFv3::LSAck}.
65
64
  # @author Sylvain Daubert
65
+ # @since 2.5.0
66
66
  class OSPFv3 < Base
67
-
68
67
  # IP protocol number for OSPF
69
68
  IP_PROTOCOL = OSPFv2::IP_PROTOCOL
70
-
69
+
71
70
  # OSPF packet types
72
71
  TYPES = OSPFv2::TYPES
73
72
 
@@ -202,7 +201,7 @@ module PacketGen
202
201
  end
203
202
 
204
203
  self.add_class OSPFv3
205
- IPv6.bind_header OSPFv3, next: OSPFv3::IP_PROTOCOL
204
+ IPv6.bind OSPFv3, next: OSPFv3::IP_PROTOCOL
206
205
  end
207
206
  end
208
207
 
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv3
11
-
12
11
  # This class handles {OSPFv3 OSPFv3} DB description packets payload.
13
12
  # The DB description payload has the following format:
14
13
  # 0 1 2 3
@@ -65,7 +64,6 @@ module PacketGen
65
64
  # dbd.lsas << existing_lsa.to_lsa_header
66
65
  # @author Sylvain Daubert
67
66
  class DbDescription < Base
68
-
69
67
  # @!attribute reserved
70
68
  # 8-bit zero field before {#options} one
71
69
  # @return [Integer]
@@ -100,15 +98,15 @@ module PacketGen
100
98
  define_field :sequence_number, Types::Int32
101
99
  alias seqnum sequence_number
102
100
  alias seqnum= sequence_number=
103
-
101
+
104
102
  # @!attribute lsas
105
103
  # Array of LSA headers
106
104
  # @return [ArrayOfLSAHeader]
107
- define_field :lsas, ArrayOfLSA, builder: ->(h,t) { t.new(only_headers: true) }
105
+ define_field :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
108
106
  end
109
107
  end
110
108
 
111
109
  self.add_class OSPFv3::DbDescription
112
- OSPFv3.bind_header OSPFv3::DbDescription, type: OSPFv3::TYPES['DB_DESCRIPTION']
110
+ OSPFv3.bind OSPFv3::DbDescription, type: OSPFv3::TYPES['DB_DESCRIPTION']
113
111
  end
114
112
  end
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv3
11
-
12
11
  # This class handles {OSPFv3 OSPFv3} HELLO packets payload. The HELLO
13
12
  # payload has the following format:
14
13
  # 0 1 2 3
@@ -97,8 +96,8 @@ module PacketGen
97
96
  define_field :neighbors, IP::ArrayOfAddr
98
97
  end
99
98
  end
100
-
99
+
101
100
  self.add_class OSPFv3::Hello
102
- OSPFv3.bind_header OSPFv3::Hello, type: OSPFv3::TYPES['HELLO']
101
+ OSPFv3.bind OSPFv3::Hello, type: OSPFv3::TYPES['HELLO']
103
102
  end
104
103
  end
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv3
11
-
12
11
  # Array of 32-bit words.
13
12
  # @author Sylvain Daubert
14
13
  class ArrayOfInt32 < Types::Array
@@ -64,13 +63,13 @@ module PacketGen
64
63
  # @return [String]
65
64
  def to_human
66
65
  ary = prefix.map(&:to_i).map do |v|
67
- "#{((v>>16) & 0xffff).to_s(16)}:#{(v & 0xffff).to_s(16)}"
66
+ "#{((v >> 16) & 0xffff).to_s(16)}:#{(v & 0xffff).to_s(16)}"
68
67
  end
69
68
  pfx = ary.join(':')
70
- pfx += '::' if prefix.size < (128/32)
71
- "#{IPAddr.new(pfx).to_s}/#{length}"
69
+ pfx += '::' if prefix.size < (128 / 32)
70
+ "#{IPAddr.new(pfx)}/#{length}"
72
71
  end
73
-
72
+
74
73
  # Set prefix from a human-readable string. This method cannot set
75
74
  # {#options} field.
76
75
  # @param [String] str
@@ -80,10 +79,10 @@ module PacketGen
80
79
  len = (len || 128).to_i
81
80
  addr = IPv6::Addr.new.from_human(pfx)
82
81
  ary_size = (len + 31) / 32
83
- ary = addr.to_a[0...ary_size*2]
82
+ ary = addr.to_a[0...ary_size * 2]
84
83
  self.prefix.clear
85
84
  ary.each_with_index do |v, i|
86
- if i % 2 == 0
85
+ if i.even?
87
86
  self.prefix << v
88
87
  else
89
88
  self.prefix.last.value = (self.prefix.last.to_i << 16) | v.to_i
@@ -92,7 +91,7 @@ module PacketGen
92
91
  self.length = len
93
92
  end
94
93
  end
95
-
94
+
96
95
  # Array of {IPv6Prefix}
97
96
  # @author Sylvain Daubert
98
97
  class ArrayOfIPv6Prefix < Types::Array
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv3
11
-
12
11
  # This class handles {OSPFv3 OSPFv3} Link State Acknownledgment packets
13
12
  # payload. The LSAck payload has the following format:
14
13
  # 0 1 2 3
@@ -41,11 +40,11 @@ module PacketGen
41
40
  # Array of {LSA LSAs}
42
41
  # @return [ArrayOfLSA]
43
42
  define_field :lsas, ArrayOfLSA,
44
- builder: ->(h, t) { t.new(only_headers: true) }
43
+ builder: ->(_h, t) { t.new(only_headers: true) }
45
44
  end
46
45
  end
47
46
 
48
47
  self.add_class OSPFv3::LSAck
49
- OSPFv3.bind_header OSPFv3::LSAck, type: OSPFv3::TYPES['LS_ACK']
48
+ OSPFv3.bind OSPFv3::LSAck, type: OSPFv3::TYPES['LS_ACK']
50
49
  end
51
50
  end
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv3
11
-
12
11
  # This class handle LSA requests, as used in {LSRequest} payloads.
13
12
  # The LSA request payload has the following format:
14
13
  # 0 1 2 3
@@ -57,7 +56,7 @@ module PacketGen
57
56
  "LSR<#{human_type},#{link_state_id},#{advertising_router}>"
58
57
  end
59
58
  end
60
-
59
+
61
60
  # This class defines a specialized {Types::Array array} to handle series
62
61
  # of {LSR LSRs}.
63
62
  # @author Sylvain Daubert
@@ -103,6 +102,6 @@ module PacketGen
103
102
  end
104
103
 
105
104
  self.add_class OSPFv3::LSRequest
106
- OSPFv3.bind_header OSPFv3::LSRequest, type: OSPFv3::TYPES['LS_REQUEST']
105
+ OSPFv3.bind OSPFv3::LSRequest, type: OSPFv3::TYPES['LS_REQUEST']
107
106
  end
108
107
  end
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv3
11
-
12
11
  # This class handles {OSPFv3 OSPFv3} Link State Update packets
13
12
  # payload. The LSU payload has the following format:
14
13
  # 0 1 2 3
@@ -54,21 +53,21 @@ module PacketGen
54
53
  # @return [ArrayOfLSA]
55
54
  define_field :lsas, ArrayOfLSA,
56
55
  builder: ->(h, t) { t.new(counter: h[:lsas_count]) }
57
-
56
+
58
57
  # Calculate checksums of all LSAs
59
58
  # @return [void]
60
59
  def calc_checksum
61
- lsas.each { |lsa| lsa.calc_checksum }
60
+ lsas.each(&:calc_checksum)
62
61
  end
63
-
62
+
64
63
  # Calculate length of all LSAs
65
64
  def calc_length
66
- lsas.each { |lsa| lsa.calc_length }
65
+ lsas.each(&:calc_length)
67
66
  end
68
67
  end
69
68
  end
70
69
 
71
70
  self.add_class OSPFv3::LSUpdate
72
- OSPFv3.bind_header OSPFv3::LSUpdate, type: OSPFv3::TYPES['LS_UPDATE']
71
+ OSPFv3.bind OSPFv3::LSUpdate, type: OSPFv3::TYPES['LS_UPDATE']
73
72
  end
74
73
  end
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv3
11
-
12
11
  # This class handles links in a {LSARouter OSPFv3 LSA router payload}.
13
12
  # @author Sylvain Daubert
14
13
  class Link < Types::Fields
@@ -53,7 +52,7 @@ module PacketGen
53
52
  # LSA body
54
53
  # @return [String]
55
54
  define_field :body, Types::String,
56
- builder: ->(h,t) { t.new(length_from: ->() { h.length - 20 }) }
55
+ builder: ->(h, t) { t.new(length_from: -> { h.length - 20 }) }
57
56
  end
58
57
 
59
58
  # This class handles OSPFv3 LSA Router payloads.
@@ -185,7 +184,7 @@ module PacketGen
185
184
  # @author Sylvain Daubert
186
185
  class ArrayOfLSA < Types::Array
187
186
  set_of LSA
188
-
187
+
189
188
  # @param [Hash] options
190
189
  # @option options [Types::Int] counter Int object used as a counter for this set
191
190
  # @option options [Boolean] only_headers if +true+, only {LSAHeader LSAHeaders}
@@ -201,17 +200,17 @@ module PacketGen
201
200
  def read(str)
202
201
  clear
203
202
  return self if str.nil?
204
- return self if @counter and @counter.to_i == 0
203
+ return self if @counter && @counter.to_i.zero?
205
204
  force_binary str
206
- while str.length > 0
205
+ until str.empty?
207
206
  lsa = LSAHeader.new.read(str)
208
- if !@only_headers
207
+ unless @only_headers
209
208
  klass = get_lsa_class_by_human_type(lsa.human_type)
210
209
  lsa = klass.new.read(str[0...lsa.length])
211
210
  end
212
211
  self.push lsa
213
212
  str.slice!(0, lsa.sz)
214
- break if @counter and self.size == @counter.to_i
213
+ break if @counter && (self.size == @counter.to_i)
215
214
  end
216
215
  self
217
216
  end
@@ -219,10 +218,10 @@ module PacketGen
219
218
  private
220
219
 
221
220
  def record_from_hash(hsh)
222
- unless hsh.has_key? :type
223
- raise ArgumentError, "hash should have :type key"
221
+ unless hsh.key? :type
222
+ raise ArgumentError, 'hash should have :type key'
224
223
  end
225
-
224
+
226
225
  klass = if @only_headers
227
226
  LSAHeader
228
227
  else
@@ -239,7 +238,7 @@ module PacketGen
239
238
  end
240
239
 
241
240
  def get_lsa_class_by_human_type(htype)
242
- klassname = "LSA#{htype.to_s.gsub(/-/, '')}"
241
+ klassname = "LSA#{htype.to_s.delete('-')}"
243
242
  if OSPFv3.const_defined? klassname
244
243
  OSPFv3.const_get klassname
245
244
  else
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv3
11
-
12
11
  # This class handles {OSPFv3 OSPFv3} LSA header. A LSA header has the
13
12
  # following format:
14
13
  # 0 1 2 3
@@ -40,7 +39,7 @@ module PacketGen
40
39
  'NSSA' => 0x2007,
41
40
  'Link' => 0x0008,
42
41
  'Intra-Area-Prefix' => 0x2009
43
- }
42
+ }.freeze
44
43
 
45
44
  # @!attribute age
46
45
  # The time in seconds since the LSA was originated.
@@ -73,7 +72,7 @@ module PacketGen
73
72
  # Length of the LSA, including the header.
74
73
  # @return [Integer]
75
74
  define_field :length, Types::Int16
76
-
75
+
77
76
  # Compute and set Fletcher-16 checksum on LSA
78
77
  # @return [Integer]
79
78
  def calc_checksum
@@ -87,7 +86,7 @@ module PacketGen
87
86
  end
88
87
  c0 %= 255
89
88
  c1 %= 255
90
-
89
+
91
90
  x = ((sz - 16 - 1) * c0 - c1) % 255
92
91
  x += 255 if x <= 0
93
92
  y = 255 * 2 - c0 - x
@@ -8,7 +8,6 @@
8
8
 
9
9
  module PacketGen
10
10
  module Header
11
-
12
11
  # Dissect error
13
12
  class DissectError < ParseError; end
14
13
 
@@ -18,7 +17,6 @@ module PacketGen
18
17
  # @author Sylvain Daubert
19
18
  # @since 2.0.0
20
19
  class SNMP < ASN1Base
21
-
22
20
  # Agents listen to this port
23
21
  UDP_PORT1 = 161
24
22
  # Configuration sinks listen to this port
@@ -34,26 +32,27 @@ module PacketGen
34
32
  PDU_TRAPv2 = 7
35
33
  PDU_REPORT = 8
36
34
 
37
- ERRORS = { 'no_error' => 0,
38
- 'too_big' => 1,
39
- 'no_such_name' => 2,
40
- 'bad_value' => 3,
41
- 'read_only' => 4,
42
- 'generic_error' => 5,
43
- 'no_access' => 6,
44
- 'wrong_type' => 7,
45
- 'wrong_length' => 8,
46
- 'wrong_encoding' => 9,
47
- 'wrong_value' => 10,
48
- 'no_creation' => 11,
49
- 'inconsistent_value' => 12,
50
- 'ressource_unavailable' => 13,
51
- 'commit_failed' => 14,
52
- 'undo_failed' => 15,
53
- 'authorization_error' => 16,
54
- 'not_writable' => 17,
55
- 'inconsistent_name' => 18
56
- }
35
+ ERRORS = {
36
+ 'no_error' => 0,
37
+ 'too_big' => 1,
38
+ 'no_such_name' => 2,
39
+ 'bad_value' => 3,
40
+ 'read_only' => 4,
41
+ 'generic_error' => 5,
42
+ 'no_access' => 6,
43
+ 'wrong_type' => 7,
44
+ 'wrong_length' => 8,
45
+ 'wrong_encoding' => 9,
46
+ 'wrong_value' => 10,
47
+ 'no_creation' => 11,
48
+ 'inconsistent_value' => 12,
49
+ 'ressource_unavailable' => 13,
50
+ 'commit_failed' => 14,
51
+ 'undo_failed' => 15,
52
+ 'authorization_error' => 16,
53
+ 'not_writable' => 17,
54
+ 'inconsistent_name' => 18
55
+ }.freeze
57
56
 
58
57
  # Class to handle SNMP VarBind
59
58
  # VarBind ::= SEQUENCE {
@@ -76,10 +75,10 @@ module PacketGen
76
75
 
77
76
  # Class to handle GetRequest PDU
78
77
  # GetRequest-PDU ::= [0] IMPLICIT PDU
79
- #
78
+ #
80
79
  # PDU ::= SEQUENCE {
81
80
  # request-id INTEGER (-214783648..214783647),
82
- #
81
+ #
83
82
  # error-status -- sometimes ignored
84
83
  # INTEGER {
85
84
  # noError(0),
@@ -102,10 +101,10 @@ module PacketGen
102
101
  # notWritable(17),
103
102
  # inconsistentName(18)
104
103
  # },
105
- #
104
+ #
106
105
  # error-index -- sometimes ignored
107
106
  # INTEGER (0..max-bindings),
108
- #
107
+ #
109
108
  # variable-bindings -- values are sometimes ignored
110
109
  # VarBindList
111
110
  # }
@@ -177,7 +176,7 @@ module PacketGen
177
176
 
178
177
  # Class to handle Bulk PDU
179
178
  # GetBulkRequest-PDU ::= [5] IMPLICIT BulkPDU
180
- #
179
+ #
181
180
  # BulkPDU ::= -- must be identical in
182
181
  # SEQUENCE { -- structure to PDU
183
182
  # request-id INTEGER (-214783648..214783647),
@@ -259,9 +258,8 @@ module PacketGen
259
258
  def initialize(options={})
260
259
  super
261
260
  data.chosen = options[:chosen_pdu] if options[:chosen_pdu]
262
- if options[:pdu]
263
- data.root.value[data.chosen] = data.root.chosen_value.class.new(options[:pdu])
264
- end
261
+ return unless options[:pdu]
262
+ data.root.value[data.chosen] = data.root.chosen_value.class.new(options[:pdu])
265
263
  end
266
264
 
267
265
  # accessor to data payload
@@ -298,10 +296,25 @@ module PacketGen
298
296
  str
299
297
  end
300
298
  end
299
+
300
+ # @api private
301
+ # @note This method is used internally by PacketGen and should not be
302
+ # directly called
303
+ # @param [Packet] packet
304
+ # @return [void]
305
+ # @since 2.7.0 Set UDP sport according to bindings, only if sport is 0.
306
+ # Needed by new bind API.
307
+ def added_to_packet(packet)
308
+ return unless packet.is? 'UDP'
309
+ return unless packet.udp.sport.zero?
310
+ packet.udp.sport = packet.udp.dport
311
+ end
301
312
  end
302
313
 
303
314
  self.add_class SNMP
304
- UDP.bind_header SNMP, dport: SNMP::UDP_PORT1, sport: SNMP::UDP_PORT1
305
- UDP.bind_header SNMP, dport: SNMP::UDP_PORT2, sport: SNMP::UDP_PORT2
315
+ UDP.bind SNMP, dport: SNMP::UDP_PORT1
316
+ UDP.bind SNMP, sport: SNMP::UDP_PORT1
317
+ UDP.bind SNMP, dport: SNMP::UDP_PORT2
318
+ UDP.bind SNMP, sport: SNMP::UDP_PORT2
306
319
  end
307
320
  end