packetgen 2.4.0 → 2.5.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 (127) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +13 -4
  3. data/lib/packetgen.rb +3 -1
  4. data/lib/packetgen/capture.rb +2 -0
  5. data/lib/packetgen/config.rb +1 -0
  6. data/lib/packetgen/header.rb +5 -0
  7. data/lib/packetgen/header/arp.rb +2 -0
  8. data/lib/packetgen/header/asn1_base.rb +2 -0
  9. data/lib/packetgen/header/base.rb +16 -0
  10. data/lib/packetgen/header/bootp.rb +2 -0
  11. data/lib/packetgen/header/crypto.rb +2 -0
  12. data/lib/packetgen/header/dhcp.rb +2 -0
  13. data/lib/packetgen/header/dhcp/option.rb +3 -0
  14. data/lib/packetgen/header/dhcp/options.rb +2 -0
  15. data/lib/packetgen/header/dhcpv6.rb +109 -0
  16. data/lib/packetgen/header/dhcpv6/duid.rb +147 -0
  17. data/lib/packetgen/header/dhcpv6/option.rb +391 -0
  18. data/lib/packetgen/header/dhcpv6/options.rb +29 -0
  19. data/lib/packetgen/header/dhcpv6/relay.rb +48 -0
  20. data/lib/packetgen/header/dns.rb +10 -2
  21. data/lib/packetgen/header/dns/name.rb +7 -0
  22. data/lib/packetgen/header/dns/opt.rb +6 -0
  23. data/lib/packetgen/header/dns/option.rb +7 -0
  24. data/lib/packetgen/header/dns/qdsection.rb +7 -1
  25. data/lib/packetgen/header/dns/question.rb +7 -0
  26. data/lib/packetgen/header/dns/rr.rb +7 -0
  27. data/lib/packetgen/header/dns/rrsection.rb +7 -0
  28. data/lib/packetgen/header/dot11.rb +4 -2
  29. data/lib/packetgen/header/dot11/control.rb +2 -0
  30. data/lib/packetgen/header/dot11/data.rb +2 -0
  31. data/lib/packetgen/header/dot11/element.rb +2 -0
  32. data/lib/packetgen/header/dot11/management.rb +2 -0
  33. data/lib/packetgen/header/dot11/sub_mngt.rb +2 -0
  34. data/lib/packetgen/header/dot1q.rb +2 -0
  35. data/lib/packetgen/header/dot1x.rb +3 -1
  36. data/lib/packetgen/header/eap.rb +3 -1
  37. data/lib/packetgen/header/eap/fast.rb +2 -0
  38. data/lib/packetgen/header/eap/md5.rb +2 -0
  39. data/lib/packetgen/header/eap/tls.rb +2 -0
  40. data/lib/packetgen/header/eap/ttls.rb +2 -0
  41. data/lib/packetgen/header/esp.rb +7 -0
  42. data/lib/packetgen/header/eth.rb +2 -0
  43. data/lib/packetgen/header/gre.rb +4 -9
  44. data/lib/packetgen/header/http/headers.rb +2 -0
  45. data/lib/packetgen/header/http/request.rb +3 -1
  46. data/lib/packetgen/header/http/response.rb +3 -1
  47. data/lib/packetgen/header/icmp.rb +4 -11
  48. data/lib/packetgen/header/icmpv6.rb +4 -11
  49. data/lib/packetgen/header/igmp.rb +4 -11
  50. data/lib/packetgen/header/igmpv3.rb +4 -11
  51. data/lib/packetgen/header/igmpv3/group_record.rb +2 -0
  52. data/lib/packetgen/header/igmpv3/mq.rb +2 -0
  53. data/lib/packetgen/header/igmpv3/mr.rb +2 -0
  54. data/lib/packetgen/header/ike.rb +13 -6
  55. data/lib/packetgen/header/ike/auth.rb +2 -0
  56. data/lib/packetgen/header/ike/cert.rb +2 -0
  57. data/lib/packetgen/header/ike/certreq.rb +2 -0
  58. data/lib/packetgen/header/ike/id.rb +2 -0
  59. data/lib/packetgen/header/ike/ke.rb +2 -0
  60. data/lib/packetgen/header/ike/nonce.rb +2 -0
  61. data/lib/packetgen/header/ike/notify.rb +7 -0
  62. data/lib/packetgen/header/ike/payload.rb +9 -0
  63. data/lib/packetgen/header/ike/sa.rb +11 -4
  64. data/lib/packetgen/header/ike/sk.rb +7 -0
  65. data/lib/packetgen/header/ike/ts.rb +2 -0
  66. data/lib/packetgen/header/ike/vendor_id.rb +2 -0
  67. data/lib/packetgen/header/ip.rb +48 -11
  68. data/lib/packetgen/header/ip/addr.rb +8 -0
  69. data/lib/packetgen/header/ip/option.rb +2 -0
  70. data/lib/packetgen/header/ip/options.rb +2 -0
  71. data/lib/packetgen/header/ipv6.rb +5 -3
  72. data/lib/packetgen/header/ipv6/addr.rb +8 -0
  73. data/lib/packetgen/header/ipv6/extension.rb +2 -0
  74. data/lib/packetgen/header/ipv6/hop_by_hop.rb +2 -0
  75. data/lib/packetgen/header/llc.rb +2 -0
  76. data/lib/packetgen/header/mld.rb +2 -0
  77. data/lib/packetgen/header/mldv2.rb +4 -2
  78. data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -1
  79. data/lib/packetgen/header/mldv2/mlq.rb +2 -0
  80. data/lib/packetgen/header/mldv2/mlr.rb +4 -2
  81. data/lib/packetgen/header/ospfv2.rb +249 -0
  82. data/lib/packetgen/header/ospfv2/db_description.rb +105 -0
  83. data/lib/packetgen/header/ospfv2/hello.rb +104 -0
  84. data/lib/packetgen/header/ospfv2/ls_ack.rb +55 -0
  85. data/lib/packetgen/header/ospfv2/ls_request.rb +90 -0
  86. data/lib/packetgen/header/ospfv2/ls_update.rb +72 -0
  87. data/lib/packetgen/header/ospfv2/lsa.rb +252 -0
  88. data/lib/packetgen/header/ospfv2/lsa_header.rb +122 -0
  89. data/lib/packetgen/header/ospfv3.rb +216 -0
  90. data/lib/packetgen/header/ospfv3/db_description.rb +114 -0
  91. data/lib/packetgen/header/ospfv3/hello.rb +104 -0
  92. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +103 -0
  93. data/lib/packetgen/header/ospfv3/ls_ack.rb +51 -0
  94. data/lib/packetgen/header/ospfv3/ls_request.rb +108 -0
  95. data/lib/packetgen/header/ospfv3/ls_update.rb +74 -0
  96. data/lib/packetgen/header/ospfv3/lsa.rb +252 -0
  97. data/lib/packetgen/header/ospfv3/lsa_header.rb +123 -0
  98. data/lib/packetgen/header/snmp.rb +2 -0
  99. data/lib/packetgen/header/tcp.rb +14 -14
  100. data/lib/packetgen/header/tcp/option.rb +7 -1
  101. data/lib/packetgen/header/tcp/options.rb +7 -0
  102. data/lib/packetgen/header/tftp.rb +2 -0
  103. data/lib/packetgen/header/udp.rb +6 -14
  104. data/lib/packetgen/inspect.rb +5 -1
  105. data/lib/packetgen/packet.rb +3 -1
  106. data/lib/packetgen/pcapng.rb +2 -0
  107. data/lib/packetgen/pcapng/block.rb +2 -0
  108. data/lib/packetgen/pcapng/epb.rb +2 -0
  109. data/lib/packetgen/pcapng/file.rb +2 -0
  110. data/lib/packetgen/pcapng/idb.rb +2 -0
  111. data/lib/packetgen/pcapng/shb.rb +2 -0
  112. data/lib/packetgen/pcapng/spb.rb +2 -0
  113. data/lib/packetgen/pcapng/unknown_block.rb +2 -0
  114. data/lib/packetgen/proto.rb +2 -0
  115. data/lib/packetgen/types/array.rb +3 -0
  116. data/lib/packetgen/types/cstring.rb +3 -1
  117. data/lib/packetgen/types/enum.rb +2 -0
  118. data/lib/packetgen/types/fields.rb +8 -4
  119. data/lib/packetgen/types/int.rb +3 -1
  120. data/lib/packetgen/types/int_string.rb +2 -0
  121. data/lib/packetgen/types/oui.rb +2 -0
  122. data/lib/packetgen/types/string.rb +3 -0
  123. data/lib/packetgen/types/tlv.rb +8 -0
  124. data/lib/packetgen/utils.rb +6 -4
  125. data/lib/packetgen/utils/arp_spoofer.rb +2 -0
  126. data/lib/packetgen/version.rb +3 -1
  127. metadata +25 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d08bf3611fcb1af6c5e794d4582fe373b4887c02
