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