packetgen 3.3.1 → 3.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -0
  3. data/README.md +7 -7
  4. data/lib/packetgen/capture.rb +2 -1
  5. data/lib/packetgen/config.rb +2 -1
  6. data/lib/packetgen/header/arp.rb +2 -1
  7. data/lib/packetgen/header/asn1_base.rb +2 -1
  8. data/lib/packetgen/header/base.rb +4 -3
  9. data/lib/packetgen/header/bootp.rb +2 -1
  10. data/lib/packetgen/header/dhcp/option.rb +2 -1
  11. data/lib/packetgen/header/dhcp/options.rb +2 -1
  12. data/lib/packetgen/header/dhcp.rb +2 -1
  13. data/lib/packetgen/header/dhcpv6/duid.rb +2 -1
  14. data/lib/packetgen/header/dhcpv6/option.rb +2 -1
  15. data/lib/packetgen/header/dhcpv6/options.rb +2 -1
  16. data/lib/packetgen/header/dhcpv6/relay.rb +2 -1
  17. data/lib/packetgen/header/dhcpv6.rb +2 -1
  18. data/lib/packetgen/header/dns/name.rb +2 -1
  19. data/lib/packetgen/header/dns/opt.rb +3 -2
  20. data/lib/packetgen/header/dns/option.rb +3 -2
  21. data/lib/packetgen/header/dns/qdsection.rb +2 -1
  22. data/lib/packetgen/header/dns/question.rb +2 -1
  23. data/lib/packetgen/header/dns/rr.rb +2 -1
  24. data/lib/packetgen/header/dns/rrsection.rb +2 -1
  25. data/lib/packetgen/header/dns.rb +3 -2
  26. data/lib/packetgen/header/dot11/control.rb +2 -1
  27. data/lib/packetgen/header/dot11/data.rb +4 -3
  28. data/lib/packetgen/header/dot11/element.rb +2 -1
  29. data/lib/packetgen/header/dot11/management.rb +2 -1
  30. data/lib/packetgen/header/dot11/sub_mngt.rb +2 -1
  31. data/lib/packetgen/header/dot11.rb +2 -1
  32. data/lib/packetgen/header/dot1q.rb +2 -1
  33. data/lib/packetgen/header/dot1x.rb +2 -1
  34. data/lib/packetgen/header/eap/fast.rb +2 -1
  35. data/lib/packetgen/header/eap/md5.rb +2 -1
  36. data/lib/packetgen/header/eap/tls.rb +3 -2
  37. data/lib/packetgen/header/eap/ttls.rb +3 -2
  38. data/lib/packetgen/header/eap.rb +3 -2
  39. data/lib/packetgen/header/eth.rb +3 -2
  40. data/lib/packetgen/header/gre.rb +2 -1
  41. data/lib/packetgen/header/http/headers.rb +4 -3
  42. data/lib/packetgen/header/http/request.rb +2 -1
  43. data/lib/packetgen/header/http/response.rb +2 -1
  44. data/lib/packetgen/header/http/verbs.rb +2 -1
  45. data/lib/packetgen/header/http.rb +2 -1
  46. data/lib/packetgen/header/icmp.rb +2 -1
  47. data/lib/packetgen/header/icmpv6.rb +2 -1
  48. data/lib/packetgen/header/igmp.rb +2 -1
  49. data/lib/packetgen/header/igmpv3/group_record.rb +2 -1
  50. data/lib/packetgen/header/igmpv3/mq.rb +2 -1
  51. data/lib/packetgen/header/igmpv3/mr.rb +2 -1
  52. data/lib/packetgen/header/igmpv3.rb +2 -1
  53. data/lib/packetgen/header/ip/addr.rb +2 -1
  54. data/lib/packetgen/header/ip/option.rb +3 -2
  55. data/lib/packetgen/header/ip/options.rb +2 -1
  56. data/lib/packetgen/header/ip.rb +3 -2
  57. data/lib/packetgen/header/ipv6/addr.rb +2 -1
  58. data/lib/packetgen/header/ipv6/extension.rb +2 -1
  59. data/lib/packetgen/header/ipv6/hop_by_hop.rb +2 -1
  60. data/lib/packetgen/header/ipv6.rb +2 -1
  61. data/lib/packetgen/header/llc.rb +2 -1
  62. data/lib/packetgen/header/mdns.rb +2 -1
  63. data/lib/packetgen/header/mld.rb +2 -1
  64. data/lib/packetgen/header/mldv2/mcast_address_record.rb +2 -1
  65. data/lib/packetgen/header/mldv2/mlq.rb +2 -1
  66. data/lib/packetgen/header/mldv2/mlr.rb +2 -1
  67. data/lib/packetgen/header/mldv2.rb +2 -1
  68. data/lib/packetgen/header/ospfv2/db_description.rb +2 -1
  69. data/lib/packetgen/header/ospfv2/hello.rb +2 -1
  70. data/lib/packetgen/header/ospfv2/ls_ack.rb +2 -1
  71. data/lib/packetgen/header/ospfv2/ls_request.rb +2 -1
  72. data/lib/packetgen/header/ospfv2/ls_update.rb +2 -1
  73. data/lib/packetgen/header/ospfv2/lsa.rb +2 -1
  74. data/lib/packetgen/header/ospfv2/lsa_header.rb +2 -1
  75. data/lib/packetgen/header/ospfv2.rb +2 -1
  76. data/lib/packetgen/header/ospfv3/db_description.rb +2 -1
  77. data/lib/packetgen/header/ospfv3/hello.rb +2 -1
  78. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +2 -1
  79. data/lib/packetgen/header/ospfv3/ls_ack.rb +2 -1
  80. data/lib/packetgen/header/ospfv3/ls_request.rb +2 -1
  81. data/lib/packetgen/header/ospfv3/ls_update.rb +2 -1
  82. data/lib/packetgen/header/ospfv3/lsa.rb +2 -1
  83. data/lib/packetgen/header/ospfv3/lsa_header.rb +2 -1
  84. data/lib/packetgen/header/ospfv3.rb +2 -1
  85. data/lib/packetgen/header/sctp/chunk.rb +547 -0
  86. data/lib/packetgen/header/sctp/error.rb +347 -0
  87. data/lib/packetgen/header/sctp/padded32.rb +34 -0
  88. data/lib/packetgen/header/sctp/parameter.rb +229 -0
  89. data/lib/packetgen/header/sctp.rb +96 -0
  90. data/lib/packetgen/header/snmp.rb +3 -2
  91. data/lib/packetgen/header/tcp/option.rb +2 -1
  92. data/lib/packetgen/header/tcp/options.rb +2 -1
  93. data/lib/packetgen/header/tcp.rb +3 -2
  94. data/lib/packetgen/header/tftp.rb +2 -1
  95. data/lib/packetgen/header/udp.rb +2 -1
  96. data/lib/packetgen/header.rb +4 -2
  97. data/lib/packetgen/headerable.rb +2 -1
  98. data/lib/packetgen/inject.rb +2 -1
  99. data/lib/packetgen/inspect.rb +2 -1
  100. data/lib/packetgen/packet.rb +4 -3
  101. data/lib/packetgen/pcap.rb +2 -1
  102. data/lib/packetgen/pcapng/block.rb +3 -2
  103. data/lib/packetgen/pcapng/epb.rb +2 -1
  104. data/lib/packetgen/pcapng/file.rb +2 -1
  105. data/lib/packetgen/pcapng/idb.rb +2 -1
  106. data/lib/packetgen/pcapng/shb.rb +2 -1
  107. data/lib/packetgen/pcapng/spb.rb +2 -1
  108. data/lib/packetgen/pcapng/unknown_block.rb +2 -1
  109. data/lib/packetgen/pcapng.rb +2 -1
  110. data/lib/packetgen/pcaprub_wrapper.rb +2 -1
  111. data/lib/packetgen/proto.rb +2 -1
  112. data/lib/packetgen/types/abstract_tlv.rb +53 -15
  113. data/lib/packetgen/types/array.rb +20 -3
  114. data/lib/packetgen/types/cstring.rb +2 -1
  115. data/lib/packetgen/types/enum.rb +3 -2
  116. data/lib/packetgen/types/fieldable.rb +3 -2
  117. data/lib/packetgen/types/fields.rb +8 -7
  118. data/lib/packetgen/types/int.rb +2 -1
  119. data/lib/packetgen/types/int_string.rb +2 -1
  120. data/lib/packetgen/types/length_from.rb +2 -1
  121. data/lib/packetgen/types/oui.rb +2 -1
  122. data/lib/packetgen/types/string.rb +2 -1
  123. data/lib/packetgen/types/tlv.rb +2 -1
  124. data/lib/packetgen/types.rb +2 -1
  125. data/lib/packetgen/unknown_packet.rb +3 -2
  126. data/lib/packetgen/utils/arp_spoofer.rb +4 -3
  127. data/lib/packetgen/utils.rb +2 -1
  128. data/lib/packetgen/version.rb +3 -2
  129. data/lib/packetgen.rb +2 -1
  130. metadata +22 -11
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This file is part of PacketGen
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
+ # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
+ # This program is published under MIT license.
8
+ require 'digest/crc32c'
9
+
10
+ module PacketGen
11
+ module Header
12
+ # SCTP header ({https://tools.ietf.org/html/rfc9260 RFC 9260})
13
+ # 0 1 2 3
14
+ # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
15
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
16
+ # | Source Port Number | Destination Port Number |
17
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
18
+ # | Verification Tag |
19
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20
+ # | Checksum |
21
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
22
+ # | Chunk #1 |
23
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24
+ # | ... |
25
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26
+ # | Chunk #n |
27
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28
+ #
29
+ # @author Sylvain Daubert
30
+ # @since 3.4.0
31
+ class SCTP < Base; end
32
+ end
33
+ end
34
+
35
+ require_relative 'sctp/chunk'
36
+ require_relative 'udp'
37
+
38
+ module PacketGen
39
+ module Header
40
+ class SCTP < Base
41
+ # IP protocol number for SCTP
42
+ IP_PROTOCOL = 132
43
+ # Port number for SCTP over TCP (RFC 6951)
44
+ UDP_PORT = 9899
45
+
46
+ # @!attribute sport
47
+ # 16-bit TCP source port
48
+ # @return [Integer]
49
+ define_field :sport, Types::Int16
50
+ # @!attribute dport
51
+ # 16-bit TCP destination port
52
+ # @return [Integer]
53
+ define_field :dport, Types::Int16
54
+ # @!attribute verification_tag
55
+ # 32-bit verification tag
56
+ # @return [Integer]
57
+ define_field :verification_tag, Types::Int32
58
+ # @!attribute checksum
59
+ # 32-bit TCP checksum
60
+ # @return [Integer]
61
+ define_field :checksum, Types::Int32le
62
+ # @!attribute chunks
63
+ # List of chunks this packet transports
64
+ # @return [ArrayOfChunk]
65
+ define_field :chunks, ArrayOfChunk
66
+
67
+ # Compute SCTP checksum
68
+ def calc_checksum
69
+ self.checksum = 0
70
+ crc32c = Digest::CRC32c.new
71
+ crc32c << to_s
72
+ self.checksum = crc32c.checksum
73
+ end
74
+
75
+ # Compute SCTP chunks length
76
+ def calc_length
77
+ self.chunks.each(&:calc_length)
78
+ end
79
+
80
+ # @return [String]
81
+ def inspect
82
+ super do |attr|
83
+ next unless attr == :chunks
84
+
85
+ chunks.map(&:inspect).join
86
+ end
87
+ end
88
+ end
89
+
90
+ self.add_class SCTP
91
+
92
+ IP.bind SCTP, protocol: SCTP::IP_PROTOCOL
93
+ IPv6.bind SCTP, next: SCTP::IP_PROTOCOL
94
+ UDP.bind SCTP, dport: SCTP::UDP_PORT
95
+ end
96
+ end
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
8
  # This program is published under MIT license.