4
- data.tar.gz: 7149de75ef5a5ebaca9d9b90239ffce8619c38c4
2
+ SHA256:
3
+ metadata.gz: 1fde6bab111f7f367b7811089be8b96a9845dad53b7205d25db0931303654189
4
+ data.tar.gz: 06c46f06148846640ccfd123a21198c003ef2763c9ff78797fe27d9df4d25555
5
5
  SHA512:
6
- metadata.gz: 82804e0c46bc17d30c6bc151a24b3fc415c476aa1159239330611d2b8ef3ef7d2013dc7078bb40e298d29c0e81f3e758f53e82ff280acc0548b37dc78ff7d8be
7
- data.tar.gz: 6f4c84f64e8728af30a61d56b22dce9eb34fa574984eafe427d48cebdac1446344f1f5dd37370604d58b9df4bb1af587135348ad682e15d3ce97d45cfd769ed1
6
+ metadata.gz: 8b0283250922dcaa606652e96f6f159d4fa2a4ce895b5539234e01da155bb5e50aa6286aba7cbc33246650e6739ec98de65676423c5f4c36aa1050024966f6bf
7
+ data.tar.gz: 179e87a341e6ae7a95e0a9a408fbde3b82601e21c37d49bd64d6dee3bb4debf82f77898e6e9e93b3763b3695feec19eb87396b0c6adb956bcbac13a293df2aa3
data/.travis.yml CHANGED
@@ -1,11 +1,20 @@
1
1
  language: ruby
