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.
- checksums.yaml +5 -5
- data/.travis.yml +13 -4
- data/lib/packetgen.rb +3 -1
- data/lib/packetgen/capture.rb +2 -0
- data/lib/packetgen/config.rb +1 -0
- data/lib/packetgen/header.rb +5 -0
- data/lib/packetgen/header/arp.rb +2 -0
- data/lib/packetgen/header/asn1_base.rb +2 -0
- data/lib/packetgen/header/base.rb +16 -0
- data/lib/packetgen/header/bootp.rb +2 -0
- data/lib/packetgen/header/crypto.rb +2 -0
- data/lib/packetgen/header/dhcp.rb +2 -0
- data/lib/packetgen/header/dhcp/option.rb +3 -0
- data/lib/packetgen/header/dhcp/options.rb +2 -0
- data/lib/packetgen/header/dhcpv6.rb +109 -0
- data/lib/packetgen/header/dhcpv6/duid.rb +147 -0
- data/lib/packetgen/header/dhcpv6/option.rb +391 -0
- data/lib/packetgen/header/dhcpv6/options.rb +29 -0
- data/lib/packetgen/header/dhcpv6/relay.rb +48 -0
- data/lib/packetgen/header/dns.rb +10 -2
- data/lib/packetgen/header/dns/name.rb +7 -0
- data/lib/packetgen/header/dns/opt.rb +6 -0
- data/lib/packetgen/header/dns/option.rb +7 -0
- data/lib/packetgen/header/dns/qdsection.rb +7 -1
- data/lib/packetgen/header/dns/question.rb +7 -0
- data/lib/packetgen/header/dns/rr.rb +7 -0
- data/lib/packetgen/header/dns/rrsection.rb +7 -0
- data/lib/packetgen/header/dot11.rb +4 -2
- data/lib/packetgen/header/dot11/control.rb +2 -0
- data/lib/packetgen/header/dot11/data.rb +2 -0
- data/lib/packetgen/header/dot11/element.rb +2 -0
- data/lib/packetgen/header/dot11/management.rb +2 -0
- data/lib/packetgen/header/dot11/sub_mngt.rb +2 -0
- data/lib/packetgen/header/dot1q.rb +2 -0
- data/lib/packetgen/header/dot1x.rb +3 -1
- data/lib/packetgen/header/eap.rb +3 -1
- data/lib/packetgen/header/eap/fast.rb +2 -0
- data/lib/packetgen/header/eap/md5.rb +2 -0
- data/lib/packetgen/header/eap/tls.rb +2 -0
- data/lib/packetgen/header/eap/ttls.rb +2 -0
- data/lib/packetgen/header/esp.rb +7 -0
- data/lib/packetgen/header/eth.rb +2 -0
- data/lib/packetgen/header/gre.rb +4 -9
- data/lib/packetgen/header/http/headers.rb +2 -0
- data/lib/packetgen/header/http/request.rb +3 -1
- data/lib/packetgen/header/http/response.rb +3 -1
- data/lib/packetgen/header/icmp.rb +4 -11
- data/lib/packetgen/header/icmpv6.rb +4 -11
- data/lib/packetgen/header/igmp.rb +4 -11
- data/lib/packetgen/header/igmpv3.rb +4 -11
- data/lib/packetgen/header/igmpv3/group_record.rb +2 -0
- data/lib/packetgen/header/igmpv3/mq.rb +2 -0
- data/lib/packetgen/header/igmpv3/mr.rb +2 -0
- data/lib/packetgen/header/ike.rb +13 -6
- data/lib/packetgen/header/ike/auth.rb +2 -0
- data/lib/packetgen/header/ike/cert.rb +2 -0
- data/lib/packetgen/header/ike/certreq.rb +2 -0
- data/lib/packetgen/header/ike/id.rb +2 -0
- data/lib/packetgen/header/ike/ke.rb +2 -0
- data/lib/packetgen/header/ike/nonce.rb +2 -0
- data/lib/packetgen/header/ike/notify.rb +7 -0
- data/lib/packetgen/header/ike/payload.rb +9 -0
- data/lib/packetgen/header/ike/sa.rb +11 -4
- data/lib/packetgen/header/ike/sk.rb +7 -0
- data/lib/packetgen/header/ike/ts.rb +2 -0
- data/lib/packetgen/header/ike/vendor_id.rb +2 -0
- data/lib/packetgen/header/ip.rb +48 -11
- data/lib/packetgen/header/ip/addr.rb +8 -0
- data/lib/packetgen/header/ip/option.rb +2 -0
- data/lib/packetgen/header/ip/options.rb +2 -0
- data/lib/packetgen/header/ipv6.rb +5 -3
- data/lib/packetgen/header/ipv6/addr.rb +8 -0
- data/lib/packetgen/header/ipv6/extension.rb +2 -0
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +2 -0
- data/lib/packetgen/header/llc.rb +2 -0
- data/lib/packetgen/header/mld.rb +2 -0
- data/lib/packetgen/header/mldv2.rb +4 -2
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +3 -1
- data/lib/packetgen/header/mldv2/mlq.rb +2 -0
- data/lib/packetgen/header/mldv2/mlr.rb +4 -2
- data/lib/packetgen/header/ospfv2.rb +249 -0
- data/lib/packetgen/header/ospfv2/db_description.rb +105 -0
- data/lib/packetgen/header/ospfv2/hello.rb +104 -0
- data/lib/packetgen/header/ospfv2/ls_ack.rb +55 -0
- data/lib/packetgen/header/ospfv2/ls_request.rb +90 -0
- data/lib/packetgen/header/ospfv2/ls_update.rb +72 -0
- data/lib/packetgen/header/ospfv2/lsa.rb +252 -0
- data/lib/packetgen/header/ospfv2/lsa_header.rb +122 -0
- data/lib/packetgen/header/ospfv3.rb +216 -0
- data/lib/packetgen/header/ospfv3/db_description.rb +114 -0
- data/lib/packetgen/header/ospfv3/hello.rb +104 -0
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +103 -0
- data/lib/packetgen/header/ospfv3/ls_ack.rb +51 -0
- data/lib/packetgen/header/ospfv3/ls_request.rb +108 -0
- data/lib/packetgen/header/ospfv3/ls_update.rb +74 -0
- data/lib/packetgen/header/ospfv3/lsa.rb +252 -0
- data/lib/packetgen/header/ospfv3/lsa_header.rb +123 -0
- data/lib/packetgen/header/snmp.rb +2 -0
- data/lib/packetgen/header/tcp.rb +14 -14
- data/lib/packetgen/header/tcp/option.rb +7 -1
- data/lib/packetgen/header/tcp/options.rb +7 -0
- data/lib/packetgen/header/tftp.rb +2 -0
- data/lib/packetgen/header/udp.rb +6 -14
- data/lib/packetgen/inspect.rb +5 -1
- data/lib/packetgen/packet.rb +3 -1
- data/lib/packetgen/pcapng.rb +2 -0
- data/lib/packetgen/pcapng/block.rb +2 -0
- data/lib/packetgen/pcapng/epb.rb +2 -0
- data/lib/packetgen/pcapng/file.rb +2 -0
- data/lib/packetgen/pcapng/idb.rb +2 -0
- data/lib/packetgen/pcapng/shb.rb +2 -0
- data/lib/packetgen/pcapng/spb.rb +2 -0
- data/lib/packetgen/pcapng/unknown_block.rb +2 -0
- data/lib/packetgen/proto.rb +2 -0
- data/lib/packetgen/types/array.rb +3 -0
- data/lib/packetgen/types/cstring.rb +3 -1
- data/lib/packetgen/types/enum.rb +2 -0
- data/lib/packetgen/types/fields.rb +8 -4
- data/lib/packetgen/types/int.rb +3 -1
- data/lib/packetgen/types/int_string.rb +2 -0
- data/lib/packetgen/types/oui.rb +2 -0
- data/lib/packetgen/types/string.rb +3 -0
- data/lib/packetgen/types/tlv.rb +8 -0
- data/lib/packetgen/utils.rb +6 -4
- data/lib/packetgen/utils/arp_spoofer.rb +2 -0
- data/lib/packetgen/version.rb +3 -1
- metadata +25 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1fde6bab111f7f367b7811089be8b96a9845dad53b7205d25db0931303654189
|
4
|
+
data.tar.gz: 06c46f06148846640ccfd123a21198c003ef2763c9ff78797fe27d9df4d25555
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
5
|
-
- 2.3
|
6
|
-
- 2.4
|
7
|
-
- 2.5
|
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
|
69
|
+
str.dup.force_encoding(Encoding::BINARY)
|
68
70
|
end
|
69
71
|
|
70
72
|
# Get default network interface (ie. first non-loopback declared interface)
|
data/lib/packetgen/capture.rb
CHANGED
data/lib/packetgen/config.rb
CHANGED
data/lib/packetgen/header.rb
CHANGED
@@ -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'
|
data/lib/packetgen/header/arp.rb
CHANGED
@@ -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
|
@@ -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
|