8
9
 
9
10
  module PacketGen
@@ -13,7 +14,7 @@ module PacketGen
13
14
 
14
15
  # Simple Network Management Protocol (SNMP)
15
16
  #
16
- # See https://github.com/sdaubert/packetgen/wiki/SNMP
17
+ # See https://github.com/lemontree55/packetgen/wiki/SNMP
17
18
  # @author Sylvain Daubert
18
19
  # @since 2.0.0
19
20
  class SNMP < ASN1Base
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  require_relative 'option'
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -233,7 +234,7 @@ module PacketGen
233
234
  def flags2string
234
235
  flags = +''
235
236
  %w[ns cwr ece urg ack psh rst syn fin].each do |fl|
236
- flags << (send("flag_#{fl}?") ? fl[0].upcase : '.')
237
+ flags << (send(:"flag_#{fl}?") ? fl[0].upcase : '.')
237
238
  end
238
239
 
239
240
  flags
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
8
  # This program is published under MIT license.
8
9
 
9
10
  module PacketGen
@@ -91,8 +92,9 @@ require_relative 'header/arp'
91
92
  require_relative 'header/ipv6'
92
93
  require_relative 'header/icmpv6'
93
94
  require_relative 'header/gre'
94
- require_relative 'header/udp'
95
+ require_relative 'header/sctp'
95
96
  require_relative 'header/tcp'
