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
@@ -9,6 +9,7 @@ module PacketGen
9
9
  module Header
10
10
  # This module contains all MLDv2 specific classes.
11
11
  # @author Sylvain Daubert
12
+ # @since 2.4.0
12
13
  module MLDv2
13
14
  # Encode value for MLDv2 Max Resp Code.
14
15
  # Value may be encoded as a float, so some error may occur.
@@ -16,14 +17,14 @@ module PacketGen
16
17
  # @param [Integer] value value to encode
17
18
  # @return [Integer]
18
19
  def self.encode(value)
19
- if value < 32768
20
+ if value < 32_768
20
21
  value
21
22
  elsif value > 8_387_583
22
23
  0xffff
23
24
  else
24
25
  exp = 0
25
26
  value >>= 3
26
- while value > 8191 do
27
+ while value > 8_191
27
28
  exp += 1
28
29
  value >>= 1
29
30
  end
@@ -36,7 +37,7 @@ module PacketGen
36
37
  # @param [Integer] value value to decode
37
38
  # @return [Integer]
38
39
  def self.decode(value)
39
- if value < 32768
40
+ if value < 32_768
40
41
  value
41
42
  else
42
43
  mant = value & 0xfff
@@ -52,7 +52,6 @@ module PacketGen
52
52
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
53
53
  # @author Sylvain Daubert
54
54
  class McastAddressRecord < Types::Fields
55
-
56
55
  # Known record types
57
56
  RECORD_TYPES = IGMPv3::GroupRecord::RECORD_TYPES
58
57
 
@@ -81,7 +80,7 @@ module PacketGen
81
80
  # @!attribute aux_data
82
81
  # @return [String]
83
82
  define_field :aux_data, Types::String,
84
- builder: ->(h, t) { t.new(length_from: ->() { h[:aux_data_len].to_i * 4 }) }
83
+ builder: ->(h, t) { t.new(length_from: -> { h[:aux_data_len].to_i * 4 }) }
85
84
 
86
85
  def human_type
87
86
  self[:type].to_human
@@ -91,12 +90,12 @@ module PacketGen
91
90
  "#{human_type}(ma:#{multicast_addr}|src:#{source_addr.to_human})"
92
91
  end
93
92
  end
94
-
93
+
95
94
  # Class to handle series of {McastAddressRecord}.
96
95
  # @author Sylvain Daubert
97
96
  class McastAddressRecords < Types::Array
98
97
  set_of McastAddressRecord
99
-
98
+
100
99
  # Separator used in {#to_human}.
101
100
  HUMAN_SEPARATOR = ';'
102
101
  end
@@ -92,7 +92,7 @@ module PacketGen
92
92
  # Array of IPv6 source addresses
93
93
  # @return [IPv6::ArrayOfAddr]
94
94
  define_field_before :body, :source_addr, IPv6::ArrayOfAddr,
95
- builder: ->(h,t) { t.new(counter: h[:number_of_sources]) }
95
+ builder: ->(h, t) { t.new(counter: h[:number_of_sources]) }
96
96
 
97
97
  # @!attribute flag_resv
98
98
  # 4-bit reserved field in {#flags}
@@ -138,9 +138,8 @@ module PacketGen
138
138
  end
139
139
  end
140
140
  end
141
-
142
- self.add_class MLDv2::MLQ
143
- ICMPv6.bind_header MLDv2::MLQ, op: :and, type: 130, body: ->(b) { b.nil? ? '' : b.length > 23 }
144
141
 
142
+ self.add_class MLDv2::MLQ
143
+ ICMPv6.bind MLDv2::MLQ, type: 130, body: ->(b) { b.nil? ? '' : b.length > 23 }
145
144
  end
146
145
  end
@@ -4,6 +4,7 @@
4
4
  # This program is published under MIT license.
5
5
 
6
6
  # frozen_string_literal: true
7
+
7
8
  require_relative 'mcast_address_record'
8
9
 
9
10
  module PacketGen
@@ -52,7 +53,7 @@ module PacketGen
52
53
  # 16-bit Number of group records in {#records}
53
54
  # @return [Integer]
54
55
  define_field :number_of_mar, Types::Int16, default: 0
55
-
56
+
56
57
  # @!attribute records
57
58
  # Array of Mcast Address Records