2
2
  sudo: required
3
3
  rvm:
4
- - 2.2.7
5
- - 2.3.5
6
- - 2.4.2
7
- - 2.5.0
4
+ - 2.2
5
+ - 2.3
6
+ - 2.4
7
+ - 2.5
8
8
 
9
+ matrix:
10
+ # allow 2.5 to fail until Travis CI is fixed.
11
+ # See travis-ci/travis-ci#8969
12
+ allow_failures:
13
+ - rvm: 2.5
14
+
15
+ before_install:
16
+ # work around https://github.com/travis-ci/travis-ci/issues/8969
17
+ - travis_retry gem update --system
9
18
  install:
10
19
  - sudo apt-get update -qq
11
20
  - sudo apt-get install libpcap-dev -qq
data/lib/packetgen.rb CHANGED
@@ -3,6 +3,8 @@
3
3
  # See https://github.com/sdaubert/packetgen for more informations
4
4
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
5
5
  # This program is published under MIT license.
6
+
7
+ # frozen_string_literal: true
6
8
  require 'packetgen/version'
7
9
 
8
10
  # PacketGen is a network packet generator and analyzor.
@@ -64,7 +66,7 @@ module PacketGen
64
66
  # @param [String] str
65
67
  # @return [String] binary encoded string
66
68
  def self.force_binary(str)