97
+ require_relative 'header/udp'
96
98
  require_relative 'header/eap'
97
99
  require_relative 'header/dns'
98
100
  require_relative 'header/asn1_base'
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
  require_relative 'pcaprub_wrapper'
8
9
 
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -2,7 +2,8 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
8
  # This program is published under MIT license.
8
9
 
@@ -422,9 +423,9 @@ module PacketGen
422
423
  return header unless arg.is_a? Hash
423
424
 
424
425
  arg.each do |key, value|
425
- raise ArgumentError, "unknown #{key} attribute for #{klass}" unless header.respond_to? "#{key}="
426
+ raise ArgumentError, "unknown #{key} attribute for #{klass}" unless header.respond_to?(:"#{key}=")
426
427
 
427
- header.send "#{key}=", value
428
+ header.send(:"#{key}=", value)
428
429
  end
429
430
 
430
431
  header
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
  require_relative 'pcaprub_wrapper'
8
9
 
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -65,7 +66,7 @@ module PacketGen
65
66
  raise ArgumentError, "unknown endianness for #{self.class}" unless %i[little big].include?(endian)
66
67
 
67
68
  @endian = endian
68
- @fields.each { |_f, v| v.endian = endian if v.is_a?(Types::Int) }
69
+ @fields.each_value { |v| v.endian = endian if v.is_a?(Types::Int) }
69
70
  endian