58
59
  # @return [McastAddressRecords]
@@ -60,8 +61,8 @@ module PacketGen
60
61
  builder: ->(h, t) { t.new(counter: h[:number_of_mar]) }
61
62
  end
62
63
  end
63
-
64
+
64
65
  self.add_class MLDv2::MLR
65
- ICMPv6.bind_header MLDv2::MLR, type: 143
66
+ ICMPv6.bind MLDv2::MLR, type: 143
66
67
  end
67
68
  end
@@ -9,13 +9,14 @@ module PacketGen
9
9
  module Header
10
10
  # Module to group all NetBIOS headers
11
11
  # @author Sylvain Daubert
12
+ # @since 2.5.1
12
13
  module NetBIOS
13
14
  # NetBIOS Session Service messages.
14
15
  # @author Sylvain Daubert
15
16
  class Session < Base
16
17
  # Port number for NetBIOS Session Service over TCP
17
18
  TCP_PORT = 139
18
-
19
+
19
20
  # Session packet types
20
21
  TYPES = {
21
22
  'message' => 0,
@@ -24,8 +25,8 @@ module PacketGen
24
25
  'negative_response' => 0x83,
25
26
  'retarget_response' => 0x84,
26
27
  'keep_alive' => 0x85,
27
- }
28
-
28
+ }.freeze
29
+
29
30
  # @!attribute type
30
31
  # 8-bit session packet type
31
32
  # @return [Integer]
@@ -37,15 +38,27 @@ module PacketGen
37
38
  # @!attribute body
38
39
  # @return [String]
39
40
  define_field :body, Types::String
40
-
41
+
41
42
  # Compute and set {#length} field
42
43
  # @return [Integer] calculated length
43
44
  def calc_length
44
45
  Base.calculate_and_set_length(self, header_in_size: false)
45
46
  end
47
+
48
+ # @api private
49
+ # @note This method is used internally by PacketGen and should not be
50
+ # directly called
51
+ # @since 2.7.0 Set TCP sport according to bindings, only if sport is 0.
52
+ # Needed by new bind API.
53
+ def added_to_packet(packet)
54
+ return unless packet.is? 'TCP'
55
+ return unless packet.tcp.sport.zero?
56
+ packet.tcp.sport = TCP_PORT
57
+ end
46
58
  end
47
59
  end
48
60
  self.add_class NetBIOS::Session
49
- TCP.bind_header NetBIOS::Session, sport: NetBIOS::Session::TCP_PORT, dport: NetBIOS::Session::TCP_PORT
61
+ TCP.bind NetBIOS::Session, dport: NetBIOS::Session::TCP_PORT
62
+ TCP.bind NetBIOS::Session, sport: NetBIOS::Session::TCP_PORT
50
63
  end
51
64
  end
@@ -7,7 +7,6 @@
7
7
 
8
8
  module PacketGen
9
9
  module Header
10
-
11
10
  # This class supports OSPFv2 (RFC 2328).
12
11
  # A OSPFv2 header has the following format:
13
12
  #
@@ -69,19 +68,19 @@ module PacketGen
69
68
  # * or {OSPFv2::LSAck}.
70
69
  #
71
70
  # @author Sylvain Daubert
71
+ # @since 2.5.0
72
72
  class OSPFv2 < Base
73
-
74
73
  # IP protocol number for OSPF
75
74
  IP_PROTOCOL = 89
76
-
75
+
77
76
  # OSPF packet types
78
- TYPES = {
77
+ TYPES = {
79
78
  'HELLO' => 1,
80
79
  'DB_DESCRIPTION' => 2,
81
80
  'LS_REQUEST' => 3,
82
81
  'LS_UPDATE' => 4,
83
82
  'LS_ACK' => 5
84
- }
83
+ }.freeze
85
84
 
86
85
  # Authentication types
87
86
  AU_TYPES = {
@@ -89,7 +88,7 @@ module PacketGen
89
88
  'PASSWORD' => 1,
90
89
  'CRYPTO' => 2,
91
90
  'CRYPTO_WITH_ESN' => 3
92
- }
91
+ }.freeze
93
92
 
94
93
  # @!attribute version
95
94
  # 8-bit OSPF version
@@ -236,7 +235,7 @@ module PacketGen
236
235
  end
237
236
 