67
- str.force_encoding Encoding::BINARY
69
+ str.dup.force_encoding(Encoding::BINARY)
68
70
  end
69
71
 
70
72
  # Get default network interface (ie. first non-loopback declared interface)
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
 
8
10
  # Capture packets from wire
@@ -3,6 +3,7 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
6
7
  require 'socket'
7
8
  require 'singleton'
8
9
  require 'network_interface'
@@ -4,6 +4,8 @@
4
4
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
5
5
  # This program is published under MIT license.
6
6
 
7
+ # frozen_string_literal: true
8
+
7
9
  module PacketGen
8
10
  # Namespace for protocol header classes
9
11
  # == Add a foreign header class
@@ -101,9 +103,12 @@ require_relative 'header/asn1_base'
101
103
  require_relative 'header/snmp'
102
104
  require_relative 'header/bootp'
103
105
  require_relative 'header/dhcp'
106
+ require_relative 'header/dhcpv6'
104
107
  require_relative 'header/http'
105
108
  require_relative 'header/tftp'
106
109
  require_relative 'header/igmp'
107
110
  require_relative 'header/igmpv3'
108
111
  require_relative 'header/mld'
109
112
  require_relative 'header/mldv2'
113
+ require_relative 'header/ospfv2'
114
+ require_relative 'header/ospfv3'
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
 
@@ -2,6 +2,8 @@
2
2
  # See https://github.com/sdaubert/packetgen for more informations
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
5
7
  require 'rasn1'
6
8
 
7
9
  module PacketGen
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
 
@@ -185,6 +187,20 @@ module PacketGen
185
187
  self.new.protocol_name
186
188
  end
187
189
 
190
+ # Helper method to calculate length of +hdr+ and set its +length+ field.
191
+ # To be used by +#calc_length+ in Base subclasses.
192
+ # @param [Base] hdr
193
+ # @param [Boolean] header_in_size if +true+ header is included in length,
194
+ # if +false+, only +body+ is taken into account
195
+ def self.calculate_and_set_length(hdr, header_in_size: true)
196
+ length = if header_in_size
197
+ hdr.sz
198
+ else
199
+ hdr.body.sz
200
+ end
201
+ hdr.length = length
202
+ end
203
+
188
204
  # @api private
189
205
  # Get knwon headers
190
206
  # @return [Hash] keys: header classes, values: hashes
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module PacketGen
2
4
  module Header
3
5
 
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
 
@@ -3,6 +3,9 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
8
+
6
9
  module PacketGen
7
10
  module Header
8
11
  class DHCP
@@ -3,6 +3,8 @@
3
3
  # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
4
  # This program is published under MIT license.
5
5
 
6
+ # frozen_string_literal: true
7
+
6
8
  module PacketGen
7
9
  module Header
8
10
  class DHCP