70
71
  end
71
72
 
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  require 'stringio'
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
  require 'pcaprub'
8
9
 
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
8
  # This program is published under MIT license.
8
9
 
9
10
  require 'socket'
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
8
  # This program is published under MIT license.
8
9
 
9
10
  module PacketGen
@@ -71,6 +72,8 @@ module PacketGen
71
72
  # @private
72
73
  attr_accessor :field_in_length
73
74
 
75
+ # rubocop:disable Metrics/ParameterLists
76
+
74
77
  # Generate a TLV class
75
78
  # @param [Class] type_class Class to use for +type+
76
79
  # @param [Class] length_class Class to use for +length+
@@ -105,6 +108,7 @@ module PacketGen
105
108
 
106
109
  klass
107
110
  end
111
+ # rubocop:enable Metrics/ParameterLists
108
112
 
109
113
  # @!attribute type
110
114
  # @abstract Type attribute for real TLV class
@@ -118,13 +122,22 @@ module PacketGen
118
122
 
119
123
  # @abstract Should only be called on real TLV classes, created by {.create}.
120
124
  # Set enum hash for {#type} field.
121
- # @param [Hash] hsh enum hash
125
+ # @param [Hash{String, Symbol => Integer}] hsh enum hash
122
126
  # @return [void]
123
127
  def define_type_enum(hsh)
124
128
  field_defs[:type][:enum].clear
125
129
  field_defs[:type][:enum].merge!(hsh)
126
130
  end
127
131
 
132
+ # @abstract Should only be called on real TLV classes, created by {.create}.
133
+ # Set default value for {#type} field.
134
+ # @param [Integer,String,Symbol,nil] default default value from +hsh+ for type
135
+ # @return [void]
136
+ # @since 3.4.0
137
+ def define_type_default(default)
138
+ field_defs[:type][:default] = default
139
+ end
140
+
128
141
  private
129
142
 
130
143
  def check_field_in_length(field_in_length)
@@ -157,6 +170,16 @@ module PacketGen
157
170
  end
158
171
  end
159
172
 
173
+ # @!attribute type
174
+ # @abstract Type attribute
175
+ # @return [Integer]
176
+ # @!attribute length
177
+ # @abstract Length
178
+ # @return [Integer]
179
+ # @!attribute value
180
+ # @abstract Value attribute
181
+ # @return [Object]
182
+
160
183
  # @abstract Should only be called on real TLV classes, created by {.create}.
161
184
  # @param [Hash] options
162
185
  # @option options [Integer] :type
@@ -172,13 +195,16 @@ module PacketGen
172
195
  super
173
196
  # used #value= defined below, which set length if needed
174
197
  self.value = options[:value] if options[:value]
198
+ calc_length unless options.key?(:length)
175
199
  end
176
200
 
177
201
  # @abstract Should only be called on real TLV class instances.
178
202
  # Populate object from a binary string
179
- # @param [String] str
203
+ # @param [String,nil] str
180
204
  # @return [Fields] self
181
205
  def read(str)
206
+ return self if str.nil?
207
+
182
208
  idx = 0
183
209
  fields.each do |field_name|
184
210
  field = self[field_name]
@@ -192,20 +218,18 @@ module PacketGen
192
218
 
193
219
  # @abstract Should only be called on real TLV class instances.
194
220
  # Set +value+. May set +length+ if value is a {Types::String}.
195
- # @param [::String,Integer] val
196
- # @return [::String,Integer]
221
+ # @param [Object] val
222
+ # @return [Object]
223
+ # @since 3.4.0 Base on field's +#from_human+ method
197
224
  def value=(val)