238
237
  self.add_class OSPFv2
239
- IP.bind_header OSPFv2, protocol: OSPFv2::IP_PROTOCOL
238
+ IP.bind OSPFv2, protocol: OSPFv2::IP_PROTOCOL
240
239
  end
241
240
  end
242
241
 
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv2
11
-
12
11
  # This class handles {OSPFv2 OSPFv2} DB description packets payload.
13
12
  # The DB description payload has the following format:
14
13
  # 0 1 2 3
@@ -91,15 +90,15 @@ module PacketGen
91
90
  define_field :sequence_number, Types::Int32
92
91
  alias seqnum sequence_number
93
92
  alias seqnum= sequence_number=
94
-
93
+
95
94
  # @!attribute lsas
96
95
  # Array of LSA headers
97
96
  # @return [ArrayOfLSAHeader]
98
- define_field :lsas, ArrayOfLSA, builder: ->(h, t) { t.new(only_headers: true) }
97
+ define_field :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
99
98
  end
100
99
  end
101
100
 
102
101
  self.add_class OSPFv2::DbDescription
103
- OSPFv2.bind_header OSPFv2::DbDescription, type: OSPFv2::TYPES['DB_DESCRIPTION']
102
+ OSPFv2.bind OSPFv2::DbDescription, type: OSPFv2::TYPES['DB_DESCRIPTION']
104
103
  end
105
104
  end
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv2
11
-
12
11
  # This class handles {OSPFv2 OSPFv2} 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 OSPFv2::Hello
102
- OSPFv2.bind_header OSPFv2::Hello, type: OSPFv2::TYPES['HELLO']
101
+ OSPFv2.bind OSPFv2::Hello, type: OSPFv2::TYPES['HELLO']
103
102
  end
104
103
  end
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv2
11
-
12
11
  # This class handles {OSPFv2 OSPFv2} LS Acknowledgment packets payload.
13
12
  # The LS Acknowledgment payload has the following format:
14
13
  # 0 1 2 3
@@ -45,11 +44,11 @@ module PacketGen
45
44
  # @!attribute lsas
46
45
  # Array of LSA headers
47
46
  # @return [ArrayOfLSAHeader]
48
- define_field :lsas, ArrayOfLSA, builder: ->(h, t) { t.new(only_headers: true) }
47
+ define_field :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
49
48
  end
50
49
  end
51
50
 
52
51
  self.add_class OSPFv2::LSAck
53
- OSPFv2.bind_header OSPFv2::LSAck, type: OSPFv2::TYPES['LS_ACK']
52
+ OSPFv2.bind OSPFv2::LSAck, type: OSPFv2::TYPES['LS_ACK']
54
53
  end
55
54
  end
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv2
11
-
12
11
  # This class handle a LS request, which is composed 3 {Types::Int32} fields:
13
12
  # * {#type},
14
13
  # * {#link_state_id},
@@ -40,7 +39,7 @@ module PacketGen
40
39
  "LSR<#{human_type},#{link_state_id},#{advertising_router}>"
41
40
  end
42
41
  end
43
-
42
+
44
43
  # This class defines a specialized {Types::Array array} to handle series
45
44
  # of {LSR LSRs}.
46
45
  # @author Sylvain Daubert
@@ -85,6 +84,6 @@ module PacketGen
85
84
  end
86
85
 
87
86
  self.add_class OSPFv2::LSRequest
88
- OSPFv2.bind_header OSPFv2::LSRequest, type: OSPFv2::TYPES['LS_REQUEST']
87
+ OSPFv2.bind OSPFv2::LSRequest, type: OSPFv2::TYPES['LS_REQUEST']
89
88
  end
90
89
  end
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv2
11
-
12
11
  # This class handles {OSPFv2 OSPFv2} Link State Update packets
13
12
  # payload. The LSU payload has the following format:
14
13
  # 0 1 2 3
@@ -52,21 +51,21 @@ module PacketGen
52
51
  # Array of {LSA LSAs}
53
52
  # @return [ArrayOfLSA]
54
53
  define_field :lsas, ArrayOfLSA, builder: ->(h, t) { t.new(counter: h[:lsas_count]) }
55
-
54
+
56
55
  # Calculate checksums of all LSAs
57
56
  # @return [void]
58
57
  def calc_checksum