@@ -0,0 +1,109 @@
1
+ # This file is part of PacketGen
2
+ # See https://github.com/sdaubert/packetgen for more informations
3
+ # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ module PacketGen
9
+ module Header
10
+
11
+ # Dynamic Host Configuration Protocol for IPv6, {https://tools.ietf.org/html/rfc3315
12
+ # RFC 3315}
13
+ #
14
+ # 0 1 2 3
15
+ # 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
16
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
17
+ # | msg-type | transaction-id |
18
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
19
+ # | |
20
+ # . options .
21
+ # . (variable) .
22
+ # | |
23
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24
+ # A DHCPv6 header is made of:
25
+ # * a {#msg_type} field ({Types::Int8Enum}),
26
+ # * a {#transaction_id} field ({Types::Int24}),
27
+ # * and an {#options} field ({DHCPv6::Options}).
28
+ #
29
+ # == Create a DHCPv6 header
30
+ # # standalone
31
+ # dhcpv6 = PacketGen::Header::DHCPv6.new(msg_type: 'SOLLICIT')
32
+ # # in a packet
33
+ # pkt = PacketGen.gen('IPv6').add('DHCPv6', msg_type: 'SOLLICIT')
34
+ # # access to DHCPv6 header from packet
35
+ # pkt.dhcpv6 #=> PacketGen::Header::DHCPv6
36
+ #
37
+ # == Add options
38
+ # DHCPv6 options are defined by subclasses of {DHCPv6::Option}.
39
+ #
40
+ # Options may be added by pushing a hash to {#options}:
41
+ # dhcpv6 = PacketGen::Header::DHCPv6.new(msg_type: 'SOLLICIT')
42
+ # dhcpv6.options << { type: 'Preference', value: 1 }
43
+ # @author Sylvain Daubert
44
+ class DHCPv6 < Base;end
45
+
46
+ require_relative 'dhcpv6/duid'
47
+ require_relative 'dhcpv6/option'
48
+ require_relative 'dhcpv6/options'
49
+
50
+ class DHCPv6
51
+ # DHCPv6 UDP client port
52
+ UDP_CLIENT_PORT = 546
53
+ # DHCPv6 UDP client port
54
+ UDP_SERVER_PORT = 547
55
+
56
+ # DHCPv6 message types
57
+ MESSAGE_TYPES = {
58
+ 'SOLLICIT' => 1,
59
+ 'ADVERTISE' => 2,
60
+ 'REQUEST' => 3,
61
+ 'CONFIRM' => 4,
62
+ 'RENEW' => 5,
63
+ 'REBIND' => 6,
64
+ 'REPLY' => 7,
65
+ 'RELEASE' => 8,
66
+ 'DECLINE' => 9,
67
+ 'RECONFIGURE' => 10,
68
+ 'INFORMATION-REQUEST' => 11
69
+ }
70
+
71
+ # @!attribute msg_type
72
+ # 8-bit message type
73
+ # @return [Integer]
74
+ define_field :msg_type, Types::Int8Enum, enum: MESSAGE_TYPES
75
+ # @!attribute transaction_id
76
+ # 24-bit transaction ID
77
+ # @return [Integer]
78
+ define_field :transaction_id, Types::Int24
79
+ # @!attribute options
80
+ # @return [DHCPv6::Options]
81
+ define_field :options, DHCPv6::Options
82
+
83
+ # Populate object from string
84
+ # @param [String] str
85
+ # @return [DHCPv6,DHCPv6::Relay]
86
+ def read(str)
87
+ msg_type = Types::Int8.new.read(str)
88
+
89
+ case msg_type
90
+ when 12, 13
91
+ DHCPv6::Relay.new.read(str)
92
+ else
93
+ super
94
+ end
95
+ end
96
+
97
+ # Get human readable message type
98
+ # @return [String]
99
+ def human_msg_type
100
+ self[:msg_type].to_human
101
+ end
102
+ end
103
+
104
+ UDP.bind_header DHCPv6, sport: DHCPv6::UDP_CLIENT_PORT, dport: DHCPv6::UDP_SERVER_PORT
105
+ UDP.bind_header DHCPv6, sport: DHCPv6::UDP_SERVER_PORT, dport: DHCPv6::UDP_CLIENT_PORT
106
+ end
107
+ end
108
+
109
+ require_relative 'dhcpv6/relay'
@@ -0,0 +1,147 @@
1
+ # This file is part of PacketGen
2
+ # See https://github.com/sdaubert/packetgen for more informations
3
+ # Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
4
+ # This program is published under MIT license.
5
+
6
+ # frozen_string_literal: true
7
+
8
+ module PacketGen
9
+ module Header
10
+ class DHCPv6
11
+ # @abstract Base class for DUID (DHCP Unique ID)
12
+ # @author Sylvain Daubert
13
+ class DUID < Types::Fields
14
+
15
+ TYPES = {
16
+ 'DUID-LLT' => 1,
17
+ 'DUID-EN' => 2,
18
+ 'DUID-LL' => 3
19
+ }
20
+
21
+ # @!attribute type
22
+ # 16-bit DUID type
23
+ # @return [Integer]
24
+ define_field :type, Types::Int16Enum, enum: TYPES
25
+ # @!attribute body
26
+ # @abstract replaced by specific fields in subclasses
27
+ # DUID data.
28
+ # @return [String]
29
+ define_field :body, Types::String
30
+
31
+ alias private_read read
32
+ private :private_read
33
+
34
+ # Populate object from binary string
35
+ # @param [String] str
36
+ # @return [DUID]
37
+ def read(str)
38
+ if self.class == DUID
39
+ super
40
+ case type
41
+ when 1
42
+ DUID_LLT.new.read(str)
43
+ when 2
44
+ DUID_EN.new.read(str)
45
+ when 3
46
+ DUID_LL.new.read(str)
47
+ else
48
+ self
49
+ end
50
+ else
51
+ private_read str
52
+ end
53
+ end
54
+
55
+ # Get human-readable DUID description
56
+ # @return [String]
57
+ def to_human
58
+ "DUID<#{type},#{body.inspect}>"
59
+ end
60
+ end
61
+
62
+ # DUID Based on Link-layer Address Plus Time
63
+ # @author Sylvain Daubert
64
+ class DUID_LLT < DUID
65
+ delete_field :body
66
+ undef body
67
+ undef body=
68
+
69
+ # Base time for time computation
70
+ BASE_TIME = Time.utc(2000, 1, 1)
71
+
72
+ # @!attribute htype
73
+ # 16-bit hardware protocol type
74
+ # @return [Integer]
75
+ define_field :htype, Types::Int16, default: 1
76
+ # @!attribute time
77
+ # 32-bit time information
78
+ # @return [Time]
79
+ define_field :time, Types::Int32, default: (Time.now - BASE_TIME).to_i
80
+ # @!attribute link_addr
81
+ # @return [Eth::MacAddr]
82
+ define_field :link_addr, Eth::MacAddr
83
+
84
+ # @return [Time]
85
+ def time
86
+ BASE_TIME + self[:time].to_i
87
+ end
88
+
89
+ # @param [Time] time
90
+ # @return [Time]
91
+ def time=(time)
92
+ self[:time].value = time - BASE_TIME
93
+ end
94
+
95
+ # Get human-readable DUID description
96
+ # @return [String]
97
+ def to_human
98
+ "DUID_LLT<#{time},#{link_addr}>"
99
+ end
100
+ end
101
+
102
+ # DUID Based on Enterprise Number
103
+ # @author Sylvain Daubert
104
+ class DUID_EN < DUID
105
+ delete_field :body
106
+ undef body
107
+ undef body=
108
+
109
+ # @!attribute en
110
+ # 32-bit entreprise number
111
+ # @return [Integer]
112
+ define_field :en, Types::Int32
113
+ # @!attribute identifier
114
+ # @return [String]
115
+ define_field :identifier, Types::String
116
+
117
+ # Get human-readable DUID description
118
+ # @return [String]
119
+ def to_human
120
+ "DUID_EN<%#x,%s>" % [en, identifier]
121
+ end
122
+ end
123
+
124
+ # DUID Based on Link-layer
125
+ # @author Sylvain Daubert
126
+ class DUID_LL < DUID
127
+ delete_field :body
128
+ undef body
129
+ undef body=
130
+
131
+ # @!attribute htype
132
+ # 16-bit hardware protocol type
133
+ # @return [Integer]
134
+ define_field :htype, Types::Int16, default: 1
135
+ # @!attribute link_addr
136
+ # @return [Eth::MacAddr]
137
+ define_field :link_addr, Eth::MacAddr
138
+
139
+ # Get human-readable DUID description
140
+ # @return [String]
141
+ def to_human
142
+ "DUID_LL<#{link_addr}>"
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end