pio 0.3.0 → 0.4.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 +4 -4
- data/CONTRIBUTING.md +46 -12
- data/README.md +131 -116
- data/Rakefile +7 -92
- data/examples/arp_new.rb +16 -0
- data/examples/arp_read.rb +4 -0
- data/examples/dhcp_new.rb +30 -0
- data/examples/dhcp_read.rb +4 -0
- data/examples/icmp_new.rb +21 -0
- data/examples/icmp_read.rb +4 -0
- data/examples/lldp_new.rb +4 -0
- data/examples/lldp_read.rb +4 -0
- data/lib/pio.rb +6 -12
- data/lib/pio/arp.rb +7 -19
- data/lib/pio/arp/frame.rb +8 -12
- data/lib/pio/arp/message.rb +12 -25
- data/lib/pio/arp/reply.rb +30 -30
- data/lib/pio/arp/request.rb +30 -29
- data/lib/pio/dhcp.rb +58 -0
- data/lib/pio/dhcp/ack.rb +12 -0
- data/lib/pio/dhcp/boot_reply.rb +16 -0
- data/lib/pio/dhcp/boot_reply_options.rb +75 -0
- data/lib/pio/dhcp/boot_request.rb +16 -0
- data/lib/pio/dhcp/boot_request_options.rb +69 -0
- data/lib/pio/dhcp/common_options.rb +71 -0
- data/lib/pio/dhcp/csum_util.rb +83 -0
- data/lib/pio/dhcp/dhcp_field.rb +48 -0
- data/lib/pio/dhcp/dhcp_tlv_options.rb +84 -0
- data/lib/pio/dhcp/discover.rb +12 -0
- data/lib/pio/dhcp/field_util.rb +102 -0
- data/lib/pio/dhcp/frame.rb +95 -0
- data/lib/pio/dhcp/message.rb +79 -0
- data/lib/pio/dhcp/offer.rb +12 -0
- data/lib/pio/dhcp/optional_tlv.rb +74 -0
- data/lib/pio/dhcp/request.rb +12 -0
- data/lib/pio/dhcp/type/dhcp_client_id.rb +21 -0
- data/lib/pio/dhcp/type/dhcp_param_list.rb +22 -0
- data/lib/pio/dhcp/type/dhcp_string.rb +21 -0
- data/lib/pio/icmp.rb +7 -18
- data/lib/pio/icmp/frame.rb +38 -40
- data/lib/pio/icmp/message.rb +10 -61
- data/lib/pio/icmp/options.rb +25 -0
- data/lib/pio/icmp/reply.rb +34 -7
- data/lib/pio/icmp/request.rb +43 -7
- data/lib/pio/ipv4_address.rb +5 -8
- data/lib/pio/lldp.rb +22 -62
- data/lib/pio/lldp/chassis_id_tlv.rb +7 -13
- data/lib/pio/lldp/end_of_lldpdu_value.rb +3 -9
- data/lib/pio/lldp/frame.rb +6 -12
- data/lib/pio/lldp/management_address_value.rb +4 -10
- data/lib/pio/lldp/optional_tlv.rb +5 -10
- data/lib/pio/lldp/options.rb +37 -0
- data/lib/pio/lldp/organizationally_specific_value.rb +2 -8
- data/lib/pio/lldp/port_description_value.rb +2 -8
- data/lib/pio/lldp/port_id_tlv.rb +6 -12
- data/lib/pio/lldp/system_capabilities_value.rb +2 -8
- data/lib/pio/lldp/system_description_value.rb +2 -8
- data/lib/pio/lldp/system_name_value.rb +2 -8
- data/lib/pio/lldp/ttl_tlv.rb +5 -11
- data/lib/pio/mac.rb +4 -9
- data/lib/pio/message_type_selector.rb +22 -0
- data/lib/pio/options.rb +65 -0
- data/lib/pio/parse_error.rb +6 -0
- data/lib/pio/type/ethernet_header.rb +3 -2
- data/lib/pio/type/ip_address.rb +4 -9
- data/lib/pio/type/ipv4_header.rb +12 -17
- data/lib/pio/type/mac_address.rb +5 -10
- data/lib/pio/type/udp_header.rb +18 -0
- data/lib/pio/version.rb +3 -8
- data/pio.gemspec +12 -10
- data/spec/pio/arp/reply/options_spec.rb +145 -0
- data/spec/pio/arp/reply_spec.rb +77 -113
- data/spec/pio/arp/request/options_spec.rb +115 -0
- data/spec/pio/arp/request_spec.rb +74 -96
- data/spec/pio/arp_spec.rb +71 -105
- data/spec/pio/dhcp/ack_spec.rb +189 -0
- data/spec/pio/dhcp/discover_spec.rb +165 -0
- data/spec/pio/dhcp/offer_spec.rb +189 -0
- data/spec/pio/dhcp/request_spec.rb +173 -0
- data/spec/pio/dhcp_spec.rb +609 -0
- data/spec/pio/icmp/reply_spec.rb +102 -95
- data/spec/pio/icmp/request_spec.rb +86 -78
- data/spec/pio/icmp_spec.rb +153 -146
- data/spec/pio/ipv4_address_spec.rb +2 -7
- data/spec/pio/lldp/options_spec.rb +188 -0
- data/spec/pio/lldp_spec.rb +181 -208
- data/spec/pio/mac_spec.rb +3 -8
- data/spec/spec_helper.rb +4 -10
- metadata +69 -17
- data/.gitignore +0 -20
- data/.rspec +0 -3
- data/.rubocop.yml +0 -1
- data/.travis.yml +0 -13
- data/Gemfile +0 -37
- data/Guardfile +0 -24
- data/lib/pio/message_util.rb +0 -19
- data/lib/pio/type/config.reek +0 -4
- data/lib/pio/util.rb +0 -21
- data/pio.org +0 -668
- data/pio.org_archive +0 -943
- data/rubocop-todo.yml +0 -9
data/lib/pio/dhcp/ack.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pio/dhcp/message'
|
4
|
+
require 'pio/dhcp/boot_reply_options'
|
5
|
+
|
6
|
+
module Pio
|
7
|
+
class Dhcp
|
8
|
+
# DHCP Reply Frame Base Class
|
9
|
+
class BootReply < Message
|
10
|
+
MESSAGE_TYPE = 2
|
11
|
+
|
12
|
+
# DHCP Options Class.
|
13
|
+
class Options < Dhcp::BootReplyOptions; end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pio/options'
|
4
|
+
require 'pio/dhcp/common_options'
|
5
|
+
require 'pio/dhcp/dhcp_tlv_options'
|
6
|
+
|
7
|
+
module Pio
|
8
|
+
class Dhcp
|
9
|
+
# Options for creating a DHCP message.
|
10
|
+
class BootReplyOptions < Pio::Options
|
11
|
+
include CommonOptions
|
12
|
+
include DhcpTlvOptions
|
13
|
+
|
14
|
+
mandatory_option :source_mac
|
15
|
+
mandatory_option :destination_mac
|
16
|
+
mandatory_option :ip_source_address
|
17
|
+
mandatory_option :ip_destination_address
|
18
|
+
mandatory_option :type
|
19
|
+
option :subnet_mask
|
20
|
+
option :renewal_time_value
|
21
|
+
option :rebinding_time_value
|
22
|
+
option :ip_address_lease_time
|
23
|
+
option :server_identifier
|
24
|
+
option :transaction_id
|
25
|
+
|
26
|
+
def initialize(options)
|
27
|
+
@options = options
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_hash
|
31
|
+
{
|
32
|
+
destination_mac: destination_mac,
|
33
|
+
source_mac: source_mac,
|
34
|
+
ip_destination_address: ip_destination_address,
|
35
|
+
ip_source_address: ip_source_address,
|
36
|
+
udp_src_port: BOOTPS,
|
37
|
+
udp_dst_port: BOOTPC,
|
38
|
+
dhcp: dhcp_data
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def dhcp_field_values
|
45
|
+
{
|
46
|
+
message_type: BootReply::MESSAGE_TYPE,
|
47
|
+
transaction_id: transaction_id,
|
48
|
+
client_ip_address: QUAD_ZERO_IP_ADDRESS,
|
49
|
+
your_ip_address: ip_destination_address,
|
50
|
+
next_server_ip_address: QUAD_ZERO_IP_ADDRESS,
|
51
|
+
relay_agent_ip_address: QUAD_ZERO_IP_ADDRESS,
|
52
|
+
client_mac_address: source_mac,
|
53
|
+
optional_tlvs: options_for_optional_tlv
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def options_for_optional_tlv
|
58
|
+
[
|
59
|
+
message_type_hash,
|
60
|
+
renewal_time_value_hash,
|
61
|
+
rebinding_time_value_hash,
|
62
|
+
ip_address_lease_time_hash,
|
63
|
+
dhcp_server_identifier_hash,
|
64
|
+
subnet_mask_hash
|
65
|
+
].compact
|
66
|
+
end
|
67
|
+
|
68
|
+
def server_identifier
|
69
|
+
IPv4Address.new(
|
70
|
+
@options[:server_identifier] || ip_source_address
|
71
|
+
)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pio/dhcp/message'
|
4
|
+
require 'pio/dhcp/boot_request_options'
|
5
|
+
|
6
|
+
module Pio
|
7
|
+
class Dhcp
|
8
|
+
# DHCP Request Frame Base Class
|
9
|
+
class BootRequest < Message
|
10
|
+
MESSAGE_TYPE = 1
|
11
|
+
|
12
|
+
# DHCP Options Class.
|
13
|
+
class Options < Dhcp::BootRequestOptions; end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pio/options'
|
4
|
+
require 'pio/dhcp/common_options'
|
5
|
+
require 'pio/dhcp/dhcp_tlv_options'
|
6
|
+
|
7
|
+
module Pio
|
8
|
+
class Dhcp
|
9
|
+
# Options for creating a DHCP message.
|
10
|
+
class BootRequestOptions < Pio::Options
|
11
|
+
include CommonOptions
|
12
|
+
include DhcpTlvOptions
|
13
|
+
|
14
|
+
mandatory_option :source_mac
|
15
|
+
mandatory_option :type
|
16
|
+
option :destination_mac
|
17
|
+
option :requested_ip_address
|
18
|
+
option :server_identifier
|
19
|
+
option :transaction_id
|
20
|
+
|
21
|
+
def initialize(options)
|
22
|
+
validate options
|
23
|
+
@options = options
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_hash
|
27
|
+
{
|
28
|
+
destination_mac: destination_mac,
|
29
|
+
source_mac: source_mac,
|
30
|
+
ip_source_address: QUAD_ZERO_IP_ADDRESS,
|
31
|
+
ip_destination_address: BROADCAST_IP_ADDRESS,
|
32
|
+
udp_src_port: BOOTPC,
|
33
|
+
udp_dst_port: BOOTPS,
|
34
|
+
dhcp: dhcp_data
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def dhcp_field_values
|
41
|
+
{
|
42
|
+
message_type: BootRequest::MESSAGE_TYPE,
|
43
|
+
transaction_id: transaction_id,
|
44
|
+
client_ip_address: QUAD_ZERO_IP_ADDRESS,
|
45
|
+
your_ip_address: QUAD_ZERO_IP_ADDRESS,
|
46
|
+
next_server_ip_address: QUAD_ZERO_IP_ADDRESS,
|
47
|
+
relay_agent_ip_address: QUAD_ZERO_IP_ADDRESS,
|
48
|
+
client_mac_address: source_mac,
|
49
|
+
optional_tlvs: options_for_optional_tlv
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
def options_for_optional_tlv
|
54
|
+
[
|
55
|
+
message_type_hash,
|
56
|
+
client_identifier_hash,
|
57
|
+
requested_ip_address_hash,
|
58
|
+
parameters_list_hash,
|
59
|
+
dhcp_server_identifier_hash
|
60
|
+
].compact
|
61
|
+
end
|
62
|
+
|
63
|
+
def server_identifier
|
64
|
+
server_id = @options[:server_identifier]
|
65
|
+
IPv4Address.new(server_id) if server_id
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Pio
|
4
|
+
class Dhcp
|
5
|
+
# DHCP Common Options.
|
6
|
+
module CommonOptions
|
7
|
+
BOOTPC = 68
|
8
|
+
BOOTPS = 67
|
9
|
+
QUAD_ZERO_IP_ADDRESS = IPv4Address.new(0)
|
10
|
+
BROADCAST_MAC_ADDRESS = Mac.new(0xffffffffffff)
|
11
|
+
BROADCAST_IP_ADDRESS = IPv4Address.new(0xffffffff)
|
12
|
+
|
13
|
+
def dhcp_data
|
14
|
+
Dhcp::DhcpField.new(dhcp_field_values)
|
15
|
+
end
|
16
|
+
|
17
|
+
def type
|
18
|
+
@options[:type]
|
19
|
+
end
|
20
|
+
|
21
|
+
def source_mac
|
22
|
+
Mac.new(@options[:source_mac])
|
23
|
+
end
|
24
|
+
|
25
|
+
def destination_mac
|
26
|
+
Mac.new(@options[:destination_mac] || BROADCAST_MAC_ADDRESS)
|
27
|
+
end
|
28
|
+
|
29
|
+
def ip_source_address
|
30
|
+
IPv4Address.new(@options[:ip_source_address])
|
31
|
+
end
|
32
|
+
|
33
|
+
def ip_destination_address
|
34
|
+
IPv4Address.new(@options[:ip_destination_address])
|
35
|
+
end
|
36
|
+
|
37
|
+
def server_identifier
|
38
|
+
IPv4Address.new(
|
39
|
+
@options[:server_identifier] || ip_source_address
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
def subnet_mask
|
44
|
+
subnet = @options[:subnet_mask]
|
45
|
+
IPv4Address.new(subnet) if subnet
|
46
|
+
end
|
47
|
+
|
48
|
+
def transaction_id
|
49
|
+
@options[:transaction_id]
|
50
|
+
end
|
51
|
+
|
52
|
+
def renewal_time_value
|
53
|
+
@options[:renewal_time_value]
|
54
|
+
end
|
55
|
+
|
56
|
+
def rebinding_time_value
|
57
|
+
@options[:rebinding_time_value]
|
58
|
+
end
|
59
|
+
|
60
|
+
def ip_address_lease_time
|
61
|
+
@options[:ip_address_lease_time]
|
62
|
+
end
|
63
|
+
|
64
|
+
def requested_ip_address
|
65
|
+
IPv4Address.new(
|
66
|
+
@options[:requested_ip_address] || QUAD_ZERO_IP_ADDRESS
|
67
|
+
)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Pio
|
4
|
+
class Dhcp
|
5
|
+
# Checksum Calculate Utility.
|
6
|
+
module CsumUtil
|
7
|
+
private
|
8
|
+
|
9
|
+
def ip_csum
|
10
|
+
ipv4_header_2bytewise_slices.reduce(:+)
|
11
|
+
end
|
12
|
+
|
13
|
+
def udp_csum
|
14
|
+
udp_header_2bytewise_slices.reduce(:+)
|
15
|
+
end
|
16
|
+
|
17
|
+
def ipv4_header_2bytewise_slices
|
18
|
+
[
|
19
|
+
ipversion_ipheaderlength_iptypeofservice, ip_total_length,
|
20
|
+
ip_identifier, ipflag_ipfragment,
|
21
|
+
ipttl_ipproto,
|
22
|
+
ip_source_address_upper,
|
23
|
+
ip_source_address_lower,
|
24
|
+
ip_destination_address_upper,
|
25
|
+
ip_destination_address_lower
|
26
|
+
]
|
27
|
+
end
|
28
|
+
|
29
|
+
def ip_source_address_upper
|
30
|
+
ip_source_address.get.to_i >> 16
|
31
|
+
end
|
32
|
+
|
33
|
+
def ip_source_address_lower
|
34
|
+
ip_source_address.get.to_i & 0xffff
|
35
|
+
end
|
36
|
+
|
37
|
+
def ip_destination_address_upper
|
38
|
+
ip_destination_address.get.to_i >> 16
|
39
|
+
end
|
40
|
+
|
41
|
+
def ip_destination_address_lower
|
42
|
+
ip_destination_address.get.to_i & 0xffff
|
43
|
+
end
|
44
|
+
|
45
|
+
def ipversion_ipheaderlength_iptypeofservice
|
46
|
+
ip_version << 12 | ip_header_length << 8 | ip_type_of_service
|
47
|
+
end
|
48
|
+
|
49
|
+
def ipflag_ipfragment
|
50
|
+
ip_flag << 13 | ip_fragment
|
51
|
+
end
|
52
|
+
|
53
|
+
def ipttl_ipproto
|
54
|
+
ip_ttl << 8 | ip_protocol
|
55
|
+
end
|
56
|
+
|
57
|
+
def udp_header_2bytewise_slices
|
58
|
+
[
|
59
|
+
pseudo_header_2bytewise_slices,
|
60
|
+
udp_src_port,
|
61
|
+
udp_dst_port,
|
62
|
+
udp_len,
|
63
|
+
payload_2bytewise_slices
|
64
|
+
]
|
65
|
+
end
|
66
|
+
|
67
|
+
def payload_2bytewise_slices
|
68
|
+
(dhcp.to_binary_s + trail_data).unpack('n*').reduce(:+)
|
69
|
+
end
|
70
|
+
|
71
|
+
def pseudo_header_2bytewise_slices
|
72
|
+
[
|
73
|
+
ip_source_address_upper,
|
74
|
+
ip_source_address_lower,
|
75
|
+
ip_destination_address_upper,
|
76
|
+
ip_destination_address_lower,
|
77
|
+
ip_protocol,
|
78
|
+
udp_len
|
79
|
+
].pack('n*').unpack('n*').reduce(:+)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pio/dhcp/optional_tlv'
|
4
|
+
require 'pio/type/ip_address'
|
5
|
+
require 'pio/type/mac_address'
|
6
|
+
|
7
|
+
module Pio
|
8
|
+
class Dhcp
|
9
|
+
# DHCP Field
|
10
|
+
class DhcpField < BinData::Record
|
11
|
+
MAGIC_COOKIE = 0x63825363
|
12
|
+
ETHERNET = 1
|
13
|
+
MAC_ADDRESS_LENGTH = 6
|
14
|
+
|
15
|
+
endian :big
|
16
|
+
|
17
|
+
uint8 :message_type
|
18
|
+
uint8 :hw_addr_type,
|
19
|
+
initial_value: ETHERNET
|
20
|
+
uint8 :hw_addr_len,
|
21
|
+
initial_value: MAC_ADDRESS_LENGTH
|
22
|
+
uint8 :hops,
|
23
|
+
initial_value: 0
|
24
|
+
uint32be :transaction_id,
|
25
|
+
initial_value: rand(0xffffffff)
|
26
|
+
uint16be :seconds,
|
27
|
+
initial_value: 0
|
28
|
+
uint16be :bootp_flags,
|
29
|
+
initial_value: 0
|
30
|
+
ip_address :client_ip_address
|
31
|
+
ip_address :your_ip_address
|
32
|
+
ip_address :next_server_ip_address
|
33
|
+
ip_address :relay_agent_ip_address
|
34
|
+
mac_address :client_mac_address
|
35
|
+
string :client_mac_address_padding,
|
36
|
+
length: 10
|
37
|
+
string :server_host_name,
|
38
|
+
length: 64
|
39
|
+
string :boot_file_name,
|
40
|
+
length: 128
|
41
|
+
uint32be :magic_cookie,
|
42
|
+
value: MAGIC_COOKIE
|
43
|
+
array :optional_tlvs,
|
44
|
+
type: :optional_tlv,
|
45
|
+
read_until: -> { element.end_of_dhcptlv? }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'pio/dhcp/common_options'
|
4
|
+
|
5
|
+
module Pio
|
6
|
+
class Dhcp
|
7
|
+
# DHCP TLV Methods.
|
8
|
+
module DhcpTlvOptions
|
9
|
+
include CommonOptions
|
10
|
+
|
11
|
+
def message_type_hash
|
12
|
+
{
|
13
|
+
tlv_type: Dhcp::MESSAGE_TYPE_TLV,
|
14
|
+
tlv_info_length: 1,
|
15
|
+
tlv_value: type
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def client_identifier_hash
|
20
|
+
{
|
21
|
+
tlv_type: Dhcp::CLIENT_IDENTIFIER_TLV,
|
22
|
+
tlv_info_length: 7,
|
23
|
+
tlv_value: source_mac
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def requested_ip_address_hash
|
28
|
+
{
|
29
|
+
tlv_type: Dhcp::REQUESTED_IP_ADDRESS_TLV,
|
30
|
+
tlv_info_length: 4,
|
31
|
+
tlv_value: requested_ip_address
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def dhcp_server_identifier_hash
|
36
|
+
{
|
37
|
+
tlv_type: Dhcp::SERVER_IDENTIFIER_TLV,
|
38
|
+
tlv_info_length: 4,
|
39
|
+
tlv_value: server_identifier
|
40
|
+
} if server_identifier
|
41
|
+
end
|
42
|
+
|
43
|
+
def parameters_list_hash
|
44
|
+
{
|
45
|
+
tlv_type: Dhcp::PARAMETERS_LIST_TLV,
|
46
|
+
tlv_info_length: Dhcp::PARAMETER_REQUEST_LIST.length,
|
47
|
+
tlv_value: Dhcp::PARAMETER_REQUEST_LIST
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
def renewal_time_value_hash
|
52
|
+
{
|
53
|
+
tlv_type: Dhcp::RENEWAL_TIME_VALUE_TLV,
|
54
|
+
tlv_info_length: 4,
|
55
|
+
tlv_value: renewal_time_value
|
56
|
+
} if renewal_time_value
|
57
|
+
end
|
58
|
+
|
59
|
+
def rebinding_time_value_hash
|
60
|
+
{
|
61
|
+
tlv_type: Dhcp::REBINDING_TIME_VALUE_TLV,
|
62
|
+
tlv_info_length: 4,
|
63
|
+
tlv_value: rebinding_time_value
|
64
|
+
} if rebinding_time_value
|
65
|
+
end
|
66
|
+
|
67
|
+
def ip_address_lease_time_hash
|
68
|
+
{
|
69
|
+
tlv_type: Dhcp::IP_ADDRESS_LEASE_TIME_TLV,
|
70
|
+
tlv_info_length: 4,
|
71
|
+
tlv_value: ip_address_lease_time
|
72
|
+
}
|
73
|
+
end
|
74
|
+
|
75
|
+
def subnet_mask_hash
|
76
|
+
{
|
77
|
+
tlv_type: Dhcp::SUBNET_MASK_TLV,
|
78
|
+
tlv_info_length: 4,
|
79
|
+
tlv_value: subnet_mask
|
80
|
+
} if subnet_mask
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|