packetgen 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
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