198
- self[:value].from_human(val)
199
-
200
- fil = @field_in_length
201
- fil = 'TLV' if @header_in_length
202
-
203
- length = 0
204
- fil.each_char do |field_type|
205
- length += self[FIELD_TYPES[field_type]].sz
225
+ if val.is_a?(self[:value].class)
226
+ self[:value] = val
227
+ elsif self[:value].respond_to?(:from_human)
228
+ self[:value].from_human(val)
229
+ else
230
+ self[:value].read(val)
206
231
  end
207
- self.length = length
208
-
232
+ calc_length
209
233
  val
210
234
  end
211
235
 
@@ -223,6 +247,20 @@ module PacketGen
223
247
  'type:%s,length:%u,value:%s' % [human_type, length, my_value]
224
248
  end
225
249
 
250
+ # Calculate length
251
+ # @return [void]
252
+ # @since 3.4.0
253
+ def calc_length
254
+ fil = @field_in_length
255
+ fil = 'TLV' if @header_in_length
256
+
257
+ length = 0
258
+ fil.each_char do |field_type|
259
+ length += self[FIELD_TYPES[field_type]].sz
260
+ end
261
+ self.length = length
262
+ end
263
+
226
264
  private
227
265
 
228
266
  def real_length
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  require 'forwardable'
@@ -225,8 +226,8 @@ module PacketGen
225
226
  klass == obj_klass ? obj : klass.new(hsh)
226
227
  end
227
228
 
228
- def real_type(obj)
229
- obj.class
229
+ def real_type(_obj)
230
+ self.class.set_of_klass
230
231
  end
231
232
 
232
233
  def create_object_from_str(str)
@@ -242,28 +243,44 @@ module PacketGen
242
243
  end
243
244
  end
244
245
 
246
+ # @private
247
+ module ArrayOfIntMixin
248
+ def read_from_array(ary)
249
+ return self if ary.empty?
250
+
251
+ ary.each do |i|
252
+ self << self.class.set_of_klass.new(i)
253
+ end
254
+ end
255
+ end
256
+
245
257
  # Specialized array to handle serie of {Int8}.
246
258
  class ArrayOfInt8 < Array
259
+ include ArrayOfIntMixin
247
260
  set_of Int8
248
261
  end
249
262
 
250
263
  # Specialized array to handle serie of {Int16}.
251
264
  class ArrayOfInt16 < Array
265
+ include ArrayOfIntMixin
252
266
  set_of Int16
253
267
  end
254
268
 
255
269
  # Specialized array to handle serie of {Int16le}.
256
270
  class ArrayOfInt16le < Array
271
+ include ArrayOfIntMixin
257
272
  set_of Int16le
258
273
  end
259
274
 
260
275
  # Specialized array to handle serie of {Int32}.
261
276
  class ArrayOfInt32 < Types::Array
277
+ include ArrayOfIntMixin
262
278
  set_of Types::Int32
263
279
  end
264
280
 
265
281
  # Specialized array to handle serie of {Int32le}.
266
282
  class ArrayOfInt32le < Types::Array
283
+ include ArrayOfIntMixin
267
284
  set_of Types::Int32le
268
285
  end
269
286
  end
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
8
  # This program is published under MIT license.
8
9
 
9
10
  require 'forwardable'
@@ -2,8 +2,9 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/sdaubert/packetgen for more informations
5
+ # See https://github.com/lemontree55/packetgen for more informations
6
6
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
7
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
7
8
  # This program is published under MIT license.
8
9
 
9
10
  module PacketGen
@@ -14,7 +15,7 @@ module PacketGen
14
15
  # and named values.
15
16
  #
16
17
  # == Simple example
17
- # enum = Int8Enum.new(0, 'low' => 0, 'medium' => 1, 'high' => 2})
18
+ # enum = Int8Enum.new('low' => 0, 'medium' => 1, 'high' => 2})
18
19
  # In this example, +enum+ is a 8-bit field which may take one
19
20
  # among three values: +low+, +medium+ or +high+:
20
21
  # enum.value = 'high'
@@ -1,8 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/sdaubert/packetgen for more informations
4
+ # See https://github.com/lemontree55/packetgen for more informations
5
5
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
6
+ # Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
6
7
  # This program is published under MIT license.
7
8
 
8
9
  module PacketGen
@@ -55,7 +56,7 @@ module PacketGen
55
56
 
56
57
  # rubocop:enable Lint/UselessMethodDefinition
57
58
 
58
- # Format object when inspecting a {Field} object
59
+ # Format object when inspecting a {Fields} object
59
60
  # @return [String]
60
61
  def format_inspect
61
62
  to_human