59
- lsas.each { |lsa| lsa.calc_checksum }
58
+ lsas.each(&:calc_checksum)
60
59
  end
61
-
60
+
62
61
  # Calculate length of all LSAs
63
62
  def calc_length
64
- lsas.each { |lsa| lsa.calc_length }
63
+ lsas.each(&:calc_length)
65
64
  end
66
65
  end
67
66
  end
68
67
 
69
68
  self.add_class OSPFv2::LSUpdate
70
- OSPFv2.bind_header OSPFv2::LSUpdate, type: OSPFv2::TYPES['LS_UPDATE']
69
+ OSPFv2.bind OSPFv2::LSUpdate, type: OSPFv2::TYPES['LS_UPDATE']
71
70
  end
72
71
  end
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv2
11
-
12
11
  # This class handles unsupported {OSPFv2 OSPFv2} LSA payloads.
13
12
  # A LSA payload is a {LSAHeader} with a {#body} field.
14
13
  # @author Sylvain Daubert
@@ -17,7 +16,7 @@ module PacketGen
17
16
  # LSA body
18
17
  # @return [String]
19
18
  define_field :body, Types::String,
20
- builder: ->(h,t) { t.new(length_from: ->() { h.length - 20 }) }
19
+ builder: ->(h, t) { t.new(length_from: -> { h.length - 20 }) }
21
20
  end
22
21
 
23
22
  # This class handles TOS metrics for {Link links} in a {LSARouter
@@ -71,7 +70,7 @@ module PacketGen
71
70
  # @!attribute tos
72
71
  # Additionnal TOS metrics
73
72
  # @return [ArrayOfTosMetric]
74
- define_field :tos, ArrayOfTosMetric, builder: ->(h,t) { t.new(counter: h[:tos_count]) }
73
+ define_field :tos, ArrayOfTosMetric, builder: ->(h, t) { t.new(counter: h[:tos_count]) }
75
74
 
76
75
  # @return [String]
77
76
  def to_human
@@ -106,7 +105,7 @@ module PacketGen
106
105
  # @attribute links
107
106
  # @return [ArrayOfLink]
108
107
  define_field :links, ArrayOfLink, builder: ->(h, t) { t.new(counter: h[:link_count]) }
109
-
108
+
110
109
  # @attribute v_flag
111
110
  # @return [Boolean]
112
111
  # @attribute e_flag
@@ -148,7 +147,7 @@ module PacketGen
148
147
  # @!attribute ext_route_tag
149
148
  # @return [Integer]
150
149
  define_field :ext_route_tag, Types::Int32
151
-
150
+
152
151
  # @!attribute e_flag
153
152
  # @return [Boolean]
154
153
  # @!attribute tos
@@ -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 OSPFv2.const_defined? klassname
244
243
  OSPFv2.const_get klassname
245
244
  else
@@ -8,7 +8,6 @@
8
8
  module PacketGen
9
9
  module Header
10
10
  class OSPFv2
11
-
12
11
  # This class handles {OSPFv2 OSPFv2} LSA header. A LSA header has the
13
12
  # following format:
14
13
  # 0 1 2 3
@@ -37,7 +36,7 @@ module PacketGen
37
36
  'Summary-IP' => 3,
38
37
  'Summary-ABSR' => 4,
39
38
  'AS-External' => 5
40
- }
39
+ }.freeze
41
40
 
42
41
  # @!attribute age
43
42
  # The time in seconds since the LSA was originated.
@@ -72,7 +71,7 @@ module PacketGen
72
71
  # Length of the LSA, including the header.
73
72
  # @return [Integer]
74
73
  define_field :length, Types::Int16
75
-
74
+
76
75
  # Compute and set Fletcher-16 checksum on LSA
77
76
  # @return [Integer]
78
77
  def calc_checksum
@@ -86,10 +85,10 @@ module PacketGen
86
85
  end
87
86
  c0 %= 255
88
87
  c1 %= 255
89
-
88
+
90
89
  x = ((sz - 16 - 1) * c0 - c1) % 255
91
90
  x += 255 if x <= 0
92
- y = 255*2 - c0 - x
91
+ y = 255 * 2 - c0 - x
93
92
  y -= 255 if y > 255
94
93
  self.checksum = (x << 8) | y
95
94